From b812b2ccb29f6e05f6581bbc096a4c3321210816 Mon Sep 17 00:00:00 2001 From: Mario Limonciello Date: Wed, 29 Apr 2026 12:12:52 -0500 Subject: [PATCH] cpufreq/amd-pstate: Add debug logging for dynamic EPP paths Add minimal debug logging for code paths introduced by commit e30ca6dd5345 (dynamic EPP) to diagnose CPU frequency stuck at base frequency issue. Focus on: - amd_pstate_get_balanced_epp() - power supply detection - amd_pstate_set_dynamic_epp() - platform profile registration - shmem_set_epp() - ACPI EPP write success/failure NOT-FOR-MERGE: Debug instrumentation only --- drivers/cpufreq/amd-pstate.c | 42 +++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/drivers/cpufreq/amd-pstate.c b/drivers/cpufreq/amd-pstate.c index 9703b54ee4820..24ecc481064a4 100644 --- a/drivers/cpufreq/amd-pstate.c +++ b/drivers/cpufreq/amd-pstate.c @@ -433,12 +433,18 @@ static int shmem_set_epp(struct cpufreq_policy *policy, u8 epp) if (epp == epp_cached) return 0; + pr_info("amd_pstate: CPU %d: shmem_set_epp: setting EPP 0x%x (was 0x%x)\n", + cpudata->cpu, epp, epp_cached); + perf_ctrls.energy_perf = epp; ret = cppc_set_epp_perf(cpudata->cpu, &perf_ctrls, 1); if (ret) { pr_debug("failed to set energy perf value (%d)\n", ret); + pr_err("amd_pstate: CPU %d: shmem_set_epp: cppc_set_epp_perf FAILED with error %d\n", + cpudata->cpu, ret); return ret; } + pr_info("amd_pstate: CPU %d: shmem_set_epp: cppc_set_epp_perf succeeded\n", cpudata->cpu); value = READ_ONCE(cpudata->cppc_req_cached); value &= ~AMD_CPPC_EPP_PERF_MASK; @@ -1169,8 +1175,15 @@ static void amd_pstate_cpu_exit(struct cpufreq_policy *policy) static int amd_pstate_get_balanced_epp(struct cpufreq_policy *policy) { struct amd_cpudata *cpudata = policy->driver_data; + int power_status; + u8 epp; + + power_status = power_supply_is_system_supplied(); + epp = (power_status > 0) ? cpudata->epp_default_ac : cpudata->epp_default_dc; + pr_info("amd_pstate: CPU %d: get_balanced_epp: power_supply_is_system_supplied=%d, returning EPP=0x%x (ac=0x%x, dc=0x%x)\n", + policy->cpu, power_status, epp, cpudata->epp_default_ac, cpudata->epp_default_dc); - if (power_supply_is_system_supplied()) + if (power_status > 0) return cpudata->epp_default_ac; else return cpudata->epp_default_dc; @@ -1306,15 +1319,22 @@ static int amd_pstate_set_dynamic_epp(struct cpufreq_policy *policy) &amd_pstate_profile_ops); if (IS_ERR(cpudata->ppdev)) { ret = PTR_ERR(cpudata->ppdev); + pr_err("amd_pstate: CPU %d: platform_profile_register FAILED: %d\n", + policy->cpu, ret); goto cleanup; } + pr_info("amd_pstate: CPU %d: platform_profile_register succeeded\n", policy->cpu); /* only enable notifier if things will actually change */ if (cpudata->epp_default_ac != cpudata->epp_default_dc) { + pr_info("amd_pstate: CPU %d: registering power supply notifier\n", policy->cpu); cpudata->power_nb.notifier_call = amd_pstate_power_supply_notifier; ret = power_supply_reg_notifier(&cpudata->power_nb); - if (ret) + if (ret) { + pr_err("amd_pstate: CPU %d: power_supply_reg_notifier FAILED: %d\n", + policy->cpu, ret); goto cleanup; + } } cpudata->dynamic_epp = true; @@ -1947,10 +1967,22 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy) cpudata->current_profile = PLATFORM_PROFILE_BALANCED; } - if (dynamic_epp) + if (dynamic_epp) { + pr_info("amd_pstate: CPU %d: calling amd_pstate_set_dynamic_epp (current_profile=%d)\n", + policy->cpu, cpudata->current_profile); ret = amd_pstate_set_dynamic_epp(policy); - else - ret = amd_pstate_set_epp(policy, amd_pstate_get_balanced_epp(policy)); + if (ret) + pr_err("amd_pstate: CPU %d: amd_pstate_set_dynamic_epp FAILED: %d\n", + policy->cpu, ret); + } else { + u8 epp = amd_pstate_get_balanced_epp(policy); + pr_info("amd_pstate: CPU %d: dynamic_epp=false, calling amd_pstate_set_epp with EPP=0x%x\n", + policy->cpu, epp); + ret = amd_pstate_set_epp(policy, epp); + if (ret) + pr_err("amd_pstate: CPU %d: amd_pstate_set_epp FAILED: %d\n", + policy->cpu, ret); + } if (ret) goto free_cpudata1; -- 2.43.0