Reviewed-by: Alex Deucher <[email protected]>
On Wed, Sep 2, 2026 at 8:50 AM Prike Liang <[email protected]> wrote: > > During resume from GPU reset, the gfx idle work may invoke > switch_power_profile > before the reset completes. This causes the following assert error because the > register access occurs without first releasing the GPU reset semaphore: > > [ 1576.768935] CR2: 0000559ea133ead0 CR3: 00000002e6c42000 CR4: > 0000000000350ef0 > [ 1576.768940] Call Trace: > [ 1576.768944] <TASK> > [ 1576.768953] amdgpu_device_rreg+0x21/0x50 [amdgpu] > [ 1576.769158] smu_msg_v1_send_msg+0x1a4/0x6e0 [amdgpu] > [ 1576.769437] smu_cmn_send_smc_msg_with_params_ext+0xba/0x120 [amdgpu] > [ 1576.769721] smu_cmn_send_smc_msg_with_param+0x33/0x40 [amdgpu] > [ 1576.769993] smu_v13_0_0_set_power_profile_mode+0x192/0x2b0 [amdgpu] > [ 1576.770267] smu_bump_power_profile_mode+0x5d/0x80 [amdgpu] > [ 1576.770538] smu_switch_power_profile+0xa4/0xf0 [amdgpu] > [ 1576.770839] amdgpu_dpm_switch_power_profile+0x6f/0x90 [amdgpu] > [ 1576.771210] amdgpu_gfx_profile_idle_work_handler+0xe9/0x130 [amdgpu] > [ 1576.771460] process_one_work+0x23e/0x6f0 > [ 1576.771491] worker_thread+0x1c4/0x380 > [ 1576.771506] kthread+0x10c/0x150 > [ 1576.771512] ? __pfx_worker_thread+0x10/0x10 > [ 1576.771518] ? __pfx_kthread+0x10/0x10 > [ 1576.771530] ret_from_fork+0x314/0x390 > [ 1576.771537] ? __pfx_kthread+0x10/0x10 > [ 1576.771546] ret_from_fork_asm+0x1a/0x30 > > Signed-off-by: Prike Liang <[email protected]> > --- > drivers/gpu/drm/amd/pm/amdgpu_dpm.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/amd/pm/amdgpu_dpm.c > b/drivers/gpu/drm/amd/pm/amdgpu_dpm.c > index ce526db4d24a..808be6c425bf 100644 > --- a/drivers/gpu/drm/amd/pm/amdgpu_dpm.c > +++ b/drivers/gpu/drm/amd/pm/amdgpu_dpm.c > @@ -348,7 +348,8 @@ int amdgpu_dpm_switch_power_profile(struct amdgpu_device > *adev, > const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; > int ret = 0; > > - if (amdgpu_sriov_vf(adev)) > + if (amdgpu_sriov_vf(adev) || > + amdgpu_in_reset(adev)) > return 0; > > if (pp_funcs && pp_funcs->switch_power_profile) { > @@ -367,7 +368,8 @@ int amdgpu_dpm_pause_power_profile(struct amdgpu_device > *adev, > const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs; > int ret = 0; > > - if (amdgpu_sriov_vf(adev)) > + if (amdgpu_sriov_vf(adev) || > + amdgpu_in_reset(adev)) > return 0; > > if (pp_funcs && pp_funcs->pause_power_profile) { > -- > 2.34.1 >
