#include <drm/i915_drm.h>
 #include "i915_drv.h"
 
-typedef struct drm_i915_getparam32 {
-       int param;
+struct drm_i915_getparam32 {
+       s32 param;
+       /*
+        * We screwed up the generic ioctl struct here and used a variable-sized
+        * pointer. Use u32 in the compat struct to match the 32bit pointer
+        * userspace expects.
+        */
        u32 value;
-} drm_i915_getparam32_t;
+};
 
 static int compat_i915_getparam(struct file *file, unsigned int cmd,
                                unsigned long arg)
 {
-       drm_i915_getparam32_t req32;
+       struct drm_i915_getparam32 req32;
        drm_i915_getparam_t __user *request;
 
        if (copy_from_user(&req32, (void __user *)arg, sizeof(req32)))
 
 #define I915_PARAM_HAS_RESOURCE_STREAMER 36
 
 typedef struct drm_i915_getparam {
-       int param;
+       s32 param;
+       /*
+        * WARNING: Using pointers instead of fixed-size u64 means we need to write
+        * compat32 code. Don't repeat this mistake.
+        */
        int __user *value;
 } drm_i915_getparam_t;