aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0658-drm-amd-dal-add-bw_result-logging.patch
blob: ec95e49169864b93c1415a09d3a1f582013f69dd (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
From b96d5c9da90d267519257bf183d48e3442af4dd9 Mon Sep 17 00:00:00 2001
From: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Date: Tue, 5 Jan 2016 12:02:31 -0500
Subject: [PATCH 0658/1110] drm/amd/dal: add bw_result logging

Also fixed number of taps used for multi-sisplay config bw calculations.
Utils part of the change fixes line endings.

Signed-off-by: Dmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Signed-off-by: Harry Wentland <harry.wentland@amd.com>
Acked-by: Harry Wentland <Harry.Wentland@amd.com>
---
 drivers/gpu/drm/amd/dal/dc/basics/logger.c         | 18 +++--
 .../drm/amd/dal/dc/dce110/dce110_hw_sequencer.c    |  4 +-
 .../gpu/drm/amd/dal/dc/dce110/dce110_resource.c    | 92 +++++++++++++++++++---
 3 files changed, 96 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/amd/dal/dc/basics/logger.c b/drivers/gpu/drm/amd/dal/dc/basics/logger.c
index 5aadda7..b2bf14f 100644
--- a/drivers/gpu/drm/amd/dal/dc/basics/logger.c
+++ b/drivers/gpu/drm/amd/dal/dc/basics/logger.c
@@ -241,7 +241,8 @@ struct log_major_mask_info {
 
 #define LG_SYNC_MSK (1 << LOG_MINOR_SYNC_TIMING)
 
-#define LG_BWM_MSK (1 << LOG_MINOR_BWM_MODE_VALIDATION)
+#define LG_BWM_MSK (1 << LOG_MINOR_BWM_MODE_VALIDATION) | \
+		(1 << LOG_MINOR_BWM_REQUIRED_BANDWIDTH_CALCS)
 
 
 static const struct log_major_mask_info log_major_mask_info_tbl[] = {
@@ -620,7 +621,8 @@ void dal_logger_write(
 			/* Concatenate onto end of entry buffer */
 			append_entry(&entry, buffer, size);
 		} else {
-			append_entry(&entry, "LOG_ERROR\n", 12);
+			append_entry(&entry,
+				"LOG_ERROR, line too long or null\n", 35);
 		}
 
 		dal_logger_close(&entry);
@@ -658,7 +660,12 @@ void dal_logger_append(
 
 		size = dal_log_to_buffer(
 			buffer, DAL_LOGGER_BUFFER_MAX_LOG_LINE_SIZE, msg, args);
-		append_entry(entry, buffer, size);
+
+		if (size < DAL_LOGGER_BUFFER_MAX_LOG_LINE_SIZE - 1) {
+			append_entry(entry, buffer, size);
+		} else {
+			append_entry(entry, "LOG_ERROR, line too long\n", 27);
+		}
 
 		va_end(args);
 	}
@@ -758,11 +765,10 @@ void dal_logger_open(
 
 	entry->buf = dc_service_alloc(
 		logger->ctx,
-		DAL_LOGGER_BUFFER_MAX_LOG_LINE_SIZE * sizeof(char));
+		DAL_LOGGER_BUFFER_MAX_SIZE * sizeof(char));
 
 	entry->buf_offset = 0;
-	entry->max_buf_bytes =
-			DAL_LOGGER_BUFFER_MAX_LOG_LINE_SIZE * sizeof(char);
+	entry->max_buf_bytes = DAL_LOGGER_BUFFER_MAX_SIZE * sizeof(char);
 
 	logger->open_count++;
 	entry->major = major;
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 b71f7e7..fa6b9b4 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
@@ -1286,7 +1286,9 @@ static enum dc_status apply_ctx_to_hw(
 	/*TODO: when pplib works*/
 	/*dc_set_clocks_and_clock_state(context);*/
 
-	set_display_clock(context);
+	if (context->bw_results.dispclk_khz
+		> dc->current_context.bw_results.dispclk_khz)
+		set_display_clock(context);
 
 	for (i = 0; i < pool->controller_count; i++) {
 		struct controller_ctx *ctlr_ctx
diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c
index 0e38513..cb084da 100644
--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c
+++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_resource.c
@@ -489,6 +489,8 @@ enum dc_status dce110_validate_bandwidth(
 	uint8_t i, j;
 	enum dc_status result = DC_ERROR_UNEXPECTED;
 	uint8_t number_of_displays = 0;
+	uint8_t max_htaps = 1;
+	uint8_t max_vtaps = 1;
 	bool all_displays_in_sync = true;
 	struct dc_crtc_timing prev_timing;
 
@@ -504,8 +506,16 @@ enum dc_status dce110_validate_bandwidth(
 
 			if (target->status.surface_count == 0) {
 				disp->graphics_scale_ratio = bw_int_to_fixed(1);
-				disp->graphics_h_taps = 4;
-				disp->graphics_v_taps = 4;
+				disp->graphics_h_taps = 2;
+				disp->graphics_v_taps = 2;
+
+				/* TODO: remove when bw formula accepts taps per
+				 * display
+				 */
+				if (max_vtaps < 2)
+					max_vtaps = 2;
+				if (max_htaps < 2)
+					max_htaps = 2;
 
 			} else {
 				disp->graphics_scale_ratio =
@@ -513,6 +523,14 @@ enum dc_status dce110_validate_bandwidth(
 						stream->ratios.vert.value);
 				disp->graphics_h_taps = stream->taps.h_taps;
 				disp->graphics_v_taps = stream->taps.v_taps;
+
+				/* TODO: remove when bw formula accepts taps per
+				 * display
+				 */
+				if (max_vtaps < stream->taps.v_taps)
+					max_vtaps = stream->taps.v_taps;
+				if (max_htaps < stream->taps.h_taps)
+					max_htaps = stream->taps.h_taps;
 			}
 
 			disp->graphics_src_width =
@@ -550,15 +568,23 @@ enum dc_status dce110_validate_bandwidth(
 		}
 	}
 
+	/* TODO: remove when bw formula accepts taps per
+	 * display
+	 */
+	context->bw_mode_data.displays_data[0].graphics_v_taps = max_vtaps;
+	context->bw_mode_data.displays_data[0].graphics_h_taps = max_htaps;
+
 	context->bw_mode_data.number_of_displays = number_of_displays;
 	context->bw_mode_data.display_synchronization_enabled =
 							all_displays_in_sync;
 
-	dal_logger_write(dc->ctx->logger,
+	dal_logger_write(
+		dc->ctx->logger,
 		LOG_MAJOR_BWM,
 		LOG_MINOR_BWM_REQUIRED_BANDWIDTH_CALCS,
-		"%s: Start bandwidth calculations",
+		"%s: start",
 		__func__);
+
 	if (!bw_calcs(
 			dc->ctx,
 			&dc->bw_dceip,
@@ -576,13 +602,57 @@ enum dc_status dce110_validate_bandwidth(
 			"%s: Bandwidth validation failed!",
 			__func__);
 
-	dal_logger_write(dc->ctx->logger,
-		LOG_MAJOR_BWM,
-		LOG_MINOR_BWM_REQUIRED_BANDWIDTH_CALCS,
-		"%s: Finish bandwidth calculations\n nbpMark: %d",
-		__func__,
-		context->bw_results.nbp_state_change_wm_ns[0].b_mark);
-
+	if (dal_memcmp(&dc->current_context.bw_results,
+			&context->bw_results, sizeof(context->bw_results))) {
+		struct log_entry log_entry;
+		dal_logger_open(
+			dc->ctx->logger,
+			&log_entry,
+			LOG_MAJOR_BWM,
+			LOG_MINOR_BWM_REQUIRED_BANDWIDTH_CALCS);
+		dal_logger_append(&log_entry, "%s: finish, numDisplays: %d\n"
+			"nbpMark_b: %d nbpMark_a: %d urgentMark_b: %d urgentMark_a: %d\n"
+			"stutMark_b: %d stutMark_a: %d\n",
+			__func__, number_of_displays,
+			context->bw_results.nbp_state_change_wm_ns[0].b_mark,
+			context->bw_results.nbp_state_change_wm_ns[0].a_mark,
+			context->bw_results.urgent_wm_ns[0].b_mark,
+			context->bw_results.urgent_wm_ns[0].a_mark,
+			context->bw_results.stutter_exit_wm_ns[0].b_mark,
+			context->bw_results.stutter_exit_wm_ns[0].a_mark);
+		dal_logger_append(&log_entry,
+			"nbpMark_b: %d nbpMark_a: %d urgentMark_b: %d urgentMark_a: %d\n"
+			"stutMark_b: %d stutMark_a: %d\n",
+			context->bw_results.nbp_state_change_wm_ns[1].b_mark,
+			context->bw_results.nbp_state_change_wm_ns[1].a_mark,
+			context->bw_results.urgent_wm_ns[1].b_mark,
+			context->bw_results.urgent_wm_ns[1].a_mark,
+			context->bw_results.stutter_exit_wm_ns[1].b_mark,
+			context->bw_results.stutter_exit_wm_ns[1].a_mark);
+		dal_logger_append(&log_entry,
+			"nbpMark_b: %d nbpMark_a: %d urgentMark_b: %d urgentMark_a: %d\n"
+			"stutMark_b: %d stutMark_a: %d stutter_mode_enable: %d\n",
+			context->bw_results.nbp_state_change_wm_ns[2].b_mark,
+			context->bw_results.nbp_state_change_wm_ns[2].a_mark,
+			context->bw_results.urgent_wm_ns[2].b_mark,
+			context->bw_results.urgent_wm_ns[2].a_mark,
+			context->bw_results.stutter_exit_wm_ns[2].b_mark,
+			context->bw_results.stutter_exit_wm_ns[2].a_mark,
+			context->bw_results.stutter_mode_enable);
+		dal_logger_append(&log_entry,
+			"cstate: %d pstate: %d nbpstate: %d sync: %d dispclk: %d\n"
+			"sclk: %d sclk_sleep: %d yclk: %d blackout_duration: %d\n",
+			context->bw_results.cpuc_state_change_enable,
+			context->bw_results.cpup_state_change_enable,
+			context->bw_results.nbp_state_change_enable,
+			context->bw_results.all_displays_in_sync,
+			context->bw_results.dispclk_khz,
+			context->bw_results.required_sclk,
+			context->bw_results.required_sclk_deep_sleep,
+			context->bw_results.required_yclk,
+			context->bw_results.required_blackout_duration_us);
+		dal_logger_close(&log_entry);
+	}
 	return result;
 }
 
-- 
2.7.4