diff options
author | Jerome Glisse <jglisse@redhat.com> | 2009-10-01 12:02:13 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2009-10-01 19:34:03 -0400 |
commit | a3c1945aaf48a5893238d95139f202531994094d (patch) | |
tree | 369e87201ddb801f7d740fbc8a1777c65655f9f6 /drivers/gpu/drm/radeon/rv770.c | |
parent | 81cc35bfc19ebe4b823396fe4fef67a923360916 (diff) |
drm/radeon/kms: Fix R600/RV770 startup path & reset
We were calling reset unconditionaly in the startup path
this is bad we need to call GPU reset for a good reason
as after reset the GPU is in unknown states. To avoid any
more bad things to happen we now also unconditionaly
reinitialize the GPU after reset. This patch fix few issues
reported by different people regarding KMS & R6XX/RV7XX hw.
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
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 */ |