r300.c (a2d07b7438f015a0349bc9af3c96a8164549bbc5) | r300.c (90aca4d2740255bd130ea71a91530b9920c70abe) |
---|---|
1/* 2 * Copyright 2008 Advanced Micro Devices, Inc. 3 * Copyright 2008 Red Hat Inc. 4 * Copyright 2009 Jerome Glisse. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation --- 137 unchanged lines hidden (view full) --- 146 return 0; 147} 148 149void rv370_pcie_gart_disable(struct radeon_device *rdev) 150{ 151 u32 tmp; 152 int r; 153 | 1/* 2 * Copyright 2008 Advanced Micro Devices, Inc. 3 * Copyright 2008 Red Hat Inc. 4 * Copyright 2009 Jerome Glisse. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation --- 137 unchanged lines hidden (view full) --- 146 return 0; 147} 148 149void rv370_pcie_gart_disable(struct radeon_device *rdev) 150{ 151 u32 tmp; 152 int r; 153 |
154 WREG32_PCIE(RADEON_PCIE_TX_GART_START_LO, 0); 155 WREG32_PCIE(RADEON_PCIE_TX_GART_END_LO, 0); 156 WREG32_PCIE(RADEON_PCIE_TX_GART_START_HI, 0); 157 WREG32_PCIE(RADEON_PCIE_TX_GART_END_HI, 0); |
|
154 tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); 155 tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; 156 WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp & ~RADEON_PCIE_TX_GART_EN); 157 if (rdev->gart.table.vram.robj) { 158 r = radeon_bo_reserve(rdev->gart.table.vram.robj, false); 159 if (likely(r == 0)) { 160 radeon_bo_kunmap(rdev->gart.table.vram.robj); 161 radeon_bo_unpin(rdev->gart.table.vram.robj); --- 156 unchanged lines hidden (view full) --- 318 } 319 return -1; 320} 321 322void r300_gpu_init(struct radeon_device *rdev) 323{ 324 uint32_t gb_tile_config, tmp; 325 | 158 tmp = RREG32_PCIE(RADEON_PCIE_TX_GART_CNTL); 159 tmp |= RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; 160 WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp & ~RADEON_PCIE_TX_GART_EN); 161 if (rdev->gart.table.vram.robj) { 162 r = radeon_bo_reserve(rdev->gart.table.vram.robj, false); 163 if (likely(r == 0)) { 164 radeon_bo_kunmap(rdev->gart.table.vram.robj); 165 radeon_bo_unpin(rdev->gart.table.vram.robj); --- 156 unchanged lines hidden (view full) --- 322 } 323 return -1; 324} 325 326void r300_gpu_init(struct radeon_device *rdev) 327{ 328 uint32_t gb_tile_config, tmp; 329 |
326 r100_hdp_reset(rdev); | |
327 /* FIXME: rv380 one pipes ? */ 328 if ((rdev->family == CHIP_R300 && rdev->pdev->device != 0x4144) || 329 (rdev->family == CHIP_R350)) { 330 /* r300,r350 */ 331 rdev->num_gb_pipes = 2; 332 } else { 333 /* rv350,rv370,rv380,r300 AD */ 334 rdev->num_gb_pipes = 1; --- 36 unchanged lines hidden (view full) --- 371 if (r300_mc_wait_for_idle(rdev)) { 372 printk(KERN_WARNING "Failed to wait MC idle while " 373 "programming pipes. Bad things might happen.\n"); 374 } 375 DRM_INFO("radeon: %d quad pipes, %d Z pipes initialized.\n", 376 rdev->num_gb_pipes, rdev->num_z_pipes); 377} 378 | 330 /* FIXME: rv380 one pipes ? */ 331 if ((rdev->family == CHIP_R300 && rdev->pdev->device != 0x4144) || 332 (rdev->family == CHIP_R350)) { 333 /* r300,r350 */ 334 rdev->num_gb_pipes = 2; 335 } else { 336 /* rv350,rv370,rv380,r300 AD */ 337 rdev->num_gb_pipes = 1; --- 36 unchanged lines hidden (view full) --- 374 if (r300_mc_wait_for_idle(rdev)) { 375 printk(KERN_WARNING "Failed to wait MC idle while " 376 "programming pipes. Bad things might happen.\n"); 377 } 378 DRM_INFO("radeon: %d quad pipes, %d Z pipes initialized.\n", 379 rdev->num_gb_pipes, rdev->num_z_pipes); 380} 381 |
379int r300_ga_reset(struct radeon_device *rdev) 380{ 381 uint32_t tmp; 382 bool reinit_cp; 383 int i; 384 385 reinit_cp = rdev->cp.ready; 386 rdev->cp.ready = false; 387 for (i = 0; i < rdev->usec_timeout; i++) { 388 WREG32(RADEON_CP_CSQ_MODE, 0); 389 WREG32(RADEON_CP_CSQ_CNTL, 0); 390 WREG32(RADEON_RBBM_SOFT_RESET, 0x32005); 391 (void)RREG32(RADEON_RBBM_SOFT_RESET); 392 udelay(200); 393 WREG32(RADEON_RBBM_SOFT_RESET, 0); 394 /* Wait to prevent race in RBBM_STATUS */ 395 mdelay(1); 396 tmp = RREG32(RADEON_RBBM_STATUS); 397 if (tmp & ((1 << 20) | (1 << 26))) { 398 DRM_ERROR("VAP & CP still busy (RBBM_STATUS=0x%08X)", tmp); 399 /* GA still busy soft reset it */ 400 WREG32(0x429C, 0x200); 401 WREG32(R300_VAP_PVS_STATE_FLUSH_REG, 0); 402 WREG32(R300_RE_SCISSORS_TL, 0); 403 WREG32(R300_RE_SCISSORS_BR, 0); 404 WREG32(0x24AC, 0); 405 } 406 /* Wait to prevent race in RBBM_STATUS */ 407 mdelay(1); 408 tmp = RREG32(RADEON_RBBM_STATUS); 409 if (!(tmp & ((1 << 20) | (1 << 26)))) { 410 break; 411 } 412 } 413 for (i = 0; i < rdev->usec_timeout; i++) { 414 tmp = RREG32(RADEON_RBBM_STATUS); 415 if (!(tmp & ((1 << 20) | (1 << 26)))) { 416 DRM_INFO("GA reset succeed (RBBM_STATUS=0x%08X)\n", 417 tmp); 418 if (reinit_cp) { 419 return r100_cp_init(rdev, rdev->cp.ring_size); 420 } 421 return 0; 422 } 423 DRM_UDELAY(1); 424 } 425 tmp = RREG32(RADEON_RBBM_STATUS); 426 DRM_ERROR("Failed to reset GA ! (RBBM_STATUS=0x%08X)\n", tmp); 427 return -1; 428} 429 | |
430bool r300_gpu_is_lockup(struct radeon_device *rdev) 431{ 432 u32 rbbm_status; 433 int r; 434 435 rbbm_status = RREG32(R_000E40_RBBM_STATUS); 436 if (!G_000E40_GUI_ACTIVE(rbbm_status)) { 437 r100_gpu_lockup_update(&rdev->config.r300.lockup, &rdev->cp); --- 8 unchanged lines hidden (view full) --- 446 radeon_ring_unlock_commit(rdev); 447 } 448 rdev->cp.rptr = RREG32(RADEON_CP_RB_RPTR); 449 return r100_gpu_cp_is_lockup(rdev, &rdev->config.r300.lockup, &rdev->cp); 450} 451 452int r300_asic_reset(struct radeon_device *rdev) 453{ | 382bool r300_gpu_is_lockup(struct radeon_device *rdev) 383{ 384 u32 rbbm_status; 385 int r; 386 387 rbbm_status = RREG32(R_000E40_RBBM_STATUS); 388 if (!G_000E40_GUI_ACTIVE(rbbm_status)) { 389 r100_gpu_lockup_update(&rdev->config.r300.lockup, &rdev->cp); --- 8 unchanged lines hidden (view full) --- 398 radeon_ring_unlock_commit(rdev); 399 } 400 rdev->cp.rptr = RREG32(RADEON_CP_RB_RPTR); 401 return r100_gpu_cp_is_lockup(rdev, &rdev->config.r300.lockup, &rdev->cp); 402} 403 404int r300_asic_reset(struct radeon_device *rdev) 405{ |
454 uint32_t status; | 406 struct r100_mc_save save; 407 u32 status, tmp; |
455 | 408 |
456 /* reset order likely matter */ 457 status = RREG32(RADEON_RBBM_STATUS); 458 dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status); 459 /* reset HDP */ 460 r100_hdp_reset(rdev); 461 /* reset rb2d */ 462 if (status & ((1 << 17) | (1 << 18) | (1 << 27))) { 463 r100_rb2d_reset(rdev); | 409 r100_mc_stop(rdev, &save); 410 status = RREG32(R_000E40_RBBM_STATUS); 411 if (!G_000E40_GUI_ACTIVE(status)) { 412 return 0; |
464 } | 413 } |
465 /* reset GA */ 466 if (status & ((1 << 20) | (1 << 26))) { 467 r300_ga_reset(rdev); 468 } 469 /* reset CP */ 470 status = RREG32(RADEON_RBBM_STATUS); 471 if (status & (1 << 16)) { 472 r100_cp_reset(rdev); 473 } | 414 status = RREG32(R_000E40_RBBM_STATUS); 415 dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status); 416 /* stop CP */ 417 WREG32(RADEON_CP_CSQ_CNTL, 0); 418 tmp = RREG32(RADEON_CP_RB_CNTL); 419 WREG32(RADEON_CP_RB_CNTL, tmp | RADEON_RB_RPTR_WR_ENA); 420 WREG32(RADEON_CP_RB_RPTR_WR, 0); 421 WREG32(RADEON_CP_RB_WPTR, 0); 422 WREG32(RADEON_CP_RB_CNTL, tmp); 423 /* save PCI state */ 424 pci_save_state(rdev->pdev); 425 /* disable bus mastering */ 426 r100_bm_disable(rdev); 427 WREG32(R_0000F0_RBBM_SOFT_RESET, S_0000F0_SOFT_RESET_VAP(1) | 428 S_0000F0_SOFT_RESET_GA(1)); 429 RREG32(R_0000F0_RBBM_SOFT_RESET); 430 mdelay(500); 431 WREG32(R_0000F0_RBBM_SOFT_RESET, 0); 432 mdelay(1); 433 status = RREG32(R_000E40_RBBM_STATUS); 434 dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status); 435 /* resetting the CP seems to be problematic sometimes it end up 436 * hard locking the computer, but it's necessary for successfull 437 * reset more test & playing is needed on R3XX/R4XX to find a 438 * reliable (if any solution) 439 */ 440 WREG32(R_0000F0_RBBM_SOFT_RESET, S_0000F0_SOFT_RESET_CP(1)); 441 RREG32(R_0000F0_RBBM_SOFT_RESET); 442 mdelay(500); 443 WREG32(R_0000F0_RBBM_SOFT_RESET, 0); 444 mdelay(1); 445 status = RREG32(R_000E40_RBBM_STATUS); 446 dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status); 447 /* reset MC */ 448 WREG32(R_0000F0_RBBM_SOFT_RESET, S_0000F0_SOFT_RESET_MC(1)); 449 RREG32(R_0000F0_RBBM_SOFT_RESET); 450 mdelay(500); 451 WREG32(R_0000F0_RBBM_SOFT_RESET, 0); 452 mdelay(1); 453 status = RREG32(R_000E40_RBBM_STATUS); 454 dev_info(rdev->dev, "(%s:%d) RBBM_STATUS=0x%08X\n", __func__, __LINE__, status); 455 /* restore PCI & busmastering */ 456 pci_restore_state(rdev->pdev); 457 r100_enable_bm(rdev); |
474 /* Check if GPU is idle */ | 458 /* Check if GPU is idle */ |
475 status = RREG32(RADEON_RBBM_STATUS); 476 if (status & RADEON_RBBM_ACTIVE) { 477 DRM_ERROR("Failed to reset GPU (RBBM_STATUS=0x%08X)\n", status); | 459 if (G_000E40_GA_BUSY(status) || G_000E40_VAP_BUSY(status)) { 460 dev_err(rdev->dev, "failed to reset GPU\n"); 461 rdev->gpu_lockup = true; |
478 return -1; 479 } | 462 return -1; 463 } |
480 DRM_INFO("GPU reset succeed (RBBM_STATUS=0x%08X)\n", status); | 464 r100_mc_resume(rdev, &save); 465 dev_info(rdev->dev, "GPU reset succeed\n"); |
481 return 0; 482} 483 | 466 return 0; 467} 468 |
484 | |
485/* 486 * r300,r350,rv350,rv380 VRAM info 487 */ 488void r300_mc_init(struct radeon_device *rdev) 489{ 490 u64 base; 491 u32 tmp; 492 --- 978 unchanged lines hidden --- | 469/* 470 * r300,r350,rv350,rv380 VRAM info 471 */ 472void r300_mc_init(struct radeon_device *rdev) 473{ 474 u64 base; 475 u32 tmp; 476 --- 978 unchanged lines hidden --- |