On Thu, Nov 06, 2025 at 02:52:09PM +0000, Peter Maydell wrote: > If the guest writes an invalid or unsupported value to the > AV_BUF_FORMAT register, currently we abort(). Instead, log this as > either a guest error or an unimplemented error and continue. > > The existing code treats DP_NL_VID_CB_Y0_CR_Y1 as x8b8g8r8 > via a "case 0" that does not use the enum constant name for some > reason; we leave that alone beyond adding a comment about the > weird code. > > Documentation of this register seems to be at: > https://docs.amd.com/r/en-US/ug1087-zynq-ultrascale-registers/AV_BUF_FORMAT-DISPLAY_PORT-Register > > Cc: [email protected] > Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1415 > Signed-off-by: Peter Maydell <[email protected]>
Reviewed-by: Edgar E. Iglesias <[email protected]> > --- > hw/display/xlnx_dp.c | 53 +++++++++++++++++++++++++++++++++++++++----- > 1 file changed, 48 insertions(+), 5 deletions(-) > > diff --git a/hw/display/xlnx_dp.c b/hw/display/xlnx_dp.c > index c2bf692e7b1..d8119a56292 100644 > --- a/hw/display/xlnx_dp.c > +++ b/hw/display/xlnx_dp.c > @@ -665,14 +665,28 @@ static void xlnx_dp_change_graphic_fmt(XlnxDPState *s) > case DP_GRAPHIC_BGR888: > s->g_plane.format = PIXMAN_b8g8r8; > break; > + case DP_GRAPHIC_RGBA5551: > + case DP_GRAPHIC_RGBA4444: > + case DP_GRAPHIC_8BPP: > + case DP_GRAPHIC_4BPP: > + case DP_GRAPHIC_2BPP: > + case DP_GRAPHIC_1BPP: > + qemu_log_mask(LOG_UNIMP, "%s: unimplemented graphic format %u", > + __func__, > + s->avbufm_registers[AV_BUF_FORMAT] & DP_GRAPHIC_MASK); > + s->g_plane.format = PIXMAN_r8g8b8a8; > + break; > default: > - error_report("%s: unsupported graphic format %u", __func__, > - s->avbufm_registers[AV_BUF_FORMAT] & DP_GRAPHIC_MASK); > + qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid graphic format %u", > + __func__, > + s->avbufm_registers[AV_BUF_FORMAT] & DP_GRAPHIC_MASK); > + s->g_plane.format = PIXMAN_r8g8b8a8; > abort(); > } > > switch (s->avbufm_registers[AV_BUF_FORMAT] & DP_NL_VID_FMT_MASK) { > case 0: > + /* This is DP_NL_VID_CB_Y0_CR_Y1 ??? */ > s->v_plane.format = PIXMAN_x8b8g8r8; > break; > case DP_NL_VID_Y0_CB_Y1_CR: > @@ -681,10 +695,39 @@ static void xlnx_dp_change_graphic_fmt(XlnxDPState *s) > case DP_NL_VID_RGBA8880: > s->v_plane.format = PIXMAN_x8b8g8r8; > break; > + case DP_NL_VID_CR_Y0_CB_Y1: > + case DP_NL_VID_Y0_CR_Y1_CB: > + case DP_NL_VID_YV16: > + case DP_NL_VID_YV24: > + case DP_NL_VID_YV16CL: > + case DP_NL_VID_MONO: > + case DP_NL_VID_YV16CL2: > + case DP_NL_VID_YUV444: > + case DP_NL_VID_RGB888: > + case DP_NL_VID_RGB888_10BPC: > + case DP_NL_VID_YUV444_10BPC: > + case DP_NL_VID_YV16CL2_10BPC: > + case DP_NL_VID_YV16CL_10BPC: > + case DP_NL_VID_YV16_10BPC: > + case DP_NL_VID_YV24_10BPC: > + case DP_NL_VID_Y_ONLY_10BPC: > + case DP_NL_VID_YV16_420: > + case DP_NL_VID_YV16CL_420: > + case DP_NL_VID_YV16CL2_420: > + case DP_NL_VID_YV16_420_10BPC: > + case DP_NL_VID_YV16CL_420_10BPC: > + case DP_NL_VID_YV16CL2_420_10BPC: > + qemu_log_mask(LOG_UNIMP, "%s: unimplemented video format %u", > + __func__, > + s->avbufm_registers[AV_BUF_FORMAT] & > DP_NL_VID_FMT_MASK); > + s->v_plane.format = PIXMAN_x8b8g8r8; > + break; > default: > - error_report("%s: unsupported video format %u", __func__, > - s->avbufm_registers[AV_BUF_FORMAT] & > DP_NL_VID_FMT_MASK); > - abort(); > + qemu_log_mask(LOG_UNIMP, "%s: invalid video format %u", > + __func__, > + s->avbufm_registers[AV_BUF_FORMAT] & > DP_NL_VID_FMT_MASK); > + s->v_plane.format = PIXMAN_x8b8g8r8; > + break; > } > > xlnx_dp_recreate_surface(s); > -- > 2.43.0 >
