On Wed, 05 Jul 2023, Ville Syrjala <ville.syrjala@xxxxxxxxxxxxxxx> wrote: > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > Allow *_calc_dpll_params() to be called even if the N/P dividers > are zero without warning. We'll want to call these to make sure the > derived values are fully computed, but not all users (VLV DSI in > particular) don't even enable the DPLL and thus the dividers will > be left at zero. > > It could also be possible that the BIOS has misprogrammed the DPLL > (IIRC happened with some SNB machines with 4k+ displays) and thus > we'll currently generate a lot of dmesg spew. Better be silent and > just let the normal state checker/etc. deal with any driver bugs. > > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> Reviewed-by: Jani Nikula <jani.nikula@xxxxxxxxx> > --- > drivers/gpu/drm/i915/display/intel_dpll.c | 37 ++++++++++++----------- > 1 file changed, 20 insertions(+), 17 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_dpll.c b/drivers/gpu/drm/i915/display/intel_dpll.c > index 999badfe2906..71bfeea4cef2 100644 > --- a/drivers/gpu/drm/i915/display/intel_dpll.c > +++ b/drivers/gpu/drm/i915/display/intel_dpll.c > @@ -314,10 +314,11 @@ int pnv_calc_dpll_params(int refclk, struct dpll *clock) > { > clock->m = clock->m2 + 2; > clock->p = clock->p1 * clock->p2; > - if (WARN_ON(clock->n == 0 || clock->p == 0)) > - return 0; > - clock->vco = DIV_ROUND_CLOSEST(refclk * clock->m, clock->n); > - clock->dot = DIV_ROUND_CLOSEST(clock->vco, clock->p); > + > + clock->vco = clock->n == 0 ? 0 : > + DIV_ROUND_CLOSEST(refclk * clock->m, clock->n); > + clock->dot = clock->p == 0 ? 0 : > + DIV_ROUND_CLOSEST(clock->vco, clock->p); > > return clock->dot; > } > @@ -331,10 +332,11 @@ int i9xx_calc_dpll_params(int refclk, struct dpll *clock) > { > clock->m = i9xx_dpll_compute_m(clock); > clock->p = clock->p1 * clock->p2; > - if (WARN_ON(clock->n + 2 == 0 || clock->p == 0)) > - return 0; > - clock->vco = DIV_ROUND_CLOSEST(refclk * clock->m, clock->n + 2); > - clock->dot = DIV_ROUND_CLOSEST(clock->vco, clock->p); > + > + clock->vco = clock->n + 2 == 0 ? 0 : > + DIV_ROUND_CLOSEST(refclk * clock->m, clock->n + 2); > + clock->dot = clock->p == 0 ? 0 : > + DIV_ROUND_CLOSEST(clock->vco, clock->p); > > return clock->dot; > } > @@ -343,10 +345,11 @@ int vlv_calc_dpll_params(int refclk, struct dpll *clock) > { > clock->m = clock->m1 * clock->m2; > clock->p = clock->p1 * clock->p2 * 5; > - if (WARN_ON(clock->n == 0 || clock->p == 0)) > - return 0; > - clock->vco = DIV_ROUND_CLOSEST(refclk * clock->m, clock->n); > - clock->dot = DIV_ROUND_CLOSEST(clock->vco, clock->p); > + > + clock->vco = clock->n == 0 ? 0 : > + DIV_ROUND_CLOSEST(refclk * clock->m, clock->n); > + clock->dot = clock->p == 0 ? 0 : > + DIV_ROUND_CLOSEST(clock->vco, clock->p); > > return clock->dot; > } > @@ -355,11 +358,11 @@ int chv_calc_dpll_params(int refclk, struct dpll *clock) > { > clock->m = clock->m1 * clock->m2; > clock->p = clock->p1 * clock->p2 * 5; > - if (WARN_ON(clock->n == 0 || clock->p == 0)) > - return 0; > - clock->vco = DIV_ROUND_CLOSEST_ULL(mul_u32_u32(refclk, clock->m), > - clock->n << 22); > - clock->dot = DIV_ROUND_CLOSEST(clock->vco, clock->p); > + > + clock->vco = clock->n == 0 ? 0 : > + DIV_ROUND_CLOSEST_ULL(mul_u32_u32(refclk, clock->m), clock->n << 22); > + clock->dot = clock->p == 0 ? 0 : > + DIV_ROUND_CLOSEST(clock->vco, clock->p); > > return clock->dot; > } -- Jani Nikula, Intel Open Source Graphics Center