intel_tv.c revision 1450
32N/A * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. 919N/A * Copyright (c) 2006-2013 Intel Corporation 919N/A * Jesse Barnes <jesse.barnes@intel.com> 919N/A * Permission is hereby granted, free of charge, to any person obtaining a 919N/A * copy of this software and associated documentation files (the "Software"), 919N/A * to deal in the Software without restriction, including without limitation 919N/A * the rights to use, copy, modify, merge, publish, distribute, sublicense, 919N/A * and/or sell copies of the Software, and to permit persons to whom the 919N/A * Software is furnished to do so, subject to the following conditions: 919N/A * The above copyright notice and this permission notice (including the next 919N/A * paragraph) shall be included in all copies or substantial portions of the 919N/A * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 919N/A * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 919N/A * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 32N/A * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 32N/A * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 32N/A * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 32N/A * DEALINGS IN THE SOFTWARE. 32N/A * Eric Anholt <eric@anholt.net> 1265N/A * Integrated TV-out support for the 915GM and 945GM. /** Private structure for the integrated TV support */ 0xB1403000,
0x2E203500,
0x35002E20,
0x3000B140,
0x35A0B160,
0x2DC02E80,
0xB1403480,
0xB1603000,
0x2EA03640,
0x34002D80,
0x3000B120,
0x36E0B160,
0x2D202EF0,
0xB1203380,
0xB1603000,
0x2F303780,
0x33002CC0,
0x3000B100,
0x3820B160,
0x2C802F50,
0xB10032A0,
0xB1603000,
0x2F9038C0,
0x32202C20,
0x3000B0E0,
0x3980B160,
0x2BC02FC0,
0xB0E031C0,
0xB1603000,
0x2FF03A20,
0x31602B60,
0xB020B0C0,
0x3AE0B160,
0x2B001810,
0xB0C03120,
0xB140B020,
0x18283BA0,
0x30C02A80,
0xB020B0A0,
0x3C60B140,
0x2A201838,
0xB0A03080,
0xB120B020,
0x18383D20,
0x304029C0,
0xB040B080,
0x3DE0B100,
0x29601848,
0xB0803000,
0xB100B040,
0x18483EC0,
0xB0402900,
0xB040B060,
0x3F80B0C0,
0x28801858,
0xB060B080,
0xB0A0B060,
0x18602820,
0xB0A02820,
0x0000B060,
0xB1403000,
0x2E203500,
0x35002E20,
0x3000B140,
0x35A0B160,
0x2DC02E80,
0xB1403480,
0xB1603000,
0x2EA03640,
0x34002D80,
0x3000B120,
0x36E0B160,
0x2D202EF0,
0xB1203380,
0xB1603000,
0x2F303780,
0x33002CC0,
0x3000B100,
0x3820B160,
0x2C802F50,
0xB10032A0,
0xB1603000,
0x2F9038C0,
0x32202C20,
0x3000B0E0,
0x3980B160,
0x2BC02FC0,
0xB0E031C0,
0xB1603000,
0x2FF03A20,
0x31602B60,
0xB020B0C0,
0x3AE0B160,
0x2B001810,
0xB0C03120,
0xB140B020,
0x18283BA0,
0x30C02A80,
0xB020B0A0,
0x3C60B140,
0x2A201838,
0xB0A03080,
0xB120B020,
0x18383D20,
0x304029C0,
0xB040B080,
0x3DE0B100,
0x29601848,
0xB0803000,
0xB100B040,
0x18483EC0,
0xB0402900,
0xB040B060,
0x3F80B0C0,
0x28801858,
0xB060B080,
0xB0A0B060,
0x18602820,
0xB0A02820,
0x0000B060,
0x36403000,
0x2D002CC0,
0x30003640,
0x2D0036C0,
0x35C02CC0,
0x37403000,
0x2C802D40,
0x30003540,
0x2D8037C0,
0x34C02C40,
0x38403000,
0x2BC02E00,
0x30003440,
0x2E2038C0,
0x34002B80,
0x39803000,
0x2B402E40,
0x30003380,
0x2E603A00,
0x33402B00,
0x3A803040,
0x2A802EA0,
0x30403300,
0x2EC03B40,
0x32802A40,
0x3C003040,
0x2A002EC0,
0x30803240,
0x2EC03C80,
0x320029C0,
0x3D403080,
0x29402F00,
0x308031C0,
0x2F203DC0,
0x31802900,
0x3E8030C0,
0x28802F40,
0x30C03140,
0x2F203F40,
0x31402840,
0x28003100,
0x28002F00,
0x00003100,
0x36403000,
0x2D002CC0,
0x30003640,
0x2D0036C0,
0x35C02CC0,
0x37403000,
0x2C802D40,
0x30003540,
0x2D8037C0,
0x34C02C40,
0x38403000,
0x2BC02E00,
0x30003440,
0x2E2038C0,
0x34002B80,
0x39803000,
0x2B402E40,
0x30003380,
0x2E603A00,
0x33402B00,
0x3A803040,
0x2A802EA0,
0x30403300,
0x2EC03B40,
0x32802A40,
0x3C003040,
0x2A002EC0,
0x30803240,
0x2EC03C80,
0x320029C0,
0x3D403080,
0x29402F00,
0x308031C0,
0x2F203DC0,
0x31802900,
0x3E8030C0,
0x28802F40,
0x30C03140,
0x2F203F40,
0x31402840,
0x28003100,
0x28002F00,
0x00003100,
* Color conversion values have 3 separate fixed point formats: * 1.9 fixed point (b.bbbbbbbbb) * 11 bit fields (ry, by, ru, gu, gv) * exp.mantissa (ee.mmmmmmmmm) * ee = 00 = 10^-1 (0.mmmmmmmmm) * ee = 01 = 10^-2 (0.0mmmmmmmmm) * ee = 10 = 10^-3 (0.00mmmmmmmmm) * ee = 11 = 10^-4 (0.000mmmmmmmmm) * 12 bit fields (gy, rv, bu) * exp.mantissa (eee.mmmmmmmmm) * eee = 000 = 10^-1 (0.mmmmmmmmm) * eee = 001 = 10^-2 (0.0mmmmmmmmm) * eee = 010 = 10^-3 (0.00mmmmmmmmm) * eee = 011 = 10^-4 (0.000mmmmmmmmm) * eee = 111 = 10^0 (m.mmmmmmmm) (only usable for 1.0 representation) * Saturation and contrast are 8 bits, with their own representation: * 8 bit field (saturation, contrast) * exp.mantissa (ee.mmmmmm) * ee = 00 = 10^-1 (0.mmmmmm) * ee = 01 = 10^0 (m.mmmmm) * ee = 10 = 10^1 (mm.mmmm) * ee = 11 = 10^2 (mmm.mmm) * Simple conversion function: * float_to_csc_11(float f) * for (exp = 0; exp < 3 && f < 0.5; exp++) * mant = (f * (1 << 9) + 0.5); * ret = (exp << 9) | mant; * Behold, magic numbers! If we plant them they might grow a big * s-video cable to the sky... or something. * Pre-converted to appropriate hex value. * PAL & NTSC values for composite & s-video connections .
ry =
0x0332, .
gy =
0x012d, .
by =
0x07d3, .
ay =
0x0104,
.
ru =
0x0733, .
gu =
0x052d, .
bu =
0x05c7, .
au =
0x0200,
.
rv =
0x0340, .
gv =
0x030c, .
bv =
0x06d0, .
av =
0x0200,
.
ry =
0x0332, .
gy =
0x012d, .
by =
0x07d3, .
ay =
0x0133,
.
ru =
0x076a, .
gu =
0x0564, .
bu =
0x030d, .
au =
0x0200,
.
rv =
0x037a, .
gv =
0x033d, .
bv =
0x06f6, .
av =
0x0200,
.
ry =
0x0332, .
gy =
0x012d, .
by =
0x07d3, .
ay =
0x0119,
.
ru =
0x074c, .
gu =
0x0546, .
bu =
0x05ec, .
au =
0x0200,
.
rv =
0x035a, .
gv =
0x0322, .
bv =
0x06e1, .
av =
0x0200,
.
ry =
0x0332, .
gy =
0x012d, .
by =
0x07d3, .
ay =
0x014c,
.
ru =
0x0788, .
gu =
0x0581, .
bu =
0x0322, .
au =
0x0200,
.
rv =
0x0399, .
gv =
0x0356, .
bv =
0x070a, .
av =
0x0200,
.
ry =
0x0332, .
gy =
0x012d, .
by =
0x07d3, .
ay =
0x0113,
.
ru =
0x0745, .
gu =
0x053f, .
bu =
0x05e1, .
au =
0x0200,
.
rv =
0x0353, .
gv =
0x031c, .
bv =
0x06dc, .
av =
0x0200,
.
ry =
0x0332, .
gy =
0x012d, .
by =
0x07d3, .
ay =
0x0145,
.
ru =
0x0780, .
gu =
0x0579, .
bu =
0x031c, .
au =
0x0200,
.
rv =
0x0390, .
gv =
0x034f, .
bv =
0x0705, .
av =
0x0200,
.
ry =
0x0332, .
gy =
0x012d, .
by =
0x07d3, .
ay =
0x0104,
.
ru =
0x0733, .
gu =
0x052d, .
bu =
0x05c7, .
au =
0x0200,
.
rv =
0x0340, .
gv =
0x030c, .
bv =
0x06d0, .
av =
0x0200,
.
ry =
0x0332, .
gy =
0x012d, .
by =
0x07d3, .
ay =
0x0133,
.
ru =
0x076a, .
gu =
0x0564, .
bu =
0x030d, .
au =
0x0200,
.
rv =
0x037a, .
gv =
0x033d, .
bv =
0x06f6, .
av =
0x0200,
.
ry =
0x0332, .
gy =
0x012d, .
by =
0x07d3, .
ay =
0x0104,
.
ru =
0x0733, .
gu =
0x052d, .
bu =
0x05c7, .
au =
0x0200,
.
rv =
0x0340, .
gv =
0x030c, .
bv =
0x06d0, .
av =
0x0200,
.
ry =
0x0332, .
gy =
0x012d, .
by =
0x07d3, .
ay =
0x0133,
.
ru =
0x076a, .
gu =
0x0564, .
bu =
0x030d, .
au =
0x0200,
.
rv =
0x037a, .
gv =
0x033d, .
bv =
0x06f6, .
av =
0x0200,
.
ry =
0x0332, .
gy =
0x012d, .
by =
0x07d3, .
ay =
0x0145,
.
ru =
0x0559, .
gu =
0x0353, .
bu =
0x0100, .
au =
0x0200,
.
rv =
0x0100, .
gv =
0x03ad, .
bv =
0x074d, .
av =
0x0200,
.
ry =
0x0000, .
gy =
0x0f00, .
by =
0x0000, .
ay =
0x0166,
.
ru =
0x0000, .
gu =
0x0000, .
bu =
0x0f00, .
au =
0x0166,
.
rv =
0x0f00, .
gv =
0x0000, .
bv =
0x0000, .
av =
0x0166,
.
ry =
0x05b3, .
gy =
0x016e, .
by =
0x0728, .
ay =
0x0145,
.
ru =
0x07d5, .
gu =
0x038b, .
bu =
0x0100, .
au =
0x0200,
.
rv =
0x0100, .
gv =
0x03d1, .
bv =
0x06bc, .
av =
0x0200,
.
ry =
0x0000, .
gy =
0x0f00, .
by =
0x0000, .
ay =
0x0166,
.
ru =
0x0000, .
gu =
0x0000, .
bu =
0x0f00, .
au =
0x0166,
.
rv =
0x0f00, .
gv =
0x0000, .
bv =
0x0000, .
av =
0x0166,
int refresh;
/* in millihertz (for precision) */ * I think this works as follows: * subcarrier freq = pixel_clock * (dda1_inc + dda2_inc / dda2_size) / 4096 * Presumably, when dda3 is added in, it gets to adjust the dda2_inc value * dda1_inc = floor (dda1_ideal) * dda2 = dda1_ideal - dda1_inc * then pick a ratio for dda2 that gives the closest approximation. If * you can't get close enough, you can play with dda3 as well. This * seems likely to happen when dda2 is small as the jumps would be larger * pixel_clock = subcarrier * 4096 / (dda1_inc + dda2_inc / dda2_size) * The constants below were all computed using a 107.520MHz clock * Register programming values for TV modes. * These values account for -1s required. /* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 3.580MHz */ /* desired 3.5800000 actual 3.5800000 clock 107.52 */ /* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 4.43MHz */ /* desired 4.4336180 actual 4.4336180 clock 107.52 */ /* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 3.580MHz */ /* desired 3.5800000 actual 3.5800000 clock 107.52 */ /* 525 Lines, 60 Fields, 15.734KHz line, Sub-Carrier 3.580MHz */ /* desired 3.5800000 actual 3.5800000 clock 107.52 */ /* 625 Lines, 50 Fields, 15.625KHz line, Sub-Carrier 4.434MHz */ /* desired 4.4336180 actual 4.4336180 clock 107.52 */ /* 625 Lines, 50 Fields, 15.625KHz line, Sub-Carrier 4.434MHz */ /* desired 4.4336180 actual 4.4336180 clock 107.52 */ static int /* OSOL_i915 */ /* Ensure TV refresh is close to desired refresh */ return;
/* can't happen (mode_prepare prevents this) */ /* Enable two fixes for the chips that need them. */ /* Pipe must be off here */ /* Wait for vblank for the disable to take effect */ /* Wait for vblank for the disable to take effect. */ /* Filter ctl must be set before TV_WIN_SIZE */ * Detects TV presence by checking for load. * Requires that the current pipe's DPLL is active. * \return true if TV is connected. * \return false if TV is disconnected. /* Disable TV interrupts around load detect or we'll recurse */ /* Poll for TV detection */ * The TV sense state should be cleared to zero on cantiga platform. Otherwise * the TV is misdetected. This is hardware requirement. /* For unknown reasons the hw barfs if we don't do this vblank wait. */ /* Restore interrupt config */ * Here we set accurate tv format according to connector type * i.e Component TV should not be assigned by NTSC or PAL * Detect the TV connection. * Currently this always returns CONNECTOR_STATUS_UNKNOWN, as we need to be sure * we have a pipe programmed in order to probe the TV. {
"1280x1024",
1280,
1024},
{
"1920x1080",
1920,
1080},
* Chose preferred mode according to line number of TV format * Stub get_modes function. * This should probably return a set of fixed modes, unless we can figure out * how to probe modes off of TV connections. * Enumerate the child dev array parsed from VBT to check whether * the integrated TV is present. * If it is present, return 1. * If it is not present, return false. * If no child dev is parsed from VBT, it assumes that the TV is present. * If the device type is not TV, continue. /* Only when the addin_offset is non-zero, it is regarded /* Even if we have an encoder we may not have a connector */ * Sanity check the TV output by checking to see if the * DAC register holds a value * If the register does not hold the state change enable * bit, (either as a 0 or a 1), assume it doesn't really /* The documentation, for the older chipsets at least, recommend * using a polling method rather than hotplug detection for TVs. * This is because in order to perform the hotplug detection, the PLLs * for the TV must be kept alive increasing power drain and starving * bandwidth from other encoders. Notably for instance, it causes * pipe underruns on Crestline when this encoder is supposedly idle. * More recent chipsets favour HDMI rather than integrated S-Video. /* Create TV properties then attach current values */