]> git.ipfire.org Git - people/arne_f/kernel.git/blob - drivers/gpu/drm/radeon/radeon_legacy_tv.c
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
[people/arne_f/kernel.git] / drivers / gpu / drm / radeon / radeon_legacy_tv.c
1 // SPDX-License-Identifier: GPL-2.0
2 #include <drm/drmP.h>
3 #include <drm/drm_crtc_helper.h>
4 #include "radeon.h"
5
6 /*
7 * Integrated TV out support based on the GATOS code by
8 * Federico Ulivi <fulivi@lycos.com>
9 */
10
11
12 /*
13 * Limits of h/v positions (hPos & vPos)
14 */
15 #define MAX_H_POSITION 5 /* Range: [-5..5], negative is on the left, 0 is default, positive is on the right */
16 #define MAX_V_POSITION 5 /* Range: [-5..5], negative is up, 0 is default, positive is down */
17
18 /*
19 * Unit for hPos (in TV clock periods)
20 */
21 #define H_POS_UNIT 10
22
23 /*
24 * Indexes in h. code timing table for horizontal line position adjustment
25 */
26 #define H_TABLE_POS1 6
27 #define H_TABLE_POS2 8
28
29 /*
30 * Limits of hor. size (hSize)
31 */
32 #define MAX_H_SIZE 5 /* Range: [-5..5], negative is smaller, positive is larger */
33
34 /* tv standard constants */
35 #define NTSC_TV_CLOCK_T 233
36 #define NTSC_TV_VFTOTAL 1
37 #define NTSC_TV_LINES_PER_FRAME 525
38 #define NTSC_TV_ZERO_H_SIZE 479166
39 #define NTSC_TV_H_SIZE_UNIT 9478
40
41 #define PAL_TV_CLOCK_T 188
42 #define PAL_TV_VFTOTAL 3
43 #define PAL_TV_LINES_PER_FRAME 625
44 #define PAL_TV_ZERO_H_SIZE 473200
45 #define PAL_TV_H_SIZE_UNIT 9360
46
47 /* tv pll setting for 27 mhz ref clk */
48 #define NTSC_TV_PLL_M_27 22
49 #define NTSC_TV_PLL_N_27 175
50 #define NTSC_TV_PLL_P_27 5
51
52 #define PAL_TV_PLL_M_27 113
53 #define PAL_TV_PLL_N_27 668
54 #define PAL_TV_PLL_P_27 3
55
56 /* tv pll setting for 14 mhz ref clk */
57 #define NTSC_TV_PLL_M_14 33
58 #define NTSC_TV_PLL_N_14 693
59 #define NTSC_TV_PLL_P_14 7
60
61 #define PAL_TV_PLL_M_14 19
62 #define PAL_TV_PLL_N_14 353
63 #define PAL_TV_PLL_P_14 5
64
65 #define VERT_LEAD_IN_LINES 2
66 #define FRAC_BITS 0xe
67 #define FRAC_MASK 0x3fff
68
69 struct radeon_tv_mode_constants {
70 uint16_t hor_resolution;
71 uint16_t ver_resolution;
72 enum radeon_tv_std standard;
73 uint16_t hor_total;
74 uint16_t ver_total;
75 uint16_t hor_start;
76 uint16_t hor_syncstart;
77 uint16_t ver_syncstart;
78 unsigned def_restart;
79 uint16_t crtcPLL_N;
80 uint8_t crtcPLL_M;
81 uint8_t crtcPLL_post_div;
82 unsigned pix_to_tv;
83 };
84
85 static const uint16_t hor_timing_NTSC[MAX_H_CODE_TIMING_LEN] = {
86 0x0007,
87 0x003f,
88 0x0263,
89 0x0a24,
90 0x2a6b,
91 0x0a36,
92 0x126d, /* H_TABLE_POS1 */
93 0x1bfe,
94 0x1a8f, /* H_TABLE_POS2 */
95 0x1ec7,
96 0x3863,
97 0x1bfe,
98 0x1bfe,
99 0x1a2a,
100 0x1e95,
101 0x0e31,
102 0x201b,
103 0
104 };
105
106 static const uint16_t vert_timing_NTSC[MAX_V_CODE_TIMING_LEN] = {
107 0x2001,
108 0x200d,
109 0x1006,
110 0x0c06,
111 0x1006,
112 0x1818,
113 0x21e3,
114 0x1006,
115 0x0c06,
116 0x1006,
117 0x1817,
118 0x21d4,
119 0x0002,
120 0
121 };
122
123 static const uint16_t hor_timing_PAL[MAX_H_CODE_TIMING_LEN] = {
124 0x0007,
125 0x0058,
126 0x027c,
127 0x0a31,
128 0x2a77,
129 0x0a95,
130 0x124f, /* H_TABLE_POS1 */
131 0x1bfe,
132 0x1b22, /* H_TABLE_POS2 */
133 0x1ef9,
134 0x387c,
135 0x1bfe,
136 0x1bfe,
137 0x1b31,
138 0x1eb5,
139 0x0e43,
140 0x201b,
141 0
142 };
143
144 static const uint16_t vert_timing_PAL[MAX_V_CODE_TIMING_LEN] = {
145 0x2001,
146 0x200c,
147 0x1005,
148 0x0c05,
149 0x1005,
150 0x1401,
151 0x1821,
152 0x2240,
153 0x1005,
154 0x0c05,
155 0x1005,
156 0x1401,
157 0x1822,
158 0x2230,
159 0x0002,
160 0
161 };
162
163 /**********************************************************************
164 *
165 * availableModes
166 *
167 * Table of all allowed modes for tv output
168 *
169 **********************************************************************/
170 static const struct radeon_tv_mode_constants available_tv_modes[] = {
171 { /* NTSC timing for 27 Mhz ref clk */
172 800, /* horResolution */
173 600, /* verResolution */
174 TV_STD_NTSC, /* standard */
175 990, /* horTotal */
176 740, /* verTotal */
177 813, /* horStart */
178 824, /* horSyncStart */
179 632, /* verSyncStart */
180 625592, /* defRestart */
181 592, /* crtcPLL_N */
182 91, /* crtcPLL_M */
183 4, /* crtcPLL_postDiv */
184 1022, /* pixToTV */
185 },
186 { /* PAL timing for 27 Mhz ref clk */
187 800, /* horResolution */
188 600, /* verResolution */
189 TV_STD_PAL, /* standard */
190 1144, /* horTotal */
191 706, /* verTotal */
192 812, /* horStart */
193 824, /* horSyncStart */
194 669, /* verSyncStart */
195 696700, /* defRestart */
196 1382, /* crtcPLL_N */
197 231, /* crtcPLL_M */
198 4, /* crtcPLL_postDiv */
199 759, /* pixToTV */
200 },
201 { /* NTSC timing for 14 Mhz ref clk */
202 800, /* horResolution */
203 600, /* verResolution */
204 TV_STD_NTSC, /* standard */
205 1018, /* horTotal */
206 727, /* verTotal */
207 813, /* horStart */
208 840, /* horSyncStart */
209 633, /* verSyncStart */
210 630627, /* defRestart */
211 347, /* crtcPLL_N */
212 14, /* crtcPLL_M */
213 8, /* crtcPLL_postDiv */
214 1022, /* pixToTV */
215 },
216 { /* PAL timing for 14 Mhz ref clk */
217 800, /* horResolution */
218 600, /* verResolution */
219 TV_STD_PAL, /* standard */
220 1131, /* horTotal */
221 742, /* verTotal */
222 813, /* horStart */
223 840, /* horSyncStart */
224 633, /* verSyncStart */
225 708369, /* defRestart */
226 211, /* crtcPLL_N */
227 9, /* crtcPLL_M */
228 8, /* crtcPLL_postDiv */
229 759, /* pixToTV */
230 },
231 };
232
233 #define N_AVAILABLE_MODES ARRAY_SIZE(available_tv_modes)
234
235 static const struct radeon_tv_mode_constants *radeon_legacy_tv_get_std_mode(struct radeon_encoder *radeon_encoder,
236 uint16_t *pll_ref_freq)
237 {
238 struct drm_device *dev = radeon_encoder->base.dev;
239 struct radeon_device *rdev = dev->dev_private;
240 struct radeon_crtc *radeon_crtc;
241 struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
242 const struct radeon_tv_mode_constants *const_ptr;
243 struct radeon_pll *pll;
244
245 radeon_crtc = to_radeon_crtc(radeon_encoder->base.crtc);
246 if (radeon_crtc->crtc_id == 1)
247 pll = &rdev->clock.p2pll;
248 else
249 pll = &rdev->clock.p1pll;
250
251 if (pll_ref_freq)
252 *pll_ref_freq = pll->reference_freq;
253
254 if (tv_dac->tv_std == TV_STD_NTSC ||
255 tv_dac->tv_std == TV_STD_NTSC_J ||
256 tv_dac->tv_std == TV_STD_PAL_M) {
257 if (pll->reference_freq == 2700)
258 const_ptr = &available_tv_modes[0];
259 else
260 const_ptr = &available_tv_modes[2];
261 } else {
262 if (pll->reference_freq == 2700)
263 const_ptr = &available_tv_modes[1];
264 else
265 const_ptr = &available_tv_modes[3];
266 }
267 return const_ptr;
268 }
269
270 static long YCOEF_value[5] = { 2, 2, 0, 4, 0 };
271 static long YCOEF_EN_value[5] = { 1, 1, 0, 1, 0 };
272 static long SLOPE_value[5] = { 1, 2, 2, 4, 8 };
273 static long SLOPE_limit[5] = { 6, 5, 4, 3, 2 };
274
275 static void radeon_wait_pll_lock(struct drm_encoder *encoder, unsigned n_tests,
276 unsigned n_wait_loops, unsigned cnt_threshold)
277 {
278 struct drm_device *dev = encoder->dev;
279 struct radeon_device *rdev = dev->dev_private;
280 uint32_t save_pll_test;
281 unsigned int i, j;
282
283 WREG32(RADEON_TEST_DEBUG_MUX, (RREG32(RADEON_TEST_DEBUG_MUX) & 0xffff60ff) | 0x100);
284 save_pll_test = RREG32_PLL(RADEON_PLL_TEST_CNTL);
285 WREG32_PLL(RADEON_PLL_TEST_CNTL, save_pll_test & ~RADEON_PLL_MASK_READ_B);
286
287 WREG8(RADEON_CLOCK_CNTL_INDEX, RADEON_PLL_TEST_CNTL);
288 for (i = 0; i < n_tests; i++) {
289 WREG8(RADEON_CLOCK_CNTL_DATA + 3, 0);
290 for (j = 0; j < n_wait_loops; j++)
291 if (RREG8(RADEON_CLOCK_CNTL_DATA + 3) >= cnt_threshold)
292 break;
293 }
294 WREG32_PLL(RADEON_PLL_TEST_CNTL, save_pll_test);
295 WREG32(RADEON_TEST_DEBUG_MUX, RREG32(RADEON_TEST_DEBUG_MUX) & 0xffffe0ff);
296 }
297
298
299 static void radeon_legacy_tv_write_fifo(struct radeon_encoder *radeon_encoder,
300 uint16_t addr, uint32_t value)
301 {
302 struct drm_device *dev = radeon_encoder->base.dev;
303 struct radeon_device *rdev = dev->dev_private;
304 uint32_t tmp;
305 int i = 0;
306
307 WREG32(RADEON_TV_HOST_WRITE_DATA, value);
308
309 WREG32(RADEON_TV_HOST_RD_WT_CNTL, addr);
310 WREG32(RADEON_TV_HOST_RD_WT_CNTL, addr | RADEON_HOST_FIFO_WT);
311
312 do {
313 tmp = RREG32(RADEON_TV_HOST_RD_WT_CNTL);
314 if ((tmp & RADEON_HOST_FIFO_WT_ACK) == 0)
315 break;
316 i++;
317 } while (i < 10000);
318 WREG32(RADEON_TV_HOST_RD_WT_CNTL, 0);
319 }
320
321 #if 0 /* included for completeness */
322 static uint32_t radeon_legacy_tv_read_fifo(struct radeon_encoder *radeon_encoder, uint16_t addr)
323 {
324 struct drm_device *dev = radeon_encoder->base.dev;
325 struct radeon_device *rdev = dev->dev_private;
326 uint32_t tmp;
327 int i = 0;
328
329 WREG32(RADEON_TV_HOST_RD_WT_CNTL, addr);
330 WREG32(RADEON_TV_HOST_RD_WT_CNTL, addr | RADEON_HOST_FIFO_RD);
331
332 do {
333 tmp = RREG32(RADEON_TV_HOST_RD_WT_CNTL);
334 if ((tmp & RADEON_HOST_FIFO_RD_ACK) == 0)
335 break;
336 i++;
337 } while (i < 10000);
338 WREG32(RADEON_TV_HOST_RD_WT_CNTL, 0);
339 return RREG32(RADEON_TV_HOST_READ_DATA);
340 }
341 #endif
342
343 static uint16_t radeon_get_htiming_tables_addr(uint32_t tv_uv_adr)
344 {
345 uint16_t h_table;
346
347 switch ((tv_uv_adr & RADEON_HCODE_TABLE_SEL_MASK) >> RADEON_HCODE_TABLE_SEL_SHIFT) {
348 case 0:
349 h_table = RADEON_TV_MAX_FIFO_ADDR_INTERNAL;
350 break;
351 case 1:
352 h_table = ((tv_uv_adr & RADEON_TABLE1_BOT_ADR_MASK) >> RADEON_TABLE1_BOT_ADR_SHIFT) * 2;
353 break;
354 case 2:
355 h_table = ((tv_uv_adr & RADEON_TABLE3_TOP_ADR_MASK) >> RADEON_TABLE3_TOP_ADR_SHIFT) * 2;
356 break;
357 default:
358 h_table = 0;
359 break;
360 }
361 return h_table;
362 }
363
364 static uint16_t radeon_get_vtiming_tables_addr(uint32_t tv_uv_adr)
365 {
366 uint16_t v_table;
367
368 switch ((tv_uv_adr & RADEON_VCODE_TABLE_SEL_MASK) >> RADEON_VCODE_TABLE_SEL_SHIFT) {
369 case 0:
370 v_table = ((tv_uv_adr & RADEON_MAX_UV_ADR_MASK) >> RADEON_MAX_UV_ADR_SHIFT) * 2 + 1;
371 break;
372 case 1:
373 v_table = ((tv_uv_adr & RADEON_TABLE1_BOT_ADR_MASK) >> RADEON_TABLE1_BOT_ADR_SHIFT) * 2 + 1;
374 break;
375 case 2:
376 v_table = ((tv_uv_adr & RADEON_TABLE3_TOP_ADR_MASK) >> RADEON_TABLE3_TOP_ADR_SHIFT) * 2 + 1;
377 break;
378 default:
379 v_table = 0;
380 break;
381 }
382 return v_table;
383 }
384
385 static void radeon_restore_tv_timing_tables(struct radeon_encoder *radeon_encoder)
386 {
387 struct drm_device *dev = radeon_encoder->base.dev;
388 struct radeon_device *rdev = dev->dev_private;
389 struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
390 uint16_t h_table, v_table;
391 uint32_t tmp;
392 int i;
393
394 WREG32(RADEON_TV_UV_ADR, tv_dac->tv.tv_uv_adr);
395 h_table = radeon_get_htiming_tables_addr(tv_dac->tv.tv_uv_adr);
396 v_table = radeon_get_vtiming_tables_addr(tv_dac->tv.tv_uv_adr);
397
398 for (i = 0; i < MAX_H_CODE_TIMING_LEN; i += 2, h_table--) {
399 tmp = ((uint32_t)tv_dac->tv.h_code_timing[i] << 14) | ((uint32_t)tv_dac->tv.h_code_timing[i+1]);
400 radeon_legacy_tv_write_fifo(radeon_encoder, h_table, tmp);
401 if (tv_dac->tv.h_code_timing[i] == 0 || tv_dac->tv.h_code_timing[i + 1] == 0)
402 break;
403 }
404 for (i = 0; i < MAX_V_CODE_TIMING_LEN; i += 2, v_table++) {
405 tmp = ((uint32_t)tv_dac->tv.v_code_timing[i+1] << 14) | ((uint32_t)tv_dac->tv.v_code_timing[i]);
406 radeon_legacy_tv_write_fifo(radeon_encoder, v_table, tmp);
407 if (tv_dac->tv.v_code_timing[i] == 0 || tv_dac->tv.v_code_timing[i + 1] == 0)
408 break;
409 }
410 }
411
412 static void radeon_legacy_write_tv_restarts(struct radeon_encoder *radeon_encoder)
413 {
414 struct drm_device *dev = radeon_encoder->base.dev;
415 struct radeon_device *rdev = dev->dev_private;
416 struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
417 WREG32(RADEON_TV_FRESTART, tv_dac->tv.frestart);
418 WREG32(RADEON_TV_HRESTART, tv_dac->tv.hrestart);
419 WREG32(RADEON_TV_VRESTART, tv_dac->tv.vrestart);
420 }
421
422 static bool radeon_legacy_tv_init_restarts(struct drm_encoder *encoder)
423 {
424 struct drm_device *dev = encoder->dev;
425 struct radeon_device *rdev = dev->dev_private;
426 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
427 struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
428 struct radeon_crtc *radeon_crtc;
429 int restart;
430 unsigned int h_total, v_total, f_total;
431 int v_offset, h_offset;
432 u16 p1, p2, h_inc;
433 bool h_changed;
434 const struct radeon_tv_mode_constants *const_ptr;
435 struct radeon_pll *pll;
436
437 radeon_crtc = to_radeon_crtc(radeon_encoder->base.crtc);
438 if (radeon_crtc->crtc_id == 1)
439 pll = &rdev->clock.p2pll;
440 else
441 pll = &rdev->clock.p1pll;
442
443 const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
444 if (!const_ptr)
445 return false;
446
447 h_total = const_ptr->hor_total;
448 v_total = const_ptr->ver_total;
449
450 if (tv_dac->tv_std == TV_STD_NTSC ||
451 tv_dac->tv_std == TV_STD_NTSC_J ||
452 tv_dac->tv_std == TV_STD_PAL_M ||
453 tv_dac->tv_std == TV_STD_PAL_60)
454 f_total = NTSC_TV_VFTOTAL + 1;
455 else
456 f_total = PAL_TV_VFTOTAL + 1;
457
458 /* adjust positions 1&2 in hor. cod timing table */
459 h_offset = tv_dac->h_pos * H_POS_UNIT;
460
461 if (tv_dac->tv_std == TV_STD_NTSC ||
462 tv_dac->tv_std == TV_STD_NTSC_J ||
463 tv_dac->tv_std == TV_STD_PAL_M) {
464 h_offset -= 50;
465 p1 = hor_timing_NTSC[H_TABLE_POS1];
466 p2 = hor_timing_NTSC[H_TABLE_POS2];
467 } else {
468 p1 = hor_timing_PAL[H_TABLE_POS1];
469 p2 = hor_timing_PAL[H_TABLE_POS2];
470 }
471
472 p1 = (u16)((int)p1 + h_offset);
473 p2 = (u16)((int)p2 - h_offset);
474
475 h_changed = (p1 != tv_dac->tv.h_code_timing[H_TABLE_POS1] ||
476 p2 != tv_dac->tv.h_code_timing[H_TABLE_POS2]);
477
478 tv_dac->tv.h_code_timing[H_TABLE_POS1] = p1;
479 tv_dac->tv.h_code_timing[H_TABLE_POS2] = p2;
480
481 /* Convert hOffset from n. of TV clock periods to n. of CRTC clock periods (CRTC pixels) */
482 h_offset = (h_offset * (int)(const_ptr->pix_to_tv)) / 1000;
483
484 /* adjust restart */
485 restart = const_ptr->def_restart;
486
487 /*
488 * convert v_pos TV lines to n. of CRTC pixels
489 */
490 if (tv_dac->tv_std == TV_STD_NTSC ||
491 tv_dac->tv_std == TV_STD_NTSC_J ||
492 tv_dac->tv_std == TV_STD_PAL_M ||
493 tv_dac->tv_std == TV_STD_PAL_60)
494 v_offset = ((int)(v_total * h_total) * 2 * tv_dac->v_pos) / (int)(NTSC_TV_LINES_PER_FRAME);
495 else
496 v_offset = ((int)(v_total * h_total) * 2 * tv_dac->v_pos) / (int)(PAL_TV_LINES_PER_FRAME);
497
498 restart -= v_offset + h_offset;
499
500 DRM_DEBUG_KMS("compute_restarts: def = %u h = %d v = %d, p1 = %04x, p2 = %04x, restart = %d\n",
501 const_ptr->def_restart, tv_dac->h_pos, tv_dac->v_pos, p1, p2, restart);
502
503 tv_dac->tv.hrestart = restart % h_total;
504 restart /= h_total;
505 tv_dac->tv.vrestart = restart % v_total;
506 restart /= v_total;
507 tv_dac->tv.frestart = restart % f_total;
508
509 DRM_DEBUG_KMS("compute_restart: F/H/V=%u,%u,%u\n",
510 (unsigned)tv_dac->tv.frestart,
511 (unsigned)tv_dac->tv.vrestart,
512 (unsigned)tv_dac->tv.hrestart);
513
514 /* compute h_inc from hsize */
515 if (tv_dac->tv_std == TV_STD_NTSC ||
516 tv_dac->tv_std == TV_STD_NTSC_J ||
517 tv_dac->tv_std == TV_STD_PAL_M)
518 h_inc = (u16)((int)(const_ptr->hor_resolution * 4096 * NTSC_TV_CLOCK_T) /
519 (tv_dac->h_size * (int)(NTSC_TV_H_SIZE_UNIT) + (int)(NTSC_TV_ZERO_H_SIZE)));
520 else
521 h_inc = (u16)((int)(const_ptr->hor_resolution * 4096 * PAL_TV_CLOCK_T) /
522 (tv_dac->h_size * (int)(PAL_TV_H_SIZE_UNIT) + (int)(PAL_TV_ZERO_H_SIZE)));
523
524 tv_dac->tv.timing_cntl = (tv_dac->tv.timing_cntl & ~RADEON_H_INC_MASK) |
525 ((u32)h_inc << RADEON_H_INC_SHIFT);
526
527 DRM_DEBUG_KMS("compute_restart: h_size = %d h_inc = %d\n", tv_dac->h_size, h_inc);
528
529 return h_changed;
530 }
531
532 void radeon_legacy_tv_mode_set(struct drm_encoder *encoder,
533 struct drm_display_mode *mode,
534 struct drm_display_mode *adjusted_mode)
535 {
536 struct drm_device *dev = encoder->dev;
537 struct radeon_device *rdev = dev->dev_private;
538 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
539 struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv;
540 const struct radeon_tv_mode_constants *const_ptr;
541 struct radeon_crtc *radeon_crtc;
542 int i;
543 uint16_t pll_ref_freq;
544 uint32_t vert_space, flicker_removal, tmp;
545 uint32_t tv_master_cntl, tv_rgb_cntl, tv_dac_cntl;
546 uint32_t tv_modulator_cntl1, tv_modulator_cntl2;
547 uint32_t tv_vscaler_cntl1, tv_vscaler_cntl2;
548 uint32_t tv_pll_cntl, tv_pll_cntl1, tv_ftotal;
549 uint32_t tv_y_fall_cntl, tv_y_rise_cntl, tv_y_saw_tooth_cntl;
550 uint32_t m, n, p;
551 const uint16_t *hor_timing;
552 const uint16_t *vert_timing;
553
554 const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, &pll_ref_freq);
555 if (!const_ptr)
556 return;
557
558 radeon_crtc = to_radeon_crtc(encoder->crtc);
559
560 tv_master_cntl = (RADEON_VIN_ASYNC_RST |
561 RADEON_CRT_FIFO_CE_EN |
562 RADEON_TV_FIFO_CE_EN |
563 RADEON_TV_ON);
564
565 if (!ASIC_IS_R300(rdev))
566 tv_master_cntl |= RADEON_TVCLK_ALWAYS_ONb;
567
568 if (tv_dac->tv_std == TV_STD_NTSC ||
569 tv_dac->tv_std == TV_STD_NTSC_J)
570 tv_master_cntl |= RADEON_RESTART_PHASE_FIX;
571
572 tv_modulator_cntl1 = (RADEON_SLEW_RATE_LIMIT |
573 RADEON_SYNC_TIP_LEVEL |
574 RADEON_YFLT_EN |
575 RADEON_UVFLT_EN |
576 (6 << RADEON_CY_FILT_BLEND_SHIFT));
577
578 if (tv_dac->tv_std == TV_STD_NTSC ||
579 tv_dac->tv_std == TV_STD_NTSC_J) {
580 tv_modulator_cntl1 |= (0x46 << RADEON_SET_UP_LEVEL_SHIFT) |
581 (0x3b << RADEON_BLANK_LEVEL_SHIFT);
582 tv_modulator_cntl2 = (-111 & RADEON_TV_U_BURST_LEVEL_MASK) |
583 ((0 & RADEON_TV_V_BURST_LEVEL_MASK) << RADEON_TV_V_BURST_LEVEL_SHIFT);
584 } else if (tv_dac->tv_std == TV_STD_SCART_PAL) {
585 tv_modulator_cntl1 |= RADEON_ALT_PHASE_EN;
586 tv_modulator_cntl2 = (0 & RADEON_TV_U_BURST_LEVEL_MASK) |
587 ((0 & RADEON_TV_V_BURST_LEVEL_MASK) << RADEON_TV_V_BURST_LEVEL_SHIFT);
588 } else {
589 tv_modulator_cntl1 |= RADEON_ALT_PHASE_EN |
590 (0x3b << RADEON_SET_UP_LEVEL_SHIFT) |
591 (0x3b << RADEON_BLANK_LEVEL_SHIFT);
592 tv_modulator_cntl2 = (-78 & RADEON_TV_U_BURST_LEVEL_MASK) |
593 ((62 & RADEON_TV_V_BURST_LEVEL_MASK) << RADEON_TV_V_BURST_LEVEL_SHIFT);
594 }
595
596
597 tv_rgb_cntl = (RADEON_RGB_DITHER_EN
598 | RADEON_TVOUT_SCALE_EN
599 | (0x0b << RADEON_UVRAM_READ_MARGIN_SHIFT)
600 | (0x07 << RADEON_FIFORAM_FFMACRO_READ_MARGIN_SHIFT)
601 | RADEON_RGB_ATTEN_SEL(0x3)
602 | RADEON_RGB_ATTEN_VAL(0xc));
603
604 if (radeon_crtc->crtc_id == 1)
605 tv_rgb_cntl |= RADEON_RGB_SRC_SEL_CRTC2;
606 else {
607 if (radeon_crtc->rmx_type != RMX_OFF)
608 tv_rgb_cntl |= RADEON_RGB_SRC_SEL_RMX;
609 else
610 tv_rgb_cntl |= RADEON_RGB_SRC_SEL_CRTC1;
611 }
612
613 if (tv_dac->tv_std == TV_STD_NTSC ||
614 tv_dac->tv_std == TV_STD_NTSC_J ||
615 tv_dac->tv_std == TV_STD_PAL_M ||
616 tv_dac->tv_std == TV_STD_PAL_60)
617 vert_space = const_ptr->ver_total * 2 * 10000 / NTSC_TV_LINES_PER_FRAME;
618 else
619 vert_space = const_ptr->ver_total * 2 * 10000 / PAL_TV_LINES_PER_FRAME;
620
621 tmp = RREG32(RADEON_TV_VSCALER_CNTL1);
622 tmp &= 0xe3ff0000;
623 tmp |= (vert_space * (1 << FRAC_BITS) / 10000);
624 tv_vscaler_cntl1 = tmp;
625
626 if (pll_ref_freq == 2700)
627 tv_vscaler_cntl1 |= RADEON_RESTART_FIELD;
628
629 if (const_ptr->hor_resolution == 1024)
630 tv_vscaler_cntl1 |= (4 << RADEON_Y_DEL_W_SIG_SHIFT);
631 else
632 tv_vscaler_cntl1 |= (2 << RADEON_Y_DEL_W_SIG_SHIFT);
633
634 /* scale up for int divide */
635 tmp = const_ptr->ver_total * 2 * 1000;
636 if (tv_dac->tv_std == TV_STD_NTSC ||
637 tv_dac->tv_std == TV_STD_NTSC_J ||
638 tv_dac->tv_std == TV_STD_PAL_M ||
639 tv_dac->tv_std == TV_STD_PAL_60) {
640 tmp /= NTSC_TV_LINES_PER_FRAME;
641 } else {
642 tmp /= PAL_TV_LINES_PER_FRAME;
643 }
644 flicker_removal = (tmp + 500) / 1000;
645
646 if (flicker_removal < 3)
647 flicker_removal = 3;
648 for (i = 0; i < ARRAY_SIZE(SLOPE_limit); ++i) {
649 if (flicker_removal == SLOPE_limit[i])
650 break;
651 }
652
653 tv_y_saw_tooth_cntl = (vert_space * SLOPE_value[i] * (1 << (FRAC_BITS - 1)) +
654 5001) / 10000 / 8 | ((SLOPE_value[i] *
655 (1 << (FRAC_BITS - 1)) / 8) << 16);
656 tv_y_fall_cntl =
657 (YCOEF_EN_value[i] << 17) | ((YCOEF_value[i] * (1 << 8) / 8) << 24) |
658 RADEON_Y_FALL_PING_PONG | (272 * SLOPE_value[i] / 8) * (1 << (FRAC_BITS - 1)) /
659 1024;
660 tv_y_rise_cntl = RADEON_Y_RISE_PING_PONG|
661 (flicker_removal * 1024 - 272) * SLOPE_value[i] / 8 * (1 << (FRAC_BITS - 1)) / 1024;
662
663 tv_vscaler_cntl2 = RREG32(RADEON_TV_VSCALER_CNTL2) & 0x00fffff0;
664 tv_vscaler_cntl2 |= (0x10 << 24) |
665 RADEON_DITHER_MODE |
666 RADEON_Y_OUTPUT_DITHER_EN |
667 RADEON_UV_OUTPUT_DITHER_EN |
668 RADEON_UV_TO_BUF_DITHER_EN;
669
670 tmp = (tv_vscaler_cntl1 >> RADEON_UV_INC_SHIFT) & RADEON_UV_INC_MASK;
671 tmp = ((16384 * 256 * 10) / tmp + 5) / 10;
672 tmp = (tmp << RADEON_UV_OUTPUT_POST_SCALE_SHIFT) | 0x000b0000;
673 tv_dac->tv.timing_cntl = tmp;
674
675 if (tv_dac->tv_std == TV_STD_NTSC ||
676 tv_dac->tv_std == TV_STD_NTSC_J ||
677 tv_dac->tv_std == TV_STD_PAL_M ||
678 tv_dac->tv_std == TV_STD_PAL_60)
679 tv_dac_cntl = tv_dac->ntsc_tvdac_adj;
680 else
681 tv_dac_cntl = tv_dac->pal_tvdac_adj;
682
683 tv_dac_cntl |= RADEON_TV_DAC_NBLANK | RADEON_TV_DAC_NHOLD;
684
685 if (tv_dac->tv_std == TV_STD_NTSC ||
686 tv_dac->tv_std == TV_STD_NTSC_J)
687 tv_dac_cntl |= RADEON_TV_DAC_STD_NTSC;
688 else
689 tv_dac_cntl |= RADEON_TV_DAC_STD_PAL;
690
691 if (tv_dac->tv_std == TV_STD_NTSC ||
692 tv_dac->tv_std == TV_STD_NTSC_J) {
693 if (pll_ref_freq == 2700) {
694 m = NTSC_TV_PLL_M_27;
695 n = NTSC_TV_PLL_N_27;
696 p = NTSC_TV_PLL_P_27;
697 } else {
698 m = NTSC_TV_PLL_M_14;
699 n = NTSC_TV_PLL_N_14;
700 p = NTSC_TV_PLL_P_14;
701 }
702 } else {
703 if (pll_ref_freq == 2700) {
704 m = PAL_TV_PLL_M_27;
705 n = PAL_TV_PLL_N_27;
706 p = PAL_TV_PLL_P_27;
707 } else {
708 m = PAL_TV_PLL_M_14;
709 n = PAL_TV_PLL_N_14;
710 p = PAL_TV_PLL_P_14;
711 }
712 }
713
714 tv_pll_cntl = (m & RADEON_TV_M0LO_MASK) |
715 (((m >> 8) & RADEON_TV_M0HI_MASK) << RADEON_TV_M0HI_SHIFT) |
716 ((n & RADEON_TV_N0LO_MASK) << RADEON_TV_N0LO_SHIFT) |
717 (((n >> 9) & RADEON_TV_N0HI_MASK) << RADEON_TV_N0HI_SHIFT) |
718 ((p & RADEON_TV_P_MASK) << RADEON_TV_P_SHIFT);
719
720 tv_pll_cntl1 = (((4 & RADEON_TVPCP_MASK) << RADEON_TVPCP_SHIFT) |
721 ((4 & RADEON_TVPVG_MASK) << RADEON_TVPVG_SHIFT) |
722 ((1 & RADEON_TVPDC_MASK) << RADEON_TVPDC_SHIFT) |
723 RADEON_TVCLK_SRC_SEL_TVPLL |
724 RADEON_TVPLL_TEST_DIS);
725
726 tv_dac->tv.tv_uv_adr = 0xc8;
727
728 if (tv_dac->tv_std == TV_STD_NTSC ||
729 tv_dac->tv_std == TV_STD_NTSC_J ||
730 tv_dac->tv_std == TV_STD_PAL_M ||
731 tv_dac->tv_std == TV_STD_PAL_60) {
732 tv_ftotal = NTSC_TV_VFTOTAL;
733 hor_timing = hor_timing_NTSC;
734 vert_timing = vert_timing_NTSC;
735 } else {
736 hor_timing = hor_timing_PAL;
737 vert_timing = vert_timing_PAL;
738 tv_ftotal = PAL_TV_VFTOTAL;
739 }
740
741 for (i = 0; i < MAX_H_CODE_TIMING_LEN; i++) {
742 if ((tv_dac->tv.h_code_timing[i] = hor_timing[i]) == 0)
743 break;
744 }
745
746 for (i = 0; i < MAX_V_CODE_TIMING_LEN; i++) {
747 if ((tv_dac->tv.v_code_timing[i] = vert_timing[i]) == 0)
748 break;
749 }
750
751 radeon_legacy_tv_init_restarts(encoder);
752
753 /* play with DAC_CNTL */
754 /* play with GPIOPAD_A */
755 /* DISP_OUTPUT_CNTL */
756 /* use reference freq */
757
758 /* program the TV registers */
759 WREG32(RADEON_TV_MASTER_CNTL, (tv_master_cntl | RADEON_TV_ASYNC_RST |
760 RADEON_CRT_ASYNC_RST | RADEON_TV_FIFO_ASYNC_RST));
761
762 tmp = RREG32(RADEON_TV_DAC_CNTL);
763 tmp &= ~RADEON_TV_DAC_NBLANK;
764 tmp |= RADEON_TV_DAC_BGSLEEP |
765 RADEON_TV_DAC_RDACPD |
766 RADEON_TV_DAC_GDACPD |
767 RADEON_TV_DAC_BDACPD;
768 WREG32(RADEON_TV_DAC_CNTL, tmp);
769
770 /* TV PLL */
771 WREG32_PLL_P(RADEON_TV_PLL_CNTL1, 0, ~RADEON_TVCLK_SRC_SEL_TVPLL);
772 WREG32_PLL(RADEON_TV_PLL_CNTL, tv_pll_cntl);
773 WREG32_PLL_P(RADEON_TV_PLL_CNTL1, RADEON_TVPLL_RESET, ~RADEON_TVPLL_RESET);
774
775 radeon_wait_pll_lock(encoder, 200, 800, 135);
776
777 WREG32_PLL_P(RADEON_TV_PLL_CNTL1, 0, ~RADEON_TVPLL_RESET);
778
779 radeon_wait_pll_lock(encoder, 300, 160, 27);
780 radeon_wait_pll_lock(encoder, 200, 800, 135);
781
782 WREG32_PLL_P(RADEON_TV_PLL_CNTL1, 0, ~0xf);
783 WREG32_PLL_P(RADEON_TV_PLL_CNTL1, RADEON_TVCLK_SRC_SEL_TVPLL, ~RADEON_TVCLK_SRC_SEL_TVPLL);
784
785 WREG32_PLL_P(RADEON_TV_PLL_CNTL1, (1 << RADEON_TVPDC_SHIFT), ~RADEON_TVPDC_MASK);
786 WREG32_PLL_P(RADEON_TV_PLL_CNTL1, 0, ~RADEON_TVPLL_SLEEP);
787
788 /* TV HV */
789 WREG32(RADEON_TV_RGB_CNTL, tv_rgb_cntl);
790 WREG32(RADEON_TV_HTOTAL, const_ptr->hor_total - 1);
791 WREG32(RADEON_TV_HDISP, const_ptr->hor_resolution - 1);
792 WREG32(RADEON_TV_HSTART, const_ptr->hor_start);
793
794 WREG32(RADEON_TV_VTOTAL, const_ptr->ver_total - 1);
795 WREG32(RADEON_TV_VDISP, const_ptr->ver_resolution - 1);
796 WREG32(RADEON_TV_FTOTAL, tv_ftotal);
797 WREG32(RADEON_TV_VSCALER_CNTL1, tv_vscaler_cntl1);
798 WREG32(RADEON_TV_VSCALER_CNTL2, tv_vscaler_cntl2);
799
800 WREG32(RADEON_TV_Y_FALL_CNTL, tv_y_fall_cntl);
801 WREG32(RADEON_TV_Y_RISE_CNTL, tv_y_rise_cntl);
802 WREG32(RADEON_TV_Y_SAW_TOOTH_CNTL, tv_y_saw_tooth_cntl);
803
804 WREG32(RADEON_TV_MASTER_CNTL, (tv_master_cntl | RADEON_TV_ASYNC_RST |
805 RADEON_CRT_ASYNC_RST));
806
807 /* TV restarts */
808 radeon_legacy_write_tv_restarts(radeon_encoder);
809
810 /* tv timings */
811 radeon_restore_tv_timing_tables(radeon_encoder);
812
813 WREG32(RADEON_TV_MASTER_CNTL, (tv_master_cntl | RADEON_TV_ASYNC_RST));
814
815 /* tv std */
816 WREG32(RADEON_TV_SYNC_CNTL, (RADEON_SYNC_PUB | RADEON_TV_SYNC_IO_DRIVE));
817 WREG32(RADEON_TV_TIMING_CNTL, tv_dac->tv.timing_cntl);
818 WREG32(RADEON_TV_MODULATOR_CNTL1, tv_modulator_cntl1);
819 WREG32(RADEON_TV_MODULATOR_CNTL2, tv_modulator_cntl2);
820 WREG32(RADEON_TV_PRE_DAC_MUX_CNTL, (RADEON_Y_RED_EN |
821 RADEON_C_GRN_EN |
822 RADEON_CMP_BLU_EN |
823 RADEON_DAC_DITHER_EN));
824
825 WREG32(RADEON_TV_CRC_CNTL, 0);
826
827 WREG32(RADEON_TV_MASTER_CNTL, tv_master_cntl);
828
829 WREG32(RADEON_TV_GAIN_LIMIT_SETTINGS, ((0x17f << RADEON_UV_GAIN_LIMIT_SHIFT) |
830 (0x5ff << RADEON_Y_GAIN_LIMIT_SHIFT)));
831 WREG32(RADEON_TV_LINEAR_GAIN_SETTINGS, ((0x100 << RADEON_UV_GAIN_SHIFT) |
832 (0x100 << RADEON_Y_GAIN_SHIFT)));
833
834 WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl);
835
836 }
837
838 void radeon_legacy_tv_adjust_crtc_reg(struct drm_encoder *encoder,
839 uint32_t *h_total_disp, uint32_t *h_sync_strt_wid,
840 uint32_t *v_total_disp, uint32_t *v_sync_strt_wid)
841 {
842 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
843 const struct radeon_tv_mode_constants *const_ptr;
844 uint32_t tmp;
845
846 const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
847 if (!const_ptr)
848 return;
849
850 *h_total_disp = (((const_ptr->hor_resolution / 8) - 1) << RADEON_CRTC_H_DISP_SHIFT) |
851 (((const_ptr->hor_total / 8) - 1) << RADEON_CRTC_H_TOTAL_SHIFT);
852
853 tmp = *h_sync_strt_wid;
854 tmp &= ~(RADEON_CRTC_H_SYNC_STRT_PIX | RADEON_CRTC_H_SYNC_STRT_CHAR);
855 tmp |= (((const_ptr->hor_syncstart / 8) - 1) << RADEON_CRTC_H_SYNC_STRT_CHAR_SHIFT) |
856 (const_ptr->hor_syncstart & 7);
857 *h_sync_strt_wid = tmp;
858
859 *v_total_disp = ((const_ptr->ver_resolution - 1) << RADEON_CRTC_V_DISP_SHIFT) |
860 ((const_ptr->ver_total - 1) << RADEON_CRTC_V_TOTAL_SHIFT);
861
862 tmp = *v_sync_strt_wid;
863 tmp &= ~RADEON_CRTC_V_SYNC_STRT;
864 tmp |= ((const_ptr->ver_syncstart - 1) << RADEON_CRTC_V_SYNC_STRT_SHIFT);
865 *v_sync_strt_wid = tmp;
866 }
867
868 static int get_post_div(int value)
869 {
870 int post_div;
871 switch (value) {
872 case 1: post_div = 0; break;
873 case 2: post_div = 1; break;
874 case 3: post_div = 4; break;
875 case 4: post_div = 2; break;
876 case 6: post_div = 6; break;
877 case 8: post_div = 3; break;
878 case 12: post_div = 7; break;
879 case 16:
880 default: post_div = 5; break;
881 }
882 return post_div;
883 }
884
885 void radeon_legacy_tv_adjust_pll1(struct drm_encoder *encoder,
886 uint32_t *htotal_cntl, uint32_t *ppll_ref_div,
887 uint32_t *ppll_div_3, uint32_t *pixclks_cntl)
888 {
889 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
890 const struct radeon_tv_mode_constants *const_ptr;
891
892 const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
893 if (!const_ptr)
894 return;
895
896 *htotal_cntl = (const_ptr->hor_total & 0x7) | RADEON_HTOT_CNTL_VGA_EN;
897
898 *ppll_ref_div = const_ptr->crtcPLL_M;
899
900 *ppll_div_3 = (const_ptr->crtcPLL_N & 0x7ff) | (get_post_div(const_ptr->crtcPLL_post_div) << 16);
901 *pixclks_cntl &= ~(RADEON_PIX2CLK_SRC_SEL_MASK | RADEON_PIXCLK_TV_SRC_SEL);
902 *pixclks_cntl |= RADEON_PIX2CLK_SRC_SEL_P2PLLCLK;
903 }
904
905 void radeon_legacy_tv_adjust_pll2(struct drm_encoder *encoder,
906 uint32_t *htotal2_cntl, uint32_t *p2pll_ref_div,
907 uint32_t *p2pll_div_0, uint32_t *pixclks_cntl)
908 {
909 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
910 const struct radeon_tv_mode_constants *const_ptr;
911
912 const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
913 if (!const_ptr)
914 return;
915
916 *htotal2_cntl = (const_ptr->hor_total & 0x7);
917
918 *p2pll_ref_div = const_ptr->crtcPLL_M;
919
920 *p2pll_div_0 = (const_ptr->crtcPLL_N & 0x7ff) | (get_post_div(const_ptr->crtcPLL_post_div) << 16);
921 *pixclks_cntl &= ~RADEON_PIX2CLK_SRC_SEL_MASK;
922 *pixclks_cntl |= RADEON_PIX2CLK_SRC_SEL_P2PLLCLK | RADEON_PIXCLK_TV_SRC_SEL;
923 }
924