drm: document drm_display_info
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Fri, 12 Aug 2016 20:48:55 +0000 (22:48 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 16 Aug 2016 16:49:47 +0000 (18:49 +0200)
We seem to have a bit a mess in how to describe the bus formats, with
a multitude of competing ways. Might be best to consolidate it all and
use MEDIA_BUS_FMT_ also for the hdmi color formats and high color
modes.

Also move all the display_info related functions into drm_connector.c
(there's only one) to group it all together. I did decided against
also moving the edid related display info functions, they seem to fit
better in drm_edid.c. Instead sprinkle a few cross references around.
While at that reduce the kerneldoc for static functions, there's not
point in documenting internals with that much detail really.

v2: Fix typo and move misplaced hunk (Sean).

Cc: Sean Paul <seanpaul@chromium.org>
Reviewed-by: Sean Paul <seanpaul@chromium.org>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1471034937-651-19-git-send-email-daniel.vetter@ffwll.ch
drivers/gpu/drm/drm_connector.c
drivers/gpu/drm/drm_crtc.c
drivers/gpu/drm/drm_edid.c
include/drm/drm_connector.h
include/drm/drm_crtc.h

index 6a0551744d135c5b9efd81041c3a4d5a0f823e17..26bb78c76481dabdf834630c3ce706b73fa81112 100644 (file)
@@ -506,6 +506,40 @@ static const struct drm_prop_enum_list drm_dpms_enum_list[] = {
 };
 DRM_ENUM_NAME_FN(drm_get_dpms_name, drm_dpms_enum_list)
 
+/**
+ * drm_display_info_set_bus_formats - set the supported bus formats
+ * @info: display info to store bus formats in
+ * @formats: array containing the supported bus formats
+ * @num_formats: the number of entries in the fmts array
+ *
+ * Store the supported bus formats in display info structure.
+ * See MEDIA_BUS_FMT_* definitions in include/uapi/linux/media-bus-format.h for
+ * a full list of available formats.
+ */
+int drm_display_info_set_bus_formats(struct drm_display_info *info,
+                                    const u32 *formats,
+                                    unsigned int num_formats)
+{
+       u32 *fmts = NULL;
+
+       if (!formats && num_formats)
+               return -EINVAL;
+
+       if (formats && num_formats) {
+               fmts = kmemdup(formats, sizeof(*formats) * num_formats,
+                              GFP_KERNEL);
+               if (!fmts)
+                       return -ENOMEM;
+       }
+
+       kfree(info->bus_formats);
+       info->bus_formats = fmts;
+       info->num_bus_formats = num_formats;
+
+       return 0;
+}
+EXPORT_SYMBOL(drm_display_info_set_bus_formats);
+
 /* Optional connector properties. */
 static const struct drm_prop_enum_list drm_scaling_mode_enum_list[] = {
        { DRM_MODE_SCALE_NONE, "None" },
index 13f7b13a6f49caa580f397b24c225b41e2a22742..7f2510524f09c9d487c5334f4f96c712463c001a 100644 (file)
@@ -419,40 +419,6 @@ void drm_crtc_cleanup(struct drm_crtc *crtc)
 }
 EXPORT_SYMBOL(drm_crtc_cleanup);
 
-/**
- * drm_display_info_set_bus_formats - set the supported bus formats
- * @info: display info to store bus formats in
- * @formats: array containing the supported bus formats
- * @num_formats: the number of entries in the fmts array
- *
- * Store the supported bus formats in display info structure.
- * See MEDIA_BUS_FMT_* definitions in include/uapi/linux/media-bus-format.h for
- * a full list of available formats.
- */
-int drm_display_info_set_bus_formats(struct drm_display_info *info,
-                                    const u32 *formats,
-                                    unsigned int num_formats)
-{
-       u32 *fmts = NULL;
-
-       if (!formats && num_formats)
-               return -EINVAL;
-
-       if (formats && num_formats) {
-               fmts = kmemdup(formats, sizeof(*formats) * num_formats,
-                              GFP_KERNEL);
-               if (!fmts)
-                       return -ENOMEM;
-       }
-
-       kfree(info->bus_formats);
-       info->bus_formats = fmts;
-       info->num_bus_formats = num_formats;
-
-       return 0;
-}
-EXPORT_SYMBOL(drm_display_info_set_bus_formats);
-
 static int drm_encoder_register_all(struct drm_device *dev)
 {
        struct drm_encoder *encoder;
index 637a0aa4d3a0c1d71e83c8d0cde2b18584a20629..62dffbccd4479d513225ab7687db7590d64ae082 100644 (file)
@@ -3721,14 +3721,7 @@ bool drm_rgb_quant_range_selectable(struct edid *edid)
 }
 EXPORT_SYMBOL(drm_rgb_quant_range_selectable);
 
-/**
- * drm_assign_hdmi_deep_color_info - detect whether monitor supports
- * hdmi deep color modes and update drm_display_info if so.
- * @edid: monitor EDID information
- * @info: Updated with maximum supported deep color bpc and color format
- *        if deep color supported.
- * @connector: DRM connector, used only for debug output
- *
+/*
  * Parse the CEA extension according to CEA-861-B.
  * Return true if HDMI deep color supported, false if not or unknown.
  */
@@ -3822,16 +3815,6 @@ static bool drm_assign_hdmi_deep_color_info(struct edid *edid,
        return false;
 }
 
-/**
- * drm_add_display_info - pull display info out if present
- * @edid: EDID data
- * @info: display info (attached to connector)
- * @connector: connector whose edid is used to build display info
- *
- * Grab any available display info and stuff it into the drm_display_info
- * structure that's part of the connector.  Useful for tracking bpp and
- * color spaces.
- */
 static void drm_add_display_info(struct edid *edid,
                                  struct drm_display_info *info,
                                  struct drm_connector *connector)
@@ -4052,7 +4035,9 @@ static int add_displayid_detailed_modes(struct drm_connector *connector,
  * @connector: connector we're probing
  * @edid: EDID data
  *
- * Add the specified modes to the connector's mode list.
+ * Add the specified modes to the connector's mode list. Also fills out the
+ * &drm_display_info structure in @connector with any information which can be
+ * derived from the edid.
  *
  * Return: The number of modes added or 0 if we couldn't find any.
  */
index bc88a5575792121da6676037c6f5a6f69ada8946..f1576db6c044477d7ffabe87976f79d23bb9aead 100644 (file)
@@ -84,28 +84,69 @@ enum subpixel_order {
        SubPixelNone,
 };
 
-/*
- * Describes a given display (e.g. CRT or flat panel) and its limitations.
+/**
+ * struct drm_display_info - runtime data about the connected sink
+ *
+ * Describes a given display (e.g. CRT or flat panel) and its limitations. For
+ * fixed display sinks like built-in panels there's not much difference between
+ * this and struct &drm_connector. But for sinks with a real cable this
+ * structure is meant to describe all the things at the other end of the cable.
+ *
+ * For sinks which provide an EDID this can be filled out by calling
+ * drm_add_edid_modes().
  */
 struct drm_display_info {
+       /**
+        * @name: Name of the display.
+        */
        char name[DRM_DISPLAY_INFO_LEN];
 
-       /* Physical size */
+       /**
+        * @width_mm: Physical width in mm.
+        */
         unsigned int width_mm;
+       /**
+        * @height_mm: Physical height in mm.
+        */
        unsigned int height_mm;
 
+       /**
+        * @pixel_clock: Maximum pixel clock supported by the sink, in units of
+        * 100Hz. This mismatches the clok in &drm_display_mode (which is in
+        * kHZ), because that's what the EDID uses as base unit.
+        */
        unsigned int pixel_clock;
+       /**
+        * @bpc: Maximum bits per color channel. Used by HDMI and DP outputs.
+        */
        unsigned int bpc;
 
+       /**
+        * @subpixel_order: Subpixel order of LCD panels.
+        */
        enum subpixel_order subpixel_order;
 
 #define DRM_COLOR_FORMAT_RGB444                (1<<0)
 #define DRM_COLOR_FORMAT_YCRCB444      (1<<1)
 #define DRM_COLOR_FORMAT_YCRCB422      (1<<2)
 
+       /**
+        * @color_formats: HDMI Color formats, selects between RGB and YCrCb
+        * modes. Used DRM_COLOR_FORMAT\_ defines, which are _not_ the same ones
+        * as used to describe the pixel format in framebuffers, and also don't
+        * match the formats in @bus_formats which are shared with v4l.
+        */
        u32 color_formats;
 
+       /**
+        * @bus_formats: Pixel data format on the wire, somewhat redundant with
+        * @color_formats. Array of size @num_bus_formats encoded using
+        * MEDIA_BUS_FMT\_ defines shared with v4l and media drivers.
+        */
        const u32 *bus_formats;
+       /**
+        * @num_bus_formats: Size of @bus_formats array.
+        */
        unsigned int num_bus_formats;
 
 #define DRM_BUS_FLAG_DE_LOW            (1<<0)
@@ -115,14 +156,28 @@ struct drm_display_info {
 /* drive data on neg. edge */
 #define DRM_BUS_FLAG_PIXDATA_NEGEDGE   (1<<3)
 
+       /**
+        * @bus_flags: Additional information (like pixel signal polarity) for
+        * the pixel data on the bus, using DRM_BUS_FLAGS\_ defines.
+        */
        u32 bus_flags;
 
-       /* Mask of supported hdmi deep color modes */
+       /**
+        * @edid_hdmi_dc_modes: Mask of supported hdmi deep color modes. Even
+        * more stuff redundant with @bus_formats.
+        */
        u8 edid_hdmi_dc_modes;
 
+       /**
+        * @cea_rev: CEA revision of the HDMI sink.
+        */
        u8 cea_rev;
 };
 
+int drm_display_info_set_bus_formats(struct drm_display_info *info,
+                                    const u32 *formats,
+                                    unsigned int num_formats);
+
 /**
  * struct drm_connector_state - mutable connector state
  * @connector: backpointer to the connector
index e30ea0be641738bcd01cf94fe62e01592a7c181e..3fa0275e509f8ddfb9f7bb2a591f07a0572d9e43 100644 (file)
@@ -2208,10 +2208,6 @@ extern void drm_mode_config_init(struct drm_device *dev);
 extern void drm_mode_config_reset(struct drm_device *dev);
 extern void drm_mode_config_cleanup(struct drm_device *dev);
 
-extern int drm_display_info_set_bus_formats(struct drm_display_info *info,
-                                           const u32 *formats,
-                                           unsigned int num_formats);
-
 static inline bool drm_property_type_is(struct drm_property *property,
                uint32_t type)
 {