Messages in this thread | | | Date | Fri, 17 Dec 2021 12:30:42 +0800 | From | Huang Rui <> | Subject | Re: [PATCH v5 03/22] ACPI: CPPC: implement support for SystemIO registers |
| |
On Fri, Dec 17, 2021 at 01:40:47AM +0800, Rafael J. Wysocki wrote: > On Tue, Nov 30, 2021 at 1:37 PM Huang Rui <ray.huang@amd.com> wrote: > > > > From: Steven Noonan <steven@valvesoftware.com> > > > > According to the ACPI v6.2 (and later) specification, SystemIO can be > > used for _CPC registers. This teaches cppc_acpi how to handle such > > registers. > > > > This patch was tested using the amd_pstate driver on my Zephyrus G15 > > (model GA503QS) using the current version 410 BIOS, which uses > > a SystemIO register for the HighestPerformance element in _CPC. > > > > Signed-off-by: Steven Noonan <steven@valvesoftware.com> > > Signed-off-by: Huang Rui <ray.huang@amd.com> > > --- > > drivers/acpi/cppc_acpi.c | 46 +++++++++++++++++++++++++++++++++++++--- > > 1 file changed, 43 insertions(+), 3 deletions(-) > > > > diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c > > index a85c351589be..ca62c3dc9899 100644 > > --- a/drivers/acpi/cppc_acpi.c > > +++ b/drivers/acpi/cppc_acpi.c > > @@ -746,9 +746,24 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) > > goto out_free; > > cpc_ptr->cpc_regs[i-2].sys_mem_vaddr = addr; > > } > > + } else if (gas_t->space_id == ACPI_ADR_SPACE_SYSTEM_IO) { > > + if (gas_t->access_width < 1 || gas_t->access_width > 3) { > > + /* 1 = 8-bit, 2 = 16-bit, and 3 = 32-bit. SystemIO doesn't > > The comment format is not in agreement with the kernel coding style.
Will update it in V6.
> > > + * implement 64-bit registers. > > + */ > > + pr_debug("Invalid access width %d for SystemIO register\n", > > + gas_t->access_width); > > + goto out_free; > > + } > > + if (gas_t->address & ~0xFFFFULL) { > > It would be good to define a symbol for this mask and use it here > instead of the raw vaue.
OK.
> > > + /* SystemIO registers use 16-bit integer addresses */ > > + pr_debug("Invalid IO port %llu for SystemIO register\n", > > + gas_t->address); > > + goto out_free; > > + } > > } else { > > if (gas_t->space_id != ACPI_ADR_SPACE_FIXED_HARDWARE || !cpc_ffh_supported()) { > > - /* Support only PCC ,SYS MEM and FFH type regs */ > > + /* Support only PCC, SystemMemory, SystemIO, and FFH type regs. */ > > pr_debug("Unsupported register type: %d\n", gas_t->space_id); > > goto out_free; > > } > > @@ -923,7 +938,20 @@ static int cpc_read(int cpu, struct cpc_register_resource *reg_res, u64 *val) > > } > > > > *val = 0; > > - if (reg->space_id == ACPI_ADR_SPACE_PLATFORM_COMM && pcc_ss_id >= 0) > > + > > + if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) { > > + u32 width = 8 << (reg->access_width - 1); > > + acpi_status status; > > + > > + status = acpi_os_read_port((acpi_io_address)reg->address, (u32 *)val, width); > > + > > + if (status != AE_OK) { > > Please use ACPI_FAILURE() here and in the analogous check and below.
Fine, I will update this as well.
Thanks, Ray
> > > + pr_debug("Error: Failed to read SystemIO port %llx\n", reg->address); > > + return -EFAULT; > > + } > > + > > + 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); > > else if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) > > vaddr = reg_res->sys_mem_vaddr; > > @@ -962,7 +990,19 @@ static int cpc_write(int cpu, struct cpc_register_resource *reg_res, u64 val) > > int pcc_ss_id = per_cpu(cpu_pcc_subspace_idx, cpu); > > struct cpc_reg *reg = ®_res->cpc_entry.reg; > > > > - if (reg->space_id == ACPI_ADR_SPACE_PLATFORM_COMM && pcc_ss_id >= 0) > > + if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) { > > + u32 width = 8 << (reg->access_width - 1); > > + acpi_status status; > > + > > + status = acpi_os_write_port((acpi_io_address)reg->address, (u32)val, width); > > + > > + if (status != AE_OK) { > > + pr_debug("Error: Failed to write SystemIO port %llx\n", reg->address); > > + return -EFAULT; > > + } > > + > > + 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); > > else if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) > > vaddr = reg_res->sys_mem_vaddr; > > --
| |