On Wed, 26 Nov 2025, Yaroslav Bolyukin <[email protected]> wrote:
> Current VESA vendor-specific block parsing expects real block size to be
> the same as the defined struct size, use real offsets in conditionals
> instead to add struct fields in future commits.
>
> Signed-off-by: Yaroslav Bolyukin <[email protected]>

I think this is something we want to backport, since MSO would break
with bigger vendor-specific blocks, and that leads to black screens on
MSO displays.

Cc: [email protected]
Reviewed-by: Jani Nikula <[email protected]>

> ---
>  drivers/gpu/drm/drm_edid.c | 28 ++++++++++++----------------
>  1 file changed, 12 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
> index 64f7a94dd9e4..a52fd6de9327 100644
> --- a/drivers/gpu/drm/drm_edid.c
> +++ b/drivers/gpu/drm/drm_edid.c
> @@ -6544,7 +6544,7 @@ static void drm_parse_vesa_specific_block(struct 
> drm_connector *connector,
>       if (oui(vesa->oui[0], vesa->oui[1], vesa->oui[2]) != VESA_IEEE_OUI)
>               return;
>  
> -     if (sizeof(*vesa) != sizeof(*block) + block->num_bytes) {
> +     if (block->num_bytes < 5) {
>               drm_dbg_kms(connector->dev,
>                           "[CONNECTOR:%d:%s] Unexpected VESA vendor block 
> size\n",
>                           connector->base.id, connector->name);
> @@ -6567,24 +6567,20 @@ static void drm_parse_vesa_specific_block(struct 
> drm_connector *connector,
>               break;
>       }
>  
> -     if (!info->mso_stream_count) {
> -             info->mso_pixel_overlap = 0;
> -             return;
> -     }
> -
> -     info->mso_pixel_overlap = FIELD_GET(DISPLAYID_VESA_MSO_OVERLAP, 
> vesa->mso);
> -     if (info->mso_pixel_overlap > 8) {
> +     if (info->mso_stream_count) {
> +             info->mso_pixel_overlap = FIELD_GET(DISPLAYID_VESA_MSO_OVERLAP, 
> vesa->mso);
> +             if (info->mso_pixel_overlap > 8) {
> +                     drm_dbg_kms(connector->dev,
> +                                 "[CONNECTOR:%d:%s] Reserved MSO pixel 
> overlap value %u\n",
> +                                 connector->base.id, connector->name,
> +                                 info->mso_pixel_overlap);
> +                     info->mso_pixel_overlap = 8;
> +             }
>               drm_dbg_kms(connector->dev,
> -                         "[CONNECTOR:%d:%s] Reserved MSO pixel overlap value 
> %u\n",
> +                         "[CONNECTOR:%d:%s] MSO stream count %u, pixel 
> overlap %u\n",
>                           connector->base.id, connector->name,
> -                         info->mso_pixel_overlap);
> -             info->mso_pixel_overlap = 8;
> +                         info->mso_stream_count, info->mso_pixel_overlap);
>       }
> -
> -     drm_dbg_kms(connector->dev,
> -                 "[CONNECTOR:%d:%s] MSO stream count %u, pixel overlap %u\n",
> -                 connector->base.id, connector->name,
> -                 info->mso_stream_count, info->mso_pixel_overlap);
>  }
>  
>  static void drm_update_vesa_specific_block(struct drm_connector *connector,

-- 
Jani Nikula, Intel

Reply via email to