Commit ddc9003c authored by Zhao Yakui's avatar Zhao Yakui Committed by Eric Anholt

drm/i915: Use find_pll function to calculate DPLL setting for LVDS downclock

For any given clock we can use the find_pll to get the corresponding DPLL
setting. It is unnecessary to use the find_reduce_pll callback function
to calculate the DPLL parameter for LVDS downclock in order to get the same
divider factor(P) for the normal and downclock.

In theory when the LVDS downclock is supported by LVDS panel, we should get the
same DPLL divider factor(P) for the normal clock and reduced downclock.
If we get the diferent divider factor(P) for normal clock and reduced downclock,
it means that the found downclock is incorrect and should be discarded.

So we should use find_pll callback to calculate the DPLL parameter for the
LVDS reduced downclock as for the normal clock. Then we can do the cleanup
about find_reduced_pll.
Signed-off-by: default avatarZhao Yakui <yakui.zhao@intel.com>
cc: Jesse Barnes <jbarnes@virtuousgeek.org>
cc: Matthew Garrett <mjg@redhat.com>
Signed-off-by: default avatarEric Anholt <eric@anholt.net>
parent 40f33a92
...@@ -70,8 +70,6 @@ struct intel_limit { ...@@ -70,8 +70,6 @@ struct intel_limit {
intel_p2_t p2; intel_p2_t p2;
bool (* find_pll)(const intel_limit_t *, struct drm_crtc *, bool (* find_pll)(const intel_limit_t *, struct drm_crtc *,
int, int, intel_clock_t *); int, int, intel_clock_t *);
bool (* find_reduced_pll)(const intel_limit_t *, struct drm_crtc *,
int, int, intel_clock_t *);
}; };
#define I8XX_DOT_MIN 25000 #define I8XX_DOT_MIN 25000
...@@ -274,9 +272,6 @@ static bool ...@@ -274,9 +272,6 @@ static bool
intel_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, intel_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc,
int target, int refclk, intel_clock_t *best_clock); int target, int refclk, intel_clock_t *best_clock);
static bool static bool
intel_find_best_reduced_PLL(const intel_limit_t *limit, struct drm_crtc *crtc,
int target, int refclk, intel_clock_t *best_clock);
static bool
intel_g4x_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, intel_g4x_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc,
int target, int refclk, intel_clock_t *best_clock); int target, int refclk, intel_clock_t *best_clock);
...@@ -299,7 +294,6 @@ static const intel_limit_t intel_limits_i8xx_dvo = { ...@@ -299,7 +294,6 @@ static const intel_limit_t intel_limits_i8xx_dvo = {
.p2 = { .dot_limit = I8XX_P2_SLOW_LIMIT, .p2 = { .dot_limit = I8XX_P2_SLOW_LIMIT,
.p2_slow = I8XX_P2_SLOW, .p2_fast = I8XX_P2_FAST }, .p2_slow = I8XX_P2_SLOW, .p2_fast = I8XX_P2_FAST },
.find_pll = intel_find_best_PLL, .find_pll = intel_find_best_PLL,
.find_reduced_pll = intel_find_best_reduced_PLL,
}; };
static const intel_limit_t intel_limits_i8xx_lvds = { static const intel_limit_t intel_limits_i8xx_lvds = {
...@@ -314,7 +308,6 @@ static const intel_limit_t intel_limits_i8xx_lvds = { ...@@ -314,7 +308,6 @@ static const intel_limit_t intel_limits_i8xx_lvds = {
.p2 = { .dot_limit = I8XX_P2_SLOW_LIMIT, .p2 = { .dot_limit = I8XX_P2_SLOW_LIMIT,
.p2_slow = I8XX_P2_LVDS_SLOW, .p2_fast = I8XX_P2_LVDS_FAST }, .p2_slow = I8XX_P2_LVDS_SLOW, .p2_fast = I8XX_P2_LVDS_FAST },
.find_pll = intel_find_best_PLL, .find_pll = intel_find_best_PLL,
.find_reduced_pll = intel_find_best_reduced_PLL,
}; };
static const intel_limit_t intel_limits_i9xx_sdvo = { static const intel_limit_t intel_limits_i9xx_sdvo = {
...@@ -329,7 +322,6 @@ static const intel_limit_t intel_limits_i9xx_sdvo = { ...@@ -329,7 +322,6 @@ static const intel_limit_t intel_limits_i9xx_sdvo = {
.p2 = { .dot_limit = I9XX_P2_SDVO_DAC_SLOW_LIMIT, .p2 = { .dot_limit = I9XX_P2_SDVO_DAC_SLOW_LIMIT,
.p2_slow = I9XX_P2_SDVO_DAC_SLOW, .p2_fast = I9XX_P2_SDVO_DAC_FAST }, .p2_slow = I9XX_P2_SDVO_DAC_SLOW, .p2_fast = I9XX_P2_SDVO_DAC_FAST },
.find_pll = intel_find_best_PLL, .find_pll = intel_find_best_PLL,
.find_reduced_pll = intel_find_best_reduced_PLL,
}; };
static const intel_limit_t intel_limits_i9xx_lvds = { static const intel_limit_t intel_limits_i9xx_lvds = {
...@@ -347,7 +339,6 @@ static const intel_limit_t intel_limits_i9xx_lvds = { ...@@ -347,7 +339,6 @@ static const intel_limit_t intel_limits_i9xx_lvds = {
.p2 = { .dot_limit = I9XX_P2_LVDS_SLOW_LIMIT, .p2 = { .dot_limit = I9XX_P2_LVDS_SLOW_LIMIT,
.p2_slow = I9XX_P2_LVDS_SLOW, .p2_fast = I9XX_P2_LVDS_FAST }, .p2_slow = I9XX_P2_LVDS_SLOW, .p2_fast = I9XX_P2_LVDS_FAST },
.find_pll = intel_find_best_PLL, .find_pll = intel_find_best_PLL,
.find_reduced_pll = intel_find_best_reduced_PLL,
}; };
/* below parameter and function is for G4X Chipset Family*/ /* below parameter and function is for G4X Chipset Family*/
...@@ -365,7 +356,6 @@ static const intel_limit_t intel_limits_g4x_sdvo = { ...@@ -365,7 +356,6 @@ static const intel_limit_t intel_limits_g4x_sdvo = {
.p2_fast = G4X_P2_SDVO_FAST .p2_fast = G4X_P2_SDVO_FAST
}, },
.find_pll = intel_g4x_find_best_PLL, .find_pll = intel_g4x_find_best_PLL,
.find_reduced_pll = intel_g4x_find_best_PLL,
}; };
static const intel_limit_t intel_limits_g4x_hdmi = { static const intel_limit_t intel_limits_g4x_hdmi = {
...@@ -382,7 +372,6 @@ static const intel_limit_t intel_limits_g4x_hdmi = { ...@@ -382,7 +372,6 @@ static const intel_limit_t intel_limits_g4x_hdmi = {
.p2_fast = G4X_P2_HDMI_DAC_FAST .p2_fast = G4X_P2_HDMI_DAC_FAST
}, },
.find_pll = intel_g4x_find_best_PLL, .find_pll = intel_g4x_find_best_PLL,
.find_reduced_pll = intel_g4x_find_best_PLL,
}; };
static const intel_limit_t intel_limits_g4x_single_channel_lvds = { static const intel_limit_t intel_limits_g4x_single_channel_lvds = {
...@@ -407,7 +396,6 @@ static const intel_limit_t intel_limits_g4x_single_channel_lvds = { ...@@ -407,7 +396,6 @@ static const intel_limit_t intel_limits_g4x_single_channel_lvds = {
.p2_fast = G4X_P2_SINGLE_CHANNEL_LVDS_FAST .p2_fast = G4X_P2_SINGLE_CHANNEL_LVDS_FAST
}, },
.find_pll = intel_g4x_find_best_PLL, .find_pll = intel_g4x_find_best_PLL,
.find_reduced_pll = intel_g4x_find_best_PLL,
}; };
static const intel_limit_t intel_limits_g4x_dual_channel_lvds = { static const intel_limit_t intel_limits_g4x_dual_channel_lvds = {
...@@ -432,7 +420,6 @@ static const intel_limit_t intel_limits_g4x_dual_channel_lvds = { ...@@ -432,7 +420,6 @@ static const intel_limit_t intel_limits_g4x_dual_channel_lvds = {
.p2_fast = G4X_P2_DUAL_CHANNEL_LVDS_FAST .p2_fast = G4X_P2_DUAL_CHANNEL_LVDS_FAST
}, },
.find_pll = intel_g4x_find_best_PLL, .find_pll = intel_g4x_find_best_PLL,
.find_reduced_pll = intel_g4x_find_best_PLL,
}; };
static const intel_limit_t intel_limits_g4x_display_port = { static const intel_limit_t intel_limits_g4x_display_port = {
...@@ -470,7 +457,6 @@ static const intel_limit_t intel_limits_pineview_sdvo = { ...@@ -470,7 +457,6 @@ static const intel_limit_t intel_limits_pineview_sdvo = {
.p2 = { .dot_limit = I9XX_P2_SDVO_DAC_SLOW_LIMIT, .p2 = { .dot_limit = I9XX_P2_SDVO_DAC_SLOW_LIMIT,
.p2_slow = I9XX_P2_SDVO_DAC_SLOW, .p2_fast = I9XX_P2_SDVO_DAC_FAST }, .p2_slow = I9XX_P2_SDVO_DAC_SLOW, .p2_fast = I9XX_P2_SDVO_DAC_FAST },
.find_pll = intel_find_best_PLL, .find_pll = intel_find_best_PLL,
.find_reduced_pll = intel_find_best_reduced_PLL,
}; };
static const intel_limit_t intel_limits_pineview_lvds = { static const intel_limit_t intel_limits_pineview_lvds = {
...@@ -486,7 +472,6 @@ static const intel_limit_t intel_limits_pineview_lvds = { ...@@ -486,7 +472,6 @@ static const intel_limit_t intel_limits_pineview_lvds = {
.p2 = { .dot_limit = I9XX_P2_LVDS_SLOW_LIMIT, .p2 = { .dot_limit = I9XX_P2_LVDS_SLOW_LIMIT,
.p2_slow = I9XX_P2_LVDS_SLOW, .p2_fast = I9XX_P2_LVDS_SLOW }, .p2_slow = I9XX_P2_LVDS_SLOW, .p2_fast = I9XX_P2_LVDS_SLOW },
.find_pll = intel_find_best_PLL, .find_pll = intel_find_best_PLL,
.find_reduced_pll = intel_find_best_reduced_PLL,
}; };
static const intel_limit_t intel_limits_ironlake_sdvo = { static const intel_limit_t intel_limits_ironlake_sdvo = {
...@@ -768,46 +753,6 @@ intel_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, ...@@ -768,46 +753,6 @@ intel_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc,
return (err != target); return (err != target);
} }
static bool
intel_find_best_reduced_PLL(const intel_limit_t *limit, struct drm_crtc *crtc,
int target, int refclk, intel_clock_t *best_clock)
{
struct drm_device *dev = crtc->dev;
intel_clock_t clock;
int err = target;
bool found = false;
memcpy(&clock, best_clock, sizeof(intel_clock_t));
for (clock.m1 = limit->m1.min; clock.m1 <= limit->m1.max; clock.m1++) {
for (clock.m2 = limit->m2.min; clock.m2 <= limit->m2.max; clock.m2++) {
/* m1 is always 0 in Pineview */
if (clock.m2 >= clock.m1 && !IS_PINEVIEW(dev))
break;
for (clock.n = limit->n.min; clock.n <= limit->n.max;
clock.n++) {
int this_err;
intel_clock(dev, refclk, &clock);
if (!intel_PLL_is_valid(crtc, &clock))
continue;
this_err = abs(clock.dot - target);
if (this_err < err) {
*best_clock = clock;
err = this_err;
found = true;
}
}
}
}
return found;
}
static bool static bool
intel_g4x_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc, intel_g4x_find_best_PLL(const intel_limit_t *limit, struct drm_crtc *crtc,
int target, int refclk, intel_clock_t *best_clock) int target, int refclk, intel_clock_t *best_clock)
...@@ -2910,10 +2855,8 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc, ...@@ -2910,10 +2855,8 @@ static int intel_crtc_mode_set(struct drm_crtc *crtc,
return -EINVAL; return -EINVAL;
} }
if (is_lvds && limit->find_reduced_pll && if (is_lvds && dev_priv->lvds_downclock_avail) {
dev_priv->lvds_downclock_avail) { has_reduced_clock = limit->find_pll(limit, crtc,
memcpy(&reduced_clock, &clock, sizeof(intel_clock_t));
has_reduced_clock = limit->find_reduced_pll(limit, crtc,
dev_priv->lvds_downclock, dev_priv->lvds_downclock,
refclk, refclk,
&reduced_clock); &reduced_clock);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment