diff options
author | Matthew Auld <matthew.auld@intel.com> | 2023-02-15 10:28:43 +0000 |
---|---|---|
committer | Rodrigo Vivi <rodrigo.vivi@intel.com> | 2023-12-19 18:28:53 -0500 |
commit | 0d83be772c1f8e0d3db4a26a5f1308e058a98354 (patch) | |
tree | 2ecdd5c0f8a7de63fb32e9f03f7c33b2862f3247 /drivers | |
parent | ba00da78ce4d2a7fe7ef245e1168b7946827995d (diff) | |
download | lwn-0d83be772c1f8e0d3db4a26a5f1308e058a98354.tar.gz lwn-0d83be772c1f8e0d3db4a26a5f1308e058a98354.zip |
drm/xe/mmio: fix forcewake ref leak in xe_mmio_ioctl
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>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/xe/xe_mmio.c | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/drivers/gpu/drm/xe/xe_mmio.c b/drivers/gpu/drm/xe/xe_mmio.c index 8a953df2b468..ba327b1e8dea 100644 --- a/drivers/gpu/drm/xe/xe_mmio.c +++ b/drivers/gpu/drm/xe/xe_mmio.c @@ -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; } } |