aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/files/0733-drm-amd-dal-Disable-dithering-for-Diagnostics-enviro.patch
blob: a301c2dd88cac7907b96b71b31c2eff7956f77d3 (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
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
From 0a6fcf118b9bfaeffd3ff647afafc14638f0ea3e Mon Sep 17 00:00:00 2001
From: David Rokhvarg <David.Rokhvarg@amd.com>
Date: Fri, 22 Jan 2016 15:38:15 -0500
Subject: [PATCH 0733/1110] drm/amd/dal: Disable dithering for Diagnostics
 environment.

Signed-off-by: David Rokhvarg <David.Rokhvarg@amd.com>
Acked-by: Harry Wentland <harry.wentland@amd.com>
---
 .../gpu/drm/amd/dal/dc/adapter/adapter_service.c   |  6 +----
 drivers/gpu/drm/amd/dal/dc/core/dc_stream.c        | 25 ++++++++++++--------
 drivers/gpu/drm/amd/dal/dc/dc_types.h              | 23 ++++++++++++++++++
 .../drm/amd/dal/dc/dce110/dce110_hw_sequencer.c    |  5 ++--
 .../gpu/drm/amd/dal/dc/dce110/dce110_mem_input.c   |  4 ++--
 .../gpu/drm/amd/dal/dc/dce110/dce110_transform.h   |  3 ++-
 .../amd/dal/dc/dce110/dce110_transform_bit_depth.c | 27 +++++++++++++++-------
 drivers/gpu/drm/amd/dal/dc/gpio/hw_factory.c       |  5 +---
 drivers/gpu/drm/amd/dal/dc/gpio/hw_translate.c     |  5 +---
 drivers/gpu/drm/amd/dal/dc/i2caux/i2caux.c         |  5 +---
 drivers/gpu/drm/amd/dal/dc/inc/core_types.h        |  2 +-
 drivers/gpu/drm/amd/dal/dc/inc/transform.h         |  3 ++-
 drivers/gpu/drm/amd/dal/include/dal_types.h        |  8 -------
 13 files changed, 72 insertions(+), 49 deletions(-)

diff --git a/drivers/gpu/drm/amd/dal/dc/adapter/adapter_service.c b/drivers/gpu/drm/amd/dal/dc/adapter/adapter_service.c
index 66c5034..d0dd6c9 100644
--- a/drivers/gpu/drm/amd/dal/dc/adapter/adapter_service.c
+++ b/drivers/gpu/drm/amd/dal/dc/adapter/adapter_service.c
@@ -661,12 +661,8 @@ static struct hw_ctx_adapter_service *create_hw_ctx(
 	enum dce_environment dce_environment,
 	struct dc_context *ctx)
 {
-	switch (dce_environment) {
-	case DCE_ENV_DIAG_FPGA_MAXIMUS:
+	if (IS_FPGA_MAXIMUS_DC(dce_environment))
 		return dal_adapter_service_create_hw_ctx_diag(ctx);
-	default:
-		break;
-	}
 
 	switch (dce_version) {
 #if defined(CONFIG_DRM_AMD_DAL_DCE10_0)
diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_stream.c b/drivers/gpu/drm/amd/dal/dc/core/dc_stream.c
index 986368a..ab8999b 100644
--- a/drivers/gpu/drm/amd/dal/dc/core/dc_stream.c
+++ b/drivers/gpu/drm/amd/dal/dc/core/dc_stream.c
@@ -41,26 +41,33 @@ struct stream {
 /*******************************************************************************
  * Private functions
  ******************************************************************************/
-
 static void build_bit_depth_reduction_params(
+		const struct core_stream *stream,
 		struct bit_depth_reduction_params *fmt_bit_depth)
 {
+	dc_service_memset(fmt_bit_depth, 0, sizeof(*fmt_bit_depth));
+
 	/*TODO: Need to un-hardcode, refer to function with same name
 	 * in dal2 hw_sequencer*/
 
 	fmt_bit_depth->flags.TRUNCATE_ENABLED = 0;
 	fmt_bit_depth->flags.SPATIAL_DITHER_ENABLED = 0;
 	fmt_bit_depth->flags.FRAME_MODULATION_ENABLED = 0;
-	fmt_bit_depth->flags.SPATIAL_DITHER_DEPTH = 1;
 
-	fmt_bit_depth->flags.SPATIAL_DITHER_ENABLED = 1;
-	/* frame random is on by default */
-	fmt_bit_depth->flags.FRAME_RANDOM = 1;
-	/* apply RGB dithering */
-	fmt_bit_depth->flags.RGB_RANDOM = true;
+	/* Diagnostics need consistent CRC of the image, that means
+	 * dithering should not be enabled for Diagnostics. */
+	if (IS_DIAG_DC(stream->ctx->dce_environment) == false) {
 
-	return;
+		fmt_bit_depth->flags.SPATIAL_DITHER_DEPTH = 1;
+		fmt_bit_depth->flags.SPATIAL_DITHER_ENABLED = 1;
 
+		/* frame random is on by default */
+		fmt_bit_depth->flags.FRAME_RANDOM = 1;
+		/* apply RGB dithering */
+		fmt_bit_depth->flags.RGB_RANDOM = true;
+	}
+
+	return;
 }
 
 static void setup_pixel_encoding(
@@ -85,7 +92,7 @@ static bool construct(struct core_stream *stream,
 
 	dc_sink_retain(dc_sink_data);
 
-	build_bit_depth_reduction_params(&stream->fmt_bit_depth);
+	build_bit_depth_reduction_params(stream, &stream->bit_depth_params);
 	setup_pixel_encoding(&stream->clamping);
 
 	/* Copy audio modes */
diff --git a/drivers/gpu/drm/amd/dal/dc/dc_types.h b/drivers/gpu/drm/amd/dal/dc/dc_types.h
index b932ec1..18ecb0d 100644
--- a/drivers/gpu/drm/amd/dal/dc/dc_types.h
+++ b/drivers/gpu/drm/amd/dal/dc/dc_types.h
@@ -39,6 +39,29 @@ struct dc_link;
 struct dc_sink;
 struct dal;
 
+/********************************
+ * Environment definitions
+ ********************************/
+enum dce_environment {
+	DCE_ENV_PRODUCTION_DRV = 0,
+	/* Emulation on FPGA, in "Maximus" System.
+	 * This environment enforces that *only* DC registers accessed.
+	 * (access to non-DC registers will hang FPGA) */
+	DCE_ENV_FPGA_MAXIMUS,
+	/* Emulation on real HW or on FPGA. Used by Diagnostics, enforces
+	 * requirements of Diagnostics team. */
+	DCE_ENV_DIAG
+};
+
+/* Note: use these macro definitions instead of direct comparison! */
+#define IS_FPGA_MAXIMUS_DC(dce_environment) \
+	(dce_environment == DCE_ENV_FPGA_MAXIMUS)
+
+#define IS_DIAG_DC(dce_environment) \
+	(IS_FPGA_MAXIMUS_DC(dce_environment) || (dce_environment == DCE_ENV_DIAG))
+
+/********************************/
+
 #define MAX_EDID_BUFFER_SIZE 512
 
 /*Displayable pixel format in fb*/
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 1fc4c07..e716219 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
@@ -847,7 +847,7 @@ static enum dc_status apply_single_controller_ctx_to_hw(uint8_t controller_idx,
 			stream->public.timing.display_color_depth,
 			stream->sink->public.sink_signal);
 
-	program_fmt(opp, &stream->fmt_bit_depth, &stream->clamping);
+	program_fmt(opp, &stream->bit_depth_params, &stream->clamping);
 
 	stream->sink->link->link_enc->funcs->setup(
 		stream->sink->link->link_enc,
@@ -1350,7 +1350,8 @@ static bool setup_line_buffer_pixel_depth(
 		if (blank)
 			tg->funcs->wait_for_state(tg, CRTC_STATE_VBLANK);
 
-		return xfm->funcs->transform_set_pixel_storage_depth(xfm, depth);
+		return xfm->funcs->transform_set_pixel_storage_depth(xfm, depth,
+				&stream->bit_depth_params);
 	}
 
 	return false;
diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_mem_input.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_mem_input.c
index 392a075..f5cf5ad 100644
--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_mem_input.c
+++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_mem_input.c
@@ -842,7 +842,7 @@ void dce110_mem_input_allocate_dmif_buffer(
 	 * 02 - enable DMIF rdreq limit, disable by DMIF stall = 1
 	 * 03 - force enable DMIF rdreq limit, ignore DMIF stall / urgent
 	 */
-	if (!IS_DIAG_MAXIMUS_DC(mi->ctx)) {
+	if (!IS_FPGA_MAXIMUS_DC(mi->ctx->dce_environment)) {
 		addr = mmMC_HUB_RDREQ_DMIF_LIMIT;
 		value = dal_read_reg(mi->ctx, addr);
 
@@ -912,7 +912,7 @@ void dce110_mem_input_deallocate_dmif_buffer(
 	 * 02 - enable dmif rdreq limit, disable by dmif stall=1
 	 * 03 - force enable dmif rdreq limit, ignore dmif stall/urgent
 	 * Stella Wong proposed this change. */
-	if (!IS_DIAG_MAXIMUS_DC(mi->ctx)) {
+	if (!IS_FPGA_MAXIMUS_DC(mi->ctx->dce_environment)) {
 		value = dal_read_reg(mi->ctx, mmMC_HUB_RDREQ_DMIF_LIMIT);
 		if (paths_num > 1)
 			set_reg_field_value(value, 0, MC_HUB_RDREQ_DMIF_LIMIT, ENABLE);
diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform.h b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform.h
index 229f588..117aca3 100644
--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform.h
+++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform.h
@@ -76,7 +76,8 @@ void dce110_transform_set_gamut_remap(
 /* BIT DEPTH RELATED */
 bool dce110_transform_set_pixel_storage_depth(
 	struct transform *xfm,
-	enum lb_pixel_depth depth);
+	enum lb_pixel_depth depth,
+	const struct bit_depth_reduction_params *bit_depth_params);
 
 bool dce110_transform_get_current_pixel_storage_depth(
 	struct transform *xfm,
diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform_bit_depth.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform_bit_depth.c
index 747f2c7..3e0d151 100644
--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform_bit_depth.c
+++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_transform_bit_depth.c
@@ -114,7 +114,8 @@ static bool set_dither(
  */
 static bool program_bit_depth_reduction(
 	struct dce110_transform *xfm110,
-	enum dc_color_depth depth)
+	enum dc_color_depth depth,
+	const struct bit_depth_reduction_params *bit_depth_params)
 {
 	enum dcp_bit_depth_reduction_mode depth_reduction_mode;
 	enum dcp_spatial_dither_mode spatial_dither_mode;
@@ -127,19 +128,27 @@ static bool program_bit_depth_reduction(
 		return false;
 	}
 
-	depth_reduction_mode = DCP_BIT_DEPTH_REDUCTION_MODE_DITHER;
+	if (bit_depth_params->flags.SPATIAL_DITHER_ENABLED) {
+		depth_reduction_mode = DCP_BIT_DEPTH_REDUCTION_MODE_DITHER;
+		frame_random_enable = true;
+		rgb_random_enable = true;
+		highpass_random_enable = true;
+
+	} else {
+		depth_reduction_mode = DCP_BIT_DEPTH_REDUCTION_MODE_DISABLED;
+		frame_random_enable = false;
+		rgb_random_enable = false;
+		highpass_random_enable = false;
+	}
 
 	spatial_dither_mode = DCP_SPATIAL_DITHER_MODE_A_AA_A;
 
-	frame_random_enable = true;
-	rgb_random_enable = true;
-	highpass_random_enable = true;
-
 	if (!set_clamp(xfm110, depth)) {
 		/* Failure in set_clamp() */
 		ASSERT_CRITICAL(false);
 		return false;
 	}
+
 	switch (depth_reduction_mode) {
 	case DCP_BIT_DEPTH_REDUCTION_MODE_DITHER:
 		/*  Spatial Dither: Set round/truncate to bypass (12bit),
@@ -754,7 +763,8 @@ static void set_denormalization(
 
 bool dce110_transform_set_pixel_storage_depth(
 	struct transform *xfm,
-	enum lb_pixel_depth depth)
+	enum lb_pixel_depth depth,
+	const struct bit_depth_reduction_params *bit_depth_params)
 {
 	struct dce110_transform *xfm110 = TO_DCE110_TRANSFORM(xfm);
 	bool ret = true;
@@ -792,7 +802,8 @@ bool dce110_transform_set_pixel_storage_depth(
 
 	if (ret == true) {
 		set_denormalization(xfm110, color_depth);
-		ret = program_bit_depth_reduction(xfm110, color_depth);
+		ret = program_bit_depth_reduction(xfm110, color_depth,
+				bit_depth_params);
 
 		set_reg_field_value(value, 0, LB_DATA_FORMAT, ALPHA_EN);
 		dal_write_reg(
diff --git a/drivers/gpu/drm/amd/dal/dc/gpio/hw_factory.c b/drivers/gpu/drm/amd/dal/dc/gpio/hw_factory.c
index 7e93014..17b5fdf 100644
--- a/drivers/gpu/drm/amd/dal/dc/gpio/hw_factory.c
+++ b/drivers/gpu/drm/amd/dal/dc/gpio/hw_factory.c
@@ -56,12 +56,9 @@ bool dal_hw_factory_init(
 	enum dce_version dce_version,
 	enum dce_environment dce_environment)
 {
-	switch (dce_environment) {
-	case DCE_ENV_DIAG_FPGA_MAXIMUS:
+	if (IS_FPGA_MAXIMUS_DC(dce_environment)) {
 		dal_hw_factory_diag_fpga_init(factory);
 		return true;
-	default:
-		break;
 	}
 
 	switch (dce_version) {
diff --git a/drivers/gpu/drm/amd/dal/dc/gpio/hw_translate.c b/drivers/gpu/drm/amd/dal/dc/gpio/hw_translate.c
index 0e768df..d22504f 100644
--- a/drivers/gpu/drm/amd/dal/dc/gpio/hw_translate.c
+++ b/drivers/gpu/drm/amd/dal/dc/gpio/hw_translate.c
@@ -56,12 +56,9 @@ bool dal_hw_translate_init(
 	enum dce_version dce_version,
 	enum dce_environment dce_environment)
 {
-	switch (dce_environment) {
-	case DCE_ENV_DIAG_FPGA_MAXIMUS:
+	if (IS_FPGA_MAXIMUS_DC(dce_environment)) {
 		dal_hw_translate_diag_fpga_init(translate);
 		return true;
-	default:
-		break;
 	}
 
 	switch (dce_version) {
diff --git a/drivers/gpu/drm/amd/dal/dc/i2caux/i2caux.c b/drivers/gpu/drm/amd/dal/dc/i2caux/i2caux.c
index 941213d..68409b3 100644
--- a/drivers/gpu/drm/amd/dal/dc/i2caux/i2caux.c
+++ b/drivers/gpu/drm/amd/dal/dc/i2caux/i2caux.c
@@ -75,11 +75,8 @@ struct i2caux *dal_i2caux_create(
 	dce_version = dal_adapter_service_get_dce_version(as);
 	dce_environment = dal_adapter_service_get_dce_environment(as);
 
-	switch (dce_environment) {
-	case DCE_ENV_DIAG_FPGA_MAXIMUS:
+	if (IS_FPGA_MAXIMUS_DC(dce_environment)) {
 		return dal_i2caux_diag_fpga_create(as, ctx);
-	default:
-		break;
 	}
 
 	switch (dce_version) {
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 b0654ca..8282f99 100644
--- a/drivers/gpu/drm/amd/dal/dc/inc/core_types.h
+++ b/drivers/gpu/drm/amd/dal/dc/inc/core_types.h
@@ -120,7 +120,7 @@ struct core_stream {
 	/*fmt*/
 	/*TODO: AUTO new codepath in apply_context to hw to
 	 * generate these bw unrelated/no fail params*/
-	struct bit_depth_reduction_params fmt_bit_depth;
+	struct bit_depth_reduction_params bit_depth_params;/* used by DCP and FMT */
 	struct clamping_and_pixel_encoding_params clamping;
 	struct hw_info_frame info_frame;
 	struct encoder_info_frame encoder_info_frame;
diff --git a/drivers/gpu/drm/amd/dal/dc/inc/transform.h b/drivers/gpu/drm/amd/dal/dc/inc/transform.h
index 50dde2d..d453aac 100644
--- a/drivers/gpu/drm/amd/dal/dc/inc/transform.h
+++ b/drivers/gpu/drm/amd/dal/dc/inc/transform.h
@@ -204,7 +204,8 @@ struct transform_funcs {
 
 	bool (*transform_set_pixel_storage_depth)(
 		struct transform *xfm,
-		enum lb_pixel_depth depth);
+		enum lb_pixel_depth depth,
+		const struct bit_depth_reduction_params *bit_depth_params);
 
 	bool (*transform_get_current_pixel_storage_depth)(
 		struct transform *xfm,
diff --git a/drivers/gpu/drm/amd/dal/include/dal_types.h b/drivers/gpu/drm/amd/dal/include/dal_types.h
index 77bd09b..fe884da 100644
--- a/drivers/gpu/drm/amd/dal/include/dal_types.h
+++ b/drivers/gpu/drm/amd/dal/include/dal_types.h
@@ -44,12 +44,6 @@ enum dce_version {
 	DCE_VERSION_MAX
 };
 
-enum dce_environment {
-	DCE_ENV_PRODUCTION_DRV = 0,
-	DCE_ENV_DIAG_FPGA_MAXIMUS, /* Emulation on FPGA, in Maximus System. */
-	DCE_ENV_DIAG_SILICON, /* Emulation on real HW */
-};
-
 /*
  * ASIC Runtime Flags
  */
@@ -183,8 +177,6 @@ struct dc_context {
 	enum dce_environment dce_environment;
 };
 
-#define IS_DIAG_MAXIMUS_DC(dcctx) ((dcctx)->dce_environment == DCE_ENV_DIAG_FPGA_MAXIMUS)
-
 /* Wireless display structs */
 
 union dal_remote_display_cea_mode_bitmap {
-- 
2.7.4