1 /*
2  * Copyright © 2006-2008 Intel Corporation
3  *   Jesse Barnes <jesse.barnes@intel.com>
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the next
13  * paragraph) shall be included in all copies or substantial portions of the
14  * Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22  * DEALINGS IN THE SOFTWARE.
23  *
24  * Authors:
25  *    Eric Anholt <eric@anholt.net>
26  *
27  */
28 
29 /** @file
30  * Integrated TV-out support for the 915GM and 945GM.
31  */
32 
33 #include <drm/drm_atomic_helper.h>
34 #include <drm/drm_crtc.h>
35 #include <drm/drm_edid.h>
36 
37 #include "i915_drv.h"
38 #include "intel_connector.h"
39 #include "intel_display_types.h"
40 #include "intel_hotplug.h"
41 #include "intel_tv.h"
42 
43 enum tv_margin {
44 	TV_MARGIN_LEFT, TV_MARGIN_TOP,
45 	TV_MARGIN_RIGHT, TV_MARGIN_BOTTOM
46 };
47 
48 struct intel_tv {
49 	struct intel_encoder base;
50 
51 	int type;
52 };
53 
54 struct video_levels {
55 	u16 blank, black;
56 	u8 burst;
57 };
58 
59 struct color_conversion {
60 	u16 ry, gy, by, ay;
61 	u16 ru, gu, bu, au;
62 	u16 rv, gv, bv, av;
63 };
64 
65 static const u32 filter_table[] = {
66 	0xB1403000, 0x2E203500, 0x35002E20, 0x3000B140,
67 	0x35A0B160, 0x2DC02E80, 0xB1403480, 0xB1603000,
68 	0x2EA03640, 0x34002D80, 0x3000B120, 0x36E0B160,
69 	0x2D202EF0, 0xB1203380, 0xB1603000, 0x2F303780,
70 	0x33002CC0, 0x3000B100, 0x3820B160, 0x2C802F50,
71 	0xB10032A0, 0xB1603000, 0x2F9038C0, 0x32202C20,
72 	0x3000B0E0, 0x3980B160, 0x2BC02FC0, 0xB0E031C0,
73 	0xB1603000, 0x2FF03A20, 0x31602B60, 0xB020B0C0,
74 	0x3AE0B160, 0x2B001810, 0xB0C03120, 0xB140B020,
75 	0x18283BA0, 0x30C02A80, 0xB020B0A0, 0x3C60B140,
76 	0x2A201838, 0xB0A03080, 0xB120B020, 0x18383D20,
77 	0x304029C0, 0xB040B080, 0x3DE0B100, 0x29601848,
78 	0xB0803000, 0xB100B040, 0x18483EC0, 0xB0402900,
79 	0xB040B060, 0x3F80B0C0, 0x28801858, 0xB060B080,
80 	0xB0A0B060, 0x18602820, 0xB0A02820, 0x0000B060,
81 	0xB1403000, 0x2E203500, 0x35002E20, 0x3000B140,
82 	0x35A0B160, 0x2DC02E80, 0xB1403480, 0xB1603000,
83 	0x2EA03640, 0x34002D80, 0x3000B120, 0x36E0B160,
84 	0x2D202EF0, 0xB1203380, 0xB1603000, 0x2F303780,
85 	0x33002CC0, 0x3000B100, 0x3820B160, 0x2C802F50,
86 	0xB10032A0, 0xB1603000, 0x2F9038C0, 0x32202C20,
87 	0x3000B0E0, 0x3980B160, 0x2BC02FC0, 0xB0E031C0,
88 	0xB1603000, 0x2FF03A20, 0x31602B60, 0xB020B0C0,
89 	0x3AE0B160, 0x2B001810, 0xB0C03120, 0xB140B020,
90 	0x18283BA0, 0x30C02A80, 0xB020B0A0, 0x3C60B140,
91 	0x2A201838, 0xB0A03080, 0xB120B020, 0x18383D20,
92 	0x304029C0, 0xB040B080, 0x3DE0B100, 0x29601848,
93 	0xB0803000, 0xB100B040, 0x18483EC0, 0xB0402900,
94 	0xB040B060, 0x3F80B0C0, 0x28801858, 0xB060B080,
95 	0xB0A0B060, 0x18602820, 0xB0A02820, 0x0000B060,
96 	0x36403000, 0x2D002CC0, 0x30003640, 0x2D0036C0,
97 	0x35C02CC0, 0x37403000, 0x2C802D40, 0x30003540,
98 	0x2D8037C0, 0x34C02C40, 0x38403000, 0x2BC02E00,
99 	0x30003440, 0x2E2038C0, 0x34002B80, 0x39803000,
100 	0x2B402E40, 0x30003380, 0x2E603A00, 0x33402B00,
101 	0x3A803040, 0x2A802EA0, 0x30403300, 0x2EC03B40,
102 	0x32802A40, 0x3C003040, 0x2A002EC0, 0x30803240,
103 	0x2EC03C80, 0x320029C0, 0x3D403080, 0x29402F00,
104 	0x308031C0, 0x2F203DC0, 0x31802900, 0x3E8030C0,
105 	0x28802F40, 0x30C03140, 0x2F203F40, 0x31402840,
106 	0x28003100, 0x28002F00, 0x00003100, 0x36403000,
107 	0x2D002CC0, 0x30003640, 0x2D0036C0,
108 	0x35C02CC0, 0x37403000, 0x2C802D40, 0x30003540,
109 	0x2D8037C0, 0x34C02C40, 0x38403000, 0x2BC02E00,
110 	0x30003440, 0x2E2038C0, 0x34002B80, 0x39803000,
111 	0x2B402E40, 0x30003380, 0x2E603A00, 0x33402B00,
112 	0x3A803040, 0x2A802EA0, 0x30403300, 0x2EC03B40,
113 	0x32802A40, 0x3C003040, 0x2A002EC0, 0x30803240,
114 	0x2EC03C80, 0x320029C0, 0x3D403080, 0x29402F00,
115 	0x308031C0, 0x2F203DC0, 0x31802900, 0x3E8030C0,
116 	0x28802F40, 0x30C03140, 0x2F203F40, 0x31402840,
117 	0x28003100, 0x28002F00, 0x00003100,
118 };
119 
120 /*
121  * Color conversion values have 3 separate fixed point formats:
122  *
123  * 10 bit fields (ay, au)
124  *   1.9 fixed point (b.bbbbbbbbb)
125  * 11 bit fields (ry, by, ru, gu, gv)
126  *   exp.mantissa (ee.mmmmmmmmm)
127  *   ee = 00 = 10^-1 (0.mmmmmmmmm)
128  *   ee = 01 = 10^-2 (0.0mmmmmmmmm)
129  *   ee = 10 = 10^-3 (0.00mmmmmmmmm)
130  *   ee = 11 = 10^-4 (0.000mmmmmmmmm)
131  * 12 bit fields (gy, rv, bu)
132  *   exp.mantissa (eee.mmmmmmmmm)
133  *   eee = 000 = 10^-1 (0.mmmmmmmmm)
134  *   eee = 001 = 10^-2 (0.0mmmmmmmmm)
135  *   eee = 010 = 10^-3 (0.00mmmmmmmmm)
136  *   eee = 011 = 10^-4 (0.000mmmmmmmmm)
137  *   eee = 100 = reserved
138  *   eee = 101 = reserved
139  *   eee = 110 = reserved
140  *   eee = 111 = 10^0 (m.mmmmmmmm) (only usable for 1.0 representation)
141  *
142  * Saturation and contrast are 8 bits, with their own representation:
143  * 8 bit field (saturation, contrast)
144  *   exp.mantissa (ee.mmmmmm)
145  *   ee = 00 = 10^-1 (0.mmmmmm)
146  *   ee = 01 = 10^0 (m.mmmmm)
147  *   ee = 10 = 10^1 (mm.mmmm)
148  *   ee = 11 = 10^2 (mmm.mmm)
149  *
150  * Simple conversion function:
151  *
152  * static u32
153  * float_to_csc_11(float f)
154  * {
155  *     u32 exp;
156  *     u32 mant;
157  *     u32 ret;
158  *
159  *     if (f < 0)
160  *         f = -f;
161  *
162  *     if (f >= 1) {
163  *         exp = 0x7;
164  *	   mant = 1 << 8;
165  *     } else {
166  *         for (exp = 0; exp < 3 && f < 0.5; exp++)
167  *	   f *= 2.0;
168  *         mant = (f * (1 << 9) + 0.5);
169  *         if (mant >= (1 << 9))
170  *             mant = (1 << 9) - 1;
171  *     }
172  *     ret = (exp << 9) | mant;
173  *     return ret;
174  * }
175  */
176 
177 /*
178  * Behold, magic numbers!  If we plant them they might grow a big
179  * s-video cable to the sky... or something.
180  *
181  * Pre-converted to appropriate hex value.
182  */
183 
184 /*
185  * PAL & NTSC values for composite & s-video connections
186  */
187 static const struct color_conversion ntsc_m_csc_composite = {
188 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0104,
189 	.ru = 0x0733, .gu = 0x052d, .bu = 0x05c7, .au = 0x0200,
190 	.rv = 0x0340, .gv = 0x030c, .bv = 0x06d0, .av = 0x0200,
191 };
192 
193 static const struct video_levels ntsc_m_levels_composite = {
194 	.blank = 225, .black = 267, .burst = 113,
195 };
196 
197 static const struct color_conversion ntsc_m_csc_svideo = {
198 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0133,
199 	.ru = 0x076a, .gu = 0x0564, .bu = 0x030d, .au = 0x0200,
200 	.rv = 0x037a, .gv = 0x033d, .bv = 0x06f6, .av = 0x0200,
201 };
202 
203 static const struct video_levels ntsc_m_levels_svideo = {
204 	.blank = 266, .black = 316, .burst = 133,
205 };
206 
207 static const struct color_conversion ntsc_j_csc_composite = {
208 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0119,
209 	.ru = 0x074c, .gu = 0x0546, .bu = 0x05ec, .au = 0x0200,
210 	.rv = 0x035a, .gv = 0x0322, .bv = 0x06e1, .av = 0x0200,
211 };
212 
213 static const struct video_levels ntsc_j_levels_composite = {
214 	.blank = 225, .black = 225, .burst = 113,
215 };
216 
217 static const struct color_conversion ntsc_j_csc_svideo = {
218 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x014c,
219 	.ru = 0x0788, .gu = 0x0581, .bu = 0x0322, .au = 0x0200,
220 	.rv = 0x0399, .gv = 0x0356, .bv = 0x070a, .av = 0x0200,
221 };
222 
223 static const struct video_levels ntsc_j_levels_svideo = {
224 	.blank = 266, .black = 266, .burst = 133,
225 };
226 
227 static const struct color_conversion pal_csc_composite = {
228 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0113,
229 	.ru = 0x0745, .gu = 0x053f, .bu = 0x05e1, .au = 0x0200,
230 	.rv = 0x0353, .gv = 0x031c, .bv = 0x06dc, .av = 0x0200,
231 };
232 
233 static const struct video_levels pal_levels_composite = {
234 	.blank = 237, .black = 237, .burst = 118,
235 };
236 
237 static const struct color_conversion pal_csc_svideo = {
238 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0145,
239 	.ru = 0x0780, .gu = 0x0579, .bu = 0x031c, .au = 0x0200,
240 	.rv = 0x0390, .gv = 0x034f, .bv = 0x0705, .av = 0x0200,
241 };
242 
243 static const struct video_levels pal_levels_svideo = {
244 	.blank = 280, .black = 280, .burst = 139,
245 };
246 
247 static const struct color_conversion pal_m_csc_composite = {
248 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0104,
249 	.ru = 0x0733, .gu = 0x052d, .bu = 0x05c7, .au = 0x0200,
250 	.rv = 0x0340, .gv = 0x030c, .bv = 0x06d0, .av = 0x0200,
251 };
252 
253 static const struct video_levels pal_m_levels_composite = {
254 	.blank = 225, .black = 267, .burst = 113,
255 };
256 
257 static const struct color_conversion pal_m_csc_svideo = {
258 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0133,
259 	.ru = 0x076a, .gu = 0x0564, .bu = 0x030d, .au = 0x0200,
260 	.rv = 0x037a, .gv = 0x033d, .bv = 0x06f6, .av = 0x0200,
261 };
262 
263 static const struct video_levels pal_m_levels_svideo = {
264 	.blank = 266, .black = 316, .burst = 133,
265 };
266 
267 static const struct color_conversion pal_n_csc_composite = {
268 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0104,
269 	.ru = 0x0733, .gu = 0x052d, .bu = 0x05c7, .au = 0x0200,
270 	.rv = 0x0340, .gv = 0x030c, .bv = 0x06d0, .av = 0x0200,
271 };
272 
273 static const struct video_levels pal_n_levels_composite = {
274 	.blank = 225, .black = 267, .burst = 118,
275 };
276 
277 static const struct color_conversion pal_n_csc_svideo = {
278 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0133,
279 	.ru = 0x076a, .gu = 0x0564, .bu = 0x030d, .au = 0x0200,
280 	.rv = 0x037a, .gv = 0x033d, .bv = 0x06f6, .av = 0x0200,
281 };
282 
283 static const struct video_levels pal_n_levels_svideo = {
284 	.blank = 266, .black = 316, .burst = 139,
285 };
286 
287 /*
288  * Component connections
289  */
290 static const struct color_conversion sdtv_csc_yprpb = {
291 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0145,
292 	.ru = 0x0559, .gu = 0x0353, .bu = 0x0100, .au = 0x0200,
293 	.rv = 0x0100, .gv = 0x03ad, .bv = 0x074d, .av = 0x0200,
294 };
295 
296 static const struct color_conversion hdtv_csc_yprpb = {
297 	.ry = 0x05b3, .gy = 0x016e, .by = 0x0728, .ay = 0x0145,
298 	.ru = 0x07d5, .gu = 0x038b, .bu = 0x0100, .au = 0x0200,
299 	.rv = 0x0100, .gv = 0x03d1, .bv = 0x06bc, .av = 0x0200,
300 };
301 
302 static const struct video_levels component_levels = {
303 	.blank = 279, .black = 279, .burst = 0,
304 };
305 
306 
307 struct tv_mode {
308 	const char *name;
309 
310 	u32 clock;
311 	u16 refresh; /* in millihertz (for precision) */
312 	u8 oversample;
313 	u8 hsync_end;
314 	u16 hblank_start, hblank_end, htotal;
315 	bool progressive : 1, trilevel_sync : 1, component_only : 1;
316 	u8 vsync_start_f1, vsync_start_f2, vsync_len;
317 	bool veq_ena : 1;
318 	u8 veq_start_f1, veq_start_f2, veq_len;
319 	u8 vi_end_f1, vi_end_f2;
320 	u16 nbr_end;
321 	bool burst_ena : 1;
322 	u8 hburst_start, hburst_len;
323 	u8 vburst_start_f1;
324 	u16 vburst_end_f1;
325 	u8 vburst_start_f2;
326 	u16 vburst_end_f2;
327 	u8 vburst_start_f3;
328 	u16 vburst_end_f3;
329 	u8 vburst_start_f4;
330 	u16 vburst_end_f4;
331 	/*
332 	 * subcarrier programming
333 	 */
334 	u16 dda2_size, dda3_size;
335 	u8 dda1_inc;
336 	u16 dda2_inc, dda3_inc;
337 	u32 sc_reset;
338 	bool pal_burst : 1;
339 	/*
340 	 * blank/black levels
341 	 */
342 	const struct video_levels *composite_levels, *svideo_levels;
343 	const struct color_conversion *composite_color, *svideo_color;
344 	const u32 *filter_table;
345 };
346 
347 
348 /*
349  * Sub carrier DDA
350  *
351  *  I think this works as follows:
352  *
353  *  subcarrier freq = pixel_clock * (dda1_inc + dda2_inc / dda2_size) / 4096
354  *
355  * Presumably, when dda3 is added in, it gets to adjust the dda2_inc value
356  *
357  * So,
358  *  dda1_ideal = subcarrier/pixel * 4096
359  *  dda1_inc = floor (dda1_ideal)
360  *  dda2 = dda1_ideal - dda1_inc
361  *
362  *  then pick a ratio for dda2 that gives the closest approximation. If
363  *  you can't get close enough, you can play with dda3 as well. This
364  *  seems likely to happen when dda2 is small as the jumps would be larger
365  *
366  * To invert this,
367  *
368  *  pixel_clock = subcarrier * 4096 / (dda1_inc + dda2_inc / dda2_size)
369  *
370  * The constants below were all computed using a 107.520MHz clock
371  */
372 
373 /*
374  * Register programming values for TV modes.
375  *
376  * These values account for -1s required.
377  */
378 static const struct tv_mode tv_modes[] = {
379 	{
380 		.name		= "NTSC-M",
381 		.clock		= 108000,
382 		.refresh	= 59940,
383 		.oversample	= 8,
384 		.component_only = false,
385 		/* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 3.580MHz */
386 
387 		.hsync_end	= 64,		    .hblank_end		= 124,
388 		.hblank_start	= 836,		    .htotal		= 857,
389 
390 		.progressive	= false,	    .trilevel_sync = false,
391 
392 		.vsync_start_f1	= 6,		    .vsync_start_f2	= 7,
393 		.vsync_len	= 6,
394 
395 		.veq_ena	= true,		    .veq_start_f1	= 0,
396 		.veq_start_f2	= 1,		    .veq_len		= 18,
397 
398 		.vi_end_f1	= 20,		    .vi_end_f2		= 21,
399 		.nbr_end	= 240,
400 
401 		.burst_ena	= true,
402 		.hburst_start	= 72,		    .hburst_len		= 34,
403 		.vburst_start_f1 = 9,		    .vburst_end_f1	= 240,
404 		.vburst_start_f2 = 10,		    .vburst_end_f2	= 240,
405 		.vburst_start_f3 = 9,		    .vburst_end_f3	= 240,
406 		.vburst_start_f4 = 10,		    .vburst_end_f4	= 240,
407 
408 		/* desired 3.5800000 actual 3.5800000 clock 107.52 */
409 		.dda1_inc	=    135,
410 		.dda2_inc	=  20800,	    .dda2_size		=  27456,
411 		.dda3_inc	=      0,	    .dda3_size		=      0,
412 		.sc_reset	= TV_SC_RESET_EVERY_4,
413 		.pal_burst	= false,
414 
415 		.composite_levels = &ntsc_m_levels_composite,
416 		.composite_color = &ntsc_m_csc_composite,
417 		.svideo_levels  = &ntsc_m_levels_svideo,
418 		.svideo_color = &ntsc_m_csc_svideo,
419 
420 		.filter_table = filter_table,
421 	},
422 	{
423 		.name		= "NTSC-443",
424 		.clock		= 108000,
425 		.refresh	= 59940,
426 		.oversample	= 8,
427 		.component_only = false,
428 		/* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 4.43MHz */
429 		.hsync_end	= 64,		    .hblank_end		= 124,
430 		.hblank_start	= 836,		    .htotal		= 857,
431 
432 		.progressive	= false,	    .trilevel_sync = false,
433 
434 		.vsync_start_f1 = 6,		    .vsync_start_f2	= 7,
435 		.vsync_len	= 6,
436 
437 		.veq_ena	= true,		    .veq_start_f1	= 0,
438 		.veq_start_f2	= 1,		    .veq_len		= 18,
439 
440 		.vi_end_f1	= 20,		    .vi_end_f2		= 21,
441 		.nbr_end	= 240,
442 
443 		.burst_ena	= true,
444 		.hburst_start	= 72,		    .hburst_len		= 34,
445 		.vburst_start_f1 = 9,		    .vburst_end_f1	= 240,
446 		.vburst_start_f2 = 10,		    .vburst_end_f2	= 240,
447 		.vburst_start_f3 = 9,		    .vburst_end_f3	= 240,
448 		.vburst_start_f4 = 10,		    .vburst_end_f4	= 240,
449 
450 		/* desired 4.4336180 actual 4.4336180 clock 107.52 */
451 		.dda1_inc       =    168,
452 		.dda2_inc       =   4093,       .dda2_size      =  27456,
453 		.dda3_inc       =    310,       .dda3_size      =    525,
454 		.sc_reset   = TV_SC_RESET_NEVER,
455 		.pal_burst  = false,
456 
457 		.composite_levels = &ntsc_m_levels_composite,
458 		.composite_color = &ntsc_m_csc_composite,
459 		.svideo_levels  = &ntsc_m_levels_svideo,
460 		.svideo_color = &ntsc_m_csc_svideo,
461 
462 		.filter_table = filter_table,
463 	},
464 	{
465 		.name		= "NTSC-J",
466 		.clock		= 108000,
467 		.refresh	= 59940,
468 		.oversample	= 8,
469 		.component_only = false,
470 
471 		/* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 3.580MHz */
472 		.hsync_end	= 64,		    .hblank_end		= 124,
473 		.hblank_start = 836,	    .htotal		= 857,
474 
475 		.progressive	= false,    .trilevel_sync = false,
476 
477 		.vsync_start_f1	= 6,	    .vsync_start_f2	= 7,
478 		.vsync_len	= 6,
479 
480 		.veq_ena      = true,	    .veq_start_f1	= 0,
481 		.veq_start_f2 = 1,	    .veq_len		= 18,
482 
483 		.vi_end_f1	= 20,		    .vi_end_f2		= 21,
484 		.nbr_end	= 240,
485 
486 		.burst_ena	= true,
487 		.hburst_start	= 72,		    .hburst_len		= 34,
488 		.vburst_start_f1 = 9,		    .vburst_end_f1	= 240,
489 		.vburst_start_f2 = 10,		    .vburst_end_f2	= 240,
490 		.vburst_start_f3 = 9,		    .vburst_end_f3	= 240,
491 		.vburst_start_f4 = 10,		    .vburst_end_f4	= 240,
492 
493 		/* desired 3.5800000 actual 3.5800000 clock 107.52 */
494 		.dda1_inc	=    135,
495 		.dda2_inc	=  20800,	    .dda2_size		=  27456,
496 		.dda3_inc	=      0,	    .dda3_size		=      0,
497 		.sc_reset	= TV_SC_RESET_EVERY_4,
498 		.pal_burst	= false,
499 
500 		.composite_levels = &ntsc_j_levels_composite,
501 		.composite_color = &ntsc_j_csc_composite,
502 		.svideo_levels  = &ntsc_j_levels_svideo,
503 		.svideo_color = &ntsc_j_csc_svideo,
504 
505 		.filter_table = filter_table,
506 	},
507 	{
508 		.name		= "PAL-M",
509 		.clock		= 108000,
510 		.refresh	= 59940,
511 		.oversample	= 8,
512 		.component_only = false,
513 
514 		/* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 3.580MHz */
515 		.hsync_end	= 64,		  .hblank_end		= 124,
516 		.hblank_start = 836,	  .htotal		= 857,
517 
518 		.progressive	= false,	    .trilevel_sync = false,
519 
520 		.vsync_start_f1	= 6,		    .vsync_start_f2	= 7,
521 		.vsync_len	= 6,
522 
523 		.veq_ena	= true,		    .veq_start_f1	= 0,
524 		.veq_start_f2	= 1,		    .veq_len		= 18,
525 
526 		.vi_end_f1	= 20,		    .vi_end_f2		= 21,
527 		.nbr_end	= 240,
528 
529 		.burst_ena	= true,
530 		.hburst_start	= 72,		    .hburst_len		= 34,
531 		.vburst_start_f1 = 9,		    .vburst_end_f1	= 240,
532 		.vburst_start_f2 = 10,		    .vburst_end_f2	= 240,
533 		.vburst_start_f3 = 9,		    .vburst_end_f3	= 240,
534 		.vburst_start_f4 = 10,		    .vburst_end_f4	= 240,
535 
536 		/* desired 3.5800000 actual 3.5800000 clock 107.52 */
537 		.dda1_inc	=    135,
538 		.dda2_inc	=  16704,	    .dda2_size		=  27456,
539 		.dda3_inc	=      0,	    .dda3_size		=      0,
540 		.sc_reset	= TV_SC_RESET_EVERY_8,
541 		.pal_burst  = true,
542 
543 		.composite_levels = &pal_m_levels_composite,
544 		.composite_color = &pal_m_csc_composite,
545 		.svideo_levels  = &pal_m_levels_svideo,
546 		.svideo_color = &pal_m_csc_svideo,
547 
548 		.filter_table = filter_table,
549 	},
550 	{
551 		/* 625 Lines, 50 Fields, 15.625KHz line, Sub-Carrier 4.434MHz */
552 		.name	    = "PAL-N",
553 		.clock		= 108000,
554 		.refresh	= 50000,
555 		.oversample	= 8,
556 		.component_only = false,
557 
558 		.hsync_end	= 64,		    .hblank_end		= 128,
559 		.hblank_start = 844,	    .htotal		= 863,
560 
561 		.progressive  = false,    .trilevel_sync = false,
562 
563 
564 		.vsync_start_f1	= 6,	   .vsync_start_f2	= 7,
565 		.vsync_len	= 6,
566 
567 		.veq_ena	= true,		    .veq_start_f1	= 0,
568 		.veq_start_f2	= 1,		    .veq_len		= 18,
569 
570 		.vi_end_f1	= 24,		    .vi_end_f2		= 25,
571 		.nbr_end	= 286,
572 
573 		.burst_ena	= true,
574 		.hburst_start = 73,	    .hburst_len		= 34,
575 		.vburst_start_f1 = 8,	    .vburst_end_f1	= 285,
576 		.vburst_start_f2 = 8,	    .vburst_end_f2	= 286,
577 		.vburst_start_f3 = 9,	    .vburst_end_f3	= 286,
578 		.vburst_start_f4 = 9,	    .vburst_end_f4	= 285,
579 
580 
581 		/* desired 4.4336180 actual 4.4336180 clock 107.52 */
582 		.dda1_inc       =    135,
583 		.dda2_inc       =  23578,       .dda2_size      =  27648,
584 		.dda3_inc       =    134,       .dda3_size      =    625,
585 		.sc_reset   = TV_SC_RESET_EVERY_8,
586 		.pal_burst  = true,
587 
588 		.composite_levels = &pal_n_levels_composite,
589 		.composite_color = &pal_n_csc_composite,
590 		.svideo_levels  = &pal_n_levels_svideo,
591 		.svideo_color = &pal_n_csc_svideo,
592 
593 		.filter_table = filter_table,
594 	},
595 	{
596 		/* 625 Lines, 50 Fields, 15.625KHz line, Sub-Carrier 4.434MHz */
597 		.name	    = "PAL",
598 		.clock		= 108000,
599 		.refresh	= 50000,
600 		.oversample	= 8,
601 		.component_only = false,
602 
603 		.hsync_end	= 64,		    .hblank_end		= 142,
604 		.hblank_start	= 844,	    .htotal		= 863,
605 
606 		.progressive	= false,    .trilevel_sync = false,
607 
608 		.vsync_start_f1	= 5,	    .vsync_start_f2	= 6,
609 		.vsync_len	= 5,
610 
611 		.veq_ena	= true,	    .veq_start_f1	= 0,
612 		.veq_start_f2	= 1,	    .veq_len		= 15,
613 
614 		.vi_end_f1	= 24,		    .vi_end_f2		= 25,
615 		.nbr_end	= 286,
616 
617 		.burst_ena	= true,
618 		.hburst_start	= 73,		    .hburst_len		= 32,
619 		.vburst_start_f1 = 8,		    .vburst_end_f1	= 285,
620 		.vburst_start_f2 = 8,		    .vburst_end_f2	= 286,
621 		.vburst_start_f3 = 9,		    .vburst_end_f3	= 286,
622 		.vburst_start_f4 = 9,		    .vburst_end_f4	= 285,
623 
624 		/* desired 4.4336180 actual 4.4336180 clock 107.52 */
625 		.dda1_inc       =    168,
626 		.dda2_inc       =   4122,       .dda2_size      =  27648,
627 		.dda3_inc       =     67,       .dda3_size      =    625,
628 		.sc_reset   = TV_SC_RESET_EVERY_8,
629 		.pal_burst  = true,
630 
631 		.composite_levels = &pal_levels_composite,
632 		.composite_color = &pal_csc_composite,
633 		.svideo_levels  = &pal_levels_svideo,
634 		.svideo_color = &pal_csc_svideo,
635 
636 		.filter_table = filter_table,
637 	},
638 	{
639 		.name       = "480p",
640 		.clock		= 108000,
641 		.refresh	= 59940,
642 		.oversample     = 4,
643 		.component_only = true,
644 
645 		.hsync_end      = 64,               .hblank_end         = 122,
646 		.hblank_start   = 842,              .htotal             = 857,
647 
648 		.progressive    = true,		    .trilevel_sync = false,
649 
650 		.vsync_start_f1 = 12,               .vsync_start_f2     = 12,
651 		.vsync_len      = 12,
652 
653 		.veq_ena        = false,
654 
655 		.vi_end_f1      = 44,               .vi_end_f2          = 44,
656 		.nbr_end        = 479,
657 
658 		.burst_ena      = false,
659 
660 		.filter_table = filter_table,
661 	},
662 	{
663 		.name       = "576p",
664 		.clock		= 108000,
665 		.refresh	= 50000,
666 		.oversample     = 4,
667 		.component_only = true,
668 
669 		.hsync_end      = 64,               .hblank_end         = 139,
670 		.hblank_start   = 859,              .htotal             = 863,
671 
672 		.progressive    = true,		    .trilevel_sync = false,
673 
674 		.vsync_start_f1 = 10,               .vsync_start_f2     = 10,
675 		.vsync_len      = 10,
676 
677 		.veq_ena        = false,
678 
679 		.vi_end_f1      = 48,               .vi_end_f2          = 48,
680 		.nbr_end        = 575,
681 
682 		.burst_ena      = false,
683 
684 		.filter_table = filter_table,
685 	},
686 	{
687 		.name       = "720p@60Hz",
688 		.clock		= 148500,
689 		.refresh	= 60000,
690 		.oversample     = 2,
691 		.component_only = true,
692 
693 		.hsync_end      = 80,               .hblank_end         = 300,
694 		.hblank_start   = 1580,             .htotal             = 1649,
695 
696 		.progressive	= true,		    .trilevel_sync = true,
697 
698 		.vsync_start_f1 = 10,               .vsync_start_f2     = 10,
699 		.vsync_len      = 10,
700 
701 		.veq_ena        = false,
702 
703 		.vi_end_f1      = 29,               .vi_end_f2          = 29,
704 		.nbr_end        = 719,
705 
706 		.burst_ena      = false,
707 
708 		.filter_table = filter_table,
709 	},
710 	{
711 		.name       = "720p@50Hz",
712 		.clock		= 148500,
713 		.refresh	= 50000,
714 		.oversample     = 2,
715 		.component_only = true,
716 
717 		.hsync_end      = 80,               .hblank_end         = 300,
718 		.hblank_start   = 1580,             .htotal             = 1979,
719 
720 		.progressive	= true,		    .trilevel_sync = true,
721 
722 		.vsync_start_f1 = 10,               .vsync_start_f2     = 10,
723 		.vsync_len      = 10,
724 
725 		.veq_ena        = false,
726 
727 		.vi_end_f1      = 29,               .vi_end_f2          = 29,
728 		.nbr_end        = 719,
729 
730 		.burst_ena      = false,
731 
732 		.filter_table = filter_table,
733 	},
734 	{
735 		.name       = "1080i@50Hz",
736 		.clock		= 148500,
737 		.refresh	= 50000,
738 		.oversample     = 2,
739 		.component_only = true,
740 
741 		.hsync_end      = 88,               .hblank_end         = 235,
742 		.hblank_start   = 2155,             .htotal             = 2639,
743 
744 		.progressive	= false,	  .trilevel_sync = true,
745 
746 		.vsync_start_f1 = 4,              .vsync_start_f2     = 5,
747 		.vsync_len      = 10,
748 
749 		.veq_ena	= true,	    .veq_start_f1	= 4,
750 		.veq_start_f2   = 4,	    .veq_len		= 10,
751 
752 
753 		.vi_end_f1      = 21,           .vi_end_f2          = 22,
754 		.nbr_end        = 539,
755 
756 		.burst_ena      = false,
757 
758 		.filter_table = filter_table,
759 	},
760 	{
761 		.name       = "1080i@60Hz",
762 		.clock		= 148500,
763 		.refresh	= 60000,
764 		.oversample     = 2,
765 		.component_only = true,
766 
767 		.hsync_end      = 88,               .hblank_end         = 235,
768 		.hblank_start   = 2155,             .htotal             = 2199,
769 
770 		.progressive	= false,	    .trilevel_sync = true,
771 
772 		.vsync_start_f1 = 4,               .vsync_start_f2     = 5,
773 		.vsync_len      = 10,
774 
775 		.veq_ena	= true,		    .veq_start_f1	= 4,
776 		.veq_start_f2	= 4,		    .veq_len		= 10,
777 
778 
779 		.vi_end_f1      = 21,               .vi_end_f2          = 22,
780 		.nbr_end        = 539,
781 
782 		.burst_ena      = false,
783 
784 		.filter_table = filter_table,
785 	},
786 
787 	{
788 		.name       = "1080p@30Hz",
789 		.clock		= 148500,
790 		.refresh	= 30000,
791 		.oversample     = 2,
792 		.component_only = true,
793 
794 		.hsync_end      = 88,               .hblank_end         = 235,
795 		.hblank_start   = 2155,             .htotal             = 2199,
796 
797 		.progressive	= true,		    .trilevel_sync = true,
798 
799 		.vsync_start_f1 = 8,               .vsync_start_f2     = 8,
800 		.vsync_len      = 10,
801 
802 		.veq_ena	= false,	.veq_start_f1	= 0,
803 		.veq_start_f2	= 0,		    .veq_len		= 0,
804 
805 		.vi_end_f1      = 44,               .vi_end_f2          = 44,
806 		.nbr_end        = 1079,
807 
808 		.burst_ena      = false,
809 
810 		.filter_table = filter_table,
811 	},
812 
813 	{
814 		.name       = "1080p@50Hz",
815 		.clock		= 148500,
816 		.refresh	= 50000,
817 		.oversample     = 1,
818 		.component_only = true,
819 
820 		.hsync_end      = 88,               .hblank_end         = 235,
821 		.hblank_start   = 2155,             .htotal             = 2639,
822 
823 		.progressive	= true,		    .trilevel_sync = true,
824 
825 		.vsync_start_f1 = 8,               .vsync_start_f2     = 8,
826 		.vsync_len      = 10,
827 
828 		.veq_ena	= false,	.veq_start_f1	= 0,
829 		.veq_start_f2	= 0,		    .veq_len		= 0,
830 
831 		.vi_end_f1      = 44,               .vi_end_f2          = 44,
832 		.nbr_end        = 1079,
833 
834 		.burst_ena      = false,
835 
836 		.filter_table = filter_table,
837 	},
838 
839 	{
840 		.name       = "1080p@60Hz",
841 		.clock		= 148500,
842 		.refresh	= 60000,
843 		.oversample     = 1,
844 		.component_only = true,
845 
846 		.hsync_end      = 88,               .hblank_end         = 235,
847 		.hblank_start   = 2155,             .htotal             = 2199,
848 
849 		.progressive	= true,		    .trilevel_sync = true,
850 
851 		.vsync_start_f1 = 8,               .vsync_start_f2     = 8,
852 		.vsync_len      = 10,
853 
854 		.veq_ena	= false,		    .veq_start_f1	= 0,
855 		.veq_start_f2	= 0,		    .veq_len		= 0,
856 
857 		.vi_end_f1      = 44,               .vi_end_f2          = 44,
858 		.nbr_end        = 1079,
859 
860 		.burst_ena      = false,
861 
862 		.filter_table = filter_table,
863 	},
864 };
865 
866 struct intel_tv_connector_state {
867 	struct drm_connector_state base;
868 
869 	/*
870 	 * May need to override the user margins for
871 	 * gen3 >1024 wide source vertical centering.
872 	 */
873 	struct {
874 		u16 top, bottom;
875 	} margins;
876 
877 	bool bypass_vfilter;
878 };
879 
880 #define to_intel_tv_connector_state(x) container_of(x, struct intel_tv_connector_state, base)
881 
882 static struct drm_connector_state *
883 intel_tv_connector_duplicate_state(struct drm_connector *connector)
884 {
885 	struct intel_tv_connector_state *state;
886 
887 	state = kmemdup(connector->state, sizeof(*state), GFP_KERNEL);
888 	if (!state)
889 		return NULL;
890 
891 	__drm_atomic_helper_connector_duplicate_state(connector, &state->base);
892 	return &state->base;
893 }
894 
895 static struct intel_tv *enc_to_tv(struct intel_encoder *encoder)
896 {
897 	return container_of(encoder, struct intel_tv, base);
898 }
899 
900 static struct intel_tv *intel_attached_tv(struct intel_connector *connector)
901 {
902 	return enc_to_tv(intel_attached_encoder(connector));
903 }
904 
905 static bool
906 intel_tv_get_hw_state(struct intel_encoder *encoder, enum pipe *pipe)
907 {
908 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
909 	u32 tmp = intel_de_read(dev_priv, TV_CTL);
910 
911 	*pipe = (tmp & TV_ENC_PIPE_SEL_MASK) >> TV_ENC_PIPE_SEL_SHIFT;
912 
913 	return tmp & TV_ENC_ENABLE;
914 }
915 
916 static void
917 intel_enable_tv(struct intel_atomic_state *state,
918 		struct intel_encoder *encoder,
919 		const struct intel_crtc_state *pipe_config,
920 		const struct drm_connector_state *conn_state)
921 {
922 	struct drm_device *dev = encoder->base.dev;
923 	struct drm_i915_private *dev_priv = to_i915(dev);
924 
925 	/* Prevents vblank waits from timing out in intel_tv_detect_type() */
926 	intel_wait_for_vblank(dev_priv,
927 			      to_intel_crtc(pipe_config->uapi.crtc)->pipe);
928 
929 	intel_de_write(dev_priv, TV_CTL,
930 		       intel_de_read(dev_priv, TV_CTL) | TV_ENC_ENABLE);
931 }
932 
933 static void
934 intel_disable_tv(struct intel_atomic_state *state,
935 		 struct intel_encoder *encoder,
936 		 const struct intel_crtc_state *old_crtc_state,
937 		 const struct drm_connector_state *old_conn_state)
938 {
939 	struct drm_device *dev = encoder->base.dev;
940 	struct drm_i915_private *dev_priv = to_i915(dev);
941 
942 	intel_de_write(dev_priv, TV_CTL,
943 		       intel_de_read(dev_priv, TV_CTL) & ~TV_ENC_ENABLE);
944 }
945 
946 static const struct tv_mode *intel_tv_mode_find(const struct drm_connector_state *conn_state)
947 {
948 	int format = conn_state->tv.mode;
949 
950 	return &tv_modes[format];
951 }
952 
953 static enum drm_mode_status
954 intel_tv_mode_valid(struct drm_connector *connector,
955 		    struct drm_display_mode *mode)
956 {
957 	const struct tv_mode *tv_mode = intel_tv_mode_find(connector->state);
958 	int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
959 
960 	if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
961 		return MODE_NO_DBLESCAN;
962 
963 	if (mode->clock > max_dotclk)
964 		return MODE_CLOCK_HIGH;
965 
966 	/* Ensure TV refresh is close to desired refresh */
967 	if (abs(tv_mode->refresh - drm_mode_vrefresh(mode) * 1000) >= 1000)
968 		return MODE_CLOCK_RANGE;
969 
970 	return MODE_OK;
971 }
972 
973 static int
974 intel_tv_mode_vdisplay(const struct tv_mode *tv_mode)
975 {
976 	if (tv_mode->progressive)
977 		return tv_mode->nbr_end + 1;
978 	else
979 		return 2 * (tv_mode->nbr_end + 1);
980 }
981 
982 static void
983 intel_tv_mode_to_mode(struct drm_display_mode *mode,
984 		      const struct tv_mode *tv_mode)
985 {
986 	mode->clock = tv_mode->clock /
987 		(tv_mode->oversample >> !tv_mode->progressive);
988 
989 	/*
990 	 * tv_mode horizontal timings:
991 	 *
992 	 * hsync_end
993 	 *    | hblank_end
994 	 *    |    | hblank_start
995 	 *    |    |       | htotal
996 	 *    |     _______    |
997 	 *     ____/       \___
998 	 * \__/                \
999 	 */
1000 	mode->hdisplay =
1001 		tv_mode->hblank_start - tv_mode->hblank_end;
1002 	mode->hsync_start = mode->hdisplay +
1003 		tv_mode->htotal - tv_mode->hblank_start;
1004 	mode->hsync_end = mode->hsync_start +
1005 		tv_mode->hsync_end;
1006 	mode->htotal = tv_mode->htotal + 1;
1007 
1008 	/*
1009 	 * tv_mode vertical timings:
1010 	 *
1011 	 * vsync_start
1012 	 *    | vsync_end
1013 	 *    |  | vi_end nbr_end
1014 	 *    |  |    |       |
1015 	 *    |  |     _______
1016 	 * \__    ____/       \
1017 	 *    \__/
1018 	 */
1019 	mode->vdisplay = intel_tv_mode_vdisplay(tv_mode);
1020 	if (tv_mode->progressive) {
1021 		mode->vsync_start = mode->vdisplay +
1022 			tv_mode->vsync_start_f1 + 1;
1023 		mode->vsync_end = mode->vsync_start +
1024 			tv_mode->vsync_len;
1025 		mode->vtotal = mode->vdisplay +
1026 			tv_mode->vi_end_f1 + 1;
1027 	} else {
1028 		mode->vsync_start = mode->vdisplay +
1029 			tv_mode->vsync_start_f1 + 1 +
1030 			tv_mode->vsync_start_f2 + 1;
1031 		mode->vsync_end = mode->vsync_start +
1032 			2 * tv_mode->vsync_len;
1033 		mode->vtotal = mode->vdisplay +
1034 			tv_mode->vi_end_f1 + 1 +
1035 			tv_mode->vi_end_f2 + 1;
1036 	}
1037 
1038 	/* TV has it's own notion of sync and other mode flags, so clear them. */
1039 	mode->flags = 0;
1040 
1041 	snprintf(mode->name, sizeof(mode->name),
1042 		 "%dx%d%c (%s)",
1043 		 mode->hdisplay, mode->vdisplay,
1044 		 tv_mode->progressive ? 'p' : 'i',
1045 		 tv_mode->name);
1046 }
1047 
1048 static void intel_tv_scale_mode_horiz(struct drm_display_mode *mode,
1049 				      int hdisplay, int left_margin,
1050 				      int right_margin)
1051 {
1052 	int hsync_start = mode->hsync_start - mode->hdisplay + right_margin;
1053 	int hsync_end = mode->hsync_end - mode->hdisplay + right_margin;
1054 	int new_htotal = mode->htotal * hdisplay /
1055 		(mode->hdisplay - left_margin - right_margin);
1056 
1057 	mode->clock = mode->clock * new_htotal / mode->htotal;
1058 
1059 	mode->hdisplay = hdisplay;
1060 	mode->hsync_start = hdisplay + hsync_start * new_htotal / mode->htotal;
1061 	mode->hsync_end = hdisplay + hsync_end * new_htotal / mode->htotal;
1062 	mode->htotal = new_htotal;
1063 }
1064 
1065 static void intel_tv_scale_mode_vert(struct drm_display_mode *mode,
1066 				     int vdisplay, int top_margin,
1067 				     int bottom_margin)
1068 {
1069 	int vsync_start = mode->vsync_start - mode->vdisplay + bottom_margin;
1070 	int vsync_end = mode->vsync_end - mode->vdisplay + bottom_margin;
1071 	int new_vtotal = mode->vtotal * vdisplay /
1072 		(mode->vdisplay - top_margin - bottom_margin);
1073 
1074 	mode->clock = mode->clock * new_vtotal / mode->vtotal;
1075 
1076 	mode->vdisplay = vdisplay;
1077 	mode->vsync_start = vdisplay + vsync_start * new_vtotal / mode->vtotal;
1078 	mode->vsync_end = vdisplay + vsync_end * new_vtotal / mode->vtotal;
1079 	mode->vtotal = new_vtotal;
1080 }
1081 
1082 static void
1083 intel_tv_get_config(struct intel_encoder *encoder,
1084 		    struct intel_crtc_state *pipe_config)
1085 {
1086 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1087 	struct drm_display_mode *adjusted_mode =
1088 		&pipe_config->hw.adjusted_mode;
1089 	struct drm_display_mode mode = {};
1090 	u32 tv_ctl, hctl1, hctl3, vctl1, vctl2, tmp;
1091 	struct tv_mode tv_mode = {};
1092 	int hdisplay = adjusted_mode->crtc_hdisplay;
1093 	int vdisplay = adjusted_mode->crtc_vdisplay;
1094 	int xsize, ysize, xpos, ypos;
1095 
1096 	pipe_config->output_types |= BIT(INTEL_OUTPUT_TVOUT);
1097 
1098 	tv_ctl = intel_de_read(dev_priv, TV_CTL);
1099 	hctl1 = intel_de_read(dev_priv, TV_H_CTL_1);
1100 	hctl3 = intel_de_read(dev_priv, TV_H_CTL_3);
1101 	vctl1 = intel_de_read(dev_priv, TV_V_CTL_1);
1102 	vctl2 = intel_de_read(dev_priv, TV_V_CTL_2);
1103 
1104 	tv_mode.htotal = (hctl1 & TV_HTOTAL_MASK) >> TV_HTOTAL_SHIFT;
1105 	tv_mode.hsync_end = (hctl1 & TV_HSYNC_END_MASK) >> TV_HSYNC_END_SHIFT;
1106 
1107 	tv_mode.hblank_start = (hctl3 & TV_HBLANK_START_MASK) >> TV_HBLANK_START_SHIFT;
1108 	tv_mode.hblank_end = (hctl3 & TV_HSYNC_END_MASK) >> TV_HBLANK_END_SHIFT;
1109 
1110 	tv_mode.nbr_end = (vctl1 & TV_NBR_END_MASK) >> TV_NBR_END_SHIFT;
1111 	tv_mode.vi_end_f1 = (vctl1 & TV_VI_END_F1_MASK) >> TV_VI_END_F1_SHIFT;
1112 	tv_mode.vi_end_f2 = (vctl1 & TV_VI_END_F2_MASK) >> TV_VI_END_F2_SHIFT;
1113 
1114 	tv_mode.vsync_len = (vctl2 & TV_VSYNC_LEN_MASK) >> TV_VSYNC_LEN_SHIFT;
1115 	tv_mode.vsync_start_f1 = (vctl2 & TV_VSYNC_START_F1_MASK) >> TV_VSYNC_START_F1_SHIFT;
1116 	tv_mode.vsync_start_f2 = (vctl2 & TV_VSYNC_START_F2_MASK) >> TV_VSYNC_START_F2_SHIFT;
1117 
1118 	tv_mode.clock = pipe_config->port_clock;
1119 
1120 	tv_mode.progressive = tv_ctl & TV_PROGRESSIVE;
1121 
1122 	switch (tv_ctl & TV_OVERSAMPLE_MASK) {
1123 	case TV_OVERSAMPLE_8X:
1124 		tv_mode.oversample = 8;
1125 		break;
1126 	case TV_OVERSAMPLE_4X:
1127 		tv_mode.oversample = 4;
1128 		break;
1129 	case TV_OVERSAMPLE_2X:
1130 		tv_mode.oversample = 2;
1131 		break;
1132 	default:
1133 		tv_mode.oversample = 1;
1134 		break;
1135 	}
1136 
1137 	tmp = intel_de_read(dev_priv, TV_WIN_POS);
1138 	xpos = tmp >> 16;
1139 	ypos = tmp & 0xffff;
1140 
1141 	tmp = intel_de_read(dev_priv, TV_WIN_SIZE);
1142 	xsize = tmp >> 16;
1143 	ysize = tmp & 0xffff;
1144 
1145 	intel_tv_mode_to_mode(&mode, &tv_mode);
1146 
1147 	drm_dbg_kms(&dev_priv->drm, "TV mode:\n");
1148 	drm_mode_debug_printmodeline(&mode);
1149 
1150 	intel_tv_scale_mode_horiz(&mode, hdisplay,
1151 				  xpos, mode.hdisplay - xsize - xpos);
1152 	intel_tv_scale_mode_vert(&mode, vdisplay,
1153 				 ypos, mode.vdisplay - ysize - ypos);
1154 
1155 	adjusted_mode->crtc_clock = mode.clock;
1156 	if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE)
1157 		adjusted_mode->crtc_clock /= 2;
1158 
1159 	/* pixel counter doesn't work on i965gm TV output */
1160 	if (IS_I965GM(dev_priv))
1161 		pipe_config->mode_flags |=
1162 			I915_MODE_FLAG_USE_SCANLINE_COUNTER;
1163 }
1164 
1165 static bool intel_tv_source_too_wide(struct drm_i915_private *dev_priv,
1166 				     int hdisplay)
1167 {
1168 	return IS_GEN(dev_priv, 3) && hdisplay > 1024;
1169 }
1170 
1171 static bool intel_tv_vert_scaling(const struct drm_display_mode *tv_mode,
1172 				  const struct drm_connector_state *conn_state,
1173 				  int vdisplay)
1174 {
1175 	return tv_mode->crtc_vdisplay -
1176 		conn_state->tv.margins.top -
1177 		conn_state->tv.margins.bottom !=
1178 		vdisplay;
1179 }
1180 
1181 static int
1182 intel_tv_compute_config(struct intel_encoder *encoder,
1183 			struct intel_crtc_state *pipe_config,
1184 			struct drm_connector_state *conn_state)
1185 {
1186 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1187 	struct intel_tv_connector_state *tv_conn_state =
1188 		to_intel_tv_connector_state(conn_state);
1189 	const struct tv_mode *tv_mode = intel_tv_mode_find(conn_state);
1190 	struct drm_display_mode *adjusted_mode =
1191 		&pipe_config->hw.adjusted_mode;
1192 	int hdisplay = adjusted_mode->crtc_hdisplay;
1193 	int vdisplay = adjusted_mode->crtc_vdisplay;
1194 
1195 	if (!tv_mode)
1196 		return -EINVAL;
1197 
1198 	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
1199 		return -EINVAL;
1200 
1201 	pipe_config->output_format = INTEL_OUTPUT_FORMAT_RGB;
1202 
1203 	drm_dbg_kms(&dev_priv->drm, "forcing bpc to 8 for TV\n");
1204 	pipe_config->pipe_bpp = 8*3;
1205 
1206 	pipe_config->port_clock = tv_mode->clock;
1207 
1208 	intel_tv_mode_to_mode(adjusted_mode, tv_mode);
1209 	drm_mode_set_crtcinfo(adjusted_mode, 0);
1210 
1211 	if (intel_tv_source_too_wide(dev_priv, hdisplay) ||
1212 	    !intel_tv_vert_scaling(adjusted_mode, conn_state, vdisplay)) {
1213 		int extra, top, bottom;
1214 
1215 		extra = adjusted_mode->crtc_vdisplay - vdisplay;
1216 
1217 		if (extra < 0) {
1218 			drm_dbg_kms(&dev_priv->drm,
1219 				    "No vertical scaling for >1024 pixel wide modes\n");
1220 			return -EINVAL;
1221 		}
1222 
1223 		/* Need to turn off the vertical filter and center the image */
1224 
1225 		/* Attempt to maintain the relative sizes of the margins */
1226 		top = conn_state->tv.margins.top;
1227 		bottom = conn_state->tv.margins.bottom;
1228 
1229 		if (top + bottom)
1230 			top = extra * top / (top + bottom);
1231 		else
1232 			top = extra / 2;
1233 		bottom = extra - top;
1234 
1235 		tv_conn_state->margins.top = top;
1236 		tv_conn_state->margins.bottom = bottom;
1237 
1238 		tv_conn_state->bypass_vfilter = true;
1239 
1240 		if (!tv_mode->progressive) {
1241 			adjusted_mode->clock /= 2;
1242 			adjusted_mode->crtc_clock /= 2;
1243 			adjusted_mode->flags |= DRM_MODE_FLAG_INTERLACE;
1244 		}
1245 	} else {
1246 		tv_conn_state->margins.top = conn_state->tv.margins.top;
1247 		tv_conn_state->margins.bottom = conn_state->tv.margins.bottom;
1248 
1249 		tv_conn_state->bypass_vfilter = false;
1250 	}
1251 
1252 	drm_dbg_kms(&dev_priv->drm, "TV mode:\n");
1253 	drm_mode_debug_printmodeline(adjusted_mode);
1254 
1255 	/*
1256 	 * The pipe scanline counter behaviour looks as follows when
1257 	 * using the TV encoder:
1258 	 *
1259 	 * time ->
1260 	 *
1261 	 * dsl=vtotal-1       |             |
1262 	 *                   ||            ||
1263 	 *               ___| |        ___| |
1264 	 *              /     |       /     |
1265 	 *             /      |      /      |
1266 	 * dsl=0   ___/       |_____/       |
1267 	 *        | | |  |  | |
1268 	 *         ^ ^ ^   ^ ^
1269 	 *         | | |   | pipe vblank/first part of tv vblank
1270 	 *         | | |   bottom margin
1271 	 *         | | active
1272 	 *         | top margin
1273 	 *         remainder of tv vblank
1274 	 *
1275 	 * When the TV encoder is used the pipe wants to run faster
1276 	 * than expected rate. During the active portion the TV
1277 	 * encoder stalls the pipe every few lines to keep it in
1278 	 * check. When the TV encoder reaches the bottom margin the
1279 	 * pipe simply stops. Once we reach the TV vblank the pipe is
1280 	 * no longer stalled and it runs at the max rate (apparently
1281 	 * oversample clock on gen3, cdclk on gen4). Once the pipe
1282 	 * reaches the pipe vtotal the pipe stops for the remainder
1283 	 * of the TV vblank/top margin. The pipe starts up again when
1284 	 * the TV encoder exits the top margin.
1285 	 *
1286 	 * To avoid huge hassles for vblank timestamping we scale
1287 	 * the pipe timings as if the pipe always runs at the average
1288 	 * rate it maintains during the active period. This also
1289 	 * gives us a reasonable guesstimate as to the pixel rate.
1290 	 * Due to the variation in the actual pipe speed the scanline
1291 	 * counter will give us slightly erroneous results during the
1292 	 * TV vblank/margins. But since vtotal was selected such that
1293 	 * it matches the average rate of the pipe during the active
1294 	 * portion the error shouldn't cause any serious grief to
1295 	 * vblank timestamps.
1296 	 *
1297 	 * For posterity here is the empirically derived formula
1298 	 * that gives us the maximum length of the pipe vblank
1299 	 * we can use without causing display corruption. Following
1300 	 * this would allow us to have a ticking scanline counter
1301 	 * everywhere except during the bottom margin (there the
1302 	 * pipe always stops). Ie. this would eliminate the second
1303 	 * flat portion of the above graph. However this would also
1304 	 * complicate vblank timestamping as the pipe vtotal would
1305 	 * no longer match the average rate the pipe runs at during
1306 	 * the active portion. Hence following this formula seems
1307 	 * more trouble that it's worth.
1308 	 *
1309 	 * if (IS_GEN(dev_priv, 4)) {
1310 	 *	num = cdclk * (tv_mode->oversample >> !tv_mode->progressive);
1311 	 *	den = tv_mode->clock;
1312 	 * } else {
1313 	 *	num = tv_mode->oversample >> !tv_mode->progressive;
1314 	 *	den = 1;
1315 	 * }
1316 	 * max_pipe_vblank_len ~=
1317 	 *	(num * tv_htotal * (tv_vblank_len + top_margin)) /
1318 	 *	(den * pipe_htotal);
1319 	 */
1320 	intel_tv_scale_mode_horiz(adjusted_mode, hdisplay,
1321 				  conn_state->tv.margins.left,
1322 				  conn_state->tv.margins.right);
1323 	intel_tv_scale_mode_vert(adjusted_mode, vdisplay,
1324 				 tv_conn_state->margins.top,
1325 				 tv_conn_state->margins.bottom);
1326 	drm_mode_set_crtcinfo(adjusted_mode, 0);
1327 	adjusted_mode->name[0] = '\0';
1328 
1329 	/* pixel counter doesn't work on i965gm TV output */
1330 	if (IS_I965GM(dev_priv))
1331 		pipe_config->mode_flags |=
1332 			I915_MODE_FLAG_USE_SCANLINE_COUNTER;
1333 
1334 	return 0;
1335 }
1336 
1337 static void
1338 set_tv_mode_timings(struct drm_i915_private *dev_priv,
1339 		    const struct tv_mode *tv_mode,
1340 		    bool burst_ena)
1341 {
1342 	u32 hctl1, hctl2, hctl3;
1343 	u32 vctl1, vctl2, vctl3, vctl4, vctl5, vctl6, vctl7;
1344 
1345 	hctl1 = (tv_mode->hsync_end << TV_HSYNC_END_SHIFT) |
1346 		(tv_mode->htotal << TV_HTOTAL_SHIFT);
1347 
1348 	hctl2 = (tv_mode->hburst_start << 16) |
1349 		(tv_mode->hburst_len << TV_HBURST_LEN_SHIFT);
1350 
1351 	if (burst_ena)
1352 		hctl2 |= TV_BURST_ENA;
1353 
1354 	hctl3 = (tv_mode->hblank_start << TV_HBLANK_START_SHIFT) |
1355 		(tv_mode->hblank_end << TV_HBLANK_END_SHIFT);
1356 
1357 	vctl1 = (tv_mode->nbr_end << TV_NBR_END_SHIFT) |
1358 		(tv_mode->vi_end_f1 << TV_VI_END_F1_SHIFT) |
1359 		(tv_mode->vi_end_f2 << TV_VI_END_F2_SHIFT);
1360 
1361 	vctl2 = (tv_mode->vsync_len << TV_VSYNC_LEN_SHIFT) |
1362 		(tv_mode->vsync_start_f1 << TV_VSYNC_START_F1_SHIFT) |
1363 		(tv_mode->vsync_start_f2 << TV_VSYNC_START_F2_SHIFT);
1364 
1365 	vctl3 = (tv_mode->veq_len << TV_VEQ_LEN_SHIFT) |
1366 		(tv_mode->veq_start_f1 << TV_VEQ_START_F1_SHIFT) |
1367 		(tv_mode->veq_start_f2 << TV_VEQ_START_F2_SHIFT);
1368 
1369 	if (tv_mode->veq_ena)
1370 		vctl3 |= TV_EQUAL_ENA;
1371 
1372 	vctl4 = (tv_mode->vburst_start_f1 << TV_VBURST_START_F1_SHIFT) |
1373 		(tv_mode->vburst_end_f1 << TV_VBURST_END_F1_SHIFT);
1374 
1375 	vctl5 = (tv_mode->vburst_start_f2 << TV_VBURST_START_F2_SHIFT) |
1376 		(tv_mode->vburst_end_f2 << TV_VBURST_END_F2_SHIFT);
1377 
1378 	vctl6 = (tv_mode->vburst_start_f3 << TV_VBURST_START_F3_SHIFT) |
1379 		(tv_mode->vburst_end_f3 << TV_VBURST_END_F3_SHIFT);
1380 
1381 	vctl7 = (tv_mode->vburst_start_f4 << TV_VBURST_START_F4_SHIFT) |
1382 		(tv_mode->vburst_end_f4 << TV_VBURST_END_F4_SHIFT);
1383 
1384 	intel_de_write(dev_priv, TV_H_CTL_1, hctl1);
1385 	intel_de_write(dev_priv, TV_H_CTL_2, hctl2);
1386 	intel_de_write(dev_priv, TV_H_CTL_3, hctl3);
1387 	intel_de_write(dev_priv, TV_V_CTL_1, vctl1);
1388 	intel_de_write(dev_priv, TV_V_CTL_2, vctl2);
1389 	intel_de_write(dev_priv, TV_V_CTL_3, vctl3);
1390 	intel_de_write(dev_priv, TV_V_CTL_4, vctl4);
1391 	intel_de_write(dev_priv, TV_V_CTL_5, vctl5);
1392 	intel_de_write(dev_priv, TV_V_CTL_6, vctl6);
1393 	intel_de_write(dev_priv, TV_V_CTL_7, vctl7);
1394 }
1395 
1396 static void set_color_conversion(struct drm_i915_private *dev_priv,
1397 				 const struct color_conversion *color_conversion)
1398 {
1399 	if (!color_conversion)
1400 		return;
1401 
1402 	intel_de_write(dev_priv, TV_CSC_Y,
1403 		       (color_conversion->ry << 16) | color_conversion->gy);
1404 	intel_de_write(dev_priv, TV_CSC_Y2,
1405 		       (color_conversion->by << 16) | color_conversion->ay);
1406 	intel_de_write(dev_priv, TV_CSC_U,
1407 		       (color_conversion->ru << 16) | color_conversion->gu);
1408 	intel_de_write(dev_priv, TV_CSC_U2,
1409 		       (color_conversion->bu << 16) | color_conversion->au);
1410 	intel_de_write(dev_priv, TV_CSC_V,
1411 		       (color_conversion->rv << 16) | color_conversion->gv);
1412 	intel_de_write(dev_priv, TV_CSC_V2,
1413 		       (color_conversion->bv << 16) | color_conversion->av);
1414 }
1415 
1416 static void intel_tv_pre_enable(struct intel_atomic_state *state,
1417 				struct intel_encoder *encoder,
1418 				const struct intel_crtc_state *pipe_config,
1419 				const struct drm_connector_state *conn_state)
1420 {
1421 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1422 	struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->uapi.crtc);
1423 	struct intel_tv *intel_tv = enc_to_tv(encoder);
1424 	const struct intel_tv_connector_state *tv_conn_state =
1425 		to_intel_tv_connector_state(conn_state);
1426 	const struct tv_mode *tv_mode = intel_tv_mode_find(conn_state);
1427 	u32 tv_ctl, tv_filter_ctl;
1428 	u32 scctl1, scctl2, scctl3;
1429 	int i, j;
1430 	const struct video_levels *video_levels;
1431 	const struct color_conversion *color_conversion;
1432 	bool burst_ena;
1433 	int xpos, ypos;
1434 	unsigned int xsize, ysize;
1435 
1436 	if (!tv_mode)
1437 		return;	/* can't happen (mode_prepare prevents this) */
1438 
1439 	tv_ctl = intel_de_read(dev_priv, TV_CTL);
1440 	tv_ctl &= TV_CTL_SAVE;
1441 
1442 	switch (intel_tv->type) {
1443 	default:
1444 	case DRM_MODE_CONNECTOR_Unknown:
1445 	case DRM_MODE_CONNECTOR_Composite:
1446 		tv_ctl |= TV_ENC_OUTPUT_COMPOSITE;
1447 		video_levels = tv_mode->composite_levels;
1448 		color_conversion = tv_mode->composite_color;
1449 		burst_ena = tv_mode->burst_ena;
1450 		break;
1451 	case DRM_MODE_CONNECTOR_Component:
1452 		tv_ctl |= TV_ENC_OUTPUT_COMPONENT;
1453 		video_levels = &component_levels;
1454 		if (tv_mode->burst_ena)
1455 			color_conversion = &sdtv_csc_yprpb;
1456 		else
1457 			color_conversion = &hdtv_csc_yprpb;
1458 		burst_ena = false;
1459 		break;
1460 	case DRM_MODE_CONNECTOR_SVIDEO:
1461 		tv_ctl |= TV_ENC_OUTPUT_SVIDEO;
1462 		video_levels = tv_mode->svideo_levels;
1463 		color_conversion = tv_mode->svideo_color;
1464 		burst_ena = tv_mode->burst_ena;
1465 		break;
1466 	}
1467 
1468 	tv_ctl |= TV_ENC_PIPE_SEL(intel_crtc->pipe);
1469 
1470 	switch (tv_mode->oversample) {
1471 	case 8:
1472 		tv_ctl |= TV_OVERSAMPLE_8X;
1473 		break;
1474 	case 4:
1475 		tv_ctl |= TV_OVERSAMPLE_4X;
1476 		break;
1477 	case 2:
1478 		tv_ctl |= TV_OVERSAMPLE_2X;
1479 		break;
1480 	default:
1481 		tv_ctl |= TV_OVERSAMPLE_NONE;
1482 		break;
1483 	}
1484 
1485 	if (tv_mode->progressive)
1486 		tv_ctl |= TV_PROGRESSIVE;
1487 	if (tv_mode->trilevel_sync)
1488 		tv_ctl |= TV_TRILEVEL_SYNC;
1489 	if (tv_mode->pal_burst)
1490 		tv_ctl |= TV_PAL_BURST;
1491 
1492 	scctl1 = 0;
1493 	if (tv_mode->dda1_inc)
1494 		scctl1 |= TV_SC_DDA1_EN;
1495 	if (tv_mode->dda2_inc)
1496 		scctl1 |= TV_SC_DDA2_EN;
1497 	if (tv_mode->dda3_inc)
1498 		scctl1 |= TV_SC_DDA3_EN;
1499 	scctl1 |= tv_mode->sc_reset;
1500 	if (video_levels)
1501 		scctl1 |= video_levels->burst << TV_BURST_LEVEL_SHIFT;
1502 	scctl1 |= tv_mode->dda1_inc << TV_SCDDA1_INC_SHIFT;
1503 
1504 	scctl2 = tv_mode->dda2_size << TV_SCDDA2_SIZE_SHIFT |
1505 		tv_mode->dda2_inc << TV_SCDDA2_INC_SHIFT;
1506 
1507 	scctl3 = tv_mode->dda3_size << TV_SCDDA3_SIZE_SHIFT |
1508 		tv_mode->dda3_inc << TV_SCDDA3_INC_SHIFT;
1509 
1510 	/* Enable two fixes for the chips that need them. */
1511 	if (IS_I915GM(dev_priv))
1512 		tv_ctl |= TV_ENC_C0_FIX | TV_ENC_SDP_FIX;
1513 
1514 	set_tv_mode_timings(dev_priv, tv_mode, burst_ena);
1515 
1516 	intel_de_write(dev_priv, TV_SC_CTL_1, scctl1);
1517 	intel_de_write(dev_priv, TV_SC_CTL_2, scctl2);
1518 	intel_de_write(dev_priv, TV_SC_CTL_3, scctl3);
1519 
1520 	set_color_conversion(dev_priv, color_conversion);
1521 
1522 	if (INTEL_GEN(dev_priv) >= 4)
1523 		intel_de_write(dev_priv, TV_CLR_KNOBS, 0x00404000);
1524 	else
1525 		intel_de_write(dev_priv, TV_CLR_KNOBS, 0x00606000);
1526 
1527 	if (video_levels)
1528 		intel_de_write(dev_priv, TV_CLR_LEVEL,
1529 			       ((video_levels->black << TV_BLACK_LEVEL_SHIFT) | (video_levels->blank << TV_BLANK_LEVEL_SHIFT)));
1530 
1531 	assert_pipe_disabled(dev_priv, pipe_config->cpu_transcoder);
1532 
1533 	/* Filter ctl must be set before TV_WIN_SIZE */
1534 	tv_filter_ctl = TV_AUTO_SCALE;
1535 	if (tv_conn_state->bypass_vfilter)
1536 		tv_filter_ctl |= TV_V_FILTER_BYPASS;
1537 	intel_de_write(dev_priv, TV_FILTER_CTL_1, tv_filter_ctl);
1538 
1539 	xsize = tv_mode->hblank_start - tv_mode->hblank_end;
1540 	ysize = intel_tv_mode_vdisplay(tv_mode);
1541 
1542 	xpos = conn_state->tv.margins.left;
1543 	ypos = tv_conn_state->margins.top;
1544 	xsize -= (conn_state->tv.margins.left +
1545 		  conn_state->tv.margins.right);
1546 	ysize -= (tv_conn_state->margins.top +
1547 		  tv_conn_state->margins.bottom);
1548 	intel_de_write(dev_priv, TV_WIN_POS, (xpos << 16) | ypos);
1549 	intel_de_write(dev_priv, TV_WIN_SIZE, (xsize << 16) | ysize);
1550 
1551 	j = 0;
1552 	for (i = 0; i < 60; i++)
1553 		intel_de_write(dev_priv, TV_H_LUMA(i),
1554 			       tv_mode->filter_table[j++]);
1555 	for (i = 0; i < 60; i++)
1556 		intel_de_write(dev_priv, TV_H_CHROMA(i),
1557 			       tv_mode->filter_table[j++]);
1558 	for (i = 0; i < 43; i++)
1559 		intel_de_write(dev_priv, TV_V_LUMA(i),
1560 			       tv_mode->filter_table[j++]);
1561 	for (i = 0; i < 43; i++)
1562 		intel_de_write(dev_priv, TV_V_CHROMA(i),
1563 			       tv_mode->filter_table[j++]);
1564 	intel_de_write(dev_priv, TV_DAC,
1565 		       intel_de_read(dev_priv, TV_DAC) & TV_DAC_SAVE);
1566 	intel_de_write(dev_priv, TV_CTL, tv_ctl);
1567 }
1568 
1569 static int
1570 intel_tv_detect_type(struct intel_tv *intel_tv,
1571 		      struct drm_connector *connector)
1572 {
1573 	struct drm_crtc *crtc = connector->state->crtc;
1574 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1575 	struct drm_device *dev = connector->dev;
1576 	struct drm_i915_private *dev_priv = to_i915(dev);
1577 	u32 tv_ctl, save_tv_ctl;
1578 	u32 tv_dac, save_tv_dac;
1579 	int type;
1580 
1581 	/* Disable TV interrupts around load detect or we'll recurse */
1582 	if (connector->polled & DRM_CONNECTOR_POLL_HPD) {
1583 		spin_lock_irq(&dev_priv->irq_lock);
1584 		i915_disable_pipestat(dev_priv, 0,
1585 				      PIPE_HOTPLUG_INTERRUPT_STATUS |
1586 				      PIPE_HOTPLUG_TV_INTERRUPT_STATUS);
1587 		spin_unlock_irq(&dev_priv->irq_lock);
1588 	}
1589 
1590 	save_tv_dac = tv_dac = intel_de_read(dev_priv, TV_DAC);
1591 	save_tv_ctl = tv_ctl = intel_de_read(dev_priv, TV_CTL);
1592 
1593 	/* Poll for TV detection */
1594 	tv_ctl &= ~(TV_ENC_ENABLE | TV_ENC_PIPE_SEL_MASK | TV_TEST_MODE_MASK);
1595 	tv_ctl |= TV_TEST_MODE_MONITOR_DETECT;
1596 	tv_ctl |= TV_ENC_PIPE_SEL(intel_crtc->pipe);
1597 
1598 	tv_dac &= ~(TVDAC_SENSE_MASK | DAC_A_MASK | DAC_B_MASK | DAC_C_MASK);
1599 	tv_dac |= (TVDAC_STATE_CHG_EN |
1600 		   TVDAC_A_SENSE_CTL |
1601 		   TVDAC_B_SENSE_CTL |
1602 		   TVDAC_C_SENSE_CTL |
1603 		   DAC_CTL_OVERRIDE |
1604 		   DAC_A_0_7_V |
1605 		   DAC_B_0_7_V |
1606 		   DAC_C_0_7_V);
1607 
1608 
1609 	/*
1610 	 * The TV sense state should be cleared to zero on cantiga platform. Otherwise
1611 	 * the TV is misdetected. This is hardware requirement.
1612 	 */
1613 	if (IS_GM45(dev_priv))
1614 		tv_dac &= ~(TVDAC_STATE_CHG_EN | TVDAC_A_SENSE_CTL |
1615 			    TVDAC_B_SENSE_CTL | TVDAC_C_SENSE_CTL);
1616 
1617 	intel_de_write(dev_priv, TV_CTL, tv_ctl);
1618 	intel_de_write(dev_priv, TV_DAC, tv_dac);
1619 	intel_de_posting_read(dev_priv, TV_DAC);
1620 
1621 	intel_wait_for_vblank(dev_priv, intel_crtc->pipe);
1622 
1623 	type = -1;
1624 	tv_dac = intel_de_read(dev_priv, TV_DAC);
1625 	drm_dbg_kms(&dev_priv->drm, "TV detected: %x, %x\n", tv_ctl, tv_dac);
1626 	/*
1627 	 *  A B C
1628 	 *  0 1 1 Composite
1629 	 *  1 0 X svideo
1630 	 *  0 0 0 Component
1631 	 */
1632 	if ((tv_dac & TVDAC_SENSE_MASK) == (TVDAC_B_SENSE | TVDAC_C_SENSE)) {
1633 		drm_dbg_kms(&dev_priv->drm,
1634 			    "Detected Composite TV connection\n");
1635 		type = DRM_MODE_CONNECTOR_Composite;
1636 	} else if ((tv_dac & (TVDAC_A_SENSE|TVDAC_B_SENSE)) == TVDAC_A_SENSE) {
1637 		drm_dbg_kms(&dev_priv->drm,
1638 			    "Detected S-Video TV connection\n");
1639 		type = DRM_MODE_CONNECTOR_SVIDEO;
1640 	} else if ((tv_dac & TVDAC_SENSE_MASK) == 0) {
1641 		drm_dbg_kms(&dev_priv->drm,
1642 			    "Detected Component TV connection\n");
1643 		type = DRM_MODE_CONNECTOR_Component;
1644 	} else {
1645 		drm_dbg_kms(&dev_priv->drm, "Unrecognised TV connection\n");
1646 		type = -1;
1647 	}
1648 
1649 	intel_de_write(dev_priv, TV_DAC, save_tv_dac & ~TVDAC_STATE_CHG_EN);
1650 	intel_de_write(dev_priv, TV_CTL, save_tv_ctl);
1651 	intel_de_posting_read(dev_priv, TV_CTL);
1652 
1653 	/* For unknown reasons the hw barfs if we don't do this vblank wait. */
1654 	intel_wait_for_vblank(dev_priv, intel_crtc->pipe);
1655 
1656 	/* Restore interrupt config */
1657 	if (connector->polled & DRM_CONNECTOR_POLL_HPD) {
1658 		spin_lock_irq(&dev_priv->irq_lock);
1659 		i915_enable_pipestat(dev_priv, 0,
1660 				     PIPE_HOTPLUG_INTERRUPT_STATUS |
1661 				     PIPE_HOTPLUG_TV_INTERRUPT_STATUS);
1662 		spin_unlock_irq(&dev_priv->irq_lock);
1663 	}
1664 
1665 	return type;
1666 }
1667 
1668 /*
1669  * Here we set accurate tv format according to connector type
1670  * i.e Component TV should not be assigned by NTSC or PAL
1671  */
1672 static void intel_tv_find_better_format(struct drm_connector *connector)
1673 {
1674 	struct intel_tv *intel_tv = intel_attached_tv(to_intel_connector(connector));
1675 	const struct tv_mode *tv_mode = intel_tv_mode_find(connector->state);
1676 	int i;
1677 
1678 	/* Component supports everything so we can keep the current mode */
1679 	if (intel_tv->type == DRM_MODE_CONNECTOR_Component)
1680 		return;
1681 
1682 	/* If the current mode is fine don't change it */
1683 	if (!tv_mode->component_only)
1684 		return;
1685 
1686 	for (i = 0; i < ARRAY_SIZE(tv_modes); i++) {
1687 		tv_mode = &tv_modes[i];
1688 
1689 		if (!tv_mode->component_only)
1690 			break;
1691 	}
1692 
1693 	connector->state->tv.mode = i;
1694 }
1695 
1696 static int
1697 intel_tv_detect(struct drm_connector *connector,
1698 		struct drm_modeset_acquire_ctx *ctx,
1699 		bool force)
1700 {
1701 	struct drm_i915_private *i915 = to_i915(connector->dev);
1702 	struct intel_tv *intel_tv = intel_attached_tv(to_intel_connector(connector));
1703 	enum drm_connector_status status;
1704 	int type;
1705 
1706 	drm_dbg_kms(&i915->drm, "[CONNECTOR:%d:%s] force=%d\n",
1707 		    connector->base.id, connector->name, force);
1708 
1709 	if (!INTEL_DISPLAY_ENABLED(i915))
1710 		return connector_status_disconnected;
1711 
1712 	if (force) {
1713 		struct intel_load_detect_pipe tmp;
1714 		int ret;
1715 
1716 		ret = intel_get_load_detect_pipe(connector, &tmp, ctx);
1717 		if (ret < 0)
1718 			return ret;
1719 
1720 		if (ret > 0) {
1721 			type = intel_tv_detect_type(intel_tv, connector);
1722 			intel_release_load_detect_pipe(connector, &tmp, ctx);
1723 			status = type < 0 ?
1724 				connector_status_disconnected :
1725 				connector_status_connected;
1726 		} else
1727 			status = connector_status_unknown;
1728 
1729 		if (status == connector_status_connected) {
1730 			intel_tv->type = type;
1731 			intel_tv_find_better_format(connector);
1732 		}
1733 
1734 		return status;
1735 	} else
1736 		return connector->status;
1737 }
1738 
1739 static const struct input_res {
1740 	u16 w, h;
1741 } input_res_table[] = {
1742 	{ 640, 480 },
1743 	{ 800, 600 },
1744 	{ 1024, 768 },
1745 	{ 1280, 1024 },
1746 	{ 848, 480 },
1747 	{ 1280, 720 },
1748 	{ 1920, 1080 },
1749 };
1750 
1751 /* Choose preferred mode according to line number of TV format */
1752 static bool
1753 intel_tv_is_preferred_mode(const struct drm_display_mode *mode,
1754 			   const struct tv_mode *tv_mode)
1755 {
1756 	int vdisplay = intel_tv_mode_vdisplay(tv_mode);
1757 
1758 	/* prefer 480 line modes for all SD TV modes */
1759 	if (vdisplay <= 576)
1760 		vdisplay = 480;
1761 
1762 	return vdisplay == mode->vdisplay;
1763 }
1764 
1765 static void
1766 intel_tv_set_mode_type(struct drm_display_mode *mode,
1767 		       const struct tv_mode *tv_mode)
1768 {
1769 	mode->type = DRM_MODE_TYPE_DRIVER;
1770 
1771 	if (intel_tv_is_preferred_mode(mode, tv_mode))
1772 		mode->type |= DRM_MODE_TYPE_PREFERRED;
1773 }
1774 
1775 static int
1776 intel_tv_get_modes(struct drm_connector *connector)
1777 {
1778 	struct drm_i915_private *dev_priv = to_i915(connector->dev);
1779 	const struct tv_mode *tv_mode = intel_tv_mode_find(connector->state);
1780 	int i, count = 0;
1781 
1782 	for (i = 0; i < ARRAY_SIZE(input_res_table); i++) {
1783 		const struct input_res *input = &input_res_table[i];
1784 		struct drm_display_mode *mode;
1785 
1786 		if (input->w > 1024 &&
1787 		    !tv_mode->progressive &&
1788 		    !tv_mode->component_only)
1789 			continue;
1790 
1791 		/* no vertical scaling with wide sources on gen3 */
1792 		if (IS_GEN(dev_priv, 3) && input->w > 1024 &&
1793 		    input->h > intel_tv_mode_vdisplay(tv_mode))
1794 			continue;
1795 
1796 		mode = drm_mode_create(connector->dev);
1797 		if (!mode)
1798 			continue;
1799 
1800 		/*
1801 		 * We take the TV mode and scale it to look
1802 		 * like it had the expected h/vdisplay. This
1803 		 * provides the most information to userspace
1804 		 * about the actual timings of the mode. We
1805 		 * do ignore the margins though.
1806 		 */
1807 		intel_tv_mode_to_mode(mode, tv_mode);
1808 		if (count == 0) {
1809 			drm_dbg_kms(&dev_priv->drm, "TV mode:\n");
1810 			drm_mode_debug_printmodeline(mode);
1811 		}
1812 		intel_tv_scale_mode_horiz(mode, input->w, 0, 0);
1813 		intel_tv_scale_mode_vert(mode, input->h, 0, 0);
1814 		intel_tv_set_mode_type(mode, tv_mode);
1815 
1816 		drm_mode_set_name(mode);
1817 
1818 		drm_mode_probed_add(connector, mode);
1819 		count++;
1820 	}
1821 
1822 	return count;
1823 }
1824 
1825 static const struct drm_connector_funcs intel_tv_connector_funcs = {
1826 	.late_register = intel_connector_register,
1827 	.early_unregister = intel_connector_unregister,
1828 	.destroy = intel_connector_destroy,
1829 	.fill_modes = drm_helper_probe_single_connector_modes,
1830 	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
1831 	.atomic_duplicate_state = intel_tv_connector_duplicate_state,
1832 };
1833 
1834 static int intel_tv_atomic_check(struct drm_connector *connector,
1835 				 struct drm_atomic_state *state)
1836 {
1837 	struct drm_connector_state *new_state;
1838 	struct drm_crtc_state *new_crtc_state;
1839 	struct drm_connector_state *old_state;
1840 
1841 	new_state = drm_atomic_get_new_connector_state(state, connector);
1842 	if (!new_state->crtc)
1843 		return 0;
1844 
1845 	old_state = drm_atomic_get_old_connector_state(state, connector);
1846 	new_crtc_state = drm_atomic_get_new_crtc_state(state, new_state->crtc);
1847 
1848 	if (old_state->tv.mode != new_state->tv.mode ||
1849 	    old_state->tv.margins.left != new_state->tv.margins.left ||
1850 	    old_state->tv.margins.right != new_state->tv.margins.right ||
1851 	    old_state->tv.margins.top != new_state->tv.margins.top ||
1852 	    old_state->tv.margins.bottom != new_state->tv.margins.bottom) {
1853 		/* Force a modeset. */
1854 
1855 		new_crtc_state->connectors_changed = true;
1856 	}
1857 
1858 	return 0;
1859 }
1860 
1861 static const struct drm_connector_helper_funcs intel_tv_connector_helper_funcs = {
1862 	.detect_ctx = intel_tv_detect,
1863 	.mode_valid = intel_tv_mode_valid,
1864 	.get_modes = intel_tv_get_modes,
1865 	.atomic_check = intel_tv_atomic_check,
1866 };
1867 
1868 static const struct drm_encoder_funcs intel_tv_enc_funcs = {
1869 	.destroy = intel_encoder_destroy,
1870 };
1871 
1872 void
1873 intel_tv_init(struct drm_i915_private *dev_priv)
1874 {
1875 	struct drm_device *dev = &dev_priv->drm;
1876 	struct drm_connector *connector;
1877 	struct intel_tv *intel_tv;
1878 	struct intel_encoder *intel_encoder;
1879 	struct intel_connector *intel_connector;
1880 	u32 tv_dac_on, tv_dac_off, save_tv_dac;
1881 	const char *tv_format_names[ARRAY_SIZE(tv_modes)];
1882 	int i, initial_mode = 0;
1883 	struct drm_connector_state *state;
1884 
1885 	if ((intel_de_read(dev_priv, TV_CTL) & TV_FUSE_STATE_MASK) == TV_FUSE_STATE_DISABLED)
1886 		return;
1887 
1888 	if (!intel_bios_is_tv_present(dev_priv)) {
1889 		drm_dbg_kms(&dev_priv->drm, "Integrated TV is not present.\n");
1890 		return;
1891 	}
1892 
1893 	/*
1894 	 * Sanity check the TV output by checking to see if the
1895 	 * DAC register holds a value
1896 	 */
1897 	save_tv_dac = intel_de_read(dev_priv, TV_DAC);
1898 
1899 	intel_de_write(dev_priv, TV_DAC, save_tv_dac | TVDAC_STATE_CHG_EN);
1900 	tv_dac_on = intel_de_read(dev_priv, TV_DAC);
1901 
1902 	intel_de_write(dev_priv, TV_DAC, save_tv_dac & ~TVDAC_STATE_CHG_EN);
1903 	tv_dac_off = intel_de_read(dev_priv, TV_DAC);
1904 
1905 	intel_de_write(dev_priv, TV_DAC, save_tv_dac);
1906 
1907 	/*
1908 	 * If the register does not hold the state change enable
1909 	 * bit, (either as a 0 or a 1), assume it doesn't really
1910 	 * exist
1911 	 */
1912 	if ((tv_dac_on & TVDAC_STATE_CHG_EN) == 0 ||
1913 	    (tv_dac_off & TVDAC_STATE_CHG_EN) != 0)
1914 		return;
1915 
1916 	intel_tv = kzalloc(sizeof(*intel_tv), GFP_KERNEL);
1917 	if (!intel_tv) {
1918 		return;
1919 	}
1920 
1921 	intel_connector = intel_connector_alloc();
1922 	if (!intel_connector) {
1923 		kfree(intel_tv);
1924 		return;
1925 	}
1926 
1927 	intel_encoder = &intel_tv->base;
1928 	connector = &intel_connector->base;
1929 	state = connector->state;
1930 
1931 	/*
1932 	 * The documentation, for the older chipsets at least, recommend
1933 	 * using a polling method rather than hotplug detection for TVs.
1934 	 * This is because in order to perform the hotplug detection, the PLLs
1935 	 * for the TV must be kept alive increasing power drain and starving
1936 	 * bandwidth from other encoders. Notably for instance, it causes
1937 	 * pipe underruns on Crestline when this encoder is supposedly idle.
1938 	 *
1939 	 * More recent chipsets favour HDMI rather than integrated S-Video.
1940 	 */
1941 	intel_connector->polled = DRM_CONNECTOR_POLL_CONNECT;
1942 
1943 	drm_connector_init(dev, connector, &intel_tv_connector_funcs,
1944 			   DRM_MODE_CONNECTOR_SVIDEO);
1945 
1946 	drm_encoder_init(dev, &intel_encoder->base, &intel_tv_enc_funcs,
1947 			 DRM_MODE_ENCODER_TVDAC, "TV");
1948 
1949 	intel_encoder->compute_config = intel_tv_compute_config;
1950 	intel_encoder->get_config = intel_tv_get_config;
1951 	intel_encoder->pre_enable = intel_tv_pre_enable;
1952 	intel_encoder->enable = intel_enable_tv;
1953 	intel_encoder->disable = intel_disable_tv;
1954 	intel_encoder->get_hw_state = intel_tv_get_hw_state;
1955 	intel_connector->get_hw_state = intel_connector_get_hw_state;
1956 
1957 	intel_connector_attach_encoder(intel_connector, intel_encoder);
1958 
1959 	intel_encoder->type = INTEL_OUTPUT_TVOUT;
1960 	intel_encoder->power_domain = POWER_DOMAIN_PORT_OTHER;
1961 	intel_encoder->port = PORT_NONE;
1962 	intel_encoder->pipe_mask = ~0;
1963 	intel_encoder->cloneable = 0;
1964 	intel_tv->type = DRM_MODE_CONNECTOR_Unknown;
1965 
1966 	/* BIOS margin values */
1967 	state->tv.margins.left = 54;
1968 	state->tv.margins.top = 36;
1969 	state->tv.margins.right = 46;
1970 	state->tv.margins.bottom = 37;
1971 
1972 	state->tv.mode = initial_mode;
1973 
1974 	drm_connector_helper_add(connector, &intel_tv_connector_helper_funcs);
1975 	connector->interlace_allowed = false;
1976 	connector->doublescan_allowed = false;
1977 
1978 	/* Create TV properties then attach current values */
1979 	for (i = 0; i < ARRAY_SIZE(tv_modes); i++) {
1980 		/* 1080p50/1080p60 not supported on gen3 */
1981 		if (IS_GEN(dev_priv, 3) &&
1982 		    tv_modes[i].oversample == 1)
1983 			break;
1984 
1985 		tv_format_names[i] = tv_modes[i].name;
1986 	}
1987 	drm_mode_create_tv_properties(dev, i, tv_format_names);
1988 
1989 	drm_object_attach_property(&connector->base, dev->mode_config.tv_mode_property,
1990 				   state->tv.mode);
1991 	drm_object_attach_property(&connector->base,
1992 				   dev->mode_config.tv_left_margin_property,
1993 				   state->tv.margins.left);
1994 	drm_object_attach_property(&connector->base,
1995 				   dev->mode_config.tv_top_margin_property,
1996 				   state->tv.margins.top);
1997 	drm_object_attach_property(&connector->base,
1998 				   dev->mode_config.tv_right_margin_property,
1999 				   state->tv.margins.right);
2000 	drm_object_attach_property(&connector->base,
2001 				   dev->mode_config.tv_bottom_margin_property,
2002 				   state->tv.margins.bottom);
2003 }
2004