drm: Move tile group code into drm_connector.c
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 14 Nov 2016 11:58:24 +0000 (12:58 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 15 Nov 2016 14:30:38 +0000 (15:30 +0100)
And also put the overview section into the KMS Properties part of the
docs, instead of randomly-placed within the helpers - this is part of
the uabi.

With this patch I think drm_crtc.[hc] is cleaned up and entirely
documented.

Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Documentation/gpu/drm-kms-helpers.rst
Documentation/gpu/drm-kms.rst
drivers/gpu/drm/drm_connector.c
drivers/gpu/drm/drm_crtc.c
include/drm/drm_connector.h
include/drm/drm_crtc.h

index bb4254d19cbb810c038922dac9dd7997cff02ea9..4ca77f675967e98f277d1f81d4f449eb88660b29 100644 (file)
@@ -261,14 +261,6 @@ Plane Helper Reference
 .. kernel-doc:: drivers/gpu/drm/drm_plane_helper.c
    :export:
 
-Tile group
-==========
-
-# FIXME: This should probably be moved into a property documentation section
-
-.. kernel-doc:: drivers/gpu/drm/drm_crtc.c
-   :doc: Tile group
-
 Auxiliary Modeset Helpers
 =========================
 
index a8ff2c87c0e9bed0e700b10ff5cf9f5e9dcc19b6..568f3c2b6e46eed7bf31fd22bfeeba0597bfbb1b 100644 (file)
@@ -281,6 +281,12 @@ Color Management Properties
 .. kernel-doc:: drivers/gpu/drm/drm_color_mgmt.c
    :export:
 
+Tile Group Property
+-------------------
+
+.. kernel-doc:: drivers/gpu/drm/drm_connector.c
+   :doc: Tile group
+
 Existing KMS Properties
 -----------------------
 
index 2db7fb510b6c941c2f252dc29591e4c51cd981c5..b5c6a8ee831eb18a4b4fc43d6abd46cf943778b2 100644 (file)
@@ -1121,3 +1121,107 @@ out_unlock:
        return ret;
 }
 
+
+/**
+ * DOC: Tile group
+ *
+ * Tile groups are used to represent tiled monitors with a unique integer
+ * identifier. Tiled monitors using DisplayID v1.3 have a unique 8-byte handle,
+ * we store this in a tile group, so we have a common identifier for all tiles
+ * in a monitor group. The property is called "TILE". Drivers can manage tile
+ * groups using drm_mode_create_tile_group(), drm_mode_put_tile_group() and
+ * drm_mode_get_tile_group(). But this is only needed for internal panels where
+ * the tile group information is exposed through a non-standard way.
+ */
+
+static void drm_tile_group_free(struct kref *kref)
+{
+       struct drm_tile_group *tg = container_of(kref, struct drm_tile_group, refcount);
+       struct drm_device *dev = tg->dev;
+       mutex_lock(&dev->mode_config.idr_mutex);
+       idr_remove(&dev->mode_config.tile_idr, tg->id);
+       mutex_unlock(&dev->mode_config.idr_mutex);
+       kfree(tg);
+}
+
+/**
+ * drm_mode_put_tile_group - drop a reference to a tile group.
+ * @dev: DRM device
+ * @tg: tile group to drop reference to.
+ *
+ * drop reference to tile group and free if 0.
+ */
+void drm_mode_put_tile_group(struct drm_device *dev,
+                            struct drm_tile_group *tg)
+{
+       kref_put(&tg->refcount, drm_tile_group_free);
+}
+EXPORT_SYMBOL(drm_mode_put_tile_group);
+
+/**
+ * drm_mode_get_tile_group - get a reference to an existing tile group
+ * @dev: DRM device
+ * @topology: 8-bytes unique per monitor.
+ *
+ * Use the unique bytes to get a reference to an existing tile group.
+ *
+ * RETURNS:
+ * tile group or NULL if not found.
+ */
+struct drm_tile_group *drm_mode_get_tile_group(struct drm_device *dev,
+                                              char topology[8])
+{
+       struct drm_tile_group *tg;
+       int id;
+       mutex_lock(&dev->mode_config.idr_mutex);
+       idr_for_each_entry(&dev->mode_config.tile_idr, tg, id) {
+               if (!memcmp(tg->group_data, topology, 8)) {
+                       if (!kref_get_unless_zero(&tg->refcount))
+                               tg = NULL;
+                       mutex_unlock(&dev->mode_config.idr_mutex);
+                       return tg;
+               }
+       }
+       mutex_unlock(&dev->mode_config.idr_mutex);
+       return NULL;
+}
+EXPORT_SYMBOL(drm_mode_get_tile_group);
+
+/**
+ * drm_mode_create_tile_group - create a tile group from a displayid description
+ * @dev: DRM device
+ * @topology: 8-bytes unique per monitor.
+ *
+ * Create a tile group for the unique monitor, and get a unique
+ * identifier for the tile group.
+ *
+ * RETURNS:
+ * new tile group or error.
+ */
+struct drm_tile_group *drm_mode_create_tile_group(struct drm_device *dev,
+                                                 char topology[8])
+{
+       struct drm_tile_group *tg;
+       int ret;
+
+       tg = kzalloc(sizeof(*tg), GFP_KERNEL);
+       if (!tg)
+               return ERR_PTR(-ENOMEM);
+
+       kref_init(&tg->refcount);
+       memcpy(tg->group_data, topology, 8);
+       tg->dev = dev;
+
+       mutex_lock(&dev->mode_config.idr_mutex);
+       ret = idr_alloc(&dev->mode_config.tile_idr, tg, 1, 0, GFP_KERNEL);
+       if (ret >= 0) {
+               tg->id = ret;
+       } else {
+               kfree(tg);
+               tg = ERR_PTR(ret);
+       }
+
+       mutex_unlock(&dev->mode_config.idr_mutex);
+       return tg;
+}
+EXPORT_SYMBOL(drm_mode_create_tile_group);
index 239b64c85098a744531ce567ff1b0722c6c432f4..159458b3c287ef937b6e261ffb91284fee562a27 100644 (file)
@@ -625,102 +625,3 @@ int drm_mode_crtc_set_obj_prop(struct drm_mode_object *obj,
 
        return ret;
 }
-
-/**
- * DOC: Tile group
- *
- * Tile groups are used to represent tiled monitors with a unique
- * integer identifier. Tiled monitors using DisplayID v1.3 have
- * a unique 8-byte handle, we store this in a tile group, so we
- * have a common identifier for all tiles in a monitor group.
- */
-static void drm_tile_group_free(struct kref *kref)
-{
-       struct drm_tile_group *tg = container_of(kref, struct drm_tile_group, refcount);
-       struct drm_device *dev = tg->dev;
-       mutex_lock(&dev->mode_config.idr_mutex);
-       idr_remove(&dev->mode_config.tile_idr, tg->id);
-       mutex_unlock(&dev->mode_config.idr_mutex);
-       kfree(tg);
-}
-
-/**
- * drm_mode_put_tile_group - drop a reference to a tile group.
- * @dev: DRM device
- * @tg: tile group to drop reference to.
- *
- * drop reference to tile group and free if 0.
- */
-void drm_mode_put_tile_group(struct drm_device *dev,
-                            struct drm_tile_group *tg)
-{
-       kref_put(&tg->refcount, drm_tile_group_free);
-}
-
-/**
- * drm_mode_get_tile_group - get a reference to an existing tile group
- * @dev: DRM device
- * @topology: 8-bytes unique per monitor.
- *
- * Use the unique bytes to get a reference to an existing tile group.
- *
- * RETURNS:
- * tile group or NULL if not found.
- */
-struct drm_tile_group *drm_mode_get_tile_group(struct drm_device *dev,
-                                              char topology[8])
-{
-       struct drm_tile_group *tg;
-       int id;
-       mutex_lock(&dev->mode_config.idr_mutex);
-       idr_for_each_entry(&dev->mode_config.tile_idr, tg, id) {
-               if (!memcmp(tg->group_data, topology, 8)) {
-                       if (!kref_get_unless_zero(&tg->refcount))
-                               tg = NULL;
-                       mutex_unlock(&dev->mode_config.idr_mutex);
-                       return tg;
-               }
-       }
-       mutex_unlock(&dev->mode_config.idr_mutex);
-       return NULL;
-}
-EXPORT_SYMBOL(drm_mode_get_tile_group);
-
-/**
- * drm_mode_create_tile_group - create a tile group from a displayid description
- * @dev: DRM device
- * @topology: 8-bytes unique per monitor.
- *
- * Create a tile group for the unique monitor, and get a unique
- * identifier for the tile group.
- *
- * RETURNS:
- * new tile group or error.
- */
-struct drm_tile_group *drm_mode_create_tile_group(struct drm_device *dev,
-                                                 char topology[8])
-{
-       struct drm_tile_group *tg;
-       int ret;
-
-       tg = kzalloc(sizeof(*tg), GFP_KERNEL);
-       if (!tg)
-               return ERR_PTR(-ENOMEM);
-
-       kref_init(&tg->refcount);
-       memcpy(tg->group_data, topology, 8);
-       tg->dev = dev;
-
-       mutex_lock(&dev->mode_config.idr_mutex);
-       ret = idr_alloc(&dev->mode_config.tile_idr, tg, 1, 0, GFP_KERNEL);
-       if (ret >= 0) {
-               tg->id = ret;
-       } else {
-               kfree(tg);
-               tg = ERR_PTR(ret);
-       }
-
-       mutex_unlock(&dev->mode_config.idr_mutex);
-       return tg;
-}
-EXPORT_SYMBOL(drm_mode_create_tile_group);
index 3e9727264b65f036a029e7ddf12ed1d3c37025ef..34f9741ebb5b3b3e0496ce7d7e1262b7e7fac55b 100644 (file)
@@ -774,6 +774,30 @@ int drm_mode_connector_set_tile_property(struct drm_connector *connector);
 int drm_mode_connector_update_edid_property(struct drm_connector *connector,
                                            const struct edid *edid);
 
+/**
+ * struct drm_tile_group - Tile group metadata
+ * @refcount: reference count
+ * @dev: DRM device
+ * @id: tile group id exposed to userspace
+ * @group_data: Sink-private data identifying this group
+ *
+ * @group_data corresponds to displayid vend/prod/serial for external screens
+ * with an EDID.
+ */
+struct drm_tile_group {
+       struct kref refcount;
+       struct drm_device *dev;
+       int id;
+       u8 group_data[8];
+};
+
+struct drm_tile_group *drm_mode_create_tile_group(struct drm_device *dev,
+                                                 char topology[8]);
+struct drm_tile_group *drm_mode_get_tile_group(struct drm_device *dev,
+                                              char topology[8]);
+void drm_mode_put_tile_group(struct drm_device *dev,
+                            struct drm_tile_group *tg);
+
 /**
  * drm_for_each_connector - iterate over all connectors
  * @connector: the loop cursor
index 98de488a95a5cab6a94281be029a65293b577dd9..cf96b393091a88fcfb335e2b71c5ec03448b7738 100644 (file)
@@ -67,14 +67,6 @@ static inline uint64_t I642U64(int64_t val)
        return (uint64_t)*((uint64_t *)&val);
 }
 
-/* data corresponds to displayid vend/prod/serial */
-struct drm_tile_group {
-       struct kref refcount;
-       struct drm_device *dev;
-       int id;
-       u8 group_data[8];
-};
-
 struct drm_crtc;
 struct drm_encoder;
 struct drm_pending_vblank_event;
@@ -810,13 +802,6 @@ extern int drm_crtc_force_disable_all(struct drm_device *dev);
 
 extern int drm_mode_set_config_internal(struct drm_mode_set *set);
 
-extern struct drm_tile_group *drm_mode_create_tile_group(struct drm_device *dev,
-                                                        char topology[8]);
-extern struct drm_tile_group *drm_mode_get_tile_group(struct drm_device *dev,
-                                              char topology[8]);
-extern void drm_mode_put_tile_group(struct drm_device *dev,
-                                  struct drm_tile_group *tg);
-
 /* Helpers */
 static inline struct drm_crtc *drm_crtc_find(struct drm_device *dev,
        uint32_t id)