diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2014-07-04 10:27:39 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2014-07-10 16:12:56 -0400 |
commit | d452c5b67a6e2ae9f94df223919c107a8950910a (patch) | |
tree | 543d23d46a3421942aa067a696f7f0ac5dcf3313 | |
parent | bd2bb1b9a1c8b8f7b673db22d628ffd491669deb (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.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ddi.c | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 9 |
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 | ||
202 | struct intel_shared_dpll { | 203 | struct 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 | ||
1322 | static 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 | |||
1320 | static char *hsw_ddi_pll_names[] = { | 1337 | static 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); |