aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2014-07-04 10:27:39 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-07-10 16:12:56 -0400
commitd452c5b67a6e2ae9f94df223919c107a8950910a (patch)
tree543d23d46a3421942aa067a696f7f0ac5dcf3313
parentbd2bb1b9a1c8b8f7b673db22d628ffd491669deb (diff)
drm/i915: State readout support for WRPLLs
Still tacked onto the side, but slowly getting there. v2: Don't forget the debugfs file. v3 (from Paulo): Don't forget to check the power domains. Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Reviewed-by: Damien Lespiau <damien.lespiau@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_debugfs.c1
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h1
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h1
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c19
-rw-r--r--drivers/gpu/drm/i915/intel_display.c9
5 files changed, 31 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 2effe1a37815..4a5b0f80e059 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -2390,6 +2390,7 @@ static int i915_shared_dplls_info(struct seq_file *m, void *unused)
2390 seq_printf(m, " dpll_md: 0x%08x\n", pll->hw_state.dpll_md); 2390 seq_printf(m, " dpll_md: 0x%08x\n", pll->hw_state.dpll_md);
2391 seq_printf(m, " fp0: 0x%08x\n", pll->hw_state.fp0); 2391 seq_printf(m, " fp0: 0x%08x\n", pll->hw_state.fp0);
2392 seq_printf(m, " fp1: 0x%08x\n", pll->hw_state.fp1); 2392 seq_printf(m, " fp1: 0x%08x\n", pll->hw_state.fp1);
2393 seq_printf(m, " wrpll: 0x%08x\n", pll->hw_state.wrpll);
2393 } 2394 }
2394 drm_modeset_unlock_all(dev); 2395 drm_modeset_unlock_all(dev);
2395 2396
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 479a9aa77ee3..5d13c990b1fd 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -197,6 +197,7 @@ struct intel_dpll_hw_state {
197 uint32_t dpll_md; 197 uint32_t dpll_md;
198 uint32_t fp0; 198 uint32_t fp0;
199 uint32_t fp1; 199 uint32_t fp1;
200 uint32_t wrpll;
200}; 201};
201 202
202struct intel_shared_dpll { 203struct intel_shared_dpll {
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index b2b555c93d43..d20fadd9acf3 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -5922,6 +5922,7 @@ enum punit_power_well {
5922/* WRPLL */ 5922/* WRPLL */
5923#define WRPLL_CTL1 0x46040 5923#define WRPLL_CTL1 0x46040
5924#define WRPLL_CTL2 0x46060 5924#define WRPLL_CTL2 0x46060
5925#define WRPLL_CTL(pll) (pll == 0 ? WRPLL_CTL1 : WRPLL_CTL2)
5925#define WRPLL_PLL_ENABLE (1<<31) 5926#define WRPLL_PLL_ENABLE (1<<31)
5926#define WRPLL_PLL_SSC (1<<28) 5927#define WRPLL_PLL_SSC (1<<28)
5927#define WRPLL_PLL_NON_SSC (2<<28) 5928#define WRPLL_PLL_NON_SSC (2<<28)
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index bf6f1c2dea8c..52a916082c65 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -790,6 +790,8 @@ bool intel_ddi_pll_select(struct intel_crtc *intel_crtc)
790 intel_crtc->config.ddi_pll_sel = PORT_CLK_SEL_WRPLL2; 790 intel_crtc->config.ddi_pll_sel = PORT_CLK_SEL_WRPLL2;
791 intel_crtc->config.shared_dpll = DPLL_ID_WRPLL2; 791 intel_crtc->config.shared_dpll = DPLL_ID_WRPLL2;
792 } 792 }
793
794 intel_crtc->config.dpll_hw_state.wrpll = val;
793 } 795 }
794 796
795 return true; 797 return true;
@@ -1317,6 +1319,21 @@ int intel_ddi_get_cdclk_freq(struct drm_i915_private *dev_priv)
1317 } 1319 }
1318} 1320}
1319 1321
1322static bool hsw_ddi_pll_get_hw_state(struct drm_i915_private *dev_priv,
1323 struct intel_shared_dpll *pll,
1324 struct intel_dpll_hw_state *hw_state)
1325{
1326 uint32_t val;
1327
1328 if (!intel_display_power_enabled(dev_priv, POWER_DOMAIN_PLLS))
1329 return false;
1330
1331 val = I915_READ(WRPLL_CTL(pll->id));
1332 hw_state->wrpll = val;
1333
1334 return val & WRPLL_PLL_ENABLE;
1335}
1336
1320static char *hsw_ddi_pll_names[] = { 1337static char *hsw_ddi_pll_names[] = {
1321 "WRPLL 1", 1338 "WRPLL 1",
1322 "WRPLL 2", 1339 "WRPLL 2",
@@ -1335,6 +1352,8 @@ void intel_ddi_pll_init(struct drm_device *dev)
1335 for (i = 0; i < 2; i++) { 1352 for (i = 0; i < 2; i++) {
1336 dev_priv->shared_dplls[i].id = i; 1353 dev_priv->shared_dplls[i].id = i;
1337 dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i]; 1354 dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i];
1355 dev_priv->shared_dplls[i].get_hw_state =
1356 hsw_ddi_pll_get_hw_state;
1338 } 1357 }
1339 1358
1340 /* The LCPLL register should be turned on by the BIOS. For now let's 1359 /* The LCPLL register should be turned on by the BIOS. For now let's
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index d61c5e43fc19..3e0917dff54f 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -7579,6 +7579,7 @@ static void haswell_get_ddi_port_state(struct intel_crtc *crtc,
7579{ 7579{
7580 struct drm_device *dev = crtc->base.dev; 7580 struct drm_device *dev = crtc->base.dev;
7581 struct drm_i915_private *dev_priv = dev->dev_private; 7581 struct drm_i915_private *dev_priv = dev->dev_private;
7582 struct intel_shared_dpll *pll;
7582 enum port port; 7583 enum port port;
7583 uint32_t tmp; 7584 uint32_t tmp;
7584 7585
@@ -7597,6 +7598,13 @@ static void haswell_get_ddi_port_state(struct intel_crtc *crtc,
7597 break; 7598 break;
7598 } 7599 }
7599 7600
7601 if (pipe_config->shared_dpll >= 0) {
7602 pll = &dev_priv->shared_dplls[pipe_config->shared_dpll];
7603
7604 WARN_ON(!pll->get_hw_state(dev_priv, pll,
7605 &pipe_config->dpll_hw_state));
7606 }
7607
7600 /* 7608 /*
7601 * Haswell has only FDI/PCH transcoder A. It is which is connected to 7609 * Haswell has only FDI/PCH transcoder A. It is which is connected to
7602 * DDI E. So just check whether this pipe is wired to DDI E and whether 7610 * DDI E. So just check whether this pipe is wired to DDI E and whether
@@ -10444,6 +10452,7 @@ intel_pipe_config_compare(struct drm_device *dev,
10444 PIPE_CONF_CHECK_X(dpll_hw_state.dpll_md); 10452 PIPE_CONF_CHECK_X(dpll_hw_state.dpll_md);
10445 PIPE_CONF_CHECK_X(dpll_hw_state.fp0); 10453 PIPE_CONF_CHECK_X(dpll_hw_state.fp0);
10446 PIPE_CONF_CHECK_X(dpll_hw_state.fp1); 10454 PIPE_CONF_CHECK_X(dpll_hw_state.fp1);
10455 PIPE_CONF_CHECK_X(dpll_hw_state.wrpll);
10447 10456
10448 if (IS_G4X(dev) || INTEL_INFO(dev)->gen >= 5) 10457 if (IS_G4X(dev) || INTEL_INFO(dev)->gen >= 5)
10449 PIPE_CONF_CHECK_I(pipe_bpp); 10458 PIPE_CONF_CHECK_I(pipe_bpp);