aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2015-03-31 07:12:01 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-03-31 11:28:58 -0400
commit1652d19e66c2dd118bd263ccba2a951b7946a2bb (patch)
treecf5a0a41a3449563308fb10e124ee3f0d96f0484
parent469d4b2a4ed7a255ffef31fad9d56bb6f7ac1213 (diff)
drm/i915: Convert the ddi cdclk code to get_display_clock_speed
Unify the HSW/BDW/SKL cdclk extraction code to conform to the same .get_display_clock_speed() mold that all the other platforms use. v2: Update due to SKL code getting added v3: Rebase on top of -nightly (introduction of intel_audio.c) (Mika Kahola) Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Mika Kahola <mika.kahola@intel.com> Reviewed-by: Damien Lespiau <damien.lespiau@intel.com> [danvet: Add v3 note as suggested by Damien.] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_audio.c3
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c101
-rw-r--r--drivers/gpu/drm/i915/intel_display.c98
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c2
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h1
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c2
6 files changed, 102 insertions, 105 deletions
diff --git a/drivers/gpu/drm/i915/intel_audio.c b/drivers/gpu/drm/i915/intel_audio.c
index 2396cc702d18..0d5b1cea4715 100644
--- a/drivers/gpu/drm/i915/intel_audio.c
+++ b/drivers/gpu/drm/i915/intel_audio.c
@@ -485,7 +485,8 @@ static int i915_audio_component_get_cdclk_freq(struct device *dev)
485 return -ENODEV; 485 return -ENODEV;
486 486
487 intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO); 487 intel_display_power_get(dev_priv, POWER_DOMAIN_AUDIO);
488 ret = intel_ddi_get_cdclk_freq(dev_priv); 488 ret = dev_priv->display.get_display_clock_speed(dev_priv->dev);
489
489 intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO); 490 intel_display_power_put(dev_priv, POWER_DOMAIN_AUDIO);
490 491
491 return ret; 492 return ret;
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index 47b9307da24b..8c692d8a3ef6 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -1689,105 +1689,6 @@ static void intel_disable_ddi(struct intel_encoder *intel_encoder)
1689 } 1689 }
1690} 1690}
1691 1691
1692static int skl_get_cdclk_freq(struct drm_i915_private *dev_priv)
1693{
1694 uint32_t lcpll1 = I915_READ(LCPLL1_CTL);
1695 uint32_t cdctl = I915_READ(CDCLK_CTL);
1696 uint32_t linkrate;
1697
1698 if (!(lcpll1 & LCPLL_PLL_ENABLE)) {
1699 WARN(1, "LCPLL1 not enabled\n");
1700 return 24000; /* 24MHz is the cd freq with NSSC ref */
1701 }
1702
1703 if ((cdctl & CDCLK_FREQ_SEL_MASK) == CDCLK_FREQ_540)
1704 return 540000;
1705
1706 linkrate = (I915_READ(DPLL_CTRL1) &
1707 DPLL_CRTL1_LINK_RATE_MASK(SKL_DPLL0)) >> 1;
1708
1709 if (linkrate == DPLL_CRTL1_LINK_RATE_2160 ||
1710 linkrate == DPLL_CRTL1_LINK_RATE_1080) {
1711 /* vco 8640 */
1712 switch (cdctl & CDCLK_FREQ_SEL_MASK) {
1713 case CDCLK_FREQ_450_432:
1714 return 432000;
1715 case CDCLK_FREQ_337_308:
1716 return 308570;
1717 case CDCLK_FREQ_675_617:
1718 return 617140;
1719 default:
1720 WARN(1, "Unknown cd freq selection\n");
1721 }
1722 } else {
1723 /* vco 8100 */
1724 switch (cdctl & CDCLK_FREQ_SEL_MASK) {
1725 case CDCLK_FREQ_450_432:
1726 return 450000;
1727 case CDCLK_FREQ_337_308:
1728 return 337500;
1729 case CDCLK_FREQ_675_617:
1730 return 675000;
1731 default:
1732 WARN(1, "Unknown cd freq selection\n");
1733 }
1734 }
1735
1736 /* error case, do as if DPLL0 isn't enabled */
1737 return 24000;
1738}
1739
1740static int bdw_get_cdclk_freq(struct drm_i915_private *dev_priv)
1741{
1742 uint32_t lcpll = I915_READ(LCPLL_CTL);
1743 uint32_t freq = lcpll & LCPLL_CLK_FREQ_MASK;
1744
1745 if (lcpll & LCPLL_CD_SOURCE_FCLK)
1746 return 800000;
1747 else if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT)
1748 return 450000;
1749 else if (freq == LCPLL_CLK_FREQ_450)
1750 return 450000;
1751 else if (freq == LCPLL_CLK_FREQ_54O_BDW)
1752 return 540000;
1753 else if (freq == LCPLL_CLK_FREQ_337_5_BDW)
1754 return 337500;
1755 else
1756 return 675000;
1757}
1758
1759static int hsw_get_cdclk_freq(struct drm_i915_private *dev_priv)
1760{
1761 struct drm_device *dev = dev_priv->dev;
1762 uint32_t lcpll = I915_READ(LCPLL_CTL);
1763 uint32_t freq = lcpll & LCPLL_CLK_FREQ_MASK;
1764
1765 if (lcpll & LCPLL_CD_SOURCE_FCLK)
1766 return 800000;
1767 else if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT)
1768 return 450000;
1769 else if (freq == LCPLL_CLK_FREQ_450)
1770 return 450000;
1771 else if (IS_HSW_ULT(dev))
1772 return 337500;
1773 else
1774 return 540000;
1775}
1776
1777int intel_ddi_get_cdclk_freq(struct drm_i915_private *dev_priv)
1778{
1779 struct drm_device *dev = dev_priv->dev;
1780
1781 if (IS_SKYLAKE(dev))
1782 return skl_get_cdclk_freq(dev_priv);
1783
1784 if (IS_BROADWELL(dev))
1785 return bdw_get_cdclk_freq(dev_priv);
1786
1787 /* Haswell */
1788 return hsw_get_cdclk_freq(dev_priv);
1789}
1790
1791static void hsw_ddi_pll_enable(struct drm_i915_private *dev_priv, 1692static void hsw_ddi_pll_enable(struct drm_i915_private *dev_priv,
1792 struct intel_shared_dpll *pll) 1693 struct intel_shared_dpll *pll)
1793{ 1694{
@@ -1974,7 +1875,7 @@ void intel_ddi_pll_init(struct drm_device *dev)
1974 hsw_shared_dplls_init(dev_priv); 1875 hsw_shared_dplls_init(dev_priv);
1975 1876
1976 DRM_DEBUG_KMS("CDCLK running at %dKHz\n", 1877 DRM_DEBUG_KMS("CDCLK running at %dKHz\n",
1977 intel_ddi_get_cdclk_freq(dev_priv)); 1878 dev_priv->display.get_display_clock_speed(dev));
1978 1879
1979 if (IS_SKYLAKE(dev)) { 1880 if (IS_SKYLAKE(dev)) {
1980 if (!(I915_READ(LCPLL1_CTL) & LCPLL_PLL_ENABLE)) 1881 if (!(I915_READ(LCPLL1_CTL) & LCPLL_PLL_ENABLE))
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 44a146b27c2f..d3cdc12a6330 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -5864,6 +5864,93 @@ static int intel_crtc_compute_config(struct intel_crtc *crtc,
5864 return 0; 5864 return 0;
5865} 5865}
5866 5866
5867static int skylake_get_display_clock_speed(struct drm_device *dev)
5868{
5869 struct drm_i915_private *dev_priv = to_i915(dev);
5870 uint32_t lcpll1 = I915_READ(LCPLL1_CTL);
5871 uint32_t cdctl = I915_READ(CDCLK_CTL);
5872 uint32_t linkrate;
5873
5874 if (!(lcpll1 & LCPLL_PLL_ENABLE)) {
5875 WARN(1, "LCPLL1 not enabled\n");
5876 return 24000; /* 24MHz is the cd freq with NSSC ref */
5877 }
5878
5879 if ((cdctl & CDCLK_FREQ_SEL_MASK) == CDCLK_FREQ_540)
5880 return 540000;
5881
5882 linkrate = (I915_READ(DPLL_CTRL1) &
5883 DPLL_CRTL1_LINK_RATE_MASK(SKL_DPLL0)) >> 1;
5884
5885 if (linkrate == DPLL_CRTL1_LINK_RATE_2160 ||
5886 linkrate == DPLL_CRTL1_LINK_RATE_1080) {
5887 /* vco 8640 */
5888 switch (cdctl & CDCLK_FREQ_SEL_MASK) {
5889 case CDCLK_FREQ_450_432:
5890 return 432000;
5891 case CDCLK_FREQ_337_308:
5892 return 308570;
5893 case CDCLK_FREQ_675_617:
5894 return 617140;
5895 default:
5896 WARN(1, "Unknown cd freq selection\n");
5897 }
5898 } else {
5899 /* vco 8100 */
5900 switch (cdctl & CDCLK_FREQ_SEL_MASK) {
5901 case CDCLK_FREQ_450_432:
5902 return 450000;
5903 case CDCLK_FREQ_337_308:
5904 return 337500;
5905 case CDCLK_FREQ_675_617:
5906 return 675000;
5907 default:
5908 WARN(1, "Unknown cd freq selection\n");
5909 }
5910 }
5911
5912 /* error case, do as if DPLL0 isn't enabled */
5913 return 24000;
5914}
5915
5916static int broadwell_get_display_clock_speed(struct drm_device *dev)
5917{
5918 struct drm_i915_private *dev_priv = dev->dev_private;
5919 uint32_t lcpll = I915_READ(LCPLL_CTL);
5920 uint32_t freq = lcpll & LCPLL_CLK_FREQ_MASK;
5921
5922 if (lcpll & LCPLL_CD_SOURCE_FCLK)
5923 return 800000;
5924 else if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT)
5925 return 450000;
5926 else if (freq == LCPLL_CLK_FREQ_450)
5927 return 450000;
5928 else if (freq == LCPLL_CLK_FREQ_54O_BDW)
5929 return 540000;
5930 else if (freq == LCPLL_CLK_FREQ_337_5_BDW)
5931 return 337500;
5932 else
5933 return 675000;
5934}
5935
5936static int haswell_get_display_clock_speed(struct drm_device *dev)
5937{
5938 struct drm_i915_private *dev_priv = dev->dev_private;
5939 uint32_t lcpll = I915_READ(LCPLL_CTL);
5940 uint32_t freq = lcpll & LCPLL_CLK_FREQ_MASK;
5941
5942 if (lcpll & LCPLL_CD_SOURCE_FCLK)
5943 return 800000;
5944 else if (I915_READ(FUSE_STRAP) & HSW_CDCLK_LIMIT)
5945 return 450000;
5946 else if (freq == LCPLL_CLK_FREQ_450)
5947 return 450000;
5948 else if (IS_HSW_ULT(dev))
5949 return 337500;
5950 else
5951 return 540000;
5952}
5953
5867static int valleyview_get_display_clock_speed(struct drm_device *dev) 5954static int valleyview_get_display_clock_speed(struct drm_device *dev)
5868{ 5955{
5869 struct drm_i915_private *dev_priv = dev->dev_private; 5956 struct drm_i915_private *dev_priv = dev->dev_private;
@@ -13500,7 +13587,16 @@ static void intel_init_display(struct drm_device *dev)
13500 } 13587 }
13501 13588
13502 /* Returns the core display clock speed */ 13589 /* Returns the core display clock speed */
13503 if (IS_VALLEYVIEW(dev)) 13590 if (IS_SKYLAKE(dev))
13591 dev_priv->display.get_display_clock_speed =
13592 skylake_get_display_clock_speed;
13593 else if (IS_BROADWELL(dev))
13594 dev_priv->display.get_display_clock_speed =
13595 broadwell_get_display_clock_speed;
13596 else if (IS_HASWELL(dev))
13597 dev_priv->display.get_display_clock_speed =
13598 haswell_get_display_clock_speed;
13599 else if (IS_VALLEYVIEW(dev))
13504 dev_priv->display.get_display_clock_speed = 13600 dev_priv->display.get_display_clock_speed =
13505 valleyview_get_display_clock_speed; 13601 valleyview_get_display_clock_speed;
13506 else if (IS_GEN5(dev)) 13602 else if (IS_GEN5(dev))
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index fd9fc3c6a72c..7936155acbe8 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -717,7 +717,7 @@ static uint32_t hsw_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
717 if (intel_dig_port->port == PORT_A) { 717 if (intel_dig_port->port == PORT_A) {
718 if (index) 718 if (index)
719 return 0; 719 return 0;
720 return DIV_ROUND_CLOSEST(intel_ddi_get_cdclk_freq(dev_priv), 2000); 720 return DIV_ROUND_CLOSEST(dev_priv->display.get_display_clock_speed(dev), 2000);
721 } else if (dev_priv->pch_id == INTEL_PCH_LPT_DEVICE_ID_TYPE) { 721 } else if (dev_priv->pch_id == INTEL_PCH_LPT_DEVICE_ID_TYPE) {
722 /* Workaround for non-ULT HSW */ 722 /* Workaround for non-ULT HSW */
723 switch (index) { 723 switch (index) {
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 6036e3b73b7b..4799b11f30c5 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -855,7 +855,6 @@ void hsw_fdi_link_train(struct drm_crtc *crtc);
855void intel_ddi_init(struct drm_device *dev, enum port port); 855void intel_ddi_init(struct drm_device *dev, enum port port);
856enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder); 856enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder);
857bool intel_ddi_get_hw_state(struct intel_encoder *encoder, enum pipe *pipe); 857bool intel_ddi_get_hw_state(struct intel_encoder *encoder, enum pipe *pipe);
858int intel_ddi_get_cdclk_freq(struct drm_i915_private *dev_priv);
859void intel_ddi_pll_init(struct drm_device *dev); 858void intel_ddi_pll_init(struct drm_device *dev);
860void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc); 859void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc);
861void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv, 860void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv,
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index fa4ccb346389..e1392e79c5c4 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -1792,7 +1792,7 @@ hsw_compute_linetime_wm(struct drm_device *dev, struct drm_crtc *crtc)
1792 linetime = DIV_ROUND_CLOSEST(mode->crtc_htotal * 1000 * 8, 1792 linetime = DIV_ROUND_CLOSEST(mode->crtc_htotal * 1000 * 8,
1793 mode->crtc_clock); 1793 mode->crtc_clock);
1794 ips_linetime = DIV_ROUND_CLOSEST(mode->crtc_htotal * 1000 * 8, 1794 ips_linetime = DIV_ROUND_CLOSEST(mode->crtc_htotal * 1000 * 8,
1795 intel_ddi_get_cdclk_freq(dev_priv)); 1795 dev_priv->display.get_display_clock_speed(dev_priv->dev));
1796 1796
1797 return PIPE_WM_LINETIME_IPS_LINETIME(ips_linetime) | 1797 return PIPE_WM_LINETIME_IPS_LINETIME(ips_linetime) |
1798 PIPE_WM_LINETIME_TIME(linetime); 1798 PIPE_WM_LINETIME_TIME(linetime);