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