summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPrike Liang <Prike.Liang@amd.com>2026-10-14 13:45:38 +0800
committerAlex Deucher <alexander.deucher@amd.com>2026-10-27 13:58:55 -0400
commit2dd4abe27a40b48a521b0536044949eaaf9fed3b (patch)
tree62c72d21c175fb9915184c599a56dbe372085472
parent7ca6f3359b557a267c7b07a2fd748b1473395e10 (diff)
downloadlinux-next-2dd4abe27a40b48a521b0536044949eaaf9fed3b.tar.gz
linux-next-2dd4abe27a40b48a521b0536044949eaaf9fed3b.zip
drm/amdgpu: drop the unused firmware loading mutex
adev->firmware.mutex was added to serialize amdgpu_ucode_init_bo() between the PSP and powerplay firmware loaders. Powerplay no longer loads firmware through it, so the mutex no longer protects anything: its only users are psp_hw_init() and psp_resume(), which the IP init, resume and reset sequences already serialize. psp_hw_init() still allocates and reserves the PSP ring, TMR and TA buffers with it held, and GPU recovery takes the same mutex in psp_resume() while holding reset_domain->sem, so lockdep reports: &adev->firmware.mutex --> &userq_mgr->userq_mutex --> &reset_domain->sem Remove the mutex instead of keeping a lock that recovery shares with an allocating path. Signed-off-by: Prike Liang <Prike.Liang@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c1
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c9
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h1
3 files changed, 0 insertions, 11 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index c65bc575a57a..e9caffe2036f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -3824,7 +3824,6 @@ int amdgpu_device_init(struct amdgpu_device *adev,
/* mutex initialization are all done here so we
* can recall function without having locking issues
*/
- mutex_init(&adev->firmware.mutex);
mutex_init(&adev->pm.mutex);
mutex_init(&adev->gfx.gpu_clock_mutex);
mutex_init(&adev->srbm_mutex);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index 36bc4b431dd5..01dca6858833 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -4157,8 +4157,6 @@ static int psp_hw_init(struct amdgpu_ip_block *ip_block)
int ret;
struct amdgpu_device *adev = ip_block->adev;
- mutex_lock(&adev->firmware.mutex);
-
ret = amdgpu_ucode_init_bo(adev);
if (ret)
goto failed;
@@ -4169,12 +4167,10 @@ static int psp_hw_init(struct amdgpu_ip_block *ip_block)
goto failed;
}
- mutex_unlock(&adev->firmware.mutex);
return 0;
failed:
adev->firmware.load_type = AMDGPU_FW_LOAD_DIRECT;
- mutex_unlock(&adev->firmware.mutex);
return -EINVAL;
}
@@ -4282,8 +4278,6 @@ static int psp_resume(struct amdgpu_ip_block *ip_block)
}
}
- mutex_lock(&adev->firmware.mutex);
-
ret = amdgpu_ucode_init_bo(adev);
if (ret)
goto failed;
@@ -4345,13 +4339,10 @@ static int psp_resume(struct amdgpu_ip_block *ip_block)
"SECUREDISPLAY: Failed to initialize SECUREDISPLAY\n");
}
- mutex_unlock(&adev->firmware.mutex);
-
return 0;
failed:
dev_err(adev->dev, "PSP resume failed\n");
- mutex_unlock(&adev->firmware.mutex);
return ret;
}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
index 35277b240f25..7c809692807f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
@@ -612,7 +612,6 @@ struct amdgpu_firmware {
/* firmwares are loaded by psp instead of smu from vega10 */
const struct amdgpu_psp_funcs *funcs;
struct amdgpu_bo *rbuf;
- struct mutex mutex;
/* gpu info firmware data pointer */
const struct firmware *gpu_info_fw;