54 .tv_enc_mode = { 720, 576, 50000, {
55 0x2a, 0x9, 0x8a, 0xcb, 0x0, 0x0, 0xb, 0x18,
56 0x7e, 0x40, 0x8a, 0x35, 0x27, 0x0, 0x34, 0x3,
57 0x3e, 0x3, 0x17, 0x21, 0x1b, 0x1b, 0x24, 0x9c,
58 0x1, 0x0, 0xf, 0xf, 0x60, 0x5, 0xd3, 0x3,
59 0xd3, 0x4, 0xd4, 0x1, 0x2, 0x0, 0xa, 0x5,
60 0x0, 0x1a, 0xff, 0x3, 0x18, 0xf, 0x78, 0x0,
61 0x0, 0xb4, 0x0, 0x15, 0x49, 0x10, 0x0, 0x9b,
62 0xbd, 0x15, 0x5, 0x15, 0x3e, 0x3, 0x0, 0x0
66 .tv_enc_mode = { 720, 480, 59940, {
67 0x21, 0xe6, 0xef, 0xe3, 0x0, 0x0, 0xb, 0x18,
68 0x7e, 0x44, 0x76, 0x32, 0x25, 0x0, 0x3c, 0x0,
69 0x3c, 0x0, 0x17, 0x21, 0x1b, 0x1b, 0x24, 0x83,
70 0x1, 0x0, 0xf, 0xf, 0x60, 0x5, 0xd3, 0x1,
71 0xc5, 0x4, 0xc5, 0x1, 0x2, 0x0, 0xa, 0x5,
72 0x0, 0x18, 0xff, 0x3, 0x20, 0xf, 0x78, 0x0,
73 0x0, 0xb4, 0x0, 0x15, 0x40, 0x10, 0x0, 0x9c,
74 0xc8, 0x15, 0x5, 0x15, 0x3c, 0x0, 0x0, 0x0
78 .tv_enc_mode = { 720, 576, 50000, {
79 0x2a, 0x9, 0x8a, 0xcb, 0x0, 0x0, 0xb, 0x18,
80 0x7e, 0x40, 0x8a, 0x32, 0x25, 0x0, 0x3c, 0x0,
81 0x3c, 0x0, 0x17, 0x21, 0x1b, 0x1b, 0x24, 0x9c,
82 0x1, 0x0, 0xf, 0xf, 0x60, 0x5, 0xd3, 0x1,
83 0xc5, 0x4, 0xc5, 0x1, 0x2, 0x0, 0xa, 0x5,
84 0x0, 0x1a, 0xff, 0x3, 0x18, 0xf, 0x78, 0x0,
85 0x0, 0xb4, 0x0, 0x15, 0x49, 0x10, 0x0, 0x9b,
86 0xbd, 0x15, 0x5, 0x15, 0x3c, 0x0, 0x0, 0x0
90 .tv_enc_mode = { 720, 576, 50000, {
91 0x21, 0xf6, 0x94, 0x46, 0x0, 0x0, 0xb, 0x18,
92 0x7e, 0x44, 0x8a, 0x35, 0x27, 0x0, 0x34, 0x3,
93 0x3e, 0x3, 0x17, 0x21, 0x1b, 0x1b, 0x24, 0x9c,
94 0x1, 0x0, 0xf, 0xf, 0x60, 0x5, 0xd3, 0x3,
95 0xd3, 0x4, 0xd4, 0x1, 0x2, 0x0, 0xa, 0x5,
96 0x0, 0x1a, 0xff, 0x3, 0x18, 0xf, 0x78, 0x0,
97 0x0, 0xb4, 0x0, 0x15, 0x49, 0x10, 0x0, 0x9b,
98 0xbd, 0x15, 0x5, 0x15, 0x3e, 0x3, 0x0, 0x0
102 .tv_enc_mode = { 720, 480, 59940, {
103 0x21, 0xf0, 0x7c, 0x1f, 0x0, 0x0, 0xb, 0x18,
104 0x7e, 0x44, 0x76, 0x48, 0x0, 0x0, 0x3c, 0x0,
105 0x3c, 0x0, 0x17, 0x21, 0x1b, 0x1b, 0x24, 0x83,
106 0x1, 0x0, 0xf, 0xf, 0x60, 0x5, 0xd3, 0x1,
107 0xc5, 0x4, 0xc5, 0x1, 0x2, 0x0, 0xa, 0x5,
108 0x0, 0x16, 0xff, 0x3, 0x20, 0xf, 0x78, 0x0,
109 0x0, 0xb4, 0x0, 0x15, 0x4, 0x10, 0x0, 0x9c,
110 0xc8, 0x15, 0x5, 0x15, 0x3c, 0x0, 0x0, 0x0
114 .tv_enc_mode = { 720, 480, 59940, {
115 0x21, 0xf0, 0x7c, 0x1f, 0x0, 0x0, 0xb, 0x18,
116 0x7e, 0x44, 0x76, 0x48, 0x0, 0x0, 0x32, 0x0,
117 0x3c, 0x0, 0x17, 0x21, 0x1b, 0x1b, 0x24, 0x83,
118 0x1, 0x0, 0xf, 0xf, 0x60, 0x5, 0xd3, 0x1,
119 0xcf, 0x4, 0xcf, 0x1, 0x2, 0x0, 0xa, 0x5,
120 0x0, 0x16, 0xff, 0x3, 0x20, 0xf, 0x78, 0x0,
121 0x0, 0xb4, 0x0, 0x15, 0x4, 0x10, 0x0, 0xa4,
122 0xc8, 0x15, 0x5, 0x15, 0x3c, 0x0, 0x0, 0x0
126 .tv_enc_mode = { 720, 480, 59940, {
127 0x21, 0xf0, 0x7c, 0x1f, 0x0, 0x0, 0xb, 0x18,
128 0x7e, 0x44, 0x76, 0x48, 0x0, 0x0, 0x32, 0x0,
129 0x3c, 0x0, 0x17, 0x21, 0x1b, 0x1b, 0x24, 0x83,
130 0x1, 0x0, 0xf, 0xf, 0x60, 0x5, 0xd3, 0x1,
131 0xcf, 0x4, 0xcf, 0x1, 0x2, 0x0, 0xa, 0x5,
132 0x0, 0x16, 0xff, 0x3, 0x20, 0xf, 0x78, 0x0,
133 0x0, 0xb4, 0x0, 0x15, 0x4, 0x10, 0x0, 0xa4,
134 0xc8, 0x15, 0x5, 0x15, 0x3c, 0x0, 0x0, 0x0
138 .tv_enc_mode = { 720, 576, 50000, {
139 0x2a, 0x9, 0x8a, 0xcb, 0x0, 0x0, 0xb, 0x18,
140 0x7e, 0x40, 0x8a, 0x35, 0x27, 0x0, 0x34, 0x3,
141 0x3e, 0x3, 0x17, 0x21, 0x1b, 0x1b, 0x24, 0x9c,
142 0x1, 0x0, 0xf, 0xf, 0x60, 0x5, 0xd3, 0x3,
143 0xd3, 0x4, 0xd4, 0x1, 0x2, 0x0, 0xa, 0x5,
144 0x0, 0x1a, 0xff, 0x3, 0x18, 0xf, 0x78, 0x0,
145 0x0, 0xb4, 0x0, 0x15, 0x49, 0x10, 0x0, 0x9b,
146 0xbd, 0x15, 0x5, 0x15, 0x3e, 0x3, 0x0, 0x0
153 720, 735, 743, 858, 0, 480, 490, 494, 525, 0,
155 .ctv_regs = { 0x3540000, 0x0, 0x0, 0x314,
156 0x354003a, 0x40000, 0x6f0344, 0x18100000,
157 0x10160004, 0x10060005, 0x1006000c, 0x10060020,
158 0x10060021, 0x140e0022, 0x10060202, 0x1802020a,
159 0x1810020b, 0x10000fff, 0x10000fff, 0x10000fff,
160 0x10000fff, 0x10000fff, 0x10000fff, 0x70,
161 0x3ff0000, 0x57, 0x2e001e, 0x258012c,
162 0xa0aa04ec, 0x30, 0x80960019, 0x12c0300,
163 0x2019, 0x600, 0x32060019, 0x0, 0x0, 0x400
169 720, 730, 738, 864, 0, 576, 581, 585, 625, 0,
171 .ctv_regs = { 0x3540000, 0x0, 0x0, 0x314,
172 0x354003a, 0x40000, 0x6f0344, 0x18100000,
173 0x10060001, 0x10060009, 0x10060026, 0x10060027,
174 0x140e0028, 0x10060268, 0x1810026d, 0x10000fff,
175 0x10000fff, 0x10000fff, 0x10000fff, 0x10000fff,
176 0x10000fff, 0x10000fff, 0x10000fff, 0x69,
177 0x3ff0000, 0x57, 0x2e001e, 0x258012c,
178 0xa0aa04ec, 0x30, 0x80960019, 0x12c0300,
179 0x2019, 0x600, 0x32060019, 0x0, 0x0, 0x400
185 1280, 1349, 1357, 1650, 0, 720, 725, 730, 750, 0,
187 .ctv_regs = { 0x1260394, 0x0, 0x0, 0x622,
188 0x66b0021, 0x6004a, 0x1210626, 0x8170000,
189 0x70004, 0x70016, 0x70017, 0x40f0018,
190 0x702e8, 0x81702ed, 0xfff, 0xfff,
191 0xfff, 0xfff, 0xfff, 0xfff,
192 0xfff, 0xfff, 0xfff, 0x0,
193 0x2e40001, 0x58, 0x2e001e, 0x258012c,
194 0xa0aa04ec, 0x30, 0x810c0039, 0x12c0300,
195 0xc0002039, 0x600, 0x32060039, 0x0, 0x0, 0x0
201 1920, 1961, 2049, 2200, 0, 1080, 1084, 1088, 1125, 0,
204 .ctv_regs = { 0xac0420, 0x44c0478, 0x4a4, 0x4fc0868,
205 0x8940028, 0x60054, 0xe80870, 0xbf70000,
206 0xbc70004, 0x70005, 0x70012, 0x70013,
207 0x40f0014, 0x70230, 0xbf70232, 0xbf70233,
208 0x1c70237, 0x70238, 0x70244, 0x70245,
209 0x40f0246, 0x70462, 0x1f70464, 0x0,
210 0x2e40001, 0x58, 0x2e001e, 0x258012c,
211 0xa0aa04ec, 0x30, 0x815f004c, 0x12c0300,
212 0xc000204c, 0x600, 0x3206004c, 0x0, 0x0, 0x0
249 #define calc_overscan(o) interpolate(0x100, 0xe1, 0xc1, o)
251 #define id1 (1LL << 8)
252 #define id2 (1LL << 16)
253 #define id3 (1LL << 24)
254 #define id4 (1LL << 32)
255 #define id5 (1LL << 48)
257 static struct filter_params{
277 {64.311690 *
id5, -39.516924 *
id5, 6.586143 *
id5, 0.000002 *
id5,
278 0.051285 *
id4, 26.168746 *
id4, -4.361449 *
id4, -0.000001 *
id4,
279 9.308169 *
id3, 78.180965 *
id3, -13.030158 *
id3, -0.000001 *
id3,
280 -8.801540 *
id1, -46.572890 *
id1, 7.762145 *
id1, -0.000000 *
id1},
281 {-44.565569 *
id5, -68.081246 *
id5, 39.812074 *
id5, -4.009316 *
id5,
282 29.832207 *
id4, 50.047322 *
id4, -25.380017 *
id4, 2.546422 *
id4,
283 104.605622 *
id3, 141.908641 *
id3, -74.322319 *
id3, 7.484316 *
id3,
284 -37.081621 *
id1, -90.397510 *
id1, 42.784229 *
id1, -4.289952 *
id1},
285 {-56.793244 *
id5, 31.153584 *
id5, -5.192247 *
id5, -0.000003 *
id5,
286 33.541131 *
id4, -34.149302 *
id4, 5.691537 *
id4, 0.000002 *
id4,
287 87.196610 *
id3, -88.995169 *
id3, 14.832456 *
id3, 0.000012 *
id3,
288 17.288138 *
id1, 71.864786 *
id1, -11.977408 *
id1, -0.000009 *
id1},
289 {51.787796 *
id5, 21.211771 *
id5, -18.993730 *
id5, 1.853310 *
id5,
290 -41.470726 *
id4, -17.775823 *
id4, 13.057821 *
id4, -1.15823 *
id4,
291 -154.235673 *
id3, -44.878641 *
id3, 40.656077 *
id3, -3.695595 *
id3,
292 112.201065 *
id1, 39.992155 *
id1, -25.155714 *
id1, 2.113984 *
id1},
297 {67.601979 *
id5, 0.428319 *
id5, -0.071318 *
id5, -0.000012 *
id5,
298 -3.402339 *
id4, 0.000209 *
id4, -0.000092 *
id4, 0.000010 *
id4,
299 -9.180996 *
id3, 6.111270 *
id3, -1.024457 *
id3, 0.001043 *
id3,
300 6.060315 *
id1, -0.017425 *
id1, 0.007830 *
id1, -0.000869 *
id1},
301 {6.755647 *
id5, 5.841348 *
id5, 1.469734 *
id5, -0.149656 *
id5,
302 8.293120 *
id4, -1.192888 *
id4, -0.947652 *
id4, 0.094507 *
id4,
303 37.526655 *
id3, 10.257875 *
id3, -10.823275 *
id3, 1.081497 *
id3,
304 -2.361928 *
id1, -2.059432 *
id1, 1.840671 *
id1, -0.168100 *
id1},
305 {-14.780391 *
id5, -16.042148 *
id5, 2.673692 *
id5, -0.000000 *
id5,
306 39.541978 *
id4, 5.680053 *
id4, -0.946676 *
id4, 0.000000 *
id4,
307 152.994486 *
id3, 12.625439 *
id3, -2.119579 *
id3, 0.002708 *
id3,
308 -38.125089 *
id1, -0.855880 *
id1, 0.155359 *
id1, -0.002245 *
id1},
309 {-27.476193 *
id5, -1.454976 *
id5, 1.286557 *
id5, 0.025346 *
id5,
310 20.687300 *
id4, 3.014003 *
id4, -0.557786 *
id4, -0.01311 *
id4,
311 60.008737 *
id3, -0.738273 *
id3, 5.408217 *
id3, -0.796798 *
id3,
312 -17.296835 *
id1, 4.438577 *
id1, -2.809420 *
id1, 0.385491 *
id1},
316 static void tv_setup_filter(
struct drm_encoder *encoder)
322 &tv_enc->
state.vfilter};
325 int64_t flicker = (tv_enc->
flicker - 50) * (
id3 / 100);
332 for (k = 0; k < 2; k++) {
333 rs[
k] =
max((int64_t)rs[k],
id2);
335 for (j = 0; j < 4; j++) {
336 struct filter_params *
p = &fparams[
k][
j];
338 for (i = 0; i < 7; i++) {
339 int64_t
c = (p->k1 + p->ki*i + p->ki2*i*i +
341 + (p->kr + p->kir*i + p->ki2r*i*i +
342 p->ki3r*i*i*i) * rs[
k]
343 + (p->kf + p->kif*i + p->ki2f*i*i +
344 p->ki3f*i*i*
i) * flicker
345 + (p->krf + p->kirf*i + p->ki2rf*i*i +
346 p->ki3rf*i*i*i) * flicker * rs[
k];
348 (*filters[
k])[j][i] = (c +
id5/2) >> 39
349 & (0x1 << 31 | 0x7f << 9);
363 for (i = 0; i < 4; i++) {
364 for (j = 0; j < 7; j++)
365 regs[i][j] = nv_read_ptv(dev, offsets[i]+4*j);
373 uint32_t offsets[] = { base, base + 0x1c, base + 0x40, base + 0x5c };
375 for (i = 0; i < 4; i++) {
376 for (j = 0; j < 7; j++)
377 nv_write_ptv(dev, offsets[i]+4*j, regs[i][j]);
385 for (i = 0; i < 0x40; i++)
386 state->
tv_enc[i] = nv_read_tv_enc(dev, i);
412 for (i = 0; i < 0x40; i++)
413 nv_write_tv_enc(dev, i, state->
tv_enc[i]);
435 nv_write_tv_enc(dev, 0x3e, 1);
436 nv_write_tv_enc(dev, 0x3e, 0);
443 320, 344, 392, 560, 0, 200, 200, 202, 220, 0,
447 320, 344, 392, 560, 0, 240, 240, 246, 263, 0,
451 400, 432, 496, 640, 0, 300, 300, 303, 314, 0,
455 640, 672, 768, 880, 0, 480, 480, 492, 525, 0,
458 720, 752, 872, 960, 0, 480, 480, 493, 525, 0,
461 720, 776, 856, 960, 0, 576, 576, 588, 597, 0,
464 800, 840, 920, 1040, 0, 600, 600, 604, 618, 0,
467 1024, 1064, 1200, 1344, 0, 768, 768, 777, 806, 0,
482 switch (subconnector) {
518 regs->
tv_enc[0x25] = tv_enc->
hue * 255 / 100;
535 tv_setup_filter(encoder);
552 int overscan, hmargin, vmargin, hratio, vratio;
568 hratio = crtc_mode->
hdisplay * 0x800 /
569 (output_mode->
hdisplay - 2*hmargin);
570 vratio = crtc_mode->
vdisplay * 0x800 /
571 (output_mode->
vdisplay - 2*vmargin) & ~3;