diff options
Diffstat (limited to 'drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c')
-rw-r--r-- | drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c | 42 |
1 files changed, 38 insertions, 4 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c index a51f48e3e917..116c49736763 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c | |||
@@ -53,7 +53,7 @@ int vmw_getparam_ioctl(struct drm_device *dev, void *data, | |||
53 | param->value = dev_priv->fifo.capabilities; | 53 | param->value = dev_priv->fifo.capabilities; |
54 | break; | 54 | break; |
55 | case DRM_VMW_PARAM_MAX_FB_SIZE: | 55 | case DRM_VMW_PARAM_MAX_FB_SIZE: |
56 | param->value = dev_priv->vram_size; | 56 | param->value = dev_priv->prim_bb_mem; |
57 | break; | 57 | break; |
58 | case DRM_VMW_PARAM_FIFO_HW_VERSION: | 58 | case DRM_VMW_PARAM_FIFO_HW_VERSION: |
59 | { | 59 | { |
@@ -68,6 +68,20 @@ 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; | ||
82 | case DRM_VMW_PARAM_MAX_MOB_MEMORY: | ||
83 | param->value = dev_priv->max_mob_pages * PAGE_SIZE; | ||
84 | break; | ||
71 | default: | 85 | default: |
72 | DRM_ERROR("Illegal vmwgfx get param request: %d\n", | 86 | DRM_ERROR("Illegal vmwgfx get param request: %d\n", |
73 | param->param); | 87 | param->param); |
@@ -89,13 +103,19 @@ int vmw_get_cap_3d_ioctl(struct drm_device *dev, void *data, | |||
89 | void __user *buffer = (void __user *)((unsigned long)(arg->buffer)); | 103 | void __user *buffer = (void __user *)((unsigned long)(arg->buffer)); |
90 | void *bounce; | 104 | void *bounce; |
91 | int ret; | 105 | int ret; |
106 | bool gb_objects = !!(dev_priv->capabilities & SVGA_CAP_GBOBJECTS); | ||
92 | 107 | ||
93 | if (unlikely(arg->pad64 != 0)) { | 108 | if (unlikely(arg->pad64 != 0)) { |
94 | DRM_ERROR("Illegal GET_3D_CAP argument.\n"); | 109 | DRM_ERROR("Illegal GET_3D_CAP argument.\n"); |
95 | return -EINVAL; | 110 | return -EINVAL; |
96 | } | 111 | } |
97 | 112 | ||
98 | size = (SVGA_FIFO_3D_CAPS_LAST - SVGA_FIFO_3D_CAPS + 1) << 2; | 113 | if (gb_objects) |
114 | size = SVGA3D_DEVCAP_MAX; | ||
115 | else | ||
116 | size = (SVGA_FIFO_3D_CAPS_LAST - SVGA_FIFO_3D_CAPS + 1); | ||
117 | |||
118 | size *= sizeof(uint32_t); | ||
99 | 119 | ||
100 | if (arg->max_size < size) | 120 | if (arg->max_size < size) |
101 | size = arg->max_size; | 121 | size = arg->max_size; |
@@ -106,8 +126,22 @@ int vmw_get_cap_3d_ioctl(struct drm_device *dev, void *data, | |||
106 | return -ENOMEM; | 126 | return -ENOMEM; |
107 | } | 127 | } |
108 | 128 | ||
109 | fifo_mem = dev_priv->mmio_virt; | 129 | if (gb_objects) { |
110 | memcpy_fromio(bounce, &fifo_mem[SVGA_FIFO_3D_CAPS], size); | 130 | int i; |
131 | uint32_t *bounce32 = (uint32_t *) bounce; | ||
132 | |||
133 | mutex_lock(&dev_priv->hw_mutex); | ||
134 | for (i = 0; i < SVGA3D_DEVCAP_MAX; ++i) { | ||
135 | vmw_write(dev_priv, SVGA_REG_DEV_CAP, i); | ||
136 | *bounce32++ = vmw_read(dev_priv, SVGA_REG_DEV_CAP); | ||
137 | } | ||
138 | mutex_unlock(&dev_priv->hw_mutex); | ||
139 | |||
140 | } else { | ||
141 | |||
142 | fifo_mem = dev_priv->mmio_virt; | ||
143 | memcpy_fromio(bounce, &fifo_mem[SVGA_FIFO_3D_CAPS], size); | ||
144 | } | ||
111 | 145 | ||
112 | ret = copy_to_user(buffer, bounce, size); | 146 | ret = copy_to_user(buffer, bounce, size); |
113 | if (ret) | 147 | if (ret) |