summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2010-03-18 17:50:52 +1000
committerDave Airlie <airlied@redhat.com>2010-03-18 17:50:52 +1000
commit8e5f59111c5a7c210595c5f13618b0b0b20e752f (patch)
tree033ca7aa0f28c498fb92bb20640edfbcbda08f27
parent7c5cc4f63556e351e9e5980ed22accad410e3fdc (diff)
drm: initial multiple nodes ioctl work.drm-render-nodes
just adds some unchecked ioctls to setup the nodes. Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--drivers/gpu/drm/drm_drv.c4
-rw-r--r--drivers/gpu/drm/drm_stub.c56
-rw-r--r--include/drm/drm.h3
-rw-r--r--include/drm/drmP.h6
-rw-r--r--include/drm/drm_mode.h14
5 files changed, 82 insertions, 1 deletions
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index 62e4a5d92e0e..fcd1f58ba85a 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -146,7 +146,9 @@ static struct drm_ioctl_desc drm_ioctls[] = {
DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
- DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED)
+ DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+ DRM_IOCTL_DEF(DRM_IOCTL_RENDER_NODE_CREATE, drm_render_node_create_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
+ DRM_IOCTL_DEF(DRM_IOCTL_RENDER_NODE_REMOVE, drm_render_node_remove_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
};
#define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls )
diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c
index 22c62501aa68..ba00fb2022ed 100644
--- a/drivers/gpu/drm/drm_stub.c
+++ b/drivers/gpu/drm/drm_stub.c
@@ -602,3 +602,59 @@ void drm_put_dev(struct drm_device *dev)
kfree(dev);
}
EXPORT_SYMBOL(drm_put_dev);
+
+int drm_render_node_create_ioctl(struct drm_device *dev, void *data,
+ struct drm_file *file_priv)
+{
+ struct drm_render_node_create *args = data;
+ int ret;
+ struct drm_minor *new_minor;
+ int total_ids, i;
+ uint32_t __user *ids_ptr;
+ ret = drm_create_minor_render(dev, &new_minor);
+ if (ret)
+ goto out;
+
+ args->node_minor_id = new_minor->index;
+
+ if (args->num_crtc == 0 &&
+ args->num_encoder == 0 &&
+ args->num_connector == 0)
+ goto out;
+ if (args->num_crtc == 0 ||
+ args->num_encoder == 0 ||
+ args->num_connector == 0) {
+ ret = -EINVAL;
+ goto out;
+ }
+
+ ret = drm_mode_group_init(dev, &new_minor->mode_group);
+ if (ret)
+ goto out;
+
+ ids_ptr = (uint32_t __user *)(unsigned long)args->id_list_ptr;
+ total_ids = args->num_crtc + args->num_encoder + args->num_connector;
+ for (i = 0; i < total_ids; i++) {
+ if (get_user(new_minor->mode_group.id_list[i], &ids_ptr[i])) {
+ ret = -EFAULT;
+ goto out_put;
+ }
+ }
+out_put:
+ drm_put_minor(&new_minor);
+out:
+ return ret;
+}
+
+int drm_render_node_remove_ioctl(struct drm_device *dev, void *data,
+ struct drm_file *file_priv)
+{
+ struct drm_render_node_remove *args = data;
+ struct drm_minor *del_minor, *tmp;
+
+ list_for_each_entry_safe(del_minor, tmp, &dev->render_minor_list, render_node_list) {
+ if (del_minor->index == args->node_minor_id)
+ drm_put_minor(&del_minor);
+ }
+ return 0;
+}
diff --git a/include/drm/drm.h b/include/drm/drm.h
index e3f46e0cb7dc..9b2244397ca3 100644
--- a/include/drm/drm.h
+++ b/include/drm/drm.h
@@ -629,6 +629,9 @@ struct drm_gem_open {
#define DRM_IOCTL_GEM_FLINK DRM_IOWR(0x0a, struct drm_gem_flink)
#define DRM_IOCTL_GEM_OPEN DRM_IOWR(0x0b, struct drm_gem_open)
+#define DRM_IOCTL_RENDER_NODE_CREATE DRM_IOWR(0x0c, struct drm_render_node_create)
+#define DRM_IOCTL_RENDER_NODE_REMOVE DRM_IOWR(0x0d, struct drm_render_node_remove)
+
#define DRM_IOCTL_SET_UNIQUE DRM_IOW( 0x10, struct drm_unique)
#define DRM_IOCTL_AUTH_MAGIC DRM_IOW( 0x11, struct drm_auth)
#define DRM_IOCTL_BLOCK DRM_IOWR(0x12, struct drm_block)
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 13c1efb7b305..63d1065a8ffc 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -1357,6 +1357,12 @@ extern int drm_get_dev(struct pci_dev *pdev, const struct pci_device_id *ent,
struct drm_driver *driver);
extern void drm_put_dev(struct drm_device *dev);
extern int drm_put_minor(struct drm_minor **minor);
+
+extern int drm_render_node_create_ioctl(struct drm_device *dev, void *data,
+ struct drm_file *file_priv);
+extern int drm_render_node_remove_ioctl(struct drm_device *dev, void *data,
+ struct drm_file *file_priv);
+
extern unsigned int drm_debug;
extern struct class *drm_class;
diff --git a/include/drm/drm_mode.h b/include/drm/drm_mode.h
index c5ba1636613c..8fe810b9017a 100644
--- a/include/drm/drm_mode.h
+++ b/include/drm/drm_mode.h
@@ -343,4 +343,18 @@ struct drm_mode_crtc_page_flip {
__u64 user_data;
};
+/* render node create and remove functions
+ if crtc/encoders/connectors all == 0 then gpgpu node */
+struct drm_render_node_create {
+ __u32 node_minor_id;
+ __u32 num_crtc;
+ __u32 num_encoder;
+ __u32 num_connector;
+ __u64 id_list_ptr;
+};
+
+struct drm_render_node_remove {
+ __u32 node_minor_id;
+};
+
#endif