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
>

Reply via email to