dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [RFC v1 0/6] drm/edid: overhaul displayid iterator
@ 2021-03-09 13:54 Jani Nikula
  2021-03-09 13:54 ` [RFC v1 1/6] drm/edid: make a number of functions, parameters and variables const Jani Nikula
                   ` (5 more replies)
  0 siblings, 6 replies; 13+ messages in thread
From: Jani Nikula @ 2021-03-09 13:54 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

Iterating DisplayID is overcomplicated as it is, and it's not getting
easier when we eventually add support for DisplayID from DDC 0xA4
instead of EDID extensions. Prepare by abstracting the complexities away
from EDID code.

Untested, let's see what our CI thinks. ;)


Jani Nikula (6):
  drm/edid: make a number of functions, parameters and variables const
  drm/displayid: add separate drm_displayid.c
  drm/displayid: add new displayid section/block iterators
  drm/edid: use the new displayid iterator for detailed modes
  drm/edid: use the new displayid iterator for finding CEA extension
  drm/edid: use the new displayid iterator for tile info

 drivers/gpu/drm/Makefile        |   2 +-
 drivers/gpu/drm/drm_displayid.c | 133 +++++++++++++++++++++++++
 drivers/gpu/drm/drm_edid.c      | 171 +++++++-------------------------
 include/drm/drm_displayid.h     |  28 ++++--
 include/drm/drm_edid.h          |   3 +
 5 files changed, 196 insertions(+), 141 deletions(-)
 create mode 100644 drivers/gpu/drm/drm_displayid.c

-- 
2.20.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* [RFC v1 1/6] drm/edid: make a number of functions, parameters and variables const
  2021-03-09 13:54 [RFC v1 0/6] drm/edid: overhaul displayid iterator Jani Nikula
@ 2021-03-09 13:54 ` Jani Nikula
  2021-03-10 18:54   ` [Intel-gfx] " Ville Syrjälä
  2021-03-09 13:54 ` [RFC v1 2/6] drm/displayid: add separate drm_displayid.c Jani Nikula
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 13+ messages in thread
From: Jani Nikula @ 2021-03-09 13:54 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

If there's no need to change it, it should be const. There's more to be
done, but start off with changes that make follow-up work easier. No
functional changes.

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

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index c2bbe7bee7b6..d510b827a1f8 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1585,7 +1585,7 @@ module_param_named(edid_fixup, edid_fixup, int, 0400);
 MODULE_PARM_DESC(edid_fixup,
 		 "Minimum number of valid EDID header bytes (0-8, default 6)");
 
-static int validate_displayid(u8 *displayid, int length, int idx);
+static int validate_displayid(const u8 *displayid, int length, int idx);
 
 static int drm_edid_block_checksum(const u8 *raw_edid)
 {
@@ -3241,10 +3241,10 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid,
 /*
  * Search EDID for CEA extension block.
  */
-static u8 *drm_find_edid_extension(const struct edid *edid,
-				   int ext_id, int *ext_index)
+static const u8 *drm_find_edid_extension(const struct edid *edid,
+					 int ext_id, int *ext_index)
 {
-	u8 *edid_ext = NULL;
+	const u8 *edid_ext = NULL;
 	int i;
 
 	/* No EDID or EDID extensions */
@@ -3253,7 +3253,7 @@ static u8 *drm_find_edid_extension(const struct edid *edid,
 
 	/* Find CEA extension */
 	for (i = *ext_index; i < edid->extensions; i++) {
-		edid_ext = (u8 *)edid + EDID_LENGTH * (i + 1);
+		edid_ext = (const u8 *)edid + EDID_LENGTH * (i + 1);
 		if (edid_ext[0] == ext_id)
 			break;
 	}
@@ -3267,12 +3267,12 @@ static u8 *drm_find_edid_extension(const struct edid *edid,
 }
 
 
-static u8 *drm_find_displayid_extension(const struct edid *edid,
-					int *length, int *idx,
-					int *ext_index)
+static const u8 *drm_find_displayid_extension(const struct edid *edid,
+					      int *length, int *idx,
+					      int *ext_index)
 {
-	u8 *displayid = drm_find_edid_extension(edid, DISPLAYID_EXT, ext_index);
-	struct displayid_hdr *base;
+	const u8 *displayid = drm_find_edid_extension(edid, DISPLAYID_EXT, ext_index);
+	const struct displayid_hdr *base;
 	int ret;
 
 	if (!displayid)
@@ -3286,18 +3286,18 @@ static u8 *drm_find_displayid_extension(const struct edid *edid,
 	if (ret)
 		return NULL;
 
-	base = (struct displayid_hdr *)&displayid[*idx];
+	base = (const struct displayid_hdr *)&displayid[*idx];
 	*length = *idx + sizeof(*base) + base->bytes;
 
 	return displayid;
 }
 
-static u8 *drm_find_cea_extension(const struct edid *edid)
+static const u8 *drm_find_cea_extension(const struct edid *edid)
 {
 	int length, idx;
-	struct displayid_block *block;
-	u8 *cea;
-	u8 *displayid;
+	const struct displayid_block *block;
+	const u8 *cea;
+	const u8 *displayid;
 	int ext_index;
 
 	/* Look for a top level CEA extension block */
@@ -3318,7 +3318,7 @@ static u8 *drm_find_cea_extension(const struct edid *edid)
 		idx += sizeof(struct displayid_hdr);
 		for_each_displayid_db(displayid, block, idx, length) {
 			if (block->tag == DATA_BLOCK_CTA)
-				return (u8 *)block;
+				return (const u8 *)block;
 		}
 	}
 
@@ -4503,8 +4503,8 @@ static void clear_eld(struct drm_connector *connector)
 static void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
 {
 	uint8_t *eld = connector->eld;
-	u8 *cea;
-	u8 *db;
+	const u8 *cea;
+	const u8 *db;
 	int total_sad_count = 0;
 	int mnl;
 	int dbl;
@@ -4600,7 +4600,7 @@ int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads)
 {
 	int count = 0;
 	int i, start, end, dbl;
-	u8 *cea;
+	const u8 *cea;
 
 	cea = drm_find_cea_extension(edid);
 	if (!cea) {
@@ -4619,7 +4619,7 @@ int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads)
 	}
 
 	for_each_cea_db(cea, i, start, end) {
-		u8 *db = &cea[i];
+		const u8 *db = &cea[i];
 
 		if (cea_db_tag(db) == AUDIO_BLOCK) {
 			int j;
@@ -4631,7 +4631,7 @@ int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads)
 			if (!*sads)
 				return -ENOMEM;
 			for (j = 0; j < count; j++) {
-				u8 *sad = &db[1 + j * 3];
+				const u8 *sad = &db[1 + j * 3];
 
 				(*sads)[j].format = (sad[0] & 0x78) >> 3;
 				(*sads)[j].channels = sad[0] & 0x7;
@@ -4755,7 +4755,7 @@ EXPORT_SYMBOL(drm_av_sync_delay);
  */
 bool drm_detect_hdmi_monitor(struct edid *edid)
 {
-	u8 *edid_ext;
+	const u8 *edid_ext;
 	int i;
 	int start_offset, end_offset;
 
@@ -4793,7 +4793,7 @@ EXPORT_SYMBOL(drm_detect_hdmi_monitor);
  */
 bool drm_detect_monitor_audio(struct edid *edid)
 {
-	u8 *edid_ext;
+	const u8 *edid_ext;
 	int i, j;
 	bool has_audio = false;
 	int start_offset, end_offset;
@@ -5287,13 +5287,13 @@ u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edi
 	return quirks;
 }
 
-static int validate_displayid(u8 *displayid, int length, int idx)
+static int validate_displayid(const u8 *displayid, int length, int idx)
 {
 	int i, dispid_length;
 	u8 csum = 0;
-	struct displayid_hdr *base;
+	const struct displayid_hdr *base;
 
-	base = (struct displayid_hdr *)&displayid[idx];
+	base = (const struct displayid_hdr *)&displayid[idx];
 
 	DRM_DEBUG_KMS("base revision 0x%x, length %d, %d %d\n",
 		      base->rev, base->bytes, base->prod_id, base->ext_count);
@@ -5359,7 +5359,7 @@ static struct drm_display_mode *drm_mode_displayid_detailed(struct drm_device *d
 }
 
 static int add_displayid_detailed_1_modes(struct drm_connector *connector,
-					  struct displayid_block *block)
+					  const struct displayid_block *block)
 {
 	struct displayid_detailed_timing_block *det = (struct displayid_detailed_timing_block *)block;
 	int i;
@@ -5387,9 +5387,9 @@ static int add_displayid_detailed_1_modes(struct drm_connector *connector,
 static int add_displayid_detailed_modes(struct drm_connector *connector,
 					struct edid *edid)
 {
-	u8 *displayid;
+	const u8 *displayid;
 	int length, idx;
-	struct displayid_block *block;
+	const struct displayid_block *block;
 	int num_modes = 0;
 	int ext_index = 0;
 
diff --git a/include/drm/drm_displayid.h b/include/drm/drm_displayid.h
index 77941efb5426..f141c0eff083 100644
--- a/include/drm/drm_displayid.h
+++ b/include/drm/drm_displayid.h
@@ -93,11 +93,11 @@ struct displayid_detailed_timing_block {
 };
 
 #define for_each_displayid_db(displayid, block, idx, length) \
-	for ((block) = (struct displayid_block *)&(displayid)[idx]; \
+	for ((block) = (const struct displayid_block *)&(displayid)[idx]; \
 	     (idx) + sizeof(struct displayid_block) <= (length) && \
 	     (idx) + sizeof(struct displayid_block) + (block)->num_bytes <= (length) && \
 	     (block)->num_bytes > 0; \
 	     (idx) += sizeof(struct displayid_block) + (block)->num_bytes, \
-	     (block) = (struct displayid_block *)&(displayid)[idx])
+	     (block) = (const struct displayid_block *)&(displayid)[idx])
 
 #endif
-- 
2.20.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* [RFC v1 2/6] drm/displayid: add separate drm_displayid.c
  2021-03-09 13:54 [RFC v1 0/6] drm/edid: overhaul displayid iterator Jani Nikula
  2021-03-09 13:54 ` [RFC v1 1/6] drm/edid: make a number of functions, parameters and variables const Jani Nikula
@ 2021-03-09 13:54 ` Jani Nikula
  2021-03-10 19:00   ` [Intel-gfx] " Ville Syrjälä
  2021-03-09 13:54 ` [RFC v1 3/6] drm/displayid: add new displayid section/block iterators Jani Nikula
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 13+ messages in thread
From: Jani Nikula @ 2021-03-09 13:54 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

We'll be adding more DisplayID specific functions going forward, so
start off by splitting out a few functions to a separate file.

We don't bother with exporting the functions; at least for now they
should be needed solely within drm.ko.

No functional changes.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/Makefile        |  2 +-
 drivers/gpu/drm/drm_displayid.c | 59 +++++++++++++++++++++++++++++++++
 drivers/gpu/drm/drm_edid.c      | 58 ++------------------------------
 include/drm/drm_displayid.h     |  8 +++++
 include/drm/drm_edid.h          |  3 ++
 5 files changed, 73 insertions(+), 57 deletions(-)
 create mode 100644 drivers/gpu/drm/drm_displayid.c

diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
index 5eb5bf7c16e3..78ef2fd14f10 100644
--- a/drivers/gpu/drm/Makefile
+++ b/drivers/gpu/drm/Makefile
@@ -7,7 +7,7 @@ drm-y       :=	drm_auth.o drm_cache.o \
 		drm_file.o drm_gem.o drm_ioctl.o drm_irq.o \
 		drm_drv.o \
 		drm_sysfs.o drm_hashtab.o drm_mm.o \
-		drm_crtc.o drm_fourcc.o drm_modes.o drm_edid.o \
+		drm_crtc.o drm_fourcc.o drm_modes.o drm_edid.o drm_displayid.o \
 		drm_encoder_slave.o \
 		drm_trace_points.o drm_prime.o \
 		drm_rect.o drm_vma_manager.o drm_flip_work.o \
diff --git a/drivers/gpu/drm/drm_displayid.c b/drivers/gpu/drm/drm_displayid.c
new file mode 100644
index 000000000000..908bbe6feb61
--- /dev/null
+++ b/drivers/gpu/drm/drm_displayid.c
@@ -0,0 +1,59 @@
+// SPDX-License-Identifier: MIT
+/*
+ * Copyright © 2021 Intel Corporation
+ */
+
+#include <drm/drm_displayid.h>
+#include <drm/drm_edid.h>
+#include <drm/drm_print.h>
+
+static int validate_displayid(const u8 *displayid, int length, int idx)
+{
+	int i, dispid_length;
+	u8 csum = 0;
+	const struct displayid_hdr *base;
+
+	base = (const struct displayid_hdr *)&displayid[idx];
+
+	DRM_DEBUG_KMS("base revision 0x%x, length %d, %d %d\n",
+		      base->rev, base->bytes, base->prod_id, base->ext_count);
+
+	/* +1 for DispID checksum */
+	dispid_length = sizeof(*base) + base->bytes + 1;
+	if (dispid_length > length - idx)
+		return -EINVAL;
+
+	for (i = 0; i < dispid_length; i++)
+		csum += displayid[idx + i];
+	if (csum) {
+		DRM_NOTE("DisplayID checksum invalid, remainder is %d\n", csum);
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+const u8 *drm_find_displayid_extension(const struct edid *edid,
+				       int *length, int *idx,
+				       int *ext_index)
+{
+	const u8 *displayid = drm_find_edid_extension(edid, DISPLAYID_EXT, ext_index);
+	const struct displayid_hdr *base;
+	int ret;
+
+	if (!displayid)
+		return NULL;
+
+	/* EDID extensions block checksum isn't for us */
+	*length = EDID_LENGTH - 1;
+	*idx = 1;
+
+	ret = validate_displayid(displayid, *length, *idx);
+	if (ret)
+		return NULL;
+
+	base = (const struct displayid_hdr *)&displayid[*idx];
+	*length = *idx + sizeof(*base) + base->bytes;
+
+	return displayid;
+}
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index d510b827a1f8..58e61f792bc7 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1585,8 +1585,6 @@ module_param_named(edid_fixup, edid_fixup, int, 0400);
 MODULE_PARM_DESC(edid_fixup,
 		 "Minimum number of valid EDID header bytes (0-8, default 6)");
 
-static int validate_displayid(const u8 *displayid, int length, int idx);
-
 static int drm_edid_block_checksum(const u8 *raw_edid)
 {
 	int i;
@@ -3241,8 +3239,8 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid,
 /*
  * Search EDID for CEA extension block.
  */
-static const u8 *drm_find_edid_extension(const struct edid *edid,
-					 int ext_id, int *ext_index)
+const u8 *drm_find_edid_extension(const struct edid *edid,
+				  int ext_id, int *ext_index)
 {
 	const u8 *edid_ext = NULL;
 	int i;
@@ -3266,32 +3264,6 @@ static const u8 *drm_find_edid_extension(const struct edid *edid,
 	return edid_ext;
 }
 
-
-static const u8 *drm_find_displayid_extension(const struct edid *edid,
-					      int *length, int *idx,
-					      int *ext_index)
-{
-	const u8 *displayid = drm_find_edid_extension(edid, DISPLAYID_EXT, ext_index);
-	const struct displayid_hdr *base;
-	int ret;
-
-	if (!displayid)
-		return NULL;
-
-	/* EDID extensions block checksum isn't for us */
-	*length = EDID_LENGTH - 1;
-	*idx = 1;
-
-	ret = validate_displayid(displayid, *length, *idx);
-	if (ret)
-		return NULL;
-
-	base = (const struct displayid_hdr *)&displayid[*idx];
-	*length = *idx + sizeof(*base) + base->bytes;
-
-	return displayid;
-}
-
 static const u8 *drm_find_cea_extension(const struct edid *edid)
 {
 	int length, idx;
@@ -5287,32 +5259,6 @@ u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edi
 	return quirks;
 }
 
-static int validate_displayid(const u8 *displayid, int length, int idx)
-{
-	int i, dispid_length;
-	u8 csum = 0;
-	const struct displayid_hdr *base;
-
-	base = (const struct displayid_hdr *)&displayid[idx];
-
-	DRM_DEBUG_KMS("base revision 0x%x, length %d, %d %d\n",
-		      base->rev, base->bytes, base->prod_id, base->ext_count);
-
-	/* +1 for DispID checksum */
-	dispid_length = sizeof(*base) + base->bytes + 1;
-	if (dispid_length > length - idx)
-		return -EINVAL;
-
-	for (i = 0; i < dispid_length; i++)
-		csum += displayid[idx + i];
-	if (csum) {
-		DRM_NOTE("DisplayID checksum invalid, remainder is %d\n", csum);
-		return -EINVAL;
-	}
-
-	return 0;
-}
-
 static struct drm_display_mode *drm_mode_displayid_detailed(struct drm_device *dev,
 							    struct displayid_detailed_timings_1 *timings)
 {
diff --git a/include/drm/drm_displayid.h b/include/drm/drm_displayid.h
index f141c0eff083..3c6db22a518a 100644
--- a/include/drm/drm_displayid.h
+++ b/include/drm/drm_displayid.h
@@ -22,6 +22,10 @@
 #ifndef DRM_DISPLAYID_H
 #define DRM_DISPLAYID_H
 
+#include <linux/types.h>
+
+struct edid;
+
 #define DATA_BLOCK_PRODUCT_ID 0x00
 #define DATA_BLOCK_DISPLAY_PARAMETERS 0x01
 #define DATA_BLOCK_COLOR_CHARACTERISTICS 0x02
@@ -100,4 +104,8 @@ struct displayid_detailed_timing_block {
 	     (idx) += sizeof(struct displayid_block) + (block)->num_bytes, \
 	     (block) = (const struct displayid_block *)&(displayid)[idx])
 
+const u8 *drm_find_displayid_extension(const struct edid *edid,
+				       int *length, int *idx,
+				       int *ext_index);
+
 #endif
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
index a158f585f658..759328a5eeb2 100644
--- a/include/drm/drm_edid.h
+++ b/include/drm/drm_edid.h
@@ -543,5 +543,8 @@ 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);
+
 
 #endif /* __DRM_EDID_H__ */
-- 
2.20.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* [RFC v1 3/6] drm/displayid: add new displayid section/block iterators
  2021-03-09 13:54 [RFC v1 0/6] drm/edid: overhaul displayid iterator Jani Nikula
  2021-03-09 13:54 ` [RFC v1 1/6] drm/edid: make a number of functions, parameters and variables const Jani Nikula
  2021-03-09 13:54 ` [RFC v1 2/6] drm/displayid: add separate drm_displayid.c Jani Nikula
@ 2021-03-09 13:54 ` Jani Nikula
  2021-03-10 19:10   ` Ville Syrjälä
  2021-03-09 13:54 ` [RFC v1 4/6] drm/edid: use the new displayid iterator for detailed modes Jani Nikula
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 13+ messages in thread
From: Jani Nikula @ 2021-03-09 13:54 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

Iterating DisplayID blocks across sections (in EDID extensions) is
unnecessarily complicated for the caller. Implement DisplayID iterators
to go through all blocks in all sections.

Usage example:

	const struct displayid_block *block;
	struct displayid_iter iter;

	displayid_iter_edid_begin(edid, &iter);
	displayid_iter_for_each(block, &iter) {
		/* operate on block */
	}
	displayid_iter_end(&iter);

When DisplayID is stored in EDID extensions, the DisplayID sections map
to extensions as described in VESA DisplayID v1.3 Appendix B: DisplayID
as an EDID Extension. This is implemented here.

When DisplayID is stored in its dedicated DDC device 0xA4, according to
VESA E-DDC v1.3, different rules apply for the structure. This is not
implemented here, as we don't currently use it, but the idea is you'd
have a different call for beginning the iteration, for example simply:

	displayid_iter_begin(displayid, &iter);

instead of displayid_iter_edid_begin(), and everything else would be
hidden away in the iterator functions.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_displayid.c | 74 +++++++++++++++++++++++++++++++++
 include/drm/drm_displayid.h     | 18 ++++++++
 2 files changed, 92 insertions(+)

diff --git a/drivers/gpu/drm/drm_displayid.c b/drivers/gpu/drm/drm_displayid.c
index 908bbe6feb61..88070267aac9 100644
--- a/drivers/gpu/drm/drm_displayid.c
+++ b/drivers/gpu/drm/drm_displayid.c
@@ -57,3 +57,77 @@ const u8 *drm_find_displayid_extension(const struct edid *edid,
 
 	return displayid;
 }
+
+void displayid_iter_edid_begin(const struct edid *edid,
+			       struct displayid_iter *iter)
+{
+	memset(iter, 0, sizeof(*iter));
+
+	iter->edid = edid;
+}
+
+static const struct displayid_block *
+__displayid_iter_block(const struct displayid_iter *iter)
+{
+	const struct displayid_block *block;
+
+	if (!iter->section)
+		return NULL;
+
+	block = (const struct displayid_block *)&iter->section[iter->idx];
+
+	if (iter->idx + sizeof(struct displayid_block) <= iter->length &&
+	    iter->idx + sizeof(struct displayid_block) + block->num_bytes <= iter->length &&
+	    block->num_bytes > 0)
+		return block;
+
+	return NULL;
+}
+
+const struct displayid_block *
+__displayid_iter_next(struct displayid_iter *iter)
+{
+	const struct displayid_block *block;
+
+	if (!iter->edid)
+		return NULL;
+
+	if (iter->section) {
+		/* current block should always be valid */
+		block = __displayid_iter_block(iter);
+		if (WARN_ON(!block)) {
+			iter->section = NULL;
+			iter->edid = NULL;
+			return NULL;
+		}
+
+		/* next block in section */
+		iter->idx += sizeof(struct displayid_block) + block->num_bytes;
+
+		block = __displayid_iter_block(iter);
+		if (block)
+			return block;
+	}
+
+	for (;;) {
+		iter->section = drm_find_displayid_extension(iter->edid,
+							     &iter->length,
+							     &iter->idx,
+							     &iter->ext_index);
+		if (!iter->section) {
+			iter->edid = NULL;
+			return NULL;
+		}
+
+		iter->idx += sizeof(struct displayid_hdr);
+
+		block = __displayid_iter_block(iter);
+		if (block)
+			return block;
+	}
+}
+
+void displayid_iter_end(struct displayid_iter *iter)
+{
+	memset(iter, 0, sizeof(*iter));
+}
diff --git a/include/drm/drm_displayid.h b/include/drm/drm_displayid.h
index 3c6db22a518a..27e06c98db17 100644
--- a/include/drm/drm_displayid.h
+++ b/include/drm/drm_displayid.h
@@ -108,4 +108,22 @@ const u8 *drm_find_displayid_extension(const struct edid *edid,
 				       int *length, int *idx,
 				       int *ext_index);
 
+/* DisplayID iteration */
+struct displayid_iter {
+	const struct edid *edid;
+
+	const u8 *section;
+	int length;
+	int idx;
+	int ext_index;
+};
+
+void displayid_iter_edid_begin(const struct edid *edid,
+			       struct displayid_iter *iter);
+const struct displayid_block *
+__displayid_iter_next(struct displayid_iter *iter);
+#define displayid_iter_for_each(__block, __iter) \
+	while (((__block) = __displayid_iter_next(__iter)))
+void displayid_iter_end(struct displayid_iter *iter);
+
 #endif
-- 
2.20.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* [RFC v1 4/6] drm/edid: use the new displayid iterator for detailed modes
  2021-03-09 13:54 [RFC v1 0/6] drm/edid: overhaul displayid iterator Jani Nikula
                   ` (2 preceding siblings ...)
  2021-03-09 13:54 ` [RFC v1 3/6] drm/displayid: add new displayid section/block iterators Jani Nikula
@ 2021-03-09 13:54 ` Jani Nikula
  2021-03-10 19:10   ` Ville Syrjälä
  2021-03-09 13:54 ` [RFC v1 5/6] drm/edid: use the new displayid iterator for finding CEA extension Jani Nikula
  2021-03-09 13:54 ` [RFC v1 6/6] drm/edid: use the new displayid iterator for tile info Jani Nikula
  5 siblings, 1 reply; 13+ messages in thread
From: Jani Nikula @ 2021-03-09 13:54 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

Neatly reduce displayid boilerplate in code. No functional changes.

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

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 58e61f792bc7..fbaa7d679cb2 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -5333,27 +5333,16 @@ static int add_displayid_detailed_1_modes(struct drm_connector *connector,
 static int add_displayid_detailed_modes(struct drm_connector *connector,
 					struct edid *edid)
 {
-	const u8 *displayid;
-	int length, idx;
 	const struct displayid_block *block;
+	struct displayid_iter iter;
 	int num_modes = 0;
-	int ext_index = 0;
-
-	for (;;) {
-		displayid = drm_find_displayid_extension(edid, &length, &idx,
-							 &ext_index);
-		if (!displayid)
-			break;
 
-		idx += sizeof(struct displayid_hdr);
-		for_each_displayid_db(displayid, block, idx, length) {
-			switch (block->tag) {
-			case DATA_BLOCK_TYPE_1_DETAILED_TIMING:
-				num_modes += add_displayid_detailed_1_modes(connector, block);
-				break;
-			}
-		}
+	displayid_iter_edid_begin(edid, &iter);
+	displayid_iter_for_each(block, &iter) {
+		if (block->tag == DATA_BLOCK_TYPE_1_DETAILED_TIMING)
+			num_modes += add_displayid_detailed_1_modes(connector, block);
 	}
+	displayid_iter_end(&iter);
 
 	return num_modes;
 }
-- 
2.20.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* [RFC v1 5/6] drm/edid: use the new displayid iterator for finding CEA extension
  2021-03-09 13:54 [RFC v1 0/6] drm/edid: overhaul displayid iterator Jani Nikula
                   ` (3 preceding siblings ...)
  2021-03-09 13:54 ` [RFC v1 4/6] drm/edid: use the new displayid iterator for detailed modes Jani Nikula
@ 2021-03-09 13:54 ` Jani Nikula
  2021-03-10 19:12   ` Ville Syrjälä
  2021-03-09 13:54 ` [RFC v1 6/6] drm/edid: use the new displayid iterator for tile info Jani Nikula
  5 siblings, 1 reply; 13+ messages in thread
From: Jani Nikula @ 2021-03-09 13:54 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

Neatly reduce displayid boilerplate in code. No functional changes.

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

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index fbaa7d679cb2..4526e2557dca 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3266,35 +3266,28 @@ const u8 *drm_find_edid_extension(const struct edid *edid,
 
 static const u8 *drm_find_cea_extension(const struct edid *edid)
 {
-	int length, idx;
 	const struct displayid_block *block;
+	struct displayid_iter iter;
 	const u8 *cea;
-	const u8 *displayid;
-	int ext_index;
+	int ext_index = 0;
 
 	/* Look for a top level CEA extension block */
 	/* FIXME: make callers iterate through multiple CEA ext blocks? */
-	ext_index = 0;
 	cea = drm_find_edid_extension(edid, CEA_EXT, &ext_index);
 	if (cea)
 		return cea;
 
 	/* CEA blocks can also be found embedded in a DisplayID block */
-	ext_index = 0;
-	for (;;) {
-		displayid = drm_find_displayid_extension(edid, &length, &idx,
-							 &ext_index);
-		if (!displayid)
-			return NULL;
-
-		idx += sizeof(struct displayid_hdr);
-		for_each_displayid_db(displayid, block, idx, length) {
-			if (block->tag == DATA_BLOCK_CTA)
-				return (const u8 *)block;
+	displayid_iter_edid_begin(edid, &iter);
+	displayid_iter_for_each(block, &iter) {
+		if (block->tag == DATA_BLOCK_CTA) {
+			cea = (const u8 *)block;
+			break;
 		}
 	}
+	displayid_iter_end(&iter);
 
-	return NULL;
+	return cea;
 }
 
 static __always_inline const struct drm_display_mode *cea_mode_for_vic(u8 vic)
-- 
2.20.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* [RFC v1 6/6] drm/edid: use the new displayid iterator for tile info
  2021-03-09 13:54 [RFC v1 0/6] drm/edid: overhaul displayid iterator Jani Nikula
                   ` (4 preceding siblings ...)
  2021-03-09 13:54 ` [RFC v1 5/6] drm/edid: use the new displayid iterator for finding CEA extension Jani Nikula
@ 2021-03-09 13:54 ` Jani Nikula
  2021-03-10 19:16   ` [Intel-gfx] " Ville Syrjälä
  5 siblings, 1 reply; 13+ messages in thread
From: Jani Nikula @ 2021-03-09 13:54 UTC (permalink / raw)
  To: dri-devel; +Cc: jani.nikula, intel-gfx

Neatly reduce displayid boilerplate in code. Remove excessive debug
logging while at it, no other functional changes.

The old displayid iterator becomes unused; remove it as well as make
drm_find_displayid_extension() static.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/drm_displayid.c |  6 +++---
 drivers/gpu/drm/drm_edid.c      | 37 +++++++--------------------------
 include/drm/drm_displayid.h     | 12 -----------
 3 files changed, 10 insertions(+), 45 deletions(-)

diff --git a/drivers/gpu/drm/drm_displayid.c b/drivers/gpu/drm/drm_displayid.c
index 88070267aac9..b146f2d0d72a 100644
--- a/drivers/gpu/drm/drm_displayid.c
+++ b/drivers/gpu/drm/drm_displayid.c
@@ -33,9 +33,9 @@ static int validate_displayid(const u8 *displayid, int length, int idx)
 	return 0;
 }
 
-const u8 *drm_find_displayid_extension(const struct edid *edid,
-				       int *length, int *idx,
-				       int *ext_index)
+static const u8 *drm_find_displayid_extension(const struct edid *edid,
+					      int *length, int *idx,
+					      int *ext_index)
 {
 	const u8 *displayid = drm_find_edid_extension(edid, DISPLAYID_EXT, ext_index);
 	const struct displayid_hdr *base;
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 4526e2557dca..81d5f2524246 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -5969,43 +5969,20 @@ static void drm_parse_tiled_block(struct drm_connector *connector,
 	}
 }
 
-static void drm_displayid_parse_tiled(struct drm_connector *connector,
-				      const u8 *displayid, int length, int idx)
-{
-	const struct displayid_block *block;
-
-	idx += sizeof(struct displayid_hdr);
-	for_each_displayid_db(displayid, block, idx, length) {
-		DRM_DEBUG_KMS("block id 0x%x, rev %d, len %d\n",
-			      block->tag, block->rev, block->num_bytes);
-
-		switch (block->tag) {
-		case DATA_BLOCK_TILED_DISPLAY:
-			drm_parse_tiled_block(connector, block);
-			break;
-		default:
-			DRM_DEBUG_KMS("found DisplayID tag 0x%x, unhandled\n", block->tag);
-			break;
-		}
-	}
-}
-
 void drm_update_tile_info(struct drm_connector *connector,
 			  const struct edid *edid)
 {
-	const void *displayid = NULL;
-	int ext_index = 0;
-	int length, idx;
+	const struct displayid_block *block;
+	struct displayid_iter iter;
 
 	connector->has_tile = false;
-	for (;;) {
-		displayid = drm_find_displayid_extension(edid, &length, &idx,
-							 &ext_index);
-		if (!displayid)
-			break;
 
-		drm_displayid_parse_tiled(connector, displayid, length, idx);
+	displayid_iter_edid_begin(edid, &iter);
+	displayid_iter_for_each(block, &iter) {
+		if (block->tag == DATA_BLOCK_TILED_DISPLAY)
+			drm_parse_tiled_block(connector, block);
 	}
+	displayid_iter_end(&iter);
 
 	if (!connector->has_tile && connector->tile_group) {
 		drm_mode_put_tile_group(connector->dev, connector->tile_group);
diff --git a/include/drm/drm_displayid.h b/include/drm/drm_displayid.h
index 27e06c98db17..10ee863f1734 100644
--- a/include/drm/drm_displayid.h
+++ b/include/drm/drm_displayid.h
@@ -96,18 +96,6 @@ struct displayid_detailed_timing_block {
 	struct displayid_detailed_timings_1 timings[];
 };
 
-#define for_each_displayid_db(displayid, block, idx, length) \
-	for ((block) = (const struct displayid_block *)&(displayid)[idx]; \
-	     (idx) + sizeof(struct displayid_block) <= (length) && \
-	     (idx) + sizeof(struct displayid_block) + (block)->num_bytes <= (length) && \
-	     (block)->num_bytes > 0; \
-	     (idx) += sizeof(struct displayid_block) + (block)->num_bytes, \
-	     (block) = (const struct displayid_block *)&(displayid)[idx])
-
-const u8 *drm_find_displayid_extension(const struct edid *edid,
-				       int *length, int *idx,
-				       int *ext_index);
-
 /* DisplayID iteration */
 struct displayid_iter {
 	const struct edid *edid;
-- 
2.20.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [Intel-gfx] [RFC v1 1/6] drm/edid: make a number of functions, parameters and variables const
  2021-03-09 13:54 ` [RFC v1 1/6] drm/edid: make a number of functions, parameters and variables const Jani Nikula
@ 2021-03-10 18:54   ` Ville Syrjälä
  0 siblings, 0 replies; 13+ messages in thread
From: Ville Syrjälä @ 2021-03-10 18:54 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx, dri-devel

On Tue, Mar 09, 2021 at 03:54:09PM +0200, Jani Nikula wrote:
> If there's no need to change it, it should be const. There's more to be
> done, but start off with changes that make follow-up work easier. No
> functional changes.
> 
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>

const is good.

Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

> ---
>  drivers/gpu/drm/drm_edid.c  | 58 ++++++++++++++++++-------------------
>  include/drm/drm_displayid.h |  4 +--
>  2 files changed, 31 insertions(+), 31 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index c2bbe7bee7b6..d510b827a1f8 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -1585,7 +1585,7 @@ module_param_named(edid_fixup, edid_fixup, int, 0400);
>  MODULE_PARM_DESC(edid_fixup,
>  		 "Minimum number of valid EDID header bytes (0-8, default 6)");
>  
> -static int validate_displayid(u8 *displayid, int length, int idx);
> +static int validate_displayid(const u8 *displayid, int length, int idx);
>  
>  static int drm_edid_block_checksum(const u8 *raw_edid)
>  {
> @@ -3241,10 +3241,10 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid,
>  /*
>   * Search EDID for CEA extension block.
>   */
> -static u8 *drm_find_edid_extension(const struct edid *edid,
> -				   int ext_id, int *ext_index)
> +static const u8 *drm_find_edid_extension(const struct edid *edid,
> +					 int ext_id, int *ext_index)
>  {
> -	u8 *edid_ext = NULL;
> +	const u8 *edid_ext = NULL;
>  	int i;
>  
>  	/* No EDID or EDID extensions */
> @@ -3253,7 +3253,7 @@ static u8 *drm_find_edid_extension(const struct edid *edid,
>  
>  	/* Find CEA extension */
>  	for (i = *ext_index; i < edid->extensions; i++) {
> -		edid_ext = (u8 *)edid + EDID_LENGTH * (i + 1);
> +		edid_ext = (const u8 *)edid + EDID_LENGTH * (i + 1);
>  		if (edid_ext[0] == ext_id)
>  			break;
>  	}
> @@ -3267,12 +3267,12 @@ static u8 *drm_find_edid_extension(const struct edid *edid,
>  }
>  
>  
> -static u8 *drm_find_displayid_extension(const struct edid *edid,
> -					int *length, int *idx,
> -					int *ext_index)
> +static const u8 *drm_find_displayid_extension(const struct edid *edid,
> +					      int *length, int *idx,
> +					      int *ext_index)
>  {
> -	u8 *displayid = drm_find_edid_extension(edid, DISPLAYID_EXT, ext_index);
> -	struct displayid_hdr *base;
> +	const u8 *displayid = drm_find_edid_extension(edid, DISPLAYID_EXT, ext_index);
> +	const struct displayid_hdr *base;
>  	int ret;
>  
>  	if (!displayid)
> @@ -3286,18 +3286,18 @@ static u8 *drm_find_displayid_extension(const struct edid *edid,
>  	if (ret)
>  		return NULL;
>  
> -	base = (struct displayid_hdr *)&displayid[*idx];
> +	base = (const struct displayid_hdr *)&displayid[*idx];
>  	*length = *idx + sizeof(*base) + base->bytes;
>  
>  	return displayid;
>  }
>  
> -static u8 *drm_find_cea_extension(const struct edid *edid)
> +static const u8 *drm_find_cea_extension(const struct edid *edid)
>  {
>  	int length, idx;
> -	struct displayid_block *block;
> -	u8 *cea;
> -	u8 *displayid;
> +	const struct displayid_block *block;
> +	const u8 *cea;
> +	const u8 *displayid;
>  	int ext_index;
>  
>  	/* Look for a top level CEA extension block */
> @@ -3318,7 +3318,7 @@ static u8 *drm_find_cea_extension(const struct edid *edid)
>  		idx += sizeof(struct displayid_hdr);
>  		for_each_displayid_db(displayid, block, idx, length) {
>  			if (block->tag == DATA_BLOCK_CTA)
> -				return (u8 *)block;
> +				return (const u8 *)block;
>  		}
>  	}
>  
> @@ -4503,8 +4503,8 @@ static void clear_eld(struct drm_connector *connector)
>  static void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid)
>  {
>  	uint8_t *eld = connector->eld;
> -	u8 *cea;
> -	u8 *db;
> +	const u8 *cea;
> +	const u8 *db;
>  	int total_sad_count = 0;
>  	int mnl;
>  	int dbl;
> @@ -4600,7 +4600,7 @@ int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads)
>  {
>  	int count = 0;
>  	int i, start, end, dbl;
> -	u8 *cea;
> +	const u8 *cea;
>  
>  	cea = drm_find_cea_extension(edid);
>  	if (!cea) {
> @@ -4619,7 +4619,7 @@ int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads)
>  	}
>  
>  	for_each_cea_db(cea, i, start, end) {
> -		u8 *db = &cea[i];
> +		const u8 *db = &cea[i];
>  
>  		if (cea_db_tag(db) == AUDIO_BLOCK) {
>  			int j;
> @@ -4631,7 +4631,7 @@ int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads)
>  			if (!*sads)
>  				return -ENOMEM;
>  			for (j = 0; j < count; j++) {
> -				u8 *sad = &db[1 + j * 3];
> +				const u8 *sad = &db[1 + j * 3];
>  
>  				(*sads)[j].format = (sad[0] & 0x78) >> 3;
>  				(*sads)[j].channels = sad[0] & 0x7;
> @@ -4755,7 +4755,7 @@ EXPORT_SYMBOL(drm_av_sync_delay);
>   */
>  bool drm_detect_hdmi_monitor(struct edid *edid)
>  {
> -	u8 *edid_ext;
> +	const u8 *edid_ext;
>  	int i;
>  	int start_offset, end_offset;
>  
> @@ -4793,7 +4793,7 @@ EXPORT_SYMBOL(drm_detect_hdmi_monitor);
>   */
>  bool drm_detect_monitor_audio(struct edid *edid)
>  {
> -	u8 *edid_ext;
> +	const u8 *edid_ext;
>  	int i, j;
>  	bool has_audio = false;
>  	int start_offset, end_offset;
> @@ -5287,13 +5287,13 @@ u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edi
>  	return quirks;
>  }
>  
> -static int validate_displayid(u8 *displayid, int length, int idx)
> +static int validate_displayid(const u8 *displayid, int length, int idx)
>  {
>  	int i, dispid_length;
>  	u8 csum = 0;
> -	struct displayid_hdr *base;
> +	const struct displayid_hdr *base;
>  
> -	base = (struct displayid_hdr *)&displayid[idx];
> +	base = (const struct displayid_hdr *)&displayid[idx];
>  
>  	DRM_DEBUG_KMS("base revision 0x%x, length %d, %d %d\n",
>  		      base->rev, base->bytes, base->prod_id, base->ext_count);
> @@ -5359,7 +5359,7 @@ static struct drm_display_mode *drm_mode_displayid_detailed(struct drm_device *d
>  }
>  
>  static int add_displayid_detailed_1_modes(struct drm_connector *connector,
> -					  struct displayid_block *block)
> +					  const struct displayid_block *block)
>  {
>  	struct displayid_detailed_timing_block *det = (struct displayid_detailed_timing_block *)block;
>  	int i;
> @@ -5387,9 +5387,9 @@ static int add_displayid_detailed_1_modes(struct drm_connector *connector,
>  static int add_displayid_detailed_modes(struct drm_connector *connector,
>  					struct edid *edid)
>  {
> -	u8 *displayid;
> +	const u8 *displayid;
>  	int length, idx;
> -	struct displayid_block *block;
> +	const struct displayid_block *block;
>  	int num_modes = 0;
>  	int ext_index = 0;
>  
> diff --git a/include/drm/drm_displayid.h b/include/drm/drm_displayid.h
> index 77941efb5426..f141c0eff083 100644
> --- a/include/drm/drm_displayid.h
> +++ b/include/drm/drm_displayid.h
> @@ -93,11 +93,11 @@ struct displayid_detailed_timing_block {
>  };
>  
>  #define for_each_displayid_db(displayid, block, idx, length) \
> -	for ((block) = (struct displayid_block *)&(displayid)[idx]; \
> +	for ((block) = (const struct displayid_block *)&(displayid)[idx]; \
>  	     (idx) + sizeof(struct displayid_block) <= (length) && \
>  	     (idx) + sizeof(struct displayid_block) + (block)->num_bytes <= (length) && \
>  	     (block)->num_bytes > 0; \
>  	     (idx) += sizeof(struct displayid_block) + (block)->num_bytes, \
> -	     (block) = (struct displayid_block *)&(displayid)[idx])
> +	     (block) = (const struct displayid_block *)&(displayid)[idx])
>  
>  #endif
> -- 
> 2.20.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Ville Syrjälä
Intel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [Intel-gfx] [RFC v1 2/6] drm/displayid: add separate drm_displayid.c
  2021-03-09 13:54 ` [RFC v1 2/6] drm/displayid: add separate drm_displayid.c Jani Nikula
@ 2021-03-10 19:00   ` Ville Syrjälä
  0 siblings, 0 replies; 13+ messages in thread
From: Ville Syrjälä @ 2021-03-10 19:00 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx, dri-devel

On Tue, Mar 09, 2021 at 03:54:10PM +0200, Jani Nikula wrote:
> We'll be adding more DisplayID specific functions going forward, so
> start off by splitting out a few functions to a separate file.
> 
> We don't bother with exporting the functions; at least for now they
> should be needed solely within drm.ko.
> 
> No functional changes.
> 
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>

Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

> ---
>  drivers/gpu/drm/Makefile        |  2 +-
>  drivers/gpu/drm/drm_displayid.c | 59 +++++++++++++++++++++++++++++++++
>  drivers/gpu/drm/drm_edid.c      | 58 ++------------------------------
>  include/drm/drm_displayid.h     |  8 +++++
>  include/drm/drm_edid.h          |  3 ++
>  5 files changed, 73 insertions(+), 57 deletions(-)
>  create mode 100644 drivers/gpu/drm/drm_displayid.c
> 
> diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile
> index 5eb5bf7c16e3..78ef2fd14f10 100644
> --- a/drivers/gpu/drm/Makefile
> +++ b/drivers/gpu/drm/Makefile
> @@ -7,7 +7,7 @@ drm-y       :=	drm_auth.o drm_cache.o \
>  		drm_file.o drm_gem.o drm_ioctl.o drm_irq.o \
>  		drm_drv.o \
>  		drm_sysfs.o drm_hashtab.o drm_mm.o \
> -		drm_crtc.o drm_fourcc.o drm_modes.o drm_edid.o \
> +		drm_crtc.o drm_fourcc.o drm_modes.o drm_edid.o drm_displayid.o \
>  		drm_encoder_slave.o \
>  		drm_trace_points.o drm_prime.o \
>  		drm_rect.o drm_vma_manager.o drm_flip_work.o \
> diff --git a/drivers/gpu/drm/drm_displayid.c b/drivers/gpu/drm/drm_displayid.c
> new file mode 100644
> index 000000000000..908bbe6feb61
> --- /dev/null
> +++ b/drivers/gpu/drm/drm_displayid.c
> @@ -0,0 +1,59 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright © 2021 Intel Corporation
> + */
> +
> +#include <drm/drm_displayid.h>
> +#include <drm/drm_edid.h>
> +#include <drm/drm_print.h>
> +
> +static int validate_displayid(const u8 *displayid, int length, int idx)
> +{
> +	int i, dispid_length;
> +	u8 csum = 0;
> +	const struct displayid_hdr *base;
> +
> +	base = (const struct displayid_hdr *)&displayid[idx];
> +
> +	DRM_DEBUG_KMS("base revision 0x%x, length %d, %d %d\n",
> +		      base->rev, base->bytes, base->prod_id, base->ext_count);
> +
> +	/* +1 for DispID checksum */
> +	dispid_length = sizeof(*base) + base->bytes + 1;
> +	if (dispid_length > length - idx)
> +		return -EINVAL;
> +
> +	for (i = 0; i < dispid_length; i++)
> +		csum += displayid[idx + i];
> +	if (csum) {
> +		DRM_NOTE("DisplayID checksum invalid, remainder is %d\n", csum);
> +		return -EINVAL;
> +	}
> +
> +	return 0;
> +}
> +
> +const u8 *drm_find_displayid_extension(const struct edid *edid,
> +				       int *length, int *idx,
> +				       int *ext_index)
> +{
> +	const u8 *displayid = drm_find_edid_extension(edid, DISPLAYID_EXT, ext_index);
> +	const struct displayid_hdr *base;
> +	int ret;
> +
> +	if (!displayid)
> +		return NULL;
> +
> +	/* EDID extensions block checksum isn't for us */
> +	*length = EDID_LENGTH - 1;
> +	*idx = 1;
> +
> +	ret = validate_displayid(displayid, *length, *idx);
> +	if (ret)
> +		return NULL;
> +
> +	base = (const struct displayid_hdr *)&displayid[*idx];
> +	*length = *idx + sizeof(*base) + base->bytes;
> +
> +	return displayid;
> +}
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index d510b827a1f8..58e61f792bc7 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -1585,8 +1585,6 @@ module_param_named(edid_fixup, edid_fixup, int, 0400);
>  MODULE_PARM_DESC(edid_fixup,
>  		 "Minimum number of valid EDID header bytes (0-8, default 6)");
>  
> -static int validate_displayid(const u8 *displayid, int length, int idx);
> -
>  static int drm_edid_block_checksum(const u8 *raw_edid)
>  {
>  	int i;
> @@ -3241,8 +3239,8 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid,
>  /*
>   * Search EDID for CEA extension block.
>   */
> -static const u8 *drm_find_edid_extension(const struct edid *edid,
> -					 int ext_id, int *ext_index)
> +const u8 *drm_find_edid_extension(const struct edid *edid,
> +				  int ext_id, int *ext_index)
>  {
>  	const u8 *edid_ext = NULL;
>  	int i;
> @@ -3266,32 +3264,6 @@ static const u8 *drm_find_edid_extension(const struct edid *edid,
>  	return edid_ext;
>  }
>  
> -
> -static const u8 *drm_find_displayid_extension(const struct edid *edid,
> -					      int *length, int *idx,
> -					      int *ext_index)
> -{
> -	const u8 *displayid = drm_find_edid_extension(edid, DISPLAYID_EXT, ext_index);
> -	const struct displayid_hdr *base;
> -	int ret;
> -
> -	if (!displayid)
> -		return NULL;
> -
> -	/* EDID extensions block checksum isn't for us */
> -	*length = EDID_LENGTH - 1;
> -	*idx = 1;
> -
> -	ret = validate_displayid(displayid, *length, *idx);
> -	if (ret)
> -		return NULL;
> -
> -	base = (const struct displayid_hdr *)&displayid[*idx];
> -	*length = *idx + sizeof(*base) + base->bytes;
> -
> -	return displayid;
> -}
> -
>  static const u8 *drm_find_cea_extension(const struct edid *edid)
>  {
>  	int length, idx;
> @@ -5287,32 +5259,6 @@ u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edi
>  	return quirks;
>  }
>  
> -static int validate_displayid(const u8 *displayid, int length, int idx)
> -{
> -	int i, dispid_length;
> -	u8 csum = 0;
> -	const struct displayid_hdr *base;
> -
> -	base = (const struct displayid_hdr *)&displayid[idx];
> -
> -	DRM_DEBUG_KMS("base revision 0x%x, length %d, %d %d\n",
> -		      base->rev, base->bytes, base->prod_id, base->ext_count);
> -
> -	/* +1 for DispID checksum */
> -	dispid_length = sizeof(*base) + base->bytes + 1;
> -	if (dispid_length > length - idx)
> -		return -EINVAL;
> -
> -	for (i = 0; i < dispid_length; i++)
> -		csum += displayid[idx + i];
> -	if (csum) {
> -		DRM_NOTE("DisplayID checksum invalid, remainder is %d\n", csum);
> -		return -EINVAL;
> -	}
> -
> -	return 0;
> -}
> -
>  static struct drm_display_mode *drm_mode_displayid_detailed(struct drm_device *dev,
>  							    struct displayid_detailed_timings_1 *timings)
>  {
> diff --git a/include/drm/drm_displayid.h b/include/drm/drm_displayid.h
> index f141c0eff083..3c6db22a518a 100644
> --- a/include/drm/drm_displayid.h
> +++ b/include/drm/drm_displayid.h
> @@ -22,6 +22,10 @@
>  #ifndef DRM_DISPLAYID_H
>  #define DRM_DISPLAYID_H
>  
> +#include <linux/types.h>
> +
> +struct edid;
> +
>  #define DATA_BLOCK_PRODUCT_ID 0x00
>  #define DATA_BLOCK_DISPLAY_PARAMETERS 0x01
>  #define DATA_BLOCK_COLOR_CHARACTERISTICS 0x02
> @@ -100,4 +104,8 @@ struct displayid_detailed_timing_block {
>  	     (idx) += sizeof(struct displayid_block) + (block)->num_bytes, \
>  	     (block) = (const struct displayid_block *)&(displayid)[idx])
>  
> +const u8 *drm_find_displayid_extension(const struct edid *edid,
> +				       int *length, int *idx,
> +				       int *ext_index);
> +
>  #endif
> diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
> index a158f585f658..759328a5eeb2 100644
> --- a/include/drm/drm_edid.h
> +++ b/include/drm/drm_edid.h
> @@ -543,5 +543,8 @@ 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);
> +
>  
>  #endif /* __DRM_EDID_H__ */
> -- 
> 2.20.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Ville Syrjälä
Intel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [RFC v1 3/6] drm/displayid: add new displayid section/block iterators
  2021-03-09 13:54 ` [RFC v1 3/6] drm/displayid: add new displayid section/block iterators Jani Nikula
@ 2021-03-10 19:10   ` Ville Syrjälä
  0 siblings, 0 replies; 13+ messages in thread
From: Ville Syrjälä @ 2021-03-10 19:10 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx, dri-devel

On Tue, Mar 09, 2021 at 03:54:11PM +0200, Jani Nikula wrote:
> Iterating DisplayID blocks across sections (in EDID extensions) is
> unnecessarily complicated for the caller. Implement DisplayID iterators
> to go through all blocks in all sections.
> 
> Usage example:
> 
> 	const struct displayid_block *block;
> 	struct displayid_iter iter;
> 
> 	displayid_iter_edid_begin(edid, &iter);
> 	displayid_iter_for_each(block, &iter) {
> 		/* operate on block */
> 	}
> 	displayid_iter_end(&iter);
> 
> When DisplayID is stored in EDID extensions, the DisplayID sections map
> to extensions as described in VESA DisplayID v1.3 Appendix B: DisplayID
> as an EDID Extension. This is implemented here.
> 
> When DisplayID is stored in its dedicated DDC device 0xA4, according to
> VESA E-DDC v1.3, different rules apply for the structure. This is not
> implemented here, as we don't currently use it, but the idea is you'd
> have a different call for beginning the iteration, for example simply:
> 
> 	displayid_iter_begin(displayid, &iter);
> 
> instead of displayid_iter_edid_begin(), and everything else would be
> hidden away in the iterator functions.
> 
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>  drivers/gpu/drm/drm_displayid.c | 74 +++++++++++++++++++++++++++++++++
>  include/drm/drm_displayid.h     | 18 ++++++++
>  2 files changed, 92 insertions(+)
> 
> diff --git a/drivers/gpu/drm/drm_displayid.c b/drivers/gpu/drm/drm_displayid.c
> index 908bbe6feb61..88070267aac9 100644
> --- a/drivers/gpu/drm/drm_displayid.c
> +++ b/drivers/gpu/drm/drm_displayid.c
> @@ -57,3 +57,77 @@ const u8 *drm_find_displayid_extension(const struct edid *edid,
>  
>  	return displayid;
>  }
> +
> +void displayid_iter_edid_begin(const struct edid *edid,
> +			       struct displayid_iter *iter)
> +{
> +	memset(iter, 0, sizeof(*iter));
> +
> +	iter->edid = edid;
> +}
> +
> +static const struct displayid_block *
> +__displayid_iter_block(const struct displayid_iter *iter)
> +{
> +	const struct displayid_block *block;
> +
> +	if (!iter->section)
> +		return NULL;
> +
> +	block = (const struct displayid_block *)&iter->section[iter->idx];
> +
> +	if (iter->idx + sizeof(struct displayid_block) <= iter->length &&
> +	    iter->idx + sizeof(struct displayid_block) + block->num_bytes <= iter->length &&

sizeof(*block) perhaps

> +	    block->num_bytes > 0)
> +		return block;
> +
> +	return NULL;
> +}
> +
> +const struct displayid_block *
> +__displayid_iter_next(struct displayid_iter *iter)
> +{
> +	const struct displayid_block *block;
> +
> +	if (!iter->edid)
> +		return NULL;
> +
> +	if (iter->section) {
> +		/* current block should always be valid */
> +		block = __displayid_iter_block(iter);
> +		if (WARN_ON(!block)) {
> +			iter->section = NULL;
> +			iter->edid = NULL;
> +			return NULL;
> +		}
> +
> +		/* next block in section */
> +		iter->idx += sizeof(struct displayid_block) + block->num_bytes;

ditto

Looks like this should do the same thing the current thing does,
or at least I couldn't immediately spot nay differences.

Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

> +
> +		block = __displayid_iter_block(iter);
> +		if (block)
> +			return block;
> +	}
> +
> +	for (;;) {
> +		iter->section = drm_find_displayid_extension(iter->edid,
> +							     &iter->length,
> +							     &iter->idx,
> +							     &iter->ext_index);
> +		if (!iter->section) {
> +			iter->edid = NULL;
> +			return NULL;
> +		}
> +
> +		iter->idx += sizeof(struct displayid_hdr);
> +
> +		block = __displayid_iter_block(iter);
> +		if (block)
> +			return block;
> +	}
> +}
> +
> +void displayid_iter_end(struct displayid_iter *iter)
> +{
> +	memset(iter, 0, sizeof(*iter));
> +}
> diff --git a/include/drm/drm_displayid.h b/include/drm/drm_displayid.h
> index 3c6db22a518a..27e06c98db17 100644
> --- a/include/drm/drm_displayid.h
> +++ b/include/drm/drm_displayid.h
> @@ -108,4 +108,22 @@ const u8 *drm_find_displayid_extension(const struct edid *edid,
>  				       int *length, int *idx,
>  				       int *ext_index);
>  
> +/* DisplayID iteration */
> +struct displayid_iter {
> +	const struct edid *edid;
> +
> +	const u8 *section;
> +	int length;
> +	int idx;
> +	int ext_index;
> +};
> +
> +void displayid_iter_edid_begin(const struct edid *edid,
> +			       struct displayid_iter *iter);
> +const struct displayid_block *
> +__displayid_iter_next(struct displayid_iter *iter);
> +#define displayid_iter_for_each(__block, __iter) \
> +	while (((__block) = __displayid_iter_next(__iter)))
> +void displayid_iter_end(struct displayid_iter *iter);
> +
>  #endif
> -- 
> 2.20.1
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Ville Syrjälä
Intel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [RFC v1 4/6] drm/edid: use the new displayid iterator for detailed modes
  2021-03-09 13:54 ` [RFC v1 4/6] drm/edid: use the new displayid iterator for detailed modes Jani Nikula
@ 2021-03-10 19:10   ` Ville Syrjälä
  0 siblings, 0 replies; 13+ messages in thread
From: Ville Syrjälä @ 2021-03-10 19:10 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx, dri-devel

On Tue, Mar 09, 2021 at 03:54:12PM +0200, Jani Nikula wrote:
> Neatly reduce displayid boilerplate in code. No functional changes.
> 
> 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 | 23 ++++++-----------------
>  1 file changed, 6 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 58e61f792bc7..fbaa7d679cb2 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -5333,27 +5333,16 @@ static int add_displayid_detailed_1_modes(struct drm_connector *connector,
>  static int add_displayid_detailed_modes(struct drm_connector *connector,
>  					struct edid *edid)
>  {
> -	const u8 *displayid;
> -	int length, idx;
>  	const struct displayid_block *block;
> +	struct displayid_iter iter;
>  	int num_modes = 0;
> -	int ext_index = 0;
> -
> -	for (;;) {
> -		displayid = drm_find_displayid_extension(edid, &length, &idx,
> -							 &ext_index);
> -		if (!displayid)
> -			break;
>  
> -		idx += sizeof(struct displayid_hdr);
> -		for_each_displayid_db(displayid, block, idx, length) {
> -			switch (block->tag) {
> -			case DATA_BLOCK_TYPE_1_DETAILED_TIMING:
> -				num_modes += add_displayid_detailed_1_modes(connector, block);
> -				break;
> -			}
> -		}
> +	displayid_iter_edid_begin(edid, &iter);
> +	displayid_iter_for_each(block, &iter) {
> +		if (block->tag == DATA_BLOCK_TYPE_1_DETAILED_TIMING)
> +			num_modes += add_displayid_detailed_1_modes(connector, block);
>  	}
> +	displayid_iter_end(&iter);
>  
>  	return num_modes;
>  }
> -- 
> 2.20.1
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Ville Syrjälä
Intel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [RFC v1 5/6] drm/edid: use the new displayid iterator for finding CEA extension
  2021-03-09 13:54 ` [RFC v1 5/6] drm/edid: use the new displayid iterator for finding CEA extension Jani Nikula
@ 2021-03-10 19:12   ` Ville Syrjälä
  0 siblings, 0 replies; 13+ messages in thread
From: Ville Syrjälä @ 2021-03-10 19:12 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx, dri-devel

On Tue, Mar 09, 2021 at 03:54:13PM +0200, Jani Nikula wrote:
> Neatly reduce displayid boilerplate in code. No functional changes.
> 
> 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 | 25 +++++++++----------------
>  1 file changed, 9 insertions(+), 16 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index fbaa7d679cb2..4526e2557dca 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -3266,35 +3266,28 @@ const u8 *drm_find_edid_extension(const struct edid *edid,
>  
>  static const u8 *drm_find_cea_extension(const struct edid *edid)
>  {
> -	int length, idx;
>  	const struct displayid_block *block;
> +	struct displayid_iter iter;
>  	const u8 *cea;
> -	const u8 *displayid;
> -	int ext_index;
> +	int ext_index = 0;
>  
>  	/* Look for a top level CEA extension block */
>  	/* FIXME: make callers iterate through multiple CEA ext blocks? */
> -	ext_index = 0;
>  	cea = drm_find_edid_extension(edid, CEA_EXT, &ext_index);
>  	if (cea)
>  		return cea;
>  
>  	/* CEA blocks can also be found embedded in a DisplayID block */
> -	ext_index = 0;
> -	for (;;) {
> -		displayid = drm_find_displayid_extension(edid, &length, &idx,
> -							 &ext_index);
> -		if (!displayid)
> -			return NULL;
> -
> -		idx += sizeof(struct displayid_hdr);
> -		for_each_displayid_db(displayid, block, idx, length) {
> -			if (block->tag == DATA_BLOCK_CTA)
> -				return (const u8 *)block;
> +	displayid_iter_edid_begin(edid, &iter);
> +	displayid_iter_for_each(block, &iter) {
> +		if (block->tag == DATA_BLOCK_CTA) {
> +			cea = (const u8 *)block;
> +			break;
>  		}
>  	}
> +	displayid_iter_end(&iter);
>  
> -	return NULL;
> +	return cea;
>  }
>  
>  static __always_inline const struct drm_display_mode *cea_mode_for_vic(u8 vic)
> -- 
> 2.20.1
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Ville Syrjälä
Intel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

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

* Re: [Intel-gfx] [RFC v1 6/6] drm/edid: use the new displayid iterator for tile info
  2021-03-09 13:54 ` [RFC v1 6/6] drm/edid: use the new displayid iterator for tile info Jani Nikula
@ 2021-03-10 19:16   ` Ville Syrjälä
  0 siblings, 0 replies; 13+ messages in thread
From: Ville Syrjälä @ 2021-03-10 19:16 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx, dri-devel

On Tue, Mar 09, 2021 at 03:54:14PM +0200, Jani Nikula wrote:
> Neatly reduce displayid boilerplate in code. Remove excessive debug
> logging while at it, no other functional changes.
> 
> The old displayid iterator becomes unused; remove it as well as make
> drm_find_displayid_extension() static.
> 
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>

Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

Hopeuflly you tested with some of those weird EDIDs with
multiple DisplayID and/or CEA blocks ;)

I was thinking we should try to coalesce an iterator for
the CEA stuff as well...

> ---
>  drivers/gpu/drm/drm_displayid.c |  6 +++---
>  drivers/gpu/drm/drm_edid.c      | 37 +++++++--------------------------
>  include/drm/drm_displayid.h     | 12 -----------
>  3 files changed, 10 insertions(+), 45 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_displayid.c b/drivers/gpu/drm/drm_displayid.c
> index 88070267aac9..b146f2d0d72a 100644
> --- a/drivers/gpu/drm/drm_displayid.c
> +++ b/drivers/gpu/drm/drm_displayid.c
> @@ -33,9 +33,9 @@ static int validate_displayid(const u8 *displayid, int length, int idx)
>  	return 0;
>  }
>  
> -const u8 *drm_find_displayid_extension(const struct edid *edid,
> -				       int *length, int *idx,
> -				       int *ext_index)
> +static const u8 *drm_find_displayid_extension(const struct edid *edid,
> +					      int *length, int *idx,
> +					      int *ext_index)
>  {
>  	const u8 *displayid = drm_find_edid_extension(edid, DISPLAYID_EXT, ext_index);
>  	const struct displayid_hdr *base;
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 4526e2557dca..81d5f2524246 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -5969,43 +5969,20 @@ static void drm_parse_tiled_block(struct drm_connector *connector,
>  	}
>  }
>  
> -static void drm_displayid_parse_tiled(struct drm_connector *connector,
> -				      const u8 *displayid, int length, int idx)
> -{
> -	const struct displayid_block *block;
> -
> -	idx += sizeof(struct displayid_hdr);
> -	for_each_displayid_db(displayid, block, idx, length) {
> -		DRM_DEBUG_KMS("block id 0x%x, rev %d, len %d\n",
> -			      block->tag, block->rev, block->num_bytes);
> -
> -		switch (block->tag) {
> -		case DATA_BLOCK_TILED_DISPLAY:
> -			drm_parse_tiled_block(connector, block);
> -			break;
> -		default:
> -			DRM_DEBUG_KMS("found DisplayID tag 0x%x, unhandled\n", block->tag);
> -			break;
> -		}
> -	}
> -}
> -
>  void drm_update_tile_info(struct drm_connector *connector,
>  			  const struct edid *edid)
>  {
> -	const void *displayid = NULL;
> -	int ext_index = 0;
> -	int length, idx;
> +	const struct displayid_block *block;
> +	struct displayid_iter iter;
>  
>  	connector->has_tile = false;
> -	for (;;) {
> -		displayid = drm_find_displayid_extension(edid, &length, &idx,
> -							 &ext_index);
> -		if (!displayid)
> -			break;
>  
> -		drm_displayid_parse_tiled(connector, displayid, length, idx);
> +	displayid_iter_edid_begin(edid, &iter);
> +	displayid_iter_for_each(block, &iter) {
> +		if (block->tag == DATA_BLOCK_TILED_DISPLAY)
> +			drm_parse_tiled_block(connector, block);
>  	}
> +	displayid_iter_end(&iter);
>  
>  	if (!connector->has_tile && connector->tile_group) {
>  		drm_mode_put_tile_group(connector->dev, connector->tile_group);
> diff --git a/include/drm/drm_displayid.h b/include/drm/drm_displayid.h
> index 27e06c98db17..10ee863f1734 100644
> --- a/include/drm/drm_displayid.h
> +++ b/include/drm/drm_displayid.h
> @@ -96,18 +96,6 @@ struct displayid_detailed_timing_block {
>  	struct displayid_detailed_timings_1 timings[];
>  };
>  
> -#define for_each_displayid_db(displayid, block, idx, length) \
> -	for ((block) = (const struct displayid_block *)&(displayid)[idx]; \
> -	     (idx) + sizeof(struct displayid_block) <= (length) && \
> -	     (idx) + sizeof(struct displayid_block) + (block)->num_bytes <= (length) && \
> -	     (block)->num_bytes > 0; \
> -	     (idx) += sizeof(struct displayid_block) + (block)->num_bytes, \
> -	     (block) = (const struct displayid_block *)&(displayid)[idx])
> -
> -const u8 *drm_find_displayid_extension(const struct edid *edid,
> -				       int *length, int *idx,
> -				       int *ext_index);
> -
>  /* DisplayID iteration */
>  struct displayid_iter {
>  	const struct edid *edid;
> -- 
> 2.20.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Ville Syrjälä
Intel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

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

end of thread, other threads:[~2021-03-10 19:16 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-03-09 13:54 [RFC v1 0/6] drm/edid: overhaul displayid iterator Jani Nikula
2021-03-09 13:54 ` [RFC v1 1/6] drm/edid: make a number of functions, parameters and variables const Jani Nikula
2021-03-10 18:54   ` [Intel-gfx] " Ville Syrjälä
2021-03-09 13:54 ` [RFC v1 2/6] drm/displayid: add separate drm_displayid.c Jani Nikula
2021-03-10 19:00   ` [Intel-gfx] " Ville Syrjälä
2021-03-09 13:54 ` [RFC v1 3/6] drm/displayid: add new displayid section/block iterators Jani Nikula
2021-03-10 19:10   ` Ville Syrjälä
2021-03-09 13:54 ` [RFC v1 4/6] drm/edid: use the new displayid iterator for detailed modes Jani Nikula
2021-03-10 19:10   ` Ville Syrjälä
2021-03-09 13:54 ` [RFC v1 5/6] drm/edid: use the new displayid iterator for finding CEA extension Jani Nikula
2021-03-10 19:12   ` Ville Syrjälä
2021-03-09 13:54 ` [RFC v1 6/6] drm/edid: use the new displayid iterator for tile info Jani Nikula
2021-03-10 19:16   ` [Intel-gfx] " Ville Syrjälä

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).