]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amdgpu: make sure userqs are enabled in userq IOCTLs
authorAlex Deucher <alexander.deucher@amd.com>
Fri, 9 Jan 2026 13:54:55 +0000 (08:54 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 14 Jan 2026 19:57:55 +0000 (14:57 -0500)
These IOCTLs shouldn't be called when userqs are not
enabled.  Make sure they are enabled before executing
the IOCTLs.

Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
(cherry picked from commit d967509651601cddce7ff2a9f09479f3636f684d)
Cc: stable@vger.kernel.org
drivers/gpu/drm/amd/amdgpu/amdgpu_userq.c
drivers/gpu/drm/amd/amdgpu/amdgpu_userq.h
drivers/gpu/drm/amd/amdgpu/amdgpu_userq_fence.c

index 9a969175900e994a0a02a7ef9c06a1ffa4a2d34f..58b26c78b642586529b6b32317a3e2190f136f46 100644 (file)
@@ -885,12 +885,28 @@ static int amdgpu_userq_input_args_validate(struct drm_device *dev,
        return 0;
 }
 
+bool amdgpu_userq_enabled(struct drm_device *dev)
+{
+       struct amdgpu_device *adev = drm_to_adev(dev);
+       int i;
+
+       for (i = 0; i < AMDGPU_HW_IP_NUM; i++) {
+               if (adev->userq_funcs[i])
+                       return true;
+       }
+
+       return false;
+}
+
 int amdgpu_userq_ioctl(struct drm_device *dev, void *data,
                       struct drm_file *filp)
 {
        union drm_amdgpu_userq *args = data;
        int r;
 
+       if (!amdgpu_userq_enabled(dev))
+               return -ENOTSUPP;
+
        if (amdgpu_userq_input_args_validate(dev, args, filp) < 0)
                return -EINVAL;
 
index c37444427a14c49eec7e760f69020e4050ad1406..b48b3bc293fca366cbd08841585804e00c5a4ba5 100644 (file)
@@ -141,6 +141,7 @@ uint64_t amdgpu_userq_get_doorbell_index(struct amdgpu_userq_mgr *uq_mgr,
                                             struct drm_file *filp);
 
 u32 amdgpu_userq_get_supported_ip_mask(struct amdgpu_device *adev);
+bool amdgpu_userq_enabled(struct drm_device *dev);
 
 int amdgpu_userq_suspend(struct amdgpu_device *adev);
 int amdgpu_userq_resume(struct amdgpu_device *adev);
index eba9fb359047fb22308e45960b79941b433d15a1..53d8707f9881a2ddda4023e01e883c8323a1434c 100644 (file)
@@ -471,6 +471,9 @@ int amdgpu_userq_signal_ioctl(struct drm_device *dev, void *data,
        struct drm_exec exec;
        u64 wptr;
 
+       if (!amdgpu_userq_enabled(dev))
+               return -ENOTSUPP;
+
        num_syncobj_handles = args->num_syncobj_handles;
        syncobj_handles = memdup_user(u64_to_user_ptr(args->syncobj_handles),
                                      size_mul(sizeof(u32), num_syncobj_handles));
@@ -653,6 +656,9 @@ int amdgpu_userq_wait_ioctl(struct drm_device *dev, void *data,
        int r, i, rentry, wentry, cnt;
        struct drm_exec exec;
 
+       if (!amdgpu_userq_enabled(dev))
+               return -ENOTSUPP;
+
        num_read_bo_handles = wait_info->num_bo_read_handles;
        bo_handles_read = memdup_user(u64_to_user_ptr(wait_info->bo_read_handles),
                                      size_mul(sizeof(u32), num_read_bo_handles));