aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0614-drm-amd-dal-check-stream-on-payload-table-update.patch
blob: 5e2e47ef7786bbf2fcb1235af8a909d8ca0623c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
From 07acd42b825ae77bcd0d41c0179b9eada8db54dd Mon Sep 17 00:00:00 2001
From: Mykola Lysenko <Mykola.Lysenko@amd.com>
Date: Mon, 14 Dec 2015 19:04:17 +0800
Subject: [PATCH 0614/1110] drm/amd/dal: check stream on payload table update

There is a situation when drm crtc moved from one connector
to another, and MST connector can lack DC target for one
commit. It should be guarded both in DM and DC

Signed-off-by: Mykola Lysenko <Mykola.Lysenko@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
Acked-by: Harry Wentland<harry.wentland@amd.com>
---
 .../gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c  |  8 ++++
 .../drm/amd/dal/dc/dce110/dce110_link_encoder.c    | 47 ++++++++++++++--------
 2 files changed, 38 insertions(+), 17 deletions(-)

diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c
index f2d1dc8..0230ee9 100644
--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c
+++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dc_helpers.c
@@ -311,6 +311,14 @@ bool dc_helpers_dp_mst_write_payload_allocation_table(
 			 * crtc -> target -> stream -> sink
 			 */
 			crtc = aconnector->base.state->crtc;
+
+			/*
+			 * this situation can happen when crtc moved from one
+			 * connector to another for any reason
+			 */
+			if (!crtc)
+				continue;
+
 			amdgpu_crtc = to_amdgpu_crtc(crtc);
 			dc_target = amdgpu_crtc->target;
 
diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_link_encoder.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_link_encoder.c
index 8ddccdf..d71efa9 100644
--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_link_encoder.c
+++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_link_encoder.c
@@ -1630,6 +1630,24 @@ void dce110_link_encoder_set_dp_phy_pattern(
 	}
 }
 
+static void fill_stream_allocation_row_info(
+	const struct dp_mst_stream_allocation *stream_allocation,
+	uint32_t *src,
+	uint32_t *slots)
+{
+	const struct dc_stream *dc_stream = stream_allocation->stream;
+	struct core_stream *core_stream;
+
+	if (dc_stream) {
+		core_stream = DC_STREAM_TO_CORE(dc_stream);
+		*src = core_stream->stream_enc->id;
+		*slots = stream_allocation->slot_count;
+	} else {
+		*src = 0;
+		*slots = 0;
+	}
+}
+
 /* programs DP MST VC payload allocation */
 void dce110_link_encoder_update_mst_stream_allocation_table(
 	struct link_encoder *enc,
@@ -1642,8 +1660,6 @@ void dce110_link_encoder_update_mst_stream_allocation_table(
 	uint32_t slots = 0;
 	uint32_t src = 0;
 	uint32_t retries = 0;
-	struct core_stream *core_stream = NULL;
-
 
 	/* For CZ, there are only 3 pipes. So Virtual channel is up 3.*/
 
@@ -1657,11 +1673,10 @@ void dce110_link_encoder_update_mst_stream_allocation_table(
 	value1 = dal_read_reg(ctx, DP_REG(mmDP_MSE_SAT1));
 
 	if (table->stream_count >= 1) {
-		core_stream =
-			DC_STREAM_TO_CORE(table->stream_allocations[0].stream);
-
-		src = core_stream->stream_enc->id;
-		slots = table->stream_allocations[0].slot_count;
+		fill_stream_allocation_row_info(
+			&table->stream_allocations[0],
+			&src,
+			&slots);
 	} else {
 		src = 0;
 		slots = 0;
@@ -1680,11 +1695,10 @@ void dce110_link_encoder_update_mst_stream_allocation_table(
 		DP_MSE_SAT_SLOT_COUNT0);
 
 	if (table->stream_count >= 2) {
-		core_stream =
-			DC_STREAM_TO_CORE(table->stream_allocations[1].stream);
-
-		src = core_stream->stream_enc->id;
-		slots = table->stream_allocations[1].slot_count;
+		fill_stream_allocation_row_info(
+			&table->stream_allocations[1],
+			&src,
+			&slots);
 	} else {
 		src = 0;
 		slots = 0;
@@ -1703,11 +1717,10 @@ void dce110_link_encoder_update_mst_stream_allocation_table(
 		DP_MSE_SAT_SLOT_COUNT1);
 
 	if (table->stream_count >= 3) {
-		core_stream =
-			DC_STREAM_TO_CORE(table->stream_allocations[2].stream);
-
-		src = core_stream->stream_enc->id;
-		slots = table->stream_allocations[2].slot_count;
+		fill_stream_allocation_row_info(
+			&table->stream_allocations[2],
+			&src,
+			&slots);
 	} else {
 		src = 0;
 		slots = 0;
-- 
2.7.4