aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/4540-drm-amd-display-Optimize-DP_SINK_STATUS_ESI-range-re.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/4540-drm-amd-display-Optimize-DP_SINK_STATUS_ESI-range-re.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/4540-drm-amd-display-Optimize-DP_SINK_STATUS_ESI-range-re.patch61
1 files changed, 61 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/4540-drm-amd-display-Optimize-DP_SINK_STATUS_ESI-range-re.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/4540-drm-amd-display-Optimize-DP_SINK_STATUS_ESI-range-re.patch
new file mode 100644
index 00000000..2af3f786
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/4540-drm-amd-display-Optimize-DP_SINK_STATUS_ESI-range-re.patch
@@ -0,0 +1,61 @@
+From 43aefd39dbea27c0f6e238ed519f90946fc1e78b Mon Sep 17 00:00:00 2001
+From: Nikola Cornij <nikola.cornij@amd.com>
+Date: Wed, 9 May 2018 17:07:36 -0400
+Subject: [PATCH 4540/5725] drm/amd/display: Optimize DP_SINK_STATUS_ESI range
+ read on HPD
+
+DP_SINK_STATUS_ESI range data is not continual, but rather than
+getting it in two AUX reads, it's quicker to read more bytes in a
+AUX read and then memcpy the required fields (it's only 8 more
+bytes to read).
+
+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>
+---
+ drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | 22 +++++++++++++---------
+ 1 file changed, 13 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
+index 9b66634..72a8a55 100644
+--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
++++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
+@@ -1647,22 +1647,26 @@ static enum dc_status read_hpd_rx_irq_data(
+ irq_data->raw,
+ sizeof(union hpd_irq_data));
+ else {
+- /* Read 2 bytes at this location,... */
++ /* Read 14 bytes in a single read and then copy only the required fields.
++ * This is more efficient than doing it in two separate AUX reads. */
++
++ uint8_t tmp[DP_SINK_STATUS_ESI - DP_SINK_COUNT_ESI + 1];
++
+ retval = core_link_read_dpcd(
+ link,
+ DP_SINK_COUNT_ESI,
+- irq_data->raw,
+- 2);
++ tmp,
++ sizeof(tmp));
+
+ 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);
++ irq_data->bytes.sink_cnt.raw = tmp[DP_SINK_COUNT_ESI - DP_SINK_COUNT_ESI];
++ irq_data->bytes.device_service_irq.raw = tmp[DP_DEVICE_SERVICE_IRQ_VECTOR_ESI0 - DP_SINK_COUNT_ESI];
++ irq_data->bytes.lane01_status.raw = tmp[DP_LANE0_1_STATUS_ESI - DP_SINK_COUNT_ESI];
++ irq_data->bytes.lane23_status.raw = tmp[DP_LANE2_3_STATUS_ESI - DP_SINK_COUNT_ESI];
++ irq_data->bytes.lane_status_updated.raw = tmp[DP_LANE_ALIGN_STATUS_UPDATED_ESI - DP_SINK_COUNT_ESI];
++ irq_data->bytes.sink_status.raw = tmp[DP_SINK_STATUS_ESI - DP_SINK_COUNT_ESI];
+ }
+
+ return retval;
+--
+2.7.4
+