drm/i915/chv: Use RMW to toggle swing calc init
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 9 Apr 2014 10:29:04 +0000 (13:29 +0300)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 20 May 2014 13:53:09 +0000 (15:53 +0200)
The spec only tells us to set individual bits here and there. So we use
RMW for most things. Do the same for the swing calc init.

Eventually we should optimize things to just blast the final value in
with group access whenever possible. But to do that someone needs to
take a good look at what's the reset value for each registers, and
possibly if the BIOS manages to frob with some of them. For now
use RMW access always.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Mika Kuoppala <mika.kuoppala@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/intel_dp.c
drivers/gpu/drm/i915/intel_hdmi.c

index 8bcc5e2313f5ba5d66595898a6f1ba82a87c6066..89025e4d0709efb2704e8e10ecaf3f549a1b9c21 100644 (file)
@@ -703,6 +703,13 @@ enum punit_power_well {
 #define   DPIO_PCS_SWING_CALC_TX1_TX3  (1<<31)
 #define CHV_PCS_DW10(ch) _PORT(ch, _CHV_PCS_DW10_CH0, _CHV_PCS_DW10_CH1)
 
+#define _VLV_PCS01_DW10_CH0            0x0228
+#define _VLV_PCS23_DW10_CH0            0x0428
+#define _VLV_PCS01_DW10_CH1            0x2628
+#define _VLV_PCS23_DW10_CH1            0x2828
+#define VLV_PCS01_DW10(port) _PORT(port, _VLV_PCS01_DW10_CH0, _VLV_PCS01_DW10_CH1)
+#define VLV_PCS23_DW10(port) _PORT(port, _VLV_PCS23_DW10_CH0, _VLV_PCS23_DW10_CH1)
+
 #define _VLV_PCS_DW11_CH0              0x822c
 #define _VLV_PCS_DW11_CH1              0x842c
 #define VLV_PCS_DW11(ch) _PORT(ch, _VLV_PCS_DW11_CH0, _VLV_PCS_DW11_CH1)
index f36904c14666da394ed839a142076b188086b1b0..2016b561b15bb0527a59656c2bf83837571d8bbc 100644 (file)
@@ -2390,7 +2390,13 @@ static uint32_t intel_chv_signal_levels(struct intel_dp *intel_dp)
        mutex_lock(&dev_priv->dpio_lock);
 
        /* Clear calc init */
-       vlv_dpio_write(dev_priv, pipe, CHV_PCS_DW10(ch), 0);
+       val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
+       val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
+       vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val);
+
+       val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch));
+       val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
+       vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
 
        /* Program swing deemph */
        for (i = 0; i < 4; i++) {
@@ -2441,8 +2447,13 @@ static uint32_t intel_chv_signal_levels(struct intel_dp *intel_dp)
        }
 
        /* Start swing calculation */
-       vlv_dpio_write(dev_priv, pipe, CHV_PCS_DW10(ch),
-               (DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3));
+       val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
+       val |= DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3;
+       vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val);
+
+       val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch));
+       val |= DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3;
+       vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
 
        /* LRC Bypass */
        val = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW30);
index 9d9b019953fb1d3faf568f7043f0747f1ad7f62b..171d0dd0239ab44430bb5ffd5a2acd900296906b 100644 (file)
@@ -1326,7 +1326,13 @@ static void chv_hdmi_pre_enable(struct intel_encoder *encoder)
        /* FIXME: Fix up value only after power analysis */
 
        /* Clear calc init */
-       vlv_dpio_write(dev_priv, pipe, CHV_PCS_DW10(ch), 0);
+       val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
+       val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
+       vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val);
+
+       val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch));
+       val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
+       vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
 
        /* FIXME: Program the support xxx V-dB */
        /* Use 800mV-0dB */
@@ -1365,9 +1371,13 @@ static void chv_hdmi_pre_enable(struct intel_encoder *encoder)
                                (0x9a << DPIO_UNIQ_TRANS_SCALE_SHIFT));
 #endif
        /* Start swing calculation */
-       vlv_dpio_write(dev_priv, pipe, CHV_PCS_DW10(ch),
-                       DPIO_PCS_SWING_CALC_TX0_TX2 |
-                       DPIO_PCS_SWING_CALC_TX1_TX3);
+       val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
+       val |= DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3;
+       vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val);
+
+       val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch));
+       val |= DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3;
+       vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
 
        /* LRC Bypass */
        val = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW30);