diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/rv770.c')
-rw-r--r-- | drivers/gpu/drm/radeon/rv770.c | 72 |
1 files changed, 8 insertions, 64 deletions
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index af20a8d48dca..a06e7497d49e 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
@@ -129,14 +129,9 @@ void rv770_pcie_gart_fini(struct radeon_device *rdev) | |||
129 | /* | 129 | /* |
130 | * MC | 130 | * MC |
131 | */ | 131 | */ |
132 | static void rv770_mc_resume(struct radeon_device *rdev) | 132 | static void rv770_mc_program(struct radeon_device *rdev) |
133 | { | 133 | { |
134 | u32 d1vga_control, d2vga_control; | 134 | 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; | 135 | u32 tmp; |
141 | int i, j; | 136 | int i, j; |
142 | 137 | ||
@@ -150,41 +145,12 @@ static void rv770_mc_resume(struct radeon_device *rdev) | |||
150 | } | 145 | } |
151 | WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0); | 146 | WREG32(HDP_REG_COHERENCY_FLUSH_CNTL, 0); |
152 | 147 | ||
153 | d1vga_control = RREG32(D1VGA_CONTROL); | 148 | 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)) { | 149 | if (r600_mc_wait_for_idle(rdev)) { |
182 | printk(KERN_WARNING "[drm] MC not idle !\n"); | 150 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); |
183 | } | 151 | } |
184 | |||
185 | /* Lockout access through VGA aperture*/ | 152 | /* Lockout access through VGA aperture*/ |
186 | WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); | 153 | WREG32(VGA_HDP_CONTROL, VGA_MEMORY_DISABLE); |
187 | |||
188 | /* Update configuration */ | 154 | /* Update configuration */ |
189 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.vram_start >> 12); | 155 | WREG32(MC_VM_SYSTEM_APERTURE_LOW_ADDR, rdev->mc.vram_start >> 12); |
190 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, (rdev->mc.vram_end - 1) >> 12); | 156 | WREG32(MC_VM_SYSTEM_APERTURE_HIGH_ADDR, (rdev->mc.vram_end - 1) >> 12); |
@@ -204,31 +170,10 @@ static void rv770_mc_resume(struct radeon_device *rdev) | |||
204 | WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF); | 170 | WREG32(MC_VM_AGP_TOP, 0x0FFFFFFF); |
205 | WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF); | 171 | WREG32(MC_VM_AGP_BOT, 0x0FFFFFFF); |
206 | } | 172 | } |
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)) { | 173 | if (r600_mc_wait_for_idle(rdev)) { |
218 | printk(KERN_WARNING "[drm] MC not idle !\n"); | 174 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); |
219 | } | 175 | } |
220 | 176 | 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 | 177 | /* we need to own VRAM, so turn off the VGA renderer here |
233 | * to stop it overwriting our objects */ | 178 | * to stop it overwriting our objects */ |
234 | rv515_vga_render_disable(rdev); | 179 | rv515_vga_render_disable(rdev); |
@@ -861,8 +806,7 @@ static int rv770_startup(struct radeon_device *rdev) | |||
861 | { | 806 | { |
862 | int r; | 807 | int r; |
863 | 808 | ||
864 | radeon_gpu_reset(rdev); | 809 | rv770_mc_program(rdev); |
865 | rv770_mc_resume(rdev); | ||
866 | r = rv770_pcie_gart_enable(rdev); | 810 | r = rv770_pcie_gart_enable(rdev); |
867 | if (r) | 811 | if (r) |
868 | return r; | 812 | return r; |
@@ -893,7 +837,7 @@ int rv770_resume(struct radeon_device *rdev) | |||
893 | { | 837 | { |
894 | int r; | 838 | int r; |
895 | 839 | ||
896 | if (radeon_gpu_reset(rdev)) { | 840 | if (rv770_gpu_reset(rdev)) { |
897 | /* FIXME: what do we want to do here ? */ | 841 | /* FIXME: what do we want to do here ? */ |
898 | } | 842 | } |
899 | /* post card */ | 843 | /* post card */ |