diff options
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c | 37 |
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) |