xref: /aosp_15_r20/external/igt-gpu-tools/tests/amdgpu/amd_bypass.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright 2019 Advanced Micro Devices, Inc.
3*d83cc019SAndroid Build Coastguard Worker  *
4*d83cc019SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker  *
11*d83cc019SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included in
12*d83cc019SAndroid Build Coastguard Worker  * all copies or substantial portions of the Software.
13*d83cc019SAndroid Build Coastguard Worker  *
14*d83cc019SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*d83cc019SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*d83cc019SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17*d83cc019SAndroid Build Coastguard Worker  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18*d83cc019SAndroid Build Coastguard Worker  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19*d83cc019SAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20*d83cc019SAndroid Build Coastguard Worker  * OTHER DEALINGS IN THE SOFTWARE.
21*d83cc019SAndroid Build Coastguard Worker  *
22*d83cc019SAndroid Build Coastguard Worker  */
23*d83cc019SAndroid Build Coastguard Worker #include "igt.h"
24*d83cc019SAndroid Build Coastguard Worker 
25*d83cc019SAndroid Build Coastguard Worker /*
26*d83cc019SAndroid Build Coastguard Worker  * internal use
27*d83cc019SAndroid Build Coastguard Worker  * Common test data
28*d83cc019SAndroid Build Coastguard Worker  * */
29*d83cc019SAndroid Build Coastguard Worker typedef struct {
30*d83cc019SAndroid Build Coastguard Worker 	int drm_fd;
31*d83cc019SAndroid Build Coastguard Worker 	int width;
32*d83cc019SAndroid Build Coastguard Worker 	int height;
33*d83cc019SAndroid Build Coastguard Worker 	enum pipe pipe_id;
34*d83cc019SAndroid Build Coastguard Worker 	igt_display_t display;
35*d83cc019SAndroid Build Coastguard Worker 	igt_plane_t *primary;
36*d83cc019SAndroid Build Coastguard Worker 	igt_output_t *output;
37*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_t *pipe;
38*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_crc_t *pipe_crc;
39*d83cc019SAndroid Build Coastguard Worker 	igt_crc_t crc_fb;
40*d83cc019SAndroid Build Coastguard Worker 	igt_crc_t crc_dprx;
41*d83cc019SAndroid Build Coastguard Worker 	drmModeModeInfo *mode;
42*d83cc019SAndroid Build Coastguard Worker } data_t;
43*d83cc019SAndroid Build Coastguard Worker 
44*d83cc019SAndroid Build Coastguard Worker enum pattern {
45*d83cc019SAndroid Build Coastguard Worker 	TEST_PATTERN_DP_COLOR_RAMP,
46*d83cc019SAndroid Build Coastguard Worker 	TEST_PATTERN_DP_BLACK_WHITE_VERT_LINES,
47*d83cc019SAndroid Build Coastguard Worker 	TEST_PATTERN_DP_BLACK_WHITE_HORZ_LINES,
48*d83cc019SAndroid Build Coastguard Worker 	TEST_PATTERN_DP_COLOR_SQUARES_VESA,
49*d83cc019SAndroid Build Coastguard Worker 	/* please don't add pattern after the below line */
50*d83cc019SAndroid Build Coastguard Worker 	TEST_PATTERN_MAX,
51*d83cc019SAndroid Build Coastguard Worker };
52*d83cc019SAndroid Build Coastguard Worker 
53*d83cc019SAndroid Build Coastguard Worker const char *ptnstr[TEST_PATTERN_MAX] = {
54*d83cc019SAndroid Build Coastguard Worker 	"DP Color Ramp",
55*d83cc019SAndroid Build Coastguard Worker 	"DP Vertical Lines",
56*d83cc019SAndroid Build Coastguard Worker 	"DP Horizontal Lines",
57*d83cc019SAndroid Build Coastguard Worker 	"DP Color Squares VESA"
58*d83cc019SAndroid Build Coastguard Worker };
59*d83cc019SAndroid Build Coastguard Worker 
60*d83cc019SAndroid Build Coastguard Worker /* Common test setup. */
test_init(data_t * data)61*d83cc019SAndroid Build Coastguard Worker static void test_init(data_t *data)
62*d83cc019SAndroid Build Coastguard Worker {
63*d83cc019SAndroid Build Coastguard Worker 	igt_display_t *display = &data->display;
64*d83cc019SAndroid Build Coastguard Worker 
65*d83cc019SAndroid Build Coastguard Worker 	/* It doesn't matter which pipe we choose on amdpgu. */
66*d83cc019SAndroid Build Coastguard Worker 	data->pipe_id = PIPE_A;
67*d83cc019SAndroid Build Coastguard Worker 	data->pipe = &data->display.pipes[data->pipe_id];
68*d83cc019SAndroid Build Coastguard Worker 
69*d83cc019SAndroid Build Coastguard Worker 	igt_display_reset(display);
70*d83cc019SAndroid Build Coastguard Worker 
71*d83cc019SAndroid Build Coastguard Worker 	data->output = igt_get_single_output_for_pipe(display, data->pipe_id);
72*d83cc019SAndroid Build Coastguard Worker 	igt_assert(data->output);
73*d83cc019SAndroid Build Coastguard Worker 
74*d83cc019SAndroid Build Coastguard Worker 	data->mode = igt_output_get_mode(data->output);
75*d83cc019SAndroid Build Coastguard Worker 	igt_assert(data->mode);
76*d83cc019SAndroid Build Coastguard Worker 
77*d83cc019SAndroid Build Coastguard Worker 	data->primary =
78*d83cc019SAndroid Build Coastguard Worker 		igt_pipe_get_plane_type(data->pipe, DRM_PLANE_TYPE_PRIMARY);
79*d83cc019SAndroid Build Coastguard Worker 
80*d83cc019SAndroid Build Coastguard Worker 	data->pipe_crc = igt_pipe_crc_new(data->drm_fd, data->pipe_id,
81*d83cc019SAndroid Build Coastguard Worker 					  AMDGPU_PIPE_CRC_SOURCE_DPRX);
82*d83cc019SAndroid Build Coastguard Worker 
83*d83cc019SAndroid Build Coastguard Worker 	igt_output_set_pipe(data->output, data->pipe_id);
84*d83cc019SAndroid Build Coastguard Worker 
85*d83cc019SAndroid Build Coastguard Worker 	data->width = data->mode->hdisplay;
86*d83cc019SAndroid Build Coastguard Worker 	data->height = data->mode->vdisplay;
87*d83cc019SAndroid Build Coastguard Worker }
88*d83cc019SAndroid Build Coastguard Worker 
89*d83cc019SAndroid Build Coastguard Worker /* Common test cleanup. */
test_fini(data_t * data)90*d83cc019SAndroid Build Coastguard Worker static void test_fini(data_t *data)
91*d83cc019SAndroid Build Coastguard Worker {
92*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_crc_free(data->pipe_crc);
93*d83cc019SAndroid Build Coastguard Worker 	igt_display_reset(&data->display);
94*d83cc019SAndroid Build Coastguard Worker }
95*d83cc019SAndroid Build Coastguard Worker 
96*d83cc019SAndroid Build Coastguard Worker /*
97*d83cc019SAndroid Build Coastguard Worker  * draw the DP color ramp test pattern
98*d83cc019SAndroid Build Coastguard Worker  * Reference: DP Link CTS 1.2 Core r1.1, sec. 3.1.5.1
99*d83cc019SAndroid Build Coastguard Worker  */
draw_dp_test_pattern_color_ramp(igt_fb_t * fb)100*d83cc019SAndroid Build Coastguard Worker static void draw_dp_test_pattern_color_ramp(igt_fb_t *fb)
101*d83cc019SAndroid Build Coastguard Worker {
102*d83cc019SAndroid Build Coastguard Worker 	const int h = 64;  /* test pattern rectangle height */
103*d83cc019SAndroid Build Coastguard Worker 	const int block_h = h * 4; /* block height of R-G-B-White rectangles */
104*d83cc019SAndroid Build Coastguard Worker 	void *ptr_fb;
105*d83cc019SAndroid Build Coastguard Worker 	uint8_t *data;
106*d83cc019SAndroid Build Coastguard Worker 	int x,y;
107*d83cc019SAndroid Build Coastguard Worker 	int i;
108*d83cc019SAndroid Build Coastguard Worker 	uint8_t val;
109*d83cc019SAndroid Build Coastguard Worker 
110*d83cc019SAndroid Build Coastguard Worker 	/*
111*d83cc019SAndroid Build Coastguard Worker 	 * 64-by-256 pixels per rectangle
112*d83cc019SAndroid Build Coastguard Worker 	 * R-G-B-White rectangle in order in vertical
113*d83cc019SAndroid Build Coastguard Worker 	 * duplicate in horizontal
114*d83cc019SAndroid Build Coastguard Worker 	 */
115*d83cc019SAndroid Build Coastguard Worker 	ptr_fb = igt_fb_map_buffer(fb->fd, fb);
116*d83cc019SAndroid Build Coastguard Worker 	igt_assert(ptr_fb);
117*d83cc019SAndroid Build Coastguard Worker 	data = ptr_fb + fb->offsets[0];
118*d83cc019SAndroid Build Coastguard Worker 
119*d83cc019SAndroid Build Coastguard Worker 	switch (fb->drm_format) {
120*d83cc019SAndroid Build Coastguard Worker 	case DRM_FORMAT_XRGB8888:
121*d83cc019SAndroid Build Coastguard Worker 		for (y = 0; y < fb->height; ++y) {
122*d83cc019SAndroid Build Coastguard Worker 			for (x = 0, val = 0; x < fb->width; ++x, ++val) {
123*d83cc019SAndroid Build Coastguard Worker 				i = x * 4 + y * fb->strides[0];
124*d83cc019SAndroid Build Coastguard Worker 
125*d83cc019SAndroid Build Coastguard Worker 				/* vertical R-G-B-White rect */
126*d83cc019SAndroid Build Coastguard Worker 				if ((y % block_h) < h) {	    /* Red */
127*d83cc019SAndroid Build Coastguard Worker 					data[i + 2] = val;
128*d83cc019SAndroid Build Coastguard Worker 					data[i + 1] = 0;
129*d83cc019SAndroid Build Coastguard Worker 					data[i + 0] = 0;
130*d83cc019SAndroid Build Coastguard Worker 				} else if ((y % block_h) < 2 * h) { /* Green */
131*d83cc019SAndroid Build Coastguard Worker 					data[i + 2] = 0;
132*d83cc019SAndroid Build Coastguard Worker 					data[i + 1] = val;
133*d83cc019SAndroid Build Coastguard Worker 					data[i + 0] = 0;
134*d83cc019SAndroid Build Coastguard Worker 				} else if ((y % block_h) < 3 * h) { /* Blue */
135*d83cc019SAndroid Build Coastguard Worker 					data[i + 2] = 0;
136*d83cc019SAndroid Build Coastguard Worker 					data[i + 1] = 0;
137*d83cc019SAndroid Build Coastguard Worker 					data[i + 0] = val;
138*d83cc019SAndroid Build Coastguard Worker 				} else {			    /* White */
139*d83cc019SAndroid Build Coastguard Worker 					data[i + 2] = val;
140*d83cc019SAndroid Build Coastguard Worker 					data[i + 1] = val;
141*d83cc019SAndroid Build Coastguard Worker 					data[i + 0] = val;
142*d83cc019SAndroid Build Coastguard Worker 				}
143*d83cc019SAndroid Build Coastguard Worker 			}
144*d83cc019SAndroid Build Coastguard Worker 		}
145*d83cc019SAndroid Build Coastguard Worker 		break;
146*d83cc019SAndroid Build Coastguard Worker 	default:
147*d83cc019SAndroid Build Coastguard Worker 		igt_assert_f(0, "DRM Format Invalid");
148*d83cc019SAndroid Build Coastguard Worker 		break;
149*d83cc019SAndroid Build Coastguard Worker 	}
150*d83cc019SAndroid Build Coastguard Worker 
151*d83cc019SAndroid Build Coastguard Worker 	igt_fb_unmap_buffer(fb, ptr_fb);
152*d83cc019SAndroid Build Coastguard Worker }
153*d83cc019SAndroid Build Coastguard Worker 
154*d83cc019SAndroid Build Coastguard Worker /*
155*d83cc019SAndroid Build Coastguard Worker  * draw the DP vertical lines test pattern
156*d83cc019SAndroid Build Coastguard Worker  * Reference: DP Link CTS 1.2 Core r1.1, sec. 3.1.5.2
157*d83cc019SAndroid Build Coastguard Worker  */
draw_dp_test_pattern_vert_lines(igt_fb_t * fb)158*d83cc019SAndroid Build Coastguard Worker static void draw_dp_test_pattern_vert_lines(igt_fb_t *fb)
159*d83cc019SAndroid Build Coastguard Worker {
160*d83cc019SAndroid Build Coastguard Worker 	void *ptr_fb;
161*d83cc019SAndroid Build Coastguard Worker 	uint8_t *data;
162*d83cc019SAndroid Build Coastguard Worker 	int x, y;
163*d83cc019SAndroid Build Coastguard Worker 	int i;
164*d83cc019SAndroid Build Coastguard Worker 
165*d83cc019SAndroid Build Coastguard Worker 	/* alternating black and white lines, 1 pixel wide */
166*d83cc019SAndroid Build Coastguard Worker 	ptr_fb = igt_fb_map_buffer(fb->fd, fb);
167*d83cc019SAndroid Build Coastguard Worker 	igt_assert(ptr_fb);
168*d83cc019SAndroid Build Coastguard Worker 	data = ptr_fb + fb->offsets[0];
169*d83cc019SAndroid Build Coastguard Worker 
170*d83cc019SAndroid Build Coastguard Worker 	switch (fb->drm_format) {
171*d83cc019SAndroid Build Coastguard Worker 	case DRM_FORMAT_XRGB8888:
172*d83cc019SAndroid Build Coastguard Worker 		for (y = 0; y < fb->height; ++y) {
173*d83cc019SAndroid Build Coastguard Worker 			for (x = 0; x < fb->width; ++x) {
174*d83cc019SAndroid Build Coastguard Worker 				i = x * 4 + y * fb->strides[0];
175*d83cc019SAndroid Build Coastguard Worker 
176*d83cc019SAndroid Build Coastguard Worker 				if ((x & 1) == 0) {
177*d83cc019SAndroid Build Coastguard Worker 					data[i + 2] = 0xff; /* R */
178*d83cc019SAndroid Build Coastguard Worker 					data[i + 1] = 0xff; /* G */
179*d83cc019SAndroid Build Coastguard Worker 					data[i + 0] = 0xff; /* B */
180*d83cc019SAndroid Build Coastguard Worker 				} else {
181*d83cc019SAndroid Build Coastguard Worker 					data[i + 2] = 0;
182*d83cc019SAndroid Build Coastguard Worker 					data[i + 1] = 0;
183*d83cc019SAndroid Build Coastguard Worker 					data[i + 0] = 0;
184*d83cc019SAndroid Build Coastguard Worker 				}
185*d83cc019SAndroid Build Coastguard Worker 			}
186*d83cc019SAndroid Build Coastguard Worker 		}
187*d83cc019SAndroid Build Coastguard Worker 		break;
188*d83cc019SAndroid Build Coastguard Worker 	default:
189*d83cc019SAndroid Build Coastguard Worker 		igt_assert_f(0, "DRM Format Invalid");
190*d83cc019SAndroid Build Coastguard Worker 		break;
191*d83cc019SAndroid Build Coastguard Worker 	}
192*d83cc019SAndroid Build Coastguard Worker 
193*d83cc019SAndroid Build Coastguard Worker 	igt_fb_unmap_buffer(fb, ptr_fb);
194*d83cc019SAndroid Build Coastguard Worker }
195*d83cc019SAndroid Build Coastguard Worker 
196*d83cc019SAndroid Build Coastguard Worker /* draw the DP horizontal lines test pattern */
draw_dp_test_pattern_horz_lines(igt_fb_t * fb)197*d83cc019SAndroid Build Coastguard Worker static void draw_dp_test_pattern_horz_lines(igt_fb_t *fb)
198*d83cc019SAndroid Build Coastguard Worker {
199*d83cc019SAndroid Build Coastguard Worker 	void *ptr_fb;
200*d83cc019SAndroid Build Coastguard Worker 	uint8_t *data;
201*d83cc019SAndroid Build Coastguard Worker 	int x, y;
202*d83cc019SAndroid Build Coastguard Worker 	int i;
203*d83cc019SAndroid Build Coastguard Worker 
204*d83cc019SAndroid Build Coastguard Worker 	/* alternating black and white horizontal lines, 1 pixel high */
205*d83cc019SAndroid Build Coastguard Worker 	ptr_fb = igt_fb_map_buffer(fb->fd, fb);
206*d83cc019SAndroid Build Coastguard Worker 	igt_assert(ptr_fb);
207*d83cc019SAndroid Build Coastguard Worker 	data = ptr_fb + fb->offsets[0];
208*d83cc019SAndroid Build Coastguard Worker 
209*d83cc019SAndroid Build Coastguard Worker 	switch (fb->drm_format) {
210*d83cc019SAndroid Build Coastguard Worker 	case DRM_FORMAT_XRGB8888:
211*d83cc019SAndroid Build Coastguard Worker 		for (y = 0; y < fb->height; ++y) {
212*d83cc019SAndroid Build Coastguard Worker 			for (x = 0; x < fb->width; ++x) {
213*d83cc019SAndroid Build Coastguard Worker 
214*d83cc019SAndroid Build Coastguard Worker 				i = x * 4 + y * fb->strides[0];
215*d83cc019SAndroid Build Coastguard Worker 
216*d83cc019SAndroid Build Coastguard Worker 				if ((y & 1) == 0) {
217*d83cc019SAndroid Build Coastguard Worker 					data[i + 2] = 0xff; /* R */
218*d83cc019SAndroid Build Coastguard Worker 					data[i + 1] = 0xff; /* G */
219*d83cc019SAndroid Build Coastguard Worker 					data[i + 0] = 0xff; /* B */
220*d83cc019SAndroid Build Coastguard Worker 				} else {
221*d83cc019SAndroid Build Coastguard Worker 					data[i + 2] = 0;
222*d83cc019SAndroid Build Coastguard Worker 					data[i + 1] = 0;
223*d83cc019SAndroid Build Coastguard Worker 					data[i + 0] = 0;
224*d83cc019SAndroid Build Coastguard Worker 				}
225*d83cc019SAndroid Build Coastguard Worker 			}
226*d83cc019SAndroid Build Coastguard Worker 		}
227*d83cc019SAndroid Build Coastguard Worker 		break;
228*d83cc019SAndroid Build Coastguard Worker 	default:
229*d83cc019SAndroid Build Coastguard Worker 		igt_assert_f(0, "DRM Format Invalid");
230*d83cc019SAndroid Build Coastguard Worker 		break;
231*d83cc019SAndroid Build Coastguard Worker 	}
232*d83cc019SAndroid Build Coastguard Worker 
233*d83cc019SAndroid Build Coastguard Worker 	igt_fb_unmap_buffer(fb, ptr_fb);
234*d83cc019SAndroid Build Coastguard Worker }
235*d83cc019SAndroid Build Coastguard Worker 
236*d83cc019SAndroid Build Coastguard Worker /*
237*d83cc019SAndroid Build Coastguard Worker  * draw the DP color squares VESA test pattern
238*d83cc019SAndroid Build Coastguard Worker  * Reference: DP Link CTS 1.2 Core r1.1, sec. 3.1.5.3
239*d83cc019SAndroid Build Coastguard Worker  */
draw_dp_test_pattern_color_squares_vesa(igt_fb_t * fb)240*d83cc019SAndroid Build Coastguard Worker static void draw_dp_test_pattern_color_squares_vesa(igt_fb_t *fb)
241*d83cc019SAndroid Build Coastguard Worker {
242*d83cc019SAndroid Build Coastguard Worker 	const int h = 64; /* test pattern square height/width */
243*d83cc019SAndroid Build Coastguard Worker 	const int block_h = h * 2; /* block height of the repetition pattern */
244*d83cc019SAndroid Build Coastguard Worker 	const int block_w = h * 8; /* block width of the repetition pattern */
245*d83cc019SAndroid Build Coastguard Worker 	const uint8_t rgb[3][2][8] = {
246*d83cc019SAndroid Build Coastguard Worker 		{/* Red table of the pattern squares */
247*d83cc019SAndroid Build Coastguard Worker 			{255, 255, 0, 0, 255, 255, 0, 0},
248*d83cc019SAndroid Build Coastguard Worker 			{0, 255, 255, 0, 0, 255, 255, 0},
249*d83cc019SAndroid Build Coastguard Worker 		},
250*d83cc019SAndroid Build Coastguard Worker 		{/* Green table */
251*d83cc019SAndroid Build Coastguard Worker 			{255, 255, 255, 255, 0, 0, 0, 0},
252*d83cc019SAndroid Build Coastguard Worker 			{0, 0, 0, 255, 255, 255, 255, 0},
253*d83cc019SAndroid Build Coastguard Worker 		},
254*d83cc019SAndroid Build Coastguard Worker 		{/* Blue table */
255*d83cc019SAndroid Build Coastguard Worker 			{255, 0, 255, 0, 255, 0, 255, 0},
256*d83cc019SAndroid Build Coastguard Worker 			{255, 0, 255, 0, 255, 0, 255, 0},
257*d83cc019SAndroid Build Coastguard Worker 		},
258*d83cc019SAndroid Build Coastguard Worker 	};
259*d83cc019SAndroid Build Coastguard Worker 
260*d83cc019SAndroid Build Coastguard Worker 	void *ptr_fb;
261*d83cc019SAndroid Build Coastguard Worker 	uint8_t *data;
262*d83cc019SAndroid Build Coastguard Worker 	int x, y;
263*d83cc019SAndroid Build Coastguard Worker 	int i, j, k;
264*d83cc019SAndroid Build Coastguard Worker 
265*d83cc019SAndroid Build Coastguard Worker 	ptr_fb = igt_fb_map_buffer(fb->fd, fb);
266*d83cc019SAndroid Build Coastguard Worker 	igt_assert(ptr_fb);
267*d83cc019SAndroid Build Coastguard Worker 	data = ptr_fb + fb->offsets[0];
268*d83cc019SAndroid Build Coastguard Worker 
269*d83cc019SAndroid Build Coastguard Worker 	switch (fb->drm_format) {
270*d83cc019SAndroid Build Coastguard Worker 	case DRM_FORMAT_XRGB8888:
271*d83cc019SAndroid Build Coastguard Worker 		for (y = 0; y < fb->height; ++y) {
272*d83cc019SAndroid Build Coastguard Worker 			for (x = 0; x < fb->width; ++x) {
273*d83cc019SAndroid Build Coastguard Worker 
274*d83cc019SAndroid Build Coastguard Worker 				i = x * 4 + y * fb->strides[0];
275*d83cc019SAndroid Build Coastguard Worker 				j = (y % block_h) / h;
276*d83cc019SAndroid Build Coastguard Worker 				k = (x % block_w) / h;
277*d83cc019SAndroid Build Coastguard Worker 
278*d83cc019SAndroid Build Coastguard Worker 				data[i + 2] = rgb[0][j][k]; /* R */
279*d83cc019SAndroid Build Coastguard Worker 				data[i + 1] = rgb[1][j][k]; /* G */
280*d83cc019SAndroid Build Coastguard Worker 				data[i + 0] = rgb[2][j][k]; /* B */
281*d83cc019SAndroid Build Coastguard Worker 			}
282*d83cc019SAndroid Build Coastguard Worker 		}
283*d83cc019SAndroid Build Coastguard Worker 		break;
284*d83cc019SAndroid Build Coastguard Worker 
285*d83cc019SAndroid Build Coastguard Worker 	default:
286*d83cc019SAndroid Build Coastguard Worker 		igt_assert_f(0, "DRM Format Invalid");
287*d83cc019SAndroid Build Coastguard Worker 		break;
288*d83cc019SAndroid Build Coastguard Worker 	}
289*d83cc019SAndroid Build Coastguard Worker 
290*d83cc019SAndroid Build Coastguard Worker 
291*d83cc019SAndroid Build Coastguard Worker 	igt_fb_unmap_buffer(fb, ptr_fb);
292*d83cc019SAndroid Build Coastguard Worker }
293*d83cc019SAndroid Build Coastguard Worker 
294*d83cc019SAndroid Build Coastguard Worker /* generate test pattern and fills a FB */
generate_test_pattern(igt_fb_t * fb,data_t * data,enum pattern ptn)295*d83cc019SAndroid Build Coastguard Worker static void generate_test_pattern(igt_fb_t *fb, data_t *data, enum pattern ptn)
296*d83cc019SAndroid Build Coastguard Worker {
297*d83cc019SAndroid Build Coastguard Worker 	igt_assert(fb->fd && (ptn < TEST_PATTERN_MAX));
298*d83cc019SAndroid Build Coastguard Worker 
299*d83cc019SAndroid Build Coastguard Worker 	if (ptn == TEST_PATTERN_DP_COLOR_RAMP) {
300*d83cc019SAndroid Build Coastguard Worker 		draw_dp_test_pattern_color_ramp(fb);
301*d83cc019SAndroid Build Coastguard Worker 	} else if (ptn == TEST_PATTERN_DP_BLACK_WHITE_VERT_LINES) {
302*d83cc019SAndroid Build Coastguard Worker 		draw_dp_test_pattern_vert_lines(fb);
303*d83cc019SAndroid Build Coastguard Worker 	} else if (ptn == TEST_PATTERN_DP_BLACK_WHITE_HORZ_LINES) {
304*d83cc019SAndroid Build Coastguard Worker 		draw_dp_test_pattern_horz_lines(fb);
305*d83cc019SAndroid Build Coastguard Worker 	} else if (ptn == TEST_PATTERN_DP_COLOR_SQUARES_VESA) {
306*d83cc019SAndroid Build Coastguard Worker 		draw_dp_test_pattern_color_squares_vesa(fb);
307*d83cc019SAndroid Build Coastguard Worker 	}
308*d83cc019SAndroid Build Coastguard Worker }
309*d83cc019SAndroid Build Coastguard Worker 
bypass_8bpc_test(data_t * data)310*d83cc019SAndroid Build Coastguard Worker static void bypass_8bpc_test(data_t *data)
311*d83cc019SAndroid Build Coastguard Worker {
312*d83cc019SAndroid Build Coastguard Worker 	igt_display_t *display = &data->display;
313*d83cc019SAndroid Build Coastguard Worker 	igt_fb_t fb;
314*d83cc019SAndroid Build Coastguard Worker 	enum pattern ptn;
315*d83cc019SAndroid Build Coastguard Worker 
316*d83cc019SAndroid Build Coastguard Worker 	test_init(data);
317*d83cc019SAndroid Build Coastguard Worker 
318*d83cc019SAndroid Build Coastguard Worker 	igt_create_fb(data->drm_fd, data->width, data->height,
319*d83cc019SAndroid Build Coastguard Worker 		      DRM_FORMAT_XRGB8888, LOCAL_DRM_FORMAT_MOD_NONE, &fb);
320*d83cc019SAndroid Build Coastguard Worker 
321*d83cc019SAndroid Build Coastguard Worker 	/*
322*d83cc019SAndroid Build Coastguard Worker 	 * Settings:
323*d83cc019SAndroid Build Coastguard Worker 	 *   no degamma
324*d83cc019SAndroid Build Coastguard Worker 	 *   no regamma
325*d83cc019SAndroid Build Coastguard Worker 	 *   no CTM
326*d83cc019SAndroid Build Coastguard Worker 	 */
327*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_replace_prop_blob(data->pipe, IGT_CRTC_DEGAMMA_LUT, NULL, 0);
328*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_replace_prop_blob(data->pipe, IGT_CRTC_GAMMA_LUT, NULL, 0);
329*d83cc019SAndroid Build Coastguard Worker 	igt_pipe_obj_replace_prop_blob(data->pipe, IGT_CRTC_CTM, NULL, 0);
330*d83cc019SAndroid Build Coastguard Worker 
331*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(data->primary, &fb);
332*d83cc019SAndroid Build Coastguard Worker 	igt_display_commit_atomic(display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
333*d83cc019SAndroid Build Coastguard Worker 
334*d83cc019SAndroid Build Coastguard Worker 	/* traverse all the test pattern to validate 8bpc bypass mode */
335*d83cc019SAndroid Build Coastguard Worker 	for (ptn = TEST_PATTERN_DP_COLOR_RAMP; ptn < TEST_PATTERN_MAX; ++ptn) {
336*d83cc019SAndroid Build Coastguard Worker 		igt_info("Test Pattern: %s\n", ptnstr[ptn]);
337*d83cc019SAndroid Build Coastguard Worker 
338*d83cc019SAndroid Build Coastguard Worker 		generate_test_pattern(&fb, data, ptn);
339*d83cc019SAndroid Build Coastguard Worker 
340*d83cc019SAndroid Build Coastguard Worker 		/* Grab FB and DPRX CRCs and compare */
341*d83cc019SAndroid Build Coastguard Worker 		igt_fb_calc_crc(&fb, &data->crc_fb);
342*d83cc019SAndroid Build Coastguard Worker 		igt_pipe_crc_collect_crc(data->pipe_crc, &data->crc_dprx);
343*d83cc019SAndroid Build Coastguard Worker 
344*d83cc019SAndroid Build Coastguard Worker 		igt_assert_crc_equal(&data->crc_fb, &data->crc_dprx);
345*d83cc019SAndroid Build Coastguard Worker 	}
346*d83cc019SAndroid Build Coastguard Worker 
347*d83cc019SAndroid Build Coastguard Worker 	igt_plane_set_fb(data->primary, NULL);
348*d83cc019SAndroid Build Coastguard Worker 	test_fini(data);
349*d83cc019SAndroid Build Coastguard Worker 	igt_remove_fb(data->drm_fd, &fb);
350*d83cc019SAndroid Build Coastguard Worker }
351*d83cc019SAndroid Build Coastguard Worker 
352*d83cc019SAndroid Build Coastguard Worker igt_main
353*d83cc019SAndroid Build Coastguard Worker {
354*d83cc019SAndroid Build Coastguard Worker 	data_t data;
355*d83cc019SAndroid Build Coastguard Worker 	memset(&data, 0, sizeof(data));
356*d83cc019SAndroid Build Coastguard Worker 
357*d83cc019SAndroid Build Coastguard Worker 	igt_skip_on_simulation();
358*d83cc019SAndroid Build Coastguard Worker 
359*d83cc019SAndroid Build Coastguard Worker 	igt_fixture {
360*d83cc019SAndroid Build Coastguard Worker 		data.drm_fd = drm_open_driver_master(DRIVER_AMDGPU);
361*d83cc019SAndroid Build Coastguard Worker 		if (data.drm_fd == -1)
362*d83cc019SAndroid Build Coastguard Worker 			igt_skip("Not an amdgpu driver.\n");
363*d83cc019SAndroid Build Coastguard Worker 		igt_require_pipe_crc(data.drm_fd);
364*d83cc019SAndroid Build Coastguard Worker 
365*d83cc019SAndroid Build Coastguard Worker 		kmstest_set_vt_graphics_mode();
366*d83cc019SAndroid Build Coastguard Worker 
367*d83cc019SAndroid Build Coastguard Worker 		igt_display_require(&data.display, data.drm_fd);
368*d83cc019SAndroid Build Coastguard Worker 		igt_require(data.display.is_atomic);
369*d83cc019SAndroid Build Coastguard Worker 		igt_display_require_output(&data.display);
370*d83cc019SAndroid Build Coastguard Worker 	}
371*d83cc019SAndroid Build Coastguard Worker 
372*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("8bpc-bypass-mode")
373*d83cc019SAndroid Build Coastguard Worker 		bypass_8bpc_test(&data);
374*d83cc019SAndroid Build Coastguard Worker 
375*d83cc019SAndroid Build Coastguard Worker 	igt_fixture {
376*d83cc019SAndroid Build Coastguard Worker 		igt_display_fini(&data.display);
377*d83cc019SAndroid Build Coastguard Worker 	}
378*d83cc019SAndroid Build Coastguard Worker }
379