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/drmP.h>
34 #include <drm/drm_atomic_helper.h>
35 #include <drm/drm_crtc.h>
36 #include <drm/drm_edid.h>
37 #include "intel_drv.h"
38 #include <drm/i915_drm.h>
39 #include "i915_drv.h"
40 
41 enum tv_margin {
42 	TV_MARGIN_LEFT, TV_MARGIN_TOP,
43 	TV_MARGIN_RIGHT, TV_MARGIN_BOTTOM
44 };
45 
46 struct intel_tv {
47 	struct intel_encoder base;
48 
49 	int type;
50 };
51 
52 struct video_levels {
53 	u16 blank, black;
54 	u8 burst;
55 };
56 
57 struct color_conversion {
58 	u16 ry, gy, by, ay;
59 	u16 ru, gu, bu, au;
60 	u16 rv, gv, bv, av;
61 };
62 
63 static const u32 filter_table[] = {
64 	0xB1403000, 0x2E203500, 0x35002E20, 0x3000B140,
65 	0x35A0B160, 0x2DC02E80, 0xB1403480, 0xB1603000,
66 	0x2EA03640, 0x34002D80, 0x3000B120, 0x36E0B160,
67 	0x2D202EF0, 0xB1203380, 0xB1603000, 0x2F303780,
68 	0x33002CC0, 0x3000B100, 0x3820B160, 0x2C802F50,
69 	0xB10032A0, 0xB1603000, 0x2F9038C0, 0x32202C20,
70 	0x3000B0E0, 0x3980B160, 0x2BC02FC0, 0xB0E031C0,
71 	0xB1603000, 0x2FF03A20, 0x31602B60, 0xB020B0C0,
72 	0x3AE0B160, 0x2B001810, 0xB0C03120, 0xB140B020,
73 	0x18283BA0, 0x30C02A80, 0xB020B0A0, 0x3C60B140,
74 	0x2A201838, 0xB0A03080, 0xB120B020, 0x18383D20,
75 	0x304029C0, 0xB040B080, 0x3DE0B100, 0x29601848,
76 	0xB0803000, 0xB100B040, 0x18483EC0, 0xB0402900,
77 	0xB040B060, 0x3F80B0C0, 0x28801858, 0xB060B080,
78 	0xB0A0B060, 0x18602820, 0xB0A02820, 0x0000B060,
79 	0xB1403000, 0x2E203500, 0x35002E20, 0x3000B140,
80 	0x35A0B160, 0x2DC02E80, 0xB1403480, 0xB1603000,
81 	0x2EA03640, 0x34002D80, 0x3000B120, 0x36E0B160,
82 	0x2D202EF0, 0xB1203380, 0xB1603000, 0x2F303780,
83 	0x33002CC0, 0x3000B100, 0x3820B160, 0x2C802F50,
84 	0xB10032A0, 0xB1603000, 0x2F9038C0, 0x32202C20,
85 	0x3000B0E0, 0x3980B160, 0x2BC02FC0, 0xB0E031C0,
86 	0xB1603000, 0x2FF03A20, 0x31602B60, 0xB020B0C0,
87 	0x3AE0B160, 0x2B001810, 0xB0C03120, 0xB140B020,
88 	0x18283BA0, 0x30C02A80, 0xB020B0A0, 0x3C60B140,
89 	0x2A201838, 0xB0A03080, 0xB120B020, 0x18383D20,
90 	0x304029C0, 0xB040B080, 0x3DE0B100, 0x29601848,
91 	0xB0803000, 0xB100B040, 0x18483EC0, 0xB0402900,
92 	0xB040B060, 0x3F80B0C0, 0x28801858, 0xB060B080,
93 	0xB0A0B060, 0x18602820, 0xB0A02820, 0x0000B060,
94 	0x36403000, 0x2D002CC0, 0x30003640, 0x2D0036C0,
95 	0x35C02CC0, 0x37403000, 0x2C802D40, 0x30003540,
96 	0x2D8037C0, 0x34C02C40, 0x38403000, 0x2BC02E00,
97 	0x30003440, 0x2E2038C0, 0x34002B80, 0x39803000,
98 	0x2B402E40, 0x30003380, 0x2E603A00, 0x33402B00,
99 	0x3A803040, 0x2A802EA0, 0x30403300, 0x2EC03B40,
100 	0x32802A40, 0x3C003040, 0x2A002EC0, 0x30803240,
101 	0x2EC03C80, 0x320029C0, 0x3D403080, 0x29402F00,
102 	0x308031C0, 0x2F203DC0, 0x31802900, 0x3E8030C0,
103 	0x28802F40, 0x30C03140, 0x2F203F40, 0x31402840,
104 	0x28003100, 0x28002F00, 0x00003100, 0x36403000,
105 	0x2D002CC0, 0x30003640, 0x2D0036C0,
106 	0x35C02CC0, 0x37403000, 0x2C802D40, 0x30003540,
107 	0x2D8037C0, 0x34C02C40, 0x38403000, 0x2BC02E00,
108 	0x30003440, 0x2E2038C0, 0x34002B80, 0x39803000,
109 	0x2B402E40, 0x30003380, 0x2E603A00, 0x33402B00,
110 	0x3A803040, 0x2A802EA0, 0x30403300, 0x2EC03B40,
111 	0x32802A40, 0x3C003040, 0x2A002EC0, 0x30803240,
112 	0x2EC03C80, 0x320029C0, 0x3D403080, 0x29402F00,
113 	0x308031C0, 0x2F203DC0, 0x31802900, 0x3E8030C0,
114 	0x28802F40, 0x30C03140, 0x2F203F40, 0x31402840,
115 	0x28003100, 0x28002F00, 0x00003100,
116 };
117 
118 /*
119  * Color conversion values have 3 separate fixed point formats:
120  *
121  * 10 bit fields (ay, au)
122  *   1.9 fixed point (b.bbbbbbbbb)
123  * 11 bit fields (ry, by, ru, gu, gv)
124  *   exp.mantissa (ee.mmmmmmmmm)
125  *   ee = 00 = 10^-1 (0.mmmmmmmmm)
126  *   ee = 01 = 10^-2 (0.0mmmmmmmmm)
127  *   ee = 10 = 10^-3 (0.00mmmmmmmmm)
128  *   ee = 11 = 10^-4 (0.000mmmmmmmmm)
129  * 12 bit fields (gy, rv, bu)
130  *   exp.mantissa (eee.mmmmmmmmm)
131  *   eee = 000 = 10^-1 (0.mmmmmmmmm)
132  *   eee = 001 = 10^-2 (0.0mmmmmmmmm)
133  *   eee = 010 = 10^-3 (0.00mmmmmmmmm)
134  *   eee = 011 = 10^-4 (0.000mmmmmmmmm)
135  *   eee = 100 = reserved
136  *   eee = 101 = reserved
137  *   eee = 110 = reserved
138  *   eee = 111 = 10^0 (m.mmmmmmmm) (only usable for 1.0 representation)
139  *
140  * Saturation and contrast are 8 bits, with their own representation:
141  * 8 bit field (saturation, contrast)
142  *   exp.mantissa (ee.mmmmmm)
143  *   ee = 00 = 10^-1 (0.mmmmmm)
144  *   ee = 01 = 10^0 (m.mmmmm)
145  *   ee = 10 = 10^1 (mm.mmmm)
146  *   ee = 11 = 10^2 (mmm.mmm)
147  *
148  * Simple conversion function:
149  *
150  * static u32
151  * float_to_csc_11(float f)
152  * {
153  *     u32 exp;
154  *     u32 mant;
155  *     u32 ret;
156  *
157  *     if (f < 0)
158  *         f = -f;
159  *
160  *     if (f >= 1) {
161  *         exp = 0x7;
162  *	   mant = 1 << 8;
163  *     } else {
164  *         for (exp = 0; exp < 3 && f < 0.5; exp++)
165  *	   f *= 2.0;
166  *         mant = (f * (1 << 9) + 0.5);
167  *         if (mant >= (1 << 9))
168  *             mant = (1 << 9) - 1;
169  *     }
170  *     ret = (exp << 9) | mant;
171  *     return ret;
172  * }
173  */
174 
175 /*
176  * Behold, magic numbers!  If we plant them they might grow a big
177  * s-video cable to the sky... or something.
178  *
179  * Pre-converted to appropriate hex value.
180  */
181 
182 /*
183  * PAL & NTSC values for composite & s-video connections
184  */
185 static const struct color_conversion ntsc_m_csc_composite = {
186 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0104,
187 	.ru = 0x0733, .gu = 0x052d, .bu = 0x05c7, .au = 0x0200,
188 	.rv = 0x0340, .gv = 0x030c, .bv = 0x06d0, .av = 0x0200,
189 };
190 
191 static const struct video_levels ntsc_m_levels_composite = {
192 	.blank = 225, .black = 267, .burst = 113,
193 };
194 
195 static const struct color_conversion ntsc_m_csc_svideo = {
196 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0133,
197 	.ru = 0x076a, .gu = 0x0564, .bu = 0x030d, .au = 0x0200,
198 	.rv = 0x037a, .gv = 0x033d, .bv = 0x06f6, .av = 0x0200,
199 };
200 
201 static const struct video_levels ntsc_m_levels_svideo = {
202 	.blank = 266, .black = 316, .burst = 133,
203 };
204 
205 static const struct color_conversion ntsc_j_csc_composite = {
206 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0119,
207 	.ru = 0x074c, .gu = 0x0546, .bu = 0x05ec, .au = 0x0200,
208 	.rv = 0x035a, .gv = 0x0322, .bv = 0x06e1, .av = 0x0200,
209 };
210 
211 static const struct video_levels ntsc_j_levels_composite = {
212 	.blank = 225, .black = 225, .burst = 113,
213 };
214 
215 static const struct color_conversion ntsc_j_csc_svideo = {
216 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x014c,
217 	.ru = 0x0788, .gu = 0x0581, .bu = 0x0322, .au = 0x0200,
218 	.rv = 0x0399, .gv = 0x0356, .bv = 0x070a, .av = 0x0200,
219 };
220 
221 static const struct video_levels ntsc_j_levels_svideo = {
222 	.blank = 266, .black = 266, .burst = 133,
223 };
224 
225 static const struct color_conversion pal_csc_composite = {
226 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0113,
227 	.ru = 0x0745, .gu = 0x053f, .bu = 0x05e1, .au = 0x0200,
228 	.rv = 0x0353, .gv = 0x031c, .bv = 0x06dc, .av = 0x0200,
229 };
230 
231 static const struct video_levels pal_levels_composite = {
232 	.blank = 237, .black = 237, .burst = 118,
233 };
234 
235 static const struct color_conversion pal_csc_svideo = {
236 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0145,
237 	.ru = 0x0780, .gu = 0x0579, .bu = 0x031c, .au = 0x0200,
238 	.rv = 0x0390, .gv = 0x034f, .bv = 0x0705, .av = 0x0200,
239 };
240 
241 static const struct video_levels pal_levels_svideo = {
242 	.blank = 280, .black = 280, .burst = 139,
243 };
244 
245 static const struct color_conversion pal_m_csc_composite = {
246 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0104,
247 	.ru = 0x0733, .gu = 0x052d, .bu = 0x05c7, .au = 0x0200,
248 	.rv = 0x0340, .gv = 0x030c, .bv = 0x06d0, .av = 0x0200,
249 };
250 
251 static const struct video_levels pal_m_levels_composite = {
252 	.blank = 225, .black = 267, .burst = 113,
253 };
254 
255 static const struct color_conversion pal_m_csc_svideo = {
256 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0133,
257 	.ru = 0x076a, .gu = 0x0564, .bu = 0x030d, .au = 0x0200,
258 	.rv = 0x037a, .gv = 0x033d, .bv = 0x06f6, .av = 0x0200,
259 };
260 
261 static const struct video_levels pal_m_levels_svideo = {
262 	.blank = 266, .black = 316, .burst = 133,
263 };
264 
265 static const struct color_conversion pal_n_csc_composite = {
266 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0104,
267 	.ru = 0x0733, .gu = 0x052d, .bu = 0x05c7, .au = 0x0200,
268 	.rv = 0x0340, .gv = 0x030c, .bv = 0x06d0, .av = 0x0200,
269 };
270 
271 static const struct video_levels pal_n_levels_composite = {
272 	.blank = 225, .black = 267, .burst = 118,
273 };
274 
275 static const struct color_conversion pal_n_csc_svideo = {
276 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0133,
277 	.ru = 0x076a, .gu = 0x0564, .bu = 0x030d, .au = 0x0200,
278 	.rv = 0x037a, .gv = 0x033d, .bv = 0x06f6, .av = 0x0200,
279 };
280 
281 static const struct video_levels pal_n_levels_svideo = {
282 	.blank = 266, .black = 316, .burst = 139,
283 };
284 
285 /*
286  * Component connections
287  */
288 static const struct color_conversion sdtv_csc_yprpb = {
289 	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0145,
290 	.ru = 0x0559, .gu = 0x0353, .bu = 0x0100, .au = 0x0200,
291 	.rv = 0x0100, .gv = 0x03ad, .bv = 0x074d, .av = 0x0200,
292 };
293 
294 static const struct color_conversion hdtv_csc_yprpb = {
295 	.ry = 0x05b3, .gy = 0x016e, .by = 0x0728, .ay = 0x0145,
296 	.ru = 0x07d5, .gu = 0x038b, .bu = 0x0100, .au = 0x0200,
297 	.rv = 0x0100, .gv = 0x03d1, .bv = 0x06bc, .av = 0x0200,
298 };
299 
300 static const struct video_levels component_levels = {
301 	.blank = 279, .black = 279, .burst = 0,
302 };
303 
304 
305 struct tv_mode {
306 	const char *name;
307 
308 	u32 clock;
309 	u16 refresh; /* in millihertz (for precision) */
310 	u32 oversample;
311 	u8 hsync_end;
312 	u16 hblank_start, hblank_end, htotal;
313 	bool progressive : 1, trilevel_sync : 1, component_only : 1;
314 	u8 vsync_start_f1, vsync_start_f2, vsync_len;
315 	bool veq_ena : 1;
316 	u8 veq_start_f1, veq_start_f2, veq_len;
317 	u8 vi_end_f1, vi_end_f2;
318 	u16 nbr_end;
319 	bool burst_ena : 1;
320 	u8 hburst_start, hburst_len;
321 	u8 vburst_start_f1;
322 	u16 vburst_end_f1;
323 	u8 vburst_start_f2;
324 	u16 vburst_end_f2;
325 	u8 vburst_start_f3;
326 	u16 vburst_end_f3;
327 	u8 vburst_start_f4;
328 	u16 vburst_end_f4;
329 	/*
330 	 * subcarrier programming
331 	 */
332 	u16 dda2_size, dda3_size;
333 	u8 dda1_inc;
334 	u16 dda2_inc, dda3_inc;
335 	u32 sc_reset;
336 	bool pal_burst : 1;
337 	/*
338 	 * blank/black levels
339 	 */
340 	const struct video_levels *composite_levels, *svideo_levels;
341 	const struct color_conversion *composite_color, *svideo_color;
342 	const u32 *filter_table;
343 	u16 max_srcw;
344 };
345 
346 
347 /*
348  * Sub carrier DDA
349  *
350  *  I think this works as follows:
351  *
352  *  subcarrier freq = pixel_clock * (dda1_inc + dda2_inc / dda2_size) / 4096
353  *
354  * Presumably, when dda3 is added in, it gets to adjust the dda2_inc value
355  *
356  * So,
357  *  dda1_ideal = subcarrier/pixel * 4096
358  *  dda1_inc = floor (dda1_ideal)
359  *  dda2 = dda1_ideal - dda1_inc
360  *
361  *  then pick a ratio for dda2 that gives the closest approximation. If
362  *  you can't get close enough, you can play with dda3 as well. This
363  *  seems likely to happen when dda2 is small as the jumps would be larger
364  *
365  * To invert this,
366  *
367  *  pixel_clock = subcarrier * 4096 / (dda1_inc + dda2_inc / dda2_size)
368  *
369  * The constants below were all computed using a 107.520MHz clock
370  */
371 
372 /*
373  * Register programming values for TV modes.
374  *
375  * These values account for -1s required.
376  */
377 static const struct tv_mode tv_modes[] = {
378 	{
379 		.name		= "NTSC-M",
380 		.clock		= 108000,
381 		.refresh	= 59940,
382 		.oversample	= TV_OVERSAMPLE_8X,
383 		.component_only = 0,
384 		/* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 3.580MHz */
385 
386 		.hsync_end	= 64,		    .hblank_end		= 124,
387 		.hblank_start	= 836,		    .htotal		= 857,
388 
389 		.progressive	= false,	    .trilevel_sync = false,
390 
391 		.vsync_start_f1	= 6,		    .vsync_start_f2	= 7,
392 		.vsync_len	= 6,
393 
394 		.veq_ena	= true,		    .veq_start_f1	= 0,
395 		.veq_start_f2	= 1,		    .veq_len		= 18,
396 
397 		.vi_end_f1	= 20,		    .vi_end_f2		= 21,
398 		.nbr_end	= 240,
399 
400 		.burst_ena	= true,
401 		.hburst_start	= 72,		    .hburst_len		= 34,
402 		.vburst_start_f1 = 9,		    .vburst_end_f1	= 240,
403 		.vburst_start_f2 = 10,		    .vburst_end_f2	= 240,
404 		.vburst_start_f3 = 9,		    .vburst_end_f3	= 240,
405 		.vburst_start_f4 = 10,		    .vburst_end_f4	= 240,
406 
407 		/* desired 3.5800000 actual 3.5800000 clock 107.52 */
408 		.dda1_inc	=    135,
409 		.dda2_inc	=  20800,	    .dda2_size		=  27456,
410 		.dda3_inc	=      0,	    .dda3_size		=      0,
411 		.sc_reset	= TV_SC_RESET_EVERY_4,
412 		.pal_burst	= false,
413 
414 		.composite_levels = &ntsc_m_levels_composite,
415 		.composite_color = &ntsc_m_csc_composite,
416 		.svideo_levels  = &ntsc_m_levels_svideo,
417 		.svideo_color = &ntsc_m_csc_svideo,
418 
419 		.filter_table = filter_table,
420 	},
421 	{
422 		.name		= "NTSC-443",
423 		.clock		= 108000,
424 		.refresh	= 59940,
425 		.oversample	= TV_OVERSAMPLE_8X,
426 		.component_only = 0,
427 		/* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 4.43MHz */
428 		.hsync_end	= 64,		    .hblank_end		= 124,
429 		.hblank_start	= 836,		    .htotal		= 857,
430 
431 		.progressive	= false,	    .trilevel_sync = false,
432 
433 		.vsync_start_f1 = 6,		    .vsync_start_f2	= 7,
434 		.vsync_len	= 6,
435 
436 		.veq_ena	= true,		    .veq_start_f1	= 0,
437 		.veq_start_f2	= 1,		    .veq_len		= 18,
438 
439 		.vi_end_f1	= 20,		    .vi_end_f2		= 21,
440 		.nbr_end	= 240,
441 
442 		.burst_ena	= true,
443 		.hburst_start	= 72,		    .hburst_len		= 34,
444 		.vburst_start_f1 = 9,		    .vburst_end_f1	= 240,
445 		.vburst_start_f2 = 10,		    .vburst_end_f2	= 240,
446 		.vburst_start_f3 = 9,		    .vburst_end_f3	= 240,
447 		.vburst_start_f4 = 10,		    .vburst_end_f4	= 240,
448 
449 		/* desired 4.4336180 actual 4.4336180 clock 107.52 */
450 		.dda1_inc       =    168,
451 		.dda2_inc       =   4093,       .dda2_size      =  27456,
452 		.dda3_inc       =    310,       .dda3_size      =    525,
453 		.sc_reset   = TV_SC_RESET_NEVER,
454 		.pal_burst  = false,
455 
456 		.composite_levels = &ntsc_m_levels_composite,
457 		.composite_color = &ntsc_m_csc_composite,
458 		.svideo_levels  = &ntsc_m_levels_svideo,
459 		.svideo_color = &ntsc_m_csc_svideo,
460 
461 		.filter_table = filter_table,
462 	},
463 	{
464 		.name		= "NTSC-J",
465 		.clock		= 108000,
466 		.refresh	= 59940,
467 		.oversample	= TV_OVERSAMPLE_8X,
468 		.component_only = 0,
469 
470 		/* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 3.580MHz */
471 		.hsync_end	= 64,		    .hblank_end		= 124,
472 		.hblank_start = 836,	    .htotal		= 857,
473 
474 		.progressive	= false,    .trilevel_sync = false,
475 
476 		.vsync_start_f1	= 6,	    .vsync_start_f2	= 7,
477 		.vsync_len	= 6,
478 
479 		.veq_ena      = true,	    .veq_start_f1	= 0,
480 		.veq_start_f2 = 1,	    .veq_len		= 18,
481 
482 		.vi_end_f1	= 20,		    .vi_end_f2		= 21,
483 		.nbr_end	= 240,
484 
485 		.burst_ena	= true,
486 		.hburst_start	= 72,		    .hburst_len		= 34,
487 		.vburst_start_f1 = 9,		    .vburst_end_f1	= 240,
488 		.vburst_start_f2 = 10,		    .vburst_end_f2	= 240,
489 		.vburst_start_f3 = 9,		    .vburst_end_f3	= 240,
490 		.vburst_start_f4 = 10,		    .vburst_end_f4	= 240,
491 
492 		/* desired 3.5800000 actual 3.5800000 clock 107.52 */
493 		.dda1_inc	=    135,
494 		.dda2_inc	=  20800,	    .dda2_size		=  27456,
495 		.dda3_inc	=      0,	    .dda3_size		=      0,
496 		.sc_reset	= TV_SC_RESET_EVERY_4,
497 		.pal_burst	= false,
498 
499 		.composite_levels = &ntsc_j_levels_composite,
500 		.composite_color = &ntsc_j_csc_composite,
501 		.svideo_levels  = &ntsc_j_levels_svideo,
502 		.svideo_color = &ntsc_j_csc_svideo,
503 
504 		.filter_table = filter_table,
505 	},
506 	{
507 		.name		= "PAL-M",
508 		.clock		= 108000,
509 		.refresh	= 59940,
510 		.oversample	= TV_OVERSAMPLE_8X,
511 		.component_only = 0,
512 
513 		/* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 3.580MHz */
514 		.hsync_end	= 64,		  .hblank_end		= 124,
515 		.hblank_start = 836,	  .htotal		= 857,
516 
517 		.progressive	= false,	    .trilevel_sync = false,
518 
519 		.vsync_start_f1	= 6,		    .vsync_start_f2	= 7,
520 		.vsync_len	= 6,
521 
522 		.veq_ena	= true,		    .veq_start_f1	= 0,
523 		.veq_start_f2	= 1,		    .veq_len		= 18,
524 
525 		.vi_end_f1	= 20,		    .vi_end_f2		= 21,
526 		.nbr_end	= 240,
527 
528 		.burst_ena	= true,
529 		.hburst_start	= 72,		    .hburst_len		= 34,
530 		.vburst_start_f1 = 9,		    .vburst_end_f1	= 240,
531 		.vburst_start_f2 = 10,		    .vburst_end_f2	= 240,
532 		.vburst_start_f3 = 9,		    .vburst_end_f3	= 240,
533 		.vburst_start_f4 = 10,		    .vburst_end_f4	= 240,
534 
535 		/* desired 3.5800000 actual 3.5800000 clock 107.52 */
536 		.dda1_inc	=    135,
537 		.dda2_inc	=  16704,	    .dda2_size		=  27456,
538 		.dda3_inc	=      0,	    .dda3_size		=      0,
539 		.sc_reset	= TV_SC_RESET_EVERY_8,
540 		.pal_burst  = true,
541 
542 		.composite_levels = &pal_m_levels_composite,
543 		.composite_color = &pal_m_csc_composite,
544 		.svideo_levels  = &pal_m_levels_svideo,
545 		.svideo_color = &pal_m_csc_svideo,
546 
547 		.filter_table = filter_table,
548 	},
549 	{
550 		/* 625 Lines, 50 Fields, 15.625KHz line, Sub-Carrier 4.434MHz */
551 		.name	    = "PAL-N",
552 		.clock		= 108000,
553 		.refresh	= 50000,
554 		.oversample	= TV_OVERSAMPLE_8X,
555 		.component_only = 0,
556 
557 		.hsync_end	= 64,		    .hblank_end		= 128,
558 		.hblank_start = 844,	    .htotal		= 863,
559 
560 		.progressive  = false,    .trilevel_sync = false,
561 
562 
563 		.vsync_start_f1	= 6,	   .vsync_start_f2	= 7,
564 		.vsync_len	= 6,
565 
566 		.veq_ena	= true,		    .veq_start_f1	= 0,
567 		.veq_start_f2	= 1,		    .veq_len		= 18,
568 
569 		.vi_end_f1	= 24,		    .vi_end_f2		= 25,
570 		.nbr_end	= 286,
571 
572 		.burst_ena	= true,
573 		.hburst_start = 73,	    .hburst_len		= 34,
574 		.vburst_start_f1 = 8,	    .vburst_end_f1	= 285,
575 		.vburst_start_f2 = 8,	    .vburst_end_f2	= 286,
576 		.vburst_start_f3 = 9,	    .vburst_end_f3	= 286,
577 		.vburst_start_f4 = 9,	    .vburst_end_f4	= 285,
578 
579 
580 		/* desired 4.4336180 actual 4.4336180 clock 107.52 */
581 		.dda1_inc       =    135,
582 		.dda2_inc       =  23578,       .dda2_size      =  27648,
583 		.dda3_inc       =    134,       .dda3_size      =    625,
584 		.sc_reset   = TV_SC_RESET_EVERY_8,
585 		.pal_burst  = true,
586 
587 		.composite_levels = &pal_n_levels_composite,
588 		.composite_color = &pal_n_csc_composite,
589 		.svideo_levels  = &pal_n_levels_svideo,
590 		.svideo_color = &pal_n_csc_svideo,
591 
592 		.filter_table = filter_table,
593 	},
594 	{
595 		/* 625 Lines, 50 Fields, 15.625KHz line, Sub-Carrier 4.434MHz */
596 		.name	    = "PAL",
597 		.clock		= 108000,
598 		.refresh	= 50000,
599 		.oversample	= TV_OVERSAMPLE_8X,
600 		.component_only = 0,
601 
602 		.hsync_end	= 64,		    .hblank_end		= 142,
603 		.hblank_start	= 844,	    .htotal		= 863,
604 
605 		.progressive	= false,    .trilevel_sync = false,
606 
607 		.vsync_start_f1	= 5,	    .vsync_start_f2	= 6,
608 		.vsync_len	= 5,
609 
610 		.veq_ena	= true,	    .veq_start_f1	= 0,
611 		.veq_start_f2	= 1,	    .veq_len		= 15,
612 
613 		.vi_end_f1	= 24,		    .vi_end_f2		= 25,
614 		.nbr_end	= 286,
615 
616 		.burst_ena	= true,
617 		.hburst_start	= 73,		    .hburst_len		= 32,
618 		.vburst_start_f1 = 8,		    .vburst_end_f1	= 285,
619 		.vburst_start_f2 = 8,		    .vburst_end_f2	= 286,
620 		.vburst_start_f3 = 9,		    .vburst_end_f3	= 286,
621 		.vburst_start_f4 = 9,		    .vburst_end_f4	= 285,
622 
623 		/* desired 4.4336180 actual 4.4336180 clock 107.52 */
624 		.dda1_inc       =    168,
625 		.dda2_inc       =   4122,       .dda2_size      =  27648,
626 		.dda3_inc       =     67,       .dda3_size      =    625,
627 		.sc_reset   = TV_SC_RESET_EVERY_8,
628 		.pal_burst  = true,
629 
630 		.composite_levels = &pal_levels_composite,
631 		.composite_color = &pal_csc_composite,
632 		.svideo_levels  = &pal_levels_svideo,
633 		.svideo_color = &pal_csc_svideo,
634 
635 		.filter_table = filter_table,
636 	},
637 	{
638 		.name       = "480p",
639 		.clock		= 107520,
640 		.refresh	= 59940,
641 		.oversample     = TV_OVERSAMPLE_4X,
642 		.component_only = 1,
643 
644 		.hsync_end      = 64,               .hblank_end         = 122,
645 		.hblank_start   = 842,              .htotal             = 857,
646 
647 		.progressive    = true,		    .trilevel_sync = false,
648 
649 		.vsync_start_f1 = 12,               .vsync_start_f2     = 12,
650 		.vsync_len      = 12,
651 
652 		.veq_ena        = false,
653 
654 		.vi_end_f1      = 44,               .vi_end_f2          = 44,
655 		.nbr_end        = 479,
656 
657 		.burst_ena      = false,
658 
659 		.filter_table = filter_table,
660 	},
661 	{
662 		.name       = "576p",
663 		.clock		= 107520,
664 		.refresh	= 50000,
665 		.oversample     = TV_OVERSAMPLE_4X,
666 		.component_only = 1,
667 
668 		.hsync_end      = 64,               .hblank_end         = 139,
669 		.hblank_start   = 859,              .htotal             = 863,
670 
671 		.progressive    = true,		    .trilevel_sync = false,
672 
673 		.vsync_start_f1 = 10,               .vsync_start_f2     = 10,
674 		.vsync_len      = 10,
675 
676 		.veq_ena        = false,
677 
678 		.vi_end_f1      = 48,               .vi_end_f2          = 48,
679 		.nbr_end        = 575,
680 
681 		.burst_ena      = false,
682 
683 		.filter_table = filter_table,
684 	},
685 	{
686 		.name       = "720p@60Hz",
687 		.clock		= 148800,
688 		.refresh	= 60000,
689 		.oversample     = TV_OVERSAMPLE_2X,
690 		.component_only = 1,
691 
692 		.hsync_end      = 80,               .hblank_end         = 300,
693 		.hblank_start   = 1580,             .htotal             = 1649,
694 
695 		.progressive	= true,		    .trilevel_sync = true,
696 
697 		.vsync_start_f1 = 10,               .vsync_start_f2     = 10,
698 		.vsync_len      = 10,
699 
700 		.veq_ena        = false,
701 
702 		.vi_end_f1      = 29,               .vi_end_f2          = 29,
703 		.nbr_end        = 719,
704 
705 		.burst_ena      = false,
706 
707 		.filter_table = filter_table,
708 	},
709 	{
710 		.name       = "720p@50Hz",
711 		.clock		= 148800,
712 		.refresh	= 50000,
713 		.oversample     = TV_OVERSAMPLE_2X,
714 		.component_only = 1,
715 
716 		.hsync_end      = 80,               .hblank_end         = 300,
717 		.hblank_start   = 1580,             .htotal             = 1979,
718 
719 		.progressive	= true,		    .trilevel_sync = true,
720 
721 		.vsync_start_f1 = 10,               .vsync_start_f2     = 10,
722 		.vsync_len      = 10,
723 
724 		.veq_ena        = false,
725 
726 		.vi_end_f1      = 29,               .vi_end_f2          = 29,
727 		.nbr_end        = 719,
728 
729 		.burst_ena      = false,
730 
731 		.filter_table = filter_table,
732 		.max_srcw = 800
733 	},
734 	{
735 		.name       = "1080i@50Hz",
736 		.clock		= 148800,
737 		.refresh	= 50000,
738 		.oversample     = TV_OVERSAMPLE_2X,
739 		.component_only = 1,
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		= 148800,
763 		.refresh	= 60000,
764 		.oversample     = TV_OVERSAMPLE_2X,
765 		.component_only = 1,
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 
enc_to_tv(struct intel_encoder * encoder)788 static struct intel_tv *enc_to_tv(struct intel_encoder *encoder)
789 {
790 	return container_of(encoder, struct intel_tv, base);
791 }
792 
intel_attached_tv(struct drm_connector * connector)793 static struct intel_tv *intel_attached_tv(struct drm_connector *connector)
794 {
795 	return enc_to_tv(intel_attached_encoder(connector));
796 }
797 
798 static bool
intel_tv_get_hw_state(struct intel_encoder * encoder,enum pipe * pipe)799 intel_tv_get_hw_state(struct intel_encoder *encoder, enum pipe *pipe)
800 {
801 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
802 	u32 tmp = I915_READ(TV_CTL);
803 
804 	*pipe = (tmp & TV_ENC_PIPE_SEL_MASK) >> TV_ENC_PIPE_SEL_SHIFT;
805 
806 	return tmp & TV_ENC_ENABLE;
807 }
808 
809 static void
intel_enable_tv(struct intel_encoder * encoder,const struct intel_crtc_state * pipe_config,const struct drm_connector_state * conn_state)810 intel_enable_tv(struct intel_encoder *encoder,
811 		const struct intel_crtc_state *pipe_config,
812 		const struct drm_connector_state *conn_state)
813 {
814 	struct drm_device *dev = encoder->base.dev;
815 	struct drm_i915_private *dev_priv = to_i915(dev);
816 
817 	/* Prevents vblank waits from timing out in intel_tv_detect_type() */
818 	intel_wait_for_vblank(dev_priv,
819 			      to_intel_crtc(pipe_config->base.crtc)->pipe);
820 
821 	I915_WRITE(TV_CTL, I915_READ(TV_CTL) | TV_ENC_ENABLE);
822 }
823 
824 static void
intel_disable_tv(struct intel_encoder * encoder,const struct intel_crtc_state * old_crtc_state,const struct drm_connector_state * old_conn_state)825 intel_disable_tv(struct intel_encoder *encoder,
826 		 const struct intel_crtc_state *old_crtc_state,
827 		 const struct drm_connector_state *old_conn_state)
828 {
829 	struct drm_device *dev = encoder->base.dev;
830 	struct drm_i915_private *dev_priv = to_i915(dev);
831 
832 	I915_WRITE(TV_CTL, I915_READ(TV_CTL) & ~TV_ENC_ENABLE);
833 }
834 
intel_tv_mode_find(const struct drm_connector_state * conn_state)835 static const struct tv_mode *intel_tv_mode_find(const struct drm_connector_state *conn_state)
836 {
837 	int format = conn_state->tv.mode;
838 
839 	return &tv_modes[format];
840 }
841 
842 static enum drm_mode_status
intel_tv_mode_valid(struct drm_connector * connector,struct drm_display_mode * mode)843 intel_tv_mode_valid(struct drm_connector *connector,
844 		    struct drm_display_mode *mode)
845 {
846 	const struct tv_mode *tv_mode = intel_tv_mode_find(connector->state);
847 	int max_dotclk = to_i915(connector->dev)->max_dotclk_freq;
848 
849 	if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
850 		return MODE_NO_DBLESCAN;
851 
852 	if (mode->clock > max_dotclk)
853 		return MODE_CLOCK_HIGH;
854 
855 	/* Ensure TV refresh is close to desired refresh */
856 	if (tv_mode && abs(tv_mode->refresh - drm_mode_vrefresh(mode) * 1000)
857 				< 1000)
858 		return MODE_OK;
859 
860 	return MODE_CLOCK_RANGE;
861 }
862 
863 
864 static void
intel_tv_get_config(struct intel_encoder * encoder,struct intel_crtc_state * pipe_config)865 intel_tv_get_config(struct intel_encoder *encoder,
866 		    struct intel_crtc_state *pipe_config)
867 {
868 	pipe_config->output_types |= BIT(INTEL_OUTPUT_TVOUT);
869 
870 	pipe_config->base.adjusted_mode.crtc_clock = pipe_config->port_clock;
871 }
872 
873 static bool
intel_tv_compute_config(struct intel_encoder * encoder,struct intel_crtc_state * pipe_config,struct drm_connector_state * conn_state)874 intel_tv_compute_config(struct intel_encoder *encoder,
875 			struct intel_crtc_state *pipe_config,
876 			struct drm_connector_state *conn_state)
877 {
878 	const struct tv_mode *tv_mode = intel_tv_mode_find(conn_state);
879 	struct drm_display_mode *adjusted_mode =
880 		&pipe_config->base.adjusted_mode;
881 
882 	if (!tv_mode)
883 		return false;
884 
885 	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLSCAN)
886 		return false;
887 
888 	adjusted_mode->crtc_clock = tv_mode->clock;
889 	DRM_DEBUG_KMS("forcing bpc to 8 for TV\n");
890 	pipe_config->pipe_bpp = 8*3;
891 
892 	/* TV has it's own notion of sync and other mode flags, so clear them. */
893 	adjusted_mode->flags = 0;
894 
895 	/*
896 	 * FIXME: We don't check whether the input mode is actually what we want
897 	 * or whether userspace is doing something stupid.
898 	 */
899 
900 	return true;
901 }
902 
903 static void
set_tv_mode_timings(struct drm_i915_private * dev_priv,const struct tv_mode * tv_mode,bool burst_ena)904 set_tv_mode_timings(struct drm_i915_private *dev_priv,
905 		    const struct tv_mode *tv_mode,
906 		    bool burst_ena)
907 {
908 	u32 hctl1, hctl2, hctl3;
909 	u32 vctl1, vctl2, vctl3, vctl4, vctl5, vctl6, vctl7;
910 
911 	hctl1 = (tv_mode->hsync_end << TV_HSYNC_END_SHIFT) |
912 		(tv_mode->htotal << TV_HTOTAL_SHIFT);
913 
914 	hctl2 = (tv_mode->hburst_start << 16) |
915 		(tv_mode->hburst_len << TV_HBURST_LEN_SHIFT);
916 
917 	if (burst_ena)
918 		hctl2 |= TV_BURST_ENA;
919 
920 	hctl3 = (tv_mode->hblank_start << TV_HBLANK_START_SHIFT) |
921 		(tv_mode->hblank_end << TV_HBLANK_END_SHIFT);
922 
923 	vctl1 = (tv_mode->nbr_end << TV_NBR_END_SHIFT) |
924 		(tv_mode->vi_end_f1 << TV_VI_END_F1_SHIFT) |
925 		(tv_mode->vi_end_f2 << TV_VI_END_F2_SHIFT);
926 
927 	vctl2 = (tv_mode->vsync_len << TV_VSYNC_LEN_SHIFT) |
928 		(tv_mode->vsync_start_f1 << TV_VSYNC_START_F1_SHIFT) |
929 		(tv_mode->vsync_start_f2 << TV_VSYNC_START_F2_SHIFT);
930 
931 	vctl3 = (tv_mode->veq_len << TV_VEQ_LEN_SHIFT) |
932 		(tv_mode->veq_start_f1 << TV_VEQ_START_F1_SHIFT) |
933 		(tv_mode->veq_start_f2 << TV_VEQ_START_F2_SHIFT);
934 
935 	if (tv_mode->veq_ena)
936 		vctl3 |= TV_EQUAL_ENA;
937 
938 	vctl4 = (tv_mode->vburst_start_f1 << TV_VBURST_START_F1_SHIFT) |
939 		(tv_mode->vburst_end_f1 << TV_VBURST_END_F1_SHIFT);
940 
941 	vctl5 = (tv_mode->vburst_start_f2 << TV_VBURST_START_F2_SHIFT) |
942 		(tv_mode->vburst_end_f2 << TV_VBURST_END_F2_SHIFT);
943 
944 	vctl6 = (tv_mode->vburst_start_f3 << TV_VBURST_START_F3_SHIFT) |
945 		(tv_mode->vburst_end_f3 << TV_VBURST_END_F3_SHIFT);
946 
947 	vctl7 = (tv_mode->vburst_start_f4 << TV_VBURST_START_F4_SHIFT) |
948 		(tv_mode->vburst_end_f4 << TV_VBURST_END_F4_SHIFT);
949 
950 	I915_WRITE(TV_H_CTL_1, hctl1);
951 	I915_WRITE(TV_H_CTL_2, hctl2);
952 	I915_WRITE(TV_H_CTL_3, hctl3);
953 	I915_WRITE(TV_V_CTL_1, vctl1);
954 	I915_WRITE(TV_V_CTL_2, vctl2);
955 	I915_WRITE(TV_V_CTL_3, vctl3);
956 	I915_WRITE(TV_V_CTL_4, vctl4);
957 	I915_WRITE(TV_V_CTL_5, vctl5);
958 	I915_WRITE(TV_V_CTL_6, vctl6);
959 	I915_WRITE(TV_V_CTL_7, vctl7);
960 }
961 
set_color_conversion(struct drm_i915_private * dev_priv,const struct color_conversion * color_conversion)962 static void set_color_conversion(struct drm_i915_private *dev_priv,
963 				 const struct color_conversion *color_conversion)
964 {
965 	if (!color_conversion)
966 		return;
967 
968 	I915_WRITE(TV_CSC_Y, (color_conversion->ry << 16) |
969 		   color_conversion->gy);
970 	I915_WRITE(TV_CSC_Y2, (color_conversion->by << 16) |
971 		   color_conversion->ay);
972 	I915_WRITE(TV_CSC_U, (color_conversion->ru << 16) |
973 		   color_conversion->gu);
974 	I915_WRITE(TV_CSC_U2, (color_conversion->bu << 16) |
975 		   color_conversion->au);
976 	I915_WRITE(TV_CSC_V, (color_conversion->rv << 16) |
977 		   color_conversion->gv);
978 	I915_WRITE(TV_CSC_V2, (color_conversion->bv << 16) |
979 		   color_conversion->av);
980 }
981 
intel_tv_pre_enable(struct intel_encoder * encoder,const struct intel_crtc_state * pipe_config,const struct drm_connector_state * conn_state)982 static void intel_tv_pre_enable(struct intel_encoder *encoder,
983 				const struct intel_crtc_state *pipe_config,
984 				const struct drm_connector_state *conn_state)
985 {
986 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
987 	struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->base.crtc);
988 	struct intel_tv *intel_tv = enc_to_tv(encoder);
989 	const struct tv_mode *tv_mode = intel_tv_mode_find(conn_state);
990 	u32 tv_ctl;
991 	u32 scctl1, scctl2, scctl3;
992 	int i, j;
993 	const struct video_levels *video_levels;
994 	const struct color_conversion *color_conversion;
995 	bool burst_ena;
996 	int xpos = 0x0, ypos = 0x0;
997 	unsigned int xsize, ysize;
998 
999 	if (!tv_mode)
1000 		return;	/* can't happen (mode_prepare prevents this) */
1001 
1002 	tv_ctl = I915_READ(TV_CTL);
1003 	tv_ctl &= TV_CTL_SAVE;
1004 
1005 	switch (intel_tv->type) {
1006 	default:
1007 	case DRM_MODE_CONNECTOR_Unknown:
1008 	case DRM_MODE_CONNECTOR_Composite:
1009 		tv_ctl |= TV_ENC_OUTPUT_COMPOSITE;
1010 		video_levels = tv_mode->composite_levels;
1011 		color_conversion = tv_mode->composite_color;
1012 		burst_ena = tv_mode->burst_ena;
1013 		break;
1014 	case DRM_MODE_CONNECTOR_Component:
1015 		tv_ctl |= TV_ENC_OUTPUT_COMPONENT;
1016 		video_levels = &component_levels;
1017 		if (tv_mode->burst_ena)
1018 			color_conversion = &sdtv_csc_yprpb;
1019 		else
1020 			color_conversion = &hdtv_csc_yprpb;
1021 		burst_ena = false;
1022 		break;
1023 	case DRM_MODE_CONNECTOR_SVIDEO:
1024 		tv_ctl |= TV_ENC_OUTPUT_SVIDEO;
1025 		video_levels = tv_mode->svideo_levels;
1026 		color_conversion = tv_mode->svideo_color;
1027 		burst_ena = tv_mode->burst_ena;
1028 		break;
1029 	}
1030 
1031 	tv_ctl |= TV_ENC_PIPE_SEL(intel_crtc->pipe);
1032 	tv_ctl |= tv_mode->oversample;
1033 
1034 	if (tv_mode->progressive)
1035 		tv_ctl |= TV_PROGRESSIVE;
1036 	if (tv_mode->trilevel_sync)
1037 		tv_ctl |= TV_TRILEVEL_SYNC;
1038 	if (tv_mode->pal_burst)
1039 		tv_ctl |= TV_PAL_BURST;
1040 
1041 	scctl1 = 0;
1042 	if (tv_mode->dda1_inc)
1043 		scctl1 |= TV_SC_DDA1_EN;
1044 	if (tv_mode->dda2_inc)
1045 		scctl1 |= TV_SC_DDA2_EN;
1046 	if (tv_mode->dda3_inc)
1047 		scctl1 |= TV_SC_DDA3_EN;
1048 	scctl1 |= tv_mode->sc_reset;
1049 	if (video_levels)
1050 		scctl1 |= video_levels->burst << TV_BURST_LEVEL_SHIFT;
1051 	scctl1 |= tv_mode->dda1_inc << TV_SCDDA1_INC_SHIFT;
1052 
1053 	scctl2 = tv_mode->dda2_size << TV_SCDDA2_SIZE_SHIFT |
1054 		tv_mode->dda2_inc << TV_SCDDA2_INC_SHIFT;
1055 
1056 	scctl3 = tv_mode->dda3_size << TV_SCDDA3_SIZE_SHIFT |
1057 		tv_mode->dda3_inc << TV_SCDDA3_INC_SHIFT;
1058 
1059 	/* Enable two fixes for the chips that need them. */
1060 	if (IS_I915GM(dev_priv))
1061 		tv_ctl |= TV_ENC_C0_FIX | TV_ENC_SDP_FIX;
1062 
1063 	set_tv_mode_timings(dev_priv, tv_mode, burst_ena);
1064 
1065 	I915_WRITE(TV_SC_CTL_1, scctl1);
1066 	I915_WRITE(TV_SC_CTL_2, scctl2);
1067 	I915_WRITE(TV_SC_CTL_3, scctl3);
1068 
1069 	set_color_conversion(dev_priv, color_conversion);
1070 
1071 	if (INTEL_GEN(dev_priv) >= 4)
1072 		I915_WRITE(TV_CLR_KNOBS, 0x00404000);
1073 	else
1074 		I915_WRITE(TV_CLR_KNOBS, 0x00606000);
1075 
1076 	if (video_levels)
1077 		I915_WRITE(TV_CLR_LEVEL,
1078 			   ((video_levels->black << TV_BLACK_LEVEL_SHIFT) |
1079 			    (video_levels->blank << TV_BLANK_LEVEL_SHIFT)));
1080 
1081 	assert_pipe_disabled(dev_priv, intel_crtc->pipe);
1082 
1083 	/* Filter ctl must be set before TV_WIN_SIZE */
1084 	I915_WRITE(TV_FILTER_CTL_1, TV_AUTO_SCALE);
1085 	xsize = tv_mode->hblank_start - tv_mode->hblank_end;
1086 	if (tv_mode->progressive)
1087 		ysize = tv_mode->nbr_end + 1;
1088 	else
1089 		ysize = 2*tv_mode->nbr_end + 1;
1090 
1091 	xpos += conn_state->tv.margins.left;
1092 	ypos += conn_state->tv.margins.top;
1093 	xsize -= (conn_state->tv.margins.left +
1094 		  conn_state->tv.margins.right);
1095 	ysize -= (conn_state->tv.margins.top +
1096 		  conn_state->tv.margins.bottom);
1097 	I915_WRITE(TV_WIN_POS, (xpos<<16)|ypos);
1098 	I915_WRITE(TV_WIN_SIZE, (xsize<<16)|ysize);
1099 
1100 	j = 0;
1101 	for (i = 0; i < 60; i++)
1102 		I915_WRITE(TV_H_LUMA(i), tv_mode->filter_table[j++]);
1103 	for (i = 0; i < 60; i++)
1104 		I915_WRITE(TV_H_CHROMA(i), tv_mode->filter_table[j++]);
1105 	for (i = 0; i < 43; i++)
1106 		I915_WRITE(TV_V_LUMA(i), tv_mode->filter_table[j++]);
1107 	for (i = 0; i < 43; i++)
1108 		I915_WRITE(TV_V_CHROMA(i), tv_mode->filter_table[j++]);
1109 	I915_WRITE(TV_DAC, I915_READ(TV_DAC) & TV_DAC_SAVE);
1110 	I915_WRITE(TV_CTL, tv_ctl);
1111 }
1112 
1113 static const struct drm_display_mode reported_modes[] = {
1114 	{
1115 		.name = "NTSC 480i",
1116 		.clock = 107520,
1117 		.hdisplay = 1280,
1118 		.hsync_start = 1368,
1119 		.hsync_end = 1496,
1120 		.htotal = 1712,
1121 
1122 		.vdisplay = 1024,
1123 		.vsync_start = 1027,
1124 		.vsync_end = 1034,
1125 		.vtotal = 1104,
1126 		.type = DRM_MODE_TYPE_DRIVER,
1127 	},
1128 };
1129 
1130 static int
intel_tv_detect_type(struct intel_tv * intel_tv,struct drm_connector * connector)1131 intel_tv_detect_type(struct intel_tv *intel_tv,
1132 		      struct drm_connector *connector)
1133 {
1134 	struct drm_crtc *crtc = connector->state->crtc;
1135 	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1136 	struct drm_device *dev = connector->dev;
1137 	struct drm_i915_private *dev_priv = to_i915(dev);
1138 	u32 tv_ctl, save_tv_ctl;
1139 	u32 tv_dac, save_tv_dac;
1140 	int type;
1141 
1142 	/* Disable TV interrupts around load detect or we'll recurse */
1143 	if (connector->polled & DRM_CONNECTOR_POLL_HPD) {
1144 		spin_lock_irq(&dev_priv->irq_lock);
1145 		i915_disable_pipestat(dev_priv, 0,
1146 				      PIPE_HOTPLUG_INTERRUPT_STATUS |
1147 				      PIPE_HOTPLUG_TV_INTERRUPT_STATUS);
1148 		spin_unlock_irq(&dev_priv->irq_lock);
1149 	}
1150 
1151 	save_tv_dac = tv_dac = I915_READ(TV_DAC);
1152 	save_tv_ctl = tv_ctl = I915_READ(TV_CTL);
1153 
1154 	/* Poll for TV detection */
1155 	tv_ctl &= ~(TV_ENC_ENABLE | TV_ENC_PIPE_SEL_MASK | TV_TEST_MODE_MASK);
1156 	tv_ctl |= TV_TEST_MODE_MONITOR_DETECT;
1157 	tv_ctl |= TV_ENC_PIPE_SEL(intel_crtc->pipe);
1158 
1159 	tv_dac &= ~(TVDAC_SENSE_MASK | DAC_A_MASK | DAC_B_MASK | DAC_C_MASK);
1160 	tv_dac |= (TVDAC_STATE_CHG_EN |
1161 		   TVDAC_A_SENSE_CTL |
1162 		   TVDAC_B_SENSE_CTL |
1163 		   TVDAC_C_SENSE_CTL |
1164 		   DAC_CTL_OVERRIDE |
1165 		   DAC_A_0_7_V |
1166 		   DAC_B_0_7_V |
1167 		   DAC_C_0_7_V);
1168 
1169 
1170 	/*
1171 	 * The TV sense state should be cleared to zero on cantiga platform. Otherwise
1172 	 * the TV is misdetected. This is hardware requirement.
1173 	 */
1174 	if (IS_GM45(dev_priv))
1175 		tv_dac &= ~(TVDAC_STATE_CHG_EN | TVDAC_A_SENSE_CTL |
1176 			    TVDAC_B_SENSE_CTL | TVDAC_C_SENSE_CTL);
1177 
1178 	I915_WRITE(TV_CTL, tv_ctl);
1179 	I915_WRITE(TV_DAC, tv_dac);
1180 	POSTING_READ(TV_DAC);
1181 
1182 	intel_wait_for_vblank(dev_priv, intel_crtc->pipe);
1183 
1184 	type = -1;
1185 	tv_dac = I915_READ(TV_DAC);
1186 	DRM_DEBUG_KMS("TV detected: %x, %x\n", tv_ctl, tv_dac);
1187 	/*
1188 	 *  A B C
1189 	 *  0 1 1 Composite
1190 	 *  1 0 X svideo
1191 	 *  0 0 0 Component
1192 	 */
1193 	if ((tv_dac & TVDAC_SENSE_MASK) == (TVDAC_B_SENSE | TVDAC_C_SENSE)) {
1194 		DRM_DEBUG_KMS("Detected Composite TV connection\n");
1195 		type = DRM_MODE_CONNECTOR_Composite;
1196 	} else if ((tv_dac & (TVDAC_A_SENSE|TVDAC_B_SENSE)) == TVDAC_A_SENSE) {
1197 		DRM_DEBUG_KMS("Detected S-Video TV connection\n");
1198 		type = DRM_MODE_CONNECTOR_SVIDEO;
1199 	} else if ((tv_dac & TVDAC_SENSE_MASK) == 0) {
1200 		DRM_DEBUG_KMS("Detected Component TV connection\n");
1201 		type = DRM_MODE_CONNECTOR_Component;
1202 	} else {
1203 		DRM_DEBUG_KMS("Unrecognised TV connection\n");
1204 		type = -1;
1205 	}
1206 
1207 	I915_WRITE(TV_DAC, save_tv_dac & ~TVDAC_STATE_CHG_EN);
1208 	I915_WRITE(TV_CTL, save_tv_ctl);
1209 	POSTING_READ(TV_CTL);
1210 
1211 	/* For unknown reasons the hw barfs if we don't do this vblank wait. */
1212 	intel_wait_for_vblank(dev_priv, intel_crtc->pipe);
1213 
1214 	/* Restore interrupt config */
1215 	if (connector->polled & DRM_CONNECTOR_POLL_HPD) {
1216 		spin_lock_irq(&dev_priv->irq_lock);
1217 		i915_enable_pipestat(dev_priv, 0,
1218 				     PIPE_HOTPLUG_INTERRUPT_STATUS |
1219 				     PIPE_HOTPLUG_TV_INTERRUPT_STATUS);
1220 		spin_unlock_irq(&dev_priv->irq_lock);
1221 	}
1222 
1223 	return type;
1224 }
1225 
1226 /*
1227  * Here we set accurate tv format according to connector type
1228  * i.e Component TV should not be assigned by NTSC or PAL
1229  */
intel_tv_find_better_format(struct drm_connector * connector)1230 static void intel_tv_find_better_format(struct drm_connector *connector)
1231 {
1232 	struct intel_tv *intel_tv = intel_attached_tv(connector);
1233 	const struct tv_mode *tv_mode = intel_tv_mode_find(connector->state);
1234 	int i;
1235 
1236 	if ((intel_tv->type == DRM_MODE_CONNECTOR_Component) ==
1237 		tv_mode->component_only)
1238 		return;
1239 
1240 
1241 	for (i = 0; i < ARRAY_SIZE(tv_modes); i++) {
1242 		tv_mode = tv_modes + i;
1243 
1244 		if ((intel_tv->type == DRM_MODE_CONNECTOR_Component) ==
1245 			tv_mode->component_only)
1246 			break;
1247 	}
1248 
1249 	connector->state->tv.mode = i;
1250 }
1251 
1252 static int
intel_tv_detect(struct drm_connector * connector,struct drm_modeset_acquire_ctx * ctx,bool force)1253 intel_tv_detect(struct drm_connector *connector,
1254 		struct drm_modeset_acquire_ctx *ctx,
1255 		bool force)
1256 {
1257 	struct drm_display_mode mode;
1258 	struct intel_tv *intel_tv = intel_attached_tv(connector);
1259 	enum drm_connector_status status;
1260 	int type;
1261 
1262 	DRM_DEBUG_KMS("[CONNECTOR:%d:%s] force=%d\n",
1263 		      connector->base.id, connector->name,
1264 		      force);
1265 
1266 	mode = reported_modes[0];
1267 
1268 	if (force) {
1269 		struct intel_load_detect_pipe tmp;
1270 		int ret;
1271 
1272 		ret = intel_get_load_detect_pipe(connector, &mode, &tmp, ctx);
1273 		if (ret < 0)
1274 			return ret;
1275 
1276 		if (ret > 0) {
1277 			type = intel_tv_detect_type(intel_tv, connector);
1278 			intel_release_load_detect_pipe(connector, &tmp, ctx);
1279 			status = type < 0 ?
1280 				connector_status_disconnected :
1281 				connector_status_connected;
1282 		} else
1283 			status = connector_status_unknown;
1284 
1285 		if (status == connector_status_connected) {
1286 			intel_tv->type = type;
1287 			intel_tv_find_better_format(connector);
1288 		}
1289 
1290 		return status;
1291 	} else
1292 		return connector->status;
1293 }
1294 
1295 static const struct input_res {
1296 	const char *name;
1297 	int w, h;
1298 } input_res_table[] = {
1299 	{"640x480", 640, 480},
1300 	{"800x600", 800, 600},
1301 	{"1024x768", 1024, 768},
1302 	{"1280x1024", 1280, 1024},
1303 	{"848x480", 848, 480},
1304 	{"1280x720", 1280, 720},
1305 	{"1920x1080", 1920, 1080},
1306 };
1307 
1308 /*
1309  * Chose preferred mode  according to line number of TV format
1310  */
1311 static void
intel_tv_choose_preferred_modes(const struct tv_mode * tv_mode,struct drm_display_mode * mode_ptr)1312 intel_tv_choose_preferred_modes(const struct tv_mode *tv_mode,
1313 			       struct drm_display_mode *mode_ptr)
1314 {
1315 	if (tv_mode->nbr_end < 480 && mode_ptr->vdisplay == 480)
1316 		mode_ptr->type |= DRM_MODE_TYPE_PREFERRED;
1317 	else if (tv_mode->nbr_end > 480) {
1318 		if (tv_mode->progressive == true && tv_mode->nbr_end < 720) {
1319 			if (mode_ptr->vdisplay == 720)
1320 				mode_ptr->type |= DRM_MODE_TYPE_PREFERRED;
1321 		} else if (mode_ptr->vdisplay == 1080)
1322 				mode_ptr->type |= DRM_MODE_TYPE_PREFERRED;
1323 	}
1324 }
1325 
1326 static int
intel_tv_get_modes(struct drm_connector * connector)1327 intel_tv_get_modes(struct drm_connector *connector)
1328 {
1329 	struct drm_display_mode *mode_ptr;
1330 	const struct tv_mode *tv_mode = intel_tv_mode_find(connector->state);
1331 	int j, count = 0;
1332 	u64 tmp;
1333 
1334 	for (j = 0; j < ARRAY_SIZE(input_res_table);
1335 	     j++) {
1336 		const struct input_res *input = &input_res_table[j];
1337 		unsigned int hactive_s = input->w;
1338 		unsigned int vactive_s = input->h;
1339 
1340 		if (tv_mode->max_srcw && input->w > tv_mode->max_srcw)
1341 			continue;
1342 
1343 		if (input->w > 1024 && (!tv_mode->progressive
1344 					&& !tv_mode->component_only))
1345 			continue;
1346 
1347 		mode_ptr = drm_mode_create(connector->dev);
1348 		if (!mode_ptr)
1349 			continue;
1350 		strlcpy(mode_ptr->name, input->name, DRM_DISPLAY_MODE_LEN);
1351 
1352 		mode_ptr->hdisplay = hactive_s;
1353 		mode_ptr->hsync_start = hactive_s + 1;
1354 		mode_ptr->hsync_end = hactive_s + 64;
1355 		if (mode_ptr->hsync_end <= mode_ptr->hsync_start)
1356 			mode_ptr->hsync_end = mode_ptr->hsync_start + 1;
1357 		mode_ptr->htotal = hactive_s + 96;
1358 
1359 		mode_ptr->vdisplay = vactive_s;
1360 		mode_ptr->vsync_start = vactive_s + 1;
1361 		mode_ptr->vsync_end = vactive_s + 32;
1362 		if (mode_ptr->vsync_end <= mode_ptr->vsync_start)
1363 			mode_ptr->vsync_end = mode_ptr->vsync_start  + 1;
1364 		mode_ptr->vtotal = vactive_s + 33;
1365 
1366 		tmp = mul_u32_u32(tv_mode->refresh, mode_ptr->vtotal);
1367 		tmp *= mode_ptr->htotal;
1368 		tmp = div_u64(tmp, 1000000);
1369 		mode_ptr->clock = (int) tmp;
1370 
1371 		mode_ptr->type = DRM_MODE_TYPE_DRIVER;
1372 		intel_tv_choose_preferred_modes(tv_mode, mode_ptr);
1373 		drm_mode_probed_add(connector, mode_ptr);
1374 		count++;
1375 	}
1376 
1377 	return count;
1378 }
1379 
1380 static void
intel_tv_destroy(struct drm_connector * connector)1381 intel_tv_destroy(struct drm_connector *connector)
1382 {
1383 	drm_connector_cleanup(connector);
1384 	kfree(connector);
1385 }
1386 
1387 static const struct drm_connector_funcs intel_tv_connector_funcs = {
1388 	.late_register = intel_connector_register,
1389 	.early_unregister = intel_connector_unregister,
1390 	.destroy = intel_tv_destroy,
1391 	.fill_modes = drm_helper_probe_single_connector_modes,
1392 	.atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
1393 	.atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
1394 };
1395 
intel_tv_atomic_check(struct drm_connector * connector,struct drm_connector_state * new_state)1396 static int intel_tv_atomic_check(struct drm_connector *connector,
1397 				 struct drm_connector_state *new_state)
1398 {
1399 	struct drm_crtc_state *new_crtc_state;
1400 	struct drm_connector_state *old_state;
1401 
1402 	if (!new_state->crtc)
1403 		return 0;
1404 
1405 	old_state = drm_atomic_get_old_connector_state(new_state->state, connector);
1406 	new_crtc_state = drm_atomic_get_new_crtc_state(new_state->state, new_state->crtc);
1407 
1408 	if (old_state->tv.mode != new_state->tv.mode ||
1409 	    old_state->tv.margins.left != new_state->tv.margins.left ||
1410 	    old_state->tv.margins.right != new_state->tv.margins.right ||
1411 	    old_state->tv.margins.top != new_state->tv.margins.top ||
1412 	    old_state->tv.margins.bottom != new_state->tv.margins.bottom) {
1413 		/* Force a modeset. */
1414 
1415 		new_crtc_state->connectors_changed = true;
1416 	}
1417 
1418 	return 0;
1419 }
1420 
1421 static const struct drm_connector_helper_funcs intel_tv_connector_helper_funcs = {
1422 	.detect_ctx = intel_tv_detect,
1423 	.mode_valid = intel_tv_mode_valid,
1424 	.get_modes = intel_tv_get_modes,
1425 	.atomic_check = intel_tv_atomic_check,
1426 };
1427 
1428 static const struct drm_encoder_funcs intel_tv_enc_funcs = {
1429 	.destroy = intel_encoder_destroy,
1430 };
1431 
1432 void
intel_tv_init(struct drm_i915_private * dev_priv)1433 intel_tv_init(struct drm_i915_private *dev_priv)
1434 {
1435 	struct drm_device *dev = &dev_priv->drm;
1436 	struct drm_connector *connector;
1437 	struct intel_tv *intel_tv;
1438 	struct intel_encoder *intel_encoder;
1439 	struct intel_connector *intel_connector;
1440 	u32 tv_dac_on, tv_dac_off, save_tv_dac;
1441 	const char *tv_format_names[ARRAY_SIZE(tv_modes)];
1442 	int i, initial_mode = 0;
1443 	struct drm_connector_state *state;
1444 
1445 	if ((I915_READ(TV_CTL) & TV_FUSE_STATE_MASK) == TV_FUSE_STATE_DISABLED)
1446 		return;
1447 
1448 	if (!intel_bios_is_tv_present(dev_priv)) {
1449 		DRM_DEBUG_KMS("Integrated TV is not present.\n");
1450 		return;
1451 	}
1452 
1453 	/*
1454 	 * Sanity check the TV output by checking to see if the
1455 	 * DAC register holds a value
1456 	 */
1457 	save_tv_dac = I915_READ(TV_DAC);
1458 
1459 	I915_WRITE(TV_DAC, save_tv_dac | TVDAC_STATE_CHG_EN);
1460 	tv_dac_on = I915_READ(TV_DAC);
1461 
1462 	I915_WRITE(TV_DAC, save_tv_dac & ~TVDAC_STATE_CHG_EN);
1463 	tv_dac_off = I915_READ(TV_DAC);
1464 
1465 	I915_WRITE(TV_DAC, save_tv_dac);
1466 
1467 	/*
1468 	 * If the register does not hold the state change enable
1469 	 * bit, (either as a 0 or a 1), assume it doesn't really
1470 	 * exist
1471 	 */
1472 	if ((tv_dac_on & TVDAC_STATE_CHG_EN) == 0 ||
1473 	    (tv_dac_off & TVDAC_STATE_CHG_EN) != 0)
1474 		return;
1475 
1476 	intel_tv = kzalloc(sizeof(*intel_tv), GFP_KERNEL);
1477 	if (!intel_tv) {
1478 		return;
1479 	}
1480 
1481 	intel_connector = intel_connector_alloc();
1482 	if (!intel_connector) {
1483 		kfree(intel_tv);
1484 		return;
1485 	}
1486 
1487 	intel_encoder = &intel_tv->base;
1488 	connector = &intel_connector->base;
1489 	state = connector->state;
1490 
1491 	/*
1492 	 * The documentation, for the older chipsets at least, recommend
1493 	 * using a polling method rather than hotplug detection for TVs.
1494 	 * This is because in order to perform the hotplug detection, the PLLs
1495 	 * for the TV must be kept alive increasing power drain and starving
1496 	 * bandwidth from other encoders. Notably for instance, it causes
1497 	 * pipe underruns on Crestline when this encoder is supposedly idle.
1498 	 *
1499 	 * More recent chipsets favour HDMI rather than integrated S-Video.
1500 	 */
1501 	intel_connector->polled = DRM_CONNECTOR_POLL_CONNECT;
1502 
1503 	drm_connector_init(dev, connector, &intel_tv_connector_funcs,
1504 			   DRM_MODE_CONNECTOR_SVIDEO);
1505 
1506 	drm_encoder_init(dev, &intel_encoder->base, &intel_tv_enc_funcs,
1507 			 DRM_MODE_ENCODER_TVDAC, "TV");
1508 
1509 	intel_encoder->compute_config = intel_tv_compute_config;
1510 	intel_encoder->get_config = intel_tv_get_config;
1511 	intel_encoder->pre_enable = intel_tv_pre_enable;
1512 	intel_encoder->enable = intel_enable_tv;
1513 	intel_encoder->disable = intel_disable_tv;
1514 	intel_encoder->get_hw_state = intel_tv_get_hw_state;
1515 	intel_connector->get_hw_state = intel_connector_get_hw_state;
1516 
1517 	intel_connector_attach_encoder(intel_connector, intel_encoder);
1518 
1519 	intel_encoder->type = INTEL_OUTPUT_TVOUT;
1520 	intel_encoder->power_domain = POWER_DOMAIN_PORT_OTHER;
1521 	intel_encoder->port = PORT_NONE;
1522 	intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
1523 	intel_encoder->cloneable = 0;
1524 	intel_encoder->base.possible_crtcs = ((1 << 0) | (1 << 1));
1525 	intel_tv->type = DRM_MODE_CONNECTOR_Unknown;
1526 
1527 	/* BIOS margin values */
1528 	state->tv.margins.left = 54;
1529 	state->tv.margins.top = 36;
1530 	state->tv.margins.right = 46;
1531 	state->tv.margins.bottom = 37;
1532 
1533 	state->tv.mode = initial_mode;
1534 
1535 	drm_connector_helper_add(connector, &intel_tv_connector_helper_funcs);
1536 	connector->interlace_allowed = false;
1537 	connector->doublescan_allowed = false;
1538 
1539 	/* Create TV properties then attach current values */
1540 	for (i = 0; i < ARRAY_SIZE(tv_modes); i++)
1541 		tv_format_names[i] = tv_modes[i].name;
1542 	drm_mode_create_tv_properties(dev,
1543 				      ARRAY_SIZE(tv_modes),
1544 				      tv_format_names);
1545 
1546 	drm_object_attach_property(&connector->base, dev->mode_config.tv_mode_property,
1547 				   state->tv.mode);
1548 	drm_object_attach_property(&connector->base,
1549 				   dev->mode_config.tv_left_margin_property,
1550 				   state->tv.margins.left);
1551 	drm_object_attach_property(&connector->base,
1552 				   dev->mode_config.tv_top_margin_property,
1553 				   state->tv.margins.top);
1554 	drm_object_attach_property(&connector->base,
1555 				   dev->mode_config.tv_right_margin_property,
1556 				   state->tv.margins.right);
1557 	drm_object_attach_property(&connector->base,
1558 				   dev->mode_config.tv_bottom_margin_property,
1559 				   state->tv.margins.bottom);
1560 }
1561