On Tue, 27 Sep 2022, Ville Syrjala <ville.syrjala@xxxxxxxxxxxxxxx> wrote: > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > Make sure modes with crazy big dotclocks are rejected early, > so as to not cause problems for subsequent code via integer > overflows and whatnot. > > These would eventually be rejected in intel_crtc_compute_pipe_mode() > but that is now too late as we do the clock computations a bit > earlier than that. And we don't want to just reorder the two since > we still want to check the final computed dotclock against the > hardware limit to make sure we didn't end up above the limit due > to rounding/etc. > > Fixes: 0ff0e219d9b8 ("drm/i915: Compute clocks earlier") > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> Too bad we can't really simplify and remove the check from connector mode valid hooks. Or we could but it gets tricky with the bigjoiner 2x stuff. Reviewed-by: Jani Nikula <jani.nikula@xxxxxxxxx> > --- > drivers/gpu/drm/i915/display/intel_display.c | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) > > diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c > index eb8eaeb19881..04e8fa953bc7 100644 > --- a/drivers/gpu/drm/i915/display/intel_display.c > +++ b/drivers/gpu/drm/i915/display/intel_display.c > @@ -8130,6 +8130,17 @@ static void intel_setup_outputs(struct drm_i915_private *dev_priv) > drm_helper_move_panel_connectors_to_head(&dev_priv->drm); > } > > +static int max_dotclock(struct drm_i915_private *i915) > +{ > + int max_dotclock = i915->max_dotclk_freq; > + > + /* icl+ might use bigjoiner */ > + if (DISPLAY_VER(i915) >= 11) > + max_dotclock *= 2; > + > + return max_dotclock; > +} > + > static enum drm_mode_status > intel_mode_valid(struct drm_device *dev, > const struct drm_display_mode *mode) > @@ -8167,6 +8178,13 @@ intel_mode_valid(struct drm_device *dev, > DRM_MODE_FLAG_CLKDIV2)) > return MODE_BAD; > > + /* > + * Reject clearly excessive dotclocks early to > + * avoid having to worry about huge integers later. > + */ > + if (mode->clock > max_dotclock(dev_priv)) > + return MODE_CLOCK_HIGH; > + > /* Transcoder timing limits */ > if (DISPLAY_VER(dev_priv) >= 11) { > hdisplay_max = 16384; -- Jani Nikula, Intel Open Source Graphics Center