| From 013d73bf75e2649d209a31e5ef9eacd3758274d4 Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com> |
| Date: Fri, 27 Sep 2013 16:55:49 +0300 |
| Subject: drm/i915: Use intel_PLL_is_valid() in vlv_find_best_dpll() |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| Everyone else uses intel_PLL_is_valid(), so make VLV use it as well. |
| |
| We don't have any special p and m limits on VLV, so skip those tests, |
| and we also need to skip the m1<=m2 test line PNV. |
| |
| Reorganize the function a bit to move the n check alongside the rest of |
| the test for the non-derived dividers, and check the derived values |
| afterwards. |
| |
| Note that this changes vlv_find_best_dpll() in two ways: |
| - The .vco comparison is now >max instead of >=max, and since we round |
| down when calculating that stuff, we may now allow frequencies slightly |
| above the max as we do on other platforms. The previous method |
| disallowed exactly max and anything above it. |
| - We now check the .dot frequency against the data rate limits, which we |
| didn't do before. |
| |
| Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> |
| Reviewed-by: Mika Kuoppala <mika.kuoppala@intel.com> |
| Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> |
| (cherry picked from commit f01b796283e0fb2aa70b7cceb7067340f8ec6626) |
| Signed-off-by: Darren Hart <dvhart@linux.intel.com> |
| --- |
| drivers/gpu/drm/i915/intel_display.c | 35 ++++++++++++++++++++++++----------- |
| 1 file changed, 24 insertions(+), 11 deletions(-) |
| |
| diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c |
| index bda31bf68a8f..1610f9668866 100644 |
| --- a/drivers/gpu/drm/i915/intel_display.c |
| +++ b/drivers/gpu/drm/i915/intel_display.c |
| @@ -310,7 +310,13 @@ static const intel_limit_t intel_limits_ironlake_dual_lvds_100m = { |
| }; |
| |
| static const intel_limit_t intel_limits_vlv = { |
| - .dot = { .min = 25000, .max = 270000 }, |
| + /* |
| + * These are the data rate limits (measured in fast clocks) |
| + * since those are the strictest limits we have. The fast |
| + * clock and actual rate limits are more relaxed, so checking |
| + * them would make no difference. |
| + */ |
| + .dot = { .min = 25000 * 5, .max = 270000 * 5 }, |
| .vco = { .min = 4000000, .max = 6000000 }, |
| .n = { .min = 1, .max = 7 }, |
| .m1 = { .min = 2, .max = 3 }, |
| @@ -451,20 +457,26 @@ static bool intel_PLL_is_valid(struct drm_device *dev, |
| const intel_limit_t *limit, |
| const intel_clock_t *clock) |
| { |
| + if (clock->n < limit->n.min || limit->n.max < clock->n) |
| + INTELPllInvalid("n out of range\n"); |
| if (clock->p1 < limit->p1.min || limit->p1.max < clock->p1) |
| INTELPllInvalid("p1 out of range\n"); |
| - if (clock->p < limit->p.min || limit->p.max < clock->p) |
| - INTELPllInvalid("p out of range\n"); |
| if (clock->m2 < limit->m2.min || limit->m2.max < clock->m2) |
| INTELPllInvalid("m2 out of range\n"); |
| if (clock->m1 < limit->m1.min || limit->m1.max < clock->m1) |
| INTELPllInvalid("m1 out of range\n"); |
| - if (clock->m1 <= clock->m2 && !IS_PINEVIEW(dev)) |
| - INTELPllInvalid("m1 <= m2\n"); |
| - if (clock->m < limit->m.min || limit->m.max < clock->m) |
| - INTELPllInvalid("m out of range\n"); |
| - if (clock->n < limit->n.min || limit->n.max < clock->n) |
| - INTELPllInvalid("n out of range\n"); |
| + |
| + if (!IS_PINEVIEW(dev) && !IS_VALLEYVIEW(dev)) |
| + if (clock->m1 <= clock->m2) |
| + INTELPllInvalid("m1 <= m2\n"); |
| + |
| + if (!IS_VALLEYVIEW(dev)) { |
| + if (clock->p < limit->p.min || limit->p.max < clock->p) |
| + INTELPllInvalid("p out of range\n"); |
| + if (clock->m < limit->m.min || limit->m.max < clock->m) |
| + INTELPllInvalid("m out of range\n"); |
| + } |
| + |
| if (clock->vco < limit->vco.min || limit->vco.max < clock->vco) |
| INTELPllInvalid("vco out of range\n"); |
| /* XXX: We may need to be checking "Dot clock" depending on the multiplier, |
| @@ -658,6 +670,7 @@ vlv_find_best_dpll(const intel_limit_t *limit, struct drm_crtc *crtc, |
| int target, int refclk, intel_clock_t *match_clock, |
| intel_clock_t *best_clock) |
| { |
| + struct drm_device *dev = crtc->dev; |
| intel_clock_t clock; |
| unsigned int bestppm = 1000000; |
| /* min update 19.2 MHz */ |
| @@ -683,8 +696,8 @@ vlv_find_best_dpll(const intel_limit_t *limit, struct drm_crtc *crtc, |
| |
| vlv_clock(refclk, &clock); |
| |
| - if (clock.vco < limit->vco.min || |
| - clock.vco >= limit->vco.max) |
| + if (!intel_PLL_is_valid(dev, limit, |
| + &clock)) |
| continue; |
| |
| diff = abs(clock.dot - target); |
| -- |
| 1.8.5.rc3 |
| |