[PATCH 03/16] drm: add support for render nodes
Ilija Hadzic
ihadzic at research.bell-labs.com
Thu Mar 29 09:41:25 PDT 2012
Add support for creating multiple render nodes on the same
physical GPU.
Patch derived from 7c5cc4f63556e351e9e5980ed22accad410e3fdc
originally authored by Dave Airlie.
Signed-off-by: Ilija Hadzic <ihadzic at research.bell-labs.com>
---
drivers/gpu/drm/drm_crtc.c | 1 +
drivers/gpu/drm/drm_stub.c | 32 +++++++++++++++++++++++++++++++-
drivers/gpu/drm/drm_vm.c | 7 +++++++
include/drm/drmP.h | 4 +++-
include/drm/drm_crtc.h | 1 +
5 files changed, 43 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index d2d9dc5..f081873 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -950,6 +950,7 @@ int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *group)
group->num_encoders = 0;
return 0;
}
+EXPORT_SYMBOL(drm_mode_group_init);
int drm_mode_group_init_legacy_group(struct drm_device *dev,
struct drm_mode_group *group)
diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c
index 6d7b083..53033d3 100644
--- a/drivers/gpu/drm/drm_stub.c
+++ b/drivers/gpu/drm/drm_stub.c
@@ -269,6 +269,7 @@ int drm_fill_in_dev(struct drm_device *dev,
INIT_LIST_HEAD(&dev->vmalist);
INIT_LIST_HEAD(&dev->maplist);
INIT_LIST_HEAD(&dev->vblank_event_list);
+ INIT_LIST_HEAD(&dev->render_minor_list);
spin_lock_init(&dev->count_lock);
spin_lock_init(&dev->event_lock);
@@ -355,6 +356,7 @@ int drm_get_minor(struct drm_device *dev, struct drm_minor **minor, int type)
new_minor->dev = dev;
new_minor->index = minor_id;
INIT_LIST_HEAD(&new_minor->master_list);
+ INIT_LIST_HEAD(&new_minor->render_node_list);
idr_replace(&drm_minors_idr, new_minor, minor_id);
@@ -398,6 +400,29 @@ err_idr:
return ret;
}
+int drm_create_minor_render(struct drm_device *dev, struct drm_minor **minor_p)
+{
+ int ret;
+ struct drm_minor *minor;
+
+ ret = drm_get_minor(dev, &minor, DRM_MINOR_RENDER);
+ if (ret)
+ return ret;
+
+ list_add_tail(&minor->render_node_list, &dev->render_minor_list);
+ return 0;
+}
+
+int drm_destroy_minor_render(struct drm_device *dev)
+{
+ struct drm_minor *minor, *tmp;
+
+ list_for_each_entry_safe(minor, tmp, &dev->render_minor_list, render_node_list) {
+ drm_put_minor(&minor);
+ }
+ return 0;
+}
+
/**
* Put a secondary minor number.
*
@@ -414,6 +439,8 @@ int drm_put_minor(struct drm_minor **minor_p)
DRM_DEBUG("release secondary minor %d\n", minor->index);
+ list_del(&minor->render_node_list);
+
if (minor->type == DRM_MINOR_LEGACY)
drm_proc_cleanup(minor, drm_proc_root);
#if defined(CONFIG_DEBUG_FS)
@@ -476,9 +503,12 @@ void drm_put_dev(struct drm_device *dev)
drm_ctxbitmap_cleanup(dev);
- if (drm_core_check_feature(dev, DRIVER_MODESET))
+ if (drm_core_check_feature(dev, DRIVER_MODESET)) {
drm_put_minor(&dev->control);
+ drm_destroy_minor_render(dev);
+ }
+
if (driver->driver_features & DRIVER_GEM)
drm_gem_destroy(dev);
diff --git a/drivers/gpu/drm/drm_vm.c b/drivers/gpu/drm/drm_vm.c
index bcd15b0..7cf67dd 100644
--- a/drivers/gpu/drm/drm_vm.c
+++ b/drivers/gpu/drm/drm_vm.c
@@ -691,8 +691,15 @@ EXPORT_SYMBOL(drm_mmap);
void drm_unmap_mapping(struct drm_device *dev, loff_t const holebegin,
loff_t const holelen)
{
+ struct drm_minor *minor;
if (dev->primary->dev_mapping)
unmap_mapping_range(dev->primary->dev_mapping,
holebegin, holelen, 1);
+
+ list_for_each_entry(minor, &dev->render_minor_list, render_node_list) {
+ if (minor->dev_mapping)
+ unmap_mapping_range(minor->dev_mapping,
+ holebegin, holelen, 1);
+ }
}
EXPORT_SYMBOL(drm_unmap_mapping);
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index eeb377a..d9eee26 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -999,6 +999,8 @@ struct drm_minor {
struct drm_mode_group mode_group;
struct address_space *dev_mapping;
+
+ struct list_head render_node_list;
};
/* mode specified on the command line */
@@ -1162,7 +1164,7 @@ struct drm_device {
unsigned int agp_buffer_token;
struct drm_minor *control; /**< Control node for card */
struct drm_minor *primary; /**< render type primary screen head */
-
+ struct list_head render_minor_list;
struct drm_mode_config mode_config; /**< Current mode config */
/** \name GEM information */
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 9595c2c..fc87b31 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -849,6 +849,7 @@ extern char *drm_get_dvi_i_select_name(int val);
extern char *drm_get_tv_subconnector_name(int val);
extern char *drm_get_tv_select_name(int val);
extern void drm_fb_release(struct drm_file *file_priv);
+extern int drm_mode_group_init(struct drm_device *dev, struct drm_mode_group *group);
extern int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_mode_group *group);
extern struct edid *drm_get_edid(struct drm_connector *connector,
struct i2c_adapter *adapter);
--
1.7.8.5
More information about the dri-devel
mailing list