cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

intel_tv.c (59496B)


      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_crtc.h"
     40#include "intel_de.h"
     41#include "intel_display_types.h"
     42#include "intel_hotplug.h"
     43#include "intel_tv.h"
     44
     45enum tv_margin {
     46	TV_MARGIN_LEFT, TV_MARGIN_TOP,
     47	TV_MARGIN_RIGHT, TV_MARGIN_BOTTOM
     48};
     49
     50struct intel_tv {
     51	struct intel_encoder base;
     52
     53	int type;
     54};
     55
     56struct video_levels {
     57	u16 blank, black;
     58	u8 burst;
     59};
     60
     61struct color_conversion {
     62	u16 ry, gy, by, ay;
     63	u16 ru, gu, bu, au;
     64	u16 rv, gv, bv, av;
     65};
     66
     67static const u32 filter_table[] = {
     68	0xB1403000, 0x2E203500, 0x35002E20, 0x3000B140,
     69	0x35A0B160, 0x2DC02E80, 0xB1403480, 0xB1603000,
     70	0x2EA03640, 0x34002D80, 0x3000B120, 0x36E0B160,
     71	0x2D202EF0, 0xB1203380, 0xB1603000, 0x2F303780,
     72	0x33002CC0, 0x3000B100, 0x3820B160, 0x2C802F50,
     73	0xB10032A0, 0xB1603000, 0x2F9038C0, 0x32202C20,
     74	0x3000B0E0, 0x3980B160, 0x2BC02FC0, 0xB0E031C0,
     75	0xB1603000, 0x2FF03A20, 0x31602B60, 0xB020B0C0,
     76	0x3AE0B160, 0x2B001810, 0xB0C03120, 0xB140B020,
     77	0x18283BA0, 0x30C02A80, 0xB020B0A0, 0x3C60B140,
     78	0x2A201838, 0xB0A03080, 0xB120B020, 0x18383D20,
     79	0x304029C0, 0xB040B080, 0x3DE0B100, 0x29601848,
     80	0xB0803000, 0xB100B040, 0x18483EC0, 0xB0402900,
     81	0xB040B060, 0x3F80B0C0, 0x28801858, 0xB060B080,
     82	0xB0A0B060, 0x18602820, 0xB0A02820, 0x0000B060,
     83	0xB1403000, 0x2E203500, 0x35002E20, 0x3000B140,
     84	0x35A0B160, 0x2DC02E80, 0xB1403480, 0xB1603000,
     85	0x2EA03640, 0x34002D80, 0x3000B120, 0x36E0B160,
     86	0x2D202EF0, 0xB1203380, 0xB1603000, 0x2F303780,
     87	0x33002CC0, 0x3000B100, 0x3820B160, 0x2C802F50,
     88	0xB10032A0, 0xB1603000, 0x2F9038C0, 0x32202C20,
     89	0x3000B0E0, 0x3980B160, 0x2BC02FC0, 0xB0E031C0,
     90	0xB1603000, 0x2FF03A20, 0x31602B60, 0xB020B0C0,
     91	0x3AE0B160, 0x2B001810, 0xB0C03120, 0xB140B020,
     92	0x18283BA0, 0x30C02A80, 0xB020B0A0, 0x3C60B140,
     93	0x2A201838, 0xB0A03080, 0xB120B020, 0x18383D20,
     94	0x304029C0, 0xB040B080, 0x3DE0B100, 0x29601848,
     95	0xB0803000, 0xB100B040, 0x18483EC0, 0xB0402900,
     96	0xB040B060, 0x3F80B0C0, 0x28801858, 0xB060B080,
     97	0xB0A0B060, 0x18602820, 0xB0A02820, 0x0000B060,
     98	0x36403000, 0x2D002CC0, 0x30003640, 0x2D0036C0,
     99	0x35C02CC0, 0x37403000, 0x2C802D40, 0x30003540,
    100	0x2D8037C0, 0x34C02C40, 0x38403000, 0x2BC02E00,
    101	0x30003440, 0x2E2038C0, 0x34002B80, 0x39803000,
    102	0x2B402E40, 0x30003380, 0x2E603A00, 0x33402B00,
    103	0x3A803040, 0x2A802EA0, 0x30403300, 0x2EC03B40,
    104	0x32802A40, 0x3C003040, 0x2A002EC0, 0x30803240,
    105	0x2EC03C80, 0x320029C0, 0x3D403080, 0x29402F00,
    106	0x308031C0, 0x2F203DC0, 0x31802900, 0x3E8030C0,
    107	0x28802F40, 0x30C03140, 0x2F203F40, 0x31402840,
    108	0x28003100, 0x28002F00, 0x00003100, 0x36403000,
    109	0x2D002CC0, 0x30003640, 0x2D0036C0,
    110	0x35C02CC0, 0x37403000, 0x2C802D40, 0x30003540,
    111	0x2D8037C0, 0x34C02C40, 0x38403000, 0x2BC02E00,
    112	0x30003440, 0x2E2038C0, 0x34002B80, 0x39803000,
    113	0x2B402E40, 0x30003380, 0x2E603A00, 0x33402B00,
    114	0x3A803040, 0x2A802EA0, 0x30403300, 0x2EC03B40,
    115	0x32802A40, 0x3C003040, 0x2A002EC0, 0x30803240,
    116	0x2EC03C80, 0x320029C0, 0x3D403080, 0x29402F00,
    117	0x308031C0, 0x2F203DC0, 0x31802900, 0x3E8030C0,
    118	0x28802F40, 0x30C03140, 0x2F203F40, 0x31402840,
    119	0x28003100, 0x28002F00, 0x00003100,
    120};
    121
    122/*
    123 * Color conversion values have 3 separate fixed point formats:
    124 *
    125 * 10 bit fields (ay, au)
    126 *   1.9 fixed point (b.bbbbbbbbb)
    127 * 11 bit fields (ry, by, ru, gu, gv)
    128 *   exp.mantissa (ee.mmmmmmmmm)
    129 *   ee = 00 = 10^-1 (0.mmmmmmmmm)
    130 *   ee = 01 = 10^-2 (0.0mmmmmmmmm)
    131 *   ee = 10 = 10^-3 (0.00mmmmmmmmm)
    132 *   ee = 11 = 10^-4 (0.000mmmmmmmmm)
    133 * 12 bit fields (gy, rv, bu)
    134 *   exp.mantissa (eee.mmmmmmmmm)
    135 *   eee = 000 = 10^-1 (0.mmmmmmmmm)
    136 *   eee = 001 = 10^-2 (0.0mmmmmmmmm)
    137 *   eee = 010 = 10^-3 (0.00mmmmmmmmm)
    138 *   eee = 011 = 10^-4 (0.000mmmmmmmmm)
    139 *   eee = 100 = reserved
    140 *   eee = 101 = reserved
    141 *   eee = 110 = reserved
    142 *   eee = 111 = 10^0 (m.mmmmmmmm) (only usable for 1.0 representation)
    143 *
    144 * Saturation and contrast are 8 bits, with their own representation:
    145 * 8 bit field (saturation, contrast)
    146 *   exp.mantissa (ee.mmmmmm)
    147 *   ee = 00 = 10^-1 (0.mmmmmm)
    148 *   ee = 01 = 10^0 (m.mmmmm)
    149 *   ee = 10 = 10^1 (mm.mmmm)
    150 *   ee = 11 = 10^2 (mmm.mmm)
    151 *
    152 * Simple conversion function:
    153 *
    154 * static u32
    155 * float_to_csc_11(float f)
    156 * {
    157 *     u32 exp;
    158 *     u32 mant;
    159 *     u32 ret;
    160 *
    161 *     if (f < 0)
    162 *         f = -f;
    163 *
    164 *     if (f >= 1) {
    165 *         exp = 0x7;
    166 *	   mant = 1 << 8;
    167 *     } else {
    168 *         for (exp = 0; exp < 3 && f < 0.5; exp++)
    169 *	   f *= 2.0;
    170 *         mant = (f * (1 << 9) + 0.5);
    171 *         if (mant >= (1 << 9))
    172 *             mant = (1 << 9) - 1;
    173 *     }
    174 *     ret = (exp << 9) | mant;
    175 *     return ret;
    176 * }
    177 */
    178
    179/*
    180 * Behold, magic numbers!  If we plant them they might grow a big
    181 * s-video cable to the sky... or something.
    182 *
    183 * Pre-converted to appropriate hex value.
    184 */
    185
    186/*
    187 * PAL & NTSC values for composite & s-video connections
    188 */
    189static const struct color_conversion ntsc_m_csc_composite = {
    190	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0104,
    191	.ru = 0x0733, .gu = 0x052d, .bu = 0x05c7, .au = 0x0200,
    192	.rv = 0x0340, .gv = 0x030c, .bv = 0x06d0, .av = 0x0200,
    193};
    194
    195static const struct video_levels ntsc_m_levels_composite = {
    196	.blank = 225, .black = 267, .burst = 113,
    197};
    198
    199static const struct color_conversion ntsc_m_csc_svideo = {
    200	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0133,
    201	.ru = 0x076a, .gu = 0x0564, .bu = 0x030d, .au = 0x0200,
    202	.rv = 0x037a, .gv = 0x033d, .bv = 0x06f6, .av = 0x0200,
    203};
    204
    205static const struct video_levels ntsc_m_levels_svideo = {
    206	.blank = 266, .black = 316, .burst = 133,
    207};
    208
    209static const struct color_conversion ntsc_j_csc_composite = {
    210	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0119,
    211	.ru = 0x074c, .gu = 0x0546, .bu = 0x05ec, .au = 0x0200,
    212	.rv = 0x035a, .gv = 0x0322, .bv = 0x06e1, .av = 0x0200,
    213};
    214
    215static const struct video_levels ntsc_j_levels_composite = {
    216	.blank = 225, .black = 225, .burst = 113,
    217};
    218
    219static const struct color_conversion ntsc_j_csc_svideo = {
    220	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x014c,
    221	.ru = 0x0788, .gu = 0x0581, .bu = 0x0322, .au = 0x0200,
    222	.rv = 0x0399, .gv = 0x0356, .bv = 0x070a, .av = 0x0200,
    223};
    224
    225static const struct video_levels ntsc_j_levels_svideo = {
    226	.blank = 266, .black = 266, .burst = 133,
    227};
    228
    229static const struct color_conversion pal_csc_composite = {
    230	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0113,
    231	.ru = 0x0745, .gu = 0x053f, .bu = 0x05e1, .au = 0x0200,
    232	.rv = 0x0353, .gv = 0x031c, .bv = 0x06dc, .av = 0x0200,
    233};
    234
    235static const struct video_levels pal_levels_composite = {
    236	.blank = 237, .black = 237, .burst = 118,
    237};
    238
    239static const struct color_conversion pal_csc_svideo = {
    240	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0145,
    241	.ru = 0x0780, .gu = 0x0579, .bu = 0x031c, .au = 0x0200,
    242	.rv = 0x0390, .gv = 0x034f, .bv = 0x0705, .av = 0x0200,
    243};
    244
    245static const struct video_levels pal_levels_svideo = {
    246	.blank = 280, .black = 280, .burst = 139,
    247};
    248
    249static const struct color_conversion pal_m_csc_composite = {
    250	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0104,
    251	.ru = 0x0733, .gu = 0x052d, .bu = 0x05c7, .au = 0x0200,
    252	.rv = 0x0340, .gv = 0x030c, .bv = 0x06d0, .av = 0x0200,
    253};
    254
    255static const struct video_levels pal_m_levels_composite = {
    256	.blank = 225, .black = 267, .burst = 113,
    257};
    258
    259static const struct color_conversion pal_m_csc_svideo = {
    260	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0133,
    261	.ru = 0x076a, .gu = 0x0564, .bu = 0x030d, .au = 0x0200,
    262	.rv = 0x037a, .gv = 0x033d, .bv = 0x06f6, .av = 0x0200,
    263};
    264
    265static const struct video_levels pal_m_levels_svideo = {
    266	.blank = 266, .black = 316, .burst = 133,
    267};
    268
    269static const struct color_conversion pal_n_csc_composite = {
    270	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0104,
    271	.ru = 0x0733, .gu = 0x052d, .bu = 0x05c7, .au = 0x0200,
    272	.rv = 0x0340, .gv = 0x030c, .bv = 0x06d0, .av = 0x0200,
    273};
    274
    275static const struct video_levels pal_n_levels_composite = {
    276	.blank = 225, .black = 267, .burst = 118,
    277};
    278
    279static const struct color_conversion pal_n_csc_svideo = {
    280	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0133,
    281	.ru = 0x076a, .gu = 0x0564, .bu = 0x030d, .au = 0x0200,
    282	.rv = 0x037a, .gv = 0x033d, .bv = 0x06f6, .av = 0x0200,
    283};
    284
    285static const struct video_levels pal_n_levels_svideo = {
    286	.blank = 266, .black = 316, .burst = 139,
    287};
    288
    289/*
    290 * Component connections
    291 */
    292static const struct color_conversion sdtv_csc_yprpb = {
    293	.ry = 0x0332, .gy = 0x012d, .by = 0x07d3, .ay = 0x0145,
    294	.ru = 0x0559, .gu = 0x0353, .bu = 0x0100, .au = 0x0200,
    295	.rv = 0x0100, .gv = 0x03ad, .bv = 0x074d, .av = 0x0200,
    296};
    297
    298static const struct color_conversion hdtv_csc_yprpb = {
    299	.ry = 0x05b3, .gy = 0x016e, .by = 0x0728, .ay = 0x0145,
    300	.ru = 0x07d5, .gu = 0x038b, .bu = 0x0100, .au = 0x0200,
    301	.rv = 0x0100, .gv = 0x03d1, .bv = 0x06bc, .av = 0x0200,
    302};
    303
    304static const struct video_levels component_levels = {
    305	.blank = 279, .black = 279, .burst = 0,
    306};
    307
    308
    309struct tv_mode {
    310	const char *name;
    311
    312	u32 clock;
    313	u16 refresh; /* in millihertz (for precision) */
    314	u8 oversample;
    315	u8 hsync_end;
    316	u16 hblank_start, hblank_end, htotal;
    317	bool progressive : 1, trilevel_sync : 1, component_only : 1;
    318	u8 vsync_start_f1, vsync_start_f2, vsync_len;
    319	bool veq_ena : 1;
    320	u8 veq_start_f1, veq_start_f2, veq_len;
    321	u8 vi_end_f1, vi_end_f2;
    322	u16 nbr_end;
    323	bool burst_ena : 1;
    324	u8 hburst_start, hburst_len;
    325	u8 vburst_start_f1;
    326	u16 vburst_end_f1;
    327	u8 vburst_start_f2;
    328	u16 vburst_end_f2;
    329	u8 vburst_start_f3;
    330	u16 vburst_end_f3;
    331	u8 vburst_start_f4;
    332	u16 vburst_end_f4;
    333	/*
    334	 * subcarrier programming
    335	 */
    336	u16 dda2_size, dda3_size;
    337	u8 dda1_inc;
    338	u16 dda2_inc, dda3_inc;
    339	u32 sc_reset;
    340	bool pal_burst : 1;
    341	/*
    342	 * blank/black levels
    343	 */
    344	const struct video_levels *composite_levels, *svideo_levels;
    345	const struct color_conversion *composite_color, *svideo_color;
    346	const u32 *filter_table;
    347};
    348
    349
    350/*
    351 * Sub carrier DDA
    352 *
    353 *  I think this works as follows:
    354 *
    355 *  subcarrier freq = pixel_clock * (dda1_inc + dda2_inc / dda2_size) / 4096
    356 *
    357 * Presumably, when dda3 is added in, it gets to adjust the dda2_inc value
    358 *
    359 * So,
    360 *  dda1_ideal = subcarrier/pixel * 4096
    361 *  dda1_inc = floor (dda1_ideal)
    362 *  dda2 = dda1_ideal - dda1_inc
    363 *
    364 *  then pick a ratio for dda2 that gives the closest approximation. If
    365 *  you can't get close enough, you can play with dda3 as well. This
    366 *  seems likely to happen when dda2 is small as the jumps would be larger
    367 *
    368 * To invert this,
    369 *
    370 *  pixel_clock = subcarrier * 4096 / (dda1_inc + dda2_inc / dda2_size)
    371 *
    372 * The constants below were all computed using a 107.520MHz clock
    373 */
    374
    375/*
    376 * Register programming values for TV modes.
    377 *
    378 * These values account for -1s required.
    379 */
    380static const struct tv_mode tv_modes[] = {
    381	{
    382		.name		= "NTSC-M",
    383		.clock		= 108000,
    384		.refresh	= 59940,
    385		.oversample	= 8,
    386		.component_only = false,
    387		/* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 3.580MHz */
    388
    389		.hsync_end	= 64,		    .hblank_end		= 124,
    390		.hblank_start	= 836,		    .htotal		= 857,
    391
    392		.progressive	= false,	    .trilevel_sync = false,
    393
    394		.vsync_start_f1	= 6,		    .vsync_start_f2	= 7,
    395		.vsync_len	= 6,
    396
    397		.veq_ena	= true,		    .veq_start_f1	= 0,
    398		.veq_start_f2	= 1,		    .veq_len		= 18,
    399
    400		.vi_end_f1	= 20,		    .vi_end_f2		= 21,
    401		.nbr_end	= 240,
    402
    403		.burst_ena	= true,
    404		.hburst_start	= 72,		    .hburst_len		= 34,
    405		.vburst_start_f1 = 9,		    .vburst_end_f1	= 240,
    406		.vburst_start_f2 = 10,		    .vburst_end_f2	= 240,
    407		.vburst_start_f3 = 9,		    .vburst_end_f3	= 240,
    408		.vburst_start_f4 = 10,		    .vburst_end_f4	= 240,
    409
    410		/* desired 3.5800000 actual 3.5800000 clock 107.52 */
    411		.dda1_inc	=    135,
    412		.dda2_inc	=  20800,	    .dda2_size		=  27456,
    413		.dda3_inc	=      0,	    .dda3_size		=      0,
    414		.sc_reset	= TV_SC_RESET_EVERY_4,
    415		.pal_burst	= false,
    416
    417		.composite_levels = &ntsc_m_levels_composite,
    418		.composite_color = &ntsc_m_csc_composite,
    419		.svideo_levels  = &ntsc_m_levels_svideo,
    420		.svideo_color = &ntsc_m_csc_svideo,
    421
    422		.filter_table = filter_table,
    423	},
    424	{
    425		.name		= "NTSC-443",
    426		.clock		= 108000,
    427		.refresh	= 59940,
    428		.oversample	= 8,
    429		.component_only = false,
    430		/* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 4.43MHz */
    431		.hsync_end	= 64,		    .hblank_end		= 124,
    432		.hblank_start	= 836,		    .htotal		= 857,
    433
    434		.progressive	= false,	    .trilevel_sync = false,
    435
    436		.vsync_start_f1 = 6,		    .vsync_start_f2	= 7,
    437		.vsync_len	= 6,
    438
    439		.veq_ena	= true,		    .veq_start_f1	= 0,
    440		.veq_start_f2	= 1,		    .veq_len		= 18,
    441
    442		.vi_end_f1	= 20,		    .vi_end_f2		= 21,
    443		.nbr_end	= 240,
    444
    445		.burst_ena	= true,
    446		.hburst_start	= 72,		    .hburst_len		= 34,
    447		.vburst_start_f1 = 9,		    .vburst_end_f1	= 240,
    448		.vburst_start_f2 = 10,		    .vburst_end_f2	= 240,
    449		.vburst_start_f3 = 9,		    .vburst_end_f3	= 240,
    450		.vburst_start_f4 = 10,		    .vburst_end_f4	= 240,
    451
    452		/* desired 4.4336180 actual 4.4336180 clock 107.52 */
    453		.dda1_inc       =    168,
    454		.dda2_inc       =   4093,       .dda2_size      =  27456,
    455		.dda3_inc       =    310,       .dda3_size      =    525,
    456		.sc_reset   = TV_SC_RESET_NEVER,
    457		.pal_burst  = false,
    458
    459		.composite_levels = &ntsc_m_levels_composite,
    460		.composite_color = &ntsc_m_csc_composite,
    461		.svideo_levels  = &ntsc_m_levels_svideo,
    462		.svideo_color = &ntsc_m_csc_svideo,
    463
    464		.filter_table = filter_table,
    465	},
    466	{
    467		.name		= "NTSC-J",
    468		.clock		= 108000,
    469		.refresh	= 59940,
    470		.oversample	= 8,
    471		.component_only = false,
    472
    473		/* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 3.580MHz */
    474		.hsync_end	= 64,		    .hblank_end		= 124,
    475		.hblank_start = 836,	    .htotal		= 857,
    476
    477		.progressive	= false,    .trilevel_sync = false,
    478
    479		.vsync_start_f1	= 6,	    .vsync_start_f2	= 7,
    480		.vsync_len	= 6,
    481
    482		.veq_ena      = true,	    .veq_start_f1	= 0,
    483		.veq_start_f2 = 1,	    .veq_len		= 18,
    484
    485		.vi_end_f1	= 20,		    .vi_end_f2		= 21,
    486		.nbr_end	= 240,
    487
    488		.burst_ena	= true,
    489		.hburst_start	= 72,		    .hburst_len		= 34,
    490		.vburst_start_f1 = 9,		    .vburst_end_f1	= 240,
    491		.vburst_start_f2 = 10,		    .vburst_end_f2	= 240,
    492		.vburst_start_f3 = 9,		    .vburst_end_f3	= 240,
    493		.vburst_start_f4 = 10,		    .vburst_end_f4	= 240,
    494
    495		/* desired 3.5800000 actual 3.5800000 clock 107.52 */
    496		.dda1_inc	=    135,
    497		.dda2_inc	=  20800,	    .dda2_size		=  27456,
    498		.dda3_inc	=      0,	    .dda3_size		=      0,
    499		.sc_reset	= TV_SC_RESET_EVERY_4,
    500		.pal_burst	= false,
    501
    502		.composite_levels = &ntsc_j_levels_composite,
    503		.composite_color = &ntsc_j_csc_composite,
    504		.svideo_levels  = &ntsc_j_levels_svideo,
    505		.svideo_color = &ntsc_j_csc_svideo,
    506
    507		.filter_table = filter_table,
    508	},
    509	{
    510		.name		= "PAL-M",
    511		.clock		= 108000,
    512		.refresh	= 59940,
    513		.oversample	= 8,
    514		.component_only = false,
    515
    516		/* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 3.580MHz */
    517		.hsync_end	= 64,		  .hblank_end		= 124,
    518		.hblank_start = 836,	  .htotal		= 857,
    519
    520		.progressive	= false,	    .trilevel_sync = false,
    521
    522		.vsync_start_f1	= 6,		    .vsync_start_f2	= 7,
    523		.vsync_len	= 6,
    524
    525		.veq_ena	= true,		    .veq_start_f1	= 0,
    526		.veq_start_f2	= 1,		    .veq_len		= 18,
    527
    528		.vi_end_f1	= 20,		    .vi_end_f2		= 21,
    529		.nbr_end	= 240,
    530
    531		.burst_ena	= true,
    532		.hburst_start	= 72,		    .hburst_len		= 34,
    533		.vburst_start_f1 = 9,		    .vburst_end_f1	= 240,
    534		.vburst_start_f2 = 10,		    .vburst_end_f2	= 240,
    535		.vburst_start_f3 = 9,		    .vburst_end_f3	= 240,
    536		.vburst_start_f4 = 10,		    .vburst_end_f4	= 240,
    537
    538		/* desired 3.5800000 actual 3.5800000 clock 107.52 */
    539		.dda1_inc	=    135,
    540		.dda2_inc	=  16704,	    .dda2_size		=  27456,
    541		.dda3_inc	=      0,	    .dda3_size		=      0,
    542		.sc_reset	= TV_SC_RESET_EVERY_8,
    543		.pal_burst  = true,
    544
    545		.composite_levels = &pal_m_levels_composite,
    546		.composite_color = &pal_m_csc_composite,
    547		.svideo_levels  = &pal_m_levels_svideo,
    548		.svideo_color = &pal_m_csc_svideo,
    549
    550		.filter_table = filter_table,
    551	},
    552	{
    553		/* 625 Lines, 50 Fields, 15.625KHz line, Sub-Carrier 4.434MHz */
    554		.name	    = "PAL-N",
    555		.clock		= 108000,
    556		.refresh	= 50000,
    557		.oversample	= 8,
    558		.component_only = false,
    559
    560		.hsync_end	= 64,		    .hblank_end		= 128,
    561		.hblank_start = 844,	    .htotal		= 863,
    562
    563		.progressive  = false,    .trilevel_sync = false,
    564
    565
    566		.vsync_start_f1	= 6,	   .vsync_start_f2	= 7,
    567		.vsync_len	= 6,
    568
    569		.veq_ena	= true,		    .veq_start_f1	= 0,
    570		.veq_start_f2	= 1,		    .veq_len		= 18,
    571
    572		.vi_end_f1	= 24,		    .vi_end_f2		= 25,
    573		.nbr_end	= 286,
    574
    575		.burst_ena	= true,
    576		.hburst_start = 73,	    .hburst_len		= 34,
    577		.vburst_start_f1 = 8,	    .vburst_end_f1	= 285,
    578		.vburst_start_f2 = 8,	    .vburst_end_f2	= 286,
    579		.vburst_start_f3 = 9,	    .vburst_end_f3	= 286,
    580		.vburst_start_f4 = 9,	    .vburst_end_f4	= 285,
    581
    582
    583		/* desired 4.4336180 actual 4.4336180 clock 107.52 */
    584		.dda1_inc       =    135,
    585		.dda2_inc       =  23578,       .dda2_size      =  27648,
    586		.dda3_inc       =    134,       .dda3_size      =    625,
    587		.sc_reset   = TV_SC_RESET_EVERY_8,
    588		.pal_burst  = true,
    589
    590		.composite_levels = &pal_n_levels_composite,
    591		.composite_color = &pal_n_csc_composite,
    592		.svideo_levels  = &pal_n_levels_svideo,
    593		.svideo_color = &pal_n_csc_svideo,
    594
    595		.filter_table = filter_table,
    596	},
    597	{
    598		/* 625 Lines, 50 Fields, 15.625KHz line, Sub-Carrier 4.434MHz */
    599		.name	    = "PAL",
    600		.clock		= 108000,
    601		.refresh	= 50000,
    602		.oversample	= 8,
    603		.component_only = false,
    604
    605		.hsync_end	= 64,		    .hblank_end		= 142,
    606		.hblank_start	= 844,	    .htotal		= 863,
    607
    608		.progressive	= false,    .trilevel_sync = false,
    609
    610		.vsync_start_f1	= 5,	    .vsync_start_f2	= 6,
    611		.vsync_len	= 5,
    612
    613		.veq_ena	= true,	    .veq_start_f1	= 0,
    614		.veq_start_f2	= 1,	    .veq_len		= 15,
    615
    616		.vi_end_f1	= 24,		    .vi_end_f2		= 25,
    617		.nbr_end	= 286,
    618
    619		.burst_ena	= true,
    620		.hburst_start	= 73,		    .hburst_len		= 32,
    621		.vburst_start_f1 = 8,		    .vburst_end_f1	= 285,
    622		.vburst_start_f2 = 8,		    .vburst_end_f2	= 286,
    623		.vburst_start_f3 = 9,		    .vburst_end_f3	= 286,
    624		.vburst_start_f4 = 9,		    .vburst_end_f4	= 285,
    625
    626		/* desired 4.4336180 actual 4.4336180 clock 107.52 */
    627		.dda1_inc       =    168,
    628		.dda2_inc       =   4122,       .dda2_size      =  27648,
    629		.dda3_inc       =     67,       .dda3_size      =    625,
    630		.sc_reset   = TV_SC_RESET_EVERY_8,
    631		.pal_burst  = true,
    632
    633		.composite_levels = &pal_levels_composite,
    634		.composite_color = &pal_csc_composite,
    635		.svideo_levels  = &pal_levels_svideo,
    636		.svideo_color = &pal_csc_svideo,
    637
    638		.filter_table = filter_table,
    639	},
    640	{
    641		.name       = "480p",
    642		.clock		= 108000,
    643		.refresh	= 59940,
    644		.oversample     = 4,
    645		.component_only = true,
    646
    647		.hsync_end      = 64,               .hblank_end         = 122,
    648		.hblank_start   = 842,              .htotal             = 857,
    649
    650		.progressive    = true,		    .trilevel_sync = false,
    651
    652		.vsync_start_f1 = 12,               .vsync_start_f2     = 12,
    653		.vsync_len      = 12,
    654
    655		.veq_ena        = false,
    656
    657		.vi_end_f1      = 44,               .vi_end_f2          = 44,
    658		.nbr_end        = 479,
    659
    660		.burst_ena      = false,
    661
    662		.filter_table = filter_table,
    663	},
    664	{
    665		.name       = "576p",
    666		.clock		= 108000,
    667		.refresh	= 50000,
    668		.oversample     = 4,
    669		.component_only = true,
    670
    671		.hsync_end      = 64,               .hblank_end         = 139,
    672		.hblank_start   = 859,              .htotal             = 863,
    673
    674		.progressive    = true,		    .trilevel_sync = false,
    675
    676		.vsync_start_f1 = 10,               .vsync_start_f2     = 10,
    677		.vsync_len      = 10,
    678
    679		.veq_ena        = false,
    680
    681		.vi_end_f1      = 48,               .vi_end_f2          = 48,
    682		.nbr_end        = 575,
    683
    684		.burst_ena      = false,
    685
    686		.filter_table = filter_table,
    687	},
    688	{
    689		.name       = "720p@60Hz",
    690		.clock		= 148500,
    691		.refresh	= 60000,
    692		.oversample     = 2,
    693		.component_only = true,
    694
    695		.hsync_end      = 80,               .hblank_end         = 300,
    696		.hblank_start   = 1580,             .htotal             = 1649,
    697
    698		.progressive	= true,		    .trilevel_sync = true,
    699
    700		.vsync_start_f1 = 10,               .vsync_start_f2     = 10,
    701		.vsync_len      = 10,
    702
    703		.veq_ena        = false,
    704
    705		.vi_end_f1      = 29,               .vi_end_f2          = 29,
    706		.nbr_end        = 719,
    707
    708		.burst_ena      = false,
    709
    710		.filter_table = filter_table,
    711	},
    712	{
    713		.name       = "720p@50Hz",
    714		.clock		= 148500,
    715		.refresh	= 50000,
    716		.oversample     = 2,
    717		.component_only = true,
    718
    719		.hsync_end      = 80,               .hblank_end         = 300,
    720		.hblank_start   = 1580,             .htotal             = 1979,
    721
    722		.progressive	= true,		    .trilevel_sync = true,
    723
    724		.vsync_start_f1 = 10,               .vsync_start_f2     = 10,
    725		.vsync_len      = 10,
    726
    727		.veq_ena        = false,
    728
    729		.vi_end_f1      = 29,               .vi_end_f2          = 29,
    730		.nbr_end        = 719,
    731
    732		.burst_ena      = false,
    733
    734		.filter_table = filter_table,
    735	},
    736	{
    737		.name       = "1080i@50Hz",
    738		.clock		= 148500,
    739		.refresh	= 50000,
    740		.oversample     = 2,
    741		.component_only = true,
    742
    743		.hsync_end      = 88,               .hblank_end         = 235,
    744		.hblank_start   = 2155,             .htotal             = 2639,
    745
    746		.progressive	= false,	  .trilevel_sync = true,
    747
    748		.vsync_start_f1 = 4,              .vsync_start_f2     = 5,
    749		.vsync_len      = 10,
    750
    751		.veq_ena	= true,	    .veq_start_f1	= 4,
    752		.veq_start_f2   = 4,	    .veq_len		= 10,
    753
    754
    755		.vi_end_f1      = 21,           .vi_end_f2          = 22,
    756		.nbr_end        = 539,
    757
    758		.burst_ena      = false,
    759
    760		.filter_table = filter_table,
    761	},
    762	{
    763		.name       = "1080i@60Hz",
    764		.clock		= 148500,
    765		.refresh	= 60000,
    766		.oversample     = 2,
    767		.component_only = true,
    768
    769		.hsync_end      = 88,               .hblank_end         = 235,
    770		.hblank_start   = 2155,             .htotal             = 2199,
    771
    772		.progressive	= false,	    .trilevel_sync = true,
    773
    774		.vsync_start_f1 = 4,               .vsync_start_f2     = 5,
    775		.vsync_len      = 10,
    776
    777		.veq_ena	= true,		    .veq_start_f1	= 4,
    778		.veq_start_f2	= 4,		    .veq_len		= 10,
    779
    780
    781		.vi_end_f1      = 21,               .vi_end_f2          = 22,
    782		.nbr_end        = 539,
    783
    784		.burst_ena      = false,
    785
    786		.filter_table = filter_table,
    787	},
    788
    789	{
    790		.name       = "1080p@30Hz",
    791		.clock		= 148500,
    792		.refresh	= 30000,
    793		.oversample     = 2,
    794		.component_only = true,
    795
    796		.hsync_end      = 88,               .hblank_end         = 235,
    797		.hblank_start   = 2155,             .htotal             = 2199,
    798
    799		.progressive	= true,		    .trilevel_sync = true,
    800
    801		.vsync_start_f1 = 8,               .vsync_start_f2     = 8,
    802		.vsync_len      = 10,
    803
    804		.veq_ena	= false,	.veq_start_f1	= 0,
    805		.veq_start_f2	= 0,		    .veq_len		= 0,
    806
    807		.vi_end_f1      = 44,               .vi_end_f2          = 44,
    808		.nbr_end        = 1079,
    809
    810		.burst_ena      = false,
    811
    812		.filter_table = filter_table,
    813	},
    814
    815	{
    816		.name       = "1080p@50Hz",
    817		.clock		= 148500,
    818		.refresh	= 50000,
    819		.oversample     = 1,
    820		.component_only = true,
    821
    822		.hsync_end      = 88,               .hblank_end         = 235,
    823		.hblank_start   = 2155,             .htotal             = 2639,
    824
    825		.progressive	= true,		    .trilevel_sync = true,
    826
    827		.vsync_start_f1 = 8,               .vsync_start_f2     = 8,
    828		.vsync_len      = 10,
    829
    830		.veq_ena	= false,	.veq_start_f1	= 0,
    831		.veq_start_f2	= 0,		    .veq_len		= 0,
    832
    833		.vi_end_f1      = 44,               .vi_end_f2          = 44,
    834		.nbr_end        = 1079,
    835
    836		.burst_ena      = false,
    837
    838		.filter_table = filter_table,
    839	},
    840
    841	{
    842		.name       = "1080p@60Hz",
    843		.clock		= 148500,
    844		.refresh	= 60000,
    845		.oversample     = 1,
    846		.component_only = true,
    847
    848		.hsync_end      = 88,               .hblank_end         = 235,
    849		.hblank_start   = 2155,             .htotal             = 2199,
    850
    851		.progressive	= true,		    .trilevel_sync = true,
    852
    853		.vsync_start_f1 = 8,               .vsync_start_f2     = 8,
    854		.vsync_len      = 10,
    855
    856		.veq_ena	= false,		    .veq_start_f1	= 0,
    857		.veq_start_f2	= 0,		    .veq_len		= 0,
    858
    859		.vi_end_f1      = 44,               .vi_end_f2          = 44,
    860		.nbr_end        = 1079,
    861
    862		.burst_ena      = false,
    863
    864		.filter_table = filter_table,
    865	},
    866};
    867
    868struct intel_tv_connector_state {
    869	struct drm_connector_state base;
    870
    871	/*
    872	 * May need to override the user margins for
    873	 * gen3 >1024 wide source vertical centering.
    874	 */
    875	struct {
    876		u16 top, bottom;
    877	} margins;
    878
    879	bool bypass_vfilter;
    880};
    881
    882#define to_intel_tv_connector_state(x) container_of(x, struct intel_tv_connector_state, base)
    883
    884static struct drm_connector_state *
    885intel_tv_connector_duplicate_state(struct drm_connector *connector)
    886{
    887	struct intel_tv_connector_state *state;
    888
    889	state = kmemdup(connector->state, sizeof(*state), GFP_KERNEL);
    890	if (!state)
    891		return NULL;
    892
    893	__drm_atomic_helper_connector_duplicate_state(connector, &state->base);
    894	return &state->base;
    895}
    896
    897static struct intel_tv *enc_to_tv(struct intel_encoder *encoder)
    898{
    899	return container_of(encoder, struct intel_tv, base);
    900}
    901
    902static struct intel_tv *intel_attached_tv(struct intel_connector *connector)
    903{
    904	return enc_to_tv(intel_attached_encoder(connector));
    905}
    906
    907static bool
    908intel_tv_get_hw_state(struct intel_encoder *encoder, enum pipe *pipe)
    909{
    910	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
    911	u32 tmp = intel_de_read(dev_priv, TV_CTL);
    912
    913	*pipe = (tmp & TV_ENC_PIPE_SEL_MASK) >> TV_ENC_PIPE_SEL_SHIFT;
    914
    915	return tmp & TV_ENC_ENABLE;
    916}
    917
    918static void
    919intel_enable_tv(struct intel_atomic_state *state,
    920		struct intel_encoder *encoder,
    921		const struct intel_crtc_state *pipe_config,
    922		const struct drm_connector_state *conn_state)
    923{
    924	struct drm_device *dev = encoder->base.dev;
    925	struct drm_i915_private *dev_priv = to_i915(dev);
    926
    927	/* Prevents vblank waits from timing out in intel_tv_detect_type() */
    928	intel_crtc_wait_for_next_vblank(to_intel_crtc(pipe_config->uapi.crtc));
    929
    930	intel_de_write(dev_priv, TV_CTL,
    931		       intel_de_read(dev_priv, TV_CTL) | TV_ENC_ENABLE);
    932}
    933
    934static void
    935intel_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
    947static 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
    954static enum drm_mode_status
    955intel_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
    974static int
    975intel_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
    983static void
    984intel_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
   1049static 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
   1066static 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
   1083static void
   1084intel_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: " DRM_MODE_FMT "\n",
   1149		    DRM_MODE_ARG(&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
   1166static 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
   1172static 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
   1182static int
   1183intel_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: " DRM_MODE_FMT "\n",
   1254		    DRM_MODE_ARG(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
   1338static void
   1339set_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
   1397static 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
   1417static 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_transcoder_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
   1570static int
   1571intel_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_crtc_wait_for_next_vblank(crtc);
   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_crtc_wait_for_next_vblank(crtc);
   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 */
   1672static 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
   1696static int
   1697intel_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
   1739static 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 */
   1752static bool
   1753intel_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
   1765static void
   1766intel_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
   1775static int
   1776intel_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: " DRM_MODE_FMT "\n",
   1810				    DRM_MODE_ARG(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
   1825static 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
   1834static 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
   1861static 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
   1868static const struct drm_encoder_funcs intel_tv_enc_funcs = {
   1869	.destroy = intel_encoder_destroy,
   1870};
   1871
   1872void
   1873intel_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}