drm/vmwgfx: Adapt capability reporting to new hardware version
authorThomas Hellstrom <thellstrom@vmware.com>
Wed, 21 Nov 2012 09:37:20 +0000 (10:37 +0100)
committerThomas Hellstrom <thellstrom@vmware.com>
Fri, 17 Jan 2014 06:52:18 +0000 (07:52 +0100)
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Zack Rusin <zackr@vmware.com>
Conflicts:
drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c

drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c

index e308e9e..641908e 100644 (file)
@@ -68,6 +68,17 @@ int vmw_getparam_ioctl(struct drm_device *dev, void *data,
                                  SVGA_FIFO_3D_HWVERSION));
                break;
        }
+       case DRM_VMW_PARAM_MAX_SURF_MEMORY:
+               param->value = dev_priv->memory_size;
+               break;
+       case DRM_VMW_PARAM_3D_CAPS_SIZE:
+               if (dev_priv->capabilities & SVGA_CAP_GBOBJECTS)
+                       param->value = SVGA3D_DEVCAP_MAX;
+               else
+                       param->value = (SVGA_FIFO_3D_CAPS_LAST -
+                                       SVGA_FIFO_3D_CAPS + 1);
+               param->value *= sizeof(uint32_t);
+               break;
        default:
                DRM_ERROR("Illegal vmwgfx get param request: %d\n",
                          param->param);
@@ -89,13 +100,19 @@ int vmw_get_cap_3d_ioctl(struct drm_device *dev, void *data,
        void __user *buffer = (void __user *)((unsigned long)(arg->buffer));
        void *bounce;
        int ret;
+       bool gb_objects = !!(dev_priv->capabilities & SVGA_CAP_GBOBJECTS);
 
        if (unlikely(arg->pad64 != 0)) {
                DRM_ERROR("Illegal GET_3D_CAP argument.\n");
                return -EINVAL;
        }
 
-       size = (SVGA_FIFO_3D_CAPS_LAST - SVGA_FIFO_3D_CAPS + 1) << 2;
+       if (gb_objects)
+               size = SVGA3D_DEVCAP_MAX;
+       else
+               size = (SVGA_FIFO_3D_CAPS_LAST - SVGA_FIFO_3D_CAPS + 1);
+
+       size *= sizeof(uint32_t);
 
        if (arg->max_size < size)
                size = arg->max_size;
@@ -106,8 +123,22 @@ int vmw_get_cap_3d_ioctl(struct drm_device *dev, void *data,
                return -ENOMEM;
        }
 
-       fifo_mem = dev_priv->mmio_virt;
-       memcpy_fromio(bounce, &fifo_mem[SVGA_FIFO_3D_CAPS], size);
+       if (gb_objects) {
+               int i;
+               uint32_t *bounce32 = (uint32_t *) bounce;
+
+               mutex_lock(&dev_priv->hw_mutex);
+               for (i = 0; i < SVGA3D_DEVCAP_MAX; ++i) {
+                       vmw_write(dev_priv, SVGA_REG_DEV_CAP, i);
+                       *bounce32++ = vmw_read(dev_priv, SVGA_REG_DEV_CAP);
+               }
+               mutex_unlock(&dev_priv->hw_mutex);
+
+       } else {
+
+               fifo_mem = dev_priv->mmio_virt;
+               memcpy_fromio(bounce, &fifo_mem[SVGA_FIFO_3D_CAPS], size);
+       }
 
        ret = copy_to_user(buffer, bounce, size);
        if (ret)