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