aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c37
1 files changed, 34 insertions, 3 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c
index e308e9eafbb1..641908e06eab 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c
@@ -68,6 +68,17 @@ int vmw_getparam_ioctl(struct drm_device *dev, void *data,
68 SVGA_FIFO_3D_HWVERSION)); 68 SVGA_FIFO_3D_HWVERSION));
69 break; 69 break;
70 } 70 }
71 case DRM_VMW_PARAM_MAX_SURF_MEMORY:
72 param->value = dev_priv->memory_size;
73 break;
74 case DRM_VMW_PARAM_3D_CAPS_SIZE:
75 if (dev_priv->capabilities & SVGA_CAP_GBOBJECTS)
76 param->value = SVGA3D_DEVCAP_MAX;
77 else
78 param->value = (SVGA_FIFO_3D_CAPS_LAST -
79 SVGA_FIFO_3D_CAPS + 1);
80 param->value *= sizeof(uint32_t);
81 break;
71 default: 82 default:
72 DRM_ERROR("Illegal vmwgfx get param request: %d\n", 83 DRM_ERROR("Illegal vmwgfx get param request: %d\n",
73 param->param); 84 param->param);
@@ -89,13 +100,19 @@ int vmw_get_cap_3d_ioctl(struct drm_device *dev, void *data,
89 void __user *buffer = (void __user *)((unsigned long)(arg->buffer)); 100 void __user *buffer = (void __user *)((unsigned long)(arg->buffer));
90 void *bounce; 101 void *bounce;
91 int ret; 102 int ret;
103 bool gb_objects = !!(dev_priv->capabilities & SVGA_CAP_GBOBJECTS);
92 104
93 if (unlikely(arg->pad64 != 0)) { 105 if (unlikely(arg->pad64 != 0)) {
94 DRM_ERROR("Illegal GET_3D_CAP argument.\n"); 106 DRM_ERROR("Illegal GET_3D_CAP argument.\n");
95 return -EINVAL; 107 return -EINVAL;
96 } 108 }
97 109
98 size = (SVGA_FIFO_3D_CAPS_LAST - SVGA_FIFO_3D_CAPS + 1) << 2; 110 if (gb_objects)
111 size = SVGA3D_DEVCAP_MAX;
112 else
113 size = (SVGA_FIFO_3D_CAPS_LAST - SVGA_FIFO_3D_CAPS + 1);
114
115 size *= sizeof(uint32_t);
99 116
100 if (arg->max_size < size) 117 if (arg->max_size < size)
101 size = arg->max_size; 118 size = arg->max_size;
@@ -106,8 +123,22 @@ int vmw_get_cap_3d_ioctl(struct drm_device *dev, void *data,
106 return -ENOMEM; 123 return -ENOMEM;
107 } 124 }
108 125
109 fifo_mem = dev_priv->mmio_virt; 126 if (gb_objects) {
110 memcpy_fromio(bounce, &fifo_mem[SVGA_FIFO_3D_CAPS], size); 127 int i;
128 uint32_t *bounce32 = (uint32_t *) bounce;
129
130 mutex_lock(&dev_priv->hw_mutex);
131 for (i = 0; i < SVGA3D_DEVCAP_MAX; ++i) {
132 vmw_write(dev_priv, SVGA_REG_DEV_CAP, i);
133 *bounce32++ = vmw_read(dev_priv, SVGA_REG_DEV_CAP);
134 }
135 mutex_unlock(&dev_priv->hw_mutex);
136
137 } else {
138
139 fifo_mem = dev_priv->mmio_virt;
140 memcpy_fromio(bounce, &fifo_mem[SVGA_FIFO_3D_CAPS], size);
141 }
111 142
112 ret = copy_to_user(buffer, bounce, size); 143 ret = copy_to_user(buffer, bounce, size);
113 if (ret) 144 if (ret)