drm/radeon: add a way to revoke hyper-z access
authorMarek Olšák <maraeo@gmail.com>
Sat, 7 Aug 2010 01:36:34 +0000 (03:36 +0200)
committerDave Airlie <airlied@redhat.com>
Mon, 9 Aug 2010 22:20:31 +0000 (08:20 +1000)
Signed-off-by: Marek Olšák <maraeo@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/radeon/radeon_kms.c

index 948a2f454e426eaad1c97334263bb925df8efecf..b1c8ace5f0802c908ce653022bbe2921470c8e90 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: