drm/radeon: add a way to revoke hyper-z access
[platform/adaptation/renesas_rcar/renesas_kernel.git] / drivers / gpu / drm / radeon / radeon_kms.c
index 948a2f4..b1c8ace 100644 (file)
@@ -162,13 +162,27 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
                        return -EINVAL;
                }
        case RADEON_INFO_WANT_HYPERZ:
+               /* The "value" here is both an input and output parameter.
+                * If the input value is 1, filp requests hyper-z access.
+                * If the input value is 0, filp revokes its hyper-z access.
+                *
+                * When returning, the value is 1 if filp owns hyper-z access,
+                * 0 otherwise. */
+               if (value >= 2) {
+                       DRM_DEBUG_KMS("WANT_HYPERZ: invalid value %d\n", value);
+                       return -EINVAL;
+               }
                mutex_lock(&dev->struct_mutex);
-               if (rdev->hyperz_filp)
-                       value = 0;
-               else {
-                       rdev->hyperz_filp = filp;
-                       value = 1;
+               if (value == 1) {
+                       /* wants hyper-z */
+                       if (!rdev->hyperz_filp)
+                               rdev->hyperz_filp = filp;
+               } else if (value == 0) {
+                       /* revokes hyper-z */
+                       if (rdev->hyperz_filp == filp)
+                               rdev->hyperz_filp = NULL;
                }
+               value = rdev->hyperz_filp == filp ?  1 : 0;
                mutex_unlock(&dev->struct_mutex);
                break;
        default: