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