@@ -1659,10 +1659,23 @@ static void cnl_set_cdclk(struct drm_i915_private *dev_priv,
1659
1659
cnl_cdclk_pll_enable (dev_priv , vco );
1660
1660
1661
1661
val = divider | skl_cdclk_decimal (cdclk );
1662
- if (pipe == INVALID_PIPE )
1663
- val |= BXT_CDCLK_CD2X_PIPE_NONE ;
1664
- else
1665
- val |= BXT_CDCLK_CD2X_PIPE (pipe );
1662
+
1663
+ if (INTEL_GEN (dev_priv ) >= 12 ) {
1664
+ if (pipe == INVALID_PIPE )
1665
+ val |= TGL_CDCLK_CD2X_PIPE_NONE ;
1666
+ else
1667
+ val |= TGL_CDCLK_CD2X_PIPE (pipe );
1668
+ } else if (INTEL_GEN (dev_priv ) >= 11 ) {
1669
+ if (pipe == INVALID_PIPE )
1670
+ val |= ICL_CDCLK_CD2X_PIPE_NONE ;
1671
+ else
1672
+ val |= ICL_CDCLK_CD2X_PIPE (pipe );
1673
+ } else {
1674
+ if (pipe == INVALID_PIPE )
1675
+ val |= BXT_CDCLK_CD2X_PIPE_NONE ;
1676
+ else
1677
+ val |= BXT_CDCLK_CD2X_PIPE (pipe );
1678
+ }
1666
1679
I915_WRITE (CDCLK_CTL , val );
1667
1680
1668
1681
if (pipe != INVALID_PIPE )
@@ -1813,51 +1826,6 @@ static int icl_calc_cdclk_pll_vco(struct drm_i915_private *dev_priv, int cdclk)
1813
1826
return dev_priv -> cdclk .hw .ref * ratio ;
1814
1827
}
1815
1828
1816
- static void icl_set_cdclk (struct drm_i915_private * dev_priv ,
1817
- const struct intel_cdclk_state * cdclk_state ,
1818
- enum pipe pipe )
1819
- {
1820
- unsigned int cdclk = cdclk_state -> cdclk ;
1821
- unsigned int vco = cdclk_state -> vco ;
1822
- int ret ;
1823
-
1824
- ret = skl_pcode_request (dev_priv , SKL_PCODE_CDCLK_CONTROL ,
1825
- SKL_CDCLK_PREPARE_FOR_CHANGE ,
1826
- SKL_CDCLK_READY_FOR_CHANGE ,
1827
- SKL_CDCLK_READY_FOR_CHANGE , 3 );
1828
- if (ret ) {
1829
- DRM_ERROR ("Failed to inform PCU about cdclk change (%d)\n" ,
1830
- ret );
1831
- return ;
1832
- }
1833
-
1834
- if (dev_priv -> cdclk .hw .vco != 0 &&
1835
- dev_priv -> cdclk .hw .vco != vco )
1836
- cnl_cdclk_pll_disable (dev_priv );
1837
-
1838
- if (dev_priv -> cdclk .hw .vco != vco )
1839
- cnl_cdclk_pll_enable (dev_priv , vco );
1840
-
1841
- /*
1842
- * On ICL CD2X_DIV can only be 1, so we'll never end up changing the
1843
- * divider here synchronized to a pipe while CDCLK is on, nor will we
1844
- * need the corresponding vblank wait.
1845
- */
1846
- I915_WRITE (CDCLK_CTL , ICL_CDCLK_CD2X_PIPE_NONE |
1847
- skl_cdclk_decimal (cdclk ));
1848
-
1849
- sandybridge_pcode_write (dev_priv , SKL_PCODE_CDCLK_CONTROL ,
1850
- cdclk_state -> voltage_level );
1851
-
1852
- intel_update_cdclk (dev_priv );
1853
-
1854
- /*
1855
- * Can't read out the voltage level :(
1856
- * Let's just assume everything is as expected.
1857
- */
1858
- dev_priv -> cdclk .hw .voltage_level = cdclk_state -> voltage_level ;
1859
- }
1860
-
1861
1829
static u8 icl_calc_voltage_level (struct drm_i915_private * dev_priv , int cdclk )
1862
1830
{
1863
1831
if (IS_ELKHARTLAKE (dev_priv )) {
@@ -1881,6 +1849,7 @@ static void icl_get_cdclk(struct drm_i915_private *dev_priv,
1881
1849
struct intel_cdclk_state * cdclk_state )
1882
1850
{
1883
1851
u32 val ;
1852
+ int div ;
1884
1853
1885
1854
cdclk_state -> bypass = 50000 ;
1886
1855
@@ -1914,10 +1883,21 @@ static void icl_get_cdclk(struct drm_i915_private *dev_priv,
1914
1883
1915
1884
cdclk_state -> vco = (val & BXT_DE_PLL_RATIO_MASK ) * cdclk_state -> ref ;
1916
1885
1917
- val = I915_READ (CDCLK_CTL );
1918
- WARN_ON ((val & BXT_CDCLK_CD2X_DIV_SEL_MASK ) != 0 );
1886
+ val = I915_READ (CDCLK_CTL ) & BXT_CDCLK_CD2X_DIV_SEL_MASK ;
1887
+ switch (val ) {
1888
+ case BXT_CDCLK_CD2X_DIV_SEL_1 :
1889
+ div = 2 ;
1890
+ break ;
1891
+ case BXT_CDCLK_CD2X_DIV_SEL_2 :
1892
+ div = 4 ;
1893
+ break ;
1894
+ default :
1895
+ MISSING_CASE (val );
1896
+ div = 2 ;
1897
+ break ;
1898
+ }
1919
1899
1920
- cdclk_state -> cdclk = cdclk_state -> vco / 2 ;
1900
+ cdclk_state -> cdclk = DIV_ROUND_CLOSEST ( cdclk_state -> vco , div ) ;
1921
1901
1922
1902
out :
1923
1903
/*
@@ -1963,7 +1943,7 @@ static void icl_init_cdclk(struct drm_i915_private *dev_priv)
1963
1943
icl_calc_voltage_level (dev_priv ,
1964
1944
sanitized_state .cdclk );
1965
1945
1966
- icl_set_cdclk (dev_priv , & sanitized_state , INVALID_PIPE );
1946
+ cnl_set_cdclk (dev_priv , & sanitized_state , INVALID_PIPE );
1967
1947
}
1968
1948
1969
1949
static void icl_uninit_cdclk (struct drm_i915_private * dev_priv )
@@ -1975,7 +1955,7 @@ static void icl_uninit_cdclk(struct drm_i915_private *dev_priv)
1975
1955
cdclk_state .voltage_level = icl_calc_voltage_level (dev_priv ,
1976
1956
cdclk_state .cdclk );
1977
1957
1978
- icl_set_cdclk (dev_priv , & cdclk_state , INVALID_PIPE );
1958
+ cnl_set_cdclk (dev_priv , & cdclk_state , INVALID_PIPE );
1979
1959
}
1980
1960
1981
1961
static void cnl_init_cdclk (struct drm_i915_private * dev_priv )
@@ -2810,7 +2790,7 @@ void intel_update_rawclk(struct drm_i915_private *dev_priv)
2810
2790
void intel_init_cdclk_hooks (struct drm_i915_private * dev_priv )
2811
2791
{
2812
2792
if (INTEL_GEN (dev_priv ) >= 11 ) {
2813
- dev_priv -> display .set_cdclk = icl_set_cdclk ;
2793
+ dev_priv -> display .set_cdclk = cnl_set_cdclk ;
2814
2794
dev_priv -> display .modeset_calc_cdclk = icl_modeset_calc_cdclk ;
2815
2795
} else if (IS_CANNONLAKE (dev_priv )) {
2816
2796
dev_priv -> display .set_cdclk = cnl_set_cdclk ;
0 commit comments