On Wed, 2026-07-01 at 14:20 +0200, AngeloGioacchino Del Regno wrote:
> From: Nancy Lin <[email protected]>
> 
> In upcoming SoCs, the OVL component will be divided into multiple
> smaller hardware units to enhance flexibility. To facilitate this
> transition, the OVL format definitions and format conversion API
> should be exported for reuse across these units.
> 
> Signed-off-by: Nancy Lin <[email protected]>
> Signed-off-by: Paul-pl Chen <[email protected]>
> Signed-off-by: AngeloGioacchino Del Regno 
> <[email protected]>
> ---

[snip]

>  
> -static unsigned int mtk_ovl_fmt_convert(struct mtk_disp_ovl *ovl,
> -                                     struct mtk_plane_state *state)
> +unsigned int mtk_ovl_fmt_convert(unsigned int fmt, unsigned int blend_mode,
> +                              bool fmt_rgb565_is_0, bool color_convert,
> +                              u8 clrfmt_shift, u32 clrfmt_man, u32 
> byte_swap, u32 rgb_swap)
>  {
> -     unsigned int fmt = state->pending.format;
> -     unsigned int blend_mode = DRM_MODE_BLEND_COVERAGE;
> -
> -     /*
> -      * For the platforms where OVL_CON_CLRFMT_MAN is defined in the 
> hardware data sheet
> -      * and supports premultiplied color formats, such as 
> OVL_CON_CLRFMT_PARGB8888.
> -      *
> -      * Check blend_modes in the driver data to see if premultiplied mode is 
> supported.
> -      * If not, use coverage mode instead to set it to the supported color 
> formats.
> -      *
> -      * Current DRM assumption is that alpha is default premultiplied, so 
> the bitmask of
> -      * blend_modes must include BIT(DRM_MODE_BLEND_PREMULTI). Otherwise, 
> mtk_plane_init()
> -      * will get an error return from drm_plane_create_blend_mode_property() 
> and
> -      * state->base.pixel_blend_mode should not be used.
> -      */
> -     if (ovl->data->blend_modes & BIT(DRM_MODE_BLEND_PREMULTI))
> -             blend_mode = state->base.pixel_blend_mode;
> +     unsigned int con = 0;
> +     bool need_byte_swap = false, need_rgb_swap = false;
>  
>       switch (fmt) {
>       default:
>       case DRM_FORMAT_RGB565:
> -             return OVL_CON_CLRFMT_RGB565(ovl);
> +             con = fmt_rgb565_is_0 ?
> +                     OVL_CON_CLRFMT_RGB565(clrfmt_shift) : 
> OVL_CON_CLRFMT_RGB888(clrfmt_shift);
> +     break;

One more indent.

>       case DRM_FORMAT_BGR565:
> -             return OVL_CON_CLRFMT_RGB565(ovl) | OVL_CON_BYTE_SWAP;
> +             con = fmt_rgb565_is_0 ?
> +                     OVL_CON_CLRFMT_RGB565(clrfmt_shift) : 
> OVL_CON_CLRFMT_RGB888(clrfmt_shift);
> +             need_byte_swap = true;  /* RGB565 -> BGR565 */
> +     break;
>       case DRM_FORMAT_RGB888:
> -             return OVL_CON_CLRFMT_RGB888(ovl);
> +             con = fmt_rgb565_is_0 ?
> +                     OVL_CON_CLRFMT_RGB888(clrfmt_shift) : 
> OVL_CON_CLRFMT_RGB565(clrfmt_shift);
> +     break;
>       case DRM_FORMAT_BGR888:
> -             return OVL_CON_CLRFMT_RGB888(ovl) | OVL_CON_BYTE_SWAP;
> +             con = fmt_rgb565_is_0 ?
> +                     OVL_CON_CLRFMT_RGB888(clrfmt_shift) : 
> OVL_CON_CLRFMT_RGB565(clrfmt_shift);
> +             need_byte_swap = true;  /* RGB888 -> BGR888 */
> +     break;
>       case DRM_FORMAT_RGBX8888:
>       case DRM_FORMAT_RGBA8888:
>       case DRM_FORMAT_RGBX1010102:
>       case DRM_FORMAT_RGBA1010102:
> -             return blend_mode == DRM_MODE_BLEND_COVERAGE ?
> -                    OVL_CON_CLRFMT_RGBA8888 :
> -                    OVL_CON_CLRFMT_PRGBA8888;
> +             if (blend_mode == DRM_MODE_BLEND_COVERAGE) {
> +                     con = OVL_CON_CLRFMT_RGBA8888(clrfmt_shift);
> +             } else {
> +                     con = OVL_CON_CLRFMT_PARGB8888(clrfmt_shift, 
> clrfmt_man);
> +                     need_byte_swap = true;  /* PARGB8888 -> PBGRA8888 */
> +                     need_rgb_swap = true;   /* PBGRA8888 -> PRGBA8888 */
> +             }
> +     break;
>       case DRM_FORMAT_BGRX8888:
>       case DRM_FORMAT_BGRA8888:
>       case DRM_FORMAT_BGRX1010102:
>       case DRM_FORMAT_BGRA1010102:
> -             return blend_mode == DRM_MODE_BLEND_COVERAGE ?
> -                    OVL_CON_CLRFMT_BGRA8888 :
> -                    OVL_CON_CLRFMT_PBGRA8888;
> +             if (blend_mode == DRM_MODE_BLEND_COVERAGE) {
> +                     con = OVL_CON_CLRFMT_RGBA8888(clrfmt_shift);
> +                     need_byte_swap = true;  /* RGB8888 -> BGR8888 */

/* RGBA8888 -> BGRA8888 */

Regards,
CK

> +             } else {
> +                     con = OVL_CON_CLRFMT_PARGB8888(clrfmt_shift, 
> clrfmt_man);
> +                     need_byte_swap = true;  /* PARGB8888 -> PBGRA8888 */
> +             }
> +     break;
>       case DRM_FORMAT_XRGB8888:
>       case DRM_FORMAT_ARGB8888:
>       case DRM_FORMAT_XRGB2101010:
>       case DRM_FORMAT_ARGB2101010:
> -             return blend_mode == DRM_MODE_BLEND_COVERAGE ?
> -                    OVL_CON_CLRFMT_ARGB8888 :
> -                    OVL_CON_CLRFMT_PARGB8888;
> +             if (blend_mode == DRM_MODE_BLEND_COVERAGE)
> +                     con = OVL_CON_CLRFMT_ARGB8888(clrfmt_shift);
> +             else
> +                     con = OVL_CON_CLRFMT_PARGB8888(clrfmt_shift, 
> clrfmt_man);
> +     break;
>       case DRM_FORMAT_XBGR8888:
>       case DRM_FORMAT_ABGR8888:
>       case DRM_FORMAT_XBGR2101010:
>       case DRM_FORMAT_ABGR2101010:
> -             return blend_mode == DRM_MODE_BLEND_COVERAGE ?
> -                    OVL_CON_CLRFMT_ABGR8888 :
> -                    OVL_CON_CLRFMT_PABGR8888;
> +             if (blend_mode == DRM_MODE_BLEND_COVERAGE) {
> +                     con = OVL_CON_CLRFMT_ARGB8888(clrfmt_shift);
> +                     need_rgb_swap = true;   /* ARGB8888 -> ABGR8888 */
> +             } else {
> +                     con = OVL_CON_CLRFMT_PARGB8888(clrfmt_shift, 
> clrfmt_man);
> +                     need_rgb_swap = true;   /* PARGB8888 -> PABGR8888 */
> +             }
> +     break;
>       case DRM_FORMAT_UYVY:
> -             return OVL_CON_CLRFMT_UYVY | OVL_CON_MTX_YUV_TO_RGB;
> +             con = OVL_CON_CLRFMT_UYVY(clrfmt_shift);
> +             if (color_convert)
> +                     con |= OVL_CON_MTX_YUV_TO_RGB;
> +     break;
>       case DRM_FORMAT_YUYV:
> -             return OVL_CON_CLRFMT_YUYV | OVL_CON_MTX_YUV_TO_RGB;
> +             con = OVL_CON_CLRFMT_YUYV(clrfmt_shift);
> +             if (color_convert)
> +                     con |= OVL_CON_MTX_YUV_TO_RGB;
> +     break;
>       }
> +
> +     if (need_byte_swap)
> +             con |= byte_swap;
> +
> +     if (need_rgb_swap)
> +             con |= rgb_swap;
> +
> +     return con;
>  }
>  

Reply via email to