Rev 2997 | Rev 3764 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2997 | Rev 3120 | ||
---|---|---|---|
Line 535... | Line 535... | ||
535 | RADEON_DAC_PDWN_G | |
535 | RADEON_DAC_PDWN_G | |
536 | RADEON_DAC_PDWN_B); |
536 | RADEON_DAC_PDWN_B); |
537 | break; |
537 | break; |
538 | } |
538 | } |
Line -... | Line 539... | ||
- | 539 | ||
- | 540 | /* handled in radeon_crtc_dpms() */ |
|
539 | 541 | if (!(rdev->flags & RADEON_SINGLE_CRTC)) |
|
540 | WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl); |
542 | WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl); |
541 | WREG32(RADEON_DAC_CNTL, dac_cntl); |
543 | WREG32(RADEON_DAC_CNTL, dac_cntl); |
Line 542... | Line 544... | ||
542 | WREG32(RADEON_DAC_MACRO_CNTL, dac_macro_cntl); |
544 | WREG32(RADEON_DAC_MACRO_CNTL, dac_macro_cntl); |
Line 660... | Line 662... | ||
660 | else |
662 | else |
661 | tmp |= RADEON_DAC_FORCE_DATA_SEL_G; |
663 | tmp |= RADEON_DAC_FORCE_DATA_SEL_G; |
Line 662... | Line 664... | ||
662 | 664 | ||
663 | if (ASIC_IS_R300(rdev)) |
665 | if (ASIC_IS_R300(rdev)) |
- | 666 | tmp |= (0x1b6 << RADEON_DAC_FORCE_DATA_SHIFT); |
|
- | 667 | else if (ASIC_IS_RV100(rdev)) |
|
664 | tmp |= (0x1b6 << RADEON_DAC_FORCE_DATA_SHIFT); |
668 | tmp |= (0x1ac << RADEON_DAC_FORCE_DATA_SHIFT); |
665 | else |
669 | else |
Line 666... | Line 670... | ||
666 | tmp |= (0x180 << RADEON_DAC_FORCE_DATA_SHIFT); |
670 | tmp |= (0x180 << RADEON_DAC_FORCE_DATA_SHIFT); |
Line 667... | Line 671... | ||
667 | 671 | ||
668 | WREG32(RADEON_DAC_EXT_CNTL, tmp); |
672 | WREG32(RADEON_DAC_EXT_CNTL, tmp); |
669 | 673 | ||
Line -... | Line 674... | ||
- | 674 | tmp = dac_cntl & ~(RADEON_DAC_RANGE_CNTL_MASK | RADEON_DAC_PDWN); |
|
670 | tmp = dac_cntl & ~(RADEON_DAC_RANGE_CNTL_MASK | RADEON_DAC_PDWN); |
675 | tmp |= RADEON_DAC_RANGE_CNTL_PS2 | RADEON_DAC_CMP_EN; |
671 | tmp |= RADEON_DAC_RANGE_CNTL_PS2 | RADEON_DAC_CMP_EN; |
676 | WREG32(RADEON_DAC_CNTL, tmp); |
672 | WREG32(RADEON_DAC_CNTL, tmp); |
677 | |
Line 673... | Line 678... | ||
673 | 678 | tmp = dac_macro_cntl; |
|
Line 1090... | Line 1095... | ||
1090 | if (rdev->family == CHIP_R200) { |
1095 | if (rdev->family == CHIP_R200) { |
1091 | WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl); |
1096 | WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl); |
1092 | } else { |
1097 | } else { |
1093 | if (is_tv) |
1098 | if (is_tv) |
1094 | WREG32(RADEON_TV_MASTER_CNTL, tv_master_cntl); |
1099 | WREG32(RADEON_TV_MASTER_CNTL, tv_master_cntl); |
1095 | else |
1100 | /* handled in radeon_crtc_dpms() */ |
- | 1101 | else if (!(rdev->flags & RADEON_SINGLE_CRTC)) |
|
1096 | WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl); |
1102 | WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl); |
1097 | WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl); |
1103 | WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl); |
1098 | } |
1104 | } |
Line 1099... | Line 1105... | ||
1099 | 1105 | ||
Line 1414... | Line 1420... | ||
1414 | WREG32(RADEON_TV_MASTER_CNTL, tv_master_cntl); |
1420 | WREG32(RADEON_TV_MASTER_CNTL, tv_master_cntl); |
1415 | WREG32(RADEON_DAC_CNTL2, dac_cntl2); |
1421 | WREG32(RADEON_DAC_CNTL2, dac_cntl2); |
1416 | return found; |
1422 | return found; |
1417 | } |
1423 | } |
Line -... | Line 1424... | ||
- | 1424 | ||
- | 1425 | static bool radeon_legacy_ext_dac_detect(struct drm_encoder *encoder, |
|
- | 1426 | struct drm_connector *connector) |
|
- | 1427 | { |
|
- | 1428 | struct drm_device *dev = encoder->dev; |
|
- | 1429 | struct radeon_device *rdev = dev->dev_private; |
|
- | 1430 | uint32_t gpio_monid, fp2_gen_cntl, disp_output_cntl, crtc2_gen_cntl; |
|
- | 1431 | uint32_t disp_lin_trans_grph_a, disp_lin_trans_grph_b, disp_lin_trans_grph_c; |
|
- | 1432 | uint32_t disp_lin_trans_grph_d, disp_lin_trans_grph_e, disp_lin_trans_grph_f; |
|
- | 1433 | uint32_t tmp, crtc2_h_total_disp, crtc2_v_total_disp; |
|
- | 1434 | uint32_t crtc2_h_sync_strt_wid, crtc2_v_sync_strt_wid; |
|
- | 1435 | bool found = false; |
|
- | 1436 | int i; |
|
- | 1437 | ||
- | 1438 | /* save the regs we need */ |
|
- | 1439 | gpio_monid = RREG32(RADEON_GPIO_MONID); |
|
- | 1440 | fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL); |
|
- | 1441 | disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL); |
|
- | 1442 | crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL); |
|
- | 1443 | disp_lin_trans_grph_a = RREG32(RADEON_DISP_LIN_TRANS_GRPH_A); |
|
- | 1444 | disp_lin_trans_grph_b = RREG32(RADEON_DISP_LIN_TRANS_GRPH_B); |
|
- | 1445 | disp_lin_trans_grph_c = RREG32(RADEON_DISP_LIN_TRANS_GRPH_C); |
|
- | 1446 | disp_lin_trans_grph_d = RREG32(RADEON_DISP_LIN_TRANS_GRPH_D); |
|
- | 1447 | disp_lin_trans_grph_e = RREG32(RADEON_DISP_LIN_TRANS_GRPH_E); |
|
- | 1448 | disp_lin_trans_grph_f = RREG32(RADEON_DISP_LIN_TRANS_GRPH_F); |
|
- | 1449 | crtc2_h_total_disp = RREG32(RADEON_CRTC2_H_TOTAL_DISP); |
|
- | 1450 | crtc2_v_total_disp = RREG32(RADEON_CRTC2_V_TOTAL_DISP); |
|
- | 1451 | crtc2_h_sync_strt_wid = RREG32(RADEON_CRTC2_H_SYNC_STRT_WID); |
|
- | 1452 | crtc2_v_sync_strt_wid = RREG32(RADEON_CRTC2_V_SYNC_STRT_WID); |
|
- | 1453 | ||
- | 1454 | tmp = RREG32(RADEON_GPIO_MONID); |
|
- | 1455 | tmp &= ~RADEON_GPIO_A_0; |
|
- | 1456 | WREG32(RADEON_GPIO_MONID, tmp); |
|
- | 1457 | ||
- | 1458 | WREG32(RADEON_FP2_GEN_CNTL, (RADEON_FP2_ON | |
|
- | 1459 | RADEON_FP2_PANEL_FORMAT | |
|
- | 1460 | R200_FP2_SOURCE_SEL_TRANS_UNIT | |
|
- | 1461 | RADEON_FP2_DVO_EN | |
|
- | 1462 | R200_FP2_DVO_RATE_SEL_SDR)); |
|
- | 1463 | ||
- | 1464 | WREG32(RADEON_DISP_OUTPUT_CNTL, (RADEON_DISP_DAC_SOURCE_RMX | |
|
- | 1465 | RADEON_DISP_TRANS_MATRIX_GRAPHICS)); |
|
- | 1466 | ||
- | 1467 | WREG32(RADEON_CRTC2_GEN_CNTL, (RADEON_CRTC2_EN | |
|
- | 1468 | RADEON_CRTC2_DISP_REQ_EN_B)); |
|
- | 1469 | ||
- | 1470 | WREG32(RADEON_DISP_LIN_TRANS_GRPH_A, 0x00000000); |
|
- | 1471 | WREG32(RADEON_DISP_LIN_TRANS_GRPH_B, 0x000003f0); |
|
- | 1472 | WREG32(RADEON_DISP_LIN_TRANS_GRPH_C, 0x00000000); |
|
- | 1473 | WREG32(RADEON_DISP_LIN_TRANS_GRPH_D, 0x000003f0); |
|
- | 1474 | WREG32(RADEON_DISP_LIN_TRANS_GRPH_E, 0x00000000); |
|
- | 1475 | WREG32(RADEON_DISP_LIN_TRANS_GRPH_F, 0x000003f0); |
|
- | 1476 | ||
- | 1477 | WREG32(RADEON_CRTC2_H_TOTAL_DISP, 0x01000008); |
|
- | 1478 | WREG32(RADEON_CRTC2_H_SYNC_STRT_WID, 0x00000800); |
|
- | 1479 | WREG32(RADEON_CRTC2_V_TOTAL_DISP, 0x00080001); |
|
- | 1480 | WREG32(RADEON_CRTC2_V_SYNC_STRT_WID, 0x00000080); |
|
- | 1481 | ||
- | 1482 | for (i = 0; i < 200; i++) { |
|
- | 1483 | tmp = RREG32(RADEON_GPIO_MONID); |
|
- | 1484 | if (tmp & RADEON_GPIO_Y_0) |
|
- | 1485 | found = true; |
|
- | 1486 | ||
- | 1487 | if (found) |
|
- | 1488 | break; |
|
- | 1489 | ||
- | 1490 | msleep(1); |
|
- | 1491 | } |
|
- | 1492 | ||
- | 1493 | /* restore the regs we used */ |
|
- | 1494 | WREG32(RADEON_DISP_LIN_TRANS_GRPH_A, disp_lin_trans_grph_a); |
|
- | 1495 | WREG32(RADEON_DISP_LIN_TRANS_GRPH_B, disp_lin_trans_grph_b); |
|
- | 1496 | WREG32(RADEON_DISP_LIN_TRANS_GRPH_C, disp_lin_trans_grph_c); |
|
- | 1497 | WREG32(RADEON_DISP_LIN_TRANS_GRPH_D, disp_lin_trans_grph_d); |
|
- | 1498 | WREG32(RADEON_DISP_LIN_TRANS_GRPH_E, disp_lin_trans_grph_e); |
|
- | 1499 | WREG32(RADEON_DISP_LIN_TRANS_GRPH_F, disp_lin_trans_grph_f); |
|
- | 1500 | WREG32(RADEON_CRTC2_H_TOTAL_DISP, crtc2_h_total_disp); |
|
- | 1501 | WREG32(RADEON_CRTC2_V_TOTAL_DISP, crtc2_v_total_disp); |
|
- | 1502 | WREG32(RADEON_CRTC2_H_SYNC_STRT_WID, crtc2_h_sync_strt_wid); |
|
- | 1503 | WREG32(RADEON_CRTC2_V_SYNC_STRT_WID, crtc2_v_sync_strt_wid); |
|
- | 1504 | WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl); |
|
- | 1505 | WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl); |
|
- | 1506 | WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl); |
|
- | 1507 | WREG32(RADEON_GPIO_MONID, gpio_monid); |
|
- | 1508 | ||
- | 1509 | return found; |
|
- | 1510 | } |
|
1418 | 1511 | ||
1419 | static enum drm_connector_status radeon_legacy_tv_dac_detect(struct drm_encoder *encoder, |
1512 | static enum drm_connector_status radeon_legacy_tv_dac_detect(struct drm_encoder *encoder, |
1420 | struct drm_connector *connector) |
1513 | struct drm_connector *connector) |
1421 | { |
1514 | { |
1422 | struct drm_device *dev = encoder->dev; |
1515 | struct drm_device *dev = encoder->dev; |
1423 | struct radeon_device *rdev = dev->dev_private; |
1516 | struct radeon_device *rdev = dev->dev_private; |
1424 | uint32_t crtc2_gen_cntl, tv_dac_cntl, dac_cntl2, dac_ext_cntl; |
1517 | uint32_t crtc2_gen_cntl = 0, tv_dac_cntl, dac_cntl2, dac_ext_cntl; |
- | 1518 | uint32_t gpiopad_a = 0, pixclks_cntl, tmp; |
|
1425 | uint32_t disp_hw_debug, disp_output_cntl, gpiopad_a, pixclks_cntl, tmp; |
1519 | uint32_t disp_output_cntl = 0, disp_hw_debug = 0, crtc_ext_cntl = 0; |
1426 | enum drm_connector_status found = connector_status_disconnected; |
1520 | enum drm_connector_status found = connector_status_disconnected; |
1427 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
1521 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
1428 | struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv; |
1522 | struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv; |
1429 | bool color = true; |
1523 | bool color = true; |
Line 1457... | Line 1551... | ||
1457 | if (radeon_encoder->active_device && !(radeon_encoder->active_device & ATOM_DEVICE_CRT_SUPPORT)) { |
1551 | if (radeon_encoder->active_device && !(radeon_encoder->active_device & ATOM_DEVICE_CRT_SUPPORT)) { |
1458 | DRM_INFO("not detecting due to %08x\n", radeon_encoder->active_device); |
1552 | DRM_INFO("not detecting due to %08x\n", radeon_encoder->active_device); |
1459 | return connector_status_disconnected; |
1553 | return connector_status_disconnected; |
1460 | } |
1554 | } |
Line -... | Line 1555... | ||
- | 1555 | ||
- | 1556 | /* R200 uses an external DAC for secondary DAC */ |
|
- | 1557 | if (rdev->family == CHIP_R200) { |
|
- | 1558 | if (radeon_legacy_ext_dac_detect(encoder, connector)) |
|
- | 1559 | found = connector_status_connected; |
|
- | 1560 | return found; |
|
- | 1561 | } |
|
1461 | 1562 | ||
1462 | /* save the regs we need */ |
1563 | /* save the regs we need */ |
- | 1564 | pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL); |
|
- | 1565 | ||
- | 1566 | if (rdev->flags & RADEON_SINGLE_CRTC) { |
|
- | 1567 | crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL); |
|
- | 1568 | } else { |
|
1463 | pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL); |
1569 | if (ASIC_IS_R300(rdev)) { |
1464 | gpiopad_a = ASIC_IS_R300(rdev) ? RREG32(RADEON_GPIOPAD_A) : 0; |
1570 | gpiopad_a = RREG32(RADEON_GPIOPAD_A); |
- | 1571 | disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL); |
|
1465 | disp_output_cntl = ASIC_IS_R300(rdev) ? RREG32(RADEON_DISP_OUTPUT_CNTL) : 0; |
1572 | } else { |
- | 1573 | disp_hw_debug = RREG32(RADEON_DISP_HW_DEBUG); |
|
1466 | disp_hw_debug = ASIC_IS_R300(rdev) ? 0 : RREG32(RADEON_DISP_HW_DEBUG); |
1574 | } |
- | 1575 | crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL); |
|
1467 | crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL); |
1576 | } |
1468 | tv_dac_cntl = RREG32(RADEON_TV_DAC_CNTL); |
1577 | tv_dac_cntl = RREG32(RADEON_TV_DAC_CNTL); |
1469 | dac_ext_cntl = RREG32(RADEON_DAC_EXT_CNTL); |
1578 | dac_ext_cntl = RREG32(RADEON_DAC_EXT_CNTL); |
Line 1470... | Line 1579... | ||
1470 | dac_cntl2 = RREG32(RADEON_DAC_CNTL2); |
1579 | dac_cntl2 = RREG32(RADEON_DAC_CNTL2); |
1471 | 1580 | ||
1472 | tmp = pixclks_cntl & ~(RADEON_PIX2CLK_ALWAYS_ONb |
1581 | tmp = pixclks_cntl & ~(RADEON_PIX2CLK_ALWAYS_ONb |
Line 1473... | Line 1582... | ||
1473 | | RADEON_PIX2CLK_DAC_ALWAYS_ONb); |
1582 | | RADEON_PIX2CLK_DAC_ALWAYS_ONb); |
- | 1583 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); |
|
1474 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); |
1584 | |
1475 | 1585 | if (rdev->flags & RADEON_SINGLE_CRTC) { |
|
1476 | if (ASIC_IS_R300(rdev)) |
1586 | tmp = crtc_ext_cntl | RADEON_CRTC_CRT_ON; |
1477 | WREG32_P(RADEON_GPIOPAD_A, 1, ~1); |
1587 | WREG32(RADEON_CRTC_EXT_CNTL, tmp); |
1478 | 1588 | } else { |
|
1479 | tmp = crtc2_gen_cntl & ~RADEON_CRTC2_PIX_WIDTH_MASK; |
- | |
1480 | tmp |= RADEON_CRTC2_CRT2_ON | |
1589 | tmp = crtc2_gen_cntl & ~RADEON_CRTC2_PIX_WIDTH_MASK; |
Line 1481... | Line 1590... | ||
1481 | (2 << RADEON_CRTC2_PIX_WIDTH_SHIFT); |
1590 | tmp |= RADEON_CRTC2_CRT2_ON | |
- | 1591 | (2 << RADEON_CRTC2_PIX_WIDTH_SHIFT); |
|
1482 | 1592 | WREG32(RADEON_CRTC2_GEN_CNTL, tmp); |
|
1483 | WREG32(RADEON_CRTC2_GEN_CNTL, tmp); |
1593 | |
1484 | 1594 | if (ASIC_IS_R300(rdev)) { |
|
1485 | if (ASIC_IS_R300(rdev)) { |
1595 | WREG32_P(RADEON_GPIOPAD_A, 1, ~1); |
1486 | tmp = disp_output_cntl & ~RADEON_DISP_TVDAC_SOURCE_MASK; |
1596 | tmp = disp_output_cntl & ~RADEON_DISP_TVDAC_SOURCE_MASK; |
1487 | tmp |= RADEON_DISP_TVDAC_SOURCE_CRTC2; |
1597 | tmp |= RADEON_DISP_TVDAC_SOURCE_CRTC2; |
1488 | WREG32(RADEON_DISP_OUTPUT_CNTL, tmp); |
1598 | WREG32(RADEON_DISP_OUTPUT_CNTL, tmp); |
- | 1599 | } else { |
|
Line 1489... | Line 1600... | ||
1489 | } else { |
1600 | tmp = disp_hw_debug & ~RADEON_CRT2_DISP1_SEL; |
1490 | tmp = disp_hw_debug & ~RADEON_CRT2_DISP1_SEL; |
1601 | WREG32(RADEON_DISP_HW_DEBUG, tmp); |
1491 | WREG32(RADEON_DISP_HW_DEBUG, tmp); |
1602 | } |
1492 | } |
1603 | } |
Line 1528... | Line 1639... | ||
1528 | 1639 | ||
1529 | /* restore regs we used */ |
1640 | /* restore regs we used */ |
1530 | WREG32(RADEON_DAC_CNTL2, dac_cntl2); |
1641 | WREG32(RADEON_DAC_CNTL2, dac_cntl2); |
1531 | WREG32(RADEON_DAC_EXT_CNTL, dac_ext_cntl); |
1642 | WREG32(RADEON_DAC_EXT_CNTL, dac_ext_cntl); |
1532 | WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl); |
- | |
Line -... | Line 1643... | ||
- | 1643 | WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl); |
|
- | 1644 | ||
- | 1645 | if (rdev->flags & RADEON_SINGLE_CRTC) { |
|
- | 1646 | WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl); |
|
1533 | WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl); |
1647 | } else { |
1534 | 1648 | WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl); |
|
1535 | if (ASIC_IS_R300(rdev)) { |
1649 | if (ASIC_IS_R300(rdev)) { |
1536 | WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl); |
1650 | WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl); |
1537 | WREG32_P(RADEON_GPIOPAD_A, gpiopad_a, ~1); |
1651 | WREG32_P(RADEON_GPIOPAD_A, gpiopad_a, ~1); |
1538 | } else { |
1652 | } else { |
- | 1653 | WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug); |
|
- | 1654 | } |
|
1539 | WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug); |
1655 | } |
Line 1540... | Line 1656... | ||
1540 | } |
1656 | |
Line 1541... | Line 1657... | ||
1541 | WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl); |
1657 | WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl); |