drm/xe/mmio: fix forcewake ref leak in xe_mmio_ioctl
authorMatthew Auld <matthew.auld@intel.com>
Wed, 15 Feb 2023 10:28:43 +0000 (10:28 +0000)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Tue, 19 Dec 2023 23:28:53 +0000 (18:28 -0500)
Make sure we properly release the forcewake ref on all error paths.

v2(Lucas):
  - Make it less verbose and just fold the unimplemented options into
    the default. The exact return value doesn't seem to matter for the
    corresponding IGT.
  - Replace the user triggerable WARN() with drm_dbg().

Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: Lucas De Marchi <lucas.demarchi@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_mmio.c

index 8a953df2b4688d3436e74d4b7886179d867f5558..ba327b1e8deadec9877c76a54c5befe1a5bc7601 100644 (file)
@@ -425,31 +425,28 @@ int xe_mmio_ioctl(struct drm_device *dev, void *data,
 
        if (args->flags & DRM_XE_MMIO_WRITE) {
                switch (bits_flag) {
-               case DRM_XE_MMIO_8BIT:
-                       return -EINVAL; /* TODO */
-               case DRM_XE_MMIO_16BIT:
-                       return -EINVAL; /* TODO */
                case DRM_XE_MMIO_32BIT:
-                       if (XE_IOCTL_ERR(xe, args->value > U32_MAX))
-                               return -EINVAL;
+                       if (XE_IOCTL_ERR(xe, args->value > U32_MAX)) {
+                               ret = -EINVAL;
+                               goto exit;
+                       }
                        xe_mmio_write32(to_gt(xe), args->addr, args->value);
                        break;
                case DRM_XE_MMIO_64BIT:
                        xe_mmio_write64(to_gt(xe), args->addr, args->value);
                        break;
                default:
-                       drm_WARN(&xe->drm, 1, "Invalid MMIO bit size");
-                       ret = -EINVAL;
+                       drm_dbg(&xe->drm, "Invalid MMIO bit size");
+                       fallthrough;
+               case DRM_XE_MMIO_8BIT: /* TODO */
+               case DRM_XE_MMIO_16BIT: /* TODO */
+                       ret = -ENOTSUPP;
                        goto exit;
                }
        }
 
        if (args->flags & DRM_XE_MMIO_READ) {
                switch (bits_flag) {
-               case DRM_XE_MMIO_8BIT:
-                       return -EINVAL; /* TODO */
-               case DRM_XE_MMIO_16BIT:
-                       return -EINVAL; /* TODO */
                case DRM_XE_MMIO_32BIT:
                        args->value = xe_mmio_read32(to_gt(xe), args->addr);
                        break;
@@ -457,8 +454,11 @@ int xe_mmio_ioctl(struct drm_device *dev, void *data,
                        args->value = xe_mmio_read64(to_gt(xe), args->addr);
                        break;
                default:
-                       drm_WARN(&xe->drm, 1, "Invalid MMIO bit size");
-                       ret = -EINVAL;
+                       drm_dbg(&xe->drm, "Invalid MMIO bit size");
+                       fallthrough;
+               case DRM_XE_MMIO_8BIT: /* TODO */
+               case DRM_XE_MMIO_16BIT: /* TODO */
+                       ret = -ENOTSUPP;
                }
        }