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