On Tue, Sep 10, 2024 at 5:15 AM Mario Limonciello <superm1@xxxxxxxxxx> wrote: > > From: Mario Limonciello <mario.limonciello@xxxxxxx> > > 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@xxxxxxxxxxx > Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218686 > Suggested-by: al0uette@xxxxxxxxxxx > Tested-by: vderp@xxxxxxxxxx > Tested-by: al0uette@xxxxxxxxxxx > Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxx> > --- > 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!