diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/evergreen.c')
-rw-r--r-- | drivers/gpu/drm/radeon/evergreen.c | 73 |
1 files changed, 71 insertions, 2 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index afcff06ef291..a6130a494c56 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
@@ -511,12 +511,81 @@ bool evergreen_gpu_is_lockup(struct radeon_device *rdev) | |||
511 | return false; | 511 | return false; |
512 | } | 512 | } |
513 | 513 | ||
514 | int evergreen_asic_reset(struct radeon_device *rdev) | 514 | static int evergreen_gpu_soft_reset(struct radeon_device *rdev) |
515 | { | 515 | { |
516 | /* FIXME: implement for evergreen */ | 516 | struct evergreen_mc_save save; |
517 | u32 srbm_reset = 0; | ||
518 | u32 grbm_reset = 0; | ||
519 | |||
520 | dev_info(rdev->dev, "GPU softreset \n"); | ||
521 | dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", | ||
522 | RREG32(GRBM_STATUS)); | ||
523 | dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n", | ||
524 | RREG32(GRBM_STATUS_SE0)); | ||
525 | dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n", | ||
526 | RREG32(GRBM_STATUS_SE1)); | ||
527 | dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n", | ||
528 | RREG32(SRBM_STATUS)); | ||
529 | evergreen_mc_stop(rdev, &save); | ||
530 | if (evergreen_mc_wait_for_idle(rdev)) { | ||
531 | dev_warn(rdev->dev, "Wait for MC idle timedout !\n"); | ||
532 | } | ||
533 | /* Disable CP parsing/prefetching */ | ||
534 | WREG32(CP_ME_CNTL, CP_ME_HALT | CP_PFP_HALT); | ||
535 | |||
536 | /* reset all the gfx blocks */ | ||
537 | grbm_reset = (SOFT_RESET_CP | | ||
538 | SOFT_RESET_CB | | ||
539 | SOFT_RESET_DB | | ||
540 | SOFT_RESET_PA | | ||
541 | SOFT_RESET_SC | | ||
542 | SOFT_RESET_SPI | | ||
543 | SOFT_RESET_SH | | ||
544 | SOFT_RESET_SX | | ||
545 | SOFT_RESET_TC | | ||
546 | SOFT_RESET_TA | | ||
547 | SOFT_RESET_VC | | ||
548 | SOFT_RESET_VGT); | ||
549 | |||
550 | dev_info(rdev->dev, " GRBM_SOFT_RESET=0x%08X\n", grbm_reset); | ||
551 | WREG32(GRBM_SOFT_RESET, grbm_reset); | ||
552 | (void)RREG32(GRBM_SOFT_RESET); | ||
553 | udelay(50); | ||
554 | WREG32(GRBM_SOFT_RESET, 0); | ||
555 | (void)RREG32(GRBM_SOFT_RESET); | ||
556 | |||
557 | /* reset all the system blocks */ | ||
558 | srbm_reset = SRBM_SOFT_RESET_ALL_MASK; | ||
559 | |||
560 | dev_info(rdev->dev, " SRBM_SOFT_RESET=0x%08X\n", srbm_reset); | ||
561 | WREG32(SRBM_SOFT_RESET, srbm_reset); | ||
562 | (void)RREG32(SRBM_SOFT_RESET); | ||
563 | udelay(50); | ||
564 | WREG32(SRBM_SOFT_RESET, 0); | ||
565 | (void)RREG32(SRBM_SOFT_RESET); | ||
566 | /* Wait a little for things to settle down */ | ||
567 | udelay(50); | ||
568 | dev_info(rdev->dev, " GRBM_STATUS=0x%08X\n", | ||
569 | RREG32(GRBM_STATUS)); | ||
570 | dev_info(rdev->dev, " GRBM_STATUS_SE0=0x%08X\n", | ||
571 | RREG32(GRBM_STATUS_SE0)); | ||
572 | dev_info(rdev->dev, " GRBM_STATUS_SE1=0x%08X\n", | ||
573 | RREG32(GRBM_STATUS_SE1)); | ||
574 | dev_info(rdev->dev, " SRBM_STATUS=0x%08X\n", | ||
575 | RREG32(SRBM_STATUS)); | ||
576 | /* After reset we need to reinit the asic as GPU often endup in an | ||
577 | * incoherent state. | ||
578 | */ | ||
579 | atom_asic_init(rdev->mode_info.atom_context); | ||
580 | evergreen_mc_resume(rdev, &save); | ||
517 | return 0; | 581 | return 0; |
518 | } | 582 | } |
519 | 583 | ||
584 | int evergreen_asic_reset(struct radeon_device *rdev) | ||
585 | { | ||
586 | return evergreen_gpu_soft_reset(rdev); | ||
587 | } | ||
588 | |||
520 | static int evergreen_startup(struct radeon_device *rdev) | 589 | static int evergreen_startup(struct radeon_device *rdev) |
521 | { | 590 | { |
522 | int r; | 591 | int r; |