|
@@ -1630,17 +1630,42 @@ static enum dc_status read_hpd_rx_irq_data(
|
|
struct dc_link *link,
|
|
struct dc_link *link,
|
|
union hpd_irq_data *irq_data)
|
|
union hpd_irq_data *irq_data)
|
|
{
|
|
{
|
|
|
|
+ static enum dc_status retval;
|
|
|
|
+
|
|
/* The HW reads 16 bytes from 200h on HPD,
|
|
/* The HW reads 16 bytes from 200h on HPD,
|
|
* but if we get an AUX_DEFER, the HW cannot retry
|
|
* 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
|
|
* and this causes the CTS tests 4.3.2.1 - 3.2.4 to
|
|
* fail, so we now explicitly read 6 bytes which is
|
|
* fail, so we now explicitly read 6 bytes which is
|
|
* the req from the above mentioned test cases.
|
|
* 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)
|
|
static bool allow_hpd_rx_irq(const struct dc_link *link)
|