Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
[cris-mirror.git] / drivers / gpu / drm / radeon / radeon_legacy_tv.c
blob611cf934b2119d0c82918c68ed676b41521e6155
1 // SPDX-License-Identifier: GPL-2.0
2 #include <drm/drmP.h>
3 #include <drm/drm_crtc_helper.h>
4 #include "radeon.h"
6 /*
7 * Integrated TV out support based on the GATOS code by
8 * Federico Ulivi <fulivi@lycos.com>
9 */
13 * Limits of h/v positions (hPos & vPos)
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 */
19 * Unit for hPos (in TV clock periods)
21 #define H_POS_UNIT 10
24 * Indexes in h. code timing table for horizontal line position adjustment
26 #define H_TABLE_POS1 6
27 #define H_TABLE_POS2 8
30 * Limits of hor. size (hSize)
32 #define MAX_H_SIZE 5 /* Range: [-5..5], negative is smaller, positive is larger */
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
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
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
52 #define PAL_TV_PLL_M_27 113
53 #define PAL_TV_PLL_N_27 668
54 #define PAL_TV_PLL_P_27 3
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
61 #define PAL_TV_PLL_M_14 19
62 #define PAL_TV_PLL_N_14 353
63 #define PAL_TV_PLL_P_14 5
65 #define VERT_LEAD_IN_LINES 2
66 #define FRAC_BITS 0xe
67 #define FRAC_MASK 0x3fff
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;
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,
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,
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,
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,
163 /**********************************************************************
165 * availableModes
167 * Table of all allowed modes for tv output
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 */
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 */
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 */
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 */
233 #define N_AVAILABLE_MODES ARRAY_SIZE(available_tv_modes)
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)
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;
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;
251 if (pll_ref_freq)
252 *pll_ref_freq = pll->reference_freq;
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];
267 return const_ptr;
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 };
275 static void radeon_wait_pll_lock(struct drm_encoder *encoder, unsigned n_tests,
276 unsigned n_wait_loops, unsigned cnt_threshold)
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;
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);
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;
294 WREG32_PLL(RADEON_PLL_TEST_CNTL, save_pll_test);
295 WREG32(RADEON_TEST_DEBUG_MUX, RREG32(RADEON_TEST_DEBUG_MUX) & 0xffffe0ff);
299 static void radeon_legacy_tv_write_fifo(struct radeon_encoder *radeon_encoder,
300 uint16_t addr, uint32_t value)
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;
307 WREG32(RADEON_TV_HOST_WRITE_DATA, value);
309 WREG32(RADEON_TV_HOST_RD_WT_CNTL, addr);
310 WREG32(RADEON_TV_HOST_RD_WT_CNTL, addr | RADEON_HOST_FIFO_WT);
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);
321 #if 0 /* included for completeness */
322 static uint32_t radeon_legacy_tv_read_fifo(struct radeon_encoder *radeon_encoder, uint16_t addr)
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;
329 WREG32(RADEON_TV_HOST_RD_WT_CNTL, addr);
330 WREG32(RADEON_TV_HOST_RD_WT_CNTL, addr | RADEON_HOST_FIFO_RD);
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);
341 #endif
343 static uint16_t radeon_get_htiming_tables_addr(uint32_t tv_uv_adr)
345 uint16_t h_table;
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;
361 return h_table;
364 static uint16_t radeon_get_vtiming_tables_addr(uint32_t tv_uv_adr)
366 uint16_t v_table;
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;
382 return v_table;
385 static void radeon_restore_tv_timing_tables(struct radeon_encoder *radeon_encoder)
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;
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);
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;
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;
412 static void radeon_legacy_write_tv_restarts(struct radeon_encoder *radeon_encoder)
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);
422 static bool radeon_legacy_tv_init_restarts(struct drm_encoder *encoder)
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;
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;
443 const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
444 if (!const_ptr)
445 return false;
447 h_total = const_ptr->hor_total;
448 v_total = const_ptr->ver_total;
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;
458 /* adjust positions 1&2 in hor. cod timing table */
459 h_offset = tv_dac->h_pos * H_POS_UNIT;
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];
472 p1 = (u16)((int)p1 + h_offset);
473 p2 = (u16)((int)p2 - h_offset);
475 h_changed = (p1 != tv_dac->tv.h_code_timing[H_TABLE_POS1] ||
476 p2 != tv_dac->tv.h_code_timing[H_TABLE_POS2]);
478 tv_dac->tv.h_code_timing[H_TABLE_POS1] = p1;
479 tv_dac->tv.h_code_timing[H_TABLE_POS2] = p2;
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;
484 /* adjust restart */
485 restart = const_ptr->def_restart;
488 * convert v_pos TV lines to n. of CRTC pixels
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);
498 restart -= v_offset + h_offset;
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);
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;
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);
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)));
524 tv_dac->tv.timing_cntl = (tv_dac->tv.timing_cntl & ~RADEON_H_INC_MASK) |
525 ((u32)h_inc << RADEON_H_INC_SHIFT);
527 DRM_DEBUG_KMS("compute_restart: h_size = %d h_inc = %d\n", tv_dac->h_size, h_inc);
529 return h_changed;
532 void radeon_legacy_tv_mode_set(struct drm_encoder *encoder,
533 struct drm_display_mode *mode,
534 struct drm_display_mode *adjusted_mode)
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;
554 const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, &pll_ref_freq);
555 if (!const_ptr)
556 return;
558 radeon_crtc = to_radeon_crtc(encoder->crtc);
560 tv_master_cntl = (RADEON_VIN_ASYNC_RST |
561 RADEON_CRT_FIFO_CE_EN |
562 RADEON_TV_FIFO_CE_EN |
563 RADEON_TV_ON);
565 if (!ASIC_IS_R300(rdev))
566 tv_master_cntl |= RADEON_TVCLK_ALWAYS_ONb;
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;
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));
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);
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));
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;
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;
621 tmp = RREG32(RADEON_TV_VSCALER_CNTL1);
622 tmp &= 0xe3ff0000;
623 tmp |= (vert_space * (1 << FRAC_BITS) / 10000);
624 tv_vscaler_cntl1 = tmp;
626 if (pll_ref_freq == 2700)
627 tv_vscaler_cntl1 |= RADEON_RESTART_FIELD;
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);
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;
644 flicker_removal = (tmp + 500) / 1000;
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;
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;
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;
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;
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;
683 tv_dac_cntl |= RADEON_TV_DAC_NBLANK | RADEON_TV_DAC_NHOLD;
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;
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;
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;
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);
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);
726 tv_dac->tv.tv_uv_adr = 0xc8;
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;
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;
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;
751 radeon_legacy_tv_init_restarts(encoder);
753 /* play with DAC_CNTL */
754 /* play with GPIOPAD_A */
755 /* DISP_OUTPUT_CNTL */
756 /* use reference freq */
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));
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);
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);
775 radeon_wait_pll_lock(encoder, 200, 800, 135);
777 WREG32_PLL_P(RADEON_TV_PLL_CNTL1, 0, ~RADEON_TVPLL_RESET);
779 radeon_wait_pll_lock(encoder, 300, 160, 27);
780 radeon_wait_pll_lock(encoder, 200, 800, 135);
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);
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);
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);
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);
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);
804 WREG32(RADEON_TV_MASTER_CNTL, (tv_master_cntl | RADEON_TV_ASYNC_RST |
805 RADEON_CRT_ASYNC_RST));
807 /* TV restarts */
808 radeon_legacy_write_tv_restarts(radeon_encoder);
810 /* tv timings */
811 radeon_restore_tv_timing_tables(radeon_encoder);
813 WREG32(RADEON_TV_MASTER_CNTL, (tv_master_cntl | RADEON_TV_ASYNC_RST));
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));
825 WREG32(RADEON_TV_CRC_CNTL, 0);
827 WREG32(RADEON_TV_MASTER_CNTL, tv_master_cntl);
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)));
834 WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl);
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)
842 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
843 const struct radeon_tv_mode_constants *const_ptr;
844 uint32_t tmp;
846 const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
847 if (!const_ptr)
848 return;
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);
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;
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);
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;
868 static int get_post_div(int value)
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;
882 return post_div;
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)
889 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
890 const struct radeon_tv_mode_constants *const_ptr;
892 const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
893 if (!const_ptr)
894 return;
896 *htotal_cntl = (const_ptr->hor_total & 0x7) | RADEON_HTOT_CNTL_VGA_EN;
898 *ppll_ref_div = const_ptr->crtcPLL_M;
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;
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)
909 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
910 const struct radeon_tv_mode_constants *const_ptr;
912 const_ptr = radeon_legacy_tv_get_std_mode(radeon_encoder, NULL);
913 if (!const_ptr)
914 return;
916 *htotal2_cntl = (const_ptr->hor_total & 0x7);
918 *p2pll_ref_div = const_ptr->crtcPLL_M;
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;