drm/vmwgfx: Adapt capability reporting to new hardware version
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
This commit is contained in:
parent
c1234db74d
commit
716a2fd66d
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user