[PATCH 04/19] common: edid: extract code for detailed timing search
Jernej Škrabec
jernej.skrabec at siol.net
Sat Mar 6 20:16:04 CET 2021
Dne četrtek, 04. marec 2021 ob 02:41:45 CET je Andre Przywara napisal(a):
> On Tue, 23 Feb 2021 21:46:16 +0100
>
> Jernej Skrabec <jernej.skrabec at siol.net> wrote:
> > Code which searches for valid detailed timing entry will be used in more
> > places. Extract it.
> >
> > Signed-off-by: Jernej Skrabec <jernej.skrabec at siol.net>
> > ---
> >
> > common/edid.c | 49 ++++++++++++++++++++++++++++---------------------
> > 1 file changed, 28 insertions(+), 21 deletions(-)
> >
> > diff --git a/common/edid.c b/common/edid.c
> > index 1cb7177742e8..a6c875d9c8e8 100644
> > --- a/common/edid.c
> > +++ b/common/edid.c
> > @@ -169,6 +169,29 @@ static bool cea_is_hdmi_vsdb_present(struct
> > edid_cea861_info *info)>
> > return false;
> >
> > }
> >
> > +static bool edid_find_valid_timing(void *buf, int count,
> > + struct display_timing *timing,
> > + bool (*mode_valid)(void *priv,
> > + const struct
display_timing *timing),
> > + void *mode_valid_priv)
> > +{
> > + struct edid_detailed_timing *t = buf;
> > + bool found = false;
> > + int i;
> > +
> > + for (i = 0; i < count && !found; i++, t++)
> > + if (EDID_DETAILED_TIMING_PIXEL_CLOCK(*t) != 0) {
>
> I am slightly puzzled, edid_detailed_timing is a different structure
> from edid_monitor_descriptor, as used below. Effectively the code
> checks in both cases for the first halfword to be not 0, but if this
> wasn't the correct structure before, and this is fixing it on the
> way, can you mention it in the commit message?
The thing is that descriptors can be either detailed timing descriptors or
display descriptor. So technically original code is ok - you can first cast
pointer to display descriptor and then check if that's true or not.
I'll mention this change in commit message anyway.
Best regards,
Jernej
>
> Other than that the code looks to be correctly refactored.
>
> Cheers,
> Andre
>
> > + decode_timing((u8 *)t, timing);
> > + if (mode_valid)
> > + found =
mode_valid(mode_valid_priv,
> > + timing);
> > + else
> > + found = true;
> > + }
> > +
> > + return found;
> > +}
> > +
> >
> > int edid_get_timing_validate(u8 *buf, int buf_size,
> >
> > struct display_timing *timing,
> > int *panel_bits_per_colourp,
> >
> > @@ -177,8 +200,7 @@ int edid_get_timing_validate(u8 *buf, int buf_size,
> >
> > void *mode_valid_priv)
> >
> > {
> >
> > struct edid1_info *edid = (struct edid1_info *)buf;
> >
> > - bool timing_done;
> > - int i;
> > + bool found;
> >
> > if (buf_size < sizeof(*edid) || edid_check_info(edid)) {
> >
> > debug("%s: Invalid buffer\n", __func__);
> >
> > @@ -195,25 +217,10 @@ int edid_get_timing_validate(u8 *buf, int buf_size,
> >
> > return -ENOENT;
> >
> > }
> >
> > - /* Look for detailed timing */
> > - timing_done = false;
> > - for (i = 0; i < 4; i++) {
> > - struct edid_monitor_descriptor *desc;
> > -
> > - desc = &edid->monitor_details.descriptor[i];
> > - if (desc->zero_flag_1 != 0) {
> > - decode_timing((u8 *)desc, timing);
> > - if (mode_valid)
> > - timing_done =
mode_valid(mode_valid_priv,
> > -
timing);
> > - else
> > - timing_done = true;
> > -
> > - if (timing_done)
> > - break;
> > - }
> > - }
> > - if (!timing_done)
> > + /* Look for detailed timing in base EDID */
> > + found = edid_find_valid_timing(edid->monitor_details.descriptor, 4,
> > + timing, mode_valid,
mode_valid_priv);
> > + if (!found)
> >
> > return -EINVAL;
> >
> > if (edid->version != 1 || edid->revision < 4) {
More information about the U-Boot
mailing list