aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0565-drm-amd-dal-Move-enabling-of-stream-link-to-dc_link.patch
blob: 223e106adf7bd18dca68971d08d4600ceab6fbd1 (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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
From c5a1ee9146c9d2e4212dc85bc71a08b34db60e05 Mon Sep 17 00:00:00 2001
From: Harry Wentland <harry.wentland@amd.com>
Date: Wed, 2 Dec 2015 11:41:18 -0500
Subject: [PATCH 0565/1110] drm/amd/dal: Move enabling of stream & link to
 dc_link

Signed-off-by: Harry Wentland <harry.wentland@amd.com>
Acked-by: Harry Wentland <harry.wentland@amd.com>
---
 drivers/gpu/drm/amd/dal/dc/core/dc_link.c          | 68 ++++++++++++++++++++++
 drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c     |  5 +-
 .../drm/amd/dal/dc/dce110/dce110_hw_sequencer.c    | 65 ++-------------------
 drivers/gpu/drm/amd/dal/dc/inc/core_types.h        |  4 ++
 drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h      |  9 +++
 5 files changed, 90 insertions(+), 61 deletions(-)

diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
index d8bf8e9..f29aea7 100644
--- a/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
+++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link.c
@@ -1090,3 +1090,71 @@ void core_link_resume(struct core_link *link)
 		DELAY_ON_CONNECT_IN_MS,
 		DELAY_ON_DISCONNECT_IN_MS);
 }
+
+
+static enum dc_status allocate_mst_payload(struct core_stream *stream)
+{
+	struct core_link *link = stream->sink->link;
+	struct link_encoder *link_encoder = link->link_enc;
+	struct stream_encoder *stream_encoder = stream->stream_enc;
+	struct dp_mst_stream_allocation_table table = {0};
+	struct fixed31_32 avg_time_slots_per_mtp;
+	uint8_t cur_stream_payload_idx;
+	struct dc *dc = stream->ctx->dc;
+
+	/* enable_link_dp_mst already check link->enabled_stream_count
+	 * and stream is in link->stream[]. This is called during set mode,
+	 * stream_enc is available.
+	 */
+
+	/* get calculate VC payload for stream: stream_alloc */
+	dc_helpers_dp_mst_write_payload_allocation_table(
+		stream->ctx,
+		&stream->public,
+		&table,
+		true);
+
+	/* program DP source TX for payload */
+	dc->hwss.update_mst_stream_allocation_table(
+		link_encoder,
+		&table);
+
+	/* send down message */
+	dc_helpers_dp_mst_poll_for_allocation_change_trigger(
+			stream->ctx,
+			&stream->public);
+
+	dc_helpers_dp_mst_send_payload_allocation(
+			stream->ctx,
+			&stream->public,
+			true);
+
+	/* slot X.Y for only current stream */
+	cur_stream_payload_idx = table.cur_stream_payload_idx;
+	avg_time_slots_per_mtp = dal_fixed31_32_from_fraction(
+		table.stream_allocations[cur_stream_payload_idx].pbn,
+		table.stream_allocations[cur_stream_payload_idx].pbn_per_slot);
+
+	dc->hwss.set_mst_bandwidth(
+		stream_encoder,
+		avg_time_slots_per_mtp);
+
+	return DC_OK;
+
+}
+
+void core_link_enable_stream(
+		struct core_link *link,
+		struct core_stream *stream)
+{
+	struct dc *dc = stream->ctx->dc;
+
+	dc->hwss.enable_stream(stream);
+
+	if (DC_OK != core_link_enable(stream)) {
+			BREAK_TO_DEBUGGER();
+			return;
+	}
+	if (stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST)
+		allocate_mst_payload(stream);
+}
diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c b/drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c
index 2913d5c..4c9eae4 100644
--- a/drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c
+++ b/drivers/gpu/drm/amd/dal/dc/core/dc_link_hwss.c
@@ -9,6 +9,10 @@
 #include "include/connector_interface.h"
 #include "hw_sequencer.h"
 #include "include/ddc_service_interface.h"
+#include "dc_helpers.h"
+#include "dce110/dce110_link_encoder.h"
+#include "dce110/dce110_stream_encoder.h"
+
 
 enum dc_status core_link_read_dpcd(
 	struct core_link* link,
@@ -191,4 +195,3 @@ void dp_set_hw_test_pattern(
 
 	link->ctx->dc->hwss.encoder_set_dp_phy_pattern(encoder, &pattern_param);
 }
-
diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c
index 1d289ba..fa71095 100644
--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_hw_sequencer.c
@@ -774,56 +774,6 @@ static enum color_space get_output_color_space(
 	return color_space;
 }
 
-static enum dc_status allocate_mst_payload(struct core_stream *stream)
-{
-	struct core_link *link = stream->sink->link;
-	struct link_encoder *link_encoder = link->link_enc;
-	struct stream_encoder *stream_encoder = stream->stream_enc;
-	struct dp_mst_stream_allocation_table table = {0};
-	struct fixed31_32 avg_time_slots_per_mtp;
-	uint8_t cur_stream_payload_idx;
-
-	/* enable_link_dp_mst already check link->enabled_stream_count
-	 * and stream is in link->stream[]. This is called during set mode,
-	 * stream_enc is available.
-	 */
-
-	/* get calculate VC payload for stream: stream_alloc */
-	dc_helpers_dp_mst_write_payload_allocation_table(
-		stream->ctx,
-		&stream->public,
-		&table,
-		true);
-
-	/* program DP source TX for payload */
-	dce110_link_encoder_update_mst_stream_allocation_table(
-		link_encoder,
-		&table);
-
-	/* send down message */
-	dc_helpers_dp_mst_poll_for_allocation_change_trigger(
-			stream->ctx,
-			&stream->public);
-
-	dc_helpers_dp_mst_send_payload_allocation(
-			stream->ctx,
-			&stream->public,
-			true);
-
-	/* slot X.Y for only current stream */
-	cur_stream_payload_idx = table.cur_stream_payload_idx;
-	avg_time_slots_per_mtp = dal_fixed31_32_from_fraction(
-		table.stream_allocations[cur_stream_payload_idx].pbn,
-		table.stream_allocations[cur_stream_payload_idx].pbn_per_slot);
-
-	dce110_stream_encoder_set_mst_bandwidth(
-		stream_encoder,
-		avg_time_slots_per_mtp);
-
-	return DC_OK;
-
-}
-
 static enum dc_status deallocate_mst_payload(struct core_stream *stream)
 {
 	struct core_link *link = stream->sink->link;
@@ -991,15 +941,7 @@ static enum dc_status apply_single_controller_ctx_to_hw(uint8_t controller_idx,
 			color_space);
 
 	if (timing_changed) {
-		enable_stream(stream);
-
-		if (DC_OK != core_link_enable(stream)) {
-				BREAK_TO_DEBUGGER();
-				return DC_ERROR_UNEXPECTED;
-		}
-		if (stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST)
-			allocate_mst_payload(stream);
-
+		core_link_enable_stream(stream->sink->link, stream);
 	}
 
 	if (dc_is_dp_signal(stream->signal))
@@ -1854,7 +1796,10 @@ static const struct hw_sequencer_funcs dce110_funcs = {
 	.validate_bandwidth = dce110_validate_bandwidth,
 	.enable_display_pipe_clock_gating = dce110_enable_display_pipe_clock_gating,
 	.enable_display_power_gating = dce110_enable_display_power_gating,
-	.program_bw = dce110_program_bw
+	.program_bw = dce110_program_bw,
+	.enable_stream = enable_stream,
+	.update_mst_stream_allocation_table = dce110_link_encoder_update_mst_stream_allocation_table,
+	.set_mst_bandwidth = dce110_stream_encoder_set_mst_bandwidth
 };
 
 bool dce110_hw_sequencer_construct(struct dc *dc)
diff --git a/drivers/gpu/drm/amd/dal/dc/inc/core_types.h b/drivers/gpu/drm/amd/dal/dc/inc/core_types.h
index bea3c36..299b13e 100644
--- a/drivers/gpu/drm/amd/dal/dc/inc/core_types.h
+++ b/drivers/gpu/drm/amd/dal/dc/inc/core_types.h
@@ -244,6 +244,10 @@ enum dc_status dc_link_validate_mode_timing(
 
 void core_link_resume(struct core_link *link);
 
+void core_link_enable_stream(
+		struct core_link *link,
+		struct core_stream *stream);
+
 /********** DAL Core*********************/
 #include "display_clock_interface.h"
 
diff --git a/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h b/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h
index 3114fbd..0502c4d 100644
--- a/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h
+++ b/drivers/gpu/drm/amd/dal/dc/inc/hw_sequencer.h
@@ -154,7 +154,16 @@ struct hw_sequencer_funcs {
 	void (*program_bw)(
 					struct dc *dc,
 					struct validate_context *context);
+	void (*enable_stream)(
+					struct core_stream *stream);
 
+	void (*update_mst_stream_allocation_table)(
+					struct link_encoder *enc,
+					const struct dp_mst_stream_allocation_table *table);
+
+	void (*set_mst_bandwidth)(
+					struct stream_encoder *enc,
+					struct fixed31_32 avg_time_slots_per_mtp);
 };
 
 bool dc_construct_hw_sequencer(
-- 
2.7.4