Rev 2160 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2160 | Rev 2997 | ||
---|---|---|---|
Line 23... | Line 23... | ||
23 | * |
23 | * |
24 | * Authors: Dave Airlie |
24 | * Authors: Dave Airlie |
25 | * Alex Deucher |
25 | * Alex Deucher |
26 | * Jerome Glisse |
26 | * Jerome Glisse |
27 | */ |
27 | */ |
28 | #include "drmP.h" |
28 | #include |
29 | #include "radeon_drm.h" |
29 | #include |
30 | #include "radeon_reg.h" |
30 | #include "radeon_reg.h" |
31 | #include "radeon.h" |
31 | #include "radeon.h" |
32 | #include "atom.h" |
32 | #include "atom.h" |
Line 33... | Line 33... | ||
33 | 33 | ||
Line 217... | Line 217... | ||
217 | if (ASIC_IS_AVIVO(rdev)) { |
217 | if (ASIC_IS_AVIVO(rdev)) { |
218 | /* TODO FALLBACK */ |
218 | /* TODO FALLBACK */ |
219 | } else { |
219 | } else { |
220 | DRM_INFO("Using generic clock info\n"); |
220 | DRM_INFO("Using generic clock info\n"); |
Line -... | Line 221... | ||
- | 221 | ||
- | 222 | /* may need to be per card */ |
|
- | 223 | rdev->clock.max_pixel_clock = 35000; |
|
221 | 224 | ||
222 | if (rdev->flags & RADEON_IS_IGP) { |
225 | if (rdev->flags & RADEON_IS_IGP) { |
223 | p1pll->reference_freq = 1432; |
226 | p1pll->reference_freq = 1432; |
224 | p2pll->reference_freq = 1432; |
227 | p2pll->reference_freq = 1432; |
225 | spll->reference_freq = 1432; |
228 | spll->reference_freq = 1432; |
Line 329... | Line 332... | ||
329 | mpll->max_feedback_div = 0xff; |
332 | mpll->max_feedback_div = 0xff; |
330 | mpll->best_vco = 0; |
333 | mpll->best_vco = 0; |
Line 331... | Line 334... | ||
331 | 334 | ||
332 | if (!rdev->clock.default_sclk) |
335 | if (!rdev->clock.default_sclk) |
333 | rdev->clock.default_sclk = radeon_get_engine_clock(rdev); |
336 | rdev->clock.default_sclk = radeon_get_engine_clock(rdev); |
334 | if ((!rdev->clock.default_mclk) && rdev->asic->get_memory_clock) |
337 | if ((!rdev->clock.default_mclk) && rdev->asic->pm.get_memory_clock) |
Line 335... | Line 338... | ||
335 | rdev->clock.default_mclk = radeon_get_memory_clock(rdev); |
338 | rdev->clock.default_mclk = radeon_get_memory_clock(rdev); |
336 | 339 | ||
Line 628... | Line 631... | ||
628 | } else { |
631 | } else { |
629 | tmp = RREG32_PLL(RADEON_SCLK_CNTL); |
632 | tmp = RREG32_PLL(RADEON_SCLK_CNTL); |
630 | tmp &= ~(R300_SCLK_FORCE_VAP); |
633 | tmp &= ~(R300_SCLK_FORCE_VAP); |
631 | tmp |= RADEON_SCLK_FORCE_CP; |
634 | tmp |= RADEON_SCLK_FORCE_CP; |
632 | WREG32_PLL(RADEON_SCLK_CNTL, tmp); |
635 | WREG32_PLL(RADEON_SCLK_CNTL, tmp); |
633 | udelay(15000); |
636 | mdelay(15); |
Line 634... | Line 637... | ||
634 | 637 | ||
635 | tmp = RREG32_PLL(R300_SCLK_CNTL2); |
638 | tmp = RREG32_PLL(R300_SCLK_CNTL2); |
636 | tmp &= ~(R300_SCLK_FORCE_TCL | |
639 | tmp &= ~(R300_SCLK_FORCE_TCL | |
637 | R300_SCLK_FORCE_GA | |
640 | R300_SCLK_FORCE_GA | |
Line 646... | Line 649... | ||
646 | RADEON_DYN_STOP_MODE_MASK); |
649 | RADEON_DYN_STOP_MODE_MASK); |
Line 647... | Line 650... | ||
647 | 650 | ||
648 | tmp |= (RADEON_ENGIN_DYNCLK_MODE | |
651 | tmp |= (RADEON_ENGIN_DYNCLK_MODE | |
649 | (0x01 << RADEON_ACTIVE_HILO_LAT_SHIFT)); |
652 | (0x01 << RADEON_ACTIVE_HILO_LAT_SHIFT)); |
650 | WREG32_PLL(RADEON_CLK_PWRMGT_CNTL, tmp); |
653 | WREG32_PLL(RADEON_CLK_PWRMGT_CNTL, tmp); |
Line 651... | Line 654... | ||
651 | udelay(15000); |
654 | mdelay(15); |
652 | 655 | ||
653 | tmp = RREG32_PLL(RADEON_CLK_PIN_CNTL); |
656 | tmp = RREG32_PLL(RADEON_CLK_PIN_CNTL); |
654 | tmp |= RADEON_SCLK_DYN_START_CNTL; |
657 | tmp |= RADEON_SCLK_DYN_START_CNTL; |
Line 655... | Line 658... | ||
655 | WREG32_PLL(RADEON_CLK_PIN_CNTL, tmp); |
658 | WREG32_PLL(RADEON_CLK_PIN_CNTL, tmp); |
656 | udelay(15000); |
659 | mdelay(15); |
657 | 660 | ||
658 | /* When DRI is enabled, setting DYN_STOP_LAT to zero can cause some R200 |
661 | /* When DRI is enabled, setting DYN_STOP_LAT to zero can cause some R200 |
Line 691... | Line 694... | ||
691 | RADEON_CFG_ATI_REV_ID_MASK) < |
694 | RADEON_CFG_ATI_REV_ID_MASK) < |
692 | RADEON_CFG_ATI_REV_A13)) { |
695 | RADEON_CFG_ATI_REV_A13)) { |
693 | tmp |= RADEON_SCLK_MORE_FORCEON; |
696 | tmp |= RADEON_SCLK_MORE_FORCEON; |
694 | } |
697 | } |
695 | WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp); |
698 | WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp); |
696 | udelay(15000); |
699 | mdelay(15); |
697 | } |
700 | } |
Line 698... | Line 701... | ||
698 | 701 | ||
699 | /* RV200::A11 A12, RV250::A11 A12 */ |
702 | /* RV200::A11 A12, RV250::A11 A12 */ |
700 | if (((rdev->family == CHIP_RV200) || |
703 | if (((rdev->family == CHIP_RV200) || |
Line 704... | Line 707... | ||
704 | RADEON_CFG_ATI_REV_A13)) { |
707 | RADEON_CFG_ATI_REV_A13)) { |
705 | tmp = RREG32_PLL(RADEON_PLL_PWRMGT_CNTL); |
708 | tmp = RREG32_PLL(RADEON_PLL_PWRMGT_CNTL); |
706 | tmp |= RADEON_TCL_BYPASS_DISABLE; |
709 | tmp |= RADEON_TCL_BYPASS_DISABLE; |
707 | WREG32_PLL(RADEON_PLL_PWRMGT_CNTL, tmp); |
710 | WREG32_PLL(RADEON_PLL_PWRMGT_CNTL, tmp); |
708 | } |
711 | } |
709 | udelay(15000); |
712 | mdelay(15); |
Line 710... | Line 713... | ||
710 | 713 | ||
711 | /*enable dynamic mode for display clocks (PIXCLK and PIX2CLK) */ |
714 | /*enable dynamic mode for display clocks (PIXCLK and PIX2CLK) */ |
712 | tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL); |
715 | tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL); |
713 | tmp |= (RADEON_PIX2CLK_ALWAYS_ONb | |
716 | tmp |= (RADEON_PIX2CLK_ALWAYS_ONb | |
Line 717... | Line 720... | ||
717 | RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb | |
720 | RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb | |
718 | RADEON_PIXCLK_LVDS_ALWAYS_ONb | |
721 | RADEON_PIXCLK_LVDS_ALWAYS_ONb | |
719 | RADEON_PIXCLK_TMDS_ALWAYS_ONb); |
722 | RADEON_PIXCLK_TMDS_ALWAYS_ONb); |
Line 720... | Line 723... | ||
720 | 723 | ||
721 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); |
724 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); |
Line 722... | Line 725... | ||
722 | udelay(15000); |
725 | mdelay(15); |
723 | 726 | ||
724 | tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL); |
727 | tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL); |
Line 725... | Line 728... | ||
725 | tmp |= (RADEON_PIXCLK_ALWAYS_ONb | |
728 | tmp |= (RADEON_PIXCLK_ALWAYS_ONb | |
726 | RADEON_PIXCLK_DAC_ALWAYS_ONb); |
729 | RADEON_PIXCLK_DAC_ALWAYS_ONb); |
727 | 730 | ||
728 | WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp); |
731 | WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp); |
729 | udelay(15000); |
732 | mdelay(15); |
730 | } |
733 | } |
731 | } else { |
734 | } else { |
Line 856... | Line 859... | ||
856 | RADEON_SCLK_FORCE_IDCT | |
859 | RADEON_SCLK_FORCE_IDCT | |
857 | RADEON_SCLK_FORCE_VIP); |
860 | RADEON_SCLK_FORCE_VIP); |
858 | } |
861 | } |
859 | WREG32_PLL(RADEON_SCLK_CNTL, tmp); |
862 | WREG32_PLL(RADEON_SCLK_CNTL, tmp); |
Line 860... | Line 863... | ||
860 | 863 | ||
Line 861... | Line 864... | ||
861 | udelay(16000); |
864 | mdelay(16); |
862 | 865 | ||
863 | if ((rdev->family == CHIP_R300) || |
866 | if ((rdev->family == CHIP_R300) || |
864 | (rdev->family == CHIP_R350)) { |
867 | (rdev->family == CHIP_R350)) { |
865 | tmp = RREG32_PLL(R300_SCLK_CNTL2); |
868 | tmp = RREG32_PLL(R300_SCLK_CNTL2); |
866 | tmp |= (R300_SCLK_FORCE_TCL | |
869 | tmp |= (R300_SCLK_FORCE_TCL | |
867 | R300_SCLK_FORCE_GA | |
870 | R300_SCLK_FORCE_GA | |
868 | R300_SCLK_FORCE_CBA); |
871 | R300_SCLK_FORCE_CBA); |
869 | WREG32_PLL(R300_SCLK_CNTL2, tmp); |
872 | WREG32_PLL(R300_SCLK_CNTL2, tmp); |
Line 870... | Line 873... | ||
870 | udelay(16000); |
873 | mdelay(16); |
871 | } |
874 | } |
872 | 875 | ||
873 | if (rdev->flags & RADEON_IS_IGP) { |
876 | if (rdev->flags & RADEON_IS_IGP) { |
874 | tmp = RREG32_PLL(RADEON_MCLK_CNTL); |
877 | tmp = RREG32_PLL(RADEON_MCLK_CNTL); |
875 | tmp &= ~(RADEON_FORCEON_MCLKA | |
878 | tmp &= ~(RADEON_FORCEON_MCLKA | |
876 | RADEON_FORCEON_YCLKA); |
879 | RADEON_FORCEON_YCLKA); |
Line 877... | Line 880... | ||
877 | WREG32_PLL(RADEON_MCLK_CNTL, tmp); |
880 | WREG32_PLL(RADEON_MCLK_CNTL, tmp); |
878 | udelay(16000); |
881 | mdelay(16); |
879 | } |
882 | } |
880 | 883 | ||
881 | if ((rdev->family == CHIP_RV200) || |
884 | if ((rdev->family == CHIP_RV200) || |
882 | (rdev->family == CHIP_RV250) || |
885 | (rdev->family == CHIP_RV250) || |
883 | (rdev->family == CHIP_RV280)) { |
886 | (rdev->family == CHIP_RV280)) { |
884 | tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL); |
887 | tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL); |
Line 885... | Line 888... | ||
885 | tmp |= RADEON_SCLK_MORE_FORCEON; |
888 | tmp |= RADEON_SCLK_MORE_FORCEON; |
886 | WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp); |
889 | WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp); |
887 | udelay(16000); |
890 | mdelay(16); |
Line 895... | Line 898... | ||
895 | RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb | |
898 | RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb | |
896 | RADEON_PIXCLK_LVDS_ALWAYS_ONb | |
899 | RADEON_PIXCLK_LVDS_ALWAYS_ONb | |
897 | RADEON_PIXCLK_TMDS_ALWAYS_ONb); |
900 | RADEON_PIXCLK_TMDS_ALWAYS_ONb); |
Line 898... | Line 901... | ||
898 | 901 | ||
899 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); |
902 | WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); |
Line 900... | Line 903... | ||
900 | udelay(16000); |
903 | mdelay(16); |
901 | 904 | ||
902 | tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL); |
905 | tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL); |
903 | tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb | |
906 | tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb | |