diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2015-03-31 07:12:01 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2015-03-31 11:28:58 -0400 |
commit | 1652d19e66c2dd118bd263ccba2a951b7946a2bb (patch) | |
tree | cf5a0a41a3449563308fb10e124ee3f0d96f0484 | |
parent | 469d4b2a4ed7a255ffef31fad9d56bb6f7ac1213 (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.c | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ddi.c | 101 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 98 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 2 |
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 | ||
1692 | static 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 | |||
1740 | static 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 | |||
1759 | static 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 | |||
1777 | int 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 | |||
1791 | static void hsw_ddi_pll_enable(struct drm_i915_private *dev_priv, | 1692 | static 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 | ||
5867 | static 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 | |||
5916 | static 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 | |||
5936 | static 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 | |||
5867 | static int valleyview_get_display_clock_speed(struct drm_device *dev) | 5954 | static 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); | |||
855 | void intel_ddi_init(struct drm_device *dev, enum port port); | 855 | void intel_ddi_init(struct drm_device *dev, enum port port); |
856 | enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder); | 856 | enum port intel_ddi_get_encoder_port(struct intel_encoder *intel_encoder); |
857 | bool intel_ddi_get_hw_state(struct intel_encoder *encoder, enum pipe *pipe); | 857 | bool intel_ddi_get_hw_state(struct intel_encoder *encoder, enum pipe *pipe); |
858 | int intel_ddi_get_cdclk_freq(struct drm_i915_private *dev_priv); | ||
859 | void intel_ddi_pll_init(struct drm_device *dev); | 858 | void intel_ddi_pll_init(struct drm_device *dev); |
860 | void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc); | 859 | void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc); |
861 | void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv, | 860 | void 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); |