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