This patch process phy compliance request by programming requested
vswing, pre-emphasis and test pattern.

Signed-off-by: Animesh Manna <animesh.ma...@intel.com>
---
 drivers/gpu/drm/i915/display/intel_dp.c | 62 +++++++++++++++++++++++++
 1 file changed, 62 insertions(+)

diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
b/drivers/gpu/drm/i915/display/intel_dp.c
index 93b1ce80c174..dd4c3a81c11d 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -4817,14 +4817,76 @@ static inline void intel_dp_phy_pattern_update(struct 
intel_dp *intel_dp)
        }
 }
 
+static void
+intel_dp_autotest_phy_ddi_disable(struct intel_dp *intel_dp)
+{
+       struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
+       struct drm_device *dev = intel_dig_port->base.base.dev;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       enum port port = intel_dig_port->base.port;
+       u32 ddi_buf_ctl_value, dp_tp_ctl_value, trans_ddi_func_ctl_value;
+
+       ddi_buf_ctl_value = I915_READ(DDI_BUF_CTL(port));
+       dp_tp_ctl_value = I915_READ(DP_TP_CTL(port));
+       trans_ddi_func_ctl_value = I915_READ(TRANS_DDI_FUNC_CTL(port));
+
+       ddi_buf_ctl_value        &= ~(DDI_BUF_CTL_ENABLE | DDI_PORT_WIDTH_MASK);
+       dp_tp_ctl_value          &= ~DP_TP_CTL_ENABLE;
+       trans_ddi_func_ctl_value &= ~(TRANS_DDI_FUNC_ENABLE |
+                                     DDI_PORT_WIDTH_MASK);
+
+       I915_WRITE(DDI_BUF_CTL(port), ddi_buf_ctl_value);
+       I915_WRITE(DP_TP_CTL(port), dp_tp_ctl_value);
+       I915_WRITE(TRANS_DDI_FUNC_CTL(port), trans_ddi_func_ctl_value);
+}
+
+static void
+intel_dp_autotest_phy_ddi_enable(struct intel_dp *intel_dp, uint8_t lane_cnt)
+{
+       struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
+       struct drm_device *dev = intel_dig_port->base.base.dev;
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       enum port port = intel_dig_port->base.port;
+       u32 ddi_buf_ctl_value, dp_tp_ctl_value, trans_ddi_func_ctl_value;
+
+       ddi_buf_ctl_value = I915_READ(DDI_BUF_CTL(port));
+       dp_tp_ctl_value = I915_READ(DP_TP_CTL(port));
+       trans_ddi_func_ctl_value = I915_READ(TRANS_DDI_FUNC_CTL(port));
+
+       ddi_buf_ctl_value        |= DDI_BUF_CTL_ENABLE |
+                                   DDI_PORT_WIDTH(lane_cnt);
+       dp_tp_ctl_value          |= DP_TP_CTL_ENABLE;
+       trans_ddi_func_ctl_value |= TRANS_DDI_FUNC_ENABLE |
+                                   DDI_PORT_WIDTH(lane_cnt);
+
+       I915_WRITE(TRANS_DDI_FUNC_CTL(port), trans_ddi_func_ctl_value);
+       I915_WRITE(DP_TP_CTL(port), dp_tp_ctl_value);
+       I915_WRITE(DDI_BUF_CTL(port), ddi_buf_ctl_value);
+}
+
 static u8 intel_dp_autotest_phy_pattern(struct intel_dp *intel_dp)
 {
        u8 test_result = DP_TEST_NAK;
+       struct drm_dp_phy_test_params *data =
+               &intel_dp->compliance.test_data.phytest;
 
        test_result = intel_dp_prepare_phytest(intel_dp);
        if (test_result != DP_TEST_ACK)
                DRM_ERROR("Phy test preparation failed\n");
 
+       intel_dp_autotest_phy_ddi_disable(intel_dp);
+
+       intel_dp_set_signal_levels(intel_dp);
+
+       intel_dp_phy_pattern_update(intel_dp);
+
+       intel_dp_autotest_phy_ddi_enable(intel_dp, data->link.num_lanes);
+
+       drm_dp_set_phy_test_pattern(&intel_dp->aux, data);
+
+       /* Set test active flag here so userspace doesn't interrupt things */
+       intel_dp->compliance.test_active = 1;
+
        return test_result;
 }
 
-- 
2.22.0

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to