1 /*
2  * v4l2-tpg-core.c - Test Pattern Generator
3  *
4  * Note: gen_twopix and tpg_gen_text are based on code from vivi.c. See the
5  * vivi.c source for the copyright information of those functions.
6  *
7  * Copyright 2014 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
8  *
9  * This program is free software; you may redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; version 2 of the License.
12  *
13  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
14  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
15  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
16  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
17  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
18  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20  * SOFTWARE.
21  */
22 
23 #include <linux/module.h>
24 #include <media/v4l2-tpg.h>
25 
26 /* Must remain in sync with enum tpg_pattern */
27 const char * const tpg_pattern_strings[] = {
28 	"75% Colorbar",
29 	"100% Colorbar",
30 	"CSC Colorbar",
31 	"Horizontal 100% Colorbar",
32 	"100% Color Squares",
33 	"100% Black",
34 	"100% White",
35 	"100% Red",
36 	"100% Green",
37 	"100% Blue",
38 	"16x16 Checkers",
39 	"2x2 Checkers",
40 	"1x1 Checkers",
41 	"2x2 Red/Green Checkers",
42 	"1x1 Red/Green Checkers",
43 	"Alternating Hor Lines",
44 	"Alternating Vert Lines",
45 	"One Pixel Wide Cross",
46 	"Two Pixels Wide Cross",
47 	"Ten Pixels Wide Cross",
48 	"Gray Ramp",
49 	"Noise",
50 	NULL
51 };
52 EXPORT_SYMBOL_GPL(tpg_pattern_strings);
53 
54 /* Must remain in sync with enum tpg_aspect */
55 const char * const tpg_aspect_strings[] = {
56 	"Source Width x Height",
57 	"4x3",
58 	"14x9",
59 	"16x9",
60 	"16x9 Anamorphic",
61 	NULL
62 };
63 EXPORT_SYMBOL_GPL(tpg_aspect_strings);
64 
65 /*
66  * Sine table: sin[0] = 127 * sin(-180 degrees)
67  *             sin[128] = 127 * sin(0 degrees)
68  *             sin[256] = 127 * sin(180 degrees)
69  */
70 static const s8 sin[257] = {
71 	   0,   -4,   -7,  -11,  -13,  -18,  -20,  -22,  -26,  -29,  -33,  -35,  -37,  -41,  -43,  -48,
72 	 -50,  -52,  -56,  -58,  -62,  -63,  -65,  -69,  -71,  -75,  -76,  -78,  -82,  -83,  -87,  -88,
73 	 -90,  -93,  -94,  -97,  -99, -101, -103, -104, -107, -108, -110, -111, -112, -114, -115, -117,
74 	-118, -119, -120, -121, -122, -123, -123, -124, -125, -125, -126, -126, -127, -127, -127, -127,
75 	-127, -127, -127, -127, -126, -126, -125, -125, -124, -124, -123, -122, -121, -120, -119, -118,
76 	-117, -116, -114, -113, -111, -110, -109, -107, -105, -103, -101, -100,  -97,  -96,  -93,  -91,
77 	 -90,  -87,  -85,  -82,  -80,  -76,  -75,  -73,  -69,  -67,  -63,  -62,  -60,  -56,  -54,  -50,
78 	 -48,  -46,  -41,  -39,  -35,  -33,  -31,  -26,  -24,  -20,  -18,  -15,  -11,   -9,   -4,   -2,
79 	   0,    2,    4,    9,   11,   15,   18,   20,   24,   26,   31,   33,   35,   39,   41,   46,
80 	  48,   50,   54,   56,   60,   62,   64,   67,   69,   73,   75,   76,   80,   82,   85,   87,
81 	  90,   91,   93,   96,   97,  100,  101,  103,  105,  107,  109,  110,  111,  113,  114,  116,
82 	 117,  118,  119,  120,  121,  122,  123,  124,  124,  125,  125,  126,  126,  127,  127,  127,
83 	 127,  127,  127,  127,  127,  126,  126,  125,  125,  124,  123,  123,  122,  121,  120,  119,
84 	 118,  117,  115,  114,  112,  111,  110,  108,  107,  104,  103,  101,   99,   97,   94,   93,
85 	  90,   88,   87,   83,   82,   78,   76,   75,   71,   69,   65,   64,   62,   58,   56,   52,
86 	  50,   48,   43,   41,   37,   35,   33,   29,   26,   22,   20,   18,   13,   11,    7,    4,
87 	   0,
88 };
89 
90 #define cos(idx) sin[((idx) + 64) % sizeof(sin)]
91 
92 /* Global font descriptor */
93 static const u8 *font8x16;
94 
95 void tpg_set_font(const u8 *f)
96 {
97 	font8x16 = f;
98 }
99 EXPORT_SYMBOL_GPL(tpg_set_font);
100 
101 void tpg_init(struct tpg_data *tpg, unsigned w, unsigned h)
102 {
103 	memset(tpg, 0, sizeof(*tpg));
104 	tpg->scaled_width = tpg->src_width = w;
105 	tpg->src_height = tpg->buf_height = h;
106 	tpg->crop.width = tpg->compose.width = w;
107 	tpg->crop.height = tpg->compose.height = h;
108 	tpg->recalc_colors = true;
109 	tpg->recalc_square_border = true;
110 	tpg->brightness = 128;
111 	tpg->contrast = 128;
112 	tpg->saturation = 128;
113 	tpg->hue = 0;
114 	tpg->mv_hor_mode = TPG_MOVE_NONE;
115 	tpg->mv_vert_mode = TPG_MOVE_NONE;
116 	tpg->field = V4L2_FIELD_NONE;
117 	tpg_s_fourcc(tpg, V4L2_PIX_FMT_RGB24);
118 	tpg->colorspace = V4L2_COLORSPACE_SRGB;
119 	tpg->perc_fill = 100;
120 }
121 EXPORT_SYMBOL_GPL(tpg_init);
122 
123 int tpg_alloc(struct tpg_data *tpg, unsigned max_w)
124 {
125 	unsigned pat;
126 	unsigned plane;
127 
128 	tpg->max_line_width = max_w;
129 	for (pat = 0; pat < TPG_MAX_PAT_LINES; pat++) {
130 		for (plane = 0; plane < TPG_MAX_PLANES; plane++) {
131 			unsigned pixelsz = plane ? 2 : 4;
132 
133 			tpg->lines[pat][plane] = vzalloc(max_w * 2 * pixelsz);
134 			if (!tpg->lines[pat][plane])
135 				return -ENOMEM;
136 			if (plane == 0)
137 				continue;
138 			tpg->downsampled_lines[pat][plane] = vzalloc(max_w * 2 * pixelsz);
139 			if (!tpg->downsampled_lines[pat][plane])
140 				return -ENOMEM;
141 		}
142 	}
143 	for (plane = 0; plane < TPG_MAX_PLANES; plane++) {
144 		unsigned pixelsz = plane ? 2 : 4;
145 
146 		tpg->contrast_line[plane] = vzalloc(max_w * pixelsz);
147 		if (!tpg->contrast_line[plane])
148 			return -ENOMEM;
149 		tpg->black_line[plane] = vzalloc(max_w * pixelsz);
150 		if (!tpg->black_line[plane])
151 			return -ENOMEM;
152 		tpg->random_line[plane] = vzalloc(max_w * 2 * pixelsz);
153 		if (!tpg->random_line[plane])
154 			return -ENOMEM;
155 	}
156 	return 0;
157 }
158 EXPORT_SYMBOL_GPL(tpg_alloc);
159 
160 void tpg_free(struct tpg_data *tpg)
161 {
162 	unsigned pat;
163 	unsigned plane;
164 
165 	for (pat = 0; pat < TPG_MAX_PAT_LINES; pat++)
166 		for (plane = 0; plane < TPG_MAX_PLANES; plane++) {
167 			vfree(tpg->lines[pat][plane]);
168 			tpg->lines[pat][plane] = NULL;
169 			if (plane == 0)
170 				continue;
171 			vfree(tpg->downsampled_lines[pat][plane]);
172 			tpg->downsampled_lines[pat][plane] = NULL;
173 		}
174 	for (plane = 0; plane < TPG_MAX_PLANES; plane++) {
175 		vfree(tpg->contrast_line[plane]);
176 		vfree(tpg->black_line[plane]);
177 		vfree(tpg->random_line[plane]);
178 		tpg->contrast_line[plane] = NULL;
179 		tpg->black_line[plane] = NULL;
180 		tpg->random_line[plane] = NULL;
181 	}
182 }
183 EXPORT_SYMBOL_GPL(tpg_free);
184 
185 bool tpg_s_fourcc(struct tpg_data *tpg, u32 fourcc)
186 {
187 	tpg->fourcc = fourcc;
188 	tpg->planes = 1;
189 	tpg->buffers = 1;
190 	tpg->recalc_colors = true;
191 	tpg->interleaved = false;
192 	tpg->vdownsampling[0] = 1;
193 	tpg->hdownsampling[0] = 1;
194 	tpg->hmask[0] = ~0;
195 	tpg->hmask[1] = ~0;
196 	tpg->hmask[2] = ~0;
197 
198 	switch (fourcc) {
199 	case V4L2_PIX_FMT_SBGGR8:
200 	case V4L2_PIX_FMT_SGBRG8:
201 	case V4L2_PIX_FMT_SGRBG8:
202 	case V4L2_PIX_FMT_SRGGB8:
203 	case V4L2_PIX_FMT_SBGGR10:
204 	case V4L2_PIX_FMT_SGBRG10:
205 	case V4L2_PIX_FMT_SGRBG10:
206 	case V4L2_PIX_FMT_SRGGB10:
207 	case V4L2_PIX_FMT_SBGGR12:
208 	case V4L2_PIX_FMT_SGBRG12:
209 	case V4L2_PIX_FMT_SGRBG12:
210 	case V4L2_PIX_FMT_SRGGB12:
211 		tpg->interleaved = true;
212 		tpg->vdownsampling[1] = 1;
213 		tpg->hdownsampling[1] = 1;
214 		tpg->planes = 2;
215 		/* fall through */
216 	case V4L2_PIX_FMT_RGB332:
217 	case V4L2_PIX_FMT_RGB565:
218 	case V4L2_PIX_FMT_RGB565X:
219 	case V4L2_PIX_FMT_RGB444:
220 	case V4L2_PIX_FMT_XRGB444:
221 	case V4L2_PIX_FMT_ARGB444:
222 	case V4L2_PIX_FMT_RGB555:
223 	case V4L2_PIX_FMT_XRGB555:
224 	case V4L2_PIX_FMT_ARGB555:
225 	case V4L2_PIX_FMT_RGB555X:
226 	case V4L2_PIX_FMT_XRGB555X:
227 	case V4L2_PIX_FMT_ARGB555X:
228 	case V4L2_PIX_FMT_BGR666:
229 	case V4L2_PIX_FMT_RGB24:
230 	case V4L2_PIX_FMT_BGR24:
231 	case V4L2_PIX_FMT_RGB32:
232 	case V4L2_PIX_FMT_BGR32:
233 	case V4L2_PIX_FMT_XRGB32:
234 	case V4L2_PIX_FMT_XBGR32:
235 	case V4L2_PIX_FMT_ARGB32:
236 	case V4L2_PIX_FMT_ABGR32:
237 	case V4L2_PIX_FMT_GREY:
238 	case V4L2_PIX_FMT_Y16:
239 	case V4L2_PIX_FMT_Y16_BE:
240 		tpg->is_yuv = false;
241 		break;
242 	case V4L2_PIX_FMT_YUV444:
243 	case V4L2_PIX_FMT_YUV555:
244 	case V4L2_PIX_FMT_YUV565:
245 	case V4L2_PIX_FMT_YUV32:
246 		tpg->is_yuv = true;
247 		break;
248 	case V4L2_PIX_FMT_YUV420M:
249 	case V4L2_PIX_FMT_YVU420M:
250 		tpg->buffers = 3;
251 		/* fall through */
252 	case V4L2_PIX_FMT_YUV420:
253 	case V4L2_PIX_FMT_YVU420:
254 		tpg->vdownsampling[1] = 2;
255 		tpg->vdownsampling[2] = 2;
256 		tpg->hdownsampling[1] = 2;
257 		tpg->hdownsampling[2] = 2;
258 		tpg->planes = 3;
259 		tpg->is_yuv = true;
260 		break;
261 	case V4L2_PIX_FMT_YUV422M:
262 	case V4L2_PIX_FMT_YVU422M:
263 		tpg->buffers = 3;
264 		/* fall through */
265 	case V4L2_PIX_FMT_YUV422P:
266 		tpg->vdownsampling[1] = 1;
267 		tpg->vdownsampling[2] = 1;
268 		tpg->hdownsampling[1] = 2;
269 		tpg->hdownsampling[2] = 2;
270 		tpg->planes = 3;
271 		tpg->is_yuv = true;
272 		break;
273 	case V4L2_PIX_FMT_NV16M:
274 	case V4L2_PIX_FMT_NV61M:
275 		tpg->buffers = 2;
276 		/* fall through */
277 	case V4L2_PIX_FMT_NV16:
278 	case V4L2_PIX_FMT_NV61:
279 		tpg->vdownsampling[1] = 1;
280 		tpg->hdownsampling[1] = 1;
281 		tpg->hmask[1] = ~1;
282 		tpg->planes = 2;
283 		tpg->is_yuv = true;
284 		break;
285 	case V4L2_PIX_FMT_NV12M:
286 	case V4L2_PIX_FMT_NV21M:
287 		tpg->buffers = 2;
288 		/* fall through */
289 	case V4L2_PIX_FMT_NV12:
290 	case V4L2_PIX_FMT_NV21:
291 		tpg->vdownsampling[1] = 2;
292 		tpg->hdownsampling[1] = 1;
293 		tpg->hmask[1] = ~1;
294 		tpg->planes = 2;
295 		tpg->is_yuv = true;
296 		break;
297 	case V4L2_PIX_FMT_YUV444M:
298 	case V4L2_PIX_FMT_YVU444M:
299 		tpg->buffers = 3;
300 		tpg->planes = 3;
301 		tpg->vdownsampling[1] = 1;
302 		tpg->vdownsampling[2] = 1;
303 		tpg->hdownsampling[1] = 1;
304 		tpg->hdownsampling[2] = 1;
305 		tpg->is_yuv = true;
306 		break;
307 	case V4L2_PIX_FMT_NV24:
308 	case V4L2_PIX_FMT_NV42:
309 		tpg->vdownsampling[1] = 1;
310 		tpg->hdownsampling[1] = 1;
311 		tpg->planes = 2;
312 		tpg->is_yuv = true;
313 		break;
314 	case V4L2_PIX_FMT_YUYV:
315 	case V4L2_PIX_FMT_UYVY:
316 	case V4L2_PIX_FMT_YVYU:
317 	case V4L2_PIX_FMT_VYUY:
318 		tpg->hmask[0] = ~1;
319 		tpg->is_yuv = true;
320 		break;
321 	default:
322 		return false;
323 	}
324 
325 	switch (fourcc) {
326 	case V4L2_PIX_FMT_GREY:
327 	case V4L2_PIX_FMT_RGB332:
328 		tpg->twopixelsize[0] = 2;
329 		break;
330 	case V4L2_PIX_FMT_RGB565:
331 	case V4L2_PIX_FMT_RGB565X:
332 	case V4L2_PIX_FMT_RGB444:
333 	case V4L2_PIX_FMT_XRGB444:
334 	case V4L2_PIX_FMT_ARGB444:
335 	case V4L2_PIX_FMT_RGB555:
336 	case V4L2_PIX_FMT_XRGB555:
337 	case V4L2_PIX_FMT_ARGB555:
338 	case V4L2_PIX_FMT_RGB555X:
339 	case V4L2_PIX_FMT_XRGB555X:
340 	case V4L2_PIX_FMT_ARGB555X:
341 	case V4L2_PIX_FMT_YUYV:
342 	case V4L2_PIX_FMT_UYVY:
343 	case V4L2_PIX_FMT_YVYU:
344 	case V4L2_PIX_FMT_VYUY:
345 	case V4L2_PIX_FMT_YUV444:
346 	case V4L2_PIX_FMT_YUV555:
347 	case V4L2_PIX_FMT_YUV565:
348 	case V4L2_PIX_FMT_Y16:
349 	case V4L2_PIX_FMT_Y16_BE:
350 		tpg->twopixelsize[0] = 2 * 2;
351 		break;
352 	case V4L2_PIX_FMT_RGB24:
353 	case V4L2_PIX_FMT_BGR24:
354 		tpg->twopixelsize[0] = 2 * 3;
355 		break;
356 	case V4L2_PIX_FMT_BGR666:
357 	case V4L2_PIX_FMT_RGB32:
358 	case V4L2_PIX_FMT_BGR32:
359 	case V4L2_PIX_FMT_XRGB32:
360 	case V4L2_PIX_FMT_XBGR32:
361 	case V4L2_PIX_FMT_ARGB32:
362 	case V4L2_PIX_FMT_ABGR32:
363 	case V4L2_PIX_FMT_YUV32:
364 		tpg->twopixelsize[0] = 2 * 4;
365 		break;
366 	case V4L2_PIX_FMT_NV12:
367 	case V4L2_PIX_FMT_NV21:
368 	case V4L2_PIX_FMT_NV12M:
369 	case V4L2_PIX_FMT_NV21M:
370 	case V4L2_PIX_FMT_NV16:
371 	case V4L2_PIX_FMT_NV61:
372 	case V4L2_PIX_FMT_NV16M:
373 	case V4L2_PIX_FMT_NV61M:
374 	case V4L2_PIX_FMT_SBGGR8:
375 	case V4L2_PIX_FMT_SGBRG8:
376 	case V4L2_PIX_FMT_SGRBG8:
377 	case V4L2_PIX_FMT_SRGGB8:
378 		tpg->twopixelsize[0] = 2;
379 		tpg->twopixelsize[1] = 2;
380 		break;
381 	case V4L2_PIX_FMT_SRGGB10:
382 	case V4L2_PIX_FMT_SGRBG10:
383 	case V4L2_PIX_FMT_SGBRG10:
384 	case V4L2_PIX_FMT_SBGGR10:
385 	case V4L2_PIX_FMT_SRGGB12:
386 	case V4L2_PIX_FMT_SGRBG12:
387 	case V4L2_PIX_FMT_SGBRG12:
388 	case V4L2_PIX_FMT_SBGGR12:
389 		tpg->twopixelsize[0] = 4;
390 		tpg->twopixelsize[1] = 4;
391 		break;
392 	case V4L2_PIX_FMT_YUV444M:
393 	case V4L2_PIX_FMT_YVU444M:
394 	case V4L2_PIX_FMT_YUV422M:
395 	case V4L2_PIX_FMT_YVU422M:
396 	case V4L2_PIX_FMT_YUV422P:
397 	case V4L2_PIX_FMT_YUV420:
398 	case V4L2_PIX_FMT_YVU420:
399 	case V4L2_PIX_FMT_YUV420M:
400 	case V4L2_PIX_FMT_YVU420M:
401 		tpg->twopixelsize[0] = 2;
402 		tpg->twopixelsize[1] = 2;
403 		tpg->twopixelsize[2] = 2;
404 		break;
405 	case V4L2_PIX_FMT_NV24:
406 	case V4L2_PIX_FMT_NV42:
407 		tpg->twopixelsize[0] = 2;
408 		tpg->twopixelsize[1] = 4;
409 		break;
410 	}
411 	return true;
412 }
413 EXPORT_SYMBOL_GPL(tpg_s_fourcc);
414 
415 void tpg_s_crop_compose(struct tpg_data *tpg, const struct v4l2_rect *crop,
416 		const struct v4l2_rect *compose)
417 {
418 	tpg->crop = *crop;
419 	tpg->compose = *compose;
420 	tpg->scaled_width = (tpg->src_width * tpg->compose.width +
421 				 tpg->crop.width - 1) / tpg->crop.width;
422 	tpg->scaled_width &= ~1;
423 	if (tpg->scaled_width > tpg->max_line_width)
424 		tpg->scaled_width = tpg->max_line_width;
425 	if (tpg->scaled_width < 2)
426 		tpg->scaled_width = 2;
427 	tpg->recalc_lines = true;
428 }
429 EXPORT_SYMBOL_GPL(tpg_s_crop_compose);
430 
431 void tpg_reset_source(struct tpg_data *tpg, unsigned width, unsigned height,
432 		       u32 field)
433 {
434 	unsigned p;
435 
436 	tpg->src_width = width;
437 	tpg->src_height = height;
438 	tpg->field = field;
439 	tpg->buf_height = height;
440 	if (V4L2_FIELD_HAS_T_OR_B(field))
441 		tpg->buf_height /= 2;
442 	tpg->scaled_width = width;
443 	tpg->crop.top = tpg->crop.left = 0;
444 	tpg->crop.width = width;
445 	tpg->crop.height = height;
446 	tpg->compose.top = tpg->compose.left = 0;
447 	tpg->compose.width = width;
448 	tpg->compose.height = tpg->buf_height;
449 	for (p = 0; p < tpg->planes; p++)
450 		tpg->bytesperline[p] = (width * tpg->twopixelsize[p]) /
451 				       (2 * tpg->hdownsampling[p]);
452 	tpg->recalc_square_border = true;
453 }
454 EXPORT_SYMBOL_GPL(tpg_reset_source);
455 
456 static enum tpg_color tpg_get_textbg_color(struct tpg_data *tpg)
457 {
458 	switch (tpg->pattern) {
459 	case TPG_PAT_BLACK:
460 		return TPG_COLOR_100_WHITE;
461 	case TPG_PAT_CSC_COLORBAR:
462 		return TPG_COLOR_CSC_BLACK;
463 	default:
464 		return TPG_COLOR_100_BLACK;
465 	}
466 }
467 
468 static enum tpg_color tpg_get_textfg_color(struct tpg_data *tpg)
469 {
470 	switch (tpg->pattern) {
471 	case TPG_PAT_75_COLORBAR:
472 	case TPG_PAT_CSC_COLORBAR:
473 		return TPG_COLOR_CSC_WHITE;
474 	case TPG_PAT_BLACK:
475 		return TPG_COLOR_100_BLACK;
476 	default:
477 		return TPG_COLOR_100_WHITE;
478 	}
479 }
480 
481 static inline int rec709_to_linear(int v)
482 {
483 	v = clamp(v, 0, 0xff0);
484 	return tpg_rec709_to_linear[v];
485 }
486 
487 static inline int linear_to_rec709(int v)
488 {
489 	v = clamp(v, 0, 0xff0);
490 	return tpg_linear_to_rec709[v];
491 }
492 
493 static void rgb2ycbcr(const int m[3][3], int r, int g, int b,
494 			int y_offset, int *y, int *cb, int *cr)
495 {
496 	*y  = ((m[0][0] * r + m[0][1] * g + m[0][2] * b) >> 16) + (y_offset << 4);
497 	*cb = ((m[1][0] * r + m[1][1] * g + m[1][2] * b) >> 16) + (128 << 4);
498 	*cr = ((m[2][0] * r + m[2][1] * g + m[2][2] * b) >> 16) + (128 << 4);
499 }
500 
501 static void color_to_ycbcr(struct tpg_data *tpg, int r, int g, int b,
502 			   int *y, int *cb, int *cr)
503 {
504 #define COEFF(v, r) ((int)(0.5 + (v) * (r) * 256.0))
505 
506 	static const int bt601[3][3] = {
507 		{ COEFF(0.299, 219),   COEFF(0.587, 219),   COEFF(0.114, 219)   },
508 		{ COEFF(-0.1687, 224), COEFF(-0.3313, 224), COEFF(0.5, 224)     },
509 		{ COEFF(0.5, 224),     COEFF(-0.4187, 224), COEFF(-0.0813, 224) },
510 	};
511 	static const int bt601_full[3][3] = {
512 		{ COEFF(0.299, 255),   COEFF(0.587, 255),   COEFF(0.114, 255)   },
513 		{ COEFF(-0.1687, 255), COEFF(-0.3313, 255), COEFF(0.5, 255)     },
514 		{ COEFF(0.5, 255),     COEFF(-0.4187, 255), COEFF(-0.0813, 255) },
515 	};
516 	static const int rec709[3][3] = {
517 		{ COEFF(0.2126, 219),  COEFF(0.7152, 219),  COEFF(0.0722, 219)  },
518 		{ COEFF(-0.1146, 224), COEFF(-0.3854, 224), COEFF(0.5, 224)     },
519 		{ COEFF(0.5, 224),     COEFF(-0.4542, 224), COEFF(-0.0458, 224) },
520 	};
521 	static const int rec709_full[3][3] = {
522 		{ COEFF(0.2126, 255),  COEFF(0.7152, 255),  COEFF(0.0722, 255)  },
523 		{ COEFF(-0.1146, 255), COEFF(-0.3854, 255), COEFF(0.5, 255)     },
524 		{ COEFF(0.5, 255),     COEFF(-0.4542, 255), COEFF(-0.0458, 255) },
525 	};
526 	static const int smpte240m[3][3] = {
527 		{ COEFF(0.212, 219),  COEFF(0.701, 219),  COEFF(0.087, 219)  },
528 		{ COEFF(-0.116, 224), COEFF(-0.384, 224), COEFF(0.5, 224)    },
529 		{ COEFF(0.5, 224),    COEFF(-0.445, 224), COEFF(-0.055, 224) },
530 	};
531 	static const int smpte240m_full[3][3] = {
532 		{ COEFF(0.212, 255),  COEFF(0.701, 255),  COEFF(0.087, 255)  },
533 		{ COEFF(-0.116, 255), COEFF(-0.384, 255), COEFF(0.5, 255)    },
534 		{ COEFF(0.5, 255),    COEFF(-0.445, 255), COEFF(-0.055, 255) },
535 	};
536 	static const int bt2020[3][3] = {
537 		{ COEFF(0.2627, 219),  COEFF(0.6780, 219),  COEFF(0.0593, 219)  },
538 		{ COEFF(-0.1396, 224), COEFF(-0.3604, 224), COEFF(0.5, 224)     },
539 		{ COEFF(0.5, 224),     COEFF(-0.4598, 224), COEFF(-0.0402, 224) },
540 	};
541 	static const int bt2020_full[3][3] = {
542 		{ COEFF(0.2627, 255),  COEFF(0.6780, 255),  COEFF(0.0593, 255)  },
543 		{ COEFF(-0.1396, 255), COEFF(-0.3604, 255), COEFF(0.5, 255)     },
544 		{ COEFF(0.5, 255),     COEFF(-0.4698, 255), COEFF(-0.0402, 255) },
545 	};
546 	static const int bt2020c[4] = {
547 		COEFF(1.0 / 1.9404, 224), COEFF(1.0 / 1.5816, 224),
548 		COEFF(1.0 / 1.7184, 224), COEFF(1.0 / 0.9936, 224),
549 	};
550 	static const int bt2020c_full[4] = {
551 		COEFF(1.0 / 1.9404, 255), COEFF(1.0 / 1.5816, 255),
552 		COEFF(1.0 / 1.7184, 255), COEFF(1.0 / 0.9936, 255),
553 	};
554 
555 	bool full = tpg->real_quantization == V4L2_QUANTIZATION_FULL_RANGE;
556 	unsigned y_offset = full ? 0 : 16;
557 	int lin_y, yc;
558 
559 	switch (tpg->real_ycbcr_enc) {
560 	case V4L2_YCBCR_ENC_601:
561 		rgb2ycbcr(full ? bt601_full : bt601, r, g, b, y_offset, y, cb, cr);
562 		break;
563 	case V4L2_YCBCR_ENC_XV601:
564 		/* Ignore quantization range, there is only one possible
565 		 * Y'CbCr encoding. */
566 		rgb2ycbcr(bt601, r, g, b, 16, y, cb, cr);
567 		break;
568 	case V4L2_YCBCR_ENC_XV709:
569 		/* Ignore quantization range, there is only one possible
570 		 * Y'CbCr encoding. */
571 		rgb2ycbcr(rec709, r, g, b, 16, y, cb, cr);
572 		break;
573 	case V4L2_YCBCR_ENC_BT2020:
574 		rgb2ycbcr(full ? bt2020_full : bt2020, r, g, b, y_offset, y, cb, cr);
575 		break;
576 	case V4L2_YCBCR_ENC_BT2020_CONST_LUM:
577 		lin_y = (COEFF(0.2627, 255) * rec709_to_linear(r) +
578 			 COEFF(0.6780, 255) * rec709_to_linear(g) +
579 			 COEFF(0.0593, 255) * rec709_to_linear(b)) >> 16;
580 		yc = linear_to_rec709(lin_y);
581 		*y = full ? yc : (yc * 219) / 255 + (16 << 4);
582 		if (b <= yc)
583 			*cb = (((b - yc) * (full ? bt2020c_full[0] : bt2020c[0])) >> 16) + (128 << 4);
584 		else
585 			*cb = (((b - yc) * (full ? bt2020c_full[1] : bt2020c[1])) >> 16) + (128 << 4);
586 		if (r <= yc)
587 			*cr = (((r - yc) * (full ? bt2020c_full[2] : bt2020c[2])) >> 16) + (128 << 4);
588 		else
589 			*cr = (((r - yc) * (full ? bt2020c_full[3] : bt2020c[3])) >> 16) + (128 << 4);
590 		break;
591 	case V4L2_YCBCR_ENC_SMPTE240M:
592 		rgb2ycbcr(full ? smpte240m_full : smpte240m, r, g, b, y_offset, y, cb, cr);
593 		break;
594 	case V4L2_YCBCR_ENC_709:
595 	default:
596 		rgb2ycbcr(full ? rec709_full : rec709, r, g, b, y_offset, y, cb, cr);
597 		break;
598 	}
599 }
600 
601 static void ycbcr2rgb(const int m[3][3], int y, int cb, int cr,
602 			int y_offset, int *r, int *g, int *b)
603 {
604 	y -= y_offset << 4;
605 	cb -= 128 << 4;
606 	cr -= 128 << 4;
607 	*r = m[0][0] * y + m[0][1] * cb + m[0][2] * cr;
608 	*g = m[1][0] * y + m[1][1] * cb + m[1][2] * cr;
609 	*b = m[2][0] * y + m[2][1] * cb + m[2][2] * cr;
610 	*r = clamp(*r >> 12, 0, 0xff0);
611 	*g = clamp(*g >> 12, 0, 0xff0);
612 	*b = clamp(*b >> 12, 0, 0xff0);
613 }
614 
615 static void ycbcr_to_color(struct tpg_data *tpg, int y, int cb, int cr,
616 			   int *r, int *g, int *b)
617 {
618 #undef COEFF
619 #define COEFF(v, r) ((int)(0.5 + (v) * ((255.0 * 255.0 * 16.0) / (r))))
620 	static const int bt601[3][3] = {
621 		{ COEFF(1, 219), COEFF(0, 224),       COEFF(1.4020, 224)  },
622 		{ COEFF(1, 219), COEFF(-0.3441, 224), COEFF(-0.7141, 224) },
623 		{ COEFF(1, 219), COEFF(1.7720, 224),  COEFF(0, 224)       },
624 	};
625 	static const int bt601_full[3][3] = {
626 		{ COEFF(1, 255), COEFF(0, 255),       COEFF(1.4020, 255)  },
627 		{ COEFF(1, 255), COEFF(-0.3441, 255), COEFF(-0.7141, 255) },
628 		{ COEFF(1, 255), COEFF(1.7720, 255),  COEFF(0, 255)       },
629 	};
630 	static const int rec709[3][3] = {
631 		{ COEFF(1, 219), COEFF(0, 224),       COEFF(1.5748, 224)  },
632 		{ COEFF(1, 219), COEFF(-0.1873, 224), COEFF(-0.4681, 224) },
633 		{ COEFF(1, 219), COEFF(1.8556, 224),  COEFF(0, 224)       },
634 	};
635 	static const int rec709_full[3][3] = {
636 		{ COEFF(1, 255), COEFF(0, 255),       COEFF(1.5748, 255)  },
637 		{ COEFF(1, 255), COEFF(-0.1873, 255), COEFF(-0.4681, 255) },
638 		{ COEFF(1, 255), COEFF(1.8556, 255),  COEFF(0, 255)       },
639 	};
640 	static const int smpte240m[3][3] = {
641 		{ COEFF(1, 219), COEFF(0, 224),       COEFF(1.5756, 224)  },
642 		{ COEFF(1, 219), COEFF(-0.2253, 224), COEFF(-0.4767, 224) },
643 		{ COEFF(1, 219), COEFF(1.8270, 224),  COEFF(0, 224)       },
644 	};
645 	static const int smpte240m_full[3][3] = {
646 		{ COEFF(1, 255), COEFF(0, 255),       COEFF(1.5756, 255)  },
647 		{ COEFF(1, 255), COEFF(-0.2253, 255), COEFF(-0.4767, 255) },
648 		{ COEFF(1, 255), COEFF(1.8270, 255),  COEFF(0, 255)       },
649 	};
650 	static const int bt2020[3][3] = {
651 		{ COEFF(1, 219), COEFF(0, 224),       COEFF(1.4746, 224)  },
652 		{ COEFF(1, 219), COEFF(-0.1646, 224), COEFF(-0.5714, 224) },
653 		{ COEFF(1, 219), COEFF(1.8814, 224),  COEFF(0, 224)       },
654 	};
655 	static const int bt2020_full[3][3] = {
656 		{ COEFF(1, 255), COEFF(0, 255),       COEFF(1.4746, 255)  },
657 		{ COEFF(1, 255), COEFF(-0.1646, 255), COEFF(-0.5714, 255) },
658 		{ COEFF(1, 255), COEFF(1.8814, 255),  COEFF(0, 255)       },
659 	};
660 	static const int bt2020c[4] = {
661 		COEFF(1.9404, 224), COEFF(1.5816, 224),
662 		COEFF(1.7184, 224), COEFF(0.9936, 224),
663 	};
664 	static const int bt2020c_full[4] = {
665 		COEFF(1.9404, 255), COEFF(1.5816, 255),
666 		COEFF(1.7184, 255), COEFF(0.9936, 255),
667 	};
668 
669 	bool full = tpg->real_quantization == V4L2_QUANTIZATION_FULL_RANGE;
670 	unsigned y_offset = full ? 0 : 16;
671 	int y_fac = full ? COEFF(1.0, 255) : COEFF(1.0, 219);
672 	int lin_r, lin_g, lin_b, lin_y;
673 
674 	switch (tpg->real_ycbcr_enc) {
675 	case V4L2_YCBCR_ENC_601:
676 		ycbcr2rgb(full ? bt601_full : bt601, y, cb, cr, y_offset, r, g, b);
677 		break;
678 	case V4L2_YCBCR_ENC_XV601:
679 		/* Ignore quantization range, there is only one possible
680 		 * Y'CbCr encoding. */
681 		ycbcr2rgb(bt601, y, cb, cr, 16, r, g, b);
682 		break;
683 	case V4L2_YCBCR_ENC_XV709:
684 		/* Ignore quantization range, there is only one possible
685 		 * Y'CbCr encoding. */
686 		ycbcr2rgb(rec709, y, cb, cr, 16, r, g, b);
687 		break;
688 	case V4L2_YCBCR_ENC_BT2020:
689 		ycbcr2rgb(full ? bt2020_full : bt2020, y, cb, cr, y_offset, r, g, b);
690 		break;
691 	case V4L2_YCBCR_ENC_BT2020_CONST_LUM:
692 		y -= full ? 0 : 16 << 4;
693 		cb -= 128 << 4;
694 		cr -= 128 << 4;
695 
696 		if (cb <= 0)
697 			*b = y_fac * y + (full ? bt2020c_full[0] : bt2020c[0]) * cb;
698 		else
699 			*b = y_fac * y + (full ? bt2020c_full[1] : bt2020c[1]) * cb;
700 		*b = *b >> 12;
701 		if (cr <= 0)
702 			*r = y_fac * y + (full ? bt2020c_full[2] : bt2020c[2]) * cr;
703 		else
704 			*r = y_fac * y + (full ? bt2020c_full[3] : bt2020c[3]) * cr;
705 		*r = *r >> 12;
706 		lin_r = rec709_to_linear(*r);
707 		lin_b = rec709_to_linear(*b);
708 		lin_y = rec709_to_linear((y * 255) / (full ? 255 : 219));
709 
710 		lin_g = COEFF(1.0 / 0.6780, 255) * lin_y -
711 			COEFF(0.2627 / 0.6780, 255) * lin_r -
712 			COEFF(0.0593 / 0.6780, 255) * lin_b;
713 		*g = linear_to_rec709(lin_g >> 12);
714 		break;
715 	case V4L2_YCBCR_ENC_SMPTE240M:
716 		ycbcr2rgb(full ? smpte240m_full : smpte240m, y, cb, cr, y_offset, r, g, b);
717 		break;
718 	case V4L2_YCBCR_ENC_709:
719 	default:
720 		ycbcr2rgb(full ? rec709_full : rec709, y, cb, cr, y_offset, r, g, b);
721 		break;
722 	}
723 }
724 
725 /* precalculate color bar values to speed up rendering */
726 static void precalculate_color(struct tpg_data *tpg, int k)
727 {
728 	int col = k;
729 	int r = tpg_colors[col].r;
730 	int g = tpg_colors[col].g;
731 	int b = tpg_colors[col].b;
732 
733 	if (k == TPG_COLOR_TEXTBG) {
734 		col = tpg_get_textbg_color(tpg);
735 
736 		r = tpg_colors[col].r;
737 		g = tpg_colors[col].g;
738 		b = tpg_colors[col].b;
739 	} else if (k == TPG_COLOR_TEXTFG) {
740 		col = tpg_get_textfg_color(tpg);
741 
742 		r = tpg_colors[col].r;
743 		g = tpg_colors[col].g;
744 		b = tpg_colors[col].b;
745 	} else if (tpg->pattern == TPG_PAT_NOISE) {
746 		r = g = b = prandom_u32_max(256);
747 	} else if (k == TPG_COLOR_RANDOM) {
748 		r = g = b = tpg->qual_offset + prandom_u32_max(196);
749 	} else if (k >= TPG_COLOR_RAMP) {
750 		r = g = b = k - TPG_COLOR_RAMP;
751 	}
752 
753 	if (tpg->pattern == TPG_PAT_CSC_COLORBAR && col <= TPG_COLOR_CSC_BLACK) {
754 		r = tpg_csc_colors[tpg->colorspace][tpg->real_xfer_func][col].r;
755 		g = tpg_csc_colors[tpg->colorspace][tpg->real_xfer_func][col].g;
756 		b = tpg_csc_colors[tpg->colorspace][tpg->real_xfer_func][col].b;
757 	} else {
758 		r <<= 4;
759 		g <<= 4;
760 		b <<= 4;
761 	}
762 	if (tpg->qual == TPG_QUAL_GRAY || tpg->fourcc == V4L2_PIX_FMT_GREY ||
763 	    tpg->fourcc == V4L2_PIX_FMT_Y16 ||
764 	    tpg->fourcc == V4L2_PIX_FMT_Y16_BE) {
765 		/* Rec. 709 Luma function */
766 		/* (0.2126, 0.7152, 0.0722) * (255 * 256) */
767 		r = g = b = (13879 * r + 46688 * g + 4713 * b) >> 16;
768 	}
769 
770 	/*
771 	 * The assumption is that the RGB output is always full range,
772 	 * so only if the rgb_range overrides the 'real' rgb range do
773 	 * we need to convert the RGB values.
774 	 *
775 	 * Remember that r, g and b are still in the 0 - 0xff0 range.
776 	 */
777 	if (tpg->real_rgb_range == V4L2_DV_RGB_RANGE_LIMITED &&
778 	    tpg->rgb_range == V4L2_DV_RGB_RANGE_FULL && !tpg->is_yuv) {
779 		/*
780 		 * Convert from full range (which is what r, g and b are)
781 		 * to limited range (which is the 'real' RGB range), which
782 		 * is then interpreted as full range.
783 		 */
784 		r = (r * 219) / 255 + (16 << 4);
785 		g = (g * 219) / 255 + (16 << 4);
786 		b = (b * 219) / 255 + (16 << 4);
787 	} else if (tpg->real_rgb_range != V4L2_DV_RGB_RANGE_LIMITED &&
788 		   tpg->rgb_range == V4L2_DV_RGB_RANGE_LIMITED && !tpg->is_yuv) {
789 		/*
790 		 * Clamp r, g and b to the limited range and convert to full
791 		 * range since that's what we deliver.
792 		 */
793 		r = clamp(r, 16 << 4, 235 << 4);
794 		g = clamp(g, 16 << 4, 235 << 4);
795 		b = clamp(b, 16 << 4, 235 << 4);
796 		r = (r - (16 << 4)) * 255 / 219;
797 		g = (g - (16 << 4)) * 255 / 219;
798 		b = (b - (16 << 4)) * 255 / 219;
799 	}
800 
801 	if (tpg->brightness != 128 || tpg->contrast != 128 ||
802 	    tpg->saturation != 128 || tpg->hue) {
803 		/* Implement these operations */
804 		int y, cb, cr;
805 		int tmp_cb, tmp_cr;
806 
807 		/* First convert to YCbCr */
808 
809 		color_to_ycbcr(tpg, r, g, b, &y, &cb, &cr);
810 
811 		y = (16 << 4) + ((y - (16 << 4)) * tpg->contrast) / 128;
812 		y += (tpg->brightness << 4) - (128 << 4);
813 
814 		cb -= 128 << 4;
815 		cr -= 128 << 4;
816 		tmp_cb = (cb * cos(128 + tpg->hue)) / 127 + (cr * sin[128 + tpg->hue]) / 127;
817 		tmp_cr = (cr * cos(128 + tpg->hue)) / 127 - (cb * sin[128 + tpg->hue]) / 127;
818 
819 		cb = (128 << 4) + (tmp_cb * tpg->contrast * tpg->saturation) / (128 * 128);
820 		cr = (128 << 4) + (tmp_cr * tpg->contrast * tpg->saturation) / (128 * 128);
821 		if (tpg->is_yuv) {
822 			tpg->colors[k][0] = clamp(y >> 4, 1, 254);
823 			tpg->colors[k][1] = clamp(cb >> 4, 1, 254);
824 			tpg->colors[k][2] = clamp(cr >> 4, 1, 254);
825 			return;
826 		}
827 		ycbcr_to_color(tpg, y, cb, cr, &r, &g, &b);
828 	}
829 
830 	if (tpg->is_yuv) {
831 		/* Convert to YCbCr */
832 		int y, cb, cr;
833 
834 		color_to_ycbcr(tpg, r, g, b, &y, &cb, &cr);
835 
836 		if (tpg->real_quantization == V4L2_QUANTIZATION_LIM_RANGE) {
837 			y = clamp(y, 16 << 4, 235 << 4);
838 			cb = clamp(cb, 16 << 4, 240 << 4);
839 			cr = clamp(cr, 16 << 4, 240 << 4);
840 		}
841 		y = clamp(y >> 4, 1, 254);
842 		cb = clamp(cb >> 4, 1, 254);
843 		cr = clamp(cr >> 4, 1, 254);
844 		switch (tpg->fourcc) {
845 		case V4L2_PIX_FMT_YUV444:
846 			y >>= 4;
847 			cb >>= 4;
848 			cr >>= 4;
849 			break;
850 		case V4L2_PIX_FMT_YUV555:
851 			y >>= 3;
852 			cb >>= 3;
853 			cr >>= 3;
854 			break;
855 		case V4L2_PIX_FMT_YUV565:
856 			y >>= 3;
857 			cb >>= 2;
858 			cr >>= 3;
859 			break;
860 		}
861 		tpg->colors[k][0] = y;
862 		tpg->colors[k][1] = cb;
863 		tpg->colors[k][2] = cr;
864 	} else {
865 		if (tpg->real_quantization == V4L2_QUANTIZATION_LIM_RANGE) {
866 			r = (r * 219) / 255 + (16 << 4);
867 			g = (g * 219) / 255 + (16 << 4);
868 			b = (b * 219) / 255 + (16 << 4);
869 		}
870 		switch (tpg->fourcc) {
871 		case V4L2_PIX_FMT_RGB332:
872 			r >>= 9;
873 			g >>= 9;
874 			b >>= 10;
875 			break;
876 		case V4L2_PIX_FMT_RGB565:
877 		case V4L2_PIX_FMT_RGB565X:
878 			r >>= 7;
879 			g >>= 6;
880 			b >>= 7;
881 			break;
882 		case V4L2_PIX_FMT_RGB444:
883 		case V4L2_PIX_FMT_XRGB444:
884 		case V4L2_PIX_FMT_ARGB444:
885 			r >>= 8;
886 			g >>= 8;
887 			b >>= 8;
888 			break;
889 		case V4L2_PIX_FMT_RGB555:
890 		case V4L2_PIX_FMT_XRGB555:
891 		case V4L2_PIX_FMT_ARGB555:
892 		case V4L2_PIX_FMT_RGB555X:
893 		case V4L2_PIX_FMT_XRGB555X:
894 		case V4L2_PIX_FMT_ARGB555X:
895 			r >>= 7;
896 			g >>= 7;
897 			b >>= 7;
898 			break;
899 		case V4L2_PIX_FMT_BGR666:
900 			r >>= 6;
901 			g >>= 6;
902 			b >>= 6;
903 			break;
904 		default:
905 			r >>= 4;
906 			g >>= 4;
907 			b >>= 4;
908 			break;
909 		}
910 
911 		tpg->colors[k][0] = r;
912 		tpg->colors[k][1] = g;
913 		tpg->colors[k][2] = b;
914 	}
915 }
916 
917 static void tpg_precalculate_colors(struct tpg_data *tpg)
918 {
919 	int k;
920 
921 	for (k = 0; k < TPG_COLOR_MAX; k++)
922 		precalculate_color(tpg, k);
923 }
924 
925 /* 'odd' is true for pixels 1, 3, 5, etc. and false for pixels 0, 2, 4, etc. */
926 static void gen_twopix(struct tpg_data *tpg,
927 		u8 buf[TPG_MAX_PLANES][8], int color, bool odd)
928 {
929 	unsigned offset = odd * tpg->twopixelsize[0] / 2;
930 	u8 alpha = tpg->alpha_component;
931 	u8 r_y, g_u, b_v;
932 
933 	if (tpg->alpha_red_only && color != TPG_COLOR_CSC_RED &&
934 				   color != TPG_COLOR_100_RED &&
935 				   color != TPG_COLOR_75_RED)
936 		alpha = 0;
937 	if (color == TPG_COLOR_RANDOM)
938 		precalculate_color(tpg, color);
939 	r_y = tpg->colors[color][0]; /* R or precalculated Y */
940 	g_u = tpg->colors[color][1]; /* G or precalculated U */
941 	b_v = tpg->colors[color][2]; /* B or precalculated V */
942 
943 	switch (tpg->fourcc) {
944 	case V4L2_PIX_FMT_GREY:
945 		buf[0][offset] = r_y;
946 		break;
947 	case V4L2_PIX_FMT_Y16:
948 		/*
949 		 * Ideally both bytes should be set to r_y, but then you won't
950 		 * be able to detect endian problems. So keep it 0 except for
951 		 * the corner case where r_y is 0xff so white really will be
952 		 * white (0xffff).
953 		 */
954 		buf[0][offset] = r_y == 0xff ? r_y : 0;
955 		buf[0][offset+1] = r_y;
956 		break;
957 	case V4L2_PIX_FMT_Y16_BE:
958 		/* See comment for V4L2_PIX_FMT_Y16 above */
959 		buf[0][offset] = r_y;
960 		buf[0][offset+1] = r_y == 0xff ? r_y : 0;
961 		break;
962 	case V4L2_PIX_FMT_YUV422M:
963 	case V4L2_PIX_FMT_YUV422P:
964 	case V4L2_PIX_FMT_YUV420:
965 	case V4L2_PIX_FMT_YUV420M:
966 		buf[0][offset] = r_y;
967 		if (odd) {
968 			buf[1][0] = (buf[1][0] + g_u) / 2;
969 			buf[2][0] = (buf[2][0] + b_v) / 2;
970 			buf[1][1] = buf[1][0];
971 			buf[2][1] = buf[2][0];
972 			break;
973 		}
974 		buf[1][0] = g_u;
975 		buf[2][0] = b_v;
976 		break;
977 	case V4L2_PIX_FMT_YVU422M:
978 	case V4L2_PIX_FMT_YVU420:
979 	case V4L2_PIX_FMT_YVU420M:
980 		buf[0][offset] = r_y;
981 		if (odd) {
982 			buf[1][0] = (buf[1][0] + b_v) / 2;
983 			buf[2][0] = (buf[2][0] + g_u) / 2;
984 			buf[1][1] = buf[1][0];
985 			buf[2][1] = buf[2][0];
986 			break;
987 		}
988 		buf[1][0] = b_v;
989 		buf[2][0] = g_u;
990 		break;
991 
992 	case V4L2_PIX_FMT_NV12:
993 	case V4L2_PIX_FMT_NV12M:
994 	case V4L2_PIX_FMT_NV16:
995 	case V4L2_PIX_FMT_NV16M:
996 		buf[0][offset] = r_y;
997 		if (odd) {
998 			buf[1][0] = (buf[1][0] + g_u) / 2;
999 			buf[1][1] = (buf[1][1] + b_v) / 2;
1000 			break;
1001 		}
1002 		buf[1][0] = g_u;
1003 		buf[1][1] = b_v;
1004 		break;
1005 	case V4L2_PIX_FMT_NV21:
1006 	case V4L2_PIX_FMT_NV21M:
1007 	case V4L2_PIX_FMT_NV61:
1008 	case V4L2_PIX_FMT_NV61M:
1009 		buf[0][offset] = r_y;
1010 		if (odd) {
1011 			buf[1][0] = (buf[1][0] + b_v) / 2;
1012 			buf[1][1] = (buf[1][1] + g_u) / 2;
1013 			break;
1014 		}
1015 		buf[1][0] = b_v;
1016 		buf[1][1] = g_u;
1017 		break;
1018 
1019 	case V4L2_PIX_FMT_YUV444M:
1020 		buf[0][offset] = r_y;
1021 		buf[1][offset] = g_u;
1022 		buf[2][offset] = b_v;
1023 		break;
1024 
1025 	case V4L2_PIX_FMT_YVU444M:
1026 		buf[0][offset] = r_y;
1027 		buf[1][offset] = b_v;
1028 		buf[2][offset] = g_u;
1029 		break;
1030 
1031 	case V4L2_PIX_FMT_NV24:
1032 		buf[0][offset] = r_y;
1033 		buf[1][2 * offset] = g_u;
1034 		buf[1][2 * offset + 1] = b_v;
1035 		break;
1036 
1037 	case V4L2_PIX_FMT_NV42:
1038 		buf[0][offset] = r_y;
1039 		buf[1][2 * offset] = b_v;
1040 		buf[1][2 * offset + 1] = g_u;
1041 		break;
1042 
1043 	case V4L2_PIX_FMT_YUYV:
1044 		buf[0][offset] = r_y;
1045 		if (odd) {
1046 			buf[0][1] = (buf[0][1] + g_u) / 2;
1047 			buf[0][3] = (buf[0][3] + b_v) / 2;
1048 			break;
1049 		}
1050 		buf[0][1] = g_u;
1051 		buf[0][3] = b_v;
1052 		break;
1053 	case V4L2_PIX_FMT_UYVY:
1054 		buf[0][offset + 1] = r_y;
1055 		if (odd) {
1056 			buf[0][0] = (buf[0][0] + g_u) / 2;
1057 			buf[0][2] = (buf[0][2] + b_v) / 2;
1058 			break;
1059 		}
1060 		buf[0][0] = g_u;
1061 		buf[0][2] = b_v;
1062 		break;
1063 	case V4L2_PIX_FMT_YVYU:
1064 		buf[0][offset] = r_y;
1065 		if (odd) {
1066 			buf[0][1] = (buf[0][1] + b_v) / 2;
1067 			buf[0][3] = (buf[0][3] + g_u) / 2;
1068 			break;
1069 		}
1070 		buf[0][1] = b_v;
1071 		buf[0][3] = g_u;
1072 		break;
1073 	case V4L2_PIX_FMT_VYUY:
1074 		buf[0][offset + 1] = r_y;
1075 		if (odd) {
1076 			buf[0][0] = (buf[0][0] + b_v) / 2;
1077 			buf[0][2] = (buf[0][2] + g_u) / 2;
1078 			break;
1079 		}
1080 		buf[0][0] = b_v;
1081 		buf[0][2] = g_u;
1082 		break;
1083 	case V4L2_PIX_FMT_RGB332:
1084 		buf[0][offset] = (r_y << 5) | (g_u << 2) | b_v;
1085 		break;
1086 	case V4L2_PIX_FMT_YUV565:
1087 	case V4L2_PIX_FMT_RGB565:
1088 		buf[0][offset] = (g_u << 5) | b_v;
1089 		buf[0][offset + 1] = (r_y << 3) | (g_u >> 3);
1090 		break;
1091 	case V4L2_PIX_FMT_RGB565X:
1092 		buf[0][offset] = (r_y << 3) | (g_u >> 3);
1093 		buf[0][offset + 1] = (g_u << 5) | b_v;
1094 		break;
1095 	case V4L2_PIX_FMT_RGB444:
1096 	case V4L2_PIX_FMT_XRGB444:
1097 		alpha = 0;
1098 		/* fall through */
1099 	case V4L2_PIX_FMT_YUV444:
1100 	case V4L2_PIX_FMT_ARGB444:
1101 		buf[0][offset] = (g_u << 4) | b_v;
1102 		buf[0][offset + 1] = (alpha & 0xf0) | r_y;
1103 		break;
1104 	case V4L2_PIX_FMT_RGB555:
1105 	case V4L2_PIX_FMT_XRGB555:
1106 		alpha = 0;
1107 		/* fall through */
1108 	case V4L2_PIX_FMT_YUV555:
1109 	case V4L2_PIX_FMT_ARGB555:
1110 		buf[0][offset] = (g_u << 5) | b_v;
1111 		buf[0][offset + 1] = (alpha & 0x80) | (r_y << 2) | (g_u >> 3);
1112 		break;
1113 	case V4L2_PIX_FMT_RGB555X:
1114 	case V4L2_PIX_FMT_XRGB555X:
1115 		alpha = 0;
1116 		/* fall through */
1117 	case V4L2_PIX_FMT_ARGB555X:
1118 		buf[0][offset] = (alpha & 0x80) | (r_y << 2) | (g_u >> 3);
1119 		buf[0][offset + 1] = (g_u << 5) | b_v;
1120 		break;
1121 	case V4L2_PIX_FMT_RGB24:
1122 		buf[0][offset] = r_y;
1123 		buf[0][offset + 1] = g_u;
1124 		buf[0][offset + 2] = b_v;
1125 		break;
1126 	case V4L2_PIX_FMT_BGR24:
1127 		buf[0][offset] = b_v;
1128 		buf[0][offset + 1] = g_u;
1129 		buf[0][offset + 2] = r_y;
1130 		break;
1131 	case V4L2_PIX_FMT_BGR666:
1132 		buf[0][offset] = (b_v << 2) | (g_u >> 4);
1133 		buf[0][offset + 1] = (g_u << 4) | (r_y >> 2);
1134 		buf[0][offset + 2] = r_y << 6;
1135 		buf[0][offset + 3] = 0;
1136 		break;
1137 	case V4L2_PIX_FMT_RGB32:
1138 	case V4L2_PIX_FMT_XRGB32:
1139 		alpha = 0;
1140 		/* fall through */
1141 	case V4L2_PIX_FMT_YUV32:
1142 	case V4L2_PIX_FMT_ARGB32:
1143 		buf[0][offset] = alpha;
1144 		buf[0][offset + 1] = r_y;
1145 		buf[0][offset + 2] = g_u;
1146 		buf[0][offset + 3] = b_v;
1147 		break;
1148 	case V4L2_PIX_FMT_BGR32:
1149 	case V4L2_PIX_FMT_XBGR32:
1150 		alpha = 0;
1151 		/* fall through */
1152 	case V4L2_PIX_FMT_ABGR32:
1153 		buf[0][offset] = b_v;
1154 		buf[0][offset + 1] = g_u;
1155 		buf[0][offset + 2] = r_y;
1156 		buf[0][offset + 3] = alpha;
1157 		break;
1158 	case V4L2_PIX_FMT_SBGGR8:
1159 		buf[0][offset] = odd ? g_u : b_v;
1160 		buf[1][offset] = odd ? r_y : g_u;
1161 		break;
1162 	case V4L2_PIX_FMT_SGBRG8:
1163 		buf[0][offset] = odd ? b_v : g_u;
1164 		buf[1][offset] = odd ? g_u : r_y;
1165 		break;
1166 	case V4L2_PIX_FMT_SGRBG8:
1167 		buf[0][offset] = odd ? r_y : g_u;
1168 		buf[1][offset] = odd ? g_u : b_v;
1169 		break;
1170 	case V4L2_PIX_FMT_SRGGB8:
1171 		buf[0][offset] = odd ? g_u : r_y;
1172 		buf[1][offset] = odd ? b_v : g_u;
1173 		break;
1174 	case V4L2_PIX_FMT_SBGGR10:
1175 		buf[0][offset] = odd ? g_u << 2 : b_v << 2;
1176 		buf[0][offset + 1] = odd ? g_u >> 6 : b_v >> 6;
1177 		buf[1][offset] = odd ? r_y << 2 : g_u << 2;
1178 		buf[1][offset + 1] = odd ? r_y >> 6 : g_u >> 6;
1179 		buf[0][offset] |= (buf[0][offset] >> 2) & 3;
1180 		buf[1][offset] |= (buf[1][offset] >> 2) & 3;
1181 		break;
1182 	case V4L2_PIX_FMT_SGBRG10:
1183 		buf[0][offset] = odd ? b_v << 2 : g_u << 2;
1184 		buf[0][offset + 1] = odd ? b_v >> 6 : g_u >> 6;
1185 		buf[1][offset] = odd ? g_u << 2 : r_y << 2;
1186 		buf[1][offset + 1] = odd ? g_u >> 6 : r_y >> 6;
1187 		buf[0][offset] |= (buf[0][offset] >> 2) & 3;
1188 		buf[1][offset] |= (buf[1][offset] >> 2) & 3;
1189 		break;
1190 	case V4L2_PIX_FMT_SGRBG10:
1191 		buf[0][offset] = odd ? r_y << 2 : g_u << 2;
1192 		buf[0][offset + 1] = odd ? r_y >> 6 : g_u >> 6;
1193 		buf[1][offset] = odd ? g_u << 2 : b_v << 2;
1194 		buf[1][offset + 1] = odd ? g_u >> 6 : b_v >> 6;
1195 		buf[0][offset] |= (buf[0][offset] >> 2) & 3;
1196 		buf[1][offset] |= (buf[1][offset] >> 2) & 3;
1197 		break;
1198 	case V4L2_PIX_FMT_SRGGB10:
1199 		buf[0][offset] = odd ? g_u << 2 : r_y << 2;
1200 		buf[0][offset + 1] = odd ? g_u >> 6 : r_y >> 6;
1201 		buf[1][offset] = odd ? b_v << 2 : g_u << 2;
1202 		buf[1][offset + 1] = odd ? b_v >> 6 : g_u >> 6;
1203 		buf[0][offset] |= (buf[0][offset] >> 2) & 3;
1204 		buf[1][offset] |= (buf[1][offset] >> 2) & 3;
1205 		break;
1206 	case V4L2_PIX_FMT_SBGGR12:
1207 		buf[0][offset] = odd ? g_u << 4 : b_v << 4;
1208 		buf[0][offset + 1] = odd ? g_u >> 4 : b_v >> 4;
1209 		buf[1][offset] = odd ? r_y << 4 : g_u << 4;
1210 		buf[1][offset + 1] = odd ? r_y >> 4 : g_u >> 4;
1211 		buf[0][offset] |= (buf[0][offset] >> 4) & 0xf;
1212 		buf[1][offset] |= (buf[1][offset] >> 4) & 0xf;
1213 		break;
1214 	case V4L2_PIX_FMT_SGBRG12:
1215 		buf[0][offset] = odd ? b_v << 4 : g_u << 4;
1216 		buf[0][offset + 1] = odd ? b_v >> 4 : g_u >> 4;
1217 		buf[1][offset] = odd ? g_u << 4 : r_y << 4;
1218 		buf[1][offset + 1] = odd ? g_u >> 4 : r_y >> 4;
1219 		buf[0][offset] |= (buf[0][offset] >> 4) & 0xf;
1220 		buf[1][offset] |= (buf[1][offset] >> 4) & 0xf;
1221 		break;
1222 	case V4L2_PIX_FMT_SGRBG12:
1223 		buf[0][offset] = odd ? r_y << 4 : g_u << 4;
1224 		buf[0][offset + 1] = odd ? r_y >> 4 : g_u >> 4;
1225 		buf[1][offset] = odd ? g_u << 4 : b_v << 4;
1226 		buf[1][offset + 1] = odd ? g_u >> 4 : b_v >> 4;
1227 		buf[0][offset] |= (buf[0][offset] >> 4) & 0xf;
1228 		buf[1][offset] |= (buf[1][offset] >> 4) & 0xf;
1229 		break;
1230 	case V4L2_PIX_FMT_SRGGB12:
1231 		buf[0][offset] = odd ? g_u << 4 : r_y << 4;
1232 		buf[0][offset + 1] = odd ? g_u >> 4 : r_y >> 4;
1233 		buf[1][offset] = odd ? b_v << 4 : g_u << 4;
1234 		buf[1][offset + 1] = odd ? b_v >> 4 : g_u >> 4;
1235 		buf[0][offset] |= (buf[0][offset] >> 4) & 0xf;
1236 		buf[1][offset] |= (buf[1][offset] >> 4) & 0xf;
1237 		break;
1238 	}
1239 }
1240 
1241 unsigned tpg_g_interleaved_plane(const struct tpg_data *tpg, unsigned buf_line)
1242 {
1243 	switch (tpg->fourcc) {
1244 	case V4L2_PIX_FMT_SBGGR8:
1245 	case V4L2_PIX_FMT_SGBRG8:
1246 	case V4L2_PIX_FMT_SGRBG8:
1247 	case V4L2_PIX_FMT_SRGGB8:
1248 	case V4L2_PIX_FMT_SBGGR10:
1249 	case V4L2_PIX_FMT_SGBRG10:
1250 	case V4L2_PIX_FMT_SGRBG10:
1251 	case V4L2_PIX_FMT_SRGGB10:
1252 	case V4L2_PIX_FMT_SBGGR12:
1253 	case V4L2_PIX_FMT_SGBRG12:
1254 	case V4L2_PIX_FMT_SGRBG12:
1255 	case V4L2_PIX_FMT_SRGGB12:
1256 		return buf_line & 1;
1257 	default:
1258 		return 0;
1259 	}
1260 }
1261 EXPORT_SYMBOL_GPL(tpg_g_interleaved_plane);
1262 
1263 /* Return how many pattern lines are used by the current pattern. */
1264 static unsigned tpg_get_pat_lines(const struct tpg_data *tpg)
1265 {
1266 	switch (tpg->pattern) {
1267 	case TPG_PAT_CHECKERS_16X16:
1268 	case TPG_PAT_CHECKERS_2X2:
1269 	case TPG_PAT_CHECKERS_1X1:
1270 	case TPG_PAT_COLOR_CHECKERS_2X2:
1271 	case TPG_PAT_COLOR_CHECKERS_1X1:
1272 	case TPG_PAT_ALTERNATING_HLINES:
1273 	case TPG_PAT_CROSS_1_PIXEL:
1274 	case TPG_PAT_CROSS_2_PIXELS:
1275 	case TPG_PAT_CROSS_10_PIXELS:
1276 		return 2;
1277 	case TPG_PAT_100_COLORSQUARES:
1278 	case TPG_PAT_100_HCOLORBAR:
1279 		return 8;
1280 	default:
1281 		return 1;
1282 	}
1283 }
1284 
1285 /* Which pattern line should be used for the given frame line. */
1286 static unsigned tpg_get_pat_line(const struct tpg_data *tpg, unsigned line)
1287 {
1288 	switch (tpg->pattern) {
1289 	case TPG_PAT_CHECKERS_16X16:
1290 		return (line >> 4) & 1;
1291 	case TPG_PAT_CHECKERS_1X1:
1292 	case TPG_PAT_COLOR_CHECKERS_1X1:
1293 	case TPG_PAT_ALTERNATING_HLINES:
1294 		return line & 1;
1295 	case TPG_PAT_CHECKERS_2X2:
1296 	case TPG_PAT_COLOR_CHECKERS_2X2:
1297 		return (line & 2) >> 1;
1298 	case TPG_PAT_100_COLORSQUARES:
1299 	case TPG_PAT_100_HCOLORBAR:
1300 		return (line * 8) / tpg->src_height;
1301 	case TPG_PAT_CROSS_1_PIXEL:
1302 		return line == tpg->src_height / 2;
1303 	case TPG_PAT_CROSS_2_PIXELS:
1304 		return (line + 1) / 2 == tpg->src_height / 4;
1305 	case TPG_PAT_CROSS_10_PIXELS:
1306 		return (line + 10) / 20 == tpg->src_height / 40;
1307 	default:
1308 		return 0;
1309 	}
1310 }
1311 
1312 /*
1313  * Which color should be used for the given pattern line and X coordinate.
1314  * Note: x is in the range 0 to 2 * tpg->src_width.
1315  */
1316 static enum tpg_color tpg_get_color(const struct tpg_data *tpg,
1317 				    unsigned pat_line, unsigned x)
1318 {
1319 	/* Maximum number of bars are TPG_COLOR_MAX - otherwise, the input print code
1320 	   should be modified */
1321 	static const enum tpg_color bars[3][8] = {
1322 		/* Standard ITU-R 75% color bar sequence */
1323 		{ TPG_COLOR_CSC_WHITE,   TPG_COLOR_75_YELLOW,
1324 		  TPG_COLOR_75_CYAN,     TPG_COLOR_75_GREEN,
1325 		  TPG_COLOR_75_MAGENTA,  TPG_COLOR_75_RED,
1326 		  TPG_COLOR_75_BLUE,     TPG_COLOR_100_BLACK, },
1327 		/* Standard ITU-R 100% color bar sequence */
1328 		{ TPG_COLOR_100_WHITE,   TPG_COLOR_100_YELLOW,
1329 		  TPG_COLOR_100_CYAN,    TPG_COLOR_100_GREEN,
1330 		  TPG_COLOR_100_MAGENTA, TPG_COLOR_100_RED,
1331 		  TPG_COLOR_100_BLUE,    TPG_COLOR_100_BLACK, },
1332 		/* Color bar sequence suitable to test CSC */
1333 		{ TPG_COLOR_CSC_WHITE,   TPG_COLOR_CSC_YELLOW,
1334 		  TPG_COLOR_CSC_CYAN,    TPG_COLOR_CSC_GREEN,
1335 		  TPG_COLOR_CSC_MAGENTA, TPG_COLOR_CSC_RED,
1336 		  TPG_COLOR_CSC_BLUE,    TPG_COLOR_CSC_BLACK, },
1337 	};
1338 
1339 	switch (tpg->pattern) {
1340 	case TPG_PAT_75_COLORBAR:
1341 	case TPG_PAT_100_COLORBAR:
1342 	case TPG_PAT_CSC_COLORBAR:
1343 		return bars[tpg->pattern][((x * 8) / tpg->src_width) % 8];
1344 	case TPG_PAT_100_COLORSQUARES:
1345 		return bars[1][(pat_line + (x * 8) / tpg->src_width) % 8];
1346 	case TPG_PAT_100_HCOLORBAR:
1347 		return bars[1][pat_line];
1348 	case TPG_PAT_BLACK:
1349 		return TPG_COLOR_100_BLACK;
1350 	case TPG_PAT_WHITE:
1351 		return TPG_COLOR_100_WHITE;
1352 	case TPG_PAT_RED:
1353 		return TPG_COLOR_100_RED;
1354 	case TPG_PAT_GREEN:
1355 		return TPG_COLOR_100_GREEN;
1356 	case TPG_PAT_BLUE:
1357 		return TPG_COLOR_100_BLUE;
1358 	case TPG_PAT_CHECKERS_16X16:
1359 		return (((x >> 4) & 1) ^ (pat_line & 1)) ?
1360 			TPG_COLOR_100_BLACK : TPG_COLOR_100_WHITE;
1361 	case TPG_PAT_CHECKERS_1X1:
1362 		return ((x & 1) ^ (pat_line & 1)) ?
1363 			TPG_COLOR_100_WHITE : TPG_COLOR_100_BLACK;
1364 	case TPG_PAT_COLOR_CHECKERS_1X1:
1365 		return ((x & 1) ^ (pat_line & 1)) ?
1366 			TPG_COLOR_100_RED : TPG_COLOR_100_BLUE;
1367 	case TPG_PAT_CHECKERS_2X2:
1368 		return (((x >> 1) & 1) ^ (pat_line & 1)) ?
1369 			TPG_COLOR_100_WHITE : TPG_COLOR_100_BLACK;
1370 	case TPG_PAT_COLOR_CHECKERS_2X2:
1371 		return (((x >> 1) & 1) ^ (pat_line & 1)) ?
1372 			TPG_COLOR_100_RED : TPG_COLOR_100_BLUE;
1373 	case TPG_PAT_ALTERNATING_HLINES:
1374 		return pat_line ? TPG_COLOR_100_WHITE : TPG_COLOR_100_BLACK;
1375 	case TPG_PAT_ALTERNATING_VLINES:
1376 		return (x & 1) ? TPG_COLOR_100_WHITE : TPG_COLOR_100_BLACK;
1377 	case TPG_PAT_CROSS_1_PIXEL:
1378 		if (pat_line || (x % tpg->src_width) == tpg->src_width / 2)
1379 			return TPG_COLOR_100_BLACK;
1380 		return TPG_COLOR_100_WHITE;
1381 	case TPG_PAT_CROSS_2_PIXELS:
1382 		if (pat_line || ((x % tpg->src_width) + 1) / 2 == tpg->src_width / 4)
1383 			return TPG_COLOR_100_BLACK;
1384 		return TPG_COLOR_100_WHITE;
1385 	case TPG_PAT_CROSS_10_PIXELS:
1386 		if (pat_line || ((x % tpg->src_width) + 10) / 20 == tpg->src_width / 40)
1387 			return TPG_COLOR_100_BLACK;
1388 		return TPG_COLOR_100_WHITE;
1389 	case TPG_PAT_GRAY_RAMP:
1390 		return TPG_COLOR_RAMP + ((x % tpg->src_width) * 256) / tpg->src_width;
1391 	default:
1392 		return TPG_COLOR_100_RED;
1393 	}
1394 }
1395 
1396 /*
1397  * Given the pixel aspect ratio and video aspect ratio calculate the
1398  * coordinates of a centered square and the coordinates of the border of
1399  * the active video area. The coordinates are relative to the source
1400  * frame rectangle.
1401  */
1402 static void tpg_calculate_square_border(struct tpg_data *tpg)
1403 {
1404 	unsigned w = tpg->src_width;
1405 	unsigned h = tpg->src_height;
1406 	unsigned sq_w, sq_h;
1407 
1408 	sq_w = (w * 2 / 5) & ~1;
1409 	if (((w - sq_w) / 2) & 1)
1410 		sq_w += 2;
1411 	sq_h = sq_w;
1412 	tpg->square.width = sq_w;
1413 	if (tpg->vid_aspect == TPG_VIDEO_ASPECT_16X9_ANAMORPHIC) {
1414 		unsigned ana_sq_w = (sq_w / 4) * 3;
1415 
1416 		if (((w - ana_sq_w) / 2) & 1)
1417 			ana_sq_w += 2;
1418 		tpg->square.width = ana_sq_w;
1419 	}
1420 	tpg->square.left = (w - tpg->square.width) / 2;
1421 	if (tpg->pix_aspect == TPG_PIXEL_ASPECT_NTSC)
1422 		sq_h = sq_w * 10 / 11;
1423 	else if (tpg->pix_aspect == TPG_PIXEL_ASPECT_PAL)
1424 		sq_h = sq_w * 59 / 54;
1425 	tpg->square.height = sq_h;
1426 	tpg->square.top = (h - sq_h) / 2;
1427 	tpg->border.left = 0;
1428 	tpg->border.width = w;
1429 	tpg->border.top = 0;
1430 	tpg->border.height = h;
1431 	switch (tpg->vid_aspect) {
1432 	case TPG_VIDEO_ASPECT_4X3:
1433 		if (tpg->pix_aspect)
1434 			return;
1435 		if (3 * w >= 4 * h) {
1436 			tpg->border.width = ((4 * h) / 3) & ~1;
1437 			if (((w - tpg->border.width) / 2) & ~1)
1438 				tpg->border.width -= 2;
1439 			tpg->border.left = (w - tpg->border.width) / 2;
1440 			break;
1441 		}
1442 		tpg->border.height = ((3 * w) / 4) & ~1;
1443 		tpg->border.top = (h - tpg->border.height) / 2;
1444 		break;
1445 	case TPG_VIDEO_ASPECT_14X9_CENTRE:
1446 		if (tpg->pix_aspect) {
1447 			tpg->border.height = tpg->pix_aspect == TPG_PIXEL_ASPECT_NTSC ? 420 : 506;
1448 			tpg->border.top = (h - tpg->border.height) / 2;
1449 			break;
1450 		}
1451 		if (9 * w >= 14 * h) {
1452 			tpg->border.width = ((14 * h) / 9) & ~1;
1453 			if (((w - tpg->border.width) / 2) & ~1)
1454 				tpg->border.width -= 2;
1455 			tpg->border.left = (w - tpg->border.width) / 2;
1456 			break;
1457 		}
1458 		tpg->border.height = ((9 * w) / 14) & ~1;
1459 		tpg->border.top = (h - tpg->border.height) / 2;
1460 		break;
1461 	case TPG_VIDEO_ASPECT_16X9_CENTRE:
1462 		if (tpg->pix_aspect) {
1463 			tpg->border.height = tpg->pix_aspect == TPG_PIXEL_ASPECT_NTSC ? 368 : 442;
1464 			tpg->border.top = (h - tpg->border.height) / 2;
1465 			break;
1466 		}
1467 		if (9 * w >= 16 * h) {
1468 			tpg->border.width = ((16 * h) / 9) & ~1;
1469 			if (((w - tpg->border.width) / 2) & ~1)
1470 				tpg->border.width -= 2;
1471 			tpg->border.left = (w - tpg->border.width) / 2;
1472 			break;
1473 		}
1474 		tpg->border.height = ((9 * w) / 16) & ~1;
1475 		tpg->border.top = (h - tpg->border.height) / 2;
1476 		break;
1477 	default:
1478 		break;
1479 	}
1480 }
1481 
1482 static void tpg_precalculate_line(struct tpg_data *tpg)
1483 {
1484 	enum tpg_color contrast;
1485 	u8 pix[TPG_MAX_PLANES][8];
1486 	unsigned pat;
1487 	unsigned p;
1488 	unsigned x;
1489 
1490 	switch (tpg->pattern) {
1491 	case TPG_PAT_GREEN:
1492 		contrast = TPG_COLOR_100_RED;
1493 		break;
1494 	case TPG_PAT_CSC_COLORBAR:
1495 		contrast = TPG_COLOR_CSC_GREEN;
1496 		break;
1497 	default:
1498 		contrast = TPG_COLOR_100_GREEN;
1499 		break;
1500 	}
1501 
1502 	for (pat = 0; pat < tpg_get_pat_lines(tpg); pat++) {
1503 		/* Coarse scaling with Bresenham */
1504 		unsigned int_part = tpg->src_width / tpg->scaled_width;
1505 		unsigned fract_part = tpg->src_width % tpg->scaled_width;
1506 		unsigned src_x = 0;
1507 		unsigned error = 0;
1508 
1509 		for (x = 0; x < tpg->scaled_width * 2; x += 2) {
1510 			unsigned real_x = src_x;
1511 			enum tpg_color color1, color2;
1512 
1513 			real_x = tpg->hflip ? tpg->src_width * 2 - real_x - 2 : real_x;
1514 			color1 = tpg_get_color(tpg, pat, real_x);
1515 
1516 			src_x += int_part;
1517 			error += fract_part;
1518 			if (error >= tpg->scaled_width) {
1519 				error -= tpg->scaled_width;
1520 				src_x++;
1521 			}
1522 
1523 			real_x = src_x;
1524 			real_x = tpg->hflip ? tpg->src_width * 2 - real_x - 2 : real_x;
1525 			color2 = tpg_get_color(tpg, pat, real_x);
1526 
1527 			src_x += int_part;
1528 			error += fract_part;
1529 			if (error >= tpg->scaled_width) {
1530 				error -= tpg->scaled_width;
1531 				src_x++;
1532 			}
1533 
1534 			gen_twopix(tpg, pix, tpg->hflip ? color2 : color1, 0);
1535 			gen_twopix(tpg, pix, tpg->hflip ? color1 : color2, 1);
1536 			for (p = 0; p < tpg->planes; p++) {
1537 				unsigned twopixsize = tpg->twopixelsize[p];
1538 				unsigned hdiv = tpg->hdownsampling[p];
1539 				u8 *pos = tpg->lines[pat][p] + tpg_hdiv(tpg, p, x);
1540 
1541 				memcpy(pos, pix[p], twopixsize / hdiv);
1542 			}
1543 		}
1544 	}
1545 
1546 	if (tpg->vdownsampling[tpg->planes - 1] > 1) {
1547 		unsigned pat_lines = tpg_get_pat_lines(tpg);
1548 
1549 		for (pat = 0; pat < pat_lines; pat++) {
1550 			unsigned next_pat = (pat + 1) % pat_lines;
1551 
1552 			for (p = 1; p < tpg->planes; p++) {
1553 				unsigned w = tpg_hdiv(tpg, p, tpg->scaled_width * 2);
1554 				u8 *pos1 = tpg->lines[pat][p];
1555 				u8 *pos2 = tpg->lines[next_pat][p];
1556 				u8 *dest = tpg->downsampled_lines[pat][p];
1557 
1558 				for (x = 0; x < w; x++, pos1++, pos2++, dest++)
1559 					*dest = ((u16)*pos1 + (u16)*pos2) / 2;
1560 			}
1561 		}
1562 	}
1563 
1564 	gen_twopix(tpg, pix, contrast, 0);
1565 	gen_twopix(tpg, pix, contrast, 1);
1566 	for (p = 0; p < tpg->planes; p++) {
1567 		unsigned twopixsize = tpg->twopixelsize[p];
1568 		u8 *pos = tpg->contrast_line[p];
1569 
1570 		for (x = 0; x < tpg->scaled_width; x += 2, pos += twopixsize)
1571 			memcpy(pos, pix[p], twopixsize);
1572 	}
1573 
1574 	gen_twopix(tpg, pix, TPG_COLOR_100_BLACK, 0);
1575 	gen_twopix(tpg, pix, TPG_COLOR_100_BLACK, 1);
1576 	for (p = 0; p < tpg->planes; p++) {
1577 		unsigned twopixsize = tpg->twopixelsize[p];
1578 		u8 *pos = tpg->black_line[p];
1579 
1580 		for (x = 0; x < tpg->scaled_width; x += 2, pos += twopixsize)
1581 			memcpy(pos, pix[p], twopixsize);
1582 	}
1583 
1584 	for (x = 0; x < tpg->scaled_width * 2; x += 2) {
1585 		gen_twopix(tpg, pix, TPG_COLOR_RANDOM, 0);
1586 		gen_twopix(tpg, pix, TPG_COLOR_RANDOM, 1);
1587 		for (p = 0; p < tpg->planes; p++) {
1588 			unsigned twopixsize = tpg->twopixelsize[p];
1589 			u8 *pos = tpg->random_line[p] + x * twopixsize / 2;
1590 
1591 			memcpy(pos, pix[p], twopixsize);
1592 		}
1593 	}
1594 
1595 	gen_twopix(tpg, tpg->textbg, TPG_COLOR_TEXTBG, 0);
1596 	gen_twopix(tpg, tpg->textbg, TPG_COLOR_TEXTBG, 1);
1597 	gen_twopix(tpg, tpg->textfg, TPG_COLOR_TEXTFG, 0);
1598 	gen_twopix(tpg, tpg->textfg, TPG_COLOR_TEXTFG, 1);
1599 }
1600 
1601 /* need this to do rgb24 rendering */
1602 typedef struct { u16 __; u8 _; } __packed x24;
1603 
1604 #define PRINTSTR(PIXTYPE) do {	\
1605 	unsigned vdiv = tpg->vdownsampling[p]; \
1606 	unsigned hdiv = tpg->hdownsampling[p]; \
1607 	int line;	\
1608 	PIXTYPE fg;	\
1609 	PIXTYPE bg;	\
1610 	memcpy(&fg, tpg->textfg[p], sizeof(PIXTYPE));	\
1611 	memcpy(&bg, tpg->textbg[p], sizeof(PIXTYPE));	\
1612 	\
1613 	for (line = first; line < 16; line += vdiv * step) {	\
1614 		int l = tpg->vflip ? 15 - line : line; \
1615 		PIXTYPE *pos = (PIXTYPE *)(basep[p][(line / vdiv) & 1] + \
1616 			       ((y * step + l) / (vdiv * div)) * tpg->bytesperline[p] + \
1617 			       (x / hdiv) * sizeof(PIXTYPE));	\
1618 		unsigned s;	\
1619 	\
1620 		for (s = 0; s < len; s++) {	\
1621 			u8 chr = font8x16[text[s] * 16 + line];	\
1622 	\
1623 			if (hdiv == 2 && tpg->hflip) { \
1624 				pos[3] = (chr & (0x01 << 6) ? fg : bg);	\
1625 				pos[2] = (chr & (0x01 << 4) ? fg : bg);	\
1626 				pos[1] = (chr & (0x01 << 2) ? fg : bg);	\
1627 				pos[0] = (chr & (0x01 << 0) ? fg : bg);	\
1628 			} else if (hdiv == 2) { \
1629 				pos[0] = (chr & (0x01 << 7) ? fg : bg);	\
1630 				pos[1] = (chr & (0x01 << 5) ? fg : bg);	\
1631 				pos[2] = (chr & (0x01 << 3) ? fg : bg);	\
1632 				pos[3] = (chr & (0x01 << 1) ? fg : bg);	\
1633 			} else if (tpg->hflip) { \
1634 				pos[7] = (chr & (0x01 << 7) ? fg : bg);	\
1635 				pos[6] = (chr & (0x01 << 6) ? fg : bg);	\
1636 				pos[5] = (chr & (0x01 << 5) ? fg : bg);	\
1637 				pos[4] = (chr & (0x01 << 4) ? fg : bg);	\
1638 				pos[3] = (chr & (0x01 << 3) ? fg : bg);	\
1639 				pos[2] = (chr & (0x01 << 2) ? fg : bg);	\
1640 				pos[1] = (chr & (0x01 << 1) ? fg : bg);	\
1641 				pos[0] = (chr & (0x01 << 0) ? fg : bg);	\
1642 			} else { \
1643 				pos[0] = (chr & (0x01 << 7) ? fg : bg);	\
1644 				pos[1] = (chr & (0x01 << 6) ? fg : bg);	\
1645 				pos[2] = (chr & (0x01 << 5) ? fg : bg);	\
1646 				pos[3] = (chr & (0x01 << 4) ? fg : bg);	\
1647 				pos[4] = (chr & (0x01 << 3) ? fg : bg);	\
1648 				pos[5] = (chr & (0x01 << 2) ? fg : bg);	\
1649 				pos[6] = (chr & (0x01 << 1) ? fg : bg);	\
1650 				pos[7] = (chr & (0x01 << 0) ? fg : bg);	\
1651 			} \
1652 	\
1653 			pos += (tpg->hflip ? -8 : 8) / hdiv;	\
1654 		}	\
1655 	}	\
1656 } while (0)
1657 
1658 static noinline void tpg_print_str_2(const struct tpg_data *tpg, u8 *basep[TPG_MAX_PLANES][2],
1659 			unsigned p, unsigned first, unsigned div, unsigned step,
1660 			int y, int x, char *text, unsigned len)
1661 {
1662 	PRINTSTR(u8);
1663 }
1664 
1665 static noinline void tpg_print_str_4(const struct tpg_data *tpg, u8 *basep[TPG_MAX_PLANES][2],
1666 			unsigned p, unsigned first, unsigned div, unsigned step,
1667 			int y, int x, char *text, unsigned len)
1668 {
1669 	PRINTSTR(u16);
1670 }
1671 
1672 static noinline void tpg_print_str_6(const struct tpg_data *tpg, u8 *basep[TPG_MAX_PLANES][2],
1673 			unsigned p, unsigned first, unsigned div, unsigned step,
1674 			int y, int x, char *text, unsigned len)
1675 {
1676 	PRINTSTR(x24);
1677 }
1678 
1679 static noinline void tpg_print_str_8(const struct tpg_data *tpg, u8 *basep[TPG_MAX_PLANES][2],
1680 			unsigned p, unsigned first, unsigned div, unsigned step,
1681 			int y, int x, char *text, unsigned len)
1682 {
1683 	PRINTSTR(u32);
1684 }
1685 
1686 void tpg_gen_text(const struct tpg_data *tpg, u8 *basep[TPG_MAX_PLANES][2],
1687 		  int y, int x, char *text)
1688 {
1689 	unsigned step = V4L2_FIELD_HAS_T_OR_B(tpg->field) ? 2 : 1;
1690 	unsigned div = step;
1691 	unsigned first = 0;
1692 	unsigned len = strlen(text);
1693 	unsigned p;
1694 
1695 	if (font8x16 == NULL || basep == NULL)
1696 		return;
1697 
1698 	/* Checks if it is possible to show string */
1699 	if (y + 16 >= tpg->compose.height || x + 8 >= tpg->compose.width)
1700 		return;
1701 
1702 	if (len > (tpg->compose.width - x) / 8)
1703 		len = (tpg->compose.width - x) / 8;
1704 	if (tpg->vflip)
1705 		y = tpg->compose.height - y - 16;
1706 	if (tpg->hflip)
1707 		x = tpg->compose.width - x - 8;
1708 	y += tpg->compose.top;
1709 	x += tpg->compose.left;
1710 	if (tpg->field == V4L2_FIELD_BOTTOM)
1711 		first = 1;
1712 	else if (tpg->field == V4L2_FIELD_SEQ_TB || tpg->field == V4L2_FIELD_SEQ_BT)
1713 		div = 2;
1714 
1715 	for (p = 0; p < tpg->planes; p++) {
1716 		/* Print text */
1717 		switch (tpg->twopixelsize[p]) {
1718 		case 2:
1719 			tpg_print_str_2(tpg, basep, p, first, div, step, y, x,
1720 					text, len);
1721 			break;
1722 		case 4:
1723 			tpg_print_str_4(tpg, basep, p, first, div, step, y, x,
1724 					text, len);
1725 			break;
1726 		case 6:
1727 			tpg_print_str_6(tpg, basep, p, first, div, step, y, x,
1728 					text, len);
1729 			break;
1730 		case 8:
1731 			tpg_print_str_8(tpg, basep, p, first, div, step, y, x,
1732 					text, len);
1733 			break;
1734 		}
1735 	}
1736 }
1737 EXPORT_SYMBOL_GPL(tpg_gen_text);
1738 
1739 void tpg_update_mv_step(struct tpg_data *tpg)
1740 {
1741 	int factor = tpg->mv_hor_mode > TPG_MOVE_NONE ? -1 : 1;
1742 
1743 	if (tpg->hflip)
1744 		factor = -factor;
1745 	switch (tpg->mv_hor_mode) {
1746 	case TPG_MOVE_NEG_FAST:
1747 	case TPG_MOVE_POS_FAST:
1748 		tpg->mv_hor_step = ((tpg->src_width + 319) / 320) * 4;
1749 		break;
1750 	case TPG_MOVE_NEG:
1751 	case TPG_MOVE_POS:
1752 		tpg->mv_hor_step = ((tpg->src_width + 639) / 640) * 4;
1753 		break;
1754 	case TPG_MOVE_NEG_SLOW:
1755 	case TPG_MOVE_POS_SLOW:
1756 		tpg->mv_hor_step = 2;
1757 		break;
1758 	case TPG_MOVE_NONE:
1759 		tpg->mv_hor_step = 0;
1760 		break;
1761 	}
1762 	if (factor < 0)
1763 		tpg->mv_hor_step = tpg->src_width - tpg->mv_hor_step;
1764 
1765 	factor = tpg->mv_vert_mode > TPG_MOVE_NONE ? -1 : 1;
1766 	switch (tpg->mv_vert_mode) {
1767 	case TPG_MOVE_NEG_FAST:
1768 	case TPG_MOVE_POS_FAST:
1769 		tpg->mv_vert_step = ((tpg->src_width + 319) / 320) * 4;
1770 		break;
1771 	case TPG_MOVE_NEG:
1772 	case TPG_MOVE_POS:
1773 		tpg->mv_vert_step = ((tpg->src_width + 639) / 640) * 4;
1774 		break;
1775 	case TPG_MOVE_NEG_SLOW:
1776 	case TPG_MOVE_POS_SLOW:
1777 		tpg->mv_vert_step = 1;
1778 		break;
1779 	case TPG_MOVE_NONE:
1780 		tpg->mv_vert_step = 0;
1781 		break;
1782 	}
1783 	if (factor < 0)
1784 		tpg->mv_vert_step = tpg->src_height - tpg->mv_vert_step;
1785 }
1786 EXPORT_SYMBOL_GPL(tpg_update_mv_step);
1787 
1788 /* Map the line number relative to the crop rectangle to a frame line number */
1789 static unsigned tpg_calc_frameline(const struct tpg_data *tpg, unsigned src_y,
1790 				    unsigned field)
1791 {
1792 	switch (field) {
1793 	case V4L2_FIELD_TOP:
1794 		return tpg->crop.top + src_y * 2;
1795 	case V4L2_FIELD_BOTTOM:
1796 		return tpg->crop.top + src_y * 2 + 1;
1797 	default:
1798 		return src_y + tpg->crop.top;
1799 	}
1800 }
1801 
1802 /*
1803  * Map the line number relative to the compose rectangle to a destination
1804  * buffer line number.
1805  */
1806 static unsigned tpg_calc_buffer_line(const struct tpg_data *tpg, unsigned y,
1807 				    unsigned field)
1808 {
1809 	y += tpg->compose.top;
1810 	switch (field) {
1811 	case V4L2_FIELD_SEQ_TB:
1812 		if (y & 1)
1813 			return tpg->buf_height / 2 + y / 2;
1814 		return y / 2;
1815 	case V4L2_FIELD_SEQ_BT:
1816 		if (y & 1)
1817 			return y / 2;
1818 		return tpg->buf_height / 2 + y / 2;
1819 	default:
1820 		return y;
1821 	}
1822 }
1823 
1824 static void tpg_recalc(struct tpg_data *tpg)
1825 {
1826 	if (tpg->recalc_colors) {
1827 		tpg->recalc_colors = false;
1828 		tpg->recalc_lines = true;
1829 		tpg->real_xfer_func = tpg->xfer_func;
1830 		tpg->real_ycbcr_enc = tpg->ycbcr_enc;
1831 		tpg->real_quantization = tpg->quantization;
1832 
1833 		if (tpg->xfer_func == V4L2_XFER_FUNC_DEFAULT)
1834 			tpg->real_xfer_func =
1835 				V4L2_MAP_XFER_FUNC_DEFAULT(tpg->colorspace);
1836 
1837 		if (tpg->ycbcr_enc == V4L2_YCBCR_ENC_DEFAULT)
1838 			tpg->real_ycbcr_enc =
1839 				V4L2_MAP_YCBCR_ENC_DEFAULT(tpg->colorspace);
1840 
1841 		if (tpg->quantization == V4L2_QUANTIZATION_DEFAULT)
1842 			tpg->real_quantization =
1843 				V4L2_MAP_QUANTIZATION_DEFAULT(!tpg->is_yuv,
1844 					tpg->colorspace, tpg->real_ycbcr_enc);
1845 
1846 		tpg_precalculate_colors(tpg);
1847 	}
1848 	if (tpg->recalc_square_border) {
1849 		tpg->recalc_square_border = false;
1850 		tpg_calculate_square_border(tpg);
1851 	}
1852 	if (tpg->recalc_lines) {
1853 		tpg->recalc_lines = false;
1854 		tpg_precalculate_line(tpg);
1855 	}
1856 }
1857 
1858 void tpg_calc_text_basep(struct tpg_data *tpg,
1859 		u8 *basep[TPG_MAX_PLANES][2], unsigned p, u8 *vbuf)
1860 {
1861 	unsigned stride = tpg->bytesperline[p];
1862 	unsigned h = tpg->buf_height;
1863 
1864 	tpg_recalc(tpg);
1865 
1866 	basep[p][0] = vbuf;
1867 	basep[p][1] = vbuf;
1868 	h /= tpg->vdownsampling[p];
1869 	if (tpg->field == V4L2_FIELD_SEQ_TB)
1870 		basep[p][1] += h * stride / 2;
1871 	else if (tpg->field == V4L2_FIELD_SEQ_BT)
1872 		basep[p][0] += h * stride / 2;
1873 	if (p == 0 && tpg->interleaved)
1874 		tpg_calc_text_basep(tpg, basep, 1, vbuf);
1875 }
1876 EXPORT_SYMBOL_GPL(tpg_calc_text_basep);
1877 
1878 static int tpg_pattern_avg(const struct tpg_data *tpg,
1879 			   unsigned pat1, unsigned pat2)
1880 {
1881 	unsigned pat_lines = tpg_get_pat_lines(tpg);
1882 
1883 	if (pat1 == (pat2 + 1) % pat_lines)
1884 		return pat2;
1885 	if (pat2 == (pat1 + 1) % pat_lines)
1886 		return pat1;
1887 	return -1;
1888 }
1889 
1890 void tpg_log_status(struct tpg_data *tpg)
1891 {
1892 	pr_info("tpg source WxH: %ux%u (%s)\n",
1893 			tpg->src_width, tpg->src_height,
1894 			tpg->is_yuv ? "YCbCr" : "RGB");
1895 	pr_info("tpg field: %u\n", tpg->field);
1896 	pr_info("tpg crop: %ux%u@%dx%d\n", tpg->crop.width, tpg->crop.height,
1897 			tpg->crop.left, tpg->crop.top);
1898 	pr_info("tpg compose: %ux%u@%dx%d\n", tpg->compose.width, tpg->compose.height,
1899 			tpg->compose.left, tpg->compose.top);
1900 	pr_info("tpg colorspace: %d\n", tpg->colorspace);
1901 	pr_info("tpg transfer function: %d/%d\n", tpg->xfer_func, tpg->real_xfer_func);
1902 	pr_info("tpg Y'CbCr encoding: %d/%d\n", tpg->ycbcr_enc, tpg->real_ycbcr_enc);
1903 	pr_info("tpg quantization: %d/%d\n", tpg->quantization, tpg->real_quantization);
1904 	pr_info("tpg RGB range: %d/%d\n", tpg->rgb_range, tpg->real_rgb_range);
1905 }
1906 EXPORT_SYMBOL_GPL(tpg_log_status);
1907 
1908 /*
1909  * This struct contains common parameters used by both the drawing of the
1910  * test pattern and the drawing of the extras (borders, square, etc.)
1911  */
1912 struct tpg_draw_params {
1913 	/* common data */
1914 	bool is_tv;
1915 	bool is_60hz;
1916 	unsigned twopixsize;
1917 	unsigned img_width;
1918 	unsigned stride;
1919 	unsigned hmax;
1920 	unsigned frame_line;
1921 	unsigned frame_line_next;
1922 
1923 	/* test pattern */
1924 	unsigned mv_hor_old;
1925 	unsigned mv_hor_new;
1926 	unsigned mv_vert_old;
1927 	unsigned mv_vert_new;
1928 
1929 	/* extras */
1930 	unsigned wss_width;
1931 	unsigned wss_random_offset;
1932 	unsigned sav_eav_f;
1933 	unsigned left_pillar_width;
1934 	unsigned right_pillar_start;
1935 };
1936 
1937 static void tpg_fill_params_pattern(const struct tpg_data *tpg, unsigned p,
1938 				    struct tpg_draw_params *params)
1939 {
1940 	params->mv_hor_old =
1941 		tpg_hscale_div(tpg, p, tpg->mv_hor_count % tpg->src_width);
1942 	params->mv_hor_new =
1943 		tpg_hscale_div(tpg, p, (tpg->mv_hor_count + tpg->mv_hor_step) %
1944 			       tpg->src_width);
1945 	params->mv_vert_old = tpg->mv_vert_count % tpg->src_height;
1946 	params->mv_vert_new =
1947 		(tpg->mv_vert_count + tpg->mv_vert_step) % tpg->src_height;
1948 }
1949 
1950 static void tpg_fill_params_extras(const struct tpg_data *tpg,
1951 				   unsigned p,
1952 				   struct tpg_draw_params *params)
1953 {
1954 	unsigned left_pillar_width = 0;
1955 	unsigned right_pillar_start = params->img_width;
1956 
1957 	params->wss_width = tpg->crop.left < tpg->src_width / 2 ?
1958 		tpg->src_width / 2 - tpg->crop.left : 0;
1959 	if (params->wss_width > tpg->crop.width)
1960 		params->wss_width = tpg->crop.width;
1961 	params->wss_width = tpg_hscale_div(tpg, p, params->wss_width);
1962 	params->wss_random_offset =
1963 		params->twopixsize * prandom_u32_max(tpg->src_width / 2);
1964 
1965 	if (tpg->crop.left < tpg->border.left) {
1966 		left_pillar_width = tpg->border.left - tpg->crop.left;
1967 		if (left_pillar_width > tpg->crop.width)
1968 			left_pillar_width = tpg->crop.width;
1969 		left_pillar_width = tpg_hscale_div(tpg, p, left_pillar_width);
1970 	}
1971 	params->left_pillar_width = left_pillar_width;
1972 
1973 	if (tpg->crop.left + tpg->crop.width >
1974 	    tpg->border.left + tpg->border.width) {
1975 		right_pillar_start =
1976 			tpg->border.left + tpg->border.width - tpg->crop.left;
1977 		right_pillar_start =
1978 			tpg_hscale_div(tpg, p, right_pillar_start);
1979 		if (right_pillar_start > params->img_width)
1980 			right_pillar_start = params->img_width;
1981 	}
1982 	params->right_pillar_start = right_pillar_start;
1983 
1984 	params->sav_eav_f = tpg->field ==
1985 			(params->is_60hz ? V4L2_FIELD_TOP : V4L2_FIELD_BOTTOM);
1986 }
1987 
1988 static void tpg_fill_plane_extras(const struct tpg_data *tpg,
1989 				  const struct tpg_draw_params *params,
1990 				  unsigned p, unsigned h, u8 *vbuf)
1991 {
1992 	unsigned twopixsize = params->twopixsize;
1993 	unsigned img_width = params->img_width;
1994 	unsigned frame_line = params->frame_line;
1995 	const struct v4l2_rect *sq = &tpg->square;
1996 	const struct v4l2_rect *b = &tpg->border;
1997 	const struct v4l2_rect *c = &tpg->crop;
1998 
1999 	if (params->is_tv && !params->is_60hz &&
2000 	    frame_line == 0 && params->wss_width) {
2001 		/*
2002 		 * Replace the first half of the top line of a 50 Hz frame
2003 		 * with random data to simulate a WSS signal.
2004 		 */
2005 		u8 *wss = tpg->random_line[p] + params->wss_random_offset;
2006 
2007 		memcpy(vbuf, wss, params->wss_width);
2008 	}
2009 
2010 	if (tpg->show_border && frame_line >= b->top &&
2011 	    frame_line < b->top + b->height) {
2012 		unsigned bottom = b->top + b->height - 1;
2013 		unsigned left = params->left_pillar_width;
2014 		unsigned right = params->right_pillar_start;
2015 
2016 		if (frame_line == b->top || frame_line == b->top + 1 ||
2017 		    frame_line == bottom || frame_line == bottom - 1) {
2018 			memcpy(vbuf + left, tpg->contrast_line[p],
2019 					right - left);
2020 		} else {
2021 			if (b->left >= c->left &&
2022 			    b->left < c->left + c->width)
2023 				memcpy(vbuf + left,
2024 					tpg->contrast_line[p], twopixsize);
2025 			if (b->left + b->width > c->left &&
2026 			    b->left + b->width <= c->left + c->width)
2027 				memcpy(vbuf + right - twopixsize,
2028 					tpg->contrast_line[p], twopixsize);
2029 		}
2030 	}
2031 	if (tpg->qual != TPG_QUAL_NOISE && frame_line >= b->top &&
2032 	    frame_line < b->top + b->height) {
2033 		memcpy(vbuf, tpg->black_line[p], params->left_pillar_width);
2034 		memcpy(vbuf + params->right_pillar_start, tpg->black_line[p],
2035 		       img_width - params->right_pillar_start);
2036 	}
2037 	if (tpg->show_square && frame_line >= sq->top &&
2038 	    frame_line < sq->top + sq->height &&
2039 	    sq->left < c->left + c->width &&
2040 	    sq->left + sq->width >= c->left) {
2041 		unsigned left = sq->left;
2042 		unsigned width = sq->width;
2043 
2044 		if (c->left > left) {
2045 			width -= c->left - left;
2046 			left = c->left;
2047 		}
2048 		if (c->left + c->width < left + width)
2049 			width -= left + width - c->left - c->width;
2050 		left -= c->left;
2051 		left = tpg_hscale_div(tpg, p, left);
2052 		width = tpg_hscale_div(tpg, p, width);
2053 		memcpy(vbuf + left, tpg->contrast_line[p], width);
2054 	}
2055 	if (tpg->insert_sav) {
2056 		unsigned offset = tpg_hdiv(tpg, p, tpg->compose.width / 3);
2057 		u8 *p = vbuf + offset;
2058 		unsigned vact = 0, hact = 0;
2059 
2060 		p[0] = 0xff;
2061 		p[1] = 0;
2062 		p[2] = 0;
2063 		p[3] = 0x80 | (params->sav_eav_f << 6) |
2064 			(vact << 5) | (hact << 4) |
2065 			((hact ^ vact) << 3) |
2066 			((hact ^ params->sav_eav_f) << 2) |
2067 			((params->sav_eav_f ^ vact) << 1) |
2068 			(hact ^ vact ^ params->sav_eav_f);
2069 	}
2070 	if (tpg->insert_eav) {
2071 		unsigned offset = tpg_hdiv(tpg, p, tpg->compose.width * 2 / 3);
2072 		u8 *p = vbuf + offset;
2073 		unsigned vact = 0, hact = 1;
2074 
2075 		p[0] = 0xff;
2076 		p[1] = 0;
2077 		p[2] = 0;
2078 		p[3] = 0x80 | (params->sav_eav_f << 6) |
2079 			(vact << 5) | (hact << 4) |
2080 			((hact ^ vact) << 3) |
2081 			((hact ^ params->sav_eav_f) << 2) |
2082 			((params->sav_eav_f ^ vact) << 1) |
2083 			(hact ^ vact ^ params->sav_eav_f);
2084 	}
2085 }
2086 
2087 static void tpg_fill_plane_pattern(const struct tpg_data *tpg,
2088 				   const struct tpg_draw_params *params,
2089 				   unsigned p, unsigned h, u8 *vbuf)
2090 {
2091 	unsigned twopixsize = params->twopixsize;
2092 	unsigned img_width = params->img_width;
2093 	unsigned mv_hor_old = params->mv_hor_old;
2094 	unsigned mv_hor_new = params->mv_hor_new;
2095 	unsigned mv_vert_old = params->mv_vert_old;
2096 	unsigned mv_vert_new = params->mv_vert_new;
2097 	unsigned frame_line = params->frame_line;
2098 	unsigned frame_line_next = params->frame_line_next;
2099 	unsigned line_offset = tpg_hscale_div(tpg, p, tpg->crop.left);
2100 	bool even;
2101 	bool fill_blank = false;
2102 	unsigned pat_line_old;
2103 	unsigned pat_line_new;
2104 	u8 *linestart_older;
2105 	u8 *linestart_newer;
2106 	u8 *linestart_top;
2107 	u8 *linestart_bottom;
2108 
2109 	even = !(frame_line & 1);
2110 
2111 	if (h >= params->hmax) {
2112 		if (params->hmax == tpg->compose.height)
2113 			return;
2114 		if (!tpg->perc_fill_blank)
2115 			return;
2116 		fill_blank = true;
2117 	}
2118 
2119 	if (tpg->vflip) {
2120 		frame_line = tpg->src_height - frame_line - 1;
2121 		frame_line_next = tpg->src_height - frame_line_next - 1;
2122 	}
2123 
2124 	if (fill_blank) {
2125 		linestart_older = tpg->contrast_line[p];
2126 		linestart_newer = tpg->contrast_line[p];
2127 	} else if (tpg->qual != TPG_QUAL_NOISE &&
2128 		   (frame_line < tpg->border.top ||
2129 		    frame_line >= tpg->border.top + tpg->border.height)) {
2130 		linestart_older = tpg->black_line[p];
2131 		linestart_newer = tpg->black_line[p];
2132 	} else if (tpg->pattern == TPG_PAT_NOISE || tpg->qual == TPG_QUAL_NOISE) {
2133 		linestart_older = tpg->random_line[p] +
2134 				  twopixsize * prandom_u32_max(tpg->src_width / 2);
2135 		linestart_newer = tpg->random_line[p] +
2136 				  twopixsize * prandom_u32_max(tpg->src_width / 2);
2137 	} else {
2138 		unsigned frame_line_old =
2139 			(frame_line + mv_vert_old) % tpg->src_height;
2140 		unsigned frame_line_new =
2141 			(frame_line + mv_vert_new) % tpg->src_height;
2142 		unsigned pat_line_next_old;
2143 		unsigned pat_line_next_new;
2144 
2145 		pat_line_old = tpg_get_pat_line(tpg, frame_line_old);
2146 		pat_line_new = tpg_get_pat_line(tpg, frame_line_new);
2147 		linestart_older = tpg->lines[pat_line_old][p] + mv_hor_old;
2148 		linestart_newer = tpg->lines[pat_line_new][p] + mv_hor_new;
2149 
2150 		if (tpg->vdownsampling[p] > 1 && frame_line != frame_line_next) {
2151 			int avg_pat;
2152 
2153 			/*
2154 			 * Now decide whether we need to use downsampled_lines[].
2155 			 * That's necessary if the two lines use different patterns.
2156 			 */
2157 			pat_line_next_old = tpg_get_pat_line(tpg,
2158 					(frame_line_next + mv_vert_old) % tpg->src_height);
2159 			pat_line_next_new = tpg_get_pat_line(tpg,
2160 					(frame_line_next + mv_vert_new) % tpg->src_height);
2161 
2162 			switch (tpg->field) {
2163 			case V4L2_FIELD_INTERLACED:
2164 			case V4L2_FIELD_INTERLACED_BT:
2165 			case V4L2_FIELD_INTERLACED_TB:
2166 				avg_pat = tpg_pattern_avg(tpg, pat_line_old, pat_line_new);
2167 				if (avg_pat < 0)
2168 					break;
2169 				linestart_older = tpg->downsampled_lines[avg_pat][p] + mv_hor_old;
2170 				linestart_newer = linestart_older;
2171 				break;
2172 			case V4L2_FIELD_NONE:
2173 			case V4L2_FIELD_TOP:
2174 			case V4L2_FIELD_BOTTOM:
2175 			case V4L2_FIELD_SEQ_BT:
2176 			case V4L2_FIELD_SEQ_TB:
2177 				avg_pat = tpg_pattern_avg(tpg, pat_line_old, pat_line_next_old);
2178 				if (avg_pat >= 0)
2179 					linestart_older = tpg->downsampled_lines[avg_pat][p] +
2180 						mv_hor_old;
2181 				avg_pat = tpg_pattern_avg(tpg, pat_line_new, pat_line_next_new);
2182 				if (avg_pat >= 0)
2183 					linestart_newer = tpg->downsampled_lines[avg_pat][p] +
2184 						mv_hor_new;
2185 				break;
2186 			}
2187 		}
2188 		linestart_older += line_offset;
2189 		linestart_newer += line_offset;
2190 	}
2191 	if (tpg->field_alternate) {
2192 		linestart_top = linestart_bottom = linestart_older;
2193 	} else if (params->is_60hz) {
2194 		linestart_top = linestart_newer;
2195 		linestart_bottom = linestart_older;
2196 	} else {
2197 		linestart_top = linestart_older;
2198 		linestart_bottom = linestart_newer;
2199 	}
2200 
2201 	switch (tpg->field) {
2202 	case V4L2_FIELD_INTERLACED:
2203 	case V4L2_FIELD_INTERLACED_TB:
2204 	case V4L2_FIELD_SEQ_TB:
2205 	case V4L2_FIELD_SEQ_BT:
2206 		if (even)
2207 			memcpy(vbuf, linestart_top, img_width);
2208 		else
2209 			memcpy(vbuf, linestart_bottom, img_width);
2210 		break;
2211 	case V4L2_FIELD_INTERLACED_BT:
2212 		if (even)
2213 			memcpy(vbuf, linestart_bottom, img_width);
2214 		else
2215 			memcpy(vbuf, linestart_top, img_width);
2216 		break;
2217 	case V4L2_FIELD_TOP:
2218 		memcpy(vbuf, linestart_top, img_width);
2219 		break;
2220 	case V4L2_FIELD_BOTTOM:
2221 		memcpy(vbuf, linestart_bottom, img_width);
2222 		break;
2223 	case V4L2_FIELD_NONE:
2224 	default:
2225 		memcpy(vbuf, linestart_older, img_width);
2226 		break;
2227 	}
2228 }
2229 
2230 void tpg_fill_plane_buffer(struct tpg_data *tpg, v4l2_std_id std,
2231 			   unsigned p, u8 *vbuf)
2232 {
2233 	struct tpg_draw_params params;
2234 	unsigned factor = V4L2_FIELD_HAS_T_OR_B(tpg->field) ? 2 : 1;
2235 
2236 	/* Coarse scaling with Bresenham */
2237 	unsigned int_part = (tpg->crop.height / factor) / tpg->compose.height;
2238 	unsigned fract_part = (tpg->crop.height / factor) % tpg->compose.height;
2239 	unsigned src_y = 0;
2240 	unsigned error = 0;
2241 	unsigned h;
2242 
2243 	tpg_recalc(tpg);
2244 
2245 	params.is_tv = std;
2246 	params.is_60hz = std & V4L2_STD_525_60;
2247 	params.twopixsize = tpg->twopixelsize[p];
2248 	params.img_width = tpg_hdiv(tpg, p, tpg->compose.width);
2249 	params.stride = tpg->bytesperline[p];
2250 	params.hmax = (tpg->compose.height * tpg->perc_fill) / 100;
2251 
2252 	tpg_fill_params_pattern(tpg, p, &params);
2253 	tpg_fill_params_extras(tpg, p, &params);
2254 
2255 	vbuf += tpg_hdiv(tpg, p, tpg->compose.left);
2256 
2257 	for (h = 0; h < tpg->compose.height; h++) {
2258 		unsigned buf_line;
2259 
2260 		params.frame_line = tpg_calc_frameline(tpg, src_y, tpg->field);
2261 		params.frame_line_next = params.frame_line;
2262 		buf_line = tpg_calc_buffer_line(tpg, h, tpg->field);
2263 		src_y += int_part;
2264 		error += fract_part;
2265 		if (error >= tpg->compose.height) {
2266 			error -= tpg->compose.height;
2267 			src_y++;
2268 		}
2269 
2270 		/*
2271 		 * For line-interleaved formats determine the 'plane'
2272 		 * based on the buffer line.
2273 		 */
2274 		if (tpg_g_interleaved(tpg))
2275 			p = tpg_g_interleaved_plane(tpg, buf_line);
2276 
2277 		if (tpg->vdownsampling[p] > 1) {
2278 			/*
2279 			 * When doing vertical downsampling the field setting
2280 			 * matters: for SEQ_BT/TB we downsample each field
2281 			 * separately (i.e. lines 0+2 are combined, as are
2282 			 * lines 1+3), for the other field settings we combine
2283 			 * odd and even lines. Doing that for SEQ_BT/TB would
2284 			 * be really weird.
2285 			 */
2286 			if (tpg->field == V4L2_FIELD_SEQ_BT ||
2287 			    tpg->field == V4L2_FIELD_SEQ_TB) {
2288 				unsigned next_src_y = src_y;
2289 
2290 				if ((h & 3) >= 2)
2291 					continue;
2292 				next_src_y += int_part;
2293 				if (error + fract_part >= tpg->compose.height)
2294 					next_src_y++;
2295 				params.frame_line_next =
2296 					tpg_calc_frameline(tpg, next_src_y, tpg->field);
2297 			} else {
2298 				if (h & 1)
2299 					continue;
2300 				params.frame_line_next =
2301 					tpg_calc_frameline(tpg, src_y, tpg->field);
2302 			}
2303 
2304 			buf_line /= tpg->vdownsampling[p];
2305 		}
2306 		tpg_fill_plane_pattern(tpg, &params, p, h,
2307 				vbuf + buf_line * params.stride);
2308 		tpg_fill_plane_extras(tpg, &params, p, h,
2309 				vbuf + buf_line * params.stride);
2310 	}
2311 }
2312 EXPORT_SYMBOL_GPL(tpg_fill_plane_buffer);
2313 
2314 void tpg_fillbuffer(struct tpg_data *tpg, v4l2_std_id std, unsigned p, u8 *vbuf)
2315 {
2316 	unsigned offset = 0;
2317 	unsigned i;
2318 
2319 	if (tpg->buffers > 1) {
2320 		tpg_fill_plane_buffer(tpg, std, p, vbuf);
2321 		return;
2322 	}
2323 
2324 	for (i = 0; i < tpg_g_planes(tpg); i++) {
2325 		tpg_fill_plane_buffer(tpg, std, i, vbuf + offset);
2326 		offset += tpg_calc_plane_size(tpg, i);
2327 	}
2328 }
2329 EXPORT_SYMBOL_GPL(tpg_fillbuffer);
2330 
2331 MODULE_DESCRIPTION("V4L2 Test Pattern Generator");
2332 MODULE_AUTHOR("Hans Verkuil");
2333 MODULE_LICENSE("GPL");
2334