On Sat,  6 Mar 2021 20:54:22 +0100
Jernej Skrabec <jernej.skra...@siol.net> wrote:

> Code which searches for valid detailed timing entry will be used in more
> places. Extract it.
> 
> No functional change is made. However, descriptors are casted to
> edid_detailed_timing instead of edid_monitor_descriptor. Descriptor can
> be of either type, but since we're interested only in DTD, it is more
> fitting to cast to edid_detailed_timing.

Thanks for adding the explanation!
> 
> Signed-off-by: Jernej Skrabec <jernej.skra...@siol.net>

Reviewed-by: Andre Przywara <andre.przyw...@arm.com>

> ---
>  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) {
> +                     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) {

Reply via email to