drm/amd/display: Read DP_SINK_COUNT_ESI range on HPD for DP 1.4
authorNikola Cornij <nikola.cornij@amd.com>
Wed, 9 May 2018 17:11:35 +0000 (13:11 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 29 May 2018 19:01:48 +0000 (14:01 -0500)
DP 1.4 compliance now requires that registers at DP_SINK_COUNT_ESI range
(0x2002-0x2003, 0x200c-0x200f) are read instead of DP_SINK_COUNT range
(0x200-0x2005.

Signed-off-by: Nikola Cornij <nikola.cornij@amd.com>
Reviewed-by: Tony Cheng <Tony.Cheng@amd.com>
Acked-by: Harry Wentland <harry.wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c

index 3fcb67c..7857cb4 100644 (file)
@@ -1630,17 +1630,42 @@ static enum dc_status read_hpd_rx_irq_data(
        struct dc_link *link,
        union hpd_irq_data *irq_data)
 {
+       static enum dc_status retval;
+
        /* The HW reads 16 bytes from 200h on HPD,
         * but if we get an AUX_DEFER, the HW cannot retry
         * and this causes the CTS tests 4.3.2.1 - 3.2.4 to
         * fail, so we now explicitly read 6 bytes which is
         * the req from the above mentioned test cases.
+        *
+        * For DP 1.4 we need to read those from 2002h range.
         */
-       return core_link_read_dpcd(
-       link,
-       DP_SINK_COUNT,
-       irq_data->raw,
-       sizeof(union hpd_irq_data));
+       if (link->dpcd_caps.dpcd_rev.raw < DPCD_REV_14)
+               retval = core_link_read_dpcd(
+                       link,
+                       DP_SINK_COUNT,
+                       irq_data->raw,
+                       sizeof(union hpd_irq_data));
+       else {
+               /* Read 2 bytes at this location,... */
+               retval = core_link_read_dpcd(
+                       link,
+                       DP_SINK_COUNT_ESI,
+                       irq_data->raw,
+                       2);
+
+               if (retval != DC_OK)
+                       return retval;
+
+               /* ... then read remaining 4 at the other location */
+               retval = core_link_read_dpcd(
+                       link,
+                       DP_LANE0_1_STATUS_ESI,
+                       &irq_data->raw[2],
+                       4);
+       }
+
+       return retval;
 }
 
 static bool allow_hpd_rx_irq(const struct dc_link *link)