summaryrefslogtreecommitdiff
path: root/bsd-core/drm_ioctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'bsd-core/drm_ioctl.c')
-rw-r--r--bsd-core/drm_ioctl.c70
1 files changed, 70 insertions, 0 deletions
diff --git a/bsd-core/drm_ioctl.c b/bsd-core/drm_ioctl.c
index a195d0c4..50cf937d 100644
--- a/bsd-core/drm_ioctl.c
+++ b/bsd-core/drm_ioctl.c
@@ -79,6 +79,12 @@ int DRM(irq_busid)( DRM_IOCTL_ARGS )
#endif
}
+/*
+ * Beginning in revision 1.1 of the DRM interface, getunique will return
+ * a unique in the form pci:oooo:bb:dd.f (o=domain, b=bus, d=device, f=function)
+ * before setunique has been called. The format for the bus-specific part of
+ * the unique is not defined for any other bus.
+ */
int DRM(getunique)( DRM_IOCTL_ARGS )
{
DRM_DEVICE;
@@ -97,6 +103,9 @@ int DRM(getunique)( DRM_IOCTL_ARGS )
return 0;
}
+/* Deprecated in DRM version 1.1, and will return EBUSY when setversion has
+ * requested version 1.1 or greater.
+ */
int DRM(setunique)( DRM_IOCTL_ARGS )
{
DRM_DEVICE;
@@ -125,6 +134,26 @@ int DRM(setunique)( DRM_IOCTL_ARGS )
}
+static int
+DRM(set_busid)(drm_device_t *dev)
+{
+
+ if (dev->unique != NULL)
+ return EBUSY;
+
+ dev->unique_len = 20;
+ dev->unique = DRM(alloc)(dev->unique_len + 1, DRM_MEM_DRIVER);
+ if (dev->unique == NULL)
+ return ENOMEM;
+
+ /* XXX Fix domain number (alpha hoses) */
+ snprintf(dev->unique, dev->unique_len, "pci:%04x:%02x:%02x.%1x",
+ 0, pci_get_bus(dev->device), pci_get_slot(dev->device),
+ pci_get_function(dev->device));
+
+ return 0;
+}
+
int DRM(getmap)( DRM_IOCTL_ARGS )
{
DRM_DEVICE;
@@ -231,6 +260,47 @@ int DRM(getstats)( DRM_IOCTL_ARGS )
return 0;
}
+int DRM(setversion)(DRM_IOCTL_ARGS)
+{
+ DRM_DEVICE;
+ drm_set_version_t sv;
+ drm_set_version_t retv;
+
+ DRM_COPY_FROM_USER_IOCTL(sv, (drm_set_version_t *)data, sizeof(sv));
+
+ retv.drm_di_major = 1;
+ retv.drm_di_minor = 1;
+ retv.drm_dd_major = DRIVER_MAJOR;
+ retv.drm_dd_minor = DRIVER_MINOR;
+
+ DRM_COPY_TO_USER_IOCTL((drm_set_version_t *)data, retv, sizeof(sv));
+
+ if (sv.drm_di_major != -1) {
+ if (sv.drm_di_major != 1 || sv.drm_di_minor < 0)
+ return EINVAL;
+ if (sv.drm_di_minor > 1)
+ return EINVAL;
+ if (sv.drm_di_minor >= 1) {
+ /*
+ * Version 1.1 includes tying of DRM to specific device
+ */
+ DRM(set_busid)(dev);
+ }
+ }
+
+ if (sv.drm_dd_major != -1) {
+ if (sv.drm_dd_major != DRIVER_MAJOR || sv.drm_dd_minor < 0)
+ return EINVAL;
+ if (sv.drm_dd_minor > DRIVER_MINOR)
+ return EINVAL;
+#ifdef DRIVER_SETVERSION
+ DRIVER_SETVERSION(dev, sv);
+#endif
+ }
+ return 0;
+}
+
+
int DRM(noop)(DRM_IOCTL_ARGS)
{
DRM_DEBUG("\n");