Re: [PATCH] ACPI: CPPC: Add support for setting EPP register in FFH
From: Rafael J. Wysocki
Date: Tue Sep 10 2024 - 14:27:03 EST
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!