@@ -1180,7 +1180,7 @@ static void skl_sanitize_cdclk(struct drm_i915_private *dev_priv)
1180
1180
/* force cdclk programming */
1181
1181
dev_priv -> display .cdclk .hw .cdclk = 0 ;
1182
1182
/* force full PLL disable + enable */
1183
- dev_priv -> display .cdclk .hw .vco = -1 ;
1183
+ dev_priv -> display .cdclk .hw .vco = ~ 0 ;
1184
1184
}
1185
1185
1186
1186
static void skl_cdclk_init_hw (struct drm_i915_private * dev_priv )
@@ -1446,50 +1446,77 @@ static u8 bxt_calc_voltage_level(int cdclk)
1446
1446
return DIV_ROUND_UP (cdclk , 25000 );
1447
1447
}
1448
1448
1449
+ static u8 calc_voltage_level (int cdclk , int num_voltage_levels ,
1450
+ const int voltage_level_max_cdclk [])
1451
+ {
1452
+ int voltage_level ;
1453
+
1454
+ for (voltage_level = 0 ; voltage_level < num_voltage_levels ; voltage_level ++ ) {
1455
+ if (cdclk <= voltage_level_max_cdclk [voltage_level ])
1456
+ return voltage_level ;
1457
+ }
1458
+
1459
+ MISSING_CASE (cdclk );
1460
+ return num_voltage_levels - 1 ;
1461
+ }
1462
+
1449
1463
static u8 icl_calc_voltage_level (int cdclk )
1450
1464
{
1451
- if (cdclk > 556800 )
1452
- return 2 ;
1453
- else if (cdclk > 312000 )
1454
- return 1 ;
1455
- else
1456
- return 0 ;
1465
+ static const int icl_voltage_level_max_cdclk [] = {
1466
+ [0 ] = 312000 ,
1467
+ [1 ] = 556800 ,
1468
+ [2 ] = 652800 ,
1469
+ };
1470
+
1471
+ return calc_voltage_level (cdclk ,
1472
+ ARRAY_SIZE (icl_voltage_level_max_cdclk ),
1473
+ icl_voltage_level_max_cdclk );
1457
1474
}
1458
1475
1459
1476
static u8 ehl_calc_voltage_level (int cdclk )
1460
1477
{
1461
- if (cdclk > 326400 )
1462
- return 3 ;
1463
- else if (cdclk > 312000 )
1464
- return 2 ;
1465
- else if (cdclk > 180000 )
1466
- return 1 ;
1467
- else
1468
- return 0 ;
1478
+ static const int ehl_voltage_level_max_cdclk [] = {
1479
+ [0 ] = 180000 ,
1480
+ [1 ] = 312000 ,
1481
+ [2 ] = 326400 ,
1482
+ /*
1483
+ * Bspec lists the limit as 556.8 MHz, but some JSL
1484
+ * development boards (at least) boot with 652.8 MHz
1485
+ */
1486
+ [3 ] = 652800 ,
1487
+ };
1488
+
1489
+ return calc_voltage_level (cdclk ,
1490
+ ARRAY_SIZE (ehl_voltage_level_max_cdclk ),
1491
+ ehl_voltage_level_max_cdclk );
1469
1492
}
1470
1493
1471
1494
static u8 tgl_calc_voltage_level (int cdclk )
1472
1495
{
1473
- if (cdclk > 556800 )
1474
- return 3 ;
1475
- else if (cdclk > 326400 )
1476
- return 2 ;
1477
- else if (cdclk > 312000 )
1478
- return 1 ;
1479
- else
1480
- return 0 ;
1496
+ static const int tgl_voltage_level_max_cdclk [] = {
1497
+ [0 ] = 312000 ,
1498
+ [1 ] = 326400 ,
1499
+ [2 ] = 556800 ,
1500
+ [3 ] = 652800 ,
1501
+ };
1502
+
1503
+ return calc_voltage_level (cdclk ,
1504
+ ARRAY_SIZE (tgl_voltage_level_max_cdclk ),
1505
+ tgl_voltage_level_max_cdclk );
1481
1506
}
1482
1507
1483
1508
static u8 rplu_calc_voltage_level (int cdclk )
1484
1509
{
1485
- if (cdclk > 556800 )
1486
- return 3 ;
1487
- else if (cdclk > 480000 )
1488
- return 2 ;
1489
- else if (cdclk > 312000 )
1490
- return 1 ;
1491
- else
1492
- return 0 ;
1510
+ static const int rplu_voltage_level_max_cdclk [] = {
1511
+ [0 ] = 312000 ,
1512
+ [1 ] = 480000 ,
1513
+ [2 ] = 556800 ,
1514
+ [3 ] = 652800 ,
1515
+ };
1516
+
1517
+ return calc_voltage_level (cdclk ,
1518
+ ARRAY_SIZE (rplu_voltage_level_max_cdclk ),
1519
+ rplu_voltage_level_max_cdclk );
1493
1520
}
1494
1521
1495
1522
static void icl_readout_refclk (struct drm_i915_private * dev_priv ,
@@ -1800,6 +1827,8 @@ static bool cdclk_pll_is_unknown(unsigned int vco)
1800
1827
return vco == ~0 ;
1801
1828
}
1802
1829
1830
+ static const int cdclk_squash_len = 16 ;
1831
+
1803
1832
static int cdclk_squash_divider (u16 waveform )
1804
1833
{
1805
1834
return hweight16 (waveform ?: 0xffff );
@@ -1811,7 +1840,6 @@ static bool cdclk_compute_crawl_and_squash_midpoint(struct drm_i915_private *i91
1811
1840
struct intel_cdclk_config * mid_cdclk_config )
1812
1841
{
1813
1842
u16 old_waveform , new_waveform , mid_waveform ;
1814
- int size = 16 ;
1815
1843
int div = 2 ;
1816
1844
1817
1845
/* Return if PLL is in an unknown state, force a complete disable and re-enable. */
@@ -1850,7 +1878,8 @@ static bool cdclk_compute_crawl_and_squash_midpoint(struct drm_i915_private *i91
1850
1878
}
1851
1879
1852
1880
mid_cdclk_config -> cdclk = DIV_ROUND_CLOSEST (cdclk_squash_divider (mid_waveform ) *
1853
- mid_cdclk_config -> vco , size * div );
1881
+ mid_cdclk_config -> vco ,
1882
+ cdclk_squash_len * div );
1854
1883
1855
1884
/* make sure the mid clock came out sane */
1856
1885
@@ -1878,9 +1907,9 @@ static void _bxt_set_cdclk(struct drm_i915_private *dev_priv,
1878
1907
{
1879
1908
int cdclk = cdclk_config -> cdclk ;
1880
1909
int vco = cdclk_config -> vco ;
1881
- u32 val ;
1910
+ int unsquashed_cdclk ;
1882
1911
u16 waveform ;
1883
- int clock ;
1912
+ u32 val ;
1884
1913
1885
1914
if (HAS_CDCLK_CRAWL (dev_priv ) && dev_priv -> display .cdclk .hw .vco > 0 && vco > 0 &&
1886
1915
!cdclk_pll_is_unknown (dev_priv -> display .cdclk .hw .vco )) {
@@ -1897,15 +1926,13 @@ static void _bxt_set_cdclk(struct drm_i915_private *dev_priv,
1897
1926
1898
1927
waveform = cdclk_squash_waveform (dev_priv , cdclk );
1899
1928
1900
- if (waveform )
1901
- clock = vco / 2 ;
1902
- else
1903
- clock = cdclk ;
1929
+ unsquashed_cdclk = DIV_ROUND_CLOSEST (cdclk * cdclk_squash_len ,
1930
+ cdclk_squash_divider (waveform ));
1904
1931
1905
1932
if (HAS_CDCLK_SQUASH (dev_priv ))
1906
1933
dg2_cdclk_squash_program (dev_priv , waveform );
1907
1934
1908
- val = bxt_cdclk_cd2x_div_sel (dev_priv , clock , vco ) |
1935
+ val = bxt_cdclk_cd2x_div_sel (dev_priv , unsquashed_cdclk , vco ) |
1909
1936
bxt_cdclk_cd2x_pipe (dev_priv , pipe );
1910
1937
1911
1938
/*
@@ -2075,7 +2102,7 @@ static void bxt_sanitize_cdclk(struct drm_i915_private *dev_priv)
2075
2102
dev_priv -> display .cdclk .hw .cdclk = 0 ;
2076
2103
2077
2104
/* force full PLL disable + enable */
2078
- dev_priv -> display .cdclk .hw .vco = -1 ;
2105
+ dev_priv -> display .cdclk .hw .vco = ~ 0 ;
2079
2106
}
2080
2107
2081
2108
static void bxt_cdclk_init_hw (struct drm_i915_private * dev_priv )
@@ -3489,7 +3516,7 @@ static const struct intel_cdclk_funcs mtl_cdclk_funcs = {
3489
3516
.get_cdclk = bxt_get_cdclk ,
3490
3517
.set_cdclk = bxt_set_cdclk ,
3491
3518
.modeset_calc_cdclk = bxt_modeset_calc_cdclk ,
3492
- .calc_voltage_level = tgl_calc_voltage_level ,
3519
+ .calc_voltage_level = rplu_calc_voltage_level ,
3493
3520
};
3494
3521
3495
3522
static const struct intel_cdclk_funcs rplu_cdclk_funcs = {
0 commit comments