diff options
author | Dave Airlie <airlied@redhat.com> | 2010-04-19 23:15:05 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2010-04-19 23:15:05 -0400 |
commit | 0bcb1d844ac638a4c4280f697d5bfac9791e9a70 (patch) | |
tree | c51aa8427a81cb64dded4d4f68bf1a1b8ad32041 /drivers/gpu/drm/radeon/rv515.c | |
parent | c9c2625ff4fc4ce652e686f895059d2902c01ca0 (diff) | |
parent | 90aca4d2740255bd130ea71a91530b9920c70abe (diff) |
Merge branch 'drm-radeon-lockup' into drm-core-next
* drm-radeon-lockup:
drm/radeon/kms: simplify & improve GPU reset V2
drm/radeon/kms: rename gpu_reset to asic_reset
drm/radeon/kms: fence cleanup + more reliable GPU lockup detection V4
Conflicts:
drivers/gpu/drm/radeon/r300.c
Diffstat (limited to 'drivers/gpu/drm/radeon/rv515.c')
-rw-r--r-- | drivers/gpu/drm/radeon/rv515.c | 96 |
1 files changed, 3 insertions, 93 deletions
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index 9035121f4b58..c513473d72ae 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
@@ -147,16 +147,11 @@ void rv515_gpu_init(struct radeon_device *rdev) | |||
147 | { | 147 | { |
148 | unsigned pipe_select_current, gb_pipe_select, tmp; | 148 | unsigned pipe_select_current, gb_pipe_select, tmp; |
149 | 149 | ||
150 | r100_hdp_reset(rdev); | ||
151 | r100_rb2d_reset(rdev); | ||
152 | |||
153 | if (r100_gui_wait_for_idle(rdev)) { | 150 | if (r100_gui_wait_for_idle(rdev)) { |
154 | printk(KERN_WARNING "Failed to wait GUI idle while " | 151 | printk(KERN_WARNING "Failed to wait GUI idle while " |
155 | "reseting GPU. Bad things might happen.\n"); | 152 | "reseting GPU. Bad things might happen.\n"); |
156 | } | 153 | } |
157 | |||
158 | rv515_vga_render_disable(rdev); | 154 | rv515_vga_render_disable(rdev); |
159 | |||
160 | r420_pipes_init(rdev); | 155 | r420_pipes_init(rdev); |
161 | gb_pipe_select = RREG32(0x402C); | 156 | gb_pipe_select = RREG32(0x402C); |
162 | tmp = RREG32(0x170C); | 157 | tmp = RREG32(0x170C); |
@@ -174,91 +169,6 @@ void rv515_gpu_init(struct radeon_device *rdev) | |||
174 | } | 169 | } |
175 | } | 170 | } |
176 | 171 | ||
177 | int rv515_ga_reset(struct radeon_device *rdev) | ||
178 | { | ||
179 | uint32_t tmp; | ||
180 | bool reinit_cp; | ||
181 | int i; | ||
182 | |||
183 | reinit_cp = rdev->cp.ready; | ||
184 | rdev->cp.ready = false; | ||
185 | for (i = 0; i < rdev->usec_timeout; i++) { | ||
186 | WREG32(CP_CSQ_MODE, 0); | ||
187 | WREG32(CP_CSQ_CNTL, 0); | ||
188 | WREG32(RBBM_SOFT_RESET, 0x32005); | ||
189 | (void)RREG32(RBBM_SOFT_RESET); | ||
190 | udelay(200); | ||
191 | WREG32(RBBM_SOFT_RESET, 0); | ||
192 | /* Wait to prevent race in RBBM_STATUS */ | ||
193 | mdelay(1); | ||
194 | tmp = RREG32(RBBM_STATUS); | ||
195 | if (tmp & ((1 << 20) | (1 << 26))) { | ||
196 | DRM_ERROR("VAP & CP still busy (RBBM_STATUS=0x%08X)\n", tmp); | ||
197 | /* GA still busy soft reset it */ | ||
198 | WREG32(0x429C, 0x200); | ||
199 | WREG32(VAP_PVS_STATE_FLUSH_REG, 0); | ||
200 | WREG32(0x43E0, 0); | ||
201 | WREG32(0x43E4, 0); | ||
202 | WREG32(0x24AC, 0); | ||
203 | } | ||
204 | /* Wait to prevent race in RBBM_STATUS */ | ||
205 | mdelay(1); | ||
206 | tmp = RREG32(RBBM_STATUS); | ||
207 | if (!(tmp & ((1 << 20) | (1 << 26)))) { | ||
208 | break; | ||
209 | } | ||
210 | } | ||
211 | for (i = 0; i < rdev->usec_timeout; i++) { | ||
212 | tmp = RREG32(RBBM_STATUS); | ||
213 | if (!(tmp & ((1 << 20) | (1 << 26)))) { | ||
214 | DRM_INFO("GA reset succeed (RBBM_STATUS=0x%08X)\n", | ||
215 | tmp); | ||
216 | DRM_INFO("GA_IDLE=0x%08X\n", RREG32(0x425C)); | ||
217 | DRM_INFO("RB3D_RESET_STATUS=0x%08X\n", RREG32(0x46f0)); | ||
218 | DRM_INFO("ISYNC_CNTL=0x%08X\n", RREG32(0x1724)); | ||
219 | if (reinit_cp) { | ||
220 | return r100_cp_init(rdev, rdev->cp.ring_size); | ||
221 | } | ||
222 | return 0; | ||
223 | } | ||
224 | DRM_UDELAY(1); | ||
225 | } | ||
226 | tmp = RREG32(RBBM_STATUS); | ||
227 | DRM_ERROR("Failed to reset GA ! (RBBM_STATUS=0x%08X)\n", tmp); | ||
228 | return -1; | ||
229 | } | ||
230 | |||
231 | int rv515_gpu_reset(struct radeon_device *rdev) | ||
232 | { | ||
233 | uint32_t status; | ||
234 | |||
235 | /* reset order likely matter */ | ||
236 | status = RREG32(RBBM_STATUS); | ||
237 | /* reset HDP */ | ||
238 | r100_hdp_reset(rdev); | ||
239 | /* reset rb2d */ | ||
240 | if (status & ((1 << 17) | (1 << 18) | (1 << 27))) { | ||
241 | r100_rb2d_reset(rdev); | ||
242 | } | ||
243 | /* reset GA */ | ||
244 | if (status & ((1 << 20) | (1 << 26))) { | ||
245 | rv515_ga_reset(rdev); | ||
246 | } | ||
247 | /* reset CP */ | ||
248 | status = RREG32(RBBM_STATUS); | ||
249 | if (status & (1 << 16)) { | ||
250 | r100_cp_reset(rdev); | ||
251 | } | ||
252 | /* Check if GPU is idle */ | ||
253 | status = RREG32(RBBM_STATUS); | ||
254 | if (status & (1 << 31)) { | ||
255 | DRM_ERROR("Failed to reset GPU (RBBM_STATUS=0x%08X)\n", status); | ||
256 | return -1; | ||
257 | } | ||
258 | DRM_INFO("GPU reset succeed (RBBM_STATUS=0x%08X)\n", status); | ||
259 | return 0; | ||
260 | } | ||
261 | |||
262 | static void rv515_vram_get_type(struct radeon_device *rdev) | 172 | static void rv515_vram_get_type(struct radeon_device *rdev) |
263 | { | 173 | { |
264 | uint32_t tmp; | 174 | uint32_t tmp; |
@@ -335,7 +245,7 @@ static int rv515_debugfs_ga_info(struct seq_file *m, void *data) | |||
335 | 245 | ||
336 | tmp = RREG32(0x2140); | 246 | tmp = RREG32(0x2140); |
337 | seq_printf(m, "VAP_CNTL_STATUS 0x%08x\n", tmp); | 247 | seq_printf(m, "VAP_CNTL_STATUS 0x%08x\n", tmp); |
338 | radeon_gpu_reset(rdev); | 248 | radeon_asic_reset(rdev); |
339 | tmp = RREG32(0x425C); | 249 | tmp = RREG32(0x425C); |
340 | seq_printf(m, "GA_IDLE 0x%08x\n", tmp); | 250 | seq_printf(m, "GA_IDLE 0x%08x\n", tmp); |
341 | return 0; | 251 | return 0; |
@@ -503,7 +413,7 @@ int rv515_resume(struct radeon_device *rdev) | |||
503 | /* Resume clock before doing reset */ | 413 | /* Resume clock before doing reset */ |
504 | rv515_clock_startup(rdev); | 414 | rv515_clock_startup(rdev); |
505 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | 415 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ |
506 | if (radeon_gpu_reset(rdev)) { | 416 | if (radeon_asic_reset(rdev)) { |
507 | dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | 417 | dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", |
508 | RREG32(R_000E40_RBBM_STATUS), | 418 | RREG32(R_000E40_RBBM_STATUS), |
509 | RREG32(R_0007C0_CP_STAT)); | 419 | RREG32(R_0007C0_CP_STAT)); |
@@ -573,7 +483,7 @@ int rv515_init(struct radeon_device *rdev) | |||
573 | return -EINVAL; | 483 | return -EINVAL; |
574 | } | 484 | } |
575 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ | 485 | /* Reset gpu before posting otherwise ATOM will enter infinite loop */ |
576 | if (radeon_gpu_reset(rdev)) { | 486 | if (radeon_asic_reset(rdev)) { |
577 | dev_warn(rdev->dev, | 487 | dev_warn(rdev->dev, |
578 | "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", | 488 | "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n", |
579 | RREG32(R_000E40_RBBM_STATUS), | 489 | RREG32(R_000E40_RBBM_STATUS), |