Re: [PATCH i-g-t v2 1/2] lib/igt_kms: Add platform-specific joiner exception mode handling
"Reddy Guddati, Santhosh" <[email protected]> Tue, 4 Aug 2026 11:30:34 +0530
| Newsgroups | org.freedesktop.lists.igt-dev |
|---|---|
| Message-ID | <[email protected]> |
Hi Sowmiya, On 28-07-2026 11:30, Sowmiya S wrote: > On NVL (display_ver=35), a higher max_dotclock causes modes like > 6144x3456@60 to pass the standard igt_bigjoiner_possible() checks, > yet the kernel still enables joiner for them. Introduce per-platform > exception mode lists (e.g. nvl_joiner_exception_modes[]) dispatched > via novalake check in a new mode_needs_joiner_exception() helper, and > wire it into igt_bigjoiner_possible(). > > v2: Replace with display version and add FIXME comments (Santhosh) Replace FIXME here with TODO.> > Signed-off-by: Sowmiya S <[email protected]> > --- > lib/igt_kms.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++- > 1 file changed, 60 insertions(+), 1 deletion(-) > > diff --git a/lib/igt_kms.c b/lib/igt_kms.c > index 5dd4b0c14..d591e696d 100644 > --- a/lib/igt_kms.c > +++ b/lib/igt_kms.c > @@ -7065,6 +7065,60 @@ int intel_get_max_pipe_hdisplay(int drm_fd) > HDISPLAY_5K_PER_PIPE; > } > > +struct joiner_mode_exception { > + uint16_t hdisplay, vdisplay; > + uint32_t clock; > +}; > + > +static bool match_joiner_exception(drmModeModeInfo *mode, > + const struct joiner_mode_exception *list, > + int count) > +{ > + for (int i = 0; i < count; i++) { > + if (mode->hdisplay == list[i].hdisplay && > + mode->vdisplay == list[i].vdisplay && > + mode->clock == list[i].clock) > + return true; > + } > + > + return false; > +} > + > +/* > + * TODO: IGT cannot compute the DSC bubble overhead the driver adds to the > + * effective pixel rate, since it cannot estimate the DSC parameters - > + * whether DSC is used and how many slices. On NVL this lets modes like > + * 6144x3456@60 pass igt_bigjoiner_possible()'s clock/hdisplay checks, > + * yet the kernel still enables bigjoiner for them. > + * > + * Add mode_needs_joiner_exception() as a stopgap. > + */ > +static const struct joiner_mode_exception nvl_joiner_exception_modes[] = { > + { 6144, 3456, 1413390 }, /* 6144x3456@60Hz */ > +}; > + > +/* > + * mode_needs_joiner_exception - check if a mode requires joiner via explicit exception > + * @drm_fd: drm file descriptor > + * @mode: libdrm mode > + * > + * On some platforms, a higher max_dotclock means certain modes won't trigger > + * the standard clock or hdisplay checks even though the kernel enables joiner > + * for them. Each platform has its own exception list. > + * > + * Returns: True if the mode is a known joiner exception, else False. > + */ > +static bool mode_needs_joiner_exception(int drm_fd, drmModeModeInfo *mode) > +{ > + unsigned int disp_ver = intel_display_ver(intel_get_drm_devid(drm_fd)); > + > + if (disp_ver == 35) /* NVL */ nit /* NVL * / can be removed as disp_ver is self explanatory. Rest LGTM. This can be changed during merge. Reviewed-by: Santhosh Reddy Guddati <[email protected]> > + return match_joiner_exception(mode, nvl_joiner_exception_modes, > + ARRAY_SIZE(nvl_joiner_exception_modes)); > + > + return false; > +} > + > /** > * igt_bigjoiner_possible: > * @drm_fd: drm file descriptor > @@ -7079,7 +7133,12 @@ int intel_get_max_pipe_hdisplay(int drm_fd) > */ > bool igt_bigjoiner_possible(int drm_fd, drmModeModeInfo *mode, int max_dotclock) > { > - return (mode->hdisplay > intel_get_max_pipe_hdisplay(drm_fd) || > + /** > + * FIXME: remove mode_needs_joiner_exception() once IGT can estimate > + * DSC parameters accurately > + */ > + return (mode_needs_joiner_exception(drm_fd, mode) || > + mode->hdisplay > intel_get_max_pipe_hdisplay(drm_fd) || > mode->clock > max_dotclock); > } >