* [PATCH 01/44] drm: Export drm_dev_init() for subclassing
[not found] <1465993109-19523-1-git-send-email-chris@chris-wilson.co.uk>
@ 2016-06-15 12:17 ` Chris Wilson
2016-06-15 12:17 ` [PATCH 02/44] drm: Add a callback from connector registering Chris Wilson
` (11 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Chris Wilson @ 2016-06-15 12:17 UTC (permalink / raw)
To: intel-gfx; +Cc: Daniel Vetter, Dave Airlie, dri-devel
In order to allow drivers to pack their privates and drm_device into one
struct (e.g. for subclassing), export the initialisation routines for
struct drm_device.
v2: Missed return ret. That error path had only one job to do!
v3: Cross-referencing drm_dev_init/drm_dev_alloc in kerneldoc, fix
missed error code for goto err_minors.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: dri-devel@lists.freedesktop.org
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/gpu/drm/drm_drv.c | 72 +++++++++++++++++++++++++++++++++++++----------
include/drm/drmP.h | 3 ++
2 files changed, 60 insertions(+), 15 deletions(-)
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index 8b2582aeaab6..d5c458b1a3b2 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -549,11 +549,12 @@ static void drm_fs_inode_free(struct inode *inode)
}
/**
- * drm_dev_alloc - Allocate new DRM device
- * @driver: DRM driver to allocate device for
+ * drm_dev_init - Initialise new DRM device
+ * @dev: DRM device
+ * @driver: DRM driver
* @parent: Parent device object
*
- * Allocate and initialize a new DRM device. No device registration is done.
+ * Initialize a new DRM device. No device registration is done.
* Call drm_dev_register() to advertice the device to user space and register it
* with other core subsystems. This should be done last in the device
* initialization sequence to make sure userspace can't access an inconsistent
@@ -564,19 +565,18 @@ static void drm_fs_inode_free(struct inode *inode)
*
* Note that for purely virtual devices @parent can be NULL.
*
+ * Drivers that do not want to allocate their own device struct
+ * embedding struct &drm_device can call drm_dev_alloc() instead.
+ *
* RETURNS:
- * Pointer to new DRM device, or NULL if out of memory.
+ * 0 on success, or error code on failure.
*/
-struct drm_device *drm_dev_alloc(struct drm_driver *driver,
- struct device *parent)
+int drm_dev_init(struct drm_device *dev,
+ struct drm_driver *driver,
+ struct device *parent)
{
- struct drm_device *dev;
int ret;
- dev = kzalloc(sizeof(*dev), GFP_KERNEL);
- if (!dev)
- return NULL;
-
kref_init(&dev->ref);
dev->dev = parent;
dev->driver = driver;
@@ -617,7 +617,8 @@ struct drm_device *drm_dev_alloc(struct drm_driver *driver,
if (ret)
goto err_minors;
- if (drm_ht_create(&dev->map_hash, 12))
+ ret = drm_ht_create(&dev->map_hash, 12);
+ if (ret)
goto err_minors;
drm_legacy_ctxbitmap_init(dev);
@@ -636,7 +637,7 @@ struct drm_device *drm_dev_alloc(struct drm_driver *driver,
goto err_setunique;
}
- return dev;
+ return 0;
err_setunique:
if (drm_core_check_feature(dev, DRIVER_GEM))
@@ -651,8 +652,49 @@ err_minors:
drm_fs_inode_free(dev->anon_inode);
err_free:
mutex_destroy(&dev->master_mutex);
- kfree(dev);
- return NULL;
+ return ret;
+}
+EXPORT_SYMBOL(drm_dev_init);
+
+/**
+ * drm_dev_alloc - Allocate new DRM device
+ * @driver: DRM driver to allocate device for
+ * @parent: Parent device object
+ *
+ * Allocate and initialize a new DRM device. No device registration is done.
+ * Call drm_dev_register() to advertice the device to user space and register it
+ * with other core subsystems. This should be done last in the device
+ * initialization sequence to make sure userspace can't access an inconsistent
+ * state.
+ *
+ * The initial ref-count of the object is 1. Use drm_dev_ref() and
+ * drm_dev_unref() to take and drop further ref-counts.
+ *
+ * Note that for purely virtual devices @parent can be NULL.
+ *
+ * Drivers that wish to subclass or embed struct &drm_device into their
+ * own struct should look at using drm_dev_init() instead.
+ *
+ * RETURNS:
+ * Pointer to new DRM device, or NULL if out of memory.
+ */
+struct drm_device *drm_dev_alloc(struct drm_driver *driver,
+ struct device *parent)
+{
+ struct drm_device *dev;
+ int ret;
+
+ dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+ if (!dev)
+ return NULL;
+
+ ret = drm_dev_init(dev, driver, parent);
+ if (ret) {
+ kfree(dev);
+ return NULL;
+ }
+
+ return dev;
}
EXPORT_SYMBOL(drm_dev_alloc);
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 04310cb08111..057b6ccdbe8e 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -1070,6 +1070,9 @@ extern void drm_sysfs_hotplug_event(struct drm_device *dev);
struct drm_device *drm_dev_alloc(struct drm_driver *driver,
struct device *parent);
+int drm_dev_init(struct drm_device *dev,
+ struct drm_driver *driver,
+ struct device *parent);
void drm_dev_ref(struct drm_device *dev);
void drm_dev_unref(struct drm_device *dev);
int drm_dev_register(struct drm_device *dev, unsigned long flags);
--
2.8.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 02/44] drm: Add a callback from connector registering
[not found] <1465993109-19523-1-git-send-email-chris@chris-wilson.co.uk>
2016-06-15 12:17 ` [PATCH 01/44] drm: Export drm_dev_init() for subclassing Chris Wilson
@ 2016-06-15 12:17 ` Chris Wilson
2016-06-17 7:41 ` Daniel Vetter
2016-06-15 12:17 ` [PATCH 03/44] drm: Make drm_connector_register() safe against multiple calls Chris Wilson
` (10 subsequent siblings)
12 siblings, 1 reply; 15+ messages in thread
From: Chris Wilson @ 2016-06-15 12:17 UTC (permalink / raw)
To: intel-gfx; +Cc: Daniel Vetter, Dave Airlie, dri-devel
If a driver wants to more precisely control its initialisation and in
particular, defer registering its interfaces with userspace until after
everything is setup, it also needs to defer registering the connectors.
As some devices need more work during registration, add a callback so
that drivers can do additional work if required for a connector.
Correspondingly, we also require an unregister callback.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: dri-devel@lists.freedesktop.org
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/gpu/drm/drm_crtc.c | 18 ++++++++++++++++--
include/drm/drm_crtc.h | 28 ++++++++++++++++++++++++++++
2 files changed, 44 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 4ec35f9e6de5..23dfec41decb 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -990,13 +990,24 @@ int drm_connector_register(struct drm_connector *connector)
ret = drm_debugfs_connector_add(connector);
if (ret) {
- drm_sysfs_connector_remove(connector);
- return ret;
+ goto err_sysfs;
+ }
+
+ if (connector->funcs->late_register) {
+ ret = connector->funcs->late_register(connector);
+ if (ret)
+ goto err_debugfs;
}
drm_mode_object_register(connector->dev, &connector->base);
return 0;
+
+err_debugfs:
+ drm_debugfs_connector_remove(connector);
+err_sysfs:
+ drm_sysfs_connector_remove(connector);
+ return ret;
}
EXPORT_SYMBOL(drm_connector_register);
@@ -1008,6 +1019,9 @@ EXPORT_SYMBOL(drm_connector_register);
*/
void drm_connector_unregister(struct drm_connector *connector)
{
+ if (connector->funcs->early_unregister)
+ connector->funcs->early_unregister(connector);
+
drm_sysfs_connector_remove(connector);
drm_debugfs_connector_remove(connector);
}
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 914baa8c161d..0c35b4f73e4c 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -957,6 +957,34 @@ struct drm_connector_funcs {
uint64_t val);
/**
+ * @late_register:
+ *
+ * This optional hook can be used to register additional userspace
+ * interfaces attached to the connector, light backlight control, i2c,
+ * DP aux or similar interfaces. It is called late in the driver load
+ * sequence from drm_connector_register() when registering all the
+ * core drm connector interfaces. Everything added from this callback
+ * should be unregistered in the early_unregister callback.
+ *
+ * Returns:
+ *
+ * 0 on success, or a negative error code on failure.
+ *
+ */
+ int (*late_register)(struct drm_connector *connector);
+
+ /**
+ * @early_unregister:
+ *
+ * This optional hook should be used to unregister the additional
+ * userspace interfaces attached to the connector from
+ * late_unregister(). It is called from drm_connector_unregister(),
+ * early in the driver unload sequence to disable userspace access
+ * before data structures are torndown.
+ */
+ void (*early_unregister)(struct drm_connector *connector);
+
+ /**
* @destroy:
*
* Clean up connector resources. This is called at driver unload time
--
2.8.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 03/44] drm: Make drm_connector_register() safe against multiple calls
[not found] <1465993109-19523-1-git-send-email-chris@chris-wilson.co.uk>
2016-06-15 12:17 ` [PATCH 01/44] drm: Export drm_dev_init() for subclassing Chris Wilson
2016-06-15 12:17 ` [PATCH 02/44] drm: Add a callback from connector registering Chris Wilson
@ 2016-06-15 12:17 ` Chris Wilson
2016-06-15 12:17 ` [PATCH 04/44] drm: Automatically unregister the connector during cleanup Chris Wilson
` (9 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Chris Wilson @ 2016-06-15 12:17 UTC (permalink / raw)
To: intel-gfx; +Cc: Daniel Vetter, Dave Airlie, dri-devel
Protect against drivers that may try to register the connector more
than once, or who try to unregister it multiple times.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Dave Airlie <airlied@redhat.com>
Cc: dri-devel@lists.freedesktop.org
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/gpu/drm/drm_crtc.c | 9 +++++++++
include/drm/drm_crtc.h | 2 ++
2 files changed, 11 insertions(+)
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 23dfec41decb..ea5ec641eacc 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -984,6 +984,9 @@ int drm_connector_register(struct drm_connector *connector)
{
int ret;
+ if (connector->registered)
+ return 0;
+
ret = drm_sysfs_connector_add(connector);
if (ret)
return ret;
@@ -1001,6 +1004,7 @@ int drm_connector_register(struct drm_connector *connector)
drm_mode_object_register(connector->dev, &connector->base);
+ connector->registered = true;
return 0;
err_debugfs:
@@ -1019,11 +1023,16 @@ EXPORT_SYMBOL(drm_connector_register);
*/
void drm_connector_unregister(struct drm_connector *connector)
{
+ if (!connector->registered)
+ return;
+
if (connector->funcs->early_unregister)
connector->funcs->early_unregister(connector);
drm_sysfs_connector_remove(connector);
drm_debugfs_connector_remove(connector);
+
+ connector->registered = false;
}
EXPORT_SYMBOL(drm_connector_unregister);
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 0c35b4f73e4c..e38b88696ff0 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -1194,6 +1194,7 @@ struct drm_encoder {
* @interlace_allowed: can this connector handle interlaced modes?
* @doublescan_allowed: can this connector handle doublescan?
* @stereo_allowed: can this connector handle stereo modes?
+ * @registered: is this connector exposed (registered) with userspace?
* @modes: modes available on this connector (from fill_modes() + user)
* @status: one of the drm_connector_status enums (connected, not, or unknown)
* @probed_modes: list of modes derived directly from the display
@@ -1250,6 +1251,7 @@ struct drm_connector {
bool interlace_allowed;
bool doublescan_allowed;
bool stereo_allowed;
+ bool registered;
struct list_head modes; /* list of modes on this connector */
enum drm_connector_status status;
--
2.8.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 04/44] drm: Automatically unregister the connector during cleanup
[not found] <1465993109-19523-1-git-send-email-chris@chris-wilson.co.uk>
` (2 preceding siblings ...)
2016-06-15 12:17 ` [PATCH 03/44] drm: Make drm_connector_register() safe against multiple calls Chris Wilson
@ 2016-06-15 12:17 ` Chris Wilson
2016-06-17 7:44 ` Daniel Vetter
2016-06-15 12:17 ` [PATCH 05/44] drm: Automatically register/unregister all connectors Chris Wilson
` (8 subsequent siblings)
12 siblings, 1 reply; 15+ messages in thread
From: Chris Wilson @ 2016-06-15 12:17 UTC (permalink / raw)
To: intel-gfx; +Cc: Daniel Vetter, Dave Airlie, dri-devel
As we now can call drm_connector_unregister() multiple times, provide a
failsafe unregister for a connector when cleaning it up.
v2: Add a WARN to catch any connectors that are still visible to
userspace when we come to destoy them.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Dave Airlie <airlied@redhat.com>
Cc: dri-devel@lists.freedesktop.org
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
drivers/gpu/drm/drm_crtc.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index ea5ec641eacc..316dea9bea08 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -938,6 +938,12 @@ void drm_connector_cleanup(struct drm_connector *connector)
struct drm_device *dev = connector->dev;
struct drm_display_mode *mode, *t;
+ /* The connector should have been removed from userspace long before
+ * it is finally destroyed.
+ */
+ if (WARN_ON(connector->registered))
+ drm_connector_unregister(connector);
+
if (connector->tile_group) {
drm_mode_put_tile_group(dev, connector->tile_group);
connector->tile_group = NULL;
--
2.8.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 05/44] drm: Automatically register/unregister all connectors
[not found] <1465993109-19523-1-git-send-email-chris@chris-wilson.co.uk>
` (3 preceding siblings ...)
2016-06-15 12:17 ` [PATCH 04/44] drm: Automatically unregister the connector during cleanup Chris Wilson
@ 2016-06-15 12:17 ` Chris Wilson
2016-06-15 12:17 ` [PATCH 06/44] drm/arc: Remove redundant calls to drm_connector_register_all() Chris Wilson
` (7 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Chris Wilson @ 2016-06-15 12:17 UTC (permalink / raw)
To: intel-gfx; +Cc: Daniel Vetter
As the drm_connector is now safe for multiple calls to
register/unregister, automatically perform a registration on all known
connectors drm drv_register (and unregister from drm_drv_unregister).
Drivers can still call drm_connector_register() and
drm_connector_unregister() individually, or defer as required.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
---
drivers/gpu/drm/drm_crtc.c | 6 +++---
drivers/gpu/drm/drm_drv.c | 10 +++++-----
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 316dea9bea08..e7c862bd2f19 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -1047,9 +1047,9 @@ EXPORT_SYMBOL(drm_connector_unregister);
* @dev: drm device
*
* This function registers all connectors in sysfs and other places so that
- * userspace can start to access them. Drivers can call it after calling
- * drm_dev_register() to complete the device registration, if they don't call
- * drm_connector_register() on each connector individually.
+ * userspace can start to access them. drm_connector_register_all() is called
+ * automatically from drm_dev_register() to complete the device registration,
+ * if they don't call drm_connector_register() on each connector individually.
*
* When a device is unplugged and should be removed from userspace access,
* call drm_connector_unregister_all(), which is the inverse of this
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
index d5c458b1a3b2..13b4c9c0fe36 100644
--- a/drivers/gpu/drm/drm_drv.c
+++ b/drivers/gpu/drm/drm_drv.c
@@ -758,11 +758,7 @@ EXPORT_SYMBOL(drm_dev_unref);
*
* Register the DRM device @dev with the system, advertise device to user-space
* and start normal device operation. @dev must be allocated via drm_dev_alloc()
- * previously. Right after drm_dev_register() the driver should call
- * drm_connector_register_all() to register all connectors in sysfs. This is
- * a separate call for backward compatibility with drivers still using
- * the deprecated ->load() callback, where connectors are registered from within
- * the ->load() callback.
+ * previously.
*
* Never call this twice on any device!
*
@@ -799,6 +795,8 @@ int drm_dev_register(struct drm_device *dev, unsigned long flags)
goto err_minors;
}
+ drm_connector_register_all(dev);
+
ret = 0;
goto out_unlock;
@@ -829,6 +827,8 @@ void drm_dev_unregister(struct drm_device *dev)
drm_lastclose(dev);
+ drm_connector_unregister_all(dev);
+
if (dev->driver->unload)
dev->driver->unload(dev);
--
2.8.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 06/44] drm/arc: Remove redundant calls to drm_connector_register_all()
[not found] <1465993109-19523-1-git-send-email-chris@chris-wilson.co.uk>
` (4 preceding siblings ...)
2016-06-15 12:17 ` [PATCH 05/44] drm: Automatically register/unregister all connectors Chris Wilson
@ 2016-06-15 12:17 ` Chris Wilson
2016-06-15 12:17 ` [PATCH 07/44] drm/atmel-hlcdc: " Chris Wilson
` (6 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Chris Wilson @ 2016-06-15 12:17 UTC (permalink / raw)
To: intel-gfx; +Cc: Daniel Vetter, Alexey Brodkin, dri-devel
Up to now, the recommendation was for drivers to call drm_dev_register()
followed by drm_connector_register_all(). Now that
drm_connector_register() is safe against multiple invocations, we can
move drm_connector_register_all() to drm_dev_register() and not suffer
from any backwards compatibility issues with drivers not following the
more rigorous init ordering.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Alexey Brodkin <abrodkin@synopsys.com>
Cc: David Airlie <airlied@linux.ie>
Cc: dri-devel@lists.freedesktop.org
---
drivers/gpu/drm/arc/arcpgu_drv.c | 8 --------
1 file changed, 8 deletions(-)
diff --git a/drivers/gpu/drm/arc/arcpgu_drv.c b/drivers/gpu/drm/arc/arcpgu_drv.c
index a92e533531c3..95d0cb94e68a 100644
--- a/drivers/gpu/drm/arc/arcpgu_drv.c
+++ b/drivers/gpu/drm/arc/arcpgu_drv.c
@@ -210,15 +210,8 @@ static int arcpgu_probe(struct platform_device *pdev)
if (ret)
goto err_unload;
- ret = drm_connector_register_all(drm);
- if (ret)
- goto err_unregister;
-
return 0;
-err_unregister:
- drm_dev_unregister(drm);
-
err_unload:
arcpgu_unload(drm);
@@ -232,7 +225,6 @@ static int arcpgu_remove(struct platform_device *pdev)
{
struct drm_device *drm = platform_get_drvdata(pdev);
- drm_connector_unregister_all(drm);
drm_dev_unregister(drm);
arcpgu_unload(drm);
drm_dev_unref(drm);
--
2.8.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 07/44] drm/atmel-hlcdc: Remove redundant calls to drm_connector_register_all()
[not found] <1465993109-19523-1-git-send-email-chris@chris-wilson.co.uk>
` (5 preceding siblings ...)
2016-06-15 12:17 ` [PATCH 06/44] drm/arc: Remove redundant calls to drm_connector_register_all() Chris Wilson
@ 2016-06-15 12:17 ` Chris Wilson
2016-06-15 12:17 ` [PATCH 08/44] drm/hisilicon: " Chris Wilson
` (5 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Chris Wilson @ 2016-06-15 12:17 UTC (permalink / raw)
To: intel-gfx; +Cc: David Airlie, Daniel Vetter, Boris Brezillon, dri-devel
Up to now, the recommendation was for drivers to call drm_dev_register()
followed by drm_connector_register_all(). Now that
drm_connector_register() is safe against multiple invocations, we can
move drm_connector_register_all() to drm_dev_register() and not suffer
from any backwards compatibility issues with drivers not following the
more rigorous init ordering.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Boris Brezillon <boris.brezillon@free-electrons.com>
Cc: David Airlie <airlied@linux.ie>
Cc: dri-devel@lists.freedesktop.org
---
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 7 -------
1 file changed, 7 deletions(-)
diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
index 9ecf16c7911d..99c4af697c8a 100644
--- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
+++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
@@ -815,15 +815,8 @@ static int atmel_hlcdc_dc_drm_probe(struct platform_device *pdev)
if (ret)
goto err_unload;
- ret = drm_connector_register_all(ddev);
- if (ret)
- goto err_unregister;
-
return 0;
-err_unregister:
- drm_dev_unregister(ddev);
-
err_unload:
atmel_hlcdc_dc_unload(ddev);
--
2.8.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 08/44] drm/hisilicon: Remove redundant calls to drm_connector_register_all()
[not found] <1465993109-19523-1-git-send-email-chris@chris-wilson.co.uk>
` (6 preceding siblings ...)
2016-06-15 12:17 ` [PATCH 07/44] drm/atmel-hlcdc: " Chris Wilson
@ 2016-06-15 12:17 ` Chris Wilson
2016-06-15 12:17 ` [PATCH 09/44] drm/mediatek: " Chris Wilson
` (4 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Chris Wilson @ 2016-06-15 12:17 UTC (permalink / raw)
To: intel-gfx
Cc: David Airlie, Daniel Vetter, dri-devel, Xinliang Liu, Xinwei Kong,
Chen Feng
Up to now, the recommendation was for drivers to call drm_dev_register()
followed by drm_connector_register_all(). Now that
drm_connector_register() is safe against multiple invocations, we can
move drm_connector_register_all() to drm_dev_register() and not suffer
from any backwards compatibility issues with drivers not following the
more rigorous init ordering.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Xinliang Liu <z.liuxinliang@hisilicon.com>
Cc: Xinwei Kong <kong.kongxinwei@hisilicon.com>
Cc: Chen Feng <puck.chen@hisilicon.com>
Cc: David Airlie <airlied@linux.ie>
Cc: dri-devel@lists.freedesktop.org
---
drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c | 8 --------
1 file changed, 8 deletions(-)
diff --git a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
index 193657259ee9..ef2c32ec1616 100644
--- a/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
+++ b/drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
@@ -221,19 +221,12 @@ static int kirin_drm_bind(struct device *dev)
if (ret)
goto err_kms_cleanup;
- /* connectors should be registered after drm device register */
- ret = drm_connector_register_all(drm_dev);
- if (ret)
- goto err_drm_dev_unregister;
-
DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n",
driver->name, driver->major, driver->minor, driver->patchlevel,
driver->date, drm_dev->primary->index);
return 0;
-err_drm_dev_unregister:
- drm_dev_unregister(drm_dev);
err_kms_cleanup:
kirin_drm_kms_cleanup(drm_dev);
err_drm_dev_unref:
@@ -246,7 +239,6 @@ static void kirin_drm_unbind(struct device *dev)
{
struct drm_device *drm_dev = dev_get_drvdata(dev);
- drm_connector_unregister_all(drm_dev);
drm_dev_unregister(drm_dev);
kirin_drm_kms_cleanup(drm_dev);
drm_dev_unref(drm_dev);
--
2.8.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 09/44] drm/mediatek: Remove redundant calls to drm_connector_register_all()
[not found] <1465993109-19523-1-git-send-email-chris@chris-wilson.co.uk>
` (7 preceding siblings ...)
2016-06-15 12:17 ` [PATCH 08/44] drm/hisilicon: " Chris Wilson
@ 2016-06-15 12:17 ` Chris Wilson
2016-06-15 12:17 ` [PATCH 10/44] drm/msm: " Chris Wilson
` (3 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Chris Wilson @ 2016-06-15 12:17 UTC (permalink / raw)
To: intel-gfx
Cc: David Airlie, Daniel Vetter, dri-devel, linux-mediatek,
Matthias Brugger, linux-arm-kernel
Up to now, the recommendation was for drivers to call drm_dev_register()
followed by drm_connector_register_all(). Now that
drm_connector_register() is safe against multiple invocations, we can
move drm_connector_register_all() to drm_dev_register() and not suffer
from any backwards compatibility issues with drivers not following the
more rigorous init ordering.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Matthias Brugger <matthias.bgg@gmail.com>
Cc: David Airlie <airlied@linux.ie>
Cc: dri-devel@lists.freedesktop.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-mediatek@lists.infradead.org
---
drivers/gpu/drm/mediatek/mtk_drm_drv.c | 7 -------
1 file changed, 7 deletions(-)
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
index c33bf98c5d5e..7ab91f4a200f 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
@@ -293,14 +293,8 @@ static int mtk_drm_bind(struct device *dev)
if (ret < 0)
goto err_deinit;
- ret = drm_connector_register_all(drm);
- if (ret < 0)
- goto err_unregister;
-
return 0;
-err_unregister:
- drm_dev_unregister(drm);
err_deinit:
mtk_drm_kms_deinit(drm);
err_free:
@@ -455,7 +449,6 @@ static int mtk_drm_remove(struct platform_device *pdev)
struct drm_device *drm = private->drm;
int i;
- drm_connector_unregister_all(drm);
drm_dev_unregister(drm);
mtk_drm_kms_deinit(drm);
drm_dev_unref(drm);
--
2.8.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 10/44] drm/msm: Remove redundant calls to drm_connector_register_all()
[not found] <1465993109-19523-1-git-send-email-chris@chris-wilson.co.uk>
` (8 preceding siblings ...)
2016-06-15 12:17 ` [PATCH 09/44] drm/mediatek: " Chris Wilson
@ 2016-06-15 12:17 ` Chris Wilson
2016-06-15 12:17 ` [PATCH 11/44] drm/rcar-du: " Chris Wilson
` (2 subsequent siblings)
12 siblings, 0 replies; 15+ messages in thread
From: Chris Wilson @ 2016-06-15 12:17 UTC (permalink / raw)
To: intel-gfx
Cc: Daniel Vetter, Chris Wilson, Rob Clark, David Airlie, dri-devel,
linux-arm-msm, freedreno
Up to now, the recommendation was for drivers to call drm_dev_register()
followed by drm_connector_register_all(). Now that
drm_connector_register() is safe against multiple invocations, we can
move drm_connector_register_all() to drm_dev_register() and not suffer
from any backwards compatibility issues with drivers not following the
more rigorous init ordering.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Rob Clark <robdclark@gmail.com>
Cc: David Airlie <airlied@linux.ie>
Cc: dri-devel@lists.freedesktop.org
Cc: linux-arm-msm@vger.kernel.org
Cc: freedreno@lists.freedesktop.org
---
drivers/gpu/drm/msm/msm_drv.c | 8 --------
1 file changed, 8 deletions(-)
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index 9c654092ef78..568fcc328f27 100644
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -197,8 +197,6 @@ static int msm_drm_uninit(struct device *dev)
drm_kms_helper_poll_fini(ddev);
- drm_connector_unregister_all(ddev);
-
drm_dev_unregister(ddev);
#ifdef CONFIG_DRM_FBDEV_EMULATION
@@ -431,12 +429,6 @@ static int msm_drm_init(struct device *dev, struct drm_driver *drv)
if (ret)
goto fail;
- ret = drm_connector_register_all(ddev);
- if (ret) {
- dev_err(dev, "failed to register connectors\n");
- goto fail;
- }
-
drm_mode_config_reset(ddev);
#ifdef CONFIG_DRM_FBDEV_EMULATION
--
2.8.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 11/44] drm/rcar-du: Remove redundant calls to drm_connector_register_all()
[not found] <1465993109-19523-1-git-send-email-chris@chris-wilson.co.uk>
` (9 preceding siblings ...)
2016-06-15 12:17 ` [PATCH 10/44] drm/msm: " Chris Wilson
@ 2016-06-15 12:17 ` Chris Wilson
2016-06-15 12:17 ` [PATCH 12/44] drm: Pass the drm_dp_aux->hw_mutex to i2c for its locking Chris Wilson
2016-06-15 12:17 ` [PATCH 13/44] drm: Minimally initialise drm_dp_aux Chris Wilson
12 siblings, 0 replies; 15+ messages in thread
From: Chris Wilson @ 2016-06-15 12:17 UTC (permalink / raw)
To: intel-gfx
Cc: Daniel Vetter, Chris Wilson, Laurent Pinchart, David Airlie,
dri-devel, linux-renesas-soc
Up to now, the recommendation was for drivers to call drm_dev_register()
followed by drm_connector_register_all(). Now that
drm_connector_register() is safe against multiple invocations, we can
move drm_connector_register_all() to drm_dev_register() and not suffer
from any backwards compatibility issues with drivers not following the
more rigorous init ordering.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: David Airlie <airlied@linux.ie>
Cc: dri-devel@lists.freedesktop.org
Cc: linux-renesas-soc@vger.kernel.org
---
drivers/gpu/drm/rcar-du/rcar_du_drv.c | 5 -----
1 file changed, 5 deletions(-)
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_drv.c b/drivers/gpu/drm/rcar-du/rcar_du_drv.c
index 48ec4b6e8b26..36d390093c92 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_drv.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_drv.c
@@ -278,7 +278,6 @@ static int rcar_du_remove(struct platform_device *pdev)
struct rcar_du_device *rcdu = platform_get_drvdata(pdev);
struct drm_device *ddev = rcdu->ddev;
- drm_connector_unregister_all(ddev);
drm_dev_unregister(ddev);
if (rcdu->fbdev)
@@ -360,10 +359,6 @@ static int rcar_du_probe(struct platform_device *pdev)
if (ret)
goto error;
- ret = drm_connector_register_all(ddev);
- if (ret < 0)
- goto error;
-
DRM_INFO("Device %s probed\n", dev_name(&pdev->dev));
return 0;
--
2.8.1
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 12/44] drm: Pass the drm_dp_aux->hw_mutex to i2c for its locking
[not found] <1465993109-19523-1-git-send-email-chris@chris-wilson.co.uk>
` (10 preceding siblings ...)
2016-06-15 12:17 ` [PATCH 11/44] drm/rcar-du: " Chris Wilson
@ 2016-06-15 12:17 ` Chris Wilson
2016-06-15 12:17 ` [PATCH 13/44] drm: Minimally initialise drm_dp_aux Chris Wilson
12 siblings, 0 replies; 15+ messages in thread
From: Chris Wilson @ 2016-06-15 12:17 UTC (permalink / raw)
To: intel-gfx; +Cc: Daniel Vetter, dri-devel, Dave Airlie
Rather than have both drm_dp_aux lock within its transfer, and i2c to
lock around the transfer, use the same lock by filling in the locking
callbacks that i2c wants to use. We require our own hw_mutex as we
bypass i2c_transfer for drm_dp_dpcd_access().
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Rafael Antognolli <rafael.antognolli@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: dri-devel@lists.freedesktop.org
---
drivers/gpu/drm/drm_dp_helper.c | 28 ++++++++++++++++++++++++----
1 file changed, 24 insertions(+), 4 deletions(-)
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
index eeaf5a7c3aa7..4b088afa21b2 100644
--- a/drivers/gpu/drm/drm_dp_helper.c
+++ b/drivers/gpu/drm/drm_dp_helper.c
@@ -708,8 +708,6 @@ static int drm_dp_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs,
memset(&msg, 0, sizeof(msg));
- mutex_lock(&aux->hw_mutex);
-
for (i = 0; i < num; i++) {
msg.address = msgs[i].addr;
drm_dp_i2c_msg_set_request(&msg, &msgs[i]);
@@ -764,8 +762,6 @@ static int drm_dp_i2c_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs,
msg.size = 0;
(void)drm_dp_i2c_do_msg(aux, &msg);
- mutex_unlock(&aux->hw_mutex);
-
return err;
}
@@ -774,6 +770,26 @@ static const struct i2c_algorithm drm_dp_i2c_algo = {
.master_xfer = drm_dp_i2c_xfer,
};
+static struct drm_dp_aux *i2c_to_aux(struct i2c_adapter *i2c)
+{
+ return container_of(i2c, struct drm_dp_aux, ddc);
+}
+
+static void lock_bus(struct i2c_adapter *i2c, unsigned int flags)
+{
+ mutex_lock(&i2c_to_aux(i2c)->hw_mutex);
+}
+
+static int trylock_bus(struct i2c_adapter *i2c, unsigned int flags)
+{
+ return mutex_trylock(&i2c_to_aux(i2c)->hw_mutex);
+}
+
+static void unlock_bus(struct i2c_adapter *i2c, unsigned int flags)
+{
+ mutex_unlock(&i2c_to_aux(i2c)->hw_mutex);
+}
+
/**
* drm_dp_aux_register() - initialise and register aux channel
* @aux: DisplayPort AUX channel
@@ -790,6 +806,10 @@ int drm_dp_aux_register(struct drm_dp_aux *aux)
aux->ddc.algo_data = aux;
aux->ddc.retries = 3;
+ aux->ddc.lock_bus = lock_bus;
+ aux->ddc.trylock_bus = trylock_bus;
+ aux->ddc.unlock_bus = unlock_bus;
+
aux->ddc.class = I2C_CLASS_DDC;
aux->ddc.owner = THIS_MODULE;
aux->ddc.dev.parent = aux->dev;
--
2.8.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [PATCH 13/44] drm: Minimally initialise drm_dp_aux
[not found] <1465993109-19523-1-git-send-email-chris@chris-wilson.co.uk>
` (11 preceding siblings ...)
2016-06-15 12:17 ` [PATCH 12/44] drm: Pass the drm_dp_aux->hw_mutex to i2c for its locking Chris Wilson
@ 2016-06-15 12:17 ` Chris Wilson
12 siblings, 0 replies; 15+ messages in thread
From: Chris Wilson @ 2016-06-15 12:17 UTC (permalink / raw)
To: intel-gfx; +Cc: Daniel Vetter, dri-devel, Dave Airlie
When trying to split up the initialisation phase and the registration
phase, one immediate problem encountered is trying to use our own i2c
devices before registration with userspace (to read EDID during device
discovery). drm_dp_aux in particular only offers an interface for setting
up the device *after* we have exposed the connector via sysfs. In order
to break the chicken-and-egg problem, export drm_dp_aux_init() to
minimally prepare the i2c device for internal use before
drm_connector_register().
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Dave Airlie <airlied@redhat.com>
Cc: Rafael Antognolli <rafael.antognolli@intel.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: dri-devel@lists.freedesktop.org
---
drivers/gpu/drm/drm_dp_helper.c | 26 +++++++++++++++++++++-----
include/drm/drm_dp_helper.h | 1 +
2 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c
index 4b088afa21b2..9b4ec65e1de6 100644
--- a/drivers/gpu/drm/drm_dp_helper.c
+++ b/drivers/gpu/drm/drm_dp_helper.c
@@ -791,15 +791,16 @@ static void unlock_bus(struct i2c_adapter *i2c, unsigned int flags)
}
/**
- * drm_dp_aux_register() - initialise and register aux channel
+ * drm_dp_aux_init() - minimally initialise an aux channel
* @aux: DisplayPort AUX channel
*
- * Returns 0 on success or a negative error code on failure.
+ * If you need to use the drm_dp_aux's i2c adapter prior to registering it
+ * with the outside world, call drm_dp_aux_init() first. You must still
+ * call drm_dp_aux_register() once the connector has been registered to
+ * allow userspace access to the auxiliary DP channel.
*/
-int drm_dp_aux_register(struct drm_dp_aux *aux)
+void drm_dp_aux_init(struct drm_dp_aux *aux)
{
- int ret;
-
mutex_init(&aux->hw_mutex);
aux->ddc.algo = &drm_dp_i2c_algo;
@@ -809,6 +810,21 @@ int drm_dp_aux_register(struct drm_dp_aux *aux)
aux->ddc.lock_bus = lock_bus;
aux->ddc.trylock_bus = trylock_bus;
aux->ddc.unlock_bus = unlock_bus;
+}
+EXPORT_SYMBOL(drm_dp_aux_init);
+
+/**
+ * drm_dp_aux_register() - initialise and register aux channel
+ * @aux: DisplayPort AUX channel
+ *
+ * Returns 0 on success or a negative error code on failure.
+ */
+int drm_dp_aux_register(struct drm_dp_aux *aux)
+{
+ int ret;
+
+ if (!aux->ddc.algo)
+ drm_dp_aux_init(aux);
aux->ddc.class = I2C_CLASS_DDC;
aux->ddc.owner = THIS_MODULE;
diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h
index 5a848e734422..4d85cf2874af 100644
--- a/include/drm/drm_dp_helper.h
+++ b/include/drm/drm_dp_helper.h
@@ -805,6 +805,7 @@ int drm_dp_link_power_up(struct drm_dp_aux *aux, struct drm_dp_link *link);
int drm_dp_link_power_down(struct drm_dp_aux *aux, struct drm_dp_link *link);
int drm_dp_link_configure(struct drm_dp_aux *aux, struct drm_dp_link *link);
+void drm_dp_aux_init(struct drm_dp_aux *aux);
int drm_dp_aux_register(struct drm_dp_aux *aux);
void drm_dp_aux_unregister(struct drm_dp_aux *aux);
--
2.8.1
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH 02/44] drm: Add a callback from connector registering
2016-06-15 12:17 ` [PATCH 02/44] drm: Add a callback from connector registering Chris Wilson
@ 2016-06-17 7:41 ` Daniel Vetter
0 siblings, 0 replies; 15+ messages in thread
From: Daniel Vetter @ 2016-06-17 7:41 UTC (permalink / raw)
To: Chris Wilson; +Cc: Daniel Vetter, intel-gfx, dri-devel, Dave Airlie
On Wed, Jun 15, 2016 at 01:17:47PM +0100, Chris Wilson wrote:
> If a driver wants to more precisely control its initialisation and in
> particular, defer registering its interfaces with userspace until after
> everything is setup, it also needs to defer registering the connectors.
> As some devices need more work during registration, add a callback so
> that drivers can do additional work if required for a connector.
>
> Correspondingly, we also require an unregister callback.
>
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Dave Airlie <airlied@redhat.com>
> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> Cc: dri-devel@lists.freedesktop.org
> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> ---
> drivers/gpu/drm/drm_crtc.c | 18 ++++++++++++++++--
> include/drm/drm_crtc.h | 28 ++++++++++++++++++++++++++++
> 2 files changed, 44 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index 4ec35f9e6de5..23dfec41decb 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -990,13 +990,24 @@ int drm_connector_register(struct drm_connector *connector)
>
> ret = drm_debugfs_connector_add(connector);
> if (ret) {
> - drm_sysfs_connector_remove(connector);
> - return ret;
> + goto err_sysfs;
> + }
> +
> + if (connector->funcs->late_register) {
> + ret = connector->funcs->late_register(connector);
> + if (ret)
> + goto err_debugfs;
> }
>
> drm_mode_object_register(connector->dev, &connector->base);
>
> return 0;
> +
> +err_debugfs:
> + drm_debugfs_connector_remove(connector);
> +err_sysfs:
> + drm_sysfs_connector_remove(connector);
> + return ret;
> }
> EXPORT_SYMBOL(drm_connector_register);
>
> @@ -1008,6 +1019,9 @@ EXPORT_SYMBOL(drm_connector_register);
> */
> void drm_connector_unregister(struct drm_connector *connector)
> {
> + if (connector->funcs->early_unregister)
> + connector->funcs->early_unregister(connector);
> +
> drm_sysfs_connector_remove(connector);
> drm_debugfs_connector_remove(connector);
> }
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index 914baa8c161d..0c35b4f73e4c 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -957,6 +957,34 @@ struct drm_connector_funcs {
> uint64_t val);
>
> /**
> + * @late_register:
> + *
> + * This optional hook can be used to register additional userspace
> + * interfaces attached to the connector, light backlight control, i2c,
> + * DP aux or similar interfaces. It is called late in the driver load
> + * sequence from drm_connector_register() when registering all the
> + * core drm connector interfaces. Everything added from this callback
> + * should be unregistered in the early_unregister callback.
> + *
> + * Returns:
> + *
> + * 0 on success, or a negative error code on failure.
> + *
I went ocd and removed this line here before applying.
-Daniel
> + */
> + int (*late_register)(struct drm_connector *connector);
> +
> + /**
> + * @early_unregister:
> + *
> + * This optional hook should be used to unregister the additional
> + * userspace interfaces attached to the connector from
> + * late_unregister(). It is called from drm_connector_unregister(),
> + * early in the driver unload sequence to disable userspace access
> + * before data structures are torndown.
> + */
> + void (*early_unregister)(struct drm_connector *connector);
> +
> + /**
> * @destroy:
> *
> * Clean up connector resources. This is called at driver unload time
> --
> 2.8.1
>
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 04/44] drm: Automatically unregister the connector during cleanup
2016-06-15 12:17 ` [PATCH 04/44] drm: Automatically unregister the connector during cleanup Chris Wilson
@ 2016-06-17 7:44 ` Daniel Vetter
0 siblings, 0 replies; 15+ messages in thread
From: Daniel Vetter @ 2016-06-17 7:44 UTC (permalink / raw)
To: Chris Wilson; +Cc: Daniel Vetter, intel-gfx, dri-devel, Dave Airlie
On Wed, Jun 15, 2016 at 01:17:49PM +0100, Chris Wilson wrote:
> As we now can call drm_connector_unregister() multiple times, provide a
> failsafe unregister for a connector when cleaning it up.
>
> v2: Add a WARN to catch any connectors that are still visible to
> userspace when we come to destoy them.
>
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Dave Airlie <airlied@redhat.com>
> Cc: dri-devel@lists.freedesktop.org
> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Ok, merged up to this one to drm-misc. Please resend the other core/driver
patches, preferrably as a stand-alone series.
Thanks, Daniel
> ---
> drivers/gpu/drm/drm_crtc.c | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index ea5ec641eacc..316dea9bea08 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -938,6 +938,12 @@ void drm_connector_cleanup(struct drm_connector *connector)
> struct drm_device *dev = connector->dev;
> struct drm_display_mode *mode, *t;
>
> + /* The connector should have been removed from userspace long before
> + * it is finally destroyed.
> + */
> + if (WARN_ON(connector->registered))
> + drm_connector_unregister(connector);
> +
> if (connector->tile_group) {
> drm_mode_put_tile_group(dev, connector->tile_group);
> connector->tile_group = NULL;
> --
> 2.8.1
>
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2016-06-17 7:44 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <1465993109-19523-1-git-send-email-chris@chris-wilson.co.uk>
2016-06-15 12:17 ` [PATCH 01/44] drm: Export drm_dev_init() for subclassing Chris Wilson
2016-06-15 12:17 ` [PATCH 02/44] drm: Add a callback from connector registering Chris Wilson
2016-06-17 7:41 ` Daniel Vetter
2016-06-15 12:17 ` [PATCH 03/44] drm: Make drm_connector_register() safe against multiple calls Chris Wilson
2016-06-15 12:17 ` [PATCH 04/44] drm: Automatically unregister the connector during cleanup Chris Wilson
2016-06-17 7:44 ` Daniel Vetter
2016-06-15 12:17 ` [PATCH 05/44] drm: Automatically register/unregister all connectors Chris Wilson
2016-06-15 12:17 ` [PATCH 06/44] drm/arc: Remove redundant calls to drm_connector_register_all() Chris Wilson
2016-06-15 12:17 ` [PATCH 07/44] drm/atmel-hlcdc: " Chris Wilson
2016-06-15 12:17 ` [PATCH 08/44] drm/hisilicon: " Chris Wilson
2016-06-15 12:17 ` [PATCH 09/44] drm/mediatek: " Chris Wilson
2016-06-15 12:17 ` [PATCH 10/44] drm/msm: " Chris Wilson
2016-06-15 12:17 ` [PATCH 11/44] drm/rcar-du: " Chris Wilson
2016-06-15 12:17 ` [PATCH 12/44] drm: Pass the drm_dp_aux->hw_mutex to i2c for its locking Chris Wilson
2016-06-15 12:17 ` [PATCH 13/44] drm: Minimally initialise drm_dp_aux Chris Wilson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox