Message ID | 5789025.lOV4Wx5bFT@kreacher |
---|---|
State | New |
Headers | show |
Series | ACPI: CPPC: Fix I/O port reads on big endian and clean up code in cpc_read() | expand |
On Wed, Jan 12, 2022 at 07:26:32PM +0100, Rafael J. Wysocki wrote: > From: Rafael J. Wysocki <rafael.j.wysocki@intel.com> > > The code as currently implemented does not work on big endian systems, > so fix it up. > > Fixes: a2c8f92bea5f ("ACPI: CPPC: Implement support for SystemIO registers") > Reported-by: Dan Carpenter <dan.carpenter@oracle.com> > Suggested-by: Dan Carpenter <dan.carpenter@oracle.com> > Link: https://lore.kernel.org/linux-acpi/20220111092928.GA24968@kili/ > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Acked-by: Huang Rui <ray.huang@amd.com> > --- > drivers/acpi/cppc_acpi.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > Index: linux-pm/drivers/acpi/cppc_acpi.c > =================================================================== > --- linux-pm.orig/drivers/acpi/cppc_acpi.c > +++ linux-pm/drivers/acpi/cppc_acpi.c > @@ -929,16 +929,18 @@ static int cpc_read(int cpu, struct cpc_ > > if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) { > u32 width = 8 << (reg->access_width - 1); > + u32 val_u32; > acpi_status status; > > status = acpi_os_read_port((acpi_io_address)reg->address, > - (u32 *)val, width); > + &val_u32, width); > if (ACPI_FAILURE(status)) { > pr_debug("Error: Failed to read SystemIO port %llx\n", > reg->address); > return -EFAULT; > } > > + *val = val_u32; > return 0; > } else if (reg->space_id == ACPI_ADR_SPACE_PLATFORM_COMM && pcc_ss_id >= 0) > vaddr = GET_PCC_VADDR(reg->address, pcc_ss_id); > > >
Index: linux-pm/drivers/acpi/cppc_acpi.c =================================================================== --- linux-pm.orig/drivers/acpi/cppc_acpi.c +++ linux-pm/drivers/acpi/cppc_acpi.c @@ -929,16 +929,18 @@ static int cpc_read(int cpu, struct cpc_ if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) { u32 width = 8 << (reg->access_width - 1); + u32 val_u32; acpi_status status; status = acpi_os_read_port((acpi_io_address)reg->address, - (u32 *)val, width); + &val_u32, width); if (ACPI_FAILURE(status)) { pr_debug("Error: Failed to read SystemIO port %llx\n", reg->address); return -EFAULT; } + *val = val_u32; return 0; } else if (reg->space_id == ACPI_ADR_SPACE_PLATFORM_COMM && pcc_ss_id >= 0) vaddr = GET_PCC_VADDR(reg->address, pcc_ss_id);