Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: Add reset_ras_error_status for mmhub v1_8

Add reset_ras_error_status callback for mmhub
v1_8. It will be used to reset mmhub error status.

Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com>
Reviewed-by: Tao Zhou <tao.zhou1@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Hawking Zhang and committed by
Alex Deucher
ccfdbd4b 00c14522

+91
+91
drivers/gpu/drm/amd/amdgpu/mmhub_v1_8.c
··· 756 756 for_each_inst(i, inst_mask) 757 757 mmhub_v1_8_inst_query_ras_err_status(adev, i); 758 758 } 759 + 760 + static const uint32_t mmhub_v1_8_mmea_cgtt_clk_cntl_reg[] = { 761 + regMMEA0_CGTT_CLK_CTRL, 762 + regMMEA1_CGTT_CLK_CTRL, 763 + regMMEA2_CGTT_CLK_CTRL, 764 + regMMEA3_CGTT_CLK_CTRL, 765 + regMMEA4_CGTT_CLK_CTRL, 766 + }; 767 + 768 + static void mmhub_v1_8_inst_reset_ras_err_status(struct amdgpu_device *adev, 769 + uint32_t mmhub_inst) 770 + { 771 + uint32_t mmea_cgtt_clk_cntl_addr_dist; 772 + uint32_t mmea_err_status_addr_dist; 773 + uint32_t reg_value; 774 + uint32_t i; 775 + 776 + /* reset mmea ras err status */ 777 + mmea_cgtt_clk_cntl_addr_dist = regMMEA1_CGTT_CLK_CTRL - regMMEA0_CGTT_CLK_CTRL; 778 + mmea_err_status_addr_dist = regMMEA1_ERR_STATUS - regMMEA0_ERR_STATUS; 779 + for (i = 0; i < ARRAY_SIZE(mmhub_v1_8_mmea_err_status_reg); i ++) { 780 + /* force clk branch on for response path 781 + * set MMEA0_CGTT_CLK_CTRL.SOFT_OVERRIDE_RETURN = 1 */ 782 + reg_value = RREG32_SOC15_OFFSET(MMHUB, mmhub_inst, 783 + regMMEA0_CGTT_CLK_CTRL, 784 + i * mmea_cgtt_clk_cntl_addr_dist); 785 + reg_value = REG_SET_FIELD(reg_value, MMEA0_CGTT_CLK_CTRL, 786 + SOFT_OVERRIDE_RETURN, 1); 787 + WREG32_SOC15_OFFSET(MMHUB, mmhub_inst, 788 + regMMEA0_CGTT_CLK_CTRL, 789 + i * mmea_cgtt_clk_cntl_addr_dist, 790 + reg_value); 791 + 792 + /* set MMEA0_ERR_STATUS.CLEAR_ERROR_STATUS = 1 */ 793 + reg_value = RREG32_SOC15_OFFSET(MMHUB, mmhub_inst, 794 + regMMEA0_ERR_STATUS, 795 + i * mmea_err_status_addr_dist); 796 + reg_value = REG_SET_FIELD(reg_value, MMEA0_ERR_STATUS, 797 + CLEAR_ERROR_STATUS, 1); 798 + WREG32_SOC15_OFFSET(MMHUB, mmhub_inst, 799 + regMMEA0_ERR_STATUS, 800 + i * mmea_err_status_addr_dist, 801 + reg_value); 802 + 803 + /* set MMEA0_CGTT_CLK_CTRL.SOFT_OVERRIDE_RETURN = 0 */ 804 + reg_value = RREG32_SOC15_OFFSET(MMHUB, mmhub_inst, 805 + regMMEA0_CGTT_CLK_CTRL, 806 + i * mmea_cgtt_clk_cntl_addr_dist); 807 + reg_value = REG_SET_FIELD(reg_value, MMEA0_CGTT_CLK_CTRL, 808 + SOFT_OVERRIDE_RETURN, 0); 809 + WREG32_SOC15_OFFSET(MMHUB, mmhub_inst, 810 + regMMEA0_CGTT_CLK_CTRL, 811 + i * mmea_cgtt_clk_cntl_addr_dist, 812 + reg_value); 813 + } 814 + 815 + /* reset mm_cane ras err status 816 + * force clk branch on for response path 817 + * set MM_CANE_ICG_CTRL.SOFT_OVERRIDE_ATRET = 1 */ 818 + reg_value = RREG32_SOC15(MMHUB, mmhub_inst, regMM_CANE_ICG_CTRL); 819 + reg_value = REG_SET_FIELD(reg_value, MM_CANE_ICG_CTRL, 820 + SOFT_OVERRIDE_ATRET, 1); 821 + WREG32_SOC15(MMHUB, mmhub_inst, regMM_CANE_ICG_CTRL, reg_value); 822 + 823 + /* set MM_CANE_ERR_STATUS.CLEAR_ERROR_STATUS = 1 */ 824 + reg_value = RREG32_SOC15(MMHUB, mmhub_inst, regMM_CANE_ERR_STATUS); 825 + reg_value = REG_SET_FIELD(reg_value, MM_CANE_ERR_STATUS, 826 + CLEAR_ERROR_STATUS, 1); 827 + WREG32_SOC15(MMHUB, mmhub_inst, regMM_CANE_ERR_STATUS, reg_value); 828 + 829 + /* set MM_CANE_ICG_CTRL.SOFT_OVERRIDE_ATRET = 0 */ 830 + reg_value = RREG32_SOC15(MMHUB, mmhub_inst, regMM_CANE_ICG_CTRL); 831 + reg_value = REG_SET_FIELD(reg_value, MM_CANE_ICG_CTRL, 832 + SOFT_OVERRIDE_ATRET, 0); 833 + WREG32_SOC15(MMHUB, mmhub_inst, regMM_CANE_ICG_CTRL, reg_value); 834 + } 835 + 836 + static void mmhub_v1_8_reset_ras_error_status(struct amdgpu_device *adev) 837 + { 838 + uint32_t inst_mask; 839 + uint32_t i; 840 + 841 + if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__MMHUB)) { 842 + dev_warn(adev->dev, "MMHUB RAS is not supported\n"); 843 + return; 844 + } 845 + 846 + inst_mask = adev->aid_mask; 847 + for_each_inst(i, inst_mask) 848 + mmhub_v1_8_inst_reset_ras_err_status(adev, i); 849 + }