r600.c (a2d07b7438f015a0349bc9af3c96a8164549bbc5) r600.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

--- 735 unchanged lines hidden (view full) ---

744 u32 grbm2_busy_mask = S_008014_SPI0_BUSY(1) | S_008014_SPI1_BUSY(1) |
745 S_008014_SPI2_BUSY(1) | S_008014_SPI3_BUSY(1) |
746 S_008014_TA0_BUSY(1) | S_008014_TA1_BUSY(1) |
747 S_008014_TA2_BUSY(1) | S_008014_TA3_BUSY(1) |
748 S_008014_DB0_BUSY(1) | S_008014_DB1_BUSY(1) |
749 S_008014_DB2_BUSY(1) | S_008014_DB3_BUSY(1) |
750 S_008014_CB0_BUSY(1) | S_008014_CB1_BUSY(1) |
751 S_008014_CB2_BUSY(1) | S_008014_CB3_BUSY(1);
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

--- 735 unchanged lines hidden (view full) ---

744 u32 grbm2_busy_mask = S_008014_SPI0_BUSY(1) | S_008014_SPI1_BUSY(1) |
745 S_008014_SPI2_BUSY(1) | S_008014_SPI3_BUSY(1) |
746 S_008014_TA0_BUSY(1) | S_008014_TA1_BUSY(1) |
747 S_008014_TA2_BUSY(1) | S_008014_TA3_BUSY(1) |
748 S_008014_DB0_BUSY(1) | S_008014_DB1_BUSY(1) |
749 S_008014_DB2_BUSY(1) | S_008014_DB3_BUSY(1) |
750 S_008014_CB0_BUSY(1) | S_008014_CB1_BUSY(1) |
751 S_008014_CB2_BUSY(1) | S_008014_CB3_BUSY(1);
752 u32 srbm_reset = 0;
753 u32 tmp;
754
755 dev_info(rdev->dev, "GPU softreset \n");
756 dev_info(rdev->dev, " R_008010_GRBM_STATUS=0x%08X\n",
757 RREG32(R_008010_GRBM_STATUS));
758 dev_info(rdev->dev, " R_008014_GRBM_STATUS2=0x%08X\n",
759 RREG32(R_008014_GRBM_STATUS2));
760 dev_info(rdev->dev, " R_000E50_SRBM_STATUS=0x%08X\n",
761 RREG32(R_000E50_SRBM_STATUS));
762 rv515_mc_stop(rdev, &save);
763 if (r600_mc_wait_for_idle(rdev)) {
764 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
765 }
766 /* Disable CP parsing/prefetching */
752 u32 tmp;
753
754 dev_info(rdev->dev, "GPU softreset \n");
755 dev_info(rdev->dev, " R_008010_GRBM_STATUS=0x%08X\n",
756 RREG32(R_008010_GRBM_STATUS));
757 dev_info(rdev->dev, " R_008014_GRBM_STATUS2=0x%08X\n",
758 RREG32(R_008014_GRBM_STATUS2));
759 dev_info(rdev->dev, " R_000E50_SRBM_STATUS=0x%08X\n",
760 RREG32(R_000E50_SRBM_STATUS));
761 rv515_mc_stop(rdev, &save);
762 if (r600_mc_wait_for_idle(rdev)) {
763 dev_warn(rdev->dev, "Wait for MC idle timedout !\n");
764 }
765 /* Disable CP parsing/prefetching */
767 WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(0xff));
766 WREG32(R_0086D8_CP_ME_CNTL, S_0086D8_CP_ME_HALT(1));
768 /* Check if any of the rendering block is busy and reset it */
769 if ((RREG32(R_008010_GRBM_STATUS) & grbm_busy_mask) ||
770 (RREG32(R_008014_GRBM_STATUS2) & grbm2_busy_mask)) {
771 tmp = S_008020_SOFT_RESET_CR(1) |
772 S_008020_SOFT_RESET_DB(1) |
773 S_008020_SOFT_RESET_CB(1) |
774 S_008020_SOFT_RESET_PA(1) |
775 S_008020_SOFT_RESET_SC(1) |
776 S_008020_SOFT_RESET_SMX(1) |
777 S_008020_SOFT_RESET_SPI(1) |
778 S_008020_SOFT_RESET_SX(1) |
779 S_008020_SOFT_RESET_SH(1) |
780 S_008020_SOFT_RESET_TC(1) |
781 S_008020_SOFT_RESET_TA(1) |
782 S_008020_SOFT_RESET_VC(1) |
783 S_008020_SOFT_RESET_VGT(1);
784 dev_info(rdev->dev, " R_008020_GRBM_SOFT_RESET=0x%08X\n", tmp);
785 WREG32(R_008020_GRBM_SOFT_RESET, tmp);
767 /* Check if any of the rendering block is busy and reset it */
768 if ((RREG32(R_008010_GRBM_STATUS) & grbm_busy_mask) ||
769 (RREG32(R_008014_GRBM_STATUS2) & grbm2_busy_mask)) {
770 tmp = S_008020_SOFT_RESET_CR(1) |
771 S_008020_SOFT_RESET_DB(1) |
772 S_008020_SOFT_RESET_CB(1) |
773 S_008020_SOFT_RESET_PA(1) |
774 S_008020_SOFT_RESET_SC(1) |
775 S_008020_SOFT_RESET_SMX(1) |
776 S_008020_SOFT_RESET_SPI(1) |
777 S_008020_SOFT_RESET_SX(1) |
778 S_008020_SOFT_RESET_SH(1) |
779 S_008020_SOFT_RESET_TC(1) |
780 S_008020_SOFT_RESET_TA(1) |
781 S_008020_SOFT_RESET_VC(1) |
782 S_008020_SOFT_RESET_VGT(1);
783 dev_info(rdev->dev, " R_008020_GRBM_SOFT_RESET=0x%08X\n", tmp);
784 WREG32(R_008020_GRBM_SOFT_RESET, tmp);
786 (void)RREG32(R_008020_GRBM_SOFT_RESET);
787 mdelay(1);
785 RREG32(R_008020_GRBM_SOFT_RESET);
786 mdelay(15);
788 WREG32(R_008020_GRBM_SOFT_RESET, 0);
787 WREG32(R_008020_GRBM_SOFT_RESET, 0);
789 (void)RREG32(R_008020_GRBM_SOFT_RESET);
790 }
791 /* Reset CP (we always reset CP) */
792 tmp = S_008020_SOFT_RESET_CP(1);
793 dev_info(rdev->dev, "R_008020_GRBM_SOFT_RESET=0x%08X\n", tmp);
794 WREG32(R_008020_GRBM_SOFT_RESET, tmp);
788 }
789 /* Reset CP (we always reset CP) */
790 tmp = S_008020_SOFT_RESET_CP(1);
791 dev_info(rdev->dev, "R_008020_GRBM_SOFT_RESET=0x%08X\n", tmp);
792 WREG32(R_008020_GRBM_SOFT_RESET, tmp);
795 (void)RREG32(R_008020_GRBM_SOFT_RESET);
796 udelay(50);
793 RREG32(R_008020_GRBM_SOFT_RESET);
794 mdelay(15);
797 WREG32(R_008020_GRBM_SOFT_RESET, 0);
795 WREG32(R_008020_GRBM_SOFT_RESET, 0);
798 (void)RREG32(R_008020_GRBM_SOFT_RESET);
799 /* Reset others GPU block if necessary */
800 if (G_000E50_RLC_BUSY(RREG32(R_000E50_SRBM_STATUS)))
801 srbm_reset |= S_000E60_SOFT_RESET_RLC(1);
802 if (G_000E50_GRBM_RQ_PENDING(RREG32(R_000E50_SRBM_STATUS)))
803 srbm_reset |= S_000E60_SOFT_RESET_GRBM(1);
804 if (G_000E50_HI_RQ_PENDING(RREG32(R_000E50_SRBM_STATUS)))
805 srbm_reset |= S_000E60_SOFT_RESET_IH(1);
806 if (G_000E50_VMC_BUSY(RREG32(R_000E50_SRBM_STATUS)))
807 srbm_reset |= S_000E60_SOFT_RESET_VMC(1);
808 if (G_000E50_MCB_BUSY(RREG32(R_000E50_SRBM_STATUS)))
809 srbm_reset |= S_000E60_SOFT_RESET_MC(1);
810 if (G_000E50_MCDZ_BUSY(RREG32(R_000E50_SRBM_STATUS)))
811 srbm_reset |= S_000E60_SOFT_RESET_MC(1);
812 if (G_000E50_MCDY_BUSY(RREG32(R_000E50_SRBM_STATUS)))
813 srbm_reset |= S_000E60_SOFT_RESET_MC(1);
814 if (G_000E50_MCDX_BUSY(RREG32(R_000E50_SRBM_STATUS)))
815 srbm_reset |= S_000E60_SOFT_RESET_MC(1);
816 if (G_000E50_MCDW_BUSY(RREG32(R_000E50_SRBM_STATUS)))
817 srbm_reset |= S_000E60_SOFT_RESET_MC(1);
818 if (G_000E50_RLC_BUSY(RREG32(R_000E50_SRBM_STATUS)))
819 srbm_reset |= S_000E60_SOFT_RESET_RLC(1);
820 if (G_000E50_SEM_BUSY(RREG32(R_000E50_SRBM_STATUS)))
821 srbm_reset |= S_000E60_SOFT_RESET_SEM(1);
822 if (G_000E50_BIF_BUSY(RREG32(R_000E50_SRBM_STATUS)))
823 srbm_reset |= S_000E60_SOFT_RESET_BIF(1);
824 dev_info(rdev->dev, " R_000E60_SRBM_SOFT_RESET=0x%08X\n", srbm_reset);
825 WREG32(R_000E60_SRBM_SOFT_RESET, srbm_reset);
826 (void)RREG32(R_000E60_SRBM_SOFT_RESET);
827 mdelay(1);
828 WREG32(R_000E60_SRBM_SOFT_RESET, 0);
829 (void)RREG32(R_000E60_SRBM_SOFT_RESET);
830 WREG32(R_000E60_SRBM_SOFT_RESET, srbm_reset);
831 (void)RREG32(R_000E60_SRBM_SOFT_RESET);
832 mdelay(1);
833 WREG32(R_000E60_SRBM_SOFT_RESET, 0);
834 (void)RREG32(R_000E60_SRBM_SOFT_RESET);
835 /* Wait a little for things to settle down */
836 mdelay(1);
837 dev_info(rdev->dev, " R_008010_GRBM_STATUS=0x%08X\n",
838 RREG32(R_008010_GRBM_STATUS));
839 dev_info(rdev->dev, " R_008014_GRBM_STATUS2=0x%08X\n",
840 RREG32(R_008014_GRBM_STATUS2));
841 dev_info(rdev->dev, " R_000E50_SRBM_STATUS=0x%08X\n",
842 RREG32(R_000E50_SRBM_STATUS));
796 /* Wait a little for things to settle down */
797 mdelay(1);
798 dev_info(rdev->dev, " R_008010_GRBM_STATUS=0x%08X\n",
799 RREG32(R_008010_GRBM_STATUS));
800 dev_info(rdev->dev, " R_008014_GRBM_STATUS2=0x%08X\n",
801 RREG32(R_008014_GRBM_STATUS2));
802 dev_info(rdev->dev, " R_000E50_SRBM_STATUS=0x%08X\n",
803 RREG32(R_000E50_SRBM_STATUS));
843 /* After reset we need to reinit the asic as GPU often endup in an
844 * incoherent state.
845 */
846 atom_asic_init(rdev->mode_info.atom_context);
847 rv515_mc_resume(rdev, &save);
848 return 0;
849}
850
851bool r600_gpu_is_lockup(struct radeon_device *rdev)
852{
853 u32 srbm_status;
854 u32 grbm_status;

--- 2124 unchanged lines hidden ---
804 rv515_mc_resume(rdev, &save);
805 return 0;
806}
807
808bool r600_gpu_is_lockup(struct radeon_device *rdev)
809{
810 u32 srbm_status;
811 u32 grbm_status;

--- 2124 unchanged lines hidden ---