dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 00/25] drm/edid: introduce struct drm_edid
@ 2022-05-09 12:02 Jani Nikula
  2022-05-09 12:03 ` [PATCH v2 01/25] drm/edid: use else-if in CTA extension parsing Jani Nikula
                   ` (24 more replies)
  0 siblings, 25 replies; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:02 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

v2 of [1] with some NULL deref bugs and checkpatch/sparse warnings
fixed.

BR,
Jani.

[1] https://patchwork.freedesktop.org/series/103665/

Jani Nikula (25):
  drm/edid: use else-if in CTA extension parsing
  drm/edid: convert drm_for_each_detailed_block() to edid iter
  drm/edid: add struct drm_edid container
  drm/edid: start propagating drm_edid to lower levels
  drm/edid: keep propagating drm_edid to display info
  drm/edid: propagate drm_edid to drm_edid_to_eld()
  drm/edid: convert drm_edid_connector_update() to drm_edid fully
  drm/edid: convert struct detailed_mode_closure to drm_edid
  drm/edid: convert drm_mode_detailed() to drm_edid
  drm/edid: convert drm_dmt_modes_for_range() to drm_edid
  drm/edid: convert drm_gtf_modes_for_range() to drm_edid
  drm/edid: convert drm_cvt_modes_for_range() to drm_edid
  drm/edid: convert drm_mode_std() and children to drm_edid
  drm/edid: convert mode_in_range() and drm_monitor_supports_rb() to
    drm_edid
  drm/edid: convert get_monitor_name() to drm_edid
  drm/edid: convert drm_for_each_detailed_block() to drm_edid
  drm/edid: add drm_edid helper for drm_edid_to_sad()
  drm/edid: add drm_edid helper for drm_edid_to_speaker_allocation()
  drm/edid: add drm_edid helper for drm_detect_hdmi_monitor()
  drm/edid: add drm_edid helper for drm_detect_monitor_audio()
  drm/edid: convert cea_db_iter_edid_begin() to drm_edid
  drm/edid: convert drm_edid_iter_begin() to drm_edid
  drm/edid: add drm_edid helper for drm_update_tile_info()
  drm/displayid: convert to drm_edid
  drm/edid: convert version_greater() to drm_edid

 drivers/gpu/drm/drm_displayid.c |  16 +-
 drivers/gpu/drm/drm_edid.c      | 540 +++++++++++++++++++-------------
 include/drm/drm_displayid.h     |   6 +-
 include/drm/drm_edid.h          |   6 +-
 4 files changed, 335 insertions(+), 233 deletions(-)

-- 
2.30.2


^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH v2 01/25] drm/edid: use else-if in CTA extension parsing
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-09 12:03 ` [PATCH v2 02/25] drm/edid: convert drm_for_each_detailed_block() to edid iter Jani Nikula
                   ` (23 subsequent siblings)
  24 siblings, 0 replies; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

Only one of the conditions can be true.

Suggested-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/drm_edid.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 47d121e99201..efc1999b9573 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -5473,16 +5473,16 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
 
 		if (cea_db_is_hdmi_vsdb(db))
 			drm_parse_hdmi_vsdb_video(connector, data);
-		if (cea_db_is_hdmi_forum_vsdb(db) ||
-		    cea_db_is_hdmi_forum_scdb(db))
+		else if (cea_db_is_hdmi_forum_vsdb(db) ||
+			 cea_db_is_hdmi_forum_scdb(db))
 			drm_parse_hdmi_forum_scds(connector, data);
-		if (cea_db_is_microsoft_vsdb(db))
+		else if (cea_db_is_microsoft_vsdb(db))
 			drm_parse_microsoft_vsdb(connector, data);
-		if (cea_db_is_y420cmdb(db))
+		else if (cea_db_is_y420cmdb(db))
 			drm_parse_y420cmdb_bitmap(connector, data);
-		if (cea_db_is_vcdb(db))
+		else if (cea_db_is_vcdb(db))
 			drm_parse_vcdb(connector, data);
-		if (cea_db_is_hdmi_hdr_metadata_block(db))
+		else if (cea_db_is_hdmi_hdr_metadata_block(db))
 			drm_parse_hdr_metadata_block(connector, data);
 	}
 	cea_db_iter_end(&iter);
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 02/25] drm/edid: convert drm_for_each_detailed_block() to edid iter
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
  2022-05-09 12:03 ` [PATCH v2 01/25] drm/edid: use else-if in CTA extension parsing Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-09 12:03 ` [PATCH v2 03/25] drm/edid: add struct drm_edid container Jani Nikula
                   ` (22 subsequent siblings)
  24 siblings, 0 replies; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We have an iterator for this, use it. It does include the base block,
but its tag is 0 and will be skipped.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/drm_edid.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index efc1999b9573..dcef92c8887a 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2574,6 +2574,8 @@ vtb_for_each_detailed_block(const u8 *ext, detailed_cb *cb, void *closure)
 static void
 drm_for_each_detailed_block(const struct edid *edid, detailed_cb *cb, void *closure)
 {
+	struct drm_edid_iter edid_iter;
+	const u8 *ext;
 	int i;
 
 	if (edid == NULL)
@@ -2582,9 +2584,8 @@ drm_for_each_detailed_block(const struct edid *edid, detailed_cb *cb, void *clos
 	for (i = 0; i < EDID_DETAILED_TIMINGS; i++)
 		cb(&(edid->detailed_timings[i]), closure);
 
-	for (i = 0; i < edid_extension_block_count(edid); i++) {
-		const u8 *ext = edid_extension_block_data(edid, i);
-
+	drm_edid_iter_begin(edid, &edid_iter);
+	drm_edid_iter_for_each(ext, &edid_iter) {
 		switch (*ext) {
 		case CEA_EXT:
 			cea_for_each_detailed_block(ext, cb, closure);
@@ -2596,6 +2597,7 @@ drm_for_each_detailed_block(const struct edid *edid, detailed_cb *cb, void *clos
 			break;
 		}
 	}
+	drm_edid_iter_end(&edid_iter);
 }
 
 static void
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 03/25] drm/edid: add struct drm_edid container
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
  2022-05-09 12:03 ` [PATCH v2 01/25] drm/edid: use else-if in CTA extension parsing Jani Nikula
  2022-05-09 12:03 ` [PATCH v2 02/25] drm/edid: convert drm_for_each_detailed_block() to edid iter Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10  6:26   ` [Intel-gfx] " Nautiyal, Ankit K
  2022-05-09 12:03 ` [PATCH v2 04/25] drm/edid: start propagating drm_edid to lower levels Jani Nikula
                   ` (21 subsequent siblings)
  24 siblings, 1 reply; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

Introduce new opaque type struct drm_edid to encapsulate the EDID data
and the size allocated for it. The contents will be private to
drm_edid.c.

There are a number of reasons for adding a container around struct edid:

* struct edid is a raw blob pointer to data that usually originates
  outside of the kernel. Its size is contained within the structure.

* There's no way to attach meta information (such as allocated memory
  size) to struct edid.

* Validation of the EDID blob and its size become crucial, and it's
  spread all over the subsystem, with varying levels of accuracy.

* HDMI Forum has introduced an HF-EEODB extension that defines an
  override EDID size within an EDID extension. The size allocated for an
  EDID depends on whether the allocator understands the HF-EEODB
  extension. Given a struct edid *, it's impossible to know how much
  memory was actually allocated for it.

There are also some reasons for making the container type struct
drm_edid opaque and private to drm_edid.c:

* Have only one place for creating and parsing the EDID, to avoid
  duplicating bugs.

* Prepare for reading a pure DisplayID 2.0 from its own DDC address, and
  adding it within the same struct drm_edid container, transparently,
  and for all drivers.

* With the idea that the drm_edid objects are immutable during their
  lifetimes, it will be possible to refcount them and reduce EDID
  copying everywhere (this is left for future work).

Initially, just add the type. In follow-up, we'll start converting the
guts of drm_edid.c to use it, and finally add interfaces around it.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index dcef92c8887a..480fd9fbe412 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1567,6 +1567,15 @@ static const struct drm_display_mode edid_4k_modes[] = {
 
 /*** DDC fetch and block validation ***/
 
+/*
+ * The opaque EDID type, internal to drm_edid.c.
+ */
+struct drm_edid {
+	/* Size allocated for edid */
+	size_t size;
+	const struct edid *edid;
+};
+
 static int edid_extension_block_count(const struct edid *edid)
 {
 	return edid->extensions;
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 04/25] drm/edid: start propagating drm_edid to lower levels
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (2 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 03/25] drm/edid: add struct drm_edid container Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10  6:23   ` [Intel-gfx] " Nautiyal, Ankit K
  2022-05-09 12:03 ` [PATCH v2 05/25] drm/edid: keep propagating drm_edid to display info Jani Nikula
                   ` (20 subsequent siblings)
  24 siblings, 1 reply; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere. This is a clunky start, but
a start nonetheless. We'll eventually convert all of the EDID parsing to
struct drm_edid.

Initially, we'll just create the struct drm_edid in stack. This will be
the compat layer for legacy struct edid code. In the future, we'll have
EDID read return drm_edid objects.

v2: Add legacy init helper.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 30 +++++++++++++++++++++++++++---
 1 file changed, 27 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 480fd9fbe412..f48f1f1a1fa7 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1608,6 +1608,24 @@ static const void *edid_extension_block_data(const struct edid *edid, int index)
 	return edid_block_data(edid, index + 1);
 }
 
+/*
+ * Initializer helper for legacy interfaces, where we have no choice but to
+ * trust edid size. Not for general purpose use.
+ */
+static const struct drm_edid *drm_edid_legacy_init(struct drm_edid *drm_edid,
+						   const struct edid *edid)
+{
+	if (!edid)
+		return NULL;
+
+	memset(drm_edid, 0, sizeof(*drm_edid));
+
+	drm_edid->edid = edid;
+	drm_edid->size = edid_size(edid);
+
+	return drm_edid;
+}
+
 /*
  * EDID base and extension block iterator.
  *
@@ -5814,17 +5832,20 @@ static int add_displayid_detailed_modes(struct drm_connector *connector,
 }
 
 static int drm_edid_connector_update(struct drm_connector *connector,
-				     const struct edid *edid)
+				     const struct drm_edid *drm_edid)
 {
+	const struct edid *edid;
 	int num_modes = 0;
 	u32 quirks;
 
-	if (edid == NULL) {
+	if (!drm_edid) {
 		drm_reset_display_info(connector);
 		clear_eld(connector);
 		return 0;
 	}
 
+	edid = drm_edid->edid;
+
 	/*
 	 * CEA-861-F adds ycbcr capability map block, for HDMI 2.0 sinks.
 	 * To avoid multiple parsing of same block, lets parse that map
@@ -5890,13 +5911,16 @@ static int drm_edid_connector_update(struct drm_connector *connector,
  */
 int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
 {
+	struct drm_edid drm_edid;
+
 	if (edid && !drm_edid_is_valid(edid)) {
 		drm_warn(connector->dev, "%s: EDID invalid.\n",
 			 connector->name);
 		edid = NULL;
 	}
 
-	return drm_edid_connector_update(connector, edid);
+	return drm_edid_connector_update(connector,
+					 drm_edid_legacy_init(&drm_edid, edid));
 }
 EXPORT_SYMBOL(drm_add_edid_modes);
 
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 05/25] drm/edid: keep propagating drm_edid to display info
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (3 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 04/25] drm/edid: start propagating drm_edid to lower levels Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10  6:15   ` Nautiyal, Ankit K
  2022-05-11  9:21   ` [PATCH v3] " Jani Nikula
  2022-05-09 12:03 ` [PATCH v2 06/25] drm/edid: propagate drm_edid to drm_edid_to_eld() Jani Nikula
                   ` (19 subsequent siblings)
  24 siblings, 2 replies; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere.

v2: Use drm_edid_legacy_init()

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 48 +++++++++++++++++++++++---------------
 1 file changed, 29 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index f48f1f1a1fa7..96e3f9327044 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2437,13 +2437,13 @@ EXPORT_SYMBOL(drm_edid_duplicate);
 
 /**
  * edid_get_quirks - return quirk flags for a given EDID
- * @edid: EDID to process
+ * @drm_edid: EDID to process
  *
  * This tells subsequent routines what fixes they need to apply.
  */
-static u32 edid_get_quirks(const struct edid *edid)
+static u32 edid_get_quirks(const struct drm_edid *drm_edid)
 {
-	u32 panel_id = edid_extract_panel_id(edid);
+	u32 panel_id = edid_extract_panel_id(drm_edid->edid);
 	const struct edid_quirk *quirk;
 	int i;
 
@@ -5466,7 +5466,7 @@ static void drm_parse_microsoft_vsdb(struct drm_connector *connector,
 }
 
 static void drm_parse_cea_ext(struct drm_connector *connector,
-			      const struct edid *edid)
+			      const struct drm_edid *drm_edid)
 {
 	struct drm_display_info *info = &connector->display_info;
 	struct drm_edid_iter edid_iter;
@@ -5474,7 +5474,7 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
 	struct cea_db_iter iter;
 	const u8 *edid_ext;
 
-	drm_edid_iter_begin(edid, &edid_iter);
+	drm_edid_iter_begin(drm_edid->edid, &edid_iter);
 	drm_edid_iter_for_each(edid_ext, &edid_iter) {
 		if (edid_ext[0] != CEA_EXT)
 			continue;
@@ -5495,7 +5495,7 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
 	}
 	drm_edid_iter_end(&edid_iter);
 
-	cea_db_iter_edid_begin(edid, &iter);
+	cea_db_iter_edid_begin(drm_edid->edid, &iter);
 	cea_db_iter_for_each(db, &iter) {
 		/* FIXME: convert parsers to use struct cea_db */
 		const u8 *data = (const u8 *)db;
@@ -5541,16 +5541,15 @@ void get_monitor_range(const struct detailed_timing *timing,
 	monitor_range->max_vfreq = range->max_vfreq;
 }
 
-static
-void drm_get_monitor_range(struct drm_connector *connector,
-			   const struct edid *edid)
+static void drm_get_monitor_range(struct drm_connector *connector,
+				  const struct drm_edid *drm_edid)
 {
 	struct drm_display_info *info = &connector->display_info;
 
-	if (!version_greater(edid, 1, 1))
+	if (!version_greater(drm_edid->edid, 1, 1))
 		return;
 
-	drm_for_each_detailed_block(edid, get_monitor_range,
+	drm_for_each_detailed_block(drm_edid->edid, get_monitor_range,
 				    &info->monitor_range);
 
 	DRM_DEBUG_KMS("Supported Monitor Refresh rate range is %d Hz - %d Hz\n",
@@ -5610,12 +5609,13 @@ static void drm_parse_vesa_mso_data(struct drm_connector *connector,
 		    info->mso_stream_count, info->mso_pixel_overlap);
 }
 
-static void drm_update_mso(struct drm_connector *connector, const struct edid *edid)
+static void drm_update_mso(struct drm_connector *connector,
+			   const struct drm_edid *drm_edid)
 {
 	const struct displayid_block *block;
 	struct displayid_iter iter;
 
-	displayid_iter_edid_begin(edid, &iter);
+	displayid_iter_edid_begin(drm_edid->edid, &iter);
 	displayid_iter_for_each(block, &iter) {
 		if (block->tag == DATA_BLOCK_2_VENDOR_SPECIFIC)
 			drm_parse_vesa_mso_data(connector, block);
@@ -5654,18 +5654,20 @@ drm_reset_display_info(struct drm_connector *connector)
 	info->mso_pixel_overlap = 0;
 }
 
-u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edid)
+static u32 update_display_info(struct drm_connector *connector,
+			       const struct drm_edid *drm_edid)
 {
 	struct drm_display_info *info = &connector->display_info;
+	const struct edid *edid = drm_edid->edid;
 
-	u32 quirks = edid_get_quirks(edid);
+	u32 quirks = edid_get_quirks(drm_edid);
 
 	drm_reset_display_info(connector);
 
 	info->width_mm = edid->width_cm * 10;
 	info->height_mm = edid->height_cm * 10;
 
-	drm_get_monitor_range(connector, edid);
+	drm_get_monitor_range(connector, drm_edid);
 
 	if (edid->revision < 3)
 		goto out;
@@ -5674,7 +5676,7 @@ u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edi
 		goto out;
 
 	info->color_formats |= DRM_COLOR_FORMAT_RGB444;
-	drm_parse_cea_ext(connector, edid);
+	drm_parse_cea_ext(connector, drm_edid);
 
 	/*
 	 * Digital sink with "DFP 1.x compliant TMDS" according to EDID 1.3?
@@ -5727,7 +5729,7 @@ u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edi
 	if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB422)
 		info->color_formats |= DRM_COLOR_FORMAT_YCBCR422;
 
-	drm_update_mso(connector, edid);
+	drm_update_mso(connector, drm_edid);
 
 out:
 	if (quirks & EDID_QUIRK_NON_DESKTOP) {
@@ -5739,6 +5741,14 @@ u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edi
 	return quirks;
 }
 
+u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edid)
+{
+	struct drm_edid drm_edid;
+
+	return update_display_info(connector,
+				   drm_edid_legacy_init(&drm_edid, edid));
+}
+
 static struct drm_display_mode *drm_mode_displayid_detailed(struct drm_device *dev,
 							    struct displayid_detailed_timings_1 *timings,
 							    bool type_7)
@@ -5851,7 +5861,7 @@ static int drm_edid_connector_update(struct drm_connector *connector,
 	 * To avoid multiple parsing of same block, lets parse that map
 	 * from sink info, before parsing CEA modes.
 	 */
-	quirks = drm_add_display_info(connector, edid);
+	quirks = update_display_info(connector, drm_edid);
 
 	/* Depends on info->cea_rev set by drm_add_display_info() above */
 	drm_edid_to_eld(connector, edid);
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 06/25] drm/edid: propagate drm_edid to drm_edid_to_eld()
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (4 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 05/25] drm/edid: keep propagating drm_edid to display info Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10  6:31   ` Nautiyal, Ankit K
  2022-05-11  9:23   ` [PATCH v3] " Jani Nikula
  2022-05-09 12:03 ` [PATCH v2 07/25] drm/edid: convert drm_edid_connector_update() to drm_edid fully Jani Nikula
                   ` (18 subsequent siblings)
  24 siblings, 2 replies; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 96e3f9327044..e4fdf742645b 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -4883,13 +4883,13 @@ static void clear_eld(struct drm_connector *connector)
 /*
  * drm_edid_to_eld - build ELD from EDID
  * @connector: connector corresponding to the HDMI/DP sink
- * @edid: EDID to parse
+ * @drm_edid: EDID to parse
  *
  * Fill the ELD (EDID-Like Data) buffer for passing to the audio driver. The
  * HDCP and Port_ID ELD fields are left for the graphics driver to fill in.
  */
 static void drm_edid_to_eld(struct drm_connector *connector,
-			    const struct edid *edid)
+			    const struct drm_edid *drm_edid)
 {
 	const struct drm_display_info *info = &connector->display_info;
 	const struct cea_db *db;
@@ -4900,10 +4900,10 @@ static void drm_edid_to_eld(struct drm_connector *connector,
 
 	clear_eld(connector);
 
-	if (!edid)
+	if (!drm_edid)
 		return;
 
-	mnl = get_monitor_name(edid, &eld[DRM_ELD_MONITOR_NAME_STRING]);
+	mnl = get_monitor_name(drm_edid->edid, &eld[DRM_ELD_MONITOR_NAME_STRING]);
 	DRM_DEBUG_KMS("ELD monitor %s\n", &eld[DRM_ELD_MONITOR_NAME_STRING]);
 
 	eld[DRM_ELD_CEA_EDID_VER_MNL] = info->cea_rev << DRM_ELD_CEA_EDID_VER_SHIFT;
@@ -4911,12 +4911,12 @@ static void drm_edid_to_eld(struct drm_connector *connector,
 
 	eld[DRM_ELD_VER] = DRM_ELD_VER_CEA861D;
 
-	eld[DRM_ELD_MANUFACTURER_NAME0] = edid->mfg_id[0];
-	eld[DRM_ELD_MANUFACTURER_NAME1] = edid->mfg_id[1];
-	eld[DRM_ELD_PRODUCT_CODE0] = edid->prod_code[0];
-	eld[DRM_ELD_PRODUCT_CODE1] = edid->prod_code[1];
+	eld[DRM_ELD_MANUFACTURER_NAME0] = drm_edid->edid->mfg_id[0];
+	eld[DRM_ELD_MANUFACTURER_NAME1] = drm_edid->edid->mfg_id[1];
+	eld[DRM_ELD_PRODUCT_CODE0] = drm_edid->edid->prod_code[0];
+	eld[DRM_ELD_PRODUCT_CODE1] = drm_edid->edid->prod_code[1];
 
-	cea_db_iter_edid_begin(edid, &iter);
+	cea_db_iter_edid_begin(drm_edid->edid, &iter);
 	cea_db_iter_for_each(db, &iter) {
 		const u8 *data = cea_db_data(db);
 		int len = cea_db_payload_len(db);
@@ -5864,7 +5864,7 @@ static int drm_edid_connector_update(struct drm_connector *connector,
 	quirks = update_display_info(connector, drm_edid);
 
 	/* Depends on info->cea_rev set by drm_add_display_info() above */
-	drm_edid_to_eld(connector, edid);
+	drm_edid_to_eld(connector, drm_edid);
 
 	/*
 	 * EDID spec says modes should be preferred in this order:
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 07/25] drm/edid: convert drm_edid_connector_update() to drm_edid fully
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (5 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 06/25] drm/edid: propagate drm_edid to drm_edid_to_eld() Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10  6:45   ` [Intel-gfx] " Nautiyal, Ankit K
  2022-05-11  9:26   ` [PATCH v3] " Jani Nikula
  2022-05-09 12:03 ` [PATCH v2 08/25] drm/edid: convert struct detailed_mode_closure to drm_edid Jani Nikula
                   ` (17 subsequent siblings)
  24 siblings, 2 replies; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 95 ++++++++++++++++++--------------------
 1 file changed, 46 insertions(+), 49 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index e4fdf742645b..f54699422bca 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3253,16 +3253,16 @@ do_inferred_modes(const struct detailed_timing *timing, void *c)
 	}
 }
 
-static int
-add_inferred_modes(struct drm_connector *connector, const struct edid *edid)
+static int add_inferred_modes(struct drm_connector *connector,
+			      const struct drm_edid *drm_edid)
 {
 	struct detailed_mode_closure closure = {
 		.connector = connector,
-		.edid = edid,
+		.edid = drm_edid->edid,
 	};
 
-	if (version_greater(edid, 1, 0))
-		drm_for_each_detailed_block(edid, do_inferred_modes, &closure);
+	if (version_greater(drm_edid->edid, 1, 0))
+		drm_for_each_detailed_block(drm_edid->edid, do_inferred_modes, &closure);
 
 	return closure.modes;
 }
@@ -3312,10 +3312,11 @@ do_established_modes(const struct detailed_timing *timing, void *c)
  * bitmap of the supported "established modes" list (defined above). Tease them
  * out and add them to the global modes list.
  */
-static int
-add_established_modes(struct drm_connector *connector, const struct edid *edid)
+static int add_established_modes(struct drm_connector *connector,
+				 const struct drm_edid *drm_edid)
 {
 	struct drm_device *dev = connector->dev;
+	const struct edid *edid = drm_edid->edid;
 	unsigned long est_bits = edid->established_timings.t1 |
 		(edid->established_timings.t2 << 8) |
 		((edid->established_timings.mfg_rsvd & 0x80) << 9);
@@ -3338,7 +3339,7 @@ add_established_modes(struct drm_connector *connector, const struct edid *edid)
 	}
 
 	if (version_greater(edid, 1, 0))
-		drm_for_each_detailed_block(edid, do_established_modes,
+		drm_for_each_detailed_block(drm_edid->edid, do_established_modes,
 					    &closure);
 
 	return modes + closure.modes;
@@ -3373,28 +3374,28 @@ do_standard_modes(const struct detailed_timing *timing, void *c)
  * using the appropriate standard (DMT, GTF, or CVT). Grab them from EDID and
  * add them to the list.
  */
-static int
-add_standard_modes(struct drm_connector *connector, const struct edid *edid)
+static int add_standard_modes(struct drm_connector *connector,
+			      const struct drm_edid *drm_edid)
 {
 	int i, modes = 0;
 	struct detailed_mode_closure closure = {
 		.connector = connector,
-		.edid = edid,
+		.edid = drm_edid->edid,
 	};
 
 	for (i = 0; i < EDID_STD_TIMINGS; i++) {
 		struct drm_display_mode *newmode;
 
-		newmode = drm_mode_std(connector, edid,
-				       &edid->standard_timings[i]);
+		newmode = drm_mode_std(connector, drm_edid->edid,
+				       &drm_edid->edid->standard_timings[i]);
 		if (newmode) {
 			drm_mode_probed_add(connector, newmode);
 			modes++;
 		}
 	}
 
-	if (version_greater(edid, 1, 0))
-		drm_for_each_detailed_block(edid, do_standard_modes,
+	if (version_greater(drm_edid->edid, 1, 0))
+		drm_for_each_detailed_block(drm_edid->edid, do_standard_modes,
 					    &closure);
 
 	/* XXX should also look for standard codes in VTB blocks */
@@ -3466,15 +3467,15 @@ do_cvt_mode(const struct detailed_timing *timing, void *c)
 }
 
 static int
-add_cvt_modes(struct drm_connector *connector, const struct edid *edid)
+add_cvt_modes(struct drm_connector *connector, const struct drm_edid *drm_edid)
 {
 	struct detailed_mode_closure closure = {
 		.connector = connector,
-		.edid = edid,
+		.edid = drm_edid->edid,
 	};
 
-	if (version_greater(edid, 1, 2))
-		drm_for_each_detailed_block(edid, do_cvt_mode, &closure);
+	if (version_greater(drm_edid->edid, 1, 2))
+		drm_for_each_detailed_block(drm_edid->edid, do_cvt_mode, &closure);
 
 	/* XXX should also look for CVT codes in VTB blocks */
 
@@ -3519,22 +3520,21 @@ do_detailed_mode(const struct detailed_timing *timing, void *c)
  * @edid: EDID block to scan
  * @quirks: quirks to apply
  */
-static int
-add_detailed_modes(struct drm_connector *connector, const struct edid *edid,
-		   u32 quirks)
+static int add_detailed_modes(struct drm_connector *connector,
+			      const struct drm_edid *drm_edid, u32 quirks)
 {
 	struct detailed_mode_closure closure = {
 		.connector = connector,
-		.edid = edid,
+		.edid = drm_edid->edid,
 		.preferred = true,
 		.quirks = quirks,
 	};
 
-	if (closure.preferred && !version_greater(edid, 1, 3))
+	if (closure.preferred && !version_greater(drm_edid->edid, 1, 3))
 		closure.preferred =
-		    (edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING);
+		    (drm_edid->edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING);
 
-	drm_for_each_detailed_block(edid, do_detailed_mode, &closure);
+	drm_for_each_detailed_block(drm_edid->edid, do_detailed_mode, &closure);
 
 	return closure.modes;
 }
@@ -3588,7 +3588,7 @@ const u8 *drm_find_edid_extension(const struct edid *edid,
 }
 
 /* Return true if the EDID has a CTA extension or a DisplayID CTA data block */
-static bool drm_edid_has_cta_extension(const struct edid *edid)
+static bool drm_edid_has_cta_extension(const struct drm_edid *drm_edid)
 {
 	const struct displayid_block *block;
 	struct displayid_iter iter;
@@ -3596,11 +3596,11 @@ static bool drm_edid_has_cta_extension(const struct edid *edid)
 	bool found = false;
 
 	/* Look for a top level CEA extension block */
-	if (drm_find_edid_extension(edid, CEA_EXT, &ext_index))
+	if (drm_find_edid_extension(drm_edid->edid, CEA_EXT, &ext_index))
 		return true;
 
 	/* CEA blocks can also be found embedded in a DisplayID block */
-	displayid_iter_edid_begin(edid, &iter);
+	displayid_iter_edid_begin(drm_edid->edid, &iter);
 	displayid_iter_for_each(block, &iter) {
 		if (block->tag == DATA_BLOCK_CTA) {
 			found = true;
@@ -3874,8 +3874,8 @@ static bool drm_valid_hdmi_vic(u8 vic)
 	return vic > 0 && vic < ARRAY_SIZE(edid_4k_modes);
 }
 
-static int
-add_alternate_cea_modes(struct drm_connector *connector, const struct edid *edid)
+static int add_alternate_cea_modes(struct drm_connector *connector,
+				   const struct drm_edid *drm_edid)
 {
 	struct drm_device *dev = connector->dev;
 	struct drm_display_mode *mode, *tmp;
@@ -3883,7 +3883,7 @@ add_alternate_cea_modes(struct drm_connector *connector, const struct edid *edid
 	int modes = 0;
 
 	/* Don't add CTA modes if the CTA extension block is missing */
-	if (!drm_edid_has_cta_extension(edid))
+	if (!drm_edid_has_cta_extension(drm_edid))
 		return 0;
 
 	/*
@@ -4666,14 +4666,14 @@ static void drm_parse_y420cmdb_bitmap(struct drm_connector *connector,
 	hdmi->y420_cmdb_map = map;
 }
 
-static int
-add_cea_modes(struct drm_connector *connector, const struct edid *edid)
+static int add_cea_modes(struct drm_connector *connector,
+			 const struct drm_edid *drm_edid)
 {
 	const struct cea_db *db;
 	struct cea_db_iter iter;
 	int modes = 0;
 
-	cea_db_iter_edid_begin(edid, &iter);
+	cea_db_iter_edid_begin(drm_edid->edid, &iter);
 	cea_db_iter_for_each(db, &iter) {
 		const u8 *hdmi = NULL, *video = NULL;
 		u8 hdmi_len = 0, video_len = 0;
@@ -5824,13 +5824,13 @@ static int add_displayid_detailed_1_modes(struct drm_connector *connector,
 }
 
 static int add_displayid_detailed_modes(struct drm_connector *connector,
-					const struct edid *edid)
+					const struct drm_edid *drm_edid)
 {
 	const struct displayid_block *block;
 	struct displayid_iter iter;
 	int num_modes = 0;
 
-	displayid_iter_edid_begin(edid, &iter);
+	displayid_iter_edid_begin(drm_edid->edid, &iter);
 	displayid_iter_for_each(block, &iter) {
 		if (block->tag == DATA_BLOCK_TYPE_1_DETAILED_TIMING ||
 		    block->tag == DATA_BLOCK_2_TYPE_7_DETAILED_TIMING)
@@ -5844,7 +5844,6 @@ static int add_displayid_detailed_modes(struct drm_connector *connector,
 static int drm_edid_connector_update(struct drm_connector *connector,
 				     const struct drm_edid *drm_edid)
 {
-	const struct edid *edid;
 	int num_modes = 0;
 	u32 quirks;
 
@@ -5854,8 +5853,6 @@ static int drm_edid_connector_update(struct drm_connector *connector,
 		return 0;
 	}
 
-	edid = drm_edid->edid;
-
 	/*
 	 * CEA-861-F adds ycbcr capability map block, for HDMI 2.0 sinks.
 	 * To avoid multiple parsing of same block, lets parse that map
@@ -5880,15 +5877,15 @@ static int drm_edid_connector_update(struct drm_connector *connector,
 	 *
 	 * XXX order for additional mode types in extension blocks?
 	 */
-	num_modes += add_detailed_modes(connector, edid, quirks);
-	num_modes += add_cvt_modes(connector, edid);
-	num_modes += add_standard_modes(connector, edid);
-	num_modes += add_established_modes(connector, edid);
-	num_modes += add_cea_modes(connector, edid);
-	num_modes += add_alternate_cea_modes(connector, edid);
-	num_modes += add_displayid_detailed_modes(connector, edid);
-	if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)
-		num_modes += add_inferred_modes(connector, edid);
+	num_modes += add_detailed_modes(connector, drm_edid, quirks);
+	num_modes += add_cvt_modes(connector, drm_edid);
+	num_modes += add_standard_modes(connector, drm_edid);
+	num_modes += add_established_modes(connector, drm_edid);
+	num_modes += add_cea_modes(connector, drm_edid);
+	num_modes += add_alternate_cea_modes(connector, drm_edid);
+	num_modes += add_displayid_detailed_modes(connector, drm_edid);
+	if (drm_edid->edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)
+		num_modes += add_inferred_modes(connector, drm_edid);
 
 	if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75))
 		edid_fixup_preferred(connector, quirks);
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 08/25] drm/edid: convert struct detailed_mode_closure to drm_edid
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (6 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 07/25] drm/edid: convert drm_edid_connector_update() to drm_edid fully Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10  7:14   ` Nautiyal, Ankit K
  2022-05-09 12:03 ` [PATCH v2 09/25] drm/edid: convert drm_mode_detailed() " Jani Nikula
                   ` (16 subsequent siblings)
  24 siblings, 1 reply; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 27 +++++++++++++--------------
 1 file changed, 13 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index f54699422bca..c2887012add0 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -96,7 +96,7 @@ static int oui(u8 first, u8 second, u8 third)
 
 struct detailed_mode_closure {
 	struct drm_connector *connector;
-	const struct edid *edid;
+	const struct drm_edid *drm_edid;
 	bool preferred;
 	u32 quirks;
 	int modes;
@@ -3226,25 +3226,25 @@ do_inferred_modes(const struct detailed_timing *timing, void *c)
 		return;
 
 	closure->modes += drm_dmt_modes_for_range(closure->connector,
-						  closure->edid,
+						  closure->drm_edid->edid,
 						  timing);
 
-	if (!version_greater(closure->edid, 1, 1))
+	if (!version_greater(closure->drm_edid->edid, 1, 1))
 		return; /* GTF not defined yet */
 
 	switch (range->flags) {
 	case 0x02: /* secondary gtf, XXX could do more */
 	case 0x00: /* default gtf */
 		closure->modes += drm_gtf_modes_for_range(closure->connector,
-							  closure->edid,
+							  closure->drm_edid->edid,
 							  timing);
 		break;
 	case 0x04: /* cvt, only in 1.4+ */
-		if (!version_greater(closure->edid, 1, 3))
+		if (!version_greater(closure->drm_edid->edid, 1, 3))
 			break;
 
 		closure->modes += drm_cvt_modes_for_range(closure->connector,
-							  closure->edid,
+							  closure->drm_edid->edid,
 							  timing);
 		break;
 	case 0x01: /* just the ranges, no formula */
@@ -3258,7 +3258,7 @@ static int add_inferred_modes(struct drm_connector *connector,
 {
 	struct detailed_mode_closure closure = {
 		.connector = connector,
-		.edid = drm_edid->edid,
+		.drm_edid = drm_edid,
 	};
 
 	if (version_greater(drm_edid->edid, 1, 0))
@@ -3323,7 +3323,7 @@ static int add_established_modes(struct drm_connector *connector,
 	int i, modes = 0;
 	struct detailed_mode_closure closure = {
 		.connector = connector,
-		.edid = edid,
+		.drm_edid = drm_edid,
 	};
 
 	for (i = 0; i <= EDID_EST_TIMINGS; i++) {
@@ -3351,7 +3351,6 @@ do_standard_modes(const struct detailed_timing *timing, void *c)
 	struct detailed_mode_closure *closure = c;
 	const struct detailed_non_pixel *data = &timing->data.other_data;
 	struct drm_connector *connector = closure->connector;
-	const struct edid *edid = closure->edid;
 	int i;
 
 	if (!is_display_descriptor(timing, EDID_DETAIL_STD_MODES))
@@ -3361,7 +3360,7 @@ do_standard_modes(const struct detailed_timing *timing, void *c)
 		const struct std_timing *std = &data->data.timings[i];
 		struct drm_display_mode *newmode;
 
-		newmode = drm_mode_std(connector, edid, std);
+		newmode = drm_mode_std(connector, closure->drm_edid->edid, std);
 		if (newmode) {
 			drm_mode_probed_add(connector, newmode);
 			closure->modes++;
@@ -3380,7 +3379,7 @@ static int add_standard_modes(struct drm_connector *connector,
 	int i, modes = 0;
 	struct detailed_mode_closure closure = {
 		.connector = connector,
-		.edid = drm_edid->edid,
+		.drm_edid = drm_edid,
 	};
 
 	for (i = 0; i < EDID_STD_TIMINGS; i++) {
@@ -3471,7 +3470,7 @@ add_cvt_modes(struct drm_connector *connector, const struct drm_edid *drm_edid)
 {
 	struct detailed_mode_closure closure = {
 		.connector = connector,
-		.edid = drm_edid->edid,
+		.drm_edid = drm_edid,
 	};
 
 	if (version_greater(drm_edid->edid, 1, 2))
@@ -3494,7 +3493,7 @@ do_detailed_mode(const struct detailed_timing *timing, void *c)
 		return;
 
 	newmode = drm_mode_detailed(closure->connector->dev,
-				    closure->edid, timing,
+				    closure->drm_edid->edid, timing,
 				    closure->quirks);
 	if (!newmode)
 		return;
@@ -3525,7 +3524,7 @@ static int add_detailed_modes(struct drm_connector *connector,
 {
 	struct detailed_mode_closure closure = {
 		.connector = connector,
-		.edid = drm_edid->edid,
+		.drm_edid = drm_edid,
 		.preferred = true,
 		.quirks = quirks,
 	};
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 09/25] drm/edid: convert drm_mode_detailed() to drm_edid
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (7 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 08/25] drm/edid: convert struct detailed_mode_closure to drm_edid Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10  8:57   ` [Intel-gfx] " Nautiyal, Ankit K
  2022-05-09 12:03 ` [PATCH v2 10/25] drm/edid: convert drm_dmt_modes_for_range() " Jani Nikula
                   ` (15 subsequent siblings)
  24 siblings, 1 reply; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index c2887012add0..8acdb08a8571 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2928,7 +2928,7 @@ drm_mode_do_interlace_quirk(struct drm_display_mode *mode,
  * drm_display_mode.
  */
 static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev,
-						  const struct edid *edid,
+						  const struct drm_edid *drm_edid,
 						  const struct detailed_timing *timing,
 						  u32 quirks)
 {
@@ -3016,8 +3016,8 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev,
 	}
 
 	if (quirks & EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE) {
-		mode->width_mm = edid->width_cm * 10;
-		mode->height_mm = edid->height_cm * 10;
+		mode->width_mm = drm_edid->edid->width_cm * 10;
+		mode->height_mm = drm_edid->edid->height_cm * 10;
 	}
 
 	mode->type = DRM_MODE_TYPE_DRIVER;
@@ -3493,7 +3493,7 @@ do_detailed_mode(const struct detailed_timing *timing, void *c)
 		return;
 
 	newmode = drm_mode_detailed(closure->connector->dev,
-				    closure->drm_edid->edid, timing,
+				    closure->drm_edid, timing,
 				    closure->quirks);
 	if (!newmode)
 		return;
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 10/25] drm/edid: convert drm_dmt_modes_for_range() to drm_edid
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (8 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 09/25] drm/edid: convert drm_mode_detailed() " Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10  9:04   ` [Intel-gfx] " Nautiyal, Ankit K
  2022-05-09 12:03 ` [PATCH v2 11/25] drm/edid: convert drm_gtf_modes_for_range() " Jani Nikula
                   ` (14 subsequent siblings)
  24 siblings, 1 reply; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 8acdb08a8571..5d8744a7b62e 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3121,16 +3121,16 @@ static bool valid_inferred_mode(const struct drm_connector *connector,
 	return ok;
 }
 
-static int
-drm_dmt_modes_for_range(struct drm_connector *connector, const struct edid *edid,
-			const struct detailed_timing *timing)
+static int drm_dmt_modes_for_range(struct drm_connector *connector,
+				   const struct drm_edid *drm_edid,
+				   const struct detailed_timing *timing)
 {
 	int i, modes = 0;
 	struct drm_display_mode *newmode;
 	struct drm_device *dev = connector->dev;
 
 	for (i = 0; i < ARRAY_SIZE(drm_dmt_modes); i++) {
-		if (mode_in_range(drm_dmt_modes + i, edid, timing) &&
+		if (mode_in_range(drm_dmt_modes + i, drm_edid->edid, timing) &&
 		    valid_inferred_mode(connector, drm_dmt_modes + i)) {
 			newmode = drm_mode_duplicate(dev, &drm_dmt_modes[i]);
 			if (newmode) {
@@ -3226,7 +3226,7 @@ do_inferred_modes(const struct detailed_timing *timing, void *c)
 		return;
 
 	closure->modes += drm_dmt_modes_for_range(closure->connector,
-						  closure->drm_edid->edid,
+						  closure->drm_edid,
 						  timing);
 
 	if (!version_greater(closure->drm_edid->edid, 1, 1))
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 11/25] drm/edid: convert drm_gtf_modes_for_range() to drm_edid
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (9 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 10/25] drm/edid: convert drm_dmt_modes_for_range() " Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10  9:05   ` Nautiyal, Ankit K
  2022-05-09 12:03 ` [PATCH v2 12/25] drm/edid: convert drm_cvt_modes_for_range() " Jani Nikula
                   ` (13 subsequent siblings)
  24 siblings, 1 reply; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 5d8744a7b62e..037102a4d0b5 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3156,9 +3156,9 @@ void drm_mode_fixup_1366x768(struct drm_display_mode *mode)
 	}
 }
 
-static int
-drm_gtf_modes_for_range(struct drm_connector *connector, const struct edid *edid,
-			const struct detailed_timing *timing)
+static int drm_gtf_modes_for_range(struct drm_connector *connector,
+				   const struct drm_edid *drm_edid,
+				   const struct detailed_timing *timing)
 {
 	int i, modes = 0;
 	struct drm_display_mode *newmode;
@@ -3172,7 +3172,7 @@ drm_gtf_modes_for_range(struct drm_connector *connector, const struct edid *edid
 			return modes;
 
 		drm_mode_fixup_1366x768(newmode);
-		if (!mode_in_range(newmode, edid, timing) ||
+		if (!mode_in_range(newmode, drm_edid->edid, timing) ||
 		    !valid_inferred_mode(connector, newmode)) {
 			drm_mode_destroy(dev, newmode);
 			continue;
@@ -3236,7 +3236,7 @@ do_inferred_modes(const struct detailed_timing *timing, void *c)
 	case 0x02: /* secondary gtf, XXX could do more */
 	case 0x00: /* default gtf */
 		closure->modes += drm_gtf_modes_for_range(closure->connector,
-							  closure->drm_edid->edid,
+							  closure->drm_edid,
 							  timing);
 		break;
 	case 0x04: /* cvt, only in 1.4+ */
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 12/25] drm/edid: convert drm_cvt_modes_for_range() to drm_edid
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (10 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 11/25] drm/edid: convert drm_gtf_modes_for_range() " Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10  9:11   ` [Intel-gfx] " Nautiyal, Ankit K
  2022-05-09 12:03 ` [PATCH v2 13/25] drm/edid: convert drm_mode_std() and children " Jani Nikula
                   ` (12 subsequent siblings)
  24 siblings, 1 reply; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 037102a4d0b5..51d918c66a26 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3185,14 +3185,14 @@ static int drm_gtf_modes_for_range(struct drm_connector *connector,
 	return modes;
 }
 
-static int
-drm_cvt_modes_for_range(struct drm_connector *connector, const struct edid *edid,
-			const struct detailed_timing *timing)
+static int drm_cvt_modes_for_range(struct drm_connector *connector,
+				   const struct drm_edid *drm_edid,
+				   const struct detailed_timing *timing)
 {
 	int i, modes = 0;
 	struct drm_display_mode *newmode;
 	struct drm_device *dev = connector->dev;
-	bool rb = drm_monitor_supports_rb(edid);
+	bool rb = drm_monitor_supports_rb(drm_edid->edid);
 
 	for (i = 0; i < ARRAY_SIZE(extra_modes); i++) {
 		const struct minimode *m = &extra_modes[i];
@@ -3202,7 +3202,7 @@ drm_cvt_modes_for_range(struct drm_connector *connector, const struct edid *edid
 			return modes;
 
 		drm_mode_fixup_1366x768(newmode);
-		if (!mode_in_range(newmode, edid, timing) ||
+		if (!mode_in_range(newmode, drm_edid->edid, timing) ||
 		    !valid_inferred_mode(connector, newmode)) {
 			drm_mode_destroy(dev, newmode);
 			continue;
@@ -3244,7 +3244,7 @@ do_inferred_modes(const struct detailed_timing *timing, void *c)
 			break;
 
 		closure->modes += drm_cvt_modes_for_range(closure->connector,
-							  closure->drm_edid->edid,
+							  closure->drm_edid,
 							  timing);
 		break;
 	case 0x01: /* just the ranges, no formula */
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 13/25] drm/edid: convert drm_mode_std() and children to drm_edid
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (11 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 12/25] drm/edid: convert drm_cvt_modes_for_range() " Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10  9:18   ` [Intel-gfx] " Nautiyal, Ankit K
  2022-05-09 12:03 ` [PATCH v2 14/25] drm/edid: convert mode_in_range() and drm_monitor_supports_rb() " Jani Nikula
                   ` (11 subsequent siblings)
  24 siblings, 1 reply; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 52 ++++++++++++++++++++------------------
 1 file changed, 27 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 51d918c66a26..bea8f33c58ad 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2673,11 +2673,11 @@ find_gtf2(const struct detailed_timing *descriptor, void *data)
 
 /* Secondary GTF curve kicks in above some break frequency */
 static int
-drm_gtf2_hbreak(const struct edid *edid)
+drm_gtf2_hbreak(const struct drm_edid *drm_edid)
 {
 	const struct detailed_timing *descriptor = NULL;
 
-	drm_for_each_detailed_block(edid, find_gtf2, &descriptor);
+	drm_for_each_detailed_block(drm_edid->edid, find_gtf2, &descriptor);
 
 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.hfreq_start_khz) != 12);
 
@@ -2685,11 +2685,11 @@ drm_gtf2_hbreak(const struct edid *edid)
 }
 
 static int
-drm_gtf2_2c(const struct edid *edid)
+drm_gtf2_2c(const struct drm_edid *drm_edid)
 {
 	const struct detailed_timing *descriptor = NULL;
 
-	drm_for_each_detailed_block(edid, find_gtf2, &descriptor);
+	drm_for_each_detailed_block(drm_edid->edid, find_gtf2, &descriptor);
 
 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.c) != 13);
 
@@ -2697,11 +2697,11 @@ drm_gtf2_2c(const struct edid *edid)
 }
 
 static int
-drm_gtf2_m(const struct edid *edid)
+drm_gtf2_m(const struct drm_edid *drm_edid)
 {
 	const struct detailed_timing *descriptor = NULL;
 
-	drm_for_each_detailed_block(edid, find_gtf2, &descriptor);
+	drm_for_each_detailed_block(drm_edid->edid, find_gtf2, &descriptor);
 
 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.m) != 14);
 
@@ -2709,11 +2709,11 @@ drm_gtf2_m(const struct edid *edid)
 }
 
 static int
-drm_gtf2_k(const struct edid *edid)
+drm_gtf2_k(const struct drm_edid *drm_edid)
 {
 	const struct detailed_timing *descriptor = NULL;
 
-	drm_for_each_detailed_block(edid, find_gtf2, &descriptor);
+	drm_for_each_detailed_block(drm_edid->edid, find_gtf2, &descriptor);
 
 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.k) != 16);
 
@@ -2721,11 +2721,11 @@ drm_gtf2_k(const struct edid *edid)
 }
 
 static int
-drm_gtf2_2j(const struct edid *edid)
+drm_gtf2_2j(const struct drm_edid *drm_edid)
 {
 	const struct detailed_timing *descriptor = NULL;
 
-	drm_for_each_detailed_block(edid, find_gtf2, &descriptor);
+	drm_for_each_detailed_block(drm_edid->edid, find_gtf2, &descriptor);
 
 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.j) != 17);
 
@@ -2733,12 +2733,14 @@ drm_gtf2_2j(const struct edid *edid)
 }
 
 /* Get standard timing level (CVT/GTF/DMT). */
-static int standard_timing_level(const struct edid *edid)
+static int standard_timing_level(const struct drm_edid *drm_edid)
 {
+	const struct edid *edid = drm_edid->edid;
+
 	if (edid->revision >= 2) {
 		if (edid->revision >= 4 && (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF))
 			return LEVEL_CVT;
-		if (drm_gtf2_hbreak(edid))
+		if (drm_gtf2_hbreak(drm_edid))
 			return LEVEL_GTF2;
 		if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)
 			return LEVEL_GTF;
@@ -2770,9 +2772,9 @@ static int drm_mode_hsync(const struct drm_display_mode *mode)
  * Take the standard timing params (in this case width, aspect, and refresh)
  * and convert them into a real mode using CVT/GTF/DMT.
  */
-static struct drm_display_mode *
-drm_mode_std(struct drm_connector *connector, const struct edid *edid,
-	     const struct std_timing *t)
+static struct drm_display_mode *drm_mode_std(struct drm_connector *connector,
+					     const struct drm_edid *drm_edid,
+					     const struct std_timing *t)
 {
 	struct drm_device *dev = connector->dev;
 	struct drm_display_mode *m, *mode = NULL;
@@ -2782,7 +2784,7 @@ drm_mode_std(struct drm_connector *connector, const struct edid *edid,
 		>> EDID_TIMING_ASPECT_SHIFT;
 	unsigned vfreq = (t->vfreq_aspect & EDID_TIMING_VFREQ_MASK)
 		>> EDID_TIMING_VFREQ_SHIFT;
-	int timing_level = standard_timing_level(edid);
+	int timing_level = standard_timing_level(drm_edid);
 
 	if (bad_std_timing(t->hsize, t->vfreq_aspect))
 		return NULL;
@@ -2793,7 +2795,7 @@ drm_mode_std(struct drm_connector *connector, const struct edid *edid,
 	vrefresh_rate = vfreq + 60;
 	/* the vdisplay is calculated based on the aspect ratio */
 	if (aspect_ratio == 0) {
-		if (edid->revision < 3)
+		if (drm_edid->edid->revision < 3)
 			vsize = hsize;
 		else
 			vsize = (hsize * 10) / 16;
@@ -2836,7 +2838,7 @@ drm_mode_std(struct drm_connector *connector, const struct edid *edid,
 	}
 
 	/* check whether it can be found in default mode table */
-	if (drm_monitor_supports_rb(edid)) {
+	if (drm_monitor_supports_rb(drm_edid->edid)) {
 		mode = drm_mode_find_dmt(dev, hsize, vsize, vrefresh_rate,
 					 true);
 		if (mode)
@@ -2862,14 +2864,14 @@ drm_mode_std(struct drm_connector *connector, const struct edid *edid,
 		mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0);
 		if (!mode)
 			return NULL;
-		if (drm_mode_hsync(mode) > drm_gtf2_hbreak(edid)) {
+		if (drm_mode_hsync(mode) > drm_gtf2_hbreak(drm_edid)) {
 			drm_mode_destroy(dev, mode);
 			mode = drm_gtf_mode_complex(dev, hsize, vsize,
 						    vrefresh_rate, 0, 0,
-						    drm_gtf2_m(edid),
-						    drm_gtf2_2c(edid),
-						    drm_gtf2_k(edid),
-						    drm_gtf2_2j(edid));
+						    drm_gtf2_m(drm_edid),
+						    drm_gtf2_2c(drm_edid),
+						    drm_gtf2_k(drm_edid),
+						    drm_gtf2_2j(drm_edid));
 		}
 		break;
 	case LEVEL_CVT:
@@ -3360,7 +3362,7 @@ do_standard_modes(const struct detailed_timing *timing, void *c)
 		const struct std_timing *std = &data->data.timings[i];
 		struct drm_display_mode *newmode;
 
-		newmode = drm_mode_std(connector, closure->drm_edid->edid, std);
+		newmode = drm_mode_std(connector, closure->drm_edid, std);
 		if (newmode) {
 			drm_mode_probed_add(connector, newmode);
 			closure->modes++;
@@ -3385,7 +3387,7 @@ static int add_standard_modes(struct drm_connector *connector,
 	for (i = 0; i < EDID_STD_TIMINGS; i++) {
 		struct drm_display_mode *newmode;
 
-		newmode = drm_mode_std(connector, drm_edid->edid,
+		newmode = drm_mode_std(connector, drm_edid,
 				       &drm_edid->edid->standard_timings[i]);
 		if (newmode) {
 			drm_mode_probed_add(connector, newmode);
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 14/25] drm/edid: convert mode_in_range() and drm_monitor_supports_rb() to drm_edid
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (12 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 13/25] drm/edid: convert drm_mode_std() and children " Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10  9:22   ` [Intel-gfx] " Nautiyal, Ankit K
  2022-05-09 12:03 ` [PATCH v2 15/25] drm/edid: convert get_monitor_name() " Jani Nikula
                   ` (10 subsequent siblings)
  24 siblings, 1 reply; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 27 ++++++++++++++-------------
 1 file changed, 14 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index bea8f33c58ad..364949e146a9 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2645,16 +2645,16 @@ is_rb(const struct detailed_timing *descriptor, void *data)
 
 /* EDID 1.4 defines this explicitly.  For EDID 1.3, we guess, badly. */
 static bool
-drm_monitor_supports_rb(const struct edid *edid)
+drm_monitor_supports_rb(const struct drm_edid *drm_edid)
 {
-	if (edid->revision >= 4) {
+	if (drm_edid->edid->revision >= 4) {
 		bool ret = false;
 
-		drm_for_each_detailed_block(edid, is_rb, &ret);
+		drm_for_each_detailed_block(drm_edid->edid, is_rb, &ret);
 		return ret;
 	}
 
-	return ((edid->input & DRM_EDID_INPUT_DIGITAL) != 0);
+	return ((drm_edid->edid->input & DRM_EDID_INPUT_DIGITAL) != 0);
 }
 
 static void
@@ -2838,7 +2838,7 @@ static struct drm_display_mode *drm_mode_std(struct drm_connector *connector,
 	}
 
 	/* check whether it can be found in default mode table */
-	if (drm_monitor_supports_rb(drm_edid->edid)) {
+	if (drm_monitor_supports_rb(drm_edid)) {
 		mode = drm_mode_find_dmt(dev, hsize, vsize, vrefresh_rate,
 					 true);
 		if (mode)
@@ -3077,10 +3077,11 @@ range_pixel_clock(const struct edid *edid, const u8 *t)
 	return t[9] * 10000 + 5001;
 }
 
-static bool
-mode_in_range(const struct drm_display_mode *mode, const struct edid *edid,
-	      const struct detailed_timing *timing)
+static bool mode_in_range(const struct drm_display_mode *mode,
+			  const struct drm_edid *drm_edid,
+			  const struct detailed_timing *timing)
 {
+	const struct edid *edid = drm_edid->edid;
 	u32 max_clock;
 	const u8 *t = (const u8 *)timing;
 
@@ -3099,7 +3100,7 @@ mode_in_range(const struct drm_display_mode *mode, const struct edid *edid,
 		if (t[13] && mode->hdisplay > 8 * (t[13] + (256 * (t[12]&0x3))))
 			return false;
 
-	if (mode_is_rb(mode) && !drm_monitor_supports_rb(edid))
+	if (mode_is_rb(mode) && !drm_monitor_supports_rb(drm_edid))
 		return false;
 
 	return true;
@@ -3132,7 +3133,7 @@ static int drm_dmt_modes_for_range(struct drm_connector *connector,
 	struct drm_device *dev = connector->dev;
 
 	for (i = 0; i < ARRAY_SIZE(drm_dmt_modes); i++) {
-		if (mode_in_range(drm_dmt_modes + i, drm_edid->edid, timing) &&
+		if (mode_in_range(drm_dmt_modes + i, drm_edid, timing) &&
 		    valid_inferred_mode(connector, drm_dmt_modes + i)) {
 			newmode = drm_mode_duplicate(dev, &drm_dmt_modes[i]);
 			if (newmode) {
@@ -3174,7 +3175,7 @@ static int drm_gtf_modes_for_range(struct drm_connector *connector,
 			return modes;
 
 		drm_mode_fixup_1366x768(newmode);
-		if (!mode_in_range(newmode, drm_edid->edid, timing) ||
+		if (!mode_in_range(newmode, drm_edid, timing) ||
 		    !valid_inferred_mode(connector, newmode)) {
 			drm_mode_destroy(dev, newmode);
 			continue;
@@ -3194,7 +3195,7 @@ static int drm_cvt_modes_for_range(struct drm_connector *connector,
 	int i, modes = 0;
 	struct drm_display_mode *newmode;
 	struct drm_device *dev = connector->dev;
-	bool rb = drm_monitor_supports_rb(drm_edid->edid);
+	bool rb = drm_monitor_supports_rb(drm_edid);
 
 	for (i = 0; i < ARRAY_SIZE(extra_modes); i++) {
 		const struct minimode *m = &extra_modes[i];
@@ -3204,7 +3205,7 @@ static int drm_cvt_modes_for_range(struct drm_connector *connector,
 			return modes;
 
 		drm_mode_fixup_1366x768(newmode);
-		if (!mode_in_range(newmode, drm_edid->edid, timing) ||
+		if (!mode_in_range(newmode, drm_edid, timing) ||
 		    !valid_inferred_mode(connector, newmode)) {
 			drm_mode_destroy(dev, newmode);
 			continue;
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 15/25] drm/edid: convert get_monitor_name() to drm_edid
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (13 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 14/25] drm/edid: convert mode_in_range() and drm_monitor_supports_rb() " Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10  9:29   ` Nautiyal, Ankit K
  2022-05-09 12:03 ` [PATCH v2 16/25] drm/edid: convert drm_for_each_detailed_block() " Jani Nikula
                   ` (9 subsequent siblings)
  24 siblings, 1 reply; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere.

v2: Drop incorrect NULL name check (Dan Carpenter)

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 364949e146a9..e3ff0f31a614 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -4830,15 +4830,15 @@ monitor_name(const struct detailed_timing *timing, void *data)
 	*res = timing->data.other_data.data.str.str;
 }
 
-static int get_monitor_name(const struct edid *edid, char name[13])
+static int get_monitor_name(const struct drm_edid *drm_edid, char name[13])
 {
 	const char *edid_name = NULL;
 	int mnl;
 
-	if (!edid || !name)
+	if (!drm_edid || !name)
 		return 0;
 
-	drm_for_each_detailed_block(edid, monitor_name, &edid_name);
+	drm_for_each_detailed_block(drm_edid->edid, monitor_name, &edid_name);
 	for (mnl = 0; edid_name && mnl < 13; mnl++) {
 		if (edid_name[mnl] == 0x0a)
 			break;
@@ -4858,14 +4858,22 @@ static int get_monitor_name(const struct edid *edid, char name[13])
  */
 void drm_edid_get_monitor_name(const struct edid *edid, char *name, int bufsize)
 {
-	int name_length;
-	char buf[13];
+	int name_length = 0;
 
 	if (bufsize <= 0)
 		return;
 
-	name_length = min(get_monitor_name(edid, buf), bufsize - 1);
-	memcpy(name, buf, name_length);
+	if (edid) {
+		char buf[13];
+		struct drm_edid drm_edid = {
+			.edid = edid,
+			.size = edid_size(edid),
+		};
+
+		name_length = min(get_monitor_name(&drm_edid, buf), bufsize - 1);
+		memcpy(name, buf, name_length);
+	}
+
 	name[name_length] = '\0';
 }
 EXPORT_SYMBOL(drm_edid_get_monitor_name);
@@ -4905,7 +4913,7 @@ static void drm_edid_to_eld(struct drm_connector *connector,
 	if (!drm_edid)
 		return;
 
-	mnl = get_monitor_name(drm_edid->edid, &eld[DRM_ELD_MONITOR_NAME_STRING]);
+	mnl = get_monitor_name(drm_edid, &eld[DRM_ELD_MONITOR_NAME_STRING]);
 	DRM_DEBUG_KMS("ELD monitor %s\n", &eld[DRM_ELD_MONITOR_NAME_STRING]);
 
 	eld[DRM_ELD_CEA_EDID_VER_MNL] = info->cea_rev << DRM_ELD_CEA_EDID_VER_SHIFT;
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 16/25] drm/edid: convert drm_for_each_detailed_block() to drm_edid
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (14 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 15/25] drm/edid: convert get_monitor_name() " Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10  9:36   ` Nautiyal, Ankit K
  2022-05-09 12:03 ` [PATCH v2 17/25] drm/edid: add drm_edid helper for drm_edid_to_sad() Jani Nikula
                   ` (8 subsequent siblings)
  24 siblings, 1 reply; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere.

v2: Fix checkpatch warning on superfluous parens

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 36 ++++++++++++++++++------------------
 1 file changed, 18 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index e3ff0f31a614..61551ce0db88 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2598,20 +2598,20 @@ vtb_for_each_detailed_block(const u8 *ext, detailed_cb *cb, void *closure)
 		cb((const struct detailed_timing *)(det_base + 18 * i), closure);
 }
 
-static void
-drm_for_each_detailed_block(const struct edid *edid, detailed_cb *cb, void *closure)
+static void drm_for_each_detailed_block(const struct drm_edid *drm_edid,
+					detailed_cb *cb, void *closure)
 {
 	struct drm_edid_iter edid_iter;
 	const u8 *ext;
 	int i;
 
-	if (edid == NULL)
+	if (!drm_edid)
 		return;
 
 	for (i = 0; i < EDID_DETAILED_TIMINGS; i++)
-		cb(&(edid->detailed_timings[i]), closure);
+		cb(&drm_edid->edid->detailed_timings[i], closure);
 
-	drm_edid_iter_begin(edid, &edid_iter);
+	drm_edid_iter_begin(drm_edid->edid, &edid_iter);
 	drm_edid_iter_for_each(ext, &edid_iter) {
 		switch (*ext) {
 		case CEA_EXT:
@@ -2650,7 +2650,7 @@ drm_monitor_supports_rb(const struct drm_edid *drm_edid)
 	if (drm_edid->edid->revision >= 4) {
 		bool ret = false;
 
-		drm_for_each_detailed_block(drm_edid->edid, is_rb, &ret);
+		drm_for_each_detailed_block(drm_edid, is_rb, &ret);
 		return ret;
 	}
 
@@ -2677,7 +2677,7 @@ drm_gtf2_hbreak(const struct drm_edid *drm_edid)
 {
 	const struct detailed_timing *descriptor = NULL;
 
-	drm_for_each_detailed_block(drm_edid->edid, find_gtf2, &descriptor);
+	drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
 
 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.hfreq_start_khz) != 12);
 
@@ -2689,7 +2689,7 @@ drm_gtf2_2c(const struct drm_edid *drm_edid)
 {
 	const struct detailed_timing *descriptor = NULL;
 
-	drm_for_each_detailed_block(drm_edid->edid, find_gtf2, &descriptor);
+	drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
 
 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.c) != 13);
 
@@ -2701,7 +2701,7 @@ drm_gtf2_m(const struct drm_edid *drm_edid)
 {
 	const struct detailed_timing *descriptor = NULL;
 
-	drm_for_each_detailed_block(drm_edid->edid, find_gtf2, &descriptor);
+	drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
 
 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.m) != 14);
 
@@ -2713,7 +2713,7 @@ drm_gtf2_k(const struct drm_edid *drm_edid)
 {
 	const struct detailed_timing *descriptor = NULL;
 
-	drm_for_each_detailed_block(drm_edid->edid, find_gtf2, &descriptor);
+	drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
 
 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.k) != 16);
 
@@ -2725,7 +2725,7 @@ drm_gtf2_2j(const struct drm_edid *drm_edid)
 {
 	const struct detailed_timing *descriptor = NULL;
 
-	drm_for_each_detailed_block(drm_edid->edid, find_gtf2, &descriptor);
+	drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
 
 	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.j) != 17);
 
@@ -3265,7 +3265,7 @@ static int add_inferred_modes(struct drm_connector *connector,
 	};
 
 	if (version_greater(drm_edid->edid, 1, 0))
-		drm_for_each_detailed_block(drm_edid->edid, do_inferred_modes, &closure);
+		drm_for_each_detailed_block(drm_edid, do_inferred_modes, &closure);
 
 	return closure.modes;
 }
@@ -3342,7 +3342,7 @@ static int add_established_modes(struct drm_connector *connector,
 	}
 
 	if (version_greater(edid, 1, 0))
-		drm_for_each_detailed_block(drm_edid->edid, do_established_modes,
+		drm_for_each_detailed_block(drm_edid, do_established_modes,
 					    &closure);
 
 	return modes + closure.modes;
@@ -3397,7 +3397,7 @@ static int add_standard_modes(struct drm_connector *connector,
 	}
 
 	if (version_greater(drm_edid->edid, 1, 0))
-		drm_for_each_detailed_block(drm_edid->edid, do_standard_modes,
+		drm_for_each_detailed_block(drm_edid, do_standard_modes,
 					    &closure);
 
 	/* XXX should also look for standard codes in VTB blocks */
@@ -3477,7 +3477,7 @@ add_cvt_modes(struct drm_connector *connector, const struct drm_edid *drm_edid)
 	};
 
 	if (version_greater(drm_edid->edid, 1, 2))
-		drm_for_each_detailed_block(drm_edid->edid, do_cvt_mode, &closure);
+		drm_for_each_detailed_block(drm_edid, do_cvt_mode, &closure);
 
 	/* XXX should also look for CVT codes in VTB blocks */
 
@@ -3536,7 +3536,7 @@ static int add_detailed_modes(struct drm_connector *connector,
 		closure.preferred =
 		    (drm_edid->edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING);
 
-	drm_for_each_detailed_block(drm_edid->edid, do_detailed_mode, &closure);
+	drm_for_each_detailed_block(drm_edid, do_detailed_mode, &closure);
 
 	return closure.modes;
 }
@@ -4838,7 +4838,7 @@ static int get_monitor_name(const struct drm_edid *drm_edid, char name[13])
 	if (!drm_edid || !name)
 		return 0;
 
-	drm_for_each_detailed_block(drm_edid->edid, monitor_name, &edid_name);
+	drm_for_each_detailed_block(drm_edid, monitor_name, &edid_name);
 	for (mnl = 0; edid_name && mnl < 13; mnl++) {
 		if (edid_name[mnl] == 0x0a)
 			break;
@@ -5559,7 +5559,7 @@ static void drm_get_monitor_range(struct drm_connector *connector,
 	if (!version_greater(drm_edid->edid, 1, 1))
 		return;
 
-	drm_for_each_detailed_block(drm_edid->edid, get_monitor_range,
+	drm_for_each_detailed_block(drm_edid, get_monitor_range,
 				    &info->monitor_range);
 
 	DRM_DEBUG_KMS("Supported Monitor Refresh rate range is %d Hz - %d Hz\n",
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 17/25] drm/edid: add drm_edid helper for drm_edid_to_sad()
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (15 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 16/25] drm/edid: convert drm_for_each_detailed_block() " Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10  9:55   ` Nautiyal, Ankit K
  2022-05-09 12:03 ` [PATCH v2 18/25] drm/edid: add drm_edid helper for drm_edid_to_speaker_allocation() Jani Nikula
                   ` (7 subsequent siblings)
  24 siblings, 1 reply; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere.

v2: Handle NULL EDID pointer (Ville, CI)

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 34 +++++++++++++++++++++-------------
 1 file changed, 21 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 61551ce0db88..dee09359bbc3 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -4972,24 +4972,14 @@ static void drm_edid_to_eld(struct drm_connector *connector,
 		      drm_eld_size(eld), total_sad_count);
 }
 
-/**
- * drm_edid_to_sad - extracts SADs from EDID
- * @edid: EDID to parse
- * @sads: pointer that will be set to the extracted SADs
- *
- * Looks for CEA EDID block and extracts SADs (Short Audio Descriptors) from it.
- *
- * Note: The returned pointer needs to be freed using kfree().
- *
- * Return: The number of found SADs or negative number on error.
- */
-int drm_edid_to_sad(const struct edid *edid, struct cea_sad **sads)
+static int _drm_edid_to_sad(const struct drm_edid *drm_edid,
+			    struct cea_sad **sads)
 {
 	const struct cea_db *db;
 	struct cea_db_iter iter;
 	int count = 0;
 
-	cea_db_iter_edid_begin(edid, &iter);
+	cea_db_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter);
 	cea_db_iter_for_each(db, &iter) {
 		if (cea_db_tag(db) == CTA_DB_AUDIO) {
 			int j;
@@ -5015,6 +5005,24 @@ int drm_edid_to_sad(const struct edid *edid, struct cea_sad **sads)
 
 	return count;
 }
+
+/**
+ * drm_edid_to_sad - extracts SADs from EDID
+ * @edid: EDID to parse
+ * @sads: pointer that will be set to the extracted SADs
+ *
+ * Looks for CEA EDID block and extracts SADs (Short Audio Descriptors) from it.
+ *
+ * Note: The returned pointer needs to be freed using kfree().
+ *
+ * Return: The number of found SADs or negative number on error.
+ */
+int drm_edid_to_sad(const struct edid *edid, struct cea_sad **sads)
+{
+	struct drm_edid drm_edid;
+
+	return _drm_edid_to_sad(drm_edid_legacy_init(&drm_edid, edid), sads);
+}
 EXPORT_SYMBOL(drm_edid_to_sad);
 
 /**
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 18/25] drm/edid: add drm_edid helper for drm_edid_to_speaker_allocation()
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (16 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 17/25] drm/edid: add drm_edid helper for drm_edid_to_sad() Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10 10:08   ` [Intel-gfx] " Nautiyal, Ankit K
  2022-05-09 12:03 ` [PATCH v2 19/25] drm/edid: add drm_edid helper for drm_detect_hdmi_monitor() Jani Nikula
                   ` (6 subsequent siblings)
  24 siblings, 1 reply; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere.'

v2: Handle NULL EDID pointer (Ville, CI)

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 37 +++++++++++++++++++++++--------------
 1 file changed, 23 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index dee09359bbc3..5cc851f6d3b3 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -5025,25 +5025,14 @@ int drm_edid_to_sad(const struct edid *edid, struct cea_sad **sads)
 }
 EXPORT_SYMBOL(drm_edid_to_sad);
 
-/**
- * drm_edid_to_speaker_allocation - extracts Speaker Allocation Data Blocks from EDID
- * @edid: EDID to parse
- * @sadb: pointer to the speaker block
- *
- * Looks for CEA EDID block and extracts the Speaker Allocation Data Block from it.
- *
- * Note: The returned pointer needs to be freed using kfree().
- *
- * Return: The number of found Speaker Allocation Blocks or negative number on
- * error.
- */
-int drm_edid_to_speaker_allocation(const struct edid *edid, u8 **sadb)
+static int _drm_edid_to_speaker_allocation(const struct drm_edid *drm_edid,
+					   u8 **sadb)
 {
 	const struct cea_db *db;
 	struct cea_db_iter iter;
 	int count = 0;
 
-	cea_db_iter_edid_begin(edid, &iter);
+	cea_db_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter);
 	cea_db_iter_for_each(db, &iter) {
 		if (cea_db_tag(db) == CTA_DB_SPEAKER &&
 		    cea_db_payload_len(db) == 3) {
@@ -5061,6 +5050,26 @@ int drm_edid_to_speaker_allocation(const struct edid *edid, u8 **sadb)
 
 	return count;
 }
+
+/**
+ * drm_edid_to_speaker_allocation - extracts Speaker Allocation Data Blocks from EDID
+ * @edid: EDID to parse
+ * @sadb: pointer to the speaker block
+ *
+ * Looks for CEA EDID block and extracts the Speaker Allocation Data Block from it.
+ *
+ * Note: The returned pointer needs to be freed using kfree().
+ *
+ * Return: The number of found Speaker Allocation Blocks or negative number on
+ * error.
+ */
+int drm_edid_to_speaker_allocation(const struct edid *edid, u8 **sadb)
+{
+	struct drm_edid drm_edid;
+
+	return _drm_edid_to_speaker_allocation(drm_edid_legacy_init(&drm_edid, edid),
+					       sadb);
+}
 EXPORT_SYMBOL(drm_edid_to_speaker_allocation);
 
 /**
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 19/25] drm/edid: add drm_edid helper for drm_detect_hdmi_monitor()
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (17 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 18/25] drm/edid: add drm_edid helper for drm_edid_to_speaker_allocation() Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10 10:15   ` [Intel-gfx] " Nautiyal, Ankit K
  2022-05-09 12:03 ` [PATCH v2 20/25] drm/edid: add drm_edid helper for drm_detect_monitor_audio() Jani Nikula
                   ` (5 subsequent siblings)
  24 siblings, 1 reply; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere.

v2: Handle NULL EDID pointer (Ville, CI)

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 33 ++++++++++++++++++++-------------
 1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 5cc851f6d3b3..fc74159cd426 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -5113,18 +5113,7 @@ int drm_av_sync_delay(struct drm_connector *connector,
 }
 EXPORT_SYMBOL(drm_av_sync_delay);
 
-/**
- * drm_detect_hdmi_monitor - detect whether monitor is HDMI
- * @edid: monitor EDID information
- *
- * Parse the CEA extension according to CEA-861-B.
- *
- * Drivers that have added the modes parsed from EDID to drm_display_info
- * should use &drm_display_info.is_hdmi instead of calling this function.
- *
- * Return: True if the monitor is HDMI, false if not or unknown.
- */
-bool drm_detect_hdmi_monitor(const struct edid *edid)
+static bool _drm_detect_hdmi_monitor(const struct drm_edid *drm_edid)
 {
 	const struct cea_db *db;
 	struct cea_db_iter iter;
@@ -5134,7 +5123,7 @@ bool drm_detect_hdmi_monitor(const struct edid *edid)
 	 * Because HDMI identifier is in Vendor Specific Block,
 	 * search it from all data blocks of CEA extension.
 	 */
-	cea_db_iter_edid_begin(edid, &iter);
+	cea_db_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter);
 	cea_db_iter_for_each(db, &iter) {
 		if (cea_db_is_hdmi_vsdb(db)) {
 			hdmi = true;
@@ -5145,6 +5134,24 @@ bool drm_detect_hdmi_monitor(const struct edid *edid)
 
 	return hdmi;
 }
+
+/**
+ * drm_detect_hdmi_monitor - detect whether monitor is HDMI
+ * @edid: monitor EDID information
+ *
+ * Parse the CEA extension according to CEA-861-B.
+ *
+ * Drivers that have added the modes parsed from EDID to drm_display_info
+ * should use &drm_display_info.is_hdmi instead of calling this function.
+ *
+ * Return: True if the monitor is HDMI, false if not or unknown.
+ */
+bool drm_detect_hdmi_monitor(const struct edid *edid)
+{
+	struct drm_edid drm_edid;
+
+	return _drm_detect_hdmi_monitor(drm_edid_legacy_init(&drm_edid, edid));
+}
 EXPORT_SYMBOL(drm_detect_hdmi_monitor);
 
 /**
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 20/25] drm/edid: add drm_edid helper for drm_detect_monitor_audio()
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (18 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 19/25] drm/edid: add drm_edid helper for drm_detect_hdmi_monitor() Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10 10:17   ` [Intel-gfx] " Nautiyal, Ankit K
  2022-05-09 12:03 ` [PATCH v2 21/25] drm/edid: convert cea_db_iter_edid_begin() to drm_edid Jani Nikula
                   ` (4 subsequent siblings)
  24 siblings, 1 reply; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere.

v2: Handle NULL EDID pointer (Ville, CI)

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 37 ++++++++++++++++++++++---------------
 1 file changed, 22 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index fc74159cd426..f072cfba9dd9 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -5154,19 +5154,7 @@ bool drm_detect_hdmi_monitor(const struct edid *edid)
 }
 EXPORT_SYMBOL(drm_detect_hdmi_monitor);
 
-/**
- * drm_detect_monitor_audio - check monitor audio capability
- * @edid: EDID block to scan
- *
- * Monitor should have CEA extension block.
- * If monitor has 'basic audio', but no CEA audio blocks, it's 'basic
- * audio' only. If there is any audio extension block and supported
- * audio format, assume at least 'basic audio' support, even if 'basic
- * audio' is not defined in EDID.
- *
- * Return: True if the monitor supports audio, false otherwise.
- */
-bool drm_detect_monitor_audio(const struct edid *edid)
+static bool _drm_detect_monitor_audio(const struct drm_edid *drm_edid)
 {
 	struct drm_edid_iter edid_iter;
 	const struct cea_db *db;
@@ -5174,7 +5162,7 @@ bool drm_detect_monitor_audio(const struct edid *edid)
 	const u8 *edid_ext;
 	bool has_audio = false;
 
-	drm_edid_iter_begin(edid, &edid_iter);
+	drm_edid_iter_begin(drm_edid ? drm_edid->edid : NULL, &edid_iter);
 	drm_edid_iter_for_each(edid_ext, &edid_iter) {
 		if (edid_ext[0] == CEA_EXT) {
 			has_audio = edid_ext[3] & EDID_BASIC_AUDIO;
@@ -5189,7 +5177,7 @@ bool drm_detect_monitor_audio(const struct edid *edid)
 		goto end;
 	}
 
-	cea_db_iter_edid_begin(edid, &iter);
+	cea_db_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter);
 	cea_db_iter_for_each(db, &iter) {
 		if (cea_db_tag(db) == CTA_DB_AUDIO) {
 			const u8 *data = cea_db_data(db);
@@ -5207,6 +5195,25 @@ bool drm_detect_monitor_audio(const struct edid *edid)
 end:
 	return has_audio;
 }
+
+/**
+ * drm_detect_monitor_audio - check monitor audio capability
+ * @edid: EDID block to scan
+ *
+ * Monitor should have CEA extension block.
+ * If monitor has 'basic audio', but no CEA audio blocks, it's 'basic
+ * audio' only. If there is any audio extension block and supported
+ * audio format, assume at least 'basic audio' support, even if 'basic
+ * audio' is not defined in EDID.
+ *
+ * Return: True if the monitor supports audio, false otherwise.
+ */
+bool drm_detect_monitor_audio(const struct edid *edid)
+{
+	struct drm_edid drm_edid;
+
+	return _drm_detect_monitor_audio(drm_edid_legacy_init(&drm_edid, edid));
+}
 EXPORT_SYMBOL(drm_detect_monitor_audio);
 
 
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 21/25] drm/edid: convert cea_db_iter_edid_begin() to drm_edid
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (19 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 20/25] drm/edid: add drm_edid helper for drm_detect_monitor_audio() Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10 10:21   ` Nautiyal, Ankit K
  2022-05-09 12:03 ` [PATCH v2 22/25] drm/edid: convert drm_edid_iter_begin() " Jani Nikula
                   ` (3 subsequent siblings)
  24 siblings, 1 reply; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere.

v2: Handle NULL drm_edid

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index f072cfba9dd9..bd14010ed1c5 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -4448,12 +4448,13 @@ static bool cea_db_is_vendor(const struct cea_db *db, int vendor_oui)
 		oui(data[2], data[1], data[0]) == vendor_oui;
 }
 
-static void cea_db_iter_edid_begin(const struct edid *edid, struct cea_db_iter *iter)
+static void cea_db_iter_edid_begin(const struct drm_edid *drm_edid,
+				   struct cea_db_iter *iter)
 {
 	memset(iter, 0, sizeof(*iter));
 
-	drm_edid_iter_begin(edid, &iter->edid_iter);
-	displayid_iter_edid_begin(edid, &iter->displayid_iter);
+	drm_edid_iter_begin(drm_edid ? drm_edid->edid : NULL, &iter->edid_iter);
+	displayid_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter->displayid_iter);
 }
 
 static const struct cea_db *
@@ -4675,7 +4676,7 @@ static int add_cea_modes(struct drm_connector *connector,
 	struct cea_db_iter iter;
 	int modes = 0;
 
-	cea_db_iter_edid_begin(drm_edid->edid, &iter);
+	cea_db_iter_edid_begin(drm_edid, &iter);
 	cea_db_iter_for_each(db, &iter) {
 		const u8 *hdmi = NULL, *video = NULL;
 		u8 hdmi_len = 0, video_len = 0;
@@ -4926,7 +4927,7 @@ static void drm_edid_to_eld(struct drm_connector *connector,
 	eld[DRM_ELD_PRODUCT_CODE0] = drm_edid->edid->prod_code[0];
 	eld[DRM_ELD_PRODUCT_CODE1] = drm_edid->edid->prod_code[1];
 
-	cea_db_iter_edid_begin(drm_edid->edid, &iter);
+	cea_db_iter_edid_begin(drm_edid, &iter);
 	cea_db_iter_for_each(db, &iter) {
 		const u8 *data = cea_db_data(db);
 		int len = cea_db_payload_len(db);
@@ -4979,7 +4980,7 @@ static int _drm_edid_to_sad(const struct drm_edid *drm_edid,
 	struct cea_db_iter iter;
 	int count = 0;
 
-	cea_db_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter);
+	cea_db_iter_edid_begin(drm_edid, &iter);
 	cea_db_iter_for_each(db, &iter) {
 		if (cea_db_tag(db) == CTA_DB_AUDIO) {
 			int j;
@@ -5032,7 +5033,7 @@ static int _drm_edid_to_speaker_allocation(const struct drm_edid *drm_edid,
 	struct cea_db_iter iter;
 	int count = 0;
 
-	cea_db_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter);
+	cea_db_iter_edid_begin(drm_edid, &iter);
 	cea_db_iter_for_each(db, &iter) {
 		if (cea_db_tag(db) == CTA_DB_SPEAKER &&
 		    cea_db_payload_len(db) == 3) {
@@ -5123,7 +5124,7 @@ static bool _drm_detect_hdmi_monitor(const struct drm_edid *drm_edid)
 	 * Because HDMI identifier is in Vendor Specific Block,
 	 * search it from all data blocks of CEA extension.
 	 */
-	cea_db_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter);
+	cea_db_iter_edid_begin(drm_edid, &iter);
 	cea_db_iter_for_each(db, &iter) {
 		if (cea_db_is_hdmi_vsdb(db)) {
 			hdmi = true;
@@ -5177,7 +5178,7 @@ static bool _drm_detect_monitor_audio(const struct drm_edid *drm_edid)
 		goto end;
 	}
 
-	cea_db_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter);
+	cea_db_iter_edid_begin(drm_edid, &iter);
 	cea_db_iter_for_each(db, &iter) {
 		if (cea_db_tag(db) == CTA_DB_AUDIO) {
 			const u8 *data = cea_db_data(db);
@@ -5536,7 +5537,7 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
 	}
 	drm_edid_iter_end(&edid_iter);
 
-	cea_db_iter_edid_begin(drm_edid->edid, &iter);
+	cea_db_iter_edid_begin(drm_edid, &iter);
 	cea_db_iter_for_each(db, &iter) {
 		/* FIXME: convert parsers to use struct cea_db */
 		const u8 *data = (const u8 *)db;
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 22/25] drm/edid: convert drm_edid_iter_begin() to drm_edid
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (20 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 21/25] drm/edid: convert cea_db_iter_edid_begin() to drm_edid Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10 10:25   ` Nautiyal, Ankit K
  2022-05-09 12:03 ` [PATCH v2 23/25] drm/edid: add drm_edid helper for drm_update_tile_info() Jani Nikula
                   ` (2 subsequent siblings)
  24 siblings, 1 reply; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere.

v2: Rebase

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 22 +++++++++++-----------
 1 file changed, 11 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index bd14010ed1c5..d857d1d74c82 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1632,36 +1632,36 @@ static const struct drm_edid *drm_edid_legacy_init(struct drm_edid *drm_edid,
  * struct drm_edid_iter iter;
  * const u8 *block;
  *
- * drm_edid_iter_begin(edid, &iter);
+ * drm_edid_iter_begin(drm_edid, &iter);
  * drm_edid_iter_for_each(block, &iter) {
  *         // do stuff with block
  * }
  * drm_edid_iter_end(&iter);
  */
 struct drm_edid_iter {
-	const struct edid *edid;
+	const struct drm_edid *drm_edid;
 
 	/* Current block index. */
 	int index;
 };
 
-static void drm_edid_iter_begin(const struct edid *edid,
+static void drm_edid_iter_begin(const struct drm_edid *drm_edid,
 				struct drm_edid_iter *iter)
 {
 	memset(iter, 0, sizeof(*iter));
 
-	iter->edid = edid;
+	iter->drm_edid = drm_edid;
 }
 
 static const void *__drm_edid_iter_next(struct drm_edid_iter *iter)
 {
 	const void *block = NULL;
 
-	if (!iter->edid)
+	if (!iter->drm_edid)
 		return NULL;
 
-	if (iter->index < edid_block_count(iter->edid))
-		block = edid_block_data(iter->edid, iter->index++);
+	if (iter->index < edid_block_count(iter->drm_edid->edid))
+		block = edid_block_data(iter->drm_edid->edid, iter->index++);
 
 	return block;
 }
@@ -2611,7 +2611,7 @@ static void drm_for_each_detailed_block(const struct drm_edid *drm_edid,
 	for (i = 0; i < EDID_DETAILED_TIMINGS; i++)
 		cb(&drm_edid->edid->detailed_timings[i], closure);
 
-	drm_edid_iter_begin(drm_edid->edid, &edid_iter);
+	drm_edid_iter_begin(drm_edid, &edid_iter);
 	drm_edid_iter_for_each(ext, &edid_iter) {
 		switch (*ext) {
 		case CEA_EXT:
@@ -4453,7 +4453,7 @@ static void cea_db_iter_edid_begin(const struct drm_edid *drm_edid,
 {
 	memset(iter, 0, sizeof(*iter));
 
-	drm_edid_iter_begin(drm_edid ? drm_edid->edid : NULL, &iter->edid_iter);
+	drm_edid_iter_begin(drm_edid, &iter->edid_iter);
 	displayid_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter->displayid_iter);
 }
 
@@ -5163,7 +5163,7 @@ static bool _drm_detect_monitor_audio(const struct drm_edid *drm_edid)
 	const u8 *edid_ext;
 	bool has_audio = false;
 
-	drm_edid_iter_begin(drm_edid ? drm_edid->edid : NULL, &edid_iter);
+	drm_edid_iter_begin(drm_edid, &edid_iter);
 	drm_edid_iter_for_each(edid_ext, &edid_iter) {
 		if (edid_ext[0] == CEA_EXT) {
 			has_audio = edid_ext[3] & EDID_BASIC_AUDIO;
@@ -5516,7 +5516,7 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
 	struct cea_db_iter iter;
 	const u8 *edid_ext;
 
-	drm_edid_iter_begin(drm_edid->edid, &edid_iter);
+	drm_edid_iter_begin(drm_edid, &edid_iter);
 	drm_edid_iter_for_each(edid_ext, &edid_iter) {
 		if (edid_ext[0] != CEA_EXT)
 			continue;
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 23/25] drm/edid: add drm_edid helper for drm_update_tile_info()
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (21 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 22/25] drm/edid: convert drm_edid_iter_begin() " Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10 10:28   ` [Intel-gfx] " Nautiyal, Ankit K
  2022-05-09 12:03 ` [PATCH v2 24/25] drm/displayid: convert to drm_edid Jani Nikula
  2022-05-09 12:03 ` [PATCH v2 25/25] drm/edid: convert version_greater() " Jani Nikula
  24 siblings, 1 reply; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere.

v2: Handle NULL EDID pointer (Ville, CI)

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index d857d1d74c82..26ac4d262e31 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -6364,15 +6364,15 @@ static void drm_parse_tiled_block(struct drm_connector *connector,
 	}
 }
 
-void drm_update_tile_info(struct drm_connector *connector,
-			  const struct edid *edid)
+static void _drm_update_tile_info(struct drm_connector *connector,
+				  const struct drm_edid *drm_edid)
 {
 	const struct displayid_block *block;
 	struct displayid_iter iter;
 
 	connector->has_tile = false;
 
-	displayid_iter_edid_begin(edid, &iter);
+	displayid_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter);
 	displayid_iter_for_each(block, &iter) {
 		if (block->tag == DATA_BLOCK_TILED_DISPLAY)
 			drm_parse_tiled_block(connector, block);
@@ -6384,3 +6384,11 @@ void drm_update_tile_info(struct drm_connector *connector,
 		connector->tile_group = NULL;
 	}
 }
+
+void drm_update_tile_info(struct drm_connector *connector,
+			  const struct edid *edid)
+{
+	struct drm_edid drm_edid;
+
+	_drm_update_tile_info(connector, drm_edid_legacy_init(&drm_edid, edid));
+}
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 24/25] drm/displayid: convert to drm_edid
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (22 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 23/25] drm/edid: add drm_edid helper for drm_update_tile_info() Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10 12:04   ` Nautiyal, Ankit K
  2022-05-09 12:03 ` [PATCH v2 25/25] drm/edid: convert version_greater() " Jani Nikula
  24 siblings, 1 reply; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere.

v2: Rebase

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_displayid.c | 16 ++++++++--------
 drivers/gpu/drm/drm_edid.c      | 17 ++++++++++-------
 include/drm/drm_displayid.h     |  6 +++---
 include/drm/drm_edid.h          |  6 ++++--
 4 files changed, 25 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/drm_displayid.c b/drivers/gpu/drm/drm_displayid.c
index 32da557b960f..38ea8203df45 100644
--- a/drivers/gpu/drm/drm_displayid.c
+++ b/drivers/gpu/drm/drm_displayid.c
@@ -33,11 +33,11 @@ static int validate_displayid(const u8 *displayid, int length, int idx)
 	return 0;
 }
 
-static const u8 *drm_find_displayid_extension(const struct edid *edid,
+static const u8 *drm_find_displayid_extension(const struct drm_edid *drm_edid,
 					      int *length, int *idx,
 					      int *ext_index)
 {
-	const u8 *displayid = drm_find_edid_extension(edid, DISPLAYID_EXT, ext_index);
+	const u8 *displayid = drm_find_edid_extension(drm_edid, DISPLAYID_EXT, ext_index);
 	const struct displayid_header *base;
 	int ret;
 
@@ -58,12 +58,12 @@ static const u8 *drm_find_displayid_extension(const struct edid *edid,
 	return displayid;
 }
 
-void displayid_iter_edid_begin(const struct edid *edid,
+void displayid_iter_edid_begin(const struct drm_edid *drm_edid,
 			       struct displayid_iter *iter)
 {
 	memset(iter, 0, sizeof(*iter));
 
-	iter->edid = edid;
+	iter->drm_edid = drm_edid;
 }
 
 static const struct displayid_block *
@@ -88,7 +88,7 @@ __displayid_iter_next(struct displayid_iter *iter)
 {
 	const struct displayid_block *block;
 
-	if (!iter->edid)
+	if (!iter->drm_edid)
 		return NULL;
 
 	if (iter->section) {
@@ -96,7 +96,7 @@ __displayid_iter_next(struct displayid_iter *iter)
 		block = displayid_iter_block(iter);
 		if (WARN_ON(!block)) {
 			iter->section = NULL;
-			iter->edid = NULL;
+			iter->drm_edid = NULL;
 			return NULL;
 		}
 
@@ -109,12 +109,12 @@ __displayid_iter_next(struct displayid_iter *iter)
 	}
 
 	for (;;) {
-		iter->section = drm_find_displayid_extension(iter->edid,
+		iter->section = drm_find_displayid_extension(iter->drm_edid,
 							     &iter->length,
 							     &iter->idx,
 							     &iter->ext_index);
 		if (!iter->section) {
-			iter->edid = NULL;
+			iter->drm_edid = NULL;
 			return NULL;
 		}
 
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 26ac4d262e31..a44818f44718 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3563,10 +3563,13 @@ static int add_detailed_modes(struct drm_connector *connector,
 
 /*
  * Search EDID for CEA extension block.
+ *
+ * FIXME: Prefer not returning pointers to raw EDID data.
  */
-const u8 *drm_find_edid_extension(const struct edid *edid,
+const u8 *drm_find_edid_extension(const struct drm_edid *drm_edid,
 				  int ext_id, int *ext_index)
 {
+	const struct edid *edid = drm_edid ? drm_edid->edid : NULL;
 	const u8 *edid_ext = NULL;
 	int i;
 
@@ -3598,11 +3601,11 @@ static bool drm_edid_has_cta_extension(const struct drm_edid *drm_edid)
 	bool found = false;
 
 	/* Look for a top level CEA extension block */
-	if (drm_find_edid_extension(drm_edid->edid, CEA_EXT, &ext_index))
+	if (drm_find_edid_extension(drm_edid, CEA_EXT, &ext_index))
 		return true;
 
 	/* CEA blocks can also be found embedded in a DisplayID block */
-	displayid_iter_edid_begin(drm_edid->edid, &iter);
+	displayid_iter_edid_begin(drm_edid, &iter);
 	displayid_iter_for_each(block, &iter) {
 		if (block->tag == DATA_BLOCK_CTA) {
 			found = true;
@@ -4454,7 +4457,7 @@ static void cea_db_iter_edid_begin(const struct drm_edid *drm_edid,
 	memset(iter, 0, sizeof(*iter));
 
 	drm_edid_iter_begin(drm_edid, &iter->edid_iter);
-	displayid_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter->displayid_iter);
+	displayid_iter_edid_begin(drm_edid, &iter->displayid_iter);
 }
 
 static const struct cea_db *
@@ -5657,7 +5660,7 @@ static void drm_update_mso(struct drm_connector *connector,
 	const struct displayid_block *block;
 	struct displayid_iter iter;
 
-	displayid_iter_edid_begin(drm_edid->edid, &iter);
+	displayid_iter_edid_begin(drm_edid, &iter);
 	displayid_iter_for_each(block, &iter) {
 		if (block->tag == DATA_BLOCK_2_VENDOR_SPECIFIC)
 			drm_parse_vesa_mso_data(connector, block);
@@ -5872,7 +5875,7 @@ static int add_displayid_detailed_modes(struct drm_connector *connector,
 	struct displayid_iter iter;
 	int num_modes = 0;
 
-	displayid_iter_edid_begin(drm_edid->edid, &iter);
+	displayid_iter_edid_begin(drm_edid, &iter);
 	displayid_iter_for_each(block, &iter) {
 		if (block->tag == DATA_BLOCK_TYPE_1_DETAILED_TIMING ||
 		    block->tag == DATA_BLOCK_2_TYPE_7_DETAILED_TIMING)
@@ -6372,7 +6375,7 @@ static void _drm_update_tile_info(struct drm_connector *connector,
 
 	connector->has_tile = false;
 
-	displayid_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter);
+	displayid_iter_edid_begin(drm_edid, &iter);
 	displayid_iter_for_each(block, &iter) {
 		if (block->tag == DATA_BLOCK_TILED_DISPLAY)
 			drm_parse_tiled_block(connector, block);
diff --git a/include/drm/drm_displayid.h b/include/drm/drm_displayid.h
index 7ffbd9f7bfc7..49649eb8447e 100644
--- a/include/drm/drm_displayid.h
+++ b/include/drm/drm_displayid.h
@@ -25,7 +25,7 @@
 #include <linux/types.h>
 #include <linux/bits.h>
 
-struct edid;
+struct drm_edid;
 
 #define VESA_IEEE_OUI				0x3a0292
 
@@ -141,7 +141,7 @@ struct displayid_vesa_vendor_specific_block {
 
 /* DisplayID iteration */
 struct displayid_iter {
-	const struct edid *edid;
+	const struct drm_edid *drm_edid;
 
 	const u8 *section;
 	int length;
@@ -149,7 +149,7 @@ struct displayid_iter {
 	int ext_index;
 };
 
-void displayid_iter_edid_begin(const struct edid *edid,
+void displayid_iter_edid_begin(const struct drm_edid *drm_edid,
 			       struct displayid_iter *iter);
 const struct displayid_block *
 __displayid_iter_next(struct displayid_iter *iter);
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
index c3204a58fb09..c61e75ab8f63 100644
--- a/include/drm/drm_edid.h
+++ b/include/drm/drm_edid.h
@@ -28,6 +28,7 @@
 #include <drm/drm_mode.h>
 
 struct drm_device;
+struct drm_edid;
 struct i2c_adapter;
 
 #define EDID_LENGTH 128
@@ -578,8 +579,9 @@ struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev,
 struct drm_display_mode *
 drm_display_mode_from_cea_vic(struct drm_device *dev,
 			      u8 video_code);
-const u8 *drm_find_edid_extension(const struct edid *edid,
-				  int ext_id, int *ext_index);
 
+/* Interface based on struct drm_edid */
+const u8 *drm_find_edid_extension(const struct drm_edid *drm_edid,
+				  int ext_id, int *ext_index);
 
 #endif /* __DRM_EDID_H__ */
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v2 25/25] drm/edid: convert version_greater() to drm_edid
  2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
                   ` (23 preceding siblings ...)
  2022-05-09 12:03 ` [PATCH v2 24/25] drm/displayid: convert to drm_edid Jani Nikula
@ 2022-05-09 12:03 ` Jani Nikula
  2022-05-10 12:07   ` Nautiyal, Ankit K
  24 siblings, 1 reply; 53+ messages in thread
From: Jani Nikula @ 2022-05-09 12:03 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll need to propagate drm_edid everywhere. Also make version_greater()
a function for type safety.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 29 +++++++++++++++++------------
 1 file changed, 17 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index a44818f44718..429078bcf372 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -45,10 +45,6 @@
 
 #include "drm_crtc_internal.h"
 
-#define version_greater(edid, maj, min) \
-	(((edid)->version > (maj)) || \
-	 ((edid)->version == (maj) && (edid)->revision > (min)))
-
 static int oui(u8 first, u8 second, u8 third)
 {
 	return (first << 16) | (second << 8) | third;
@@ -1576,6 +1572,15 @@ struct drm_edid {
 	const struct edid *edid;
 };
 
+static bool version_greater(const struct drm_edid *drm_edid,
+			    u8 version, u8 revision)
+{
+	const struct edid *edid = drm_edid->edid;
+
+	return edid->version > version ||
+		(edid->version == version && edid->revision > revision);
+}
+
 static int edid_extension_block_count(const struct edid *edid)
 {
 	return edid->extensions;
@@ -3232,7 +3237,7 @@ do_inferred_modes(const struct detailed_timing *timing, void *c)
 						  closure->drm_edid,
 						  timing);
 
-	if (!version_greater(closure->drm_edid->edid, 1, 1))
+	if (!version_greater(closure->drm_edid, 1, 1))
 		return; /* GTF not defined yet */
 
 	switch (range->flags) {
@@ -3243,7 +3248,7 @@ do_inferred_modes(const struct detailed_timing *timing, void *c)
 							  timing);
 		break;
 	case 0x04: /* cvt, only in 1.4+ */
-		if (!version_greater(closure->drm_edid->edid, 1, 3))
+		if (!version_greater(closure->drm_edid, 1, 3))
 			break;
 
 		closure->modes += drm_cvt_modes_for_range(closure->connector,
@@ -3264,7 +3269,7 @@ static int add_inferred_modes(struct drm_connector *connector,
 		.drm_edid = drm_edid,
 	};
 
-	if (version_greater(drm_edid->edid, 1, 0))
+	if (version_greater(drm_edid, 1, 0))
 		drm_for_each_detailed_block(drm_edid, do_inferred_modes, &closure);
 
 	return closure.modes;
@@ -3341,7 +3346,7 @@ static int add_established_modes(struct drm_connector *connector,
 		}
 	}
 
-	if (version_greater(edid, 1, 0))
+	if (version_greater(drm_edid, 1, 0))
 		drm_for_each_detailed_block(drm_edid, do_established_modes,
 					    &closure);
 
@@ -3396,7 +3401,7 @@ static int add_standard_modes(struct drm_connector *connector,
 		}
 	}
 
-	if (version_greater(drm_edid->edid, 1, 0))
+	if (version_greater(drm_edid, 1, 0))
 		drm_for_each_detailed_block(drm_edid, do_standard_modes,
 					    &closure);
 
@@ -3476,7 +3481,7 @@ add_cvt_modes(struct drm_connector *connector, const struct drm_edid *drm_edid)
 		.drm_edid = drm_edid,
 	};
 
-	if (version_greater(drm_edid->edid, 1, 2))
+	if (version_greater(drm_edid, 1, 2))
 		drm_for_each_detailed_block(drm_edid, do_cvt_mode, &closure);
 
 	/* XXX should also look for CVT codes in VTB blocks */
@@ -3532,7 +3537,7 @@ static int add_detailed_modes(struct drm_connector *connector,
 		.quirks = quirks,
 	};
 
-	if (closure.preferred && !version_greater(drm_edid->edid, 1, 3))
+	if (closure.preferred && !version_greater(drm_edid, 1, 3))
 		closure.preferred =
 		    (drm_edid->edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING);
 
@@ -5591,7 +5596,7 @@ static void drm_get_monitor_range(struct drm_connector *connector,
 {
 	struct drm_display_info *info = &connector->display_info;
 
-	if (!version_greater(drm_edid->edid, 1, 1))
+	if (!version_greater(drm_edid, 1, 1))
 		return;
 
 	drm_for_each_detailed_block(drm_edid, get_monitor_range,
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* Re: [PATCH v2 05/25] drm/edid: keep propagating drm_edid to display info
  2022-05-09 12:03 ` [PATCH v2 05/25] drm/edid: keep propagating drm_edid to display info Jani Nikula
@ 2022-05-10  6:15   ` Nautiyal, Ankit K
  2022-05-11  9:21   ` [PATCH v3] " Jani Nikula
  1 sibling, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10  6:15 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx


On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere.
>
> v2: Use drm_edid_legacy_init()
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 48 +++++++++++++++++++++++---------------
>   1 file changed, 29 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index f48f1f1a1fa7..96e3f9327044 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -2437,13 +2437,13 @@ EXPORT_SYMBOL(drm_edid_duplicate);
>   
>   /**
>    * edid_get_quirks - return quirk flags for a given EDID
> - * @edid: EDID to process
> + * @drm_edid: EDID to process
>    *
>    * This tells subsequent routines what fixes they need to apply.
>    */
> -static u32 edid_get_quirks(const struct edid *edid)
> +static u32 edid_get_quirks(const struct drm_edid *drm_edid)
>   {
> -	u32 panel_id = edid_extract_panel_id(edid);
> +	u32 panel_id = edid_extract_panel_id(drm_edid->edid);
>   	const struct edid_quirk *quirk;
>   	int i;
>   
> @@ -5466,7 +5466,7 @@ static void drm_parse_microsoft_vsdb(struct drm_connector *connector,
>   }
>   
>   static void drm_parse_cea_ext(struct drm_connector *connector,
> -			      const struct edid *edid)
> +			      const struct drm_edid *drm_edid)
>   {
>   	struct drm_display_info *info = &connector->display_info;
>   	struct drm_edid_iter edid_iter;
> @@ -5474,7 +5474,7 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
>   	struct cea_db_iter iter;
>   	const u8 *edid_ext;
>   
> -	drm_edid_iter_begin(edid, &edid_iter);
> +	drm_edid_iter_begin(drm_edid->edid, &edid_iter);
>   	drm_edid_iter_for_each(edid_ext, &edid_iter) {
>   		if (edid_ext[0] != CEA_EXT)
>   			continue;
> @@ -5495,7 +5495,7 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
>   	}
>   	drm_edid_iter_end(&edid_iter);
>   
> -	cea_db_iter_edid_begin(edid, &iter);
> +	cea_db_iter_edid_begin(drm_edid->edid, &iter);
>   	cea_db_iter_for_each(db, &iter) {
>   		/* FIXME: convert parsers to use struct cea_db */
>   		const u8 *data = (const u8 *)db;
> @@ -5541,16 +5541,15 @@ void get_monitor_range(const struct detailed_timing *timing,
>   	monitor_range->max_vfreq = range->max_vfreq;
>   }
>   
> -static
> -void drm_get_monitor_range(struct drm_connector *connector,
> -			   const struct edid *edid)
> +static void drm_get_monitor_range(struct drm_connector *connector,
> +				  const struct drm_edid *drm_edid)
>   {
>   	struct drm_display_info *info = &connector->display_info;
>   
> -	if (!version_greater(edid, 1, 1))
> +	if (!version_greater(drm_edid->edid, 1, 1))
>   		return;
>   
> -	drm_for_each_detailed_block(edid, get_monitor_range,
> +	drm_for_each_detailed_block(drm_edid->edid, get_monitor_range,
>   				    &info->monitor_range);
>   
>   	DRM_DEBUG_KMS("Supported Monitor Refresh rate range is %d Hz - %d Hz\n",
> @@ -5610,12 +5609,13 @@ static void drm_parse_vesa_mso_data(struct drm_connector *connector,
>   		    info->mso_stream_count, info->mso_pixel_overlap);
>   }
>   
> -static void drm_update_mso(struct drm_connector *connector, const struct edid *edid)
> +static void drm_update_mso(struct drm_connector *connector,
> +			   const struct drm_edid *drm_edid)
>   {
>   	const struct displayid_block *block;
>   	struct displayid_iter iter;
>   
> -	displayid_iter_edid_begin(edid, &iter);
> +	displayid_iter_edid_begin(drm_edid->edid, &iter);
>   	displayid_iter_for_each(block, &iter) {
>   		if (block->tag == DATA_BLOCK_2_VENDOR_SPECIFIC)
>   			drm_parse_vesa_mso_data(connector, block);
> @@ -5654,18 +5654,20 @@ drm_reset_display_info(struct drm_connector *connector)
>   	info->mso_pixel_overlap = 0;
>   }
>   
> -u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edid)
> +static u32 update_display_info(struct drm_connector *connector,
> +			       const struct drm_edid *drm_edid)
>   {
>   	struct drm_display_info *info = &connector->display_info;
> +	const struct edid *edid = drm_edid->edid;
>   
> -	u32 quirks = edid_get_quirks(edid);
> +	u32 quirks = edid_get_quirks(drm_edid);
>   
>   	drm_reset_display_info(connector);
>   
>   	info->width_mm = edid->width_cm * 10;
>   	info->height_mm = edid->height_cm * 10;
>   
> -	drm_get_monitor_range(connector, edid);
> +	drm_get_monitor_range(connector, drm_edid);
>   
>   	if (edid->revision < 3)
>   		goto out;
> @@ -5674,7 +5676,7 @@ u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edi
>   		goto out;
>   
>   	info->color_formats |= DRM_COLOR_FORMAT_RGB444;
> -	drm_parse_cea_ext(connector, edid);
> +	drm_parse_cea_ext(connector, drm_edid);
>   
>   	/*
>   	 * Digital sink with "DFP 1.x compliant TMDS" according to EDID 1.3?
> @@ -5727,7 +5729,7 @@ u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edi
>   	if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB422)
>   		info->color_formats |= DRM_COLOR_FORMAT_YCBCR422;
>   
> -	drm_update_mso(connector, edid);
> +	drm_update_mso(connector, drm_edid);
>   
>   out:
>   	if (quirks & EDID_QUIRK_NON_DESKTOP) {
> @@ -5739,6 +5741,14 @@ u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edi
>   	return quirks;
>   }
>   
> +u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edid)
> +{
> +	struct drm_edid drm_edid;
> +
> +	return update_display_info(connector,
> +				   drm_edid_legacy_init(&drm_edid, edid));
> +}
> +
>   static struct drm_display_mode *drm_mode_displayid_detailed(struct drm_device *dev,
>   							    struct displayid_detailed_timings_1 *timings,
>   							    bool type_7)
> @@ -5851,7 +5861,7 @@ static int drm_edid_connector_update(struct drm_connector *connector,
>   	 * To avoid multiple parsing of same block, lets parse that map
>   	 * from sink info, before parsing CEA modes.
>   	 */
> -	quirks = drm_add_display_info(connector, edid);
> +	quirks = update_display_info(connector, drm_edid);
>   
>   	/* Depends on info->cea_rev set by drm_add_display_info() above */
>   	drm_edid_to_eld(connector, edid);

By mistake commented on older revision, pasting the same comment on V2:

Perhaps the comment above needs to be updated with update_display_info()

Patch looks good to me.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit


^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Intel-gfx] [PATCH v2 04/25] drm/edid: start propagating drm_edid to lower levels
  2022-05-09 12:03 ` [PATCH v2 04/25] drm/edid: start propagating drm_edid to lower levels Jani Nikula
@ 2022-05-10  6:23   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10  6:23 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit

On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere. This is a clunky start, but
> a start nonetheless. We'll eventually convert all of the EDID parsing to
> struct drm_edid.
>
> Initially, we'll just create the struct drm_edid in stack. This will be
> the compat layer for legacy struct edid code. In the future, we'll have
> EDID read return drm_edid objects.
>
> v2: Add legacy init helper.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 30 +++++++++++++++++++++++++++---
>   1 file changed, 27 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 480fd9fbe412..f48f1f1a1fa7 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -1608,6 +1608,24 @@ static const void *edid_extension_block_data(const struct edid *edid, int index)
>   	return edid_block_data(edid, index + 1);
>   }
>   
> +/*
> + * Initializer helper for legacy interfaces, where we have no choice but to
> + * trust edid size. Not for general purpose use.
> + */
> +static const struct drm_edid *drm_edid_legacy_init(struct drm_edid *drm_edid,
> +						   const struct edid *edid)
> +{
> +	if (!edid)
> +		return NULL;
> +
> +	memset(drm_edid, 0, sizeof(*drm_edid));
> +
> +	drm_edid->edid = edid;
> +	drm_edid->size = edid_size(edid);
> +
> +	return drm_edid;
> +}
> +
>   /*
>    * EDID base and extension block iterator.
>    *
> @@ -5814,17 +5832,20 @@ static int add_displayid_detailed_modes(struct drm_connector *connector,
>   }
>   
>   static int drm_edid_connector_update(struct drm_connector *connector,
> -				     const struct edid *edid)
> +				     const struct drm_edid *drm_edid)
>   {
> +	const struct edid *edid;
>   	int num_modes = 0;
>   	u32 quirks;
>   
> -	if (edid == NULL) {
> +	if (!drm_edid) {
>   		drm_reset_display_info(connector);
>   		clear_eld(connector);
>   		return 0;
>   	}
>   
> +	edid = drm_edid->edid;
> +
>   	/*
>   	 * CEA-861-F adds ycbcr capability map block, for HDMI 2.0 sinks.
>   	 * To avoid multiple parsing of same block, lets parse that map
> @@ -5890,13 +5911,16 @@ static int drm_edid_connector_update(struct drm_connector *connector,
>    */
>   int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid)
>   {
> +	struct drm_edid drm_edid;
> +
>   	if (edid && !drm_edid_is_valid(edid)) {
>   		drm_warn(connector->dev, "%s: EDID invalid.\n",
>   			 connector->name);
>   		edid = NULL;
>   	}
>   
> -	return drm_edid_connector_update(connector, edid);
> +	return drm_edid_connector_update(connector,
> +					 drm_edid_legacy_init(&drm_edid, edid));
>   }
>   EXPORT_SYMBOL(drm_add_edid_modes);
>   

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Intel-gfx] [PATCH v2 03/25] drm/edid: add struct drm_edid container
  2022-05-09 12:03 ` [PATCH v2 03/25] drm/edid: add struct drm_edid container Jani Nikula
@ 2022-05-10  6:26   ` Nautiyal, Ankit K
  2022-05-16  8:11     ` Jani Nikula
  0 siblings, 1 reply; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10  6:26 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit

On 5/9/2022 5:33 PM, Jani Nikula wrote:
> Introduce new opaque type struct drm_edid to encapsulate the EDID data
> and the size allocated for it. The contents will be private to
> drm_edid.c.
>
> There are a number of reasons for adding a container around struct edid:
>
> * struct edid is a raw blob pointer to data that usually originates
>    outside of the kernel. Its size is contained within the structure.
>
> * There's no way to attach meta information (such as allocated memory
>    size) to struct edid.
>
> * Validation of the EDID blob and its size become crucial, and it's
>    spread all over the subsystem, with varying levels of accuracy.
>
> * HDMI Forum has introduced an HF-EEODB extension that defines an
>    override EDID size within an EDID extension. The size allocated for an
>    EDID depends on whether the allocator understands the HF-EEODB
>    extension. Given a struct edid *, it's impossible to know how much
>    memory was actually allocated for it.
>
> There are also some reasons for making the container type struct
> drm_edid opaque and private to drm_edid.c:
>
> * Have only one place for creating and parsing the EDID, to avoid
>    duplicating bugs.
>
> * Prepare for reading a pure DisplayID 2.0 from its own DDC address, and
>    adding it within the same struct drm_edid container, transparently,
>    and for all drivers.
>
> * With the idea that the drm_edid objects are immutable during their
>    lifetimes, it will be possible to refcount them and reduce EDID
>    copying everywhere (this is left for future work).
>
> Initially, just add the type. In follow-up, we'll start converting the
> guts of drm_edid.c to use it, and finally add interfaces around it.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 9 +++++++++
>   1 file changed, 9 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index dcef92c8887a..480fd9fbe412 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -1567,6 +1567,15 @@ static const struct drm_display_mode edid_4k_modes[] = {
>   
>   /*** DDC fetch and block validation ***/
>   
> +/*
> + * The opaque EDID type, internal to drm_edid.c.
> + */
> +struct drm_edid {
> +	/* Size allocated for edid */
> +	size_t size;
> +	const struct edid *edid;
> +};
> +
>   static int edid_extension_block_count(const struct edid *edid)
>   {
>   	return edid->extensions;

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH v2 06/25] drm/edid: propagate drm_edid to drm_edid_to_eld()
  2022-05-09 12:03 ` [PATCH v2 06/25] drm/edid: propagate drm_edid to drm_edid_to_eld() Jani Nikula
@ 2022-05-10  6:31   ` Nautiyal, Ankit K
  2022-05-11  9:23   ` [PATCH v3] " Jani Nikula
  1 sibling, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10  6:31 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit

On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 20 ++++++++++----------
>   1 file changed, 10 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 96e3f9327044..e4fdf742645b 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -4883,13 +4883,13 @@ static void clear_eld(struct drm_connector *connector)
>   /*
>    * drm_edid_to_eld - build ELD from EDID
>    * @connector: connector corresponding to the HDMI/DP sink
> - * @edid: EDID to parse
> + * @drm_edid: EDID to parse
>    *
>    * Fill the ELD (EDID-Like Data) buffer for passing to the audio driver. The
>    * HDCP and Port_ID ELD fields are left for the graphics driver to fill in.
>    */
>   static void drm_edid_to_eld(struct drm_connector *connector,
> -			    const struct edid *edid)
> +			    const struct drm_edid *drm_edid)
>   {
>   	const struct drm_display_info *info = &connector->display_info;
>   	const struct cea_db *db;
> @@ -4900,10 +4900,10 @@ static void drm_edid_to_eld(struct drm_connector *connector,
>   
>   	clear_eld(connector);
>   
> -	if (!edid)
> +	if (!drm_edid)
>   		return;
>   
> -	mnl = get_monitor_name(edid, &eld[DRM_ELD_MONITOR_NAME_STRING]);
> +	mnl = get_monitor_name(drm_edid->edid, &eld[DRM_ELD_MONITOR_NAME_STRING]);
>   	DRM_DEBUG_KMS("ELD monitor %s\n", &eld[DRM_ELD_MONITOR_NAME_STRING]);
>   
>   	eld[DRM_ELD_CEA_EDID_VER_MNL] = info->cea_rev << DRM_ELD_CEA_EDID_VER_SHIFT;
> @@ -4911,12 +4911,12 @@ static void drm_edid_to_eld(struct drm_connector *connector,
>   
>   	eld[DRM_ELD_VER] = DRM_ELD_VER_CEA861D;
>   
> -	eld[DRM_ELD_MANUFACTURER_NAME0] = edid->mfg_id[0];
> -	eld[DRM_ELD_MANUFACTURER_NAME1] = edid->mfg_id[1];
> -	eld[DRM_ELD_PRODUCT_CODE0] = edid->prod_code[0];
> -	eld[DRM_ELD_PRODUCT_CODE1] = edid->prod_code[1];
> +	eld[DRM_ELD_MANUFACTURER_NAME0] = drm_edid->edid->mfg_id[0];
> +	eld[DRM_ELD_MANUFACTURER_NAME1] = drm_edid->edid->mfg_id[1];
> +	eld[DRM_ELD_PRODUCT_CODE0] = drm_edid->edid->prod_code[0];
> +	eld[DRM_ELD_PRODUCT_CODE1] = drm_edid->edid->prod_code[1];
>   
> -	cea_db_iter_edid_begin(edid, &iter);
> +	cea_db_iter_edid_begin(drm_edid->edid, &iter);
>   	cea_db_iter_for_each(db, &iter) {
>   		const u8 *data = cea_db_data(db);
>   		int len = cea_db_payload_len(db);
> @@ -5864,7 +5864,7 @@ static int drm_edid_connector_update(struct drm_connector *connector,
>   	quirks = update_display_info(connector, drm_edid);
>   
>   	/* Depends on info->cea_rev set by drm_add_display_info() above */
> -	drm_edid_to_eld(connector, edid);
> +	drm_edid_to_eld(connector, drm_edid);
>   
>   	/*
>   	 * EDID spec says modes should be preferred in this order:

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Intel-gfx] [PATCH v2 07/25] drm/edid: convert drm_edid_connector_update() to drm_edid fully
  2022-05-09 12:03 ` [PATCH v2 07/25] drm/edid: convert drm_edid_connector_update() to drm_edid fully Jani Nikula
@ 2022-05-10  6:45   ` Nautiyal, Ankit K
  2022-05-11  9:26   ` [PATCH v3] " Jani Nikula
  1 sibling, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10  6:45 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx


On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 95 ++++++++++++++++++--------------------
>   1 file changed, 46 insertions(+), 49 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index e4fdf742645b..f54699422bca 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -3253,16 +3253,16 @@ do_inferred_modes(const struct detailed_timing *timing, void *c)
>   	}
>   }
>   
> -static int
> -add_inferred_modes(struct drm_connector *connector, const struct edid *edid)
> +static int add_inferred_modes(struct drm_connector *connector,
> +			      const struct drm_edid *drm_edid)
>   {
>   	struct detailed_mode_closure closure = {
>   		.connector = connector,
> -		.edid = edid,
> +		.edid = drm_edid->edid,
>   	};
>   
> -	if (version_greater(edid, 1, 0))
> -		drm_for_each_detailed_block(edid, do_inferred_modes, &closure);
> +	if (version_greater(drm_edid->edid, 1, 0))
> +		drm_for_each_detailed_block(drm_edid->edid, do_inferred_modes, &closure);
>   
>   	return closure.modes;
>   }
> @@ -3312,10 +3312,11 @@ do_established_modes(const struct detailed_timing *timing, void *c)
>    * bitmap of the supported "established modes" list (defined above). Tease them
>    * out and add them to the global modes list.
>    */
> -static int
> -add_established_modes(struct drm_connector *connector, const struct edid *edid)
> +static int add_established_modes(struct drm_connector *connector,
> +				 const struct drm_edid *drm_edid)
>   {
>   	struct drm_device *dev = connector->dev;
> +	const struct edid *edid = drm_edid->edid;
>   	unsigned long est_bits = edid->established_timings.t1 |
>   		(edid->established_timings.t2 << 8) |
>   		((edid->established_timings.mfg_rsvd & 0x80) << 9);
> @@ -3338,7 +3339,7 @@ add_established_modes(struct drm_connector *connector, const struct edid *edid)
>   	}
>   
>   	if (version_greater(edid, 1, 0))
> -		drm_for_each_detailed_block(edid, do_established_modes,
> +		drm_for_each_detailed_block(drm_edid->edid, do_established_modes,
>   					    &closure);
>   
>   	return modes + closure.modes;
> @@ -3373,28 +3374,28 @@ do_standard_modes(const struct detailed_timing *timing, void *c)
>    * using the appropriate standard (DMT, GTF, or CVT). Grab them from EDID and
>    * add them to the list.
>    */
> -static int
> -add_standard_modes(struct drm_connector *connector, const struct edid *edid)
> +static int add_standard_modes(struct drm_connector *connector,
> +			      const struct drm_edid *drm_edid)
>   {
>   	int i, modes = 0;
>   	struct detailed_mode_closure closure = {
>   		.connector = connector,
> -		.edid = edid,
> +		.edid = drm_edid->edid,
>   	};
>   
>   	for (i = 0; i < EDID_STD_TIMINGS; i++) {
>   		struct drm_display_mode *newmode;
>   
> -		newmode = drm_mode_std(connector, edid,
> -				       &edid->standard_timings[i]);
> +		newmode = drm_mode_std(connector, drm_edid->edid,
> +				       &drm_edid->edid->standard_timings[i]);
>   		if (newmode) {
>   			drm_mode_probed_add(connector, newmode);
>   			modes++;
>   		}
>   	}
>   
> -	if (version_greater(edid, 1, 0))
> -		drm_for_each_detailed_block(edid, do_standard_modes,
> +	if (version_greater(drm_edid->edid, 1, 0))
> +		drm_for_each_detailed_block(drm_edid->edid, do_standard_modes,
>   					    &closure);
>   
>   	/* XXX should also look for standard codes in VTB blocks */
> @@ -3466,15 +3467,15 @@ do_cvt_mode(const struct detailed_timing *timing, void *c)
>   }
>   
>   static int
> -add_cvt_modes(struct drm_connector *connector, const struct edid *edid)
> +add_cvt_modes(struct drm_connector *connector, const struct drm_edid *drm_edid)
>   {
>   	struct detailed_mode_closure closure = {
>   		.connector = connector,
> -		.edid = edid,
> +		.edid = drm_edid->edid,
>   	};
>   
> -	if (version_greater(edid, 1, 2))
> -		drm_for_each_detailed_block(edid, do_cvt_mode, &closure);
> +	if (version_greater(drm_edid->edid, 1, 2))
> +		drm_for_each_detailed_block(drm_edid->edid, do_cvt_mode, &closure);
>   
>   	/* XXX should also look for CVT codes in VTB blocks */
>   
> @@ -3519,22 +3520,21 @@ do_detailed_mode(const struct detailed_timing *timing, void *c)
>    * @edid: EDID block to scan

This needs to be @drm_edid

With this changed:

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>


Regards,

Ankit

>    * @quirks: quirks to apply
>    */
> -static int
> -add_detailed_modes(struct drm_connector *connector, const struct edid *edid,
> -		   u32 quirks)
> +static int add_detailed_modes(struct drm_connector *connector,
> +			      const struct drm_edid *drm_edid, u32 quirks)
>   {
>   	struct detailed_mode_closure closure = {
>   		.connector = connector,
> -		.edid = edid,
> +		.edid = drm_edid->edid,
>   		.preferred = true,
>   		.quirks = quirks,
>   	};
>   
> -	if (closure.preferred && !version_greater(edid, 1, 3))
> +	if (closure.preferred && !version_greater(drm_edid->edid, 1, 3))
>   		closure.preferred =
> -		    (edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING);
> +		    (drm_edid->edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING);
>   
> -	drm_for_each_detailed_block(edid, do_detailed_mode, &closure);
> +	drm_for_each_detailed_block(drm_edid->edid, do_detailed_mode, &closure);
>   
>   	return closure.modes;
>   }
> @@ -3588,7 +3588,7 @@ const u8 *drm_find_edid_extension(const struct edid *edid,
>   }
>   
>   /* Return true if the EDID has a CTA extension or a DisplayID CTA data block */
> -static bool drm_edid_has_cta_extension(const struct edid *edid)
> +static bool drm_edid_has_cta_extension(const struct drm_edid *drm_edid)
>   {
>   	const struct displayid_block *block;
>   	struct displayid_iter iter;
> @@ -3596,11 +3596,11 @@ static bool drm_edid_has_cta_extension(const struct edid *edid)
>   	bool found = false;
>   
>   	/* Look for a top level CEA extension block */
> -	if (drm_find_edid_extension(edid, CEA_EXT, &ext_index))
> +	if (drm_find_edid_extension(drm_edid->edid, CEA_EXT, &ext_index))
>   		return true;
>   
>   	/* CEA blocks can also be found embedded in a DisplayID block */
> -	displayid_iter_edid_begin(edid, &iter);
> +	displayid_iter_edid_begin(drm_edid->edid, &iter);
>   	displayid_iter_for_each(block, &iter) {
>   		if (block->tag == DATA_BLOCK_CTA) {
>   			found = true;
> @@ -3874,8 +3874,8 @@ static bool drm_valid_hdmi_vic(u8 vic)
>   	return vic > 0 && vic < ARRAY_SIZE(edid_4k_modes);
>   }
>   
> -static int
> -add_alternate_cea_modes(struct drm_connector *connector, const struct edid *edid)
> +static int add_alternate_cea_modes(struct drm_connector *connector,
> +				   const struct drm_edid *drm_edid)
>   {
>   	struct drm_device *dev = connector->dev;
>   	struct drm_display_mode *mode, *tmp;
> @@ -3883,7 +3883,7 @@ add_alternate_cea_modes(struct drm_connector *connector, const struct edid *edid
>   	int modes = 0;
>   
>   	/* Don't add CTA modes if the CTA extension block is missing */
> -	if (!drm_edid_has_cta_extension(edid))
> +	if (!drm_edid_has_cta_extension(drm_edid))
>   		return 0;
>   
>   	/*
> @@ -4666,14 +4666,14 @@ static void drm_parse_y420cmdb_bitmap(struct drm_connector *connector,
>   	hdmi->y420_cmdb_map = map;
>   }
>   
> -static int
> -add_cea_modes(struct drm_connector *connector, const struct edid *edid)
> +static int add_cea_modes(struct drm_connector *connector,
> +			 const struct drm_edid *drm_edid)
>   {
>   	const struct cea_db *db;
>   	struct cea_db_iter iter;
>   	int modes = 0;
>   
> -	cea_db_iter_edid_begin(edid, &iter);
> +	cea_db_iter_edid_begin(drm_edid->edid, &iter);
>   	cea_db_iter_for_each(db, &iter) {
>   		const u8 *hdmi = NULL, *video = NULL;
>   		u8 hdmi_len = 0, video_len = 0;
> @@ -5824,13 +5824,13 @@ static int add_displayid_detailed_1_modes(struct drm_connector *connector,
>   }
>   
>   static int add_displayid_detailed_modes(struct drm_connector *connector,
> -					const struct edid *edid)
> +					const struct drm_edid *drm_edid)
>   {
>   	const struct displayid_block *block;
>   	struct displayid_iter iter;
>   	int num_modes = 0;
>   
> -	displayid_iter_edid_begin(edid, &iter);
> +	displayid_iter_edid_begin(drm_edid->edid, &iter);
>   	displayid_iter_for_each(block, &iter) {
>   		if (block->tag == DATA_BLOCK_TYPE_1_DETAILED_TIMING ||
>   		    block->tag == DATA_BLOCK_2_TYPE_7_DETAILED_TIMING)
> @@ -5844,7 +5844,6 @@ static int add_displayid_detailed_modes(struct drm_connector *connector,
>   static int drm_edid_connector_update(struct drm_connector *connector,
>   				     const struct drm_edid *drm_edid)
>   {
> -	const struct edid *edid;
>   	int num_modes = 0;
>   	u32 quirks;
>   
> @@ -5854,8 +5853,6 @@ static int drm_edid_connector_update(struct drm_connector *connector,
>   		return 0;
>   	}
>   
> -	edid = drm_edid->edid;
> -
>   	/*
>   	 * CEA-861-F adds ycbcr capability map block, for HDMI 2.0 sinks.
>   	 * To avoid multiple parsing of same block, lets parse that map
> @@ -5880,15 +5877,15 @@ static int drm_edid_connector_update(struct drm_connector *connector,
>   	 *
>   	 * XXX order for additional mode types in extension blocks?
>   	 */
> -	num_modes += add_detailed_modes(connector, edid, quirks);
> -	num_modes += add_cvt_modes(connector, edid);
> -	num_modes += add_standard_modes(connector, edid);
> -	num_modes += add_established_modes(connector, edid);
> -	num_modes += add_cea_modes(connector, edid);
> -	num_modes += add_alternate_cea_modes(connector, edid);
> -	num_modes += add_displayid_detailed_modes(connector, edid);
> -	if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)
> -		num_modes += add_inferred_modes(connector, edid);
> +	num_modes += add_detailed_modes(connector, drm_edid, quirks);
> +	num_modes += add_cvt_modes(connector, drm_edid);
> +	num_modes += add_standard_modes(connector, drm_edid);
> +	num_modes += add_established_modes(connector, drm_edid);
> +	num_modes += add_cea_modes(connector, drm_edid);
> +	num_modes += add_alternate_cea_modes(connector, drm_edid);
> +	num_modes += add_displayid_detailed_modes(connector, drm_edid);
> +	if (drm_edid->edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)
> +		num_modes += add_inferred_modes(connector, drm_edid);
>   
>   	if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75))
>   		edid_fixup_preferred(connector, quirks);

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH v2 08/25] drm/edid: convert struct detailed_mode_closure to drm_edid
  2022-05-09 12:03 ` [PATCH v2 08/25] drm/edid: convert struct detailed_mode_closure to drm_edid Jani Nikula
@ 2022-05-10  7:14   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10  7:14 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx

LGTM, The subject perhaps can be modified to suggest drm_edid being 
added to detailed_mode_closure.

In any case:

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>


On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 27 +++++++++++++--------------
>   1 file changed, 13 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index f54699422bca..c2887012add0 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -96,7 +96,7 @@ static int oui(u8 first, u8 second, u8 third)
>   
>   struct detailed_mode_closure {
>   	struct drm_connector *connector;
> -	const struct edid *edid;
> +	const struct drm_edid *drm_edid;
>   	bool preferred;
>   	u32 quirks;
>   	int modes;
> @@ -3226,25 +3226,25 @@ do_inferred_modes(const struct detailed_timing *timing, void *c)
>   		return;
>   
>   	closure->modes += drm_dmt_modes_for_range(closure->connector,
> -						  closure->edid,
> +						  closure->drm_edid->edid,
>   						  timing);
>   
> -	if (!version_greater(closure->edid, 1, 1))
> +	if (!version_greater(closure->drm_edid->edid, 1, 1))
>   		return; /* GTF not defined yet */
>   
>   	switch (range->flags) {
>   	case 0x02: /* secondary gtf, XXX could do more */
>   	case 0x00: /* default gtf */
>   		closure->modes += drm_gtf_modes_for_range(closure->connector,
> -							  closure->edid,
> +							  closure->drm_edid->edid,
>   							  timing);
>   		break;
>   	case 0x04: /* cvt, only in 1.4+ */
> -		if (!version_greater(closure->edid, 1, 3))
> +		if (!version_greater(closure->drm_edid->edid, 1, 3))
>   			break;
>   
>   		closure->modes += drm_cvt_modes_for_range(closure->connector,
> -							  closure->edid,
> +							  closure->drm_edid->edid,
>   							  timing);
>   		break;
>   	case 0x01: /* just the ranges, no formula */
> @@ -3258,7 +3258,7 @@ static int add_inferred_modes(struct drm_connector *connector,
>   {
>   	struct detailed_mode_closure closure = {
>   		.connector = connector,
> -		.edid = drm_edid->edid,
> +		.drm_edid = drm_edid,
>   	};
>   
>   	if (version_greater(drm_edid->edid, 1, 0))
> @@ -3323,7 +3323,7 @@ static int add_established_modes(struct drm_connector *connector,
>   	int i, modes = 0;
>   	struct detailed_mode_closure closure = {
>   		.connector = connector,
> -		.edid = edid,
> +		.drm_edid = drm_edid,
>   	};
>   
>   	for (i = 0; i <= EDID_EST_TIMINGS; i++) {
> @@ -3351,7 +3351,6 @@ do_standard_modes(const struct detailed_timing *timing, void *c)
>   	struct detailed_mode_closure *closure = c;
>   	const struct detailed_non_pixel *data = &timing->data.other_data;
>   	struct drm_connector *connector = closure->connector;
> -	const struct edid *edid = closure->edid;
>   	int i;
>   
>   	if (!is_display_descriptor(timing, EDID_DETAIL_STD_MODES))
> @@ -3361,7 +3360,7 @@ do_standard_modes(const struct detailed_timing *timing, void *c)
>   		const struct std_timing *std = &data->data.timings[i];
>   		struct drm_display_mode *newmode;
>   
> -		newmode = drm_mode_std(connector, edid, std);
> +		newmode = drm_mode_std(connector, closure->drm_edid->edid, std);
>   		if (newmode) {
>   			drm_mode_probed_add(connector, newmode);
>   			closure->modes++;
> @@ -3380,7 +3379,7 @@ static int add_standard_modes(struct drm_connector *connector,
>   	int i, modes = 0;
>   	struct detailed_mode_closure closure = {
>   		.connector = connector,
> -		.edid = drm_edid->edid,
> +		.drm_edid = drm_edid,
>   	};
>   
>   	for (i = 0; i < EDID_STD_TIMINGS; i++) {
> @@ -3471,7 +3470,7 @@ add_cvt_modes(struct drm_connector *connector, const struct drm_edid *drm_edid)
>   {
>   	struct detailed_mode_closure closure = {
>   		.connector = connector,
> -		.edid = drm_edid->edid,
> +		.drm_edid = drm_edid,
>   	};
>   
>   	if (version_greater(drm_edid->edid, 1, 2))
> @@ -3494,7 +3493,7 @@ do_detailed_mode(const struct detailed_timing *timing, void *c)
>   		return;
>   
>   	newmode = drm_mode_detailed(closure->connector->dev,
> -				    closure->edid, timing,
> +				    closure->drm_edid->edid, timing,
>   				    closure->quirks);
>   	if (!newmode)
>   		return;
> @@ -3525,7 +3524,7 @@ static int add_detailed_modes(struct drm_connector *connector,
>   {
>   	struct detailed_mode_closure closure = {
>   		.connector = connector,
> -		.edid = drm_edid->edid,
> +		.drm_edid = drm_edid,
>   		.preferred = true,
>   		.quirks = quirks,
>   	};

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Intel-gfx] [PATCH v2 09/25] drm/edid: convert drm_mode_detailed() to drm_edid
  2022-05-09 12:03 ` [PATCH v2 09/25] drm/edid: convert drm_mode_detailed() " Jani Nikula
@ 2022-05-10  8:57   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10  8:57 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit

On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 8 ++++----
>   1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index c2887012add0..8acdb08a8571 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -2928,7 +2928,7 @@ drm_mode_do_interlace_quirk(struct drm_display_mode *mode,
>    * drm_display_mode.
>    */
>   static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev,
> -						  const struct edid *edid,
> +						  const struct drm_edid *drm_edid,
>   						  const struct detailed_timing *timing,
>   						  u32 quirks)
>   {
> @@ -3016,8 +3016,8 @@ static struct drm_display_mode *drm_mode_detailed(struct drm_device *dev,
>   	}
>   
>   	if (quirks & EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE) {
> -		mode->width_mm = edid->width_cm * 10;
> -		mode->height_mm = edid->height_cm * 10;
> +		mode->width_mm = drm_edid->edid->width_cm * 10;
> +		mode->height_mm = drm_edid->edid->height_cm * 10;
>   	}
>   
>   	mode->type = DRM_MODE_TYPE_DRIVER;
> @@ -3493,7 +3493,7 @@ do_detailed_mode(const struct detailed_timing *timing, void *c)
>   		return;
>   
>   	newmode = drm_mode_detailed(closure->connector->dev,
> -				    closure->drm_edid->edid, timing,
> +				    closure->drm_edid, timing,
>   				    closure->quirks);
>   	if (!newmode)
>   		return;

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Intel-gfx] [PATCH v2 10/25] drm/edid: convert drm_dmt_modes_for_range() to drm_edid
  2022-05-09 12:03 ` [PATCH v2 10/25] drm/edid: convert drm_dmt_modes_for_range() " Jani Nikula
@ 2022-05-10  9:04   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10  9:04 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit

On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 10 +++++-----
>   1 file changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 8acdb08a8571..5d8744a7b62e 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -3121,16 +3121,16 @@ static bool valid_inferred_mode(const struct drm_connector *connector,
>   	return ok;
>   }
>   
> -static int
> -drm_dmt_modes_for_range(struct drm_connector *connector, const struct edid *edid,
> -			const struct detailed_timing *timing)
> +static int drm_dmt_modes_for_range(struct drm_connector *connector,
> +				   const struct drm_edid *drm_edid,
> +				   const struct detailed_timing *timing)
>   {
>   	int i, modes = 0;
>   	struct drm_display_mode *newmode;
>   	struct drm_device *dev = connector->dev;
>   
>   	for (i = 0; i < ARRAY_SIZE(drm_dmt_modes); i++) {
> -		if (mode_in_range(drm_dmt_modes + i, edid, timing) &&
> +		if (mode_in_range(drm_dmt_modes + i, drm_edid->edid, timing) &&
>   		    valid_inferred_mode(connector, drm_dmt_modes + i)) {
>   			newmode = drm_mode_duplicate(dev, &drm_dmt_modes[i]);
>   			if (newmode) {
> @@ -3226,7 +3226,7 @@ do_inferred_modes(const struct detailed_timing *timing, void *c)
>   		return;
>   
>   	closure->modes += drm_dmt_modes_for_range(closure->connector,
> -						  closure->drm_edid->edid,
> +						  closure->drm_edid,
>   						  timing);
>   
>   	if (!version_greater(closure->drm_edid->edid, 1, 1))

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH v2 11/25] drm/edid: convert drm_gtf_modes_for_range() to drm_edid
  2022-05-09 12:03 ` [PATCH v2 11/25] drm/edid: convert drm_gtf_modes_for_range() " Jani Nikula
@ 2022-05-10  9:05   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10  9:05 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit

On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 10 +++++-----
>   1 file changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 5d8744a7b62e..037102a4d0b5 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -3156,9 +3156,9 @@ void drm_mode_fixup_1366x768(struct drm_display_mode *mode)
>   	}
>   }
>   
> -static int
> -drm_gtf_modes_for_range(struct drm_connector *connector, const struct edid *edid,
> -			const struct detailed_timing *timing)
> +static int drm_gtf_modes_for_range(struct drm_connector *connector,
> +				   const struct drm_edid *drm_edid,
> +				   const struct detailed_timing *timing)
>   {
>   	int i, modes = 0;
>   	struct drm_display_mode *newmode;
> @@ -3172,7 +3172,7 @@ drm_gtf_modes_for_range(struct drm_connector *connector, const struct edid *edid
>   			return modes;
>   
>   		drm_mode_fixup_1366x768(newmode);
> -		if (!mode_in_range(newmode, edid, timing) ||
> +		if (!mode_in_range(newmode, drm_edid->edid, timing) ||
>   		    !valid_inferred_mode(connector, newmode)) {
>   			drm_mode_destroy(dev, newmode);
>   			continue;
> @@ -3236,7 +3236,7 @@ do_inferred_modes(const struct detailed_timing *timing, void *c)
>   	case 0x02: /* secondary gtf, XXX could do more */
>   	case 0x00: /* default gtf */
>   		closure->modes += drm_gtf_modes_for_range(closure->connector,
> -							  closure->drm_edid->edid,
> +							  closure->drm_edid,
>   							  timing);
>   		break;
>   	case 0x04: /* cvt, only in 1.4+ */

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Intel-gfx] [PATCH v2 12/25] drm/edid: convert drm_cvt_modes_for_range() to drm_edid
  2022-05-09 12:03 ` [PATCH v2 12/25] drm/edid: convert drm_cvt_modes_for_range() " Jani Nikula
@ 2022-05-10  9:11   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10  9:11 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit

On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 12 ++++++------
>   1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 037102a4d0b5..51d918c66a26 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -3185,14 +3185,14 @@ static int drm_gtf_modes_for_range(struct drm_connector *connector,
>   	return modes;
>   }
>   
> -static int
> -drm_cvt_modes_for_range(struct drm_connector *connector, const struct edid *edid,
> -			const struct detailed_timing *timing)
> +static int drm_cvt_modes_for_range(struct drm_connector *connector,
> +				   const struct drm_edid *drm_edid,
> +				   const struct detailed_timing *timing)
>   {
>   	int i, modes = 0;
>   	struct drm_display_mode *newmode;
>   	struct drm_device *dev = connector->dev;
> -	bool rb = drm_monitor_supports_rb(edid);
> +	bool rb = drm_monitor_supports_rb(drm_edid->edid);
>   
>   	for (i = 0; i < ARRAY_SIZE(extra_modes); i++) {
>   		const struct minimode *m = &extra_modes[i];
> @@ -3202,7 +3202,7 @@ drm_cvt_modes_for_range(struct drm_connector *connector, const struct edid *edid
>   			return modes;
>   
>   		drm_mode_fixup_1366x768(newmode);
> -		if (!mode_in_range(newmode, edid, timing) ||
> +		if (!mode_in_range(newmode, drm_edid->edid, timing) ||
>   		    !valid_inferred_mode(connector, newmode)) {
>   			drm_mode_destroy(dev, newmode);
>   			continue;
> @@ -3244,7 +3244,7 @@ do_inferred_modes(const struct detailed_timing *timing, void *c)
>   			break;
>   
>   		closure->modes += drm_cvt_modes_for_range(closure->connector,
> -							  closure->drm_edid->edid,
> +							  closure->drm_edid,
>   							  timing);
>   		break;
>   	case 0x01: /* just the ranges, no formula */

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Intel-gfx] [PATCH v2 13/25] drm/edid: convert drm_mode_std() and children to drm_edid
  2022-05-09 12:03 ` [PATCH v2 13/25] drm/edid: convert drm_mode_std() and children " Jani Nikula
@ 2022-05-10  9:18   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10  9:18 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit

On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 52 ++++++++++++++++++++------------------
>   1 file changed, 27 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 51d918c66a26..bea8f33c58ad 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -2673,11 +2673,11 @@ find_gtf2(const struct detailed_timing *descriptor, void *data)
>   
>   /* Secondary GTF curve kicks in above some break frequency */
>   static int
> -drm_gtf2_hbreak(const struct edid *edid)
> +drm_gtf2_hbreak(const struct drm_edid *drm_edid)
>   {
>   	const struct detailed_timing *descriptor = NULL;
>   
> -	drm_for_each_detailed_block(edid, find_gtf2, &descriptor);
> +	drm_for_each_detailed_block(drm_edid->edid, find_gtf2, &descriptor);
>   
>   	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.hfreq_start_khz) != 12);
>   
> @@ -2685,11 +2685,11 @@ drm_gtf2_hbreak(const struct edid *edid)
>   }
>   
>   static int
> -drm_gtf2_2c(const struct edid *edid)
> +drm_gtf2_2c(const struct drm_edid *drm_edid)
>   {
>   	const struct detailed_timing *descriptor = NULL;
>   
> -	drm_for_each_detailed_block(edid, find_gtf2, &descriptor);
> +	drm_for_each_detailed_block(drm_edid->edid, find_gtf2, &descriptor);
>   
>   	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.c) != 13);
>   
> @@ -2697,11 +2697,11 @@ drm_gtf2_2c(const struct edid *edid)
>   }
>   
>   static int
> -drm_gtf2_m(const struct edid *edid)
> +drm_gtf2_m(const struct drm_edid *drm_edid)
>   {
>   	const struct detailed_timing *descriptor = NULL;
>   
> -	drm_for_each_detailed_block(edid, find_gtf2, &descriptor);
> +	drm_for_each_detailed_block(drm_edid->edid, find_gtf2, &descriptor);
>   
>   	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.m) != 14);
>   
> @@ -2709,11 +2709,11 @@ drm_gtf2_m(const struct edid *edid)
>   }
>   
>   static int
> -drm_gtf2_k(const struct edid *edid)
> +drm_gtf2_k(const struct drm_edid *drm_edid)
>   {
>   	const struct detailed_timing *descriptor = NULL;
>   
> -	drm_for_each_detailed_block(edid, find_gtf2, &descriptor);
> +	drm_for_each_detailed_block(drm_edid->edid, find_gtf2, &descriptor);
>   
>   	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.k) != 16);
>   
> @@ -2721,11 +2721,11 @@ drm_gtf2_k(const struct edid *edid)
>   }
>   
>   static int
> -drm_gtf2_2j(const struct edid *edid)
> +drm_gtf2_2j(const struct drm_edid *drm_edid)
>   {
>   	const struct detailed_timing *descriptor = NULL;
>   
> -	drm_for_each_detailed_block(edid, find_gtf2, &descriptor);
> +	drm_for_each_detailed_block(drm_edid->edid, find_gtf2, &descriptor);
>   
>   	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.j) != 17);
>   
> @@ -2733,12 +2733,14 @@ drm_gtf2_2j(const struct edid *edid)
>   }
>   
>   /* Get standard timing level (CVT/GTF/DMT). */
> -static int standard_timing_level(const struct edid *edid)
> +static int standard_timing_level(const struct drm_edid *drm_edid)
>   {
> +	const struct edid *edid = drm_edid->edid;
> +
>   	if (edid->revision >= 2) {
>   		if (edid->revision >= 4 && (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF))
>   			return LEVEL_CVT;
> -		if (drm_gtf2_hbreak(edid))
> +		if (drm_gtf2_hbreak(drm_edid))
>   			return LEVEL_GTF2;
>   		if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)
>   			return LEVEL_GTF;
> @@ -2770,9 +2772,9 @@ static int drm_mode_hsync(const struct drm_display_mode *mode)
>    * Take the standard timing params (in this case width, aspect, and refresh)
>    * and convert them into a real mode using CVT/GTF/DMT.
>    */
> -static struct drm_display_mode *
> -drm_mode_std(struct drm_connector *connector, const struct edid *edid,
> -	     const struct std_timing *t)
> +static struct drm_display_mode *drm_mode_std(struct drm_connector *connector,
> +					     const struct drm_edid *drm_edid,
> +					     const struct std_timing *t)
>   {
>   	struct drm_device *dev = connector->dev;
>   	struct drm_display_mode *m, *mode = NULL;
> @@ -2782,7 +2784,7 @@ drm_mode_std(struct drm_connector *connector, const struct edid *edid,
>   		>> EDID_TIMING_ASPECT_SHIFT;
>   	unsigned vfreq = (t->vfreq_aspect & EDID_TIMING_VFREQ_MASK)
>   		>> EDID_TIMING_VFREQ_SHIFT;
> -	int timing_level = standard_timing_level(edid);
> +	int timing_level = standard_timing_level(drm_edid);
>   
>   	if (bad_std_timing(t->hsize, t->vfreq_aspect))
>   		return NULL;
> @@ -2793,7 +2795,7 @@ drm_mode_std(struct drm_connector *connector, const struct edid *edid,
>   	vrefresh_rate = vfreq + 60;
>   	/* the vdisplay is calculated based on the aspect ratio */
>   	if (aspect_ratio == 0) {
> -		if (edid->revision < 3)
> +		if (drm_edid->edid->revision < 3)
>   			vsize = hsize;
>   		else
>   			vsize = (hsize * 10) / 16;
> @@ -2836,7 +2838,7 @@ drm_mode_std(struct drm_connector *connector, const struct edid *edid,
>   	}
>   
>   	/* check whether it can be found in default mode table */
> -	if (drm_monitor_supports_rb(edid)) {
> +	if (drm_monitor_supports_rb(drm_edid->edid)) {
>   		mode = drm_mode_find_dmt(dev, hsize, vsize, vrefresh_rate,
>   					 true);
>   		if (mode)
> @@ -2862,14 +2864,14 @@ drm_mode_std(struct drm_connector *connector, const struct edid *edid,
>   		mode = drm_gtf_mode(dev, hsize, vsize, vrefresh_rate, 0, 0);
>   		if (!mode)
>   			return NULL;
> -		if (drm_mode_hsync(mode) > drm_gtf2_hbreak(edid)) {
> +		if (drm_mode_hsync(mode) > drm_gtf2_hbreak(drm_edid)) {
>   			drm_mode_destroy(dev, mode);
>   			mode = drm_gtf_mode_complex(dev, hsize, vsize,
>   						    vrefresh_rate, 0, 0,
> -						    drm_gtf2_m(edid),
> -						    drm_gtf2_2c(edid),
> -						    drm_gtf2_k(edid),
> -						    drm_gtf2_2j(edid));
> +						    drm_gtf2_m(drm_edid),
> +						    drm_gtf2_2c(drm_edid),
> +						    drm_gtf2_k(drm_edid),
> +						    drm_gtf2_2j(drm_edid));
>   		}
>   		break;
>   	case LEVEL_CVT:
> @@ -3360,7 +3362,7 @@ do_standard_modes(const struct detailed_timing *timing, void *c)
>   		const struct std_timing *std = &data->data.timings[i];
>   		struct drm_display_mode *newmode;
>   
> -		newmode = drm_mode_std(connector, closure->drm_edid->edid, std);
> +		newmode = drm_mode_std(connector, closure->drm_edid, std);
>   		if (newmode) {
>   			drm_mode_probed_add(connector, newmode);
>   			closure->modes++;
> @@ -3385,7 +3387,7 @@ static int add_standard_modes(struct drm_connector *connector,
>   	for (i = 0; i < EDID_STD_TIMINGS; i++) {
>   		struct drm_display_mode *newmode;
>   
> -		newmode = drm_mode_std(connector, drm_edid->edid,
> +		newmode = drm_mode_std(connector, drm_edid,
>   				       &drm_edid->edid->standard_timings[i]);
>   		if (newmode) {
>   			drm_mode_probed_add(connector, newmode);

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Intel-gfx] [PATCH v2 14/25] drm/edid: convert mode_in_range() and drm_monitor_supports_rb() to drm_edid
  2022-05-09 12:03 ` [PATCH v2 14/25] drm/edid: convert mode_in_range() and drm_monitor_supports_rb() " Jani Nikula
@ 2022-05-10  9:22   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10  9:22 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit

On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 27 ++++++++++++++-------------
>   1 file changed, 14 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index bea8f33c58ad..364949e146a9 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -2645,16 +2645,16 @@ is_rb(const struct detailed_timing *descriptor, void *data)
>   
>   /* EDID 1.4 defines this explicitly.  For EDID 1.3, we guess, badly. */
>   static bool
> -drm_monitor_supports_rb(const struct edid *edid)
> +drm_monitor_supports_rb(const struct drm_edid *drm_edid)
>   {
> -	if (edid->revision >= 4) {
> +	if (drm_edid->edid->revision >= 4) {
>   		bool ret = false;
>   
> -		drm_for_each_detailed_block(edid, is_rb, &ret);
> +		drm_for_each_detailed_block(drm_edid->edid, is_rb, &ret);
>   		return ret;
>   	}
>   
> -	return ((edid->input & DRM_EDID_INPUT_DIGITAL) != 0);
> +	return ((drm_edid->edid->input & DRM_EDID_INPUT_DIGITAL) != 0);
>   }
>   
>   static void
> @@ -2838,7 +2838,7 @@ static struct drm_display_mode *drm_mode_std(struct drm_connector *connector,
>   	}
>   
>   	/* check whether it can be found in default mode table */
> -	if (drm_monitor_supports_rb(drm_edid->edid)) {
> +	if (drm_monitor_supports_rb(drm_edid)) {
>   		mode = drm_mode_find_dmt(dev, hsize, vsize, vrefresh_rate,
>   					 true);
>   		if (mode)
> @@ -3077,10 +3077,11 @@ range_pixel_clock(const struct edid *edid, const u8 *t)
>   	return t[9] * 10000 + 5001;
>   }
>   
> -static bool
> -mode_in_range(const struct drm_display_mode *mode, const struct edid *edid,
> -	      const struct detailed_timing *timing)
> +static bool mode_in_range(const struct drm_display_mode *mode,
> +			  const struct drm_edid *drm_edid,
> +			  const struct detailed_timing *timing)
>   {
> +	const struct edid *edid = drm_edid->edid;
>   	u32 max_clock;
>   	const u8 *t = (const u8 *)timing;
>   
> @@ -3099,7 +3100,7 @@ mode_in_range(const struct drm_display_mode *mode, const struct edid *edid,
>   		if (t[13] && mode->hdisplay > 8 * (t[13] + (256 * (t[12]&0x3))))
>   			return false;
>   
> -	if (mode_is_rb(mode) && !drm_monitor_supports_rb(edid))
> +	if (mode_is_rb(mode) && !drm_monitor_supports_rb(drm_edid))
>   		return false;
>   
>   	return true;
> @@ -3132,7 +3133,7 @@ static int drm_dmt_modes_for_range(struct drm_connector *connector,
>   	struct drm_device *dev = connector->dev;
>   
>   	for (i = 0; i < ARRAY_SIZE(drm_dmt_modes); i++) {
> -		if (mode_in_range(drm_dmt_modes + i, drm_edid->edid, timing) &&
> +		if (mode_in_range(drm_dmt_modes + i, drm_edid, timing) &&
>   		    valid_inferred_mode(connector, drm_dmt_modes + i)) {
>   			newmode = drm_mode_duplicate(dev, &drm_dmt_modes[i]);
>   			if (newmode) {
> @@ -3174,7 +3175,7 @@ static int drm_gtf_modes_for_range(struct drm_connector *connector,
>   			return modes;
>   
>   		drm_mode_fixup_1366x768(newmode);
> -		if (!mode_in_range(newmode, drm_edid->edid, timing) ||
> +		if (!mode_in_range(newmode, drm_edid, timing) ||
>   		    !valid_inferred_mode(connector, newmode)) {
>   			drm_mode_destroy(dev, newmode);
>   			continue;
> @@ -3194,7 +3195,7 @@ static int drm_cvt_modes_for_range(struct drm_connector *connector,
>   	int i, modes = 0;
>   	struct drm_display_mode *newmode;
>   	struct drm_device *dev = connector->dev;
> -	bool rb = drm_monitor_supports_rb(drm_edid->edid);
> +	bool rb = drm_monitor_supports_rb(drm_edid);
>   
>   	for (i = 0; i < ARRAY_SIZE(extra_modes); i++) {
>   		const struct minimode *m = &extra_modes[i];
> @@ -3204,7 +3205,7 @@ static int drm_cvt_modes_for_range(struct drm_connector *connector,
>   			return modes;
>   
>   		drm_mode_fixup_1366x768(newmode);
> -		if (!mode_in_range(newmode, drm_edid->edid, timing) ||
> +		if (!mode_in_range(newmode, drm_edid, timing) ||
>   		    !valid_inferred_mode(connector, newmode)) {
>   			drm_mode_destroy(dev, newmode);
>   			continue;

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH v2 15/25] drm/edid: convert get_monitor_name() to drm_edid
  2022-05-09 12:03 ` [PATCH v2 15/25] drm/edid: convert get_monitor_name() " Jani Nikula
@ 2022-05-10  9:29   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10  9:29 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit

On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere.
>
> v2: Drop incorrect NULL name check (Dan Carpenter)
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 24 ++++++++++++++++--------
>   1 file changed, 16 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 364949e146a9..e3ff0f31a614 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -4830,15 +4830,15 @@ monitor_name(const struct detailed_timing *timing, void *data)
>   	*res = timing->data.other_data.data.str.str;
>   }
>   
> -static int get_monitor_name(const struct edid *edid, char name[13])
> +static int get_monitor_name(const struct drm_edid *drm_edid, char name[13])
>   {
>   	const char *edid_name = NULL;
>   	int mnl;
>   
> -	if (!edid || !name)
> +	if (!drm_edid || !name)
>   		return 0;
>   
> -	drm_for_each_detailed_block(edid, monitor_name, &edid_name);
> +	drm_for_each_detailed_block(drm_edid->edid, monitor_name, &edid_name);
>   	for (mnl = 0; edid_name && mnl < 13; mnl++) {
>   		if (edid_name[mnl] == 0x0a)
>   			break;
> @@ -4858,14 +4858,22 @@ static int get_monitor_name(const struct edid *edid, char name[13])
>    */
>   void drm_edid_get_monitor_name(const struct edid *edid, char *name, int bufsize)
>   {
> -	int name_length;
> -	char buf[13];
> +	int name_length = 0;
>   
>   	if (bufsize <= 0)
>   		return;
>   
> -	name_length = min(get_monitor_name(edid, buf), bufsize - 1);
> -	memcpy(name, buf, name_length);
> +	if (edid) {
> +		char buf[13];
> +		struct drm_edid drm_edid = {
> +			.edid = edid,
> +			.size = edid_size(edid),
> +		};
> +
> +		name_length = min(get_monitor_name(&drm_edid, buf), bufsize - 1);
> +		memcpy(name, buf, name_length);
> +	}
> +
>   	name[name_length] = '\0';
>   }
>   EXPORT_SYMBOL(drm_edid_get_monitor_name);
> @@ -4905,7 +4913,7 @@ static void drm_edid_to_eld(struct drm_connector *connector,
>   	if (!drm_edid)
>   		return;
>   
> -	mnl = get_monitor_name(drm_edid->edid, &eld[DRM_ELD_MONITOR_NAME_STRING]);
> +	mnl = get_monitor_name(drm_edid, &eld[DRM_ELD_MONITOR_NAME_STRING]);
>   	DRM_DEBUG_KMS("ELD monitor %s\n", &eld[DRM_ELD_MONITOR_NAME_STRING]);
>   
>   	eld[DRM_ELD_CEA_EDID_VER_MNL] = info->cea_rev << DRM_ELD_CEA_EDID_VER_SHIFT;

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH v2 16/25] drm/edid: convert drm_for_each_detailed_block() to drm_edid
  2022-05-09 12:03 ` [PATCH v2 16/25] drm/edid: convert drm_for_each_detailed_block() " Jani Nikula
@ 2022-05-10  9:36   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10  9:36 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit

On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere.
>
> v2: Fix checkpatch warning on superfluous parens
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 36 ++++++++++++++++++------------------
>   1 file changed, 18 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index e3ff0f31a614..61551ce0db88 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -2598,20 +2598,20 @@ vtb_for_each_detailed_block(const u8 *ext, detailed_cb *cb, void *closure)
>   		cb((const struct detailed_timing *)(det_base + 18 * i), closure);
>   }
>   
> -static void
> -drm_for_each_detailed_block(const struct edid *edid, detailed_cb *cb, void *closure)
> +static void drm_for_each_detailed_block(const struct drm_edid *drm_edid,
> +					detailed_cb *cb, void *closure)
>   {
>   	struct drm_edid_iter edid_iter;
>   	const u8 *ext;
>   	int i;
>   
> -	if (edid == NULL)
> +	if (!drm_edid)
>   		return;
>   
>   	for (i = 0; i < EDID_DETAILED_TIMINGS; i++)
> -		cb(&(edid->detailed_timings[i]), closure);
> +		cb(&drm_edid->edid->detailed_timings[i], closure);
>   
> -	drm_edid_iter_begin(edid, &edid_iter);
> +	drm_edid_iter_begin(drm_edid->edid, &edid_iter);
>   	drm_edid_iter_for_each(ext, &edid_iter) {
>   		switch (*ext) {
>   		case CEA_EXT:
> @@ -2650,7 +2650,7 @@ drm_monitor_supports_rb(const struct drm_edid *drm_edid)
>   	if (drm_edid->edid->revision >= 4) {
>   		bool ret = false;
>   
> -		drm_for_each_detailed_block(drm_edid->edid, is_rb, &ret);
> +		drm_for_each_detailed_block(drm_edid, is_rb, &ret);
>   		return ret;
>   	}
>   
> @@ -2677,7 +2677,7 @@ drm_gtf2_hbreak(const struct drm_edid *drm_edid)
>   {
>   	const struct detailed_timing *descriptor = NULL;
>   
> -	drm_for_each_detailed_block(drm_edid->edid, find_gtf2, &descriptor);
> +	drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
>   
>   	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.hfreq_start_khz) != 12);
>   
> @@ -2689,7 +2689,7 @@ drm_gtf2_2c(const struct drm_edid *drm_edid)
>   {
>   	const struct detailed_timing *descriptor = NULL;
>   
> -	drm_for_each_detailed_block(drm_edid->edid, find_gtf2, &descriptor);
> +	drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
>   
>   	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.c) != 13);
>   
> @@ -2701,7 +2701,7 @@ drm_gtf2_m(const struct drm_edid *drm_edid)
>   {
>   	const struct detailed_timing *descriptor = NULL;
>   
> -	drm_for_each_detailed_block(drm_edid->edid, find_gtf2, &descriptor);
> +	drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
>   
>   	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.m) != 14);
>   
> @@ -2713,7 +2713,7 @@ drm_gtf2_k(const struct drm_edid *drm_edid)
>   {
>   	const struct detailed_timing *descriptor = NULL;
>   
> -	drm_for_each_detailed_block(drm_edid->edid, find_gtf2, &descriptor);
> +	drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
>   
>   	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.k) != 16);
>   
> @@ -2725,7 +2725,7 @@ drm_gtf2_2j(const struct drm_edid *drm_edid)
>   {
>   	const struct detailed_timing *descriptor = NULL;
>   
> -	drm_for_each_detailed_block(drm_edid->edid, find_gtf2, &descriptor);
> +	drm_for_each_detailed_block(drm_edid, find_gtf2, &descriptor);
>   
>   	BUILD_BUG_ON(offsetof(typeof(*descriptor), data.other_data.data.range.formula.gtf2.j) != 17);
>   
> @@ -3265,7 +3265,7 @@ static int add_inferred_modes(struct drm_connector *connector,
>   	};
>   
>   	if (version_greater(drm_edid->edid, 1, 0))
> -		drm_for_each_detailed_block(drm_edid->edid, do_inferred_modes, &closure);
> +		drm_for_each_detailed_block(drm_edid, do_inferred_modes, &closure);
>   
>   	return closure.modes;
>   }
> @@ -3342,7 +3342,7 @@ static int add_established_modes(struct drm_connector *connector,
>   	}
>   
>   	if (version_greater(edid, 1, 0))
> -		drm_for_each_detailed_block(drm_edid->edid, do_established_modes,
> +		drm_for_each_detailed_block(drm_edid, do_established_modes,
>   					    &closure);
>   
>   	return modes + closure.modes;
> @@ -3397,7 +3397,7 @@ static int add_standard_modes(struct drm_connector *connector,
>   	}
>   
>   	if (version_greater(drm_edid->edid, 1, 0))
> -		drm_for_each_detailed_block(drm_edid->edid, do_standard_modes,
> +		drm_for_each_detailed_block(drm_edid, do_standard_modes,
>   					    &closure);
>   
>   	/* XXX should also look for standard codes in VTB blocks */
> @@ -3477,7 +3477,7 @@ add_cvt_modes(struct drm_connector *connector, const struct drm_edid *drm_edid)
>   	};
>   
>   	if (version_greater(drm_edid->edid, 1, 2))
> -		drm_for_each_detailed_block(drm_edid->edid, do_cvt_mode, &closure);
> +		drm_for_each_detailed_block(drm_edid, do_cvt_mode, &closure);
>   
>   	/* XXX should also look for CVT codes in VTB blocks */
>   
> @@ -3536,7 +3536,7 @@ static int add_detailed_modes(struct drm_connector *connector,
>   		closure.preferred =
>   		    (drm_edid->edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING);
>   
> -	drm_for_each_detailed_block(drm_edid->edid, do_detailed_mode, &closure);
> +	drm_for_each_detailed_block(drm_edid, do_detailed_mode, &closure);
>   
>   	return closure.modes;
>   }
> @@ -4838,7 +4838,7 @@ static int get_monitor_name(const struct drm_edid *drm_edid, char name[13])
>   	if (!drm_edid || !name)
>   		return 0;
>   
> -	drm_for_each_detailed_block(drm_edid->edid, monitor_name, &edid_name);
> +	drm_for_each_detailed_block(drm_edid, monitor_name, &edid_name);
>   	for (mnl = 0; edid_name && mnl < 13; mnl++) {
>   		if (edid_name[mnl] == 0x0a)
>   			break;
> @@ -5559,7 +5559,7 @@ static void drm_get_monitor_range(struct drm_connector *connector,
>   	if (!version_greater(drm_edid->edid, 1, 1))
>   		return;
>   
> -	drm_for_each_detailed_block(drm_edid->edid, get_monitor_range,
> +	drm_for_each_detailed_block(drm_edid, get_monitor_range,
>   				    &info->monitor_range);
>   
>   	DRM_DEBUG_KMS("Supported Monitor Refresh rate range is %d Hz - %d Hz\n",

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH v2 17/25] drm/edid: add drm_edid helper for drm_edid_to_sad()
  2022-05-09 12:03 ` [PATCH v2 17/25] drm/edid: add drm_edid helper for drm_edid_to_sad() Jani Nikula
@ 2022-05-10  9:55   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10  9:55 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx


On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere.
>
> v2: Handle NULL EDID pointer (Ville, CI)
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>


LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit

> ---
>   drivers/gpu/drm/drm_edid.c | 34 +++++++++++++++++++++-------------
>   1 file changed, 21 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 61551ce0db88..dee09359bbc3 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -4972,24 +4972,14 @@ static void drm_edid_to_eld(struct drm_connector *connector,
>   		      drm_eld_size(eld), total_sad_count);
>   }
>   
> -/**
> - * drm_edid_to_sad - extracts SADs from EDID
> - * @edid: EDID to parse
> - * @sads: pointer that will be set to the extracted SADs
> - *
> - * Looks for CEA EDID block and extracts SADs (Short Audio Descriptors) from it.
> - *
> - * Note: The returned pointer needs to be freed using kfree().
> - *
> - * Return: The number of found SADs or negative number on error.
> - */
> -int drm_edid_to_sad(const struct edid *edid, struct cea_sad **sads)
> +static int _drm_edid_to_sad(const struct drm_edid *drm_edid,
> +			    struct cea_sad **sads)
>   {
>   	const struct cea_db *db;
>   	struct cea_db_iter iter;
>   	int count = 0;
>   
> -	cea_db_iter_edid_begin(edid, &iter);
> +	cea_db_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter);
>   	cea_db_iter_for_each(db, &iter) {
>   		if (cea_db_tag(db) == CTA_DB_AUDIO) {
>   			int j;
> @@ -5015,6 +5005,24 @@ int drm_edid_to_sad(const struct edid *edid, struct cea_sad **sads)
>   
>   	return count;
>   }
> +
> +/**
> + * drm_edid_to_sad - extracts SADs from EDID
> + * @edid: EDID to parse
> + * @sads: pointer that will be set to the extracted SADs
> + *
> + * Looks for CEA EDID block and extracts SADs (Short Audio Descriptors) from it.
> + *
> + * Note: The returned pointer needs to be freed using kfree().
> + *
> + * Return: The number of found SADs or negative number on error.
> + */
> +int drm_edid_to_sad(const struct edid *edid, struct cea_sad **sads)
> +{
> +	struct drm_edid drm_edid;
> +
> +	return _drm_edid_to_sad(drm_edid_legacy_init(&drm_edid, edid), sads);
> +}
>   EXPORT_SYMBOL(drm_edid_to_sad);
>   
>   /**

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Intel-gfx] [PATCH v2 18/25] drm/edid: add drm_edid helper for drm_edid_to_speaker_allocation()
  2022-05-09 12:03 ` [PATCH v2 18/25] drm/edid: add drm_edid helper for drm_edid_to_speaker_allocation() Jani Nikula
@ 2022-05-10 10:08   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10 10:08 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx

LGTM

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit

On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere.'
>
> v2: Handle NULL EDID pointer (Ville, CI)
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 37 +++++++++++++++++++++++--------------
>   1 file changed, 23 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index dee09359bbc3..5cc851f6d3b3 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -5025,25 +5025,14 @@ int drm_edid_to_sad(const struct edid *edid, struct cea_sad **sads)
>   }
>   EXPORT_SYMBOL(drm_edid_to_sad);
>   
> -/**
> - * drm_edid_to_speaker_allocation - extracts Speaker Allocation Data Blocks from EDID
> - * @edid: EDID to parse
> - * @sadb: pointer to the speaker block
> - *
> - * Looks for CEA EDID block and extracts the Speaker Allocation Data Block from it.
> - *
> - * Note: The returned pointer needs to be freed using kfree().
> - *
> - * Return: The number of found Speaker Allocation Blocks or negative number on
> - * error.
> - */
> -int drm_edid_to_speaker_allocation(const struct edid *edid, u8 **sadb)
> +static int _drm_edid_to_speaker_allocation(const struct drm_edid *drm_edid,
> +					   u8 **sadb)
>   {
>   	const struct cea_db *db;
>   	struct cea_db_iter iter;
>   	int count = 0;
>   
> -	cea_db_iter_edid_begin(edid, &iter);
> +	cea_db_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter);
>   	cea_db_iter_for_each(db, &iter) {
>   		if (cea_db_tag(db) == CTA_DB_SPEAKER &&
>   		    cea_db_payload_len(db) == 3) {
> @@ -5061,6 +5050,26 @@ int drm_edid_to_speaker_allocation(const struct edid *edid, u8 **sadb)
>   
>   	return count;
>   }
> +
> +/**
> + * drm_edid_to_speaker_allocation - extracts Speaker Allocation Data Blocks from EDID
> + * @edid: EDID to parse
> + * @sadb: pointer to the speaker block
> + *
> + * Looks for CEA EDID block and extracts the Speaker Allocation Data Block from it.
> + *
> + * Note: The returned pointer needs to be freed using kfree().
> + *
> + * Return: The number of found Speaker Allocation Blocks or negative number on
> + * error.
> + */
> +int drm_edid_to_speaker_allocation(const struct edid *edid, u8 **sadb)
> +{
> +	struct drm_edid drm_edid;
> +
> +	return _drm_edid_to_speaker_allocation(drm_edid_legacy_init(&drm_edid, edid),
> +					       sadb);
> +}
>   EXPORT_SYMBOL(drm_edid_to_speaker_allocation);
>   
>   /**

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Intel-gfx] [PATCH v2 19/25] drm/edid: add drm_edid helper for drm_detect_hdmi_monitor()
  2022-05-09 12:03 ` [PATCH v2 19/25] drm/edid: add drm_edid helper for drm_detect_hdmi_monitor() Jani Nikula
@ 2022-05-10 10:15   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10 10:15 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit

On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere.
>
> v2: Handle NULL EDID pointer (Ville, CI)
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 33 ++++++++++++++++++++-------------
>   1 file changed, 20 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 5cc851f6d3b3..fc74159cd426 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -5113,18 +5113,7 @@ int drm_av_sync_delay(struct drm_connector *connector,
>   }
>   EXPORT_SYMBOL(drm_av_sync_delay);
>   
> -/**
> - * drm_detect_hdmi_monitor - detect whether monitor is HDMI
> - * @edid: monitor EDID information
> - *
> - * Parse the CEA extension according to CEA-861-B.
> - *
> - * Drivers that have added the modes parsed from EDID to drm_display_info
> - * should use &drm_display_info.is_hdmi instead of calling this function.
> - *
> - * Return: True if the monitor is HDMI, false if not or unknown.
> - */
> -bool drm_detect_hdmi_monitor(const struct edid *edid)
> +static bool _drm_detect_hdmi_monitor(const struct drm_edid *drm_edid)
>   {
>   	const struct cea_db *db;
>   	struct cea_db_iter iter;
> @@ -5134,7 +5123,7 @@ bool drm_detect_hdmi_monitor(const struct edid *edid)
>   	 * Because HDMI identifier is in Vendor Specific Block,
>   	 * search it from all data blocks of CEA extension.
>   	 */
> -	cea_db_iter_edid_begin(edid, &iter);
> +	cea_db_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter);
>   	cea_db_iter_for_each(db, &iter) {
>   		if (cea_db_is_hdmi_vsdb(db)) {
>   			hdmi = true;
> @@ -5145,6 +5134,24 @@ bool drm_detect_hdmi_monitor(const struct edid *edid)
>   
>   	return hdmi;
>   }
> +
> +/**
> + * drm_detect_hdmi_monitor - detect whether monitor is HDMI
> + * @edid: monitor EDID information
> + *
> + * Parse the CEA extension according to CEA-861-B.
> + *
> + * Drivers that have added the modes parsed from EDID to drm_display_info
> + * should use &drm_display_info.is_hdmi instead of calling this function.
> + *
> + * Return: True if the monitor is HDMI, false if not or unknown.
> + */
> +bool drm_detect_hdmi_monitor(const struct edid *edid)
> +{
> +	struct drm_edid drm_edid;
> +
> +	return _drm_detect_hdmi_monitor(drm_edid_legacy_init(&drm_edid, edid));
> +}
>   EXPORT_SYMBOL(drm_detect_hdmi_monitor);
>   
>   /**

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Intel-gfx] [PATCH v2 20/25] drm/edid: add drm_edid helper for drm_detect_monitor_audio()
  2022-05-09 12:03 ` [PATCH v2 20/25] drm/edid: add drm_edid helper for drm_detect_monitor_audio() Jani Nikula
@ 2022-05-10 10:17   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10 10:17 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit

On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere.
>
> v2: Handle NULL EDID pointer (Ville, CI)
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 37 ++++++++++++++++++++++---------------
>   1 file changed, 22 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index fc74159cd426..f072cfba9dd9 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -5154,19 +5154,7 @@ bool drm_detect_hdmi_monitor(const struct edid *edid)
>   }
>   EXPORT_SYMBOL(drm_detect_hdmi_monitor);
>   
> -/**
> - * drm_detect_monitor_audio - check monitor audio capability
> - * @edid: EDID block to scan
> - *
> - * Monitor should have CEA extension block.
> - * If monitor has 'basic audio', but no CEA audio blocks, it's 'basic
> - * audio' only. If there is any audio extension block and supported
> - * audio format, assume at least 'basic audio' support, even if 'basic
> - * audio' is not defined in EDID.
> - *
> - * Return: True if the monitor supports audio, false otherwise.
> - */
> -bool drm_detect_monitor_audio(const struct edid *edid)
> +static bool _drm_detect_monitor_audio(const struct drm_edid *drm_edid)
>   {
>   	struct drm_edid_iter edid_iter;
>   	const struct cea_db *db;
> @@ -5174,7 +5162,7 @@ bool drm_detect_monitor_audio(const struct edid *edid)
>   	const u8 *edid_ext;
>   	bool has_audio = false;
>   
> -	drm_edid_iter_begin(edid, &edid_iter);
> +	drm_edid_iter_begin(drm_edid ? drm_edid->edid : NULL, &edid_iter);
>   	drm_edid_iter_for_each(edid_ext, &edid_iter) {
>   		if (edid_ext[0] == CEA_EXT) {
>   			has_audio = edid_ext[3] & EDID_BASIC_AUDIO;
> @@ -5189,7 +5177,7 @@ bool drm_detect_monitor_audio(const struct edid *edid)
>   		goto end;
>   	}
>   
> -	cea_db_iter_edid_begin(edid, &iter);
> +	cea_db_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter);
>   	cea_db_iter_for_each(db, &iter) {
>   		if (cea_db_tag(db) == CTA_DB_AUDIO) {
>   			const u8 *data = cea_db_data(db);
> @@ -5207,6 +5195,25 @@ bool drm_detect_monitor_audio(const struct edid *edid)
>   end:
>   	return has_audio;
>   }
> +
> +/**
> + * drm_detect_monitor_audio - check monitor audio capability
> + * @edid: EDID block to scan
> + *
> + * Monitor should have CEA extension block.
> + * If monitor has 'basic audio', but no CEA audio blocks, it's 'basic
> + * audio' only. If there is any audio extension block and supported
> + * audio format, assume at least 'basic audio' support, even if 'basic
> + * audio' is not defined in EDID.
> + *
> + * Return: True if the monitor supports audio, false otherwise.
> + */
> +bool drm_detect_monitor_audio(const struct edid *edid)
> +{
> +	struct drm_edid drm_edid;
> +
> +	return _drm_detect_monitor_audio(drm_edid_legacy_init(&drm_edid, edid));
> +}
>   EXPORT_SYMBOL(drm_detect_monitor_audio);
>   
>   

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH v2 21/25] drm/edid: convert cea_db_iter_edid_begin() to drm_edid
  2022-05-09 12:03 ` [PATCH v2 21/25] drm/edid: convert cea_db_iter_edid_begin() to drm_edid Jani Nikula
@ 2022-05-10 10:21   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10 10:21 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit

On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere.
>
> v2: Handle NULL drm_edid
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 21 +++++++++++----------
>   1 file changed, 11 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index f072cfba9dd9..bd14010ed1c5 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -4448,12 +4448,13 @@ static bool cea_db_is_vendor(const struct cea_db *db, int vendor_oui)
>   		oui(data[2], data[1], data[0]) == vendor_oui;
>   }
>   
> -static void cea_db_iter_edid_begin(const struct edid *edid, struct cea_db_iter *iter)
> +static void cea_db_iter_edid_begin(const struct drm_edid *drm_edid,
> +				   struct cea_db_iter *iter)
>   {
>   	memset(iter, 0, sizeof(*iter));
>   
> -	drm_edid_iter_begin(edid, &iter->edid_iter);
> -	displayid_iter_edid_begin(edid, &iter->displayid_iter);
> +	drm_edid_iter_begin(drm_edid ? drm_edid->edid : NULL, &iter->edid_iter);
> +	displayid_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter->displayid_iter);
>   }
>   
>   static const struct cea_db *
> @@ -4675,7 +4676,7 @@ static int add_cea_modes(struct drm_connector *connector,
>   	struct cea_db_iter iter;
>   	int modes = 0;
>   
> -	cea_db_iter_edid_begin(drm_edid->edid, &iter);
> +	cea_db_iter_edid_begin(drm_edid, &iter);
>   	cea_db_iter_for_each(db, &iter) {
>   		const u8 *hdmi = NULL, *video = NULL;
>   		u8 hdmi_len = 0, video_len = 0;
> @@ -4926,7 +4927,7 @@ static void drm_edid_to_eld(struct drm_connector *connector,
>   	eld[DRM_ELD_PRODUCT_CODE0] = drm_edid->edid->prod_code[0];
>   	eld[DRM_ELD_PRODUCT_CODE1] = drm_edid->edid->prod_code[1];
>   
> -	cea_db_iter_edid_begin(drm_edid->edid, &iter);
> +	cea_db_iter_edid_begin(drm_edid, &iter);
>   	cea_db_iter_for_each(db, &iter) {
>   		const u8 *data = cea_db_data(db);
>   		int len = cea_db_payload_len(db);
> @@ -4979,7 +4980,7 @@ static int _drm_edid_to_sad(const struct drm_edid *drm_edid,
>   	struct cea_db_iter iter;
>   	int count = 0;
>   
> -	cea_db_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter);
> +	cea_db_iter_edid_begin(drm_edid, &iter);
>   	cea_db_iter_for_each(db, &iter) {
>   		if (cea_db_tag(db) == CTA_DB_AUDIO) {
>   			int j;
> @@ -5032,7 +5033,7 @@ static int _drm_edid_to_speaker_allocation(const struct drm_edid *drm_edid,
>   	struct cea_db_iter iter;
>   	int count = 0;
>   
> -	cea_db_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter);
> +	cea_db_iter_edid_begin(drm_edid, &iter);
>   	cea_db_iter_for_each(db, &iter) {
>   		if (cea_db_tag(db) == CTA_DB_SPEAKER &&
>   		    cea_db_payload_len(db) == 3) {
> @@ -5123,7 +5124,7 @@ static bool _drm_detect_hdmi_monitor(const struct drm_edid *drm_edid)
>   	 * Because HDMI identifier is in Vendor Specific Block,
>   	 * search it from all data blocks of CEA extension.
>   	 */
> -	cea_db_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter);
> +	cea_db_iter_edid_begin(drm_edid, &iter);
>   	cea_db_iter_for_each(db, &iter) {
>   		if (cea_db_is_hdmi_vsdb(db)) {
>   			hdmi = true;
> @@ -5177,7 +5178,7 @@ static bool _drm_detect_monitor_audio(const struct drm_edid *drm_edid)
>   		goto end;
>   	}
>   
> -	cea_db_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter);
> +	cea_db_iter_edid_begin(drm_edid, &iter);
>   	cea_db_iter_for_each(db, &iter) {
>   		if (cea_db_tag(db) == CTA_DB_AUDIO) {
>   			const u8 *data = cea_db_data(db);
> @@ -5536,7 +5537,7 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
>   	}
>   	drm_edid_iter_end(&edid_iter);
>   
> -	cea_db_iter_edid_begin(drm_edid->edid, &iter);
> +	cea_db_iter_edid_begin(drm_edid, &iter);
>   	cea_db_iter_for_each(db, &iter) {
>   		/* FIXME: convert parsers to use struct cea_db */
>   		const u8 *data = (const u8 *)db;

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH v2 22/25] drm/edid: convert drm_edid_iter_begin() to drm_edid
  2022-05-09 12:03 ` [PATCH v2 22/25] drm/edid: convert drm_edid_iter_begin() " Jani Nikula
@ 2022-05-10 10:25   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10 10:25 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit

On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere.
>
> v2: Rebase
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 22 +++++++++++-----------
>   1 file changed, 11 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index bd14010ed1c5..d857d1d74c82 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -1632,36 +1632,36 @@ static const struct drm_edid *drm_edid_legacy_init(struct drm_edid *drm_edid,
>    * struct drm_edid_iter iter;
>    * const u8 *block;
>    *
> - * drm_edid_iter_begin(edid, &iter);
> + * drm_edid_iter_begin(drm_edid, &iter);
>    * drm_edid_iter_for_each(block, &iter) {
>    *         // do stuff with block
>    * }
>    * drm_edid_iter_end(&iter);
>    */
>   struct drm_edid_iter {
> -	const struct edid *edid;
> +	const struct drm_edid *drm_edid;
>   
>   	/* Current block index. */
>   	int index;
>   };
>   
> -static void drm_edid_iter_begin(const struct edid *edid,
> +static void drm_edid_iter_begin(const struct drm_edid *drm_edid,
>   				struct drm_edid_iter *iter)
>   {
>   	memset(iter, 0, sizeof(*iter));
>   
> -	iter->edid = edid;
> +	iter->drm_edid = drm_edid;
>   }
>   
>   static const void *__drm_edid_iter_next(struct drm_edid_iter *iter)
>   {
>   	const void *block = NULL;
>   
> -	if (!iter->edid)
> +	if (!iter->drm_edid)
>   		return NULL;
>   
> -	if (iter->index < edid_block_count(iter->edid))
> -		block = edid_block_data(iter->edid, iter->index++);
> +	if (iter->index < edid_block_count(iter->drm_edid->edid))
> +		block = edid_block_data(iter->drm_edid->edid, iter->index++);
>   
>   	return block;
>   }
> @@ -2611,7 +2611,7 @@ static void drm_for_each_detailed_block(const struct drm_edid *drm_edid,
>   	for (i = 0; i < EDID_DETAILED_TIMINGS; i++)
>   		cb(&drm_edid->edid->detailed_timings[i], closure);
>   
> -	drm_edid_iter_begin(drm_edid->edid, &edid_iter);
> +	drm_edid_iter_begin(drm_edid, &edid_iter);
>   	drm_edid_iter_for_each(ext, &edid_iter) {
>   		switch (*ext) {
>   		case CEA_EXT:
> @@ -4453,7 +4453,7 @@ static void cea_db_iter_edid_begin(const struct drm_edid *drm_edid,
>   {
>   	memset(iter, 0, sizeof(*iter));
>   
> -	drm_edid_iter_begin(drm_edid ? drm_edid->edid : NULL, &iter->edid_iter);
> +	drm_edid_iter_begin(drm_edid, &iter->edid_iter);
>   	displayid_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter->displayid_iter);
>   }
>   
> @@ -5163,7 +5163,7 @@ static bool _drm_detect_monitor_audio(const struct drm_edid *drm_edid)
>   	const u8 *edid_ext;
>   	bool has_audio = false;
>   
> -	drm_edid_iter_begin(drm_edid ? drm_edid->edid : NULL, &edid_iter);
> +	drm_edid_iter_begin(drm_edid, &edid_iter);
>   	drm_edid_iter_for_each(edid_ext, &edid_iter) {
>   		if (edid_ext[0] == CEA_EXT) {
>   			has_audio = edid_ext[3] & EDID_BASIC_AUDIO;
> @@ -5516,7 +5516,7 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
>   	struct cea_db_iter iter;
>   	const u8 *edid_ext;
>   
> -	drm_edid_iter_begin(drm_edid->edid, &edid_iter);
> +	drm_edid_iter_begin(drm_edid, &edid_iter);
>   	drm_edid_iter_for_each(edid_ext, &edid_iter) {
>   		if (edid_ext[0] != CEA_EXT)
>   			continue;

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [Intel-gfx] [PATCH v2 23/25] drm/edid: add drm_edid helper for drm_update_tile_info()
  2022-05-09 12:03 ` [PATCH v2 23/25] drm/edid: add drm_edid helper for drm_update_tile_info() Jani Nikula
@ 2022-05-10 10:28   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10 10:28 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx

LGTM.

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit

On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere.
>
> v2: Handle NULL EDID pointer (Ville, CI)
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 14 +++++++++++---
>   1 file changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index d857d1d74c82..26ac4d262e31 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -6364,15 +6364,15 @@ static void drm_parse_tiled_block(struct drm_connector *connector,
>   	}
>   }
>   
> -void drm_update_tile_info(struct drm_connector *connector,
> -			  const struct edid *edid)
> +static void _drm_update_tile_info(struct drm_connector *connector,
> +				  const struct drm_edid *drm_edid)
>   {
>   	const struct displayid_block *block;
>   	struct displayid_iter iter;
>   
>   	connector->has_tile = false;
>   
> -	displayid_iter_edid_begin(edid, &iter);
> +	displayid_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter);
>   	displayid_iter_for_each(block, &iter) {
>   		if (block->tag == DATA_BLOCK_TILED_DISPLAY)
>   			drm_parse_tiled_block(connector, block);
> @@ -6384,3 +6384,11 @@ void drm_update_tile_info(struct drm_connector *connector,
>   		connector->tile_group = NULL;
>   	}
>   }
> +
> +void drm_update_tile_info(struct drm_connector *connector,
> +			  const struct edid *edid)
> +{
> +	struct drm_edid drm_edid;
> +
> +	_drm_update_tile_info(connector, drm_edid_legacy_init(&drm_edid, edid));
> +}

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH v2 24/25] drm/displayid: convert to drm_edid
  2022-05-09 12:03 ` [PATCH v2 24/25] drm/displayid: convert to drm_edid Jani Nikula
@ 2022-05-10 12:04   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10 12:04 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx

LGTM

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit

On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere.
>
> v2: Rebase
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_displayid.c | 16 ++++++++--------
>   drivers/gpu/drm/drm_edid.c      | 17 ++++++++++-------
>   include/drm/drm_displayid.h     |  6 +++---
>   include/drm/drm_edid.h          |  6 ++++--
>   4 files changed, 25 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_displayid.c b/drivers/gpu/drm/drm_displayid.c
> index 32da557b960f..38ea8203df45 100644
> --- a/drivers/gpu/drm/drm_displayid.c
> +++ b/drivers/gpu/drm/drm_displayid.c
> @@ -33,11 +33,11 @@ static int validate_displayid(const u8 *displayid, int length, int idx)
>   	return 0;
>   }
>   
> -static const u8 *drm_find_displayid_extension(const struct edid *edid,
> +static const u8 *drm_find_displayid_extension(const struct drm_edid *drm_edid,
>   					      int *length, int *idx,
>   					      int *ext_index)
>   {
> -	const u8 *displayid = drm_find_edid_extension(edid, DISPLAYID_EXT, ext_index);
> +	const u8 *displayid = drm_find_edid_extension(drm_edid, DISPLAYID_EXT, ext_index);
>   	const struct displayid_header *base;
>   	int ret;
>   
> @@ -58,12 +58,12 @@ static const u8 *drm_find_displayid_extension(const struct edid *edid,
>   	return displayid;
>   }
>   
> -void displayid_iter_edid_begin(const struct edid *edid,
> +void displayid_iter_edid_begin(const struct drm_edid *drm_edid,
>   			       struct displayid_iter *iter)
>   {
>   	memset(iter, 0, sizeof(*iter));
>   
> -	iter->edid = edid;
> +	iter->drm_edid = drm_edid;
>   }
>   
>   static const struct displayid_block *
> @@ -88,7 +88,7 @@ __displayid_iter_next(struct displayid_iter *iter)
>   {
>   	const struct displayid_block *block;
>   
> -	if (!iter->edid)
> +	if (!iter->drm_edid)
>   		return NULL;
>   
>   	if (iter->section) {
> @@ -96,7 +96,7 @@ __displayid_iter_next(struct displayid_iter *iter)
>   		block = displayid_iter_block(iter);
>   		if (WARN_ON(!block)) {
>   			iter->section = NULL;
> -			iter->edid = NULL;
> +			iter->drm_edid = NULL;
>   			return NULL;
>   		}
>   
> @@ -109,12 +109,12 @@ __displayid_iter_next(struct displayid_iter *iter)
>   	}
>   
>   	for (;;) {
> -		iter->section = drm_find_displayid_extension(iter->edid,
> +		iter->section = drm_find_displayid_extension(iter->drm_edid,
>   							     &iter->length,
>   							     &iter->idx,
>   							     &iter->ext_index);
>   		if (!iter->section) {
> -			iter->edid = NULL;
> +			iter->drm_edid = NULL;
>   			return NULL;
>   		}
>   
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 26ac4d262e31..a44818f44718 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -3563,10 +3563,13 @@ static int add_detailed_modes(struct drm_connector *connector,
>   
>   /*
>    * Search EDID for CEA extension block.
> + *
> + * FIXME: Prefer not returning pointers to raw EDID data.
>    */
> -const u8 *drm_find_edid_extension(const struct edid *edid,
> +const u8 *drm_find_edid_extension(const struct drm_edid *drm_edid,
>   				  int ext_id, int *ext_index)
>   {
> +	const struct edid *edid = drm_edid ? drm_edid->edid : NULL;
>   	const u8 *edid_ext = NULL;
>   	int i;
>   
> @@ -3598,11 +3601,11 @@ static bool drm_edid_has_cta_extension(const struct drm_edid *drm_edid)
>   	bool found = false;
>   
>   	/* Look for a top level CEA extension block */
> -	if (drm_find_edid_extension(drm_edid->edid, CEA_EXT, &ext_index))
> +	if (drm_find_edid_extension(drm_edid, CEA_EXT, &ext_index))
>   		return true;
>   
>   	/* CEA blocks can also be found embedded in a DisplayID block */
> -	displayid_iter_edid_begin(drm_edid->edid, &iter);
> +	displayid_iter_edid_begin(drm_edid, &iter);
>   	displayid_iter_for_each(block, &iter) {
>   		if (block->tag == DATA_BLOCK_CTA) {
>   			found = true;
> @@ -4454,7 +4457,7 @@ static void cea_db_iter_edid_begin(const struct drm_edid *drm_edid,
>   	memset(iter, 0, sizeof(*iter));
>   
>   	drm_edid_iter_begin(drm_edid, &iter->edid_iter);
> -	displayid_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter->displayid_iter);
> +	displayid_iter_edid_begin(drm_edid, &iter->displayid_iter);
>   }
>   
>   static const struct cea_db *
> @@ -5657,7 +5660,7 @@ static void drm_update_mso(struct drm_connector *connector,
>   	const struct displayid_block *block;
>   	struct displayid_iter iter;
>   
> -	displayid_iter_edid_begin(drm_edid->edid, &iter);
> +	displayid_iter_edid_begin(drm_edid, &iter);
>   	displayid_iter_for_each(block, &iter) {
>   		if (block->tag == DATA_BLOCK_2_VENDOR_SPECIFIC)
>   			drm_parse_vesa_mso_data(connector, block);
> @@ -5872,7 +5875,7 @@ static int add_displayid_detailed_modes(struct drm_connector *connector,
>   	struct displayid_iter iter;
>   	int num_modes = 0;
>   
> -	displayid_iter_edid_begin(drm_edid->edid, &iter);
> +	displayid_iter_edid_begin(drm_edid, &iter);
>   	displayid_iter_for_each(block, &iter) {
>   		if (block->tag == DATA_BLOCK_TYPE_1_DETAILED_TIMING ||
>   		    block->tag == DATA_BLOCK_2_TYPE_7_DETAILED_TIMING)
> @@ -6372,7 +6375,7 @@ static void _drm_update_tile_info(struct drm_connector *connector,
>   
>   	connector->has_tile = false;
>   
> -	displayid_iter_edid_begin(drm_edid ? drm_edid->edid : NULL, &iter);
> +	displayid_iter_edid_begin(drm_edid, &iter);
>   	displayid_iter_for_each(block, &iter) {
>   		if (block->tag == DATA_BLOCK_TILED_DISPLAY)
>   			drm_parse_tiled_block(connector, block);
> diff --git a/include/drm/drm_displayid.h b/include/drm/drm_displayid.h
> index 7ffbd9f7bfc7..49649eb8447e 100644
> --- a/include/drm/drm_displayid.h
> +++ b/include/drm/drm_displayid.h
> @@ -25,7 +25,7 @@
>   #include <linux/types.h>
>   #include <linux/bits.h>
>   
> -struct edid;
> +struct drm_edid;
>   
>   #define VESA_IEEE_OUI				0x3a0292
>   
> @@ -141,7 +141,7 @@ struct displayid_vesa_vendor_specific_block {
>   
>   /* DisplayID iteration */
>   struct displayid_iter {
> -	const struct edid *edid;
> +	const struct drm_edid *drm_edid;
>   
>   	const u8 *section;
>   	int length;
> @@ -149,7 +149,7 @@ struct displayid_iter {
>   	int ext_index;
>   };
>   
> -void displayid_iter_edid_begin(const struct edid *edid,
> +void displayid_iter_edid_begin(const struct drm_edid *drm_edid,
>   			       struct displayid_iter *iter);
>   const struct displayid_block *
>   __displayid_iter_next(struct displayid_iter *iter);
> diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
> index c3204a58fb09..c61e75ab8f63 100644
> --- a/include/drm/drm_edid.h
> +++ b/include/drm/drm_edid.h
> @@ -28,6 +28,7 @@
>   #include <drm/drm_mode.h>
>   
>   struct drm_device;
> +struct drm_edid;
>   struct i2c_adapter;
>   
>   #define EDID_LENGTH 128
> @@ -578,8 +579,9 @@ struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev,
>   struct drm_display_mode *
>   drm_display_mode_from_cea_vic(struct drm_device *dev,
>   			      u8 video_code);
> -const u8 *drm_find_edid_extension(const struct edid *edid,
> -				  int ext_id, int *ext_index);
>   
> +/* Interface based on struct drm_edid */
> +const u8 *drm_find_edid_extension(const struct drm_edid *drm_edid,
> +				  int ext_id, int *ext_index);
>   
>   #endif /* __DRM_EDID_H__ */

^ permalink raw reply	[flat|nested] 53+ messages in thread

* Re: [PATCH v2 25/25] drm/edid: convert version_greater() to drm_edid
  2022-05-09 12:03 ` [PATCH v2 25/25] drm/edid: convert version_greater() " Jani Nikula
@ 2022-05-10 12:07   ` Nautiyal, Ankit K
  0 siblings, 0 replies; 53+ messages in thread
From: Nautiyal, Ankit K @ 2022-05-10 12:07 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx

LGTM

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Regards,

Ankit

On 5/9/2022 5:33 PM, Jani Nikula wrote:
> We'll need to propagate drm_edid everywhere. Also make version_greater()
> a function for type safety.
>
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>   drivers/gpu/drm/drm_edid.c | 29 +++++++++++++++++------------
>   1 file changed, 17 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index a44818f44718..429078bcf372 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -45,10 +45,6 @@
>   
>   #include "drm_crtc_internal.h"
>   
> -#define version_greater(edid, maj, min) \
> -	(((edid)->version > (maj)) || \
> -	 ((edid)->version == (maj) && (edid)->revision > (min)))
> -
>   static int oui(u8 first, u8 second, u8 third)
>   {
>   	return (first << 16) | (second << 8) | third;
> @@ -1576,6 +1572,15 @@ struct drm_edid {
>   	const struct edid *edid;
>   };
>   
> +static bool version_greater(const struct drm_edid *drm_edid,
> +			    u8 version, u8 revision)
> +{
> +	const struct edid *edid = drm_edid->edid;
> +
> +	return edid->version > version ||
> +		(edid->version == version && edid->revision > revision);
> +}
> +
>   static int edid_extension_block_count(const struct edid *edid)
>   {
>   	return edid->extensions;
> @@ -3232,7 +3237,7 @@ do_inferred_modes(const struct detailed_timing *timing, void *c)
>   						  closure->drm_edid,
>   						  timing);
>   
> -	if (!version_greater(closure->drm_edid->edid, 1, 1))
> +	if (!version_greater(closure->drm_edid, 1, 1))
>   		return; /* GTF not defined yet */
>   
>   	switch (range->flags) {
> @@ -3243,7 +3248,7 @@ do_inferred_modes(const struct detailed_timing *timing, void *c)
>   							  timing);
>   		break;
>   	case 0x04: /* cvt, only in 1.4+ */
> -		if (!version_greater(closure->drm_edid->edid, 1, 3))
> +		if (!version_greater(closure->drm_edid, 1, 3))
>   			break;
>   
>   		closure->modes += drm_cvt_modes_for_range(closure->connector,
> @@ -3264,7 +3269,7 @@ static int add_inferred_modes(struct drm_connector *connector,
>   		.drm_edid = drm_edid,
>   	};
>   
> -	if (version_greater(drm_edid->edid, 1, 0))
> +	if (version_greater(drm_edid, 1, 0))
>   		drm_for_each_detailed_block(drm_edid, do_inferred_modes, &closure);
>   
>   	return closure.modes;
> @@ -3341,7 +3346,7 @@ static int add_established_modes(struct drm_connector *connector,
>   		}
>   	}
>   
> -	if (version_greater(edid, 1, 0))
> +	if (version_greater(drm_edid, 1, 0))
>   		drm_for_each_detailed_block(drm_edid, do_established_modes,
>   					    &closure);
>   
> @@ -3396,7 +3401,7 @@ static int add_standard_modes(struct drm_connector *connector,
>   		}
>   	}
>   
> -	if (version_greater(drm_edid->edid, 1, 0))
> +	if (version_greater(drm_edid, 1, 0))
>   		drm_for_each_detailed_block(drm_edid, do_standard_modes,
>   					    &closure);
>   
> @@ -3476,7 +3481,7 @@ add_cvt_modes(struct drm_connector *connector, const struct drm_edid *drm_edid)
>   		.drm_edid = drm_edid,
>   	};
>   
> -	if (version_greater(drm_edid->edid, 1, 2))
> +	if (version_greater(drm_edid, 1, 2))
>   		drm_for_each_detailed_block(drm_edid, do_cvt_mode, &closure);
>   
>   	/* XXX should also look for CVT codes in VTB blocks */
> @@ -3532,7 +3537,7 @@ static int add_detailed_modes(struct drm_connector *connector,
>   		.quirks = quirks,
>   	};
>   
> -	if (closure.preferred && !version_greater(drm_edid->edid, 1, 3))
> +	if (closure.preferred && !version_greater(drm_edid, 1, 3))
>   		closure.preferred =
>   		    (drm_edid->edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING);
>   
> @@ -5591,7 +5596,7 @@ static void drm_get_monitor_range(struct drm_connector *connector,
>   {
>   	struct drm_display_info *info = &connector->display_info;
>   
> -	if (!version_greater(drm_edid->edid, 1, 1))
> +	if (!version_greater(drm_edid, 1, 1))
>   		return;
>   
>   	drm_for_each_detailed_block(drm_edid, get_monitor_range,

^ permalink raw reply	[flat|nested] 53+ messages in thread

* [PATCH v3] drm/edid: keep propagating drm_edid to display info
  2022-05-09 12:03 ` [PATCH v2 05/25] drm/edid: keep propagating drm_edid to display info Jani Nikula
  2022-05-10  6:15   ` Nautiyal, Ankit K
@ 2022-05-11  9:21   ` Jani Nikula
  1 sibling, 0 replies; 53+ messages in thread
From: Jani Nikula @ 2022-05-11  9:21 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx, Ankit Nautiyal

We'll need to propagate drm_edid everywhere.

v3: Update comment to refer to update_display_info() (Ankit)

v2: Use drm_edid_legacy_init()

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 50 +++++++++++++++++++++++---------------
 1 file changed, 30 insertions(+), 20 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index f48f1f1a1fa7..e89afa04d5ab 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -2437,13 +2437,13 @@ EXPORT_SYMBOL(drm_edid_duplicate);
 
 /**
  * edid_get_quirks - return quirk flags for a given EDID
- * @edid: EDID to process
+ * @drm_edid: EDID to process
  *
  * This tells subsequent routines what fixes they need to apply.
  */
-static u32 edid_get_quirks(const struct edid *edid)
+static u32 edid_get_quirks(const struct drm_edid *drm_edid)
 {
-	u32 panel_id = edid_extract_panel_id(edid);
+	u32 panel_id = edid_extract_panel_id(drm_edid->edid);
 	const struct edid_quirk *quirk;
 	int i;
 
@@ -5466,7 +5466,7 @@ static void drm_parse_microsoft_vsdb(struct drm_connector *connector,
 }
 
 static void drm_parse_cea_ext(struct drm_connector *connector,
-			      const struct edid *edid)
+			      const struct drm_edid *drm_edid)
 {
 	struct drm_display_info *info = &connector->display_info;
 	struct drm_edid_iter edid_iter;
@@ -5474,7 +5474,7 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
 	struct cea_db_iter iter;
 	const u8 *edid_ext;
 
-	drm_edid_iter_begin(edid, &edid_iter);
+	drm_edid_iter_begin(drm_edid->edid, &edid_iter);
 	drm_edid_iter_for_each(edid_ext, &edid_iter) {
 		if (edid_ext[0] != CEA_EXT)
 			continue;
@@ -5495,7 +5495,7 @@ static void drm_parse_cea_ext(struct drm_connector *connector,
 	}
 	drm_edid_iter_end(&edid_iter);
 
-	cea_db_iter_edid_begin(edid, &iter);
+	cea_db_iter_edid_begin(drm_edid->edid, &iter);
 	cea_db_iter_for_each(db, &iter) {
 		/* FIXME: convert parsers to use struct cea_db */
 		const u8 *data = (const u8 *)db;
@@ -5541,16 +5541,15 @@ void get_monitor_range(const struct detailed_timing *timing,
 	monitor_range->max_vfreq = range->max_vfreq;
 }
 
-static
-void drm_get_monitor_range(struct drm_connector *connector,
-			   const struct edid *edid)
+static void drm_get_monitor_range(struct drm_connector *connector,
+				  const struct drm_edid *drm_edid)
 {
 	struct drm_display_info *info = &connector->display_info;
 
-	if (!version_greater(edid, 1, 1))
+	if (!version_greater(drm_edid->edid, 1, 1))
 		return;
 
-	drm_for_each_detailed_block(edid, get_monitor_range,
+	drm_for_each_detailed_block(drm_edid->edid, get_monitor_range,
 				    &info->monitor_range);
 
 	DRM_DEBUG_KMS("Supported Monitor Refresh rate range is %d Hz - %d Hz\n",
@@ -5610,12 +5609,13 @@ static void drm_parse_vesa_mso_data(struct drm_connector *connector,
 		    info->mso_stream_count, info->mso_pixel_overlap);
 }
 
-static void drm_update_mso(struct drm_connector *connector, const struct edid *edid)
+static void drm_update_mso(struct drm_connector *connector,
+			   const struct drm_edid *drm_edid)
 {
 	const struct displayid_block *block;
 	struct displayid_iter iter;
 
-	displayid_iter_edid_begin(edid, &iter);
+	displayid_iter_edid_begin(drm_edid->edid, &iter);
 	displayid_iter_for_each(block, &iter) {
 		if (block->tag == DATA_BLOCK_2_VENDOR_SPECIFIC)
 			drm_parse_vesa_mso_data(connector, block);
@@ -5654,18 +5654,20 @@ drm_reset_display_info(struct drm_connector *connector)
 	info->mso_pixel_overlap = 0;
 }
 
-u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edid)
+static u32 update_display_info(struct drm_connector *connector,
+			       const struct drm_edid *drm_edid)
 {
 	struct drm_display_info *info = &connector->display_info;
+	const struct edid *edid = drm_edid->edid;
 
-	u32 quirks = edid_get_quirks(edid);
+	u32 quirks = edid_get_quirks(drm_edid);
 
 	drm_reset_display_info(connector);
 
 	info->width_mm = edid->width_cm * 10;
 	info->height_mm = edid->height_cm * 10;
 
-	drm_get_monitor_range(connector, edid);
+	drm_get_monitor_range(connector, drm_edid);
 
 	if (edid->revision < 3)
 		goto out;
@@ -5674,7 +5676,7 @@ u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edi
 		goto out;
 
 	info->color_formats |= DRM_COLOR_FORMAT_RGB444;
-	drm_parse_cea_ext(connector, edid);
+	drm_parse_cea_ext(connector, drm_edid);
 
 	/*
 	 * Digital sink with "DFP 1.x compliant TMDS" according to EDID 1.3?
@@ -5727,7 +5729,7 @@ u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edi
 	if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB422)
 		info->color_formats |= DRM_COLOR_FORMAT_YCBCR422;
 
-	drm_update_mso(connector, edid);
+	drm_update_mso(connector, drm_edid);
 
 out:
 	if (quirks & EDID_QUIRK_NON_DESKTOP) {
@@ -5739,6 +5741,14 @@ u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edi
 	return quirks;
 }
 
+u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edid)
+{
+	struct drm_edid drm_edid;
+
+	return update_display_info(connector,
+				   drm_edid_legacy_init(&drm_edid, edid));
+}
+
 static struct drm_display_mode *drm_mode_displayid_detailed(struct drm_device *dev,
 							    struct displayid_detailed_timings_1 *timings,
 							    bool type_7)
@@ -5851,9 +5861,9 @@ static int drm_edid_connector_update(struct drm_connector *connector,
 	 * To avoid multiple parsing of same block, lets parse that map
 	 * from sink info, before parsing CEA modes.
 	 */
-	quirks = drm_add_display_info(connector, edid);
+	quirks = update_display_info(connector, drm_edid);
 
-	/* Depends on info->cea_rev set by drm_add_display_info() above */
+	/* Depends on info->cea_rev set by update_display_info() above */
 	drm_edid_to_eld(connector, edid);
 
 	/*
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v3] drm/edid: propagate drm_edid to drm_edid_to_eld()
  2022-05-09 12:03 ` [PATCH v2 06/25] drm/edid: propagate drm_edid to drm_edid_to_eld() Jani Nikula
  2022-05-10  6:31   ` Nautiyal, Ankit K
@ 2022-05-11  9:23   ` Jani Nikula
  1 sibling, 0 replies; 53+ messages in thread
From: Jani Nikula @ 2022-05-11  9:23 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx, Ankit Nautiyal

We'll need to propagate drm_edid everywhere.

v3: Rebase

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index e89afa04d5ab..92a65ccbd730 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -4883,13 +4883,13 @@ static void clear_eld(struct drm_connector *connector)
 /*
  * drm_edid_to_eld - build ELD from EDID
  * @connector: connector corresponding to the HDMI/DP sink
- * @edid: EDID to parse
+ * @drm_edid: EDID to parse
  *
  * Fill the ELD (EDID-Like Data) buffer for passing to the audio driver. The
  * HDCP and Port_ID ELD fields are left for the graphics driver to fill in.
  */
 static void drm_edid_to_eld(struct drm_connector *connector,
-			    const struct edid *edid)
+			    const struct drm_edid *drm_edid)
 {
 	const struct drm_display_info *info = &connector->display_info;
 	const struct cea_db *db;
@@ -4900,10 +4900,10 @@ static void drm_edid_to_eld(struct drm_connector *connector,
 
 	clear_eld(connector);
 
-	if (!edid)
+	if (!drm_edid)
 		return;
 
-	mnl = get_monitor_name(edid, &eld[DRM_ELD_MONITOR_NAME_STRING]);
+	mnl = get_monitor_name(drm_edid->edid, &eld[DRM_ELD_MONITOR_NAME_STRING]);
 	DRM_DEBUG_KMS("ELD monitor %s\n", &eld[DRM_ELD_MONITOR_NAME_STRING]);
 
 	eld[DRM_ELD_CEA_EDID_VER_MNL] = info->cea_rev << DRM_ELD_CEA_EDID_VER_SHIFT;
@@ -4911,12 +4911,12 @@ static void drm_edid_to_eld(struct drm_connector *connector,
 
 	eld[DRM_ELD_VER] = DRM_ELD_VER_CEA861D;
 
-	eld[DRM_ELD_MANUFACTURER_NAME0] = edid->mfg_id[0];
-	eld[DRM_ELD_MANUFACTURER_NAME1] = edid->mfg_id[1];
-	eld[DRM_ELD_PRODUCT_CODE0] = edid->prod_code[0];
-	eld[DRM_ELD_PRODUCT_CODE1] = edid->prod_code[1];
+	eld[DRM_ELD_MANUFACTURER_NAME0] = drm_edid->edid->mfg_id[0];
+	eld[DRM_ELD_MANUFACTURER_NAME1] = drm_edid->edid->mfg_id[1];
+	eld[DRM_ELD_PRODUCT_CODE0] = drm_edid->edid->prod_code[0];
+	eld[DRM_ELD_PRODUCT_CODE1] = drm_edid->edid->prod_code[1];
 
-	cea_db_iter_edid_begin(edid, &iter);
+	cea_db_iter_edid_begin(drm_edid->edid, &iter);
 	cea_db_iter_for_each(db, &iter) {
 		const u8 *data = cea_db_data(db);
 		int len = cea_db_payload_len(db);
@@ -5864,7 +5864,7 @@ static int drm_edid_connector_update(struct drm_connector *connector,
 	quirks = update_display_info(connector, drm_edid);
 
 	/* Depends on info->cea_rev set by update_display_info() above */
-	drm_edid_to_eld(connector, edid);
+	drm_edid_to_eld(connector, drm_edid);
 
 	/*
 	 * EDID spec says modes should be preferred in this order:
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* [PATCH v3] drm/edid: convert drm_edid_connector_update() to drm_edid fully
  2022-05-09 12:03 ` [PATCH v2 07/25] drm/edid: convert drm_edid_connector_update() to drm_edid fully Jani Nikula
  2022-05-10  6:45   ` [Intel-gfx] " Nautiyal, Ankit K
@ 2022-05-11  9:26   ` Jani Nikula
  1 sibling, 0 replies; 53+ messages in thread
From: Jani Nikula @ 2022-05-11  9:26 UTC (permalink / raw)
  To: Jani Nikula, dri-devel; +Cc: intel-gfx, Ankit Nautiyal

We'll need to propagate drm_edid everywhere.

v3: s/edid/drm_edid/ in comment too (Ankit)

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 97 ++++++++++++++++++--------------------
 1 file changed, 47 insertions(+), 50 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 92a65ccbd730..9f1e5856aa77 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3253,16 +3253,16 @@ do_inferred_modes(const struct detailed_timing *timing, void *c)
 	}
 }
 
-static int
-add_inferred_modes(struct drm_connector *connector, const struct edid *edid)
+static int add_inferred_modes(struct drm_connector *connector,
+			      const struct drm_edid *drm_edid)
 {
 	struct detailed_mode_closure closure = {
 		.connector = connector,
-		.edid = edid,
+		.edid = drm_edid->edid,
 	};
 
-	if (version_greater(edid, 1, 0))
-		drm_for_each_detailed_block(edid, do_inferred_modes, &closure);
+	if (version_greater(drm_edid->edid, 1, 0))
+		drm_for_each_detailed_block(drm_edid->edid, do_inferred_modes, &closure);
 
 	return closure.modes;
 }
@@ -3312,10 +3312,11 @@ do_established_modes(const struct detailed_timing *timing, void *c)
  * bitmap of the supported "established modes" list (defined above). Tease them
  * out and add them to the global modes list.
  */
-static int
-add_established_modes(struct drm_connector *connector, const struct edid *edid)
+static int add_established_modes(struct drm_connector *connector,
+				 const struct drm_edid *drm_edid)
 {
 	struct drm_device *dev = connector->dev;
+	const struct edid *edid = drm_edid->edid;
 	unsigned long est_bits = edid->established_timings.t1 |
 		(edid->established_timings.t2 << 8) |
 		((edid->established_timings.mfg_rsvd & 0x80) << 9);
@@ -3338,7 +3339,7 @@ add_established_modes(struct drm_connector *connector, const struct edid *edid)
 	}
 
 	if (version_greater(edid, 1, 0))
-		drm_for_each_detailed_block(edid, do_established_modes,
+		drm_for_each_detailed_block(drm_edid->edid, do_established_modes,
 					    &closure);
 
 	return modes + closure.modes;
@@ -3373,28 +3374,28 @@ do_standard_modes(const struct detailed_timing *timing, void *c)
  * using the appropriate standard (DMT, GTF, or CVT). Grab them from EDID and
  * add them to the list.
  */
-static int
-add_standard_modes(struct drm_connector *connector, const struct edid *edid)
+static int add_standard_modes(struct drm_connector *connector,
+			      const struct drm_edid *drm_edid)
 {
 	int i, modes = 0;
 	struct detailed_mode_closure closure = {
 		.connector = connector,
-		.edid = edid,
+		.edid = drm_edid->edid,
 	};
 
 	for (i = 0; i < EDID_STD_TIMINGS; i++) {
 		struct drm_display_mode *newmode;
 
-		newmode = drm_mode_std(connector, edid,
-				       &edid->standard_timings[i]);
+		newmode = drm_mode_std(connector, drm_edid->edid,
+				       &drm_edid->edid->standard_timings[i]);
 		if (newmode) {
 			drm_mode_probed_add(connector, newmode);
 			modes++;
 		}
 	}
 
-	if (version_greater(edid, 1, 0))
-		drm_for_each_detailed_block(edid, do_standard_modes,
+	if (version_greater(drm_edid->edid, 1, 0))
+		drm_for_each_detailed_block(drm_edid->edid, do_standard_modes,
 					    &closure);
 
 	/* XXX should also look for standard codes in VTB blocks */
@@ -3466,15 +3467,15 @@ do_cvt_mode(const struct detailed_timing *timing, void *c)
 }
 
 static int
-add_cvt_modes(struct drm_connector *connector, const struct edid *edid)
+add_cvt_modes(struct drm_connector *connector, const struct drm_edid *drm_edid)
 {
 	struct detailed_mode_closure closure = {
 		.connector = connector,
-		.edid = edid,
+		.edid = drm_edid->edid,
 	};
 
-	if (version_greater(edid, 1, 2))
-		drm_for_each_detailed_block(edid, do_cvt_mode, &closure);
+	if (version_greater(drm_edid->edid, 1, 2))
+		drm_for_each_detailed_block(drm_edid->edid, do_cvt_mode, &closure);
 
 	/* XXX should also look for CVT codes in VTB blocks */
 
@@ -3516,25 +3517,24 @@ do_detailed_mode(const struct detailed_timing *timing, void *c)
 /*
  * add_detailed_modes - Add modes from detailed timings
  * @connector: attached connector
- * @edid: EDID block to scan
+ * @drm_edid: EDID block to scan
  * @quirks: quirks to apply
  */
-static int
-add_detailed_modes(struct drm_connector *connector, const struct edid *edid,
-		   u32 quirks)
+static int add_detailed_modes(struct drm_connector *connector,
+			      const struct drm_edid *drm_edid, u32 quirks)
 {
 	struct detailed_mode_closure closure = {
 		.connector = connector,
-		.edid = edid,
+		.edid = drm_edid->edid,
 		.preferred = true,
 		.quirks = quirks,
 	};
 
-	if (closure.preferred && !version_greater(edid, 1, 3))
+	if (closure.preferred && !version_greater(drm_edid->edid, 1, 3))
 		closure.preferred =
-		    (edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING);
+		    (drm_edid->edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING);
 
-	drm_for_each_detailed_block(edid, do_detailed_mode, &closure);
+	drm_for_each_detailed_block(drm_edid->edid, do_detailed_mode, &closure);
 
 	return closure.modes;
 }
@@ -3588,7 +3588,7 @@ const u8 *drm_find_edid_extension(const struct edid *edid,
 }
 
 /* Return true if the EDID has a CTA extension or a DisplayID CTA data block */
-static bool drm_edid_has_cta_extension(const struct edid *edid)
+static bool drm_edid_has_cta_extension(const struct drm_edid *drm_edid)
 {
 	const struct displayid_block *block;
 	struct displayid_iter iter;
@@ -3596,11 +3596,11 @@ static bool drm_edid_has_cta_extension(const struct edid *edid)
 	bool found = false;
 
 	/* Look for a top level CEA extension block */
-	if (drm_find_edid_extension(edid, CEA_EXT, &ext_index))
+	if (drm_find_edid_extension(drm_edid->edid, CEA_EXT, &ext_index))
 		return true;
 
 	/* CEA blocks can also be found embedded in a DisplayID block */
-	displayid_iter_edid_begin(edid, &iter);
+	displayid_iter_edid_begin(drm_edid->edid, &iter);
 	displayid_iter_for_each(block, &iter) {
 		if (block->tag == DATA_BLOCK_CTA) {
 			found = true;
@@ -3874,8 +3874,8 @@ static bool drm_valid_hdmi_vic(u8 vic)
 	return vic > 0 && vic < ARRAY_SIZE(edid_4k_modes);
 }
 
-static int
-add_alternate_cea_modes(struct drm_connector *connector, const struct edid *edid)
+static int add_alternate_cea_modes(struct drm_connector *connector,
+				   const struct drm_edid *drm_edid)
 {
 	struct drm_device *dev = connector->dev;
 	struct drm_display_mode *mode, *tmp;
@@ -3883,7 +3883,7 @@ add_alternate_cea_modes(struct drm_connector *connector, const struct edid *edid
 	int modes = 0;
 
 	/* Don't add CTA modes if the CTA extension block is missing */
-	if (!drm_edid_has_cta_extension(edid))
+	if (!drm_edid_has_cta_extension(drm_edid))
 		return 0;
 
 	/*
@@ -4666,14 +4666,14 @@ static void drm_parse_y420cmdb_bitmap(struct drm_connector *connector,
 	hdmi->y420_cmdb_map = map;
 }
 
-static int
-add_cea_modes(struct drm_connector *connector, const struct edid *edid)
+static int add_cea_modes(struct drm_connector *connector,
+			 const struct drm_edid *drm_edid)
 {
 	const struct cea_db *db;
 	struct cea_db_iter iter;
 	int modes = 0;
 
-	cea_db_iter_edid_begin(edid, &iter);
+	cea_db_iter_edid_begin(drm_edid->edid, &iter);
 	cea_db_iter_for_each(db, &iter) {
 		const u8 *hdmi = NULL, *video = NULL;
 		u8 hdmi_len = 0, video_len = 0;
@@ -5824,13 +5824,13 @@ static int add_displayid_detailed_1_modes(struct drm_connector *connector,
 }
 
 static int add_displayid_detailed_modes(struct drm_connector *connector,
-					const struct edid *edid)
+					const struct drm_edid *drm_edid)
 {
 	const struct displayid_block *block;
 	struct displayid_iter iter;
 	int num_modes = 0;
 
-	displayid_iter_edid_begin(edid, &iter);
+	displayid_iter_edid_begin(drm_edid->edid, &iter);
 	displayid_iter_for_each(block, &iter) {
 		if (block->tag == DATA_BLOCK_TYPE_1_DETAILED_TIMING ||
 		    block->tag == DATA_BLOCK_2_TYPE_7_DETAILED_TIMING)
@@ -5844,7 +5844,6 @@ static int add_displayid_detailed_modes(struct drm_connector *connector,
 static int drm_edid_connector_update(struct drm_connector *connector,
 				     const struct drm_edid *drm_edid)
 {
-	const struct edid *edid;
 	int num_modes = 0;
 	u32 quirks;
 
@@ -5854,8 +5853,6 @@ static int drm_edid_connector_update(struct drm_connector *connector,
 		return 0;
 	}
 
-	edid = drm_edid->edid;
-
 	/*
 	 * CEA-861-F adds ycbcr capability map block, for HDMI 2.0 sinks.
 	 * To avoid multiple parsing of same block, lets parse that map
@@ -5880,15 +5877,15 @@ static int drm_edid_connector_update(struct drm_connector *connector,
 	 *
 	 * XXX order for additional mode types in extension blocks?
 	 */
-	num_modes += add_detailed_modes(connector, edid, quirks);
-	num_modes += add_cvt_modes(connector, edid);
-	num_modes += add_standard_modes(connector, edid);
-	num_modes += add_established_modes(connector, edid);
-	num_modes += add_cea_modes(connector, edid);
-	num_modes += add_alternate_cea_modes(connector, edid);
-	num_modes += add_displayid_detailed_modes(connector, edid);
-	if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)
-		num_modes += add_inferred_modes(connector, edid);
+	num_modes += add_detailed_modes(connector, drm_edid, quirks);
+	num_modes += add_cvt_modes(connector, drm_edid);
+	num_modes += add_standard_modes(connector, drm_edid);
+	num_modes += add_established_modes(connector, drm_edid);
+	num_modes += add_cea_modes(connector, drm_edid);
+	num_modes += add_alternate_cea_modes(connector, drm_edid);
+	num_modes += add_displayid_detailed_modes(connector, drm_edid);
+	if (drm_edid->edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)
+		num_modes += add_inferred_modes(connector, drm_edid);
 
 	if (quirks & (EDID_QUIRK_PREFER_LARGE_60 | EDID_QUIRK_PREFER_LARGE_75))
 		edid_fixup_preferred(connector, quirks);
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 53+ messages in thread

* Re: [Intel-gfx] [PATCH v2 03/25] drm/edid: add struct drm_edid container
  2022-05-10  6:26   ` [Intel-gfx] " Nautiyal, Ankit K
@ 2022-05-16  8:11     ` Jani Nikula
  0 siblings, 0 replies; 53+ messages in thread
From: Jani Nikula @ 2022-05-16  8:11 UTC (permalink / raw)
  To: Nautiyal, Ankit K, dri-devel; +Cc: intel-gfx

On Tue, 10 May 2022, "Nautiyal, Ankit K" <ankit.k.nautiyal@intel.com> wrote:
> LGTM.
>
> Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>

Thanks for the review, pushed the lot already on Friday.

BR,
Jani.

>
> Regards,
>
> Ankit
>
> On 5/9/2022 5:33 PM, Jani Nikula wrote:
>> Introduce new opaque type struct drm_edid to encapsulate the EDID data
>> and the size allocated for it. The contents will be private to
>> drm_edid.c.
>>
>> There are a number of reasons for adding a container around struct edid:
>>
>> * struct edid is a raw blob pointer to data that usually originates
>>    outside of the kernel. Its size is contained within the structure.
>>
>> * There's no way to attach meta information (such as allocated memory
>>    size) to struct edid.
>>
>> * Validation of the EDID blob and its size become crucial, and it's
>>    spread all over the subsystem, with varying levels of accuracy.
>>
>> * HDMI Forum has introduced an HF-EEODB extension that defines an
>>    override EDID size within an EDID extension. The size allocated for an
>>    EDID depends on whether the allocator understands the HF-EEODB
>>    extension. Given a struct edid *, it's impossible to know how much
>>    memory was actually allocated for it.
>>
>> There are also some reasons for making the container type struct
>> drm_edid opaque and private to drm_edid.c:
>>
>> * Have only one place for creating and parsing the EDID, to avoid
>>    duplicating bugs.
>>
>> * Prepare for reading a pure DisplayID 2.0 from its own DDC address, and
>>    adding it within the same struct drm_edid container, transparently,
>>    and for all drivers.
>>
>> * With the idea that the drm_edid objects are immutable during their
>>    lifetimes, it will be possible to refcount them and reduce EDID
>>    copying everywhere (this is left for future work).
>>
>> Initially, just add the type. In follow-up, we'll start converting the
>> guts of drm_edid.c to use it, and finally add interfaces around it.
>>
>> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
>> ---
>>   drivers/gpu/drm/drm_edid.c | 9 +++++++++
>>   1 file changed, 9 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
>> index dcef92c8887a..480fd9fbe412 100644
>> --- a/drivers/gpu/drm/drm_edid.c
>> +++ b/drivers/gpu/drm/drm_edid.c
>> @@ -1567,6 +1567,15 @@ static const struct drm_display_mode edid_4k_modes[] = {
>>   
>>   /*** DDC fetch and block validation ***/
>>   
>> +/*
>> + * The opaque EDID type, internal to drm_edid.c.
>> + */
>> +struct drm_edid {
>> +	/* Size allocated for edid */
>> +	size_t size;
>> +	const struct edid *edid;
>> +};
>> +
>>   static int edid_extension_block_count(const struct edid *edid)
>>   {
>>   	return edid->extensions;

-- 
Jani Nikula, Intel Open Source Graphics Center

^ permalink raw reply	[flat|nested] 53+ messages in thread

end of thread, other threads:[~2022-05-16  8:12 UTC | newest]

Thread overview: 53+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-09 12:02 [PATCH v2 00/25] drm/edid: introduce struct drm_edid Jani Nikula
2022-05-09 12:03 ` [PATCH v2 01/25] drm/edid: use else-if in CTA extension parsing Jani Nikula
2022-05-09 12:03 ` [PATCH v2 02/25] drm/edid: convert drm_for_each_detailed_block() to edid iter Jani Nikula
2022-05-09 12:03 ` [PATCH v2 03/25] drm/edid: add struct drm_edid container Jani Nikula
2022-05-10  6:26   ` [Intel-gfx] " Nautiyal, Ankit K
2022-05-16  8:11     ` Jani Nikula
2022-05-09 12:03 ` [PATCH v2 04/25] drm/edid: start propagating drm_edid to lower levels Jani Nikula
2022-05-10  6:23   ` [Intel-gfx] " Nautiyal, Ankit K
2022-05-09 12:03 ` [PATCH v2 05/25] drm/edid: keep propagating drm_edid to display info Jani Nikula
2022-05-10  6:15   ` Nautiyal, Ankit K
2022-05-11  9:21   ` [PATCH v3] " Jani Nikula
2022-05-09 12:03 ` [PATCH v2 06/25] drm/edid: propagate drm_edid to drm_edid_to_eld() Jani Nikula
2022-05-10  6:31   ` Nautiyal, Ankit K
2022-05-11  9:23   ` [PATCH v3] " Jani Nikula
2022-05-09 12:03 ` [PATCH v2 07/25] drm/edid: convert drm_edid_connector_update() to drm_edid fully Jani Nikula
2022-05-10  6:45   ` [Intel-gfx] " Nautiyal, Ankit K
2022-05-11  9:26   ` [PATCH v3] " Jani Nikula
2022-05-09 12:03 ` [PATCH v2 08/25] drm/edid: convert struct detailed_mode_closure to drm_edid Jani Nikula
2022-05-10  7:14   ` Nautiyal, Ankit K
2022-05-09 12:03 ` [PATCH v2 09/25] drm/edid: convert drm_mode_detailed() " Jani Nikula
2022-05-10  8:57   ` [Intel-gfx] " Nautiyal, Ankit K
2022-05-09 12:03 ` [PATCH v2 10/25] drm/edid: convert drm_dmt_modes_for_range() " Jani Nikula
2022-05-10  9:04   ` [Intel-gfx] " Nautiyal, Ankit K
2022-05-09 12:03 ` [PATCH v2 11/25] drm/edid: convert drm_gtf_modes_for_range() " Jani Nikula
2022-05-10  9:05   ` Nautiyal, Ankit K
2022-05-09 12:03 ` [PATCH v2 12/25] drm/edid: convert drm_cvt_modes_for_range() " Jani Nikula
2022-05-10  9:11   ` [Intel-gfx] " Nautiyal, Ankit K
2022-05-09 12:03 ` [PATCH v2 13/25] drm/edid: convert drm_mode_std() and children " Jani Nikula
2022-05-10  9:18   ` [Intel-gfx] " Nautiyal, Ankit K
2022-05-09 12:03 ` [PATCH v2 14/25] drm/edid: convert mode_in_range() and drm_monitor_supports_rb() " Jani Nikula
2022-05-10  9:22   ` [Intel-gfx] " Nautiyal, Ankit K
2022-05-09 12:03 ` [PATCH v2 15/25] drm/edid: convert get_monitor_name() " Jani Nikula
2022-05-10  9:29   ` Nautiyal, Ankit K
2022-05-09 12:03 ` [PATCH v2 16/25] drm/edid: convert drm_for_each_detailed_block() " Jani Nikula
2022-05-10  9:36   ` Nautiyal, Ankit K
2022-05-09 12:03 ` [PATCH v2 17/25] drm/edid: add drm_edid helper for drm_edid_to_sad() Jani Nikula
2022-05-10  9:55   ` Nautiyal, Ankit K
2022-05-09 12:03 ` [PATCH v2 18/25] drm/edid: add drm_edid helper for drm_edid_to_speaker_allocation() Jani Nikula
2022-05-10 10:08   ` [Intel-gfx] " Nautiyal, Ankit K
2022-05-09 12:03 ` [PATCH v2 19/25] drm/edid: add drm_edid helper for drm_detect_hdmi_monitor() Jani Nikula
2022-05-10 10:15   ` [Intel-gfx] " Nautiyal, Ankit K
2022-05-09 12:03 ` [PATCH v2 20/25] drm/edid: add drm_edid helper for drm_detect_monitor_audio() Jani Nikula
2022-05-10 10:17   ` [Intel-gfx] " Nautiyal, Ankit K
2022-05-09 12:03 ` [PATCH v2 21/25] drm/edid: convert cea_db_iter_edid_begin() to drm_edid Jani Nikula
2022-05-10 10:21   ` Nautiyal, Ankit K
2022-05-09 12:03 ` [PATCH v2 22/25] drm/edid: convert drm_edid_iter_begin() " Jani Nikula
2022-05-10 10:25   ` Nautiyal, Ankit K
2022-05-09 12:03 ` [PATCH v2 23/25] drm/edid: add drm_edid helper for drm_update_tile_info() Jani Nikula
2022-05-10 10:28   ` [Intel-gfx] " Nautiyal, Ankit K
2022-05-09 12:03 ` [PATCH v2 24/25] drm/displayid: convert to drm_edid Jani Nikula
2022-05-10 12:04   ` Nautiyal, Ankit K
2022-05-09 12:03 ` [PATCH v2 25/25] drm/edid: convert version_greater() " Jani Nikula
2022-05-10 12:07   ` Nautiyal, Ankit K

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).