]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ACPI: CPPC: Extend cppc_set_epp_perf() for FFH/SystemMemory
authorSumit Gupta <sumitg@nvidia.com>
Fri, 6 Feb 2026 14:26:54 +0000 (19:56 +0530)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 27 Feb 2026 19:50:41 +0000 (20:50 +0100)
Extend cppc_set_epp_perf() to write both auto_sel and energy_perf
registers when they are in FFH or SystemMemory address space.

This keeps the behavior consistent with PCC case where both registers
are already updated together, but was missing for FFH/SystemMemory.

Signed-off-by: Sumit Gupta <sumitg@nvidia.com>
Reviewed-by: Pierre Gondois <pierre.gondois@arm.com>
Reviewed-by: Lifeng Zheng <zhenglifeng1@huawei.com>
Link: https://patch.msgid.link/20260206142658.72583-4-sumitg@nvidia.com
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/cppc_acpi.c

index 3f758d2944e2375d5099e4bf9a079de63364f3e0..94a7ffa8be3c375e5561e058ca25d680b1eb7599 100644 (file)
@@ -1571,6 +1571,8 @@ int cppc_set_epp_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls, bool enable)
        struct cpc_register_resource *auto_sel_reg;
        struct cpc_desc *cpc_desc = per_cpu(cpc_desc_ptr, cpu);
        struct cppc_pcc_data *pcc_ss_data = NULL;
+       bool autosel_ffh_sysmem;
+       bool epp_ffh_sysmem;
        int ret;
 
        if (!cpc_desc) {
@@ -1581,6 +1583,11 @@ int cppc_set_epp_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls, bool enable)
        auto_sel_reg = &cpc_desc->cpc_regs[AUTO_SEL_ENABLE];
        epp_set_reg = &cpc_desc->cpc_regs[ENERGY_PERF];
 
+       epp_ffh_sysmem = CPC_SUPPORTED(epp_set_reg) &&
+               (CPC_IN_FFH(epp_set_reg) || CPC_IN_SYSTEM_MEMORY(epp_set_reg));
+       autosel_ffh_sysmem = CPC_SUPPORTED(auto_sel_reg) &&
+               (CPC_IN_FFH(auto_sel_reg) || CPC_IN_SYSTEM_MEMORY(auto_sel_reg));
+
        if (CPC_IN_PCC(epp_set_reg) || CPC_IN_PCC(auto_sel_reg)) {
                if (pcc_ss_id < 0) {
                        pr_debug("Invalid pcc_ss_id for CPU:%d\n", cpu);
@@ -1606,11 +1613,22 @@ int cppc_set_epp_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls, bool enable)
                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);
+                  (epp_ffh_sysmem || autosel_ffh_sysmem)) {
+               if (autosel_ffh_sysmem) {
+                       ret = cpc_write(cpu, auto_sel_reg, enable);
+                       if (ret)
+                               return ret;
+               }
+
+               if (epp_ffh_sysmem) {
+                       ret = cpc_write(cpu, epp_set_reg,
+                                       perf_ctrls->energy_perf);
+                       if (ret)
+                               return ret;
+               }
        } else {
                ret = -ENOTSUPP;
-               pr_debug("_CPC in PCC and _CPC in FFH are not supported\n");
+               pr_debug("_CPC in PCC/FFH/SystemMemory are not supported\n");
        }
 
        return ret;