drm_find_cea_extension() always look for a top level CEA block. Pass
ext_index from caller then this function to search next available
CEA ext block from a specific EDID block pointer.

Cc: Jani Nikula <jani.nik...@linux.intel.com>
Cc: Ville Syrjala <ville.syrj...@linux.intel.com>
Cc: Ankit Nautiyal <ankit.k.nauti...@intel.com>
Cc: intel-gfx <intel-gfx@lists.freedesktop.org>
Signed-off-by: Lee Shawn C <shawn.c....@intel.com>
---
 drivers/gpu/drm/drm_edid.c | 42 ++++++++++++++++++--------------------
 1 file changed, 20 insertions(+), 22 deletions(-)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 561f53831e29..1251226d9284 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -3353,16 +3353,14 @@ const u8 *drm_find_edid_extension(const struct edid 
*edid,
        return edid_ext;
 }
 
-static const u8 *drm_find_cea_extension(const struct edid *edid)
+static const u8 *drm_find_cea_extension(const struct edid *edid, int 
*ext_index)
 {
        const struct displayid_block *block;
        struct displayid_iter iter;
        const u8 *cea;
-       int ext_index = 0;
 
-       /* Look for a top level CEA extension block */
-       /* FIXME: make callers iterate through multiple CEA ext blocks? */
-       cea = drm_find_edid_extension(edid, CEA_EXT, &ext_index);
+       /* Look for a CEA extension block from ext_index */
+       cea = drm_find_edid_extension(edid, CEA_EXT, ext_index);
        if (cea)
                return cea;
 
@@ -3643,10 +3641,10 @@ add_alternate_cea_modes(struct drm_connector 
*connector, struct edid *edid)
        struct drm_device *dev = connector->dev;
        struct drm_display_mode *mode, *tmp;
        LIST_HEAD(list);
-       int modes = 0;
+       int modes = 0, ext_index = 0;
 
        /* Don't add CEA modes if the CEA extension block is missing */
-       if (!drm_find_cea_extension(edid))
+       if (!drm_find_cea_extension(edid, &ext_index))
                return 0;
 
        /*
@@ -4321,11 +4319,11 @@ static void drm_parse_y420cmdb_bitmap(struct 
drm_connector *connector,
 static int
 add_cea_modes(struct drm_connector *connector, struct edid *edid)
 {
-       const u8 *cea = drm_find_cea_extension(edid);
-       const u8 *db, *hdmi = NULL, *video = NULL;
+       const u8 *cea, *db, *hdmi = NULL, *video = NULL;
        u8 dbl, hdmi_len, video_len = 0;
-       int modes = 0;
+       int modes = 0, ext_index = 0;
 
+       cea = drm_find_cea_extension(edid, &ext_index);
        if (cea && cea_revision(cea) >= 3) {
                int i, start, end;
 
@@ -4562,7 +4560,7 @@ static void drm_edid_to_eld(struct drm_connector 
*connector, struct edid *edid)
        uint8_t *eld = connector->eld;
        const u8 *cea;
        const u8 *db;
-       int total_sad_count = 0;
+       int total_sad_count = 0, ext_index = 0;
        int mnl;
        int dbl;
 
@@ -4571,7 +4569,7 @@ static void drm_edid_to_eld(struct drm_connector 
*connector, struct edid *edid)
        if (!edid)
                return;
 
-       cea = drm_find_cea_extension(edid);
+       cea = drm_find_cea_extension(edid, &ext_index);
        if (!cea) {
                DRM_DEBUG_KMS("ELD: no CEA Extension found\n");
                return;
@@ -4655,11 +4653,11 @@ static void drm_edid_to_eld(struct drm_connector 
*connector, struct edid *edid)
  */
 int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads)
 {
-       int count = 0;
+       int count = 0, ext_index = 0;
        int i, start, end, dbl;
        const u8 *cea;
 
-       cea = drm_find_cea_extension(edid);
+       cea = drm_find_cea_extension(edid, &ext_index);
        if (!cea) {
                DRM_DEBUG_KMS("SAD: no CEA Extension found\n");
                return 0;
@@ -4717,11 +4715,11 @@ EXPORT_SYMBOL(drm_edid_to_sad);
  */
 int drm_edid_to_speaker_allocation(struct edid *edid, u8 **sadb)
 {
-       int count = 0;
+       int count = 0, ext_index = 0;
        int i, start, end, dbl;
        const u8 *cea;
 
-       cea = drm_find_cea_extension(edid);
+       cea = drm_find_cea_extension(edid, &ext_index);
        if (!cea) {
                DRM_DEBUG_KMS("SAD: no CEA Extension found\n");
                return 0;
@@ -4814,9 +4812,9 @@ bool drm_detect_hdmi_monitor(struct edid *edid)
 {
        const u8 *edid_ext;
        int i;
-       int start_offset, end_offset;
+       int start_offset, end_offset, ext_index = 0;
 
-       edid_ext = drm_find_cea_extension(edid);
+       edid_ext = drm_find_cea_extension(edid, &ext_index);
        if (!edid_ext)
                return false;
 
@@ -4853,9 +4851,9 @@ bool drm_detect_monitor_audio(struct edid *edid)
        const u8 *edid_ext;
        int i, j;
        bool has_audio = false;
-       int start_offset, end_offset;
+       int start_offset, end_offset, ext_index = 0;
 
-       edid_ext = drm_find_cea_extension(edid);
+       edid_ext = drm_find_cea_extension(edid, &ext_index);
        if (!edid_ext)
                goto end;
 
@@ -5177,9 +5175,9 @@ static void drm_parse_cea_ext(struct drm_connector 
*connector,
 {
        struct drm_display_info *info = &connector->display_info;
        const u8 *edid_ext;
-       int i, start, end;
+       int i, start, end, ext_index = 0;
 
-       edid_ext = drm_find_cea_extension(edid);
+       edid_ext = drm_find_cea_extension(edid, &ext_index);
        if (!edid_ext)
                return;
 
-- 
2.17.1

Reply via email to