Commit 8873cfa3 authored by Ville Syrjälä's avatar Ville Syrjälä

drm/edid: Allow looking for ext blocks starting from a specified index

Apparently EDIDs with multiple DispID ext blocks is a thing, so prepare
for iterating through multiple ext blocks of the same type by
passing the starting ext block index to drm_find_edid_extension(). Well
also have drm_find_edid_extension() update the index to point to the
next ext block on success. Thus we should be able to call
drm_find_edid_extension() in loop.
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200527130310.27099-1-ville.syrjala@linux.intel.comReviewed-by: default avatarJosé Roberto de Souza <jose.souza@intel.com>
parent d4ad4eca
...@@ -3236,7 +3236,8 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid, ...@@ -3236,7 +3236,8 @@ add_detailed_modes(struct drm_connector *connector, struct edid *edid,
/* /*
* Search EDID for CEA extension block. * Search EDID for CEA extension block.
*/ */
static u8 *drm_find_edid_extension(const struct edid *edid, int ext_id) static u8 *drm_find_edid_extension(const struct edid *edid,
int ext_id, int *ext_index)
{ {
u8 *edid_ext = NULL; u8 *edid_ext = NULL;
int i; int i;
...@@ -3246,23 +3247,26 @@ static u8 *drm_find_edid_extension(const struct edid *edid, int ext_id) ...@@ -3246,23 +3247,26 @@ static u8 *drm_find_edid_extension(const struct edid *edid, int ext_id)
return NULL; return NULL;
/* Find CEA extension */ /* Find CEA extension */
for (i = 0; i < edid->extensions; i++) { for (i = *ext_index; i < edid->extensions; i++) {
edid_ext = (u8 *)edid + EDID_LENGTH * (i + 1); edid_ext = (u8 *)edid + EDID_LENGTH * (i + 1);
if (edid_ext[0] == ext_id) if (edid_ext[0] == ext_id)
break; break;
} }
if (i == edid->extensions) if (i >= edid->extensions)
return NULL; return NULL;
*ext_index = i + 1;
return edid_ext; return edid_ext;
} }
static u8 *drm_find_displayid_extension(const struct edid *edid, static u8 *drm_find_displayid_extension(const struct edid *edid,
int *length, int *idx) int *length, int *idx,
int *ext_index)
{ {
u8 *displayid = drm_find_edid_extension(edid, DISPLAYID_EXT); u8 *displayid = drm_find_edid_extension(edid, DISPLAYID_EXT, ext_index);
struct displayid_hdr *base; struct displayid_hdr *base;
int ret; int ret;
...@@ -3289,14 +3293,18 @@ static u8 *drm_find_cea_extension(const struct edid *edid) ...@@ -3289,14 +3293,18 @@ static u8 *drm_find_cea_extension(const struct edid *edid)
struct displayid_block *block; struct displayid_block *block;
u8 *cea; u8 *cea;
u8 *displayid; u8 *displayid;
int ext_index;
/* Look for a top level CEA extension block */ /* Look for a top level CEA extension block */
cea = drm_find_edid_extension(edid, CEA_EXT); ext_index = 0;
cea = drm_find_edid_extension(edid, CEA_EXT, &ext_index);
if (cea) if (cea)
return cea; return cea;
/* CEA blocks can also be found embedded in a DisplayID block */ /* CEA blocks can also be found embedded in a DisplayID block */
displayid = drm_find_displayid_extension(edid, &length, &idx); ext_index = 0;
displayid = drm_find_displayid_extension(edid, &length, &idx,
&ext_index);
if (!displayid) if (!displayid)
return NULL; return NULL;
...@@ -5246,8 +5254,10 @@ static int add_displayid_detailed_modes(struct drm_connector *connector, ...@@ -5246,8 +5254,10 @@ static int add_displayid_detailed_modes(struct drm_connector *connector,
int length, idx; int length, idx;
struct displayid_block *block; struct displayid_block *block;
int num_modes = 0; int num_modes = 0;
int ext_index = 0;
displayid = drm_find_displayid_extension(edid, &length, &idx); displayid = drm_find_displayid_extension(edid, &length, &idx,
&ext_index);
if (!displayid) if (!displayid)
return 0; return 0;
...@@ -5922,11 +5932,13 @@ void drm_update_tile_info(struct drm_connector *connector, ...@@ -5922,11 +5932,13 @@ void drm_update_tile_info(struct drm_connector *connector,
const struct edid *edid) const struct edid *edid)
{ {
const void *displayid = NULL; const void *displayid = NULL;
int ext_index = 0;
int length, idx; int length, idx;
int ret; int ret;
connector->has_tile = false; connector->has_tile = false;
displayid = drm_find_displayid_extension(edid, &length, &idx); displayid = drm_find_displayid_extension(edid, &length, &idx,
&ext_index);
if (!displayid) { if (!displayid) {
/* drop reference to any tile group we had */ /* drop reference to any tile group we had */
goto out_drop_ref; goto out_drop_ref;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment