Hi, On Fri, Nov 28, 2025 at 10:05:40PM +0100, Nicolas Frattaroli wrote: > The new DRM color format property allows userspace to request a specific > color format on a connector. In turn, this fills the connector state's > color_format member to switch color formats. > > Make drm_bridges consider the color_format set in the connector state > during the atomic bridge check. Specifically, reject any output bus > formats that do not correspond to the requested color format. > > Signed-off-by: Nicolas Frattaroli <[email protected]> > --- > drivers/gpu/drm/drm_bridge.c | 45 > ++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 45 insertions(+) > > diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c > index 8f355df883d8..8aac9747f35e 100644 > --- a/drivers/gpu/drm/drm_bridge.c > +++ b/drivers/gpu/drm/drm_bridge.c > @@ -1052,6 +1052,47 @@ static int select_bus_fmt_recursive(struct drm_bridge > *first_bridge, > return ret; > } > > +static bool __pure bus_format_is_color_fmt(u32 bus_fmt, enum > drm_color_format fmt) > +{ > + if (fmt == DRM_COLOR_FORMAT_AUTO) > + return true; > + > + switch (bus_fmt) { > + case MEDIA_BUS_FMT_FIXED: > + return true; > + case MEDIA_BUS_FMT_RGB888_1X24: > + case MEDIA_BUS_FMT_RGB101010_1X30: > + case MEDIA_BUS_FMT_RGB121212_1X36: > + case MEDIA_BUS_FMT_RGB161616_1X48: > + return fmt == DRM_COLOR_FORMAT_RGB444; > + case MEDIA_BUS_FMT_YUV8_1X24: > + case MEDIA_BUS_FMT_YUV10_1X30: > + case MEDIA_BUS_FMT_YUV12_1X36: > + case MEDIA_BUS_FMT_YUV16_1X48: > + return fmt == DRM_COLOR_FORMAT_YCBCR444; > + case MEDIA_BUS_FMT_UYVY8_1X16: > + case MEDIA_BUS_FMT_VYUY8_1X16: > + case MEDIA_BUS_FMT_YUYV8_1X16: > + case MEDIA_BUS_FMT_YVYU8_1X16: > + case MEDIA_BUS_FMT_UYVY10_1X20: > + case MEDIA_BUS_FMT_YUYV10_1X20: > + case MEDIA_BUS_FMT_VYUY10_1X20: > + case MEDIA_BUS_FMT_YVYU10_1X20: > + case MEDIA_BUS_FMT_UYVY12_1X24: > + case MEDIA_BUS_FMT_VYUY12_1X24: > + case MEDIA_BUS_FMT_YUYV12_1X24: > + case MEDIA_BUS_FMT_YVYU12_1X24: > + return fmt == DRM_COLOR_FORMAT_YCBCR422; > + case MEDIA_BUS_FMT_UYYVYY8_0_5X24: > + case MEDIA_BUS_FMT_UYYVYY10_0_5X30: > + case MEDIA_BUS_FMT_UYYVYY12_0_5X36: > + case MEDIA_BUS_FMT_UYYVYY16_0_5X48: > + return fmt == DRM_COLOR_FORMAT_YCBCR420; > + default: > + return false; > + } > +} > + > /* > * This function is called by &drm_atomic_bridge_chain_check() just before > * calling &drm_bridge_funcs.atomic_check() on all elements of the chain. > @@ -1137,6 +1178,10 @@ drm_atomic_bridge_chain_select_bus_fmts(struct > drm_bridge *bridge, > } > > for (i = 0; i < num_out_bus_fmts; i++) { > + if (!bus_format_is_color_fmt(out_bus_fmts[i], > conn_state->color_format)) { > + ret = -ENOTSUPP; > + continue; > + }
Sorry, I'm struggling a bit to understand how this would work if a bridge both supports the bus format selection and HDMI state helpers? Can you expand on it? Maxime
signature.asc
Description: PGP signature
