cpufreq/amd-pstate: Push adjust_perf vfunc init into cpu_init
Subsystems (2)
PATCH v2 1/2 cpufreq/amd-pstate: Push adjust_perf vfunc init into cpu_init
From: Mario Limonciello <[email protected]>
As the driver can be changed in and out of different modes it's possible that adjust_perf is assigned when it shouldn't be.
This could happen if an MSR design is started up in passive mode and then switches to active mode.
To solve this explicitly clear adjust_perf in amd_pstate_epp_cpu_init().
---
Cc: Klara Modin <[email protected]>
drivers/cpufreq/amd-pstate.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/cpufreq/amd-pstate.c +2 -2
@@ -1504,6 +1504,8 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)WRITE_ONCE (cpudata->cppc_cap1_cached, value); } + current_pstate_driver->adjust_perf =NULL ; +return 0 ; free_cpudata1:
@@ -1866,8 +1868,6 @@ static int __init amd_pstate_init(void)/* capability check */ if (cpu_feature_enabled (X86_FEATURE_CPPC )) {pr_debug ("AMD CPPC MSR based functionality is supported\n" ); -if (cppc_state !=AMD_PSTATE_ACTIVE ) - current_pstate_driver->adjust_perf = amd_pstate_adjust_perf; }else {pr_debug ("AMD CPPC shared memory based functionality is supported\n" );static_call_update (amd_pstate_cppc_enable, shmem_cppc_enable);
Signature · 1 line
2.43.0
PATCH v2 2/2 cpufreq/amd-pstate: Move registration after static function call update
From: Mario Limonciello <[email protected]>
On shared memory designs the static functions need to work before registration is done or the system can hang at bootup.
Move the registration later in amd_pstate_init() to solve this.
--- drivers/cpufreq/amd-pstate.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/cpufreq/amd-pstate.c +6 -6
@@ -1859,12 +1859,6 @@ static int __init amd_pstate_init(void)return -ENODEV ; } - ret =amd_pstate_register_driver (cppc_state); -if (ret) { -pr_err ("failed to register with return %d\n" , ret); -return ret; - } -/* capability check */ if (cpu_feature_enabled (X86_FEATURE_CPPC )) {pr_debug ("AMD CPPC MSR based functionality is supported\n" );
@@ -1875,6 +1869,12 @@ static int __init amd_pstate_init(void)static_call_update (amd_pstate_update_perf, shmem_update_perf); } + ret =amd_pstate_register_driver (cppc_state); +if (ret) { +pr_err ("failed to register with return %d\n" , ret); +return ret; + } +if (amd_pstate_prefcore) { ret =amd_detect_prefcore (&amd_pstate_prefcore);if (ret)
Signature · 1 line
2.43.0
Re: [PATCH v2 2/2] cpufreq/amd-pstate: Move registration after static function call update
Quoted 6 lines · Mario Limonciello
From: Mario Limonciello <[email protected]>
On shared memory designs the static functions need to work before registration is done or the system can hang at bootup.
Move the registration later in
amd_pstate_init()to solve this.
Looks good to me.
Also,
Thanks,
Dhananjay
Quoted 39 lines
Fixes e238968a2087 ("cpufreq/amd-pstate: Remove the redundant amd_pstate_set_driver() call")Reported-by Klara Modin <[email protected]>Signed-off-by Mario Limonciello <[email protected]>--- drivers/cpufreq/amd-pstate.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)drivers/cpufreq/amd-pstate.c +6
-6@@ -1859,12 +1859,6 @@ static int __init amd_pstate_init(void)return -ENODEV ; } - ret =amd_pstate_register_driver (cppc_state); -if (ret) { -pr_err ("failed to register with return %d\n" , ret); -return ret; - } -/* capability check */ if (cpu_feature_enabled (X86_FEATURE_CPPC )) {pr_debug ("AMD CPPC MSR based functionality is supported\n" );@@ -1875,6 +1869,12 @@ static int __init amd_pstate_init(void)static_call_update (amd_pstate_update_perf, shmem_update_perf); } + ret =amd_pstate_register_driver (cppc_state); +if (ret) { +pr_err ("failed to register with return %d\n" , ret); +return ret; + } +if (amd_pstate_prefcore) { ret =amd_detect_prefcore (&amd_pstate_prefcore);if (ret)
Quoted 30 lines · Mario Limonciello
From: Mario Limonciello <[email protected]>
As the driver can be changed in and out of different modes it's possible that
adjust_perfis assigned when it shouldn't be.This could happen if an MSR design is started up in passive mode and then switches to active mode.
To solve this explicitly clear
adjust_perfinamd_pstate_epp_cpu_init().Signed-off-by Mario Limonciello <[email protected]>---
Cc: Klara Modin <[email protected]>drivers/cpufreq/amd-pstate.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)drivers/cpufreq/amd-pstate.c +2
-0@@ -1504,6 +1504,8 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)WRITE_ONCE (cpudata->cppc_cap1_cached, value); } + current_pstate_driver->adjust_perf =NULL ; +return 0 ; free_cpudata1:
drivers/cpufreq/amd-pstate.c static int __init amd_pstate_init(void) · line 1873
Quoted 8 lines
drivers/cpufreq/amd-pstate.c +0
-2@@ -1866,8 +1868,6 @@ static int __init amd_pstate_init(void)/* capability check */ if (cpu_feature_enabled (X86_FEATURE_CPPC )) {pr_debug ("AMD CPPC MSR based functionality is supported\n" ); -if (cppc_state !=AMD_PSTATE_ACTIVE ) - current_pstate_driver->adjust_perf = amd_pstate_adjust_perf; }else {pr_debug ("AMD CPPC shared memory based functionality is supported\n" );static_call_update (amd_pstate_cppc_enable, shmem_cppc_enable);
Both of these patches together also fix the problem I had.
Thanks,
Quoted 10 lines · Mario Limonciello
From: Mario Limonciello <[email protected]>
As the driver can be changed in and out of different modes it's possible that
adjust_perfis assigned when it shouldn't be.This could happen if an MSR design is started up in passive mode and then switches to active mode.
To solve this explicitly clear
adjust_perfinamd_pstate_epp_cpu_init().
Great, this solves the overlooked issue as well, looks good to me.
You may also add,
Thanks,
Dhananjay
Quoted 28 lines
Signed-off-by Mario Limonciello <[email protected]>---
Cc: Klara Modin <[email protected]>drivers/cpufreq/amd-pstate.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)drivers/cpufreq/amd-pstate.c +2
-2@@ -1504,6 +1504,8 @@ static int amd_pstate_epp_cpu_init(struct cpufreq_policy *policy)WRITE_ONCE (cpudata->cppc_cap1_cached, value); } + current_pstate_driver->adjust_perf =NULL ; +return 0 ; free_cpudata1:@@ -1866,8 +1868,6 @@ static int __init amd_pstate_init(void)/* capability check */ if (cpu_feature_enabled (X86_FEATURE_CPPC )) {pr_debug ("AMD CPPC MSR based functionality is supported\n" ); -if (cppc_state !=AMD_PSTATE_ACTIVE ) - current_pstate_driver->adjust_perf = amd_pstate_adjust_perf; }else {pr_debug ("AMD CPPC shared memory based functionality is supported\n" );static_call_update (amd_pstate_cppc_enable, shmem_cppc_enable);