aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/vmwgfx
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/vmwgfx')
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_drv.c5
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_drv.h2
-rw-r--r--drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c48
3 files changed, 55 insertions, 0 deletions
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index 9819d0d048db..8010254e9cf9 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -85,6 +85,9 @@
85#define DRM_IOCTL_VMW_FENCE_WAIT \ 85#define DRM_IOCTL_VMW_FENCE_WAIT \
86 DRM_IOWR(DRM_COMMAND_BASE + DRM_VMW_FENCE_WAIT, \ 86 DRM_IOWR(DRM_COMMAND_BASE + DRM_VMW_FENCE_WAIT, \
87 struct drm_vmw_fence_wait_arg) 87 struct drm_vmw_fence_wait_arg)
88#define DRM_IOCTL_VMW_GET_3D_CAP \
89 DRM_IOW(DRM_COMMAND_BASE + DRM_VMW_GET_3D_CAP, \
90 struct drm_vmw_get_3d_cap_arg)
88 91
89/** 92/**
90 * The core DRM version of this macro doesn't account for 93 * The core DRM version of this macro doesn't account for
@@ -130,6 +133,8 @@ static struct drm_ioctl_desc vmw_ioctls[] = {
130 DRM_AUTH | DRM_UNLOCKED), 133 DRM_AUTH | DRM_UNLOCKED),
131 VMW_IOCTL_DEF(VMW_FENCE_WAIT, vmw_fence_wait_ioctl, 134 VMW_IOCTL_DEF(VMW_FENCE_WAIT, vmw_fence_wait_ioctl,
132 DRM_AUTH | DRM_UNLOCKED), 135 DRM_AUTH | DRM_UNLOCKED),
136 VMW_IOCTL_DEF(VMW_GET_3D_CAP, vmw_get_cap_3d_ioctl,
137 DRM_AUTH | DRM_UNLOCKED),
133}; 138};
134 139
135static struct pci_device_id vmw_pci_id_list[] = { 140static struct pci_device_id vmw_pci_id_list[] = {
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
index 39be79619068..2374a5c495f2 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h
@@ -397,6 +397,8 @@ extern int vmw_user_stream_lookup(struct vmw_private *dev_priv,
397 397
398extern int vmw_getparam_ioctl(struct drm_device *dev, void *data, 398extern int vmw_getparam_ioctl(struct drm_device *dev, void *data,
399 struct drm_file *file_priv); 399 struct drm_file *file_priv);
400extern int vmw_get_cap_3d_ioctl(struct drm_device *dev, void *data,
401 struct drm_file *file_priv);
400 402
401/** 403/**
402 * Fifo utilities - vmwgfx_fifo.c 404 * Fifo utilities - vmwgfx_fifo.c
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c
index 74b1dc8a7cdd..5ecf96660644 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c
@@ -54,6 +54,13 @@ int vmw_getparam_ioctl(struct drm_device *dev, void *data,
54 case DRM_VMW_PARAM_MAX_FB_SIZE: 54 case DRM_VMW_PARAM_MAX_FB_SIZE:
55 param->value = dev_priv->vram_size; 55 param->value = dev_priv->vram_size;
56 break; 56 break;
57 case DRM_VMW_PARAM_FIFO_HW_VERSION:
58 {
59 __le32 __iomem *fifo_mem = dev_priv->mmio_virt;
60
61 param->value = ioread32(fifo_mem + SVGA_FIFO_3D_HWVERSION);
62 break;
63 }
57 default: 64 default:
58 DRM_ERROR("Illegal vmwgfx get param request: %d\n", 65 DRM_ERROR("Illegal vmwgfx get param request: %d\n",
59 param->param); 66 param->param);
@@ -62,3 +69,44 @@ int vmw_getparam_ioctl(struct drm_device *dev, void *data,
62 69
63 return 0; 70 return 0;
64} 71}
72
73
74int vmw_get_cap_3d_ioctl(struct drm_device *dev, void *data,
75 struct drm_file *file_priv)
76{
77 struct drm_vmw_get_3d_cap_arg *arg =
78 (struct drm_vmw_get_3d_cap_arg *) data;
79 struct vmw_private *dev_priv = vmw_priv(dev);
80 uint32_t size;
81 __le32 __iomem *fifo_mem;
82 void __user *buffer = (void __user *)((unsigned long)(arg->buffer));
83 void *bounce;
84 int ret;
85
86 if (unlikely(arg->pad64 != 0)) {
87 DRM_ERROR("Illegal GET_3D_CAP argument.\n");
88 return -EINVAL;
89 }
90
91 size = (SVGA_FIFO_3D_CAPS_LAST - SVGA_FIFO_3D_CAPS + 1) << 2;
92
93 if (arg->max_size < size)
94 size = arg->max_size;
95
96 bounce = vmalloc(size);
97 if (unlikely(bounce == NULL)) {
98 DRM_ERROR("Failed to allocate bounce buffer for 3D caps.\n");
99 return -ENOMEM;
100 }
101
102 fifo_mem = dev_priv->mmio_virt;
103 memcpy_fromio(bounce, &fifo_mem[SVGA_FIFO_3D_CAPS], size);
104
105 ret = copy_to_user(buffer, bounce, size);
106 vfree(bounce);
107
108 if (unlikely(ret != 0))
109 DRM_ERROR("Failed to report 3D caps info.\n");
110
111 return ret;
112}