mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-12 01:16:45 +07:00
drm/i915: Fix chv cdclk support
The specs seem to be full of misinformation wrt. the Punit register 0x36. Some versions still show the old VLV bit layout, some the new layout, and all of them seem to tell us nonsense about the cdclk value encoding. Testing on actual hardware has shown that we simply need to program the desired CCK divider into the Punit register using the new layout of the bits. Doing that, the status bit change to indicate the same value, and the CCK 0x6b register also changes accordingly to indicate that CCK is now using the new divider. Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Vijay Purushothaman <vijay.a.purushothaman@linux.intel.com> Reviewed-by: Yogesh Mohan Marimuthu <yogesh.mohan.marimuthu@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
6cca31950a
commit
9d0d3fdaae
@ -5001,24 +5001,23 @@ static void cherryview_set_cdclk(struct drm_device *dev, int cdclk)
|
||||
WARN_ON(dev_priv->display.get_display_clock_speed(dev) != dev_priv->vlv_cdclk_freq);
|
||||
|
||||
switch (cdclk) {
|
||||
case 400000:
|
||||
cmd = 3;
|
||||
break;
|
||||
case 333333:
|
||||
case 320000:
|
||||
cmd = 2;
|
||||
break;
|
||||
case 266667:
|
||||
cmd = 1;
|
||||
break;
|
||||
case 200000:
|
||||
cmd = 0;
|
||||
break;
|
||||
default:
|
||||
MISSING_CASE(cdclk);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Specs are full of misinformation, but testing on actual
|
||||
* hardware has shown that we just need to write the desired
|
||||
* CCK divider into the Punit register.
|
||||
*/
|
||||
cmd = DIV_ROUND_CLOSEST(dev_priv->hpll_freq << 1, cdclk) - 1;
|
||||
|
||||
mutex_lock(&dev_priv->rps.hw_lock);
|
||||
val = vlv_punit_read(dev_priv, PUNIT_REG_DSPFREQ);
|
||||
val &= ~DSPFREQGUAR_MASK_CHV;
|
||||
@ -5040,10 +5039,6 @@ static int valleyview_calc_cdclk(struct drm_i915_private *dev_priv,
|
||||
int freq_320 = (dev_priv->hpll_freq << 1) % 320000 != 0 ? 333333 : 320000;
|
||||
int limit = IS_CHERRYVIEW(dev_priv) ? 95 : 90;
|
||||
|
||||
/* FIXME: Punit isn't quite ready yet */
|
||||
if (IS_CHERRYVIEW(dev_priv->dev))
|
||||
return 400000;
|
||||
|
||||
/*
|
||||
* Really only a few cases to deal with, as only 4 CDclks are supported:
|
||||
* 200MHz
|
||||
@ -5719,10 +5714,6 @@ static int valleyview_get_display_clock_speed(struct drm_device *dev)
|
||||
u32 val;
|
||||
int divider;
|
||||
|
||||
/* FIXME: Punit isn't quite ready yet */
|
||||
if (IS_CHERRYVIEW(dev))
|
||||
return 400000;
|
||||
|
||||
if (dev_priv->hpll_freq == 0)
|
||||
dev_priv->hpll_freq = valleyview_get_vco(dev_priv);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user