Message ID | 20240910031524.106387-1-superm1@kernel.org (mailing list archive) |
---|---|
State | Mainlined, archived |
Headers | show |
Series | ACPI: CPPC: Add support for setting EPP register in FFH | expand |
On Tue, Sep 10, 2024 at 5:15 AM Mario Limonciello <superm1@kernel.org> wrote: > > From: Mario Limonciello <mario.limonciello@amd.com> > > Some Asus AMD systems are reported to not be able to change EPP values > because the BIOS doesn't advertise support for the CPPC MSR and the PCC > region is not configured. > > However the ACPI 6.2 specification allows CPC registers to be declared > in FFH: > ``` > Starting with ACPI Specification 6.2, all _CPC registers can be in > PCC, System Memory, System IO, or Functional Fixed Hardware address > spaces. OSPM support for this more flexible register space scheme > is indicated by the “Flexible Address Space for CPPC Registers” _OSC > bit. > ``` > > If this _OSC has been set allow using FFH to configure EPP. > > Reported-by: al0uette@outlook.com > Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218686 > Suggested-by: al0uette@outlook.com > Tested-by: vderp@icloud.com > Tested-by: al0uette@outlook.com > Signed-off-by: Mario Limonciello <mario.limonciello@amd.com> > --- > drivers/acpi/cppc_acpi.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c > index dd3d3082c8c7..3b5b695bb80b 100644 > --- a/drivers/acpi/cppc_acpi.c > +++ b/drivers/acpi/cppc_acpi.c > @@ -103,6 +103,11 @@ static DEFINE_PER_CPU(struct cpc_desc *, cpc_desc_ptr); > (cpc)->cpc_entry.reg.space_id == \ > ACPI_ADR_SPACE_PLATFORM_COMM) > > +/* Check if a CPC register is in FFH */ > +#define CPC_IN_FFH(cpc) ((cpc)->type == ACPI_TYPE_BUFFER && \ > + (cpc)->cpc_entry.reg.space_id == \ > + ACPI_ADR_SPACE_FIXED_HARDWARE) > + > /* Check if a CPC register is in SystemMemory */ > #define CPC_IN_SYSTEM_MEMORY(cpc) ((cpc)->type == ACPI_TYPE_BUFFER && \ > (cpc)->cpc_entry.reg.space_id == \ > @@ -1486,9 +1491,12 @@ int cppc_set_epp_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls, bool enable) > /* after writing CPC, transfer the ownership of PCC to platform */ > ret = send_pcc_cmd(pcc_ss_id, CMD_WRITE); > up_write(&pcc_ss_data->pcc_lock); > + } else if (osc_cpc_flexible_adr_space_confirmed && > + CPC_SUPPORTED(epp_set_reg) && CPC_IN_FFH(epp_set_reg)) { > + ret = cpc_write(cpu, epp_set_reg, perf_ctrls->energy_perf); > } else { > ret = -ENOTSUPP; > - pr_debug("_CPC in PCC is not supported\n"); > + pr_debug("_CPC in PCC and _CPC in FFH are not supported\n"); > } > > return ret; > -- Applied as 6.12 material, thanks!
diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c index dd3d3082c8c7..3b5b695bb80b 100644 --- a/drivers/acpi/cppc_acpi.c +++ b/drivers/acpi/cppc_acpi.c @@ -103,6 +103,11 @@ static DEFINE_PER_CPU(struct cpc_desc *, cpc_desc_ptr); (cpc)->cpc_entry.reg.space_id == \ ACPI_ADR_SPACE_PLATFORM_COMM) +/* Check if a CPC register is in FFH */ +#define CPC_IN_FFH(cpc) ((cpc)->type == ACPI_TYPE_BUFFER && \ + (cpc)->cpc_entry.reg.space_id == \ + ACPI_ADR_SPACE_FIXED_HARDWARE) + /* Check if a CPC register is in SystemMemory */ #define CPC_IN_SYSTEM_MEMORY(cpc) ((cpc)->type == ACPI_TYPE_BUFFER && \ (cpc)->cpc_entry.reg.space_id == \ @@ -1486,9 +1491,12 @@ int cppc_set_epp_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls, bool enable) /* after writing CPC, transfer the ownership of PCC to platform */ ret = send_pcc_cmd(pcc_ss_id, CMD_WRITE); up_write(&pcc_ss_data->pcc_lock); + } else if (osc_cpc_flexible_adr_space_confirmed && + CPC_SUPPORTED(epp_set_reg) && CPC_IN_FFH(epp_set_reg)) { + ret = cpc_write(cpu, epp_set_reg, perf_ctrls->energy_perf); } else { ret = -ENOTSUPP; - pr_debug("_CPC in PCC is not supported\n"); + pr_debug("_CPC in PCC and _CPC in FFH are not supported\n"); } return ret;