aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2014-06-25 15:02:03 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-07-10 16:13:31 -0400
commitdf8ad70ca34f9bdf7e070d1a430bbdcac6acee12 (patch)
tree6297999ad809760fdde59de8f77362763a1f008d
parent716c2e55100ff5588bd2bbca14951ef11624cba2 (diff)
drm/i915: Only touch WRPLL hw state in enable/disable hooks
To be able to do this we need to separately keep track of how many crtcs need a given WRPLL and how many actually actively use it. The common shared dpll framework already has all this, including massive state readout and cross checking. Which allows us to do this switch in a fairly small patch. Reviewed-by: Damien Lespiau <damien.lespiau@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c12
-rw-r--r--drivers/gpu/drm/i915/intel_display.c15
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h2
3 files changed, 8 insertions, 21 deletions
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 60e67a11791b..b2267249c1c0 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -386,16 +386,6 @@ intel_ddi_get_crtc_encoder(struct drm_crtc *crtc)
386 return ret; 386 return ret;
387} 387}
388 388
389void intel_ddi_put_crtc_pll(struct drm_crtc *crtc)
390{
391 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
392
393 if (intel_crtc_to_shared_dpll(intel_crtc))
394 intel_disable_shared_dpll(intel_crtc);
395
396 intel_put_shared_dpll(intel_crtc);
397}
398
399#define LC_FREQ 2700 389#define LC_FREQ 2700
400#define LC_FREQ_2K (LC_FREQ * 2000) 390#define LC_FREQ_2K (LC_FREQ * 2000)
401 391
@@ -716,7 +706,7 @@ bool intel_ddi_pll_select(struct intel_crtc *intel_crtc)
716 int type = intel_encoder->type; 706 int type = intel_encoder->type;
717 int clock = intel_crtc->config.port_clock; 707 int clock = intel_crtc->config.port_clock;
718 708
719 intel_ddi_put_crtc_pll(crtc); 709 intel_put_shared_dpll(intel_crtc);
720 710
721 if (type == INTEL_OUTPUT_HDMI) { 711 if (type == INTEL_OUTPUT_HDMI) {
722 struct intel_shared_dpll *pll; 712 struct intel_shared_dpll *pll;
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index a3305a074650..6362524cd8d1 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -4080,6 +4080,9 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
4080 if (intel_crtc->active) 4080 if (intel_crtc->active)
4081 return; 4081 return;
4082 4082
4083 if (intel_crtc_to_shared_dpll(intel_crtc))
4084 intel_enable_shared_dpll(intel_crtc);
4085
4083 if (intel_crtc->config.has_dp_encoder) 4086 if (intel_crtc->config.has_dp_encoder)
4084 intel_dp_set_m_n(intel_crtc); 4087 intel_dp_set_m_n(intel_crtc);
4085 4088
@@ -4266,6 +4269,9 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
4266 mutex_lock(&dev->struct_mutex); 4269 mutex_lock(&dev->struct_mutex);
4267 intel_update_fbc(dev); 4270 intel_update_fbc(dev);
4268 mutex_unlock(&dev->struct_mutex); 4271 mutex_unlock(&dev->struct_mutex);
4272
4273 if (intel_crtc_to_shared_dpll(intel_crtc))
4274 intel_disable_shared_dpll(intel_crtc);
4269} 4275}
4270 4276
4271static void ironlake_crtc_off(struct drm_crtc *crtc) 4277static void ironlake_crtc_off(struct drm_crtc *crtc)
@@ -4274,10 +4280,6 @@ static void ironlake_crtc_off(struct drm_crtc *crtc)
4274 intel_put_shared_dpll(intel_crtc); 4280 intel_put_shared_dpll(intel_crtc);
4275} 4281}
4276 4282
4277static void haswell_crtc_off(struct drm_crtc *crtc)
4278{
4279 intel_ddi_put_crtc_pll(crtc);
4280}
4281 4283
4282static void i9xx_pfit_enable(struct intel_crtc *crtc) 4284static void i9xx_pfit_enable(struct intel_crtc *crtc)
4283{ 4285{
@@ -7570,9 +7572,6 @@ static int haswell_crtc_mode_set(struct drm_crtc *crtc,
7570 if (!intel_ddi_pll_select(intel_crtc)) 7572 if (!intel_ddi_pll_select(intel_crtc))
7571 return -EINVAL; 7573 return -EINVAL;
7572 7574
7573 if (intel_crtc_to_shared_dpll(intel_crtc))
7574 intel_enable_shared_dpll(intel_crtc);
7575
7576 intel_crtc->lowfreq_avail = false; 7575 intel_crtc->lowfreq_avail = false;
7577 7576
7578 return 0; 7577 return 0;
@@ -12216,7 +12215,7 @@ static void intel_init_display(struct drm_device *dev)
12216 dev_priv->display.crtc_mode_set = haswell_crtc_mode_set; 12215 dev_priv->display.crtc_mode_set = haswell_crtc_mode_set;
12217 dev_priv->display.crtc_enable = haswell_crtc_enable; 12216 dev_priv->display.crtc_enable = haswell_crtc_enable;
12218 dev_priv->display.crtc_disable = haswell_crtc_disable; 12217 dev_priv->display.crtc_disable = haswell_crtc_disable;
12219 dev_priv->display.off = haswell_crtc_off; 12218 dev_priv->display.off = ironlake_crtc_off;
12220 dev_priv->display.update_primary_plane = 12219 dev_priv->display.update_primary_plane =
12221 ironlake_update_primary_plane; 12220 ironlake_update_primary_plane;
12222 } else if (HAS_PCH_SPLIT(dev)) { 12221 } else if (HAS_PCH_SPLIT(dev)) {
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index a7d12f363af7..fa19744ed6c0 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -711,7 +711,6 @@ void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv,
711void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc); 711void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc);
712void intel_ddi_disable_pipe_clock(struct intel_crtc *intel_crtc); 712void intel_ddi_disable_pipe_clock(struct intel_crtc *intel_crtc);
713bool intel_ddi_pll_select(struct intel_crtc *crtc); 713bool intel_ddi_pll_select(struct intel_crtc *crtc);
714void intel_ddi_put_crtc_pll(struct drm_crtc *crtc);
715void intel_ddi_set_pipe_settings(struct drm_crtc *crtc); 714void intel_ddi_set_pipe_settings(struct drm_crtc *crtc);
716void intel_ddi_prepare_link_retrain(struct drm_encoder *encoder); 715void intel_ddi_prepare_link_retrain(struct drm_encoder *encoder);
717bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector); 716bool intel_ddi_connector_get_hw_state(struct intel_connector *intel_connector);
@@ -802,7 +801,6 @@ void assert_shared_dpll(struct drm_i915_private *dev_priv,
802 bool state); 801 bool state);
803#define assert_shared_dpll_enabled(d, p) assert_shared_dpll(d, p, true) 802#define assert_shared_dpll_enabled(d, p) assert_shared_dpll(d, p, true)
804#define assert_shared_dpll_disabled(d, p) assert_shared_dpll(d, p, false) 803#define assert_shared_dpll_disabled(d, p) assert_shared_dpll(d, p, false)
805void intel_disable_shared_dpll(struct intel_crtc *crtc);
806struct intel_shared_dpll *intel_get_shared_dpll(struct intel_crtc *crtc); 804struct intel_shared_dpll *intel_get_shared_dpll(struct intel_crtc *crtc);
807void intel_put_shared_dpll(struct intel_crtc *crtc); 805void intel_put_shared_dpll(struct intel_crtc *crtc);
808 806