diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/rv770.c')
-rw-r--r-- | drivers/gpu/drm/radeon/rv770.c | 258 |
1 files changed, 128 insertions, 130 deletions
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index e0b97d161397..b0efd0ddae7a 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
@@ -75,7 +75,7 @@ int rv770_pcie_gart_enable(struct radeon_device *rdev) | |||
75 | WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); | 75 | WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); |
76 | WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); | 76 | WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); |
77 | WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); | 77 | WREG32(VM_CONTEXT0_PAGE_TABLE_START_ADDR, rdev->mc.gtt_start >> 12); |
78 | WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, (rdev->mc.gtt_end - 1) >> 12); | 78 | WREG32(VM_CONTEXT0_PAGE_TABLE_END_ADDR, rdev->mc.gtt_end >> 12); |
79 | WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); | 79 | WREG32(VM_CONTEXT0_PAGE_TABLE_BASE_ADDR, rdev->gart.table_addr >> 12); |
80 | WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | | 80 | WREG32(VM_CONTEXT0_CNTL, ENABLE_CONTEXT | PAGE_TABLE_DEPTH(0) | |
81 | RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); | 81 | RANGE_PROTECTION_FAULT_ENABLE_DEFAULT); |
@@ -126,17 +126,36 @@ void rv770_pcie_gart_fini(struct radeon_device *rdev) | |||
126 | } | 126 | } |
127 | 127 | ||
128 | 128 | ||
129 | /* | 129 | void rv770_agp_enable(struct radeon_device *rdev) |
130 | * MC | 130 | { |
131 | */ | 131 | u32 tmp; |
132 | static void rv770_mc_resume(struct radeon_device *rdev) | 132 | int i; |
133 | |||
134 | /* Setup L2 cache */ | ||
135 | WREG32(VM_L2_CNTL, ENABLE_L2_CACHE | ENABLE_L2_FRAGMENT_PROCESSING | | ||
136 | ENABLE_L2_PTE_CACHE_LRU_UPDATE_BY_WRITE | | ||
137 | EFFECTIVE_L2_QUEUE_SIZE(7)); | ||
138 | WREG32(VM_L2_CNTL2, 0); | ||
139 | WREG32(VM_L2_CNTL3, BANK_SELECT(0) | CACHE_UPDATE_MODE(2)); | ||
140 | /* Setup TLB control */ | ||
141 | tmp = ENABLE_L1_TLB | ENABLE_L1_FRAGMENT_PROCESSING | | ||
142 | SYSTEM_ACCESS_MODE_NOT_IN_SYS | | ||
143 | SYSTEM_APERTURE_UNMAPPED_ACCESS_PASS_THRU | | ||
144 | EFFECTIVE_L1_TLB_SIZE(5) | EFFECTIVE_L1_QUEUE_SIZE(5); | ||
145 | WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); | ||
146 | WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); | ||
147 | WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); | ||
148 | WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); | ||
149 | WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); | ||
150 | WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); | ||
151 | WREG32(MC_VM_MB_L1_TLB3_CNTL, tmp); | ||
152 | for (i = 0; i < 7; i++) | ||
153 | WREG32(VM_CONTEXT0_CNTL + (i * 4), 0); | ||
154 | } | ||
155 | |||
156 | static void rv770_mc_program(struct radeon_device *rdev) | ||
133 | { | 157 | { |
134 | u32 d1vga_control, d2vga_control; | 158 | struct rv515_mc_save save; |
135 | u32 vga_render_control, vga_hdp_control; | ||
136 | u32 d1crtc_control, d2crtc_control; | ||
137 | u32 new_d1grph_primary, new_d1grph_secondary; | ||
138 | u32 new_d2grph_primary, new_d2grph_secondary; | ||
139 | u64 old_vram_start; | ||
140 | u32 tmp; | 159 | u32 tmp; |
141 | int i, j; | 160 | int i, j; |
142 | 161 | ||
@@ -150,53 +169,42 @@ static void rv770_mc_resume(struct radeon_device *rdev) | |||
150 | } | 169 | } |
151 | WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0); | 170 | WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0); |
152 | 171 | ||
153 | d1vga_control = RREG32(D1VGA_CONTROL); | 172 | rv515_mc_stop(rdev, &save); |
154 | d2vga_control = RREG32(D2VGA_CONTROL); | ||
155 | vga_render_control = RREG32(VGA_RENDER_CONTROL); | ||
156 | vga_hdp_control = RREG32(VGA_HDP_CONTROL); | ||
157 | d1crtc_control = RREG32(D1CRTC_CONTROL); | ||
158 | d2crtc_control = RREG32(D2CRTC_CONTROL); | ||
159 | old_vram_start = (u64)(RREG32(MC_VM_FB_LOCATION) & 0xFFFF) << 24; | ||
160 | new_d1grph_primary = RREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS); | ||
161 | new_d1grph_secondary = RREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS); | ||
162 | new_d1grph_primary += rdev->mc.vram_start - old_vram_start; | ||
163 | new_d1grph_secondary += rdev->mc.vram_start - old_vram_start; | ||
164 | new_d2grph_primary = RREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS); | ||
165 | new_d2grph_secondary = RREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS); | ||
166 | new_d2grph_primary += rdev->mc.vram_start - old_vram_start; | ||
167 | new_d2grph_secondary += rdev->mc.vram_start - old_vram_start; | ||
168 | |||
169 | /* Stop all video */ | ||
170 | WREG32(D1VGA_CONTROL, 0); | ||
171 | WREG32(D2VGA_CONTROL, 0); | ||
172 | WREG32(VGA_RENDER_CONTROL, 0); | ||
173 | WREG32(D1CRTC_UPDATE_LOCK, 1); | ||
174 | WREG32(D2CRTC_UPDATE_LOCK, 1); | ||
175 | WREG32(D1CRTC_CONTROL, 0); | ||
176 | WREG32(D2CRTC_CONTROL, 0); | ||
177 | WREG32(D1CRTC_UPDATE_LOCK, 0); | ||
178 | WREG32(D2CRTC_UPDATE_LOCK, 0); | ||
179 | |||
180 | mdelay(1); | ||
181 | if (r600_mc_wait_for_idle(rdev)) { | 173 | if (r600_mc_wait_for_idle(rdev)) { |
182 | printk(KERN_WARNING "[drm] MC not idle !\n"); | 174 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); |
183 | } | 175 | } |
184 | |||
185 | /* Lockout access through VGA aperture*/ | 176 | /* Lockout access through VGA aperture*/ |
186 | WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); | 177 | WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); |
187 | |||
188 | /* Update configuration */ | 178 | /* Update configuration */ |
189 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.vram_start >> 12); | 179 | if (rdev->flags & RADEON_IS_AGP) { |
190 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, (rdev->mc.vram_end - 1) >> 12); | 180 | if (rdev->mc.vram_start < rdev->mc.gtt_start) { |
181 | /* VRAM before AGP */ | ||
182 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, | ||
183 | rdev->mc.vram_start >> 12); | ||
184 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, | ||
185 | rdev->mc.gtt_end >> 12); | ||
186 | } else { | ||
187 | /* VRAM after AGP */ | ||
188 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, | ||
189 | rdev->mc.gtt_start >> 12); | ||
190 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, | ||
191 | rdev->mc.vram_end >> 12); | ||
192 | } | ||
193 | } else { | ||
194 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, | ||
195 | rdev->mc.vram_start >> 12); | ||
196 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, | ||
197 | rdev->mc.vram_end >> 12); | ||
198 | } | ||
191 | WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0); | 199 | WREG32(MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR, 0); |
192 | tmp = (((rdev->mc.vram_end - 1) >> 24) & 0xFFFF) << 16; | 200 | tmp = ((rdev->mc.vram_end >> 24) & 0xFFFF) << 16; |
193 | tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); | 201 | tmp |= ((rdev->mc.vram_start >> 24) & 0xFFFF); |
194 | WREG32(MC_VM_FB_LOCATION, tmp); | 202 | WREG32(MC_VM_FB_LOCATION, tmp); |
195 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); | 203 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); |
196 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); | 204 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); |
197 | WREG32(HDP_NONSURFACE_SIZE, (rdev->mc.mc_vram_size - 1) | 0x3FF); | 205 | WREG32(HDP_NONSURFACE_SIZE, (rdev->mc.mc_vram_size - 1) | 0x3FF); |
198 | if (rdev->flags & RADEON_IS_AGP) { | 206 | if (rdev->flags & RADEON_IS_AGP) { |
199 | WREG32(MC_VM_AGP_TOP, (rdev->mc.gtt_end - 1) >> 16); | 207 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16); |
200 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); | 208 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); |
201 | WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22); | 209 | WREG32(MC_VM_AGP_BASE, rdev->mc.agp_base >> 22); |
202 | } else { | 210 | } else { |
@@ -204,31 +212,10 @@ static void rv770_mc_resume(struct radeon_device *rdev) | |||
204 | WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF); | 212 | WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF); |
205 | WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF); | 213 | WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF); |
206 | } | 214 | } |
207 | WREG32(D1GRPH_PRIMARY_SURFACE_ADDRESS, new_d1grph_primary); | ||
208 | WREG32(D1GRPH_SECONDARY_SURFACE_ADDRESS, new_d1grph_secondary); | ||
209 | WREG32(D2GRPH_PRIMARY_SURFACE_ADDRESS, new_d2grph_primary); | ||
210 | WREG32(D2GRPH_SECONDARY_SURFACE_ADDRESS, new_d2grph_secondary); | ||
211 | WREG32(VGA_MEMORY_BASE_ADDRESS, rdev->mc.vram_start); | ||
212 | |||
213 | /* Unlock host access */ | ||
214 | WREG32(VGA_HDP_CONTROL, vga_hdp_control); | ||
215 | |||
216 | mdelay(1); | ||
217 | if (r600_mc_wait_for_idle(rdev)) { | 215 | if (r600_mc_wait_for_idle(rdev)) { |
218 | printk(KERN_WARNING "[drm] MC not idle !\n"); | 216 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); |
219 | } | 217 | } |
220 | 218 | rv515_mc_resume(rdev, &save); | |
221 | /* Restore video state */ | ||
222 | WREG32(D1CRTC_UPDATE_LOCK, 1); | ||
223 | WREG32(D2CRTC_UPDATE_LOCK, 1); | ||
224 | WREG32(D1CRTC_CONTROL, d1crtc_control); | ||
225 | WREG32(D2CRTC_CONTROL, d2crtc_control); | ||
226 | WREG32(D1CRTC_UPDATE_LOCK, 0); | ||
227 | WREG32(D2CRTC_UPDATE_LOCK, 0); | ||
228 | WREG32(D1VGA_CONTROL, d1vga_control); | ||
229 | WREG32(D2VGA_CONTROL, d2vga_control); | ||
230 | WREG32(VGA_RENDER_CONTROL, vga_render_control); | ||
231 | |||
232 | /* we need to own VRAM, so turn off the VGA renderer here | 219 | /* we need to own VRAM, so turn off the VGA renderer here |
233 | * to stop it overwriting our objects */ | 220 | * to stop it overwriting our objects */ |
234 | rv515_vga_render_disable(rdev); | 221 | rv515_vga_render_disable(rdev); |
@@ -542,11 +529,11 @@ static void rv770_gpu_init(struct radeon_device *rdev) | |||
542 | if (rdev->family == CHIP_RV770) | 529 | if (rdev->family == CHIP_RV770) |
543 | gb_tiling_config |= BANK_TILING(1); | 530 | gb_tiling_config |= BANK_TILING(1); |
544 | else | 531 | else |
545 | gb_tiling_config |= BANK_TILING((mc_arb_ramcfg & NOOFBANK_SHIFT) >> NOOFBANK_MASK); | 532 | gb_tiling_config |= BANK_TILING((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT); |
546 | 533 | ||
547 | gb_tiling_config |= GROUP_SIZE(0); | 534 | gb_tiling_config |= GROUP_SIZE(0); |
548 | 535 | ||
549 | if (((mc_arb_ramcfg & NOOFROWS_MASK) & NOOFROWS_SHIFT) > 3) { | 536 | if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) { |
550 | gb_tiling_config |= ROW_TILING(3); | 537 | gb_tiling_config |= ROW_TILING(3); |
551 | gb_tiling_config |= SAMPLE_SPLIT(3); | 538 | gb_tiling_config |= SAMPLE_SPLIT(3); |
552 | } else { | 539 | } else { |
@@ -592,14 +579,14 @@ static void rv770_gpu_init(struct radeon_device *rdev) | |||
592 | 579 | ||
593 | /* set HW defaults for 3D engine */ | 580 | /* set HW defaults for 3D engine */ |
594 | WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) | | 581 | WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) | |
595 | ROQ_IB2_START(0x2b))); | 582 | ROQ_IB2_START(0x2b))); |
596 | 583 | ||
597 | WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30)); | 584 | WREG32(CP_MEQ_THRESHOLDS, STQ_SPLIT(0x30)); |
598 | 585 | ||
599 | WREG32(TA_CNTL_AUX, (DISABLE_CUBE_ANISO | | 586 | WREG32(TA_CNTL_AUX, (DISABLE_CUBE_ANISO | |
600 | SYNC_GRADIENT | | 587 | SYNC_GRADIENT | |
601 | SYNC_WALKER | | 588 | SYNC_WALKER | |
602 | SYNC_ALIGNER)); | 589 | SYNC_ALIGNER)); |
603 | 590 | ||
604 | sx_debug_1 = RREG32(SX_DEBUG_1); | 591 | sx_debug_1 = RREG32(SX_DEBUG_1); |
605 | sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS; | 592 | sx_debug_1 |= ENABLE_NEW_SMX_ADDRESS; |
@@ -611,9 +598,9 @@ static void rv770_gpu_init(struct radeon_device *rdev) | |||
611 | WREG32(SMX_DC_CTL0, smx_dc_ctl0); | 598 | WREG32(SMX_DC_CTL0, smx_dc_ctl0); |
612 | 599 | ||
613 | WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) | | 600 | WREG32(SMX_EVENT_CTL, (ES_FLUSH_CTL(4) | |
614 | GS_FLUSH_CTL(4) | | 601 | GS_FLUSH_CTL(4) | |
615 | ACK_FLUSH_CTL(3) | | 602 | ACK_FLUSH_CTL(3) | |
616 | SYNC_FLUSH_CTL)); | 603 | SYNC_FLUSH_CTL)); |
617 | 604 | ||
618 | if (rdev->family == CHIP_RV770) | 605 | if (rdev->family == CHIP_RV770) |
619 | WREG32(DB_DEBUG3, DB_CLK_OFF_DELAY(0x1f)); | 606 | WREG32(DB_DEBUG3, DB_CLK_OFF_DELAY(0x1f)); |
@@ -624,12 +611,12 @@ static void rv770_gpu_init(struct radeon_device *rdev) | |||
624 | } | 611 | } |
625 | 612 | ||
626 | WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.rv770.sx_max_export_size / 4) - 1) | | 613 | WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.rv770.sx_max_export_size / 4) - 1) | |
627 | POSITION_BUFFER_SIZE((rdev->config.rv770.sx_max_export_pos_size / 4) - 1) | | 614 | POSITION_BUFFER_SIZE((rdev->config.rv770.sx_max_export_pos_size / 4) - 1) | |
628 | SMX_BUFFER_SIZE((rdev->config.rv770.sx_max_export_smx_size / 4) - 1))); | 615 | SMX_BUFFER_SIZE((rdev->config.rv770.sx_max_export_smx_size / 4) - 1))); |
629 | 616 | ||
630 | WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.rv770.sc_prim_fifo_size) | | 617 | WREG32(PA_SC_FIFO_SIZE, (SC_PRIM_FIFO_SIZE(rdev->config.rv770.sc_prim_fifo_size) | |
631 | SC_HIZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_hiz_tile_fifo_size) | | 618 | SC_HIZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_hiz_tile_fifo_size) | |
632 | SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_earlyz_tile_fifo_fize))); | 619 | SC_EARLYZ_TILE_FIFO_SIZE(rdev->config.rv770.sc_earlyz_tile_fifo_fize))); |
633 | 620 | ||
634 | WREG32(PA_SC_MULTI_CHIP_CNTL, 0); | 621 | WREG32(PA_SC_MULTI_CHIP_CNTL, 0); |
635 | 622 | ||
@@ -787,14 +774,36 @@ int rv770_mc_init(struct radeon_device *rdev) | |||
787 | { | 774 | { |
788 | fixed20_12 a; | 775 | fixed20_12 a; |
789 | u32 tmp; | 776 | u32 tmp; |
777 | int chansize, numchan; | ||
790 | int r; | 778 | int r; |
791 | 779 | ||
792 | /* Get VRAM informations */ | 780 | /* Get VRAM informations */ |
793 | /* FIXME: Don't know how to determine vram width, need to check | ||
794 | * vram_width usage | ||
795 | */ | ||
796 | rdev->mc.vram_width = 128; | ||
797 | rdev->mc.vram_is_ddr = true; | 781 | rdev->mc.vram_is_ddr = true; |
782 | tmp = RREG32(MC_ARB_RAMCFG); | ||
783 | if (tmp & CHANSIZE_OVERRIDE) { | ||
784 | chansize = 16; | ||
785 | } else if (tmp & CHANSIZE_MASK) { | ||
786 | chansize = 64; | ||
787 | } else { | ||
788 | chansize = 32; | ||
789 | } | ||
790 | tmp = RREG32(MC_SHARED_CHMAP); | ||
791 | switch ((tmp & NOOFCHAN_MASK) >> NOOFCHAN_SHIFT) { | ||
792 | case 0: | ||
793 | default: | ||
794 | numchan = 1; | ||
795 | break; | ||
796 | case 1: | ||
797 | numchan = 2; | ||
798 | break; | ||
799 | case 2: | ||
800 | numchan = 4; | ||
801 | break; | ||
802 | case 3: | ||
803 | numchan = 8; | ||
804 | break; | ||
805 | } | ||
806 | rdev->mc.vram_width = numchan * chansize; | ||
798 | /* Could aper size report 0 ? */ | 807 | /* Could aper size report 0 ? */ |
799 | rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); | 808 | rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); |
800 | rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); | 809 | rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); |
@@ -840,9 +849,9 @@ int rv770_mc_init(struct radeon_device *rdev) | |||
840 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; | 849 | rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024; |
841 | } | 850 | } |
842 | rdev->mc.vram_start = rdev->mc.vram_location; | 851 | rdev->mc.vram_start = rdev->mc.vram_location; |
843 | rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size; | 852 | rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; |
844 | rdev->mc.gtt_start = rdev->mc.gtt_location; | 853 | rdev->mc.gtt_start = rdev->mc.gtt_location; |
845 | rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size; | 854 | rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size - 1; |
846 | /* FIXME: we should enforce default clock in case GPU is not in | 855 | /* FIXME: we should enforce default clock in case GPU is not in |
847 | * default setup | 856 | * default setup |
848 | */ | 857 | */ |
@@ -861,11 +870,14 @@ static int rv770_startup(struct radeon_device *rdev) | |||
861 | { | 870 | { |
862 | int r; | 871 | int r; |
863 | 872 | ||
864 | radeon_gpu_reset(rdev); | 873 | rv770_mc_program(rdev); |
865 | rv770_mc_resume(rdev); | 874 | if (rdev->flags & RADEON_IS_AGP) { |
866 | r = rv770_pcie_gart_enable(rdev); | 875 | rv770_agp_enable(rdev); |
867 | if (r) | 876 | } else { |
868 | return r; | 877 | r = rv770_pcie_gart_enable(rdev); |
878 | if (r) | ||
879 | return r; | ||
880 | } | ||
869 | rv770_gpu_init(rdev); | 881 | rv770_gpu_init(rdev); |
870 | 882 | ||
871 | r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM, | 883 | r = radeon_object_pin(rdev->r600_blit.shader_obj, RADEON_GEM_DOMAIN_VRAM, |
@@ -884,9 +896,8 @@ static int rv770_startup(struct radeon_device *rdev) | |||
884 | r = r600_cp_resume(rdev); | 896 | r = r600_cp_resume(rdev); |
885 | if (r) | 897 | if (r) |
886 | return r; | 898 | return r; |
887 | r = r600_wb_init(rdev); | 899 | /* write back buffer are not vital so don't worry about failure */ |
888 | if (r) | 900 | r600_wb_enable(rdev); |
889 | return r; | ||
890 | return 0; | 901 | return 0; |
891 | } | 902 | } |
892 | 903 | ||
@@ -894,15 +905,12 @@ int rv770_resume(struct radeon_device *rdev) | |||
894 | { | 905 | { |
895 | int r; | 906 | int r; |
896 | 907 | ||
897 | if (radeon_gpu_reset(rdev)) { | 908 | /* Do not reset GPU before posting, on rv770 hw unlike on r500 hw, |
898 | /* FIXME: what do we want to do here ? */ | 909 | * posting will perform necessary task to bring back GPU into good |
899 | } | 910 | * shape. |
911 | */ | ||
900 | /* post card */ | 912 | /* post card */ |
901 | if (rdev->is_atom_bios) { | 913 | atom_asic_init(rdev->mode_info.atom_context); |
902 | atom_asic_init(rdev->mode_info.atom_context); | ||
903 | } else { | ||
904 | radeon_combios_asic_init(rdev->ddev); | ||
905 | } | ||
906 | /* Initialize clocks */ | 914 | /* Initialize clocks */ |
907 | r = radeon_clocks_init(rdev); | 915 | r = radeon_clocks_init(rdev); |
908 | if (r) { | 916 | if (r) { |
@@ -915,7 +923,7 @@ int rv770_resume(struct radeon_device *rdev) | |||
915 | return r; | 923 | return r; |
916 | } | 924 | } |
917 | 925 | ||
918 | r = radeon_ib_test(rdev); | 926 | r = r600_ib_test(rdev); |
919 | if (r) { | 927 | if (r) { |
920 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); | 928 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); |
921 | return r; | 929 | return r; |
@@ -929,8 +937,8 @@ int rv770_suspend(struct radeon_device *rdev) | |||
929 | /* FIXME: we should wait for ring to be empty */ | 937 | /* FIXME: we should wait for ring to be empty */ |
930 | r700_cp_stop(rdev); | 938 | r700_cp_stop(rdev); |
931 | rdev->cp.ready = false; | 939 | rdev->cp.ready = false; |
940 | r600_wb_disable(rdev); | ||
932 | rv770_pcie_gart_disable(rdev); | 941 | rv770_pcie_gart_disable(rdev); |
933 | |||
934 | /* unpin shaders bo */ | 942 | /* unpin shaders bo */ |
935 | radeon_object_unpin(rdev->r600_blit.shader_obj); | 943 | radeon_object_unpin(rdev->r600_blit.shader_obj); |
936 | return 0; | 944 | return 0; |
@@ -946,7 +954,6 @@ int rv770_init(struct radeon_device *rdev) | |||
946 | { | 954 | { |
947 | int r; | 955 | int r; |
948 | 956 | ||
949 | rdev->new_init_path = true; | ||
950 | r = radeon_dummy_page_init(rdev); | 957 | r = radeon_dummy_page_init(rdev); |
951 | if (r) | 958 | if (r) |
952 | return r; | 959 | return r; |
@@ -960,8 +967,10 @@ int rv770_init(struct radeon_device *rdev) | |||
960 | return -EINVAL; | 967 | return -EINVAL; |
961 | } | 968 | } |
962 | /* Must be an ATOMBIOS */ | 969 | /* Must be an ATOMBIOS */ |
963 | if (!rdev->is_atom_bios) | 970 | if (!rdev->is_atom_bios) { |
971 | dev_err(rdev->dev, "Expecting atombios for R600 GPU\n"); | ||
964 | return -EINVAL; | 972 | return -EINVAL; |
973 | } | ||
965 | r = radeon_atombios_init(rdev); | 974 | r = radeon_atombios_init(rdev); |
966 | if (r) | 975 | if (r) |
967 | return r; | 976 | return r; |
@@ -974,24 +983,20 @@ int rv770_init(struct radeon_device *rdev) | |||
974 | r600_scratch_init(rdev); | 983 | r600_scratch_init(rdev); |
975 | /* Initialize surface registers */ | 984 | /* Initialize surface registers */ |
976 | radeon_surface_init(rdev); | 985 | radeon_surface_init(rdev); |
986 | /* Initialize clocks */ | ||
977 | radeon_get_clock_info(rdev->ddev); | 987 | radeon_get_clock_info(rdev->ddev); |
978 | r = radeon_clocks_init(rdev); | 988 | r = radeon_clocks_init(rdev); |
979 | if (r) | 989 | if (r) |
980 | return r; | 990 | return r; |
991 | /* Initialize power management */ | ||
992 | radeon_pm_init(rdev); | ||
981 | /* Fence driver */ | 993 | /* Fence driver */ |
982 | r = radeon_fence_driver_init(rdev); | 994 | r = radeon_fence_driver_init(rdev); |
983 | if (r) | 995 | if (r) |
984 | return r; | 996 | return r; |
985 | r = rv770_mc_init(rdev); | 997 | r = rv770_mc_init(rdev); |
986 | if (r) { | 998 | if (r) |
987 | if (rdev->flags & RADEON_IS_AGP) { | ||
988 | /* Retry with disabling AGP */ | ||
989 | rv770_fini(rdev); | ||
990 | rdev->flags &= ~RADEON_IS_AGP; | ||
991 | return rv770_init(rdev); | ||
992 | } | ||
993 | return r; | 999 | return r; |
994 | } | ||
995 | /* Memory manager */ | 1000 | /* Memory manager */ |
996 | r = radeon_object_init(rdev); | 1001 | r = radeon_object_init(rdev); |
997 | if (r) | 1002 | if (r) |
@@ -1020,12 +1025,10 @@ int rv770_init(struct radeon_device *rdev) | |||
1020 | 1025 | ||
1021 | r = rv770_startup(rdev); | 1026 | r = rv770_startup(rdev); |
1022 | if (r) { | 1027 | if (r) { |
1023 | if (rdev->flags & RADEON_IS_AGP) { | 1028 | rv770_suspend(rdev); |
1024 | /* Retry with disabling AGP */ | 1029 | r600_wb_fini(rdev); |
1025 | rv770_fini(rdev); | 1030 | radeon_ring_fini(rdev); |
1026 | rdev->flags &= ~RADEON_IS_AGP; | 1031 | rv770_pcie_gart_fini(rdev); |
1027 | return rv770_init(rdev); | ||
1028 | } | ||
1029 | rdev->accel_working = false; | 1032 | rdev->accel_working = false; |
1030 | } | 1033 | } |
1031 | if (rdev->accel_working) { | 1034 | if (rdev->accel_working) { |
@@ -1034,7 +1037,7 @@ int rv770_init(struct radeon_device *rdev) | |||
1034 | DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r); | 1037 | DRM_ERROR("radeon: failled initializing IB pool (%d).\n", r); |
1035 | rdev->accel_working = false; | 1038 | rdev->accel_working = false; |
1036 | } | 1039 | } |
1037 | r = radeon_ib_test(rdev); | 1040 | r = r600_ib_test(rdev); |
1038 | if (r) { | 1041 | if (r) { |
1039 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); | 1042 | DRM_ERROR("radeon: failled testing IB (%d).\n", r); |
1040 | rdev->accel_working = false; | 1043 | rdev->accel_working = false; |
@@ -1049,20 +1052,15 @@ void rv770_fini(struct radeon_device *rdev) | |||
1049 | 1052 | ||
1050 | r600_blit_fini(rdev); | 1053 | r600_blit_fini(rdev); |
1051 | radeon_ring_fini(rdev); | 1054 | radeon_ring_fini(rdev); |
1055 | r600_wb_fini(rdev); | ||
1052 | rv770_pcie_gart_fini(rdev); | 1056 | rv770_pcie_gart_fini(rdev); |
1053 | radeon_gem_fini(rdev); | 1057 | radeon_gem_fini(rdev); |
1054 | radeon_fence_driver_fini(rdev); | 1058 | radeon_fence_driver_fini(rdev); |
1055 | radeon_clocks_fini(rdev); | 1059 | radeon_clocks_fini(rdev); |
1056 | #if __OS_HAS_AGP | ||
1057 | if (rdev->flags & RADEON_IS_AGP) | 1060 | if (rdev->flags & RADEON_IS_AGP) |
1058 | radeon_agp_fini(rdev); | 1061 | radeon_agp_fini(rdev); |
1059 | #endif | ||
1060 | radeon_object_fini(rdev); | 1062 | radeon_object_fini(rdev); |
1061 | if (rdev->is_atom_bios) { | 1063 | radeon_atombios_fini(rdev); |
1062 | radeon_atombios_fini(rdev); | ||
1063 | } else { | ||
1064 | radeon_combios_fini(rdev); | ||
1065 | } | ||
1066 | kfree(rdev->bios); | 1064 | kfree(rdev->bios); |
1067 | rdev->bios = NULL; | 1065 | rdev->bios = NULL; |
1068 | radeon_dummy_page_fini(rdev); | 1066 | radeon_dummy_page_fini(rdev); |