diff options
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.patch | 61 |
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 + |