Message ID | 091dcecb74a14b2cb618f2fc494fd0b52bf535b2.1647985054.git.jani.nikula@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/edid: overhaul CEA data block iteration | expand |
On Tue, Mar 22, 2022 at 11:40:48PM +0200, Jani Nikula wrote: > Convert drm_find_cea_extension() to a predicate function to check if the > EDID has a CEA extension or a DisplayID CTA data block. This is mainly > to avoid adding new users that only find the first CEA extension. > > Signed-off-by: Jani Nikula <jani.nikula@intel.com> > --- > drivers/gpu/drm/drm_edid.c | 17 ++++++++--------- > 1 file changed, 8 insertions(+), 9 deletions(-) > > diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c > index dfaa21f00941..84314b65b75b 100644 > --- a/drivers/gpu/drm/drm_edid.c > +++ b/drivers/gpu/drm/drm_edid.c > @@ -3422,30 +3422,29 @@ const u8 *drm_find_edid_extension(const struct edid *edid, > return edid_ext; > } > > -static const u8 *drm_find_cea_extension(const struct edid *edid) > +/* Return true if the EDID has a CEA extension or a DisplayID CTA data block */ > +static bool drm_edid_has_cea_extension(const struct edid *edid) > { > const struct displayid_block *block; > struct displayid_iter iter; > - const u8 *cea; > int ext_index = 0; > + bool found = false; > > /* 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); > - if (cea) > - return cea; > + if (drm_find_edid_extension(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_for_each(block, &iter) { > if (block->tag == DATA_BLOCK_CTA) { > - cea = (const u8 *)block; > + found = true; > break; > } > } > displayid_iter_end(&iter); > > - return cea; > + return found; > } > > static __always_inline const struct drm_display_mode *cea_mode_for_vic(u8 vic) > @@ -3715,7 +3714,7 @@ add_alternate_cea_modes(struct drm_connector *connector, struct edid *edid) > int modes = 0; > > /* Don't add CEA modes if the CEA extension block is missing */ > - if (!drm_find_cea_extension(edid)) > + if (!drm_edid_has_cea_extension(edid)) I'm thinking we could just do if (modes) modes += add_alternate_cea_modes(...); at the end of add_cea_modes(). Or perhaps if (found) modes += add_alternate_cea_modes(...); if we think that adding the alternate modes would be apporpriate even when add_cea_modes() didn't add anything. Not sure. Yes, that would still introduce a sligth change in behaviour in case we have a CEA ext block/DisplayID CTA block without any of the video/hdmi/y420vdb blocks, but that edge case doesn't feel like a deal-breaker to me.
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index dfaa21f00941..84314b65b75b 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c @@ -3422,30 +3422,29 @@ const u8 *drm_find_edid_extension(const struct edid *edid, return edid_ext; } -static const u8 *drm_find_cea_extension(const struct edid *edid) +/* Return true if the EDID has a CEA extension or a DisplayID CTA data block */ +static bool drm_edid_has_cea_extension(const struct edid *edid) { const struct displayid_block *block; struct displayid_iter iter; - const u8 *cea; int ext_index = 0; + bool found = false; /* 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); - if (cea) - return cea; + if (drm_find_edid_extension(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_for_each(block, &iter) { if (block->tag == DATA_BLOCK_CTA) { - cea = (const u8 *)block; + found = true; break; } } displayid_iter_end(&iter); - return cea; + return found; } static __always_inline const struct drm_display_mode *cea_mode_for_vic(u8 vic) @@ -3715,7 +3714,7 @@ add_alternate_cea_modes(struct drm_connector *connector, struct edid *edid) int modes = 0; /* Don't add CEA modes if the CEA extension block is missing */ - if (!drm_find_cea_extension(edid)) + if (!drm_edid_has_cea_extension(edid)) return 0; /*
Convert drm_find_cea_extension() to a predicate function to check if the EDID has a CEA extension or a DisplayID CTA data block. This is mainly to avoid adding new users that only find the first CEA extension. Signed-off-by: Jani Nikula <jani.nikula@intel.com> --- drivers/gpu/drm/drm_edid.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-)