1 // SPDX-License-Identifier: MIT 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 925