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

drm/amdgpu: switch to amdgpu_ras_late_init for gmc v9 block (v2)

call helper function in late init phase to handle ras init
for gmc ip block

v2: call ras_late_fini to do clean up when fail to enable interrupt

Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@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
2452e778 7d0a31e8

+47 -112
+47 -112
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
··· 762 762 return 0; 763 763 } 764 764 765 - static int gmc_v9_0_ecc_ras_block_late_init(void *handle, 766 - struct ras_fs_if *fs_info, struct ras_common_if *ras_block) 767 - { 768 - struct amdgpu_device *adev = (struct amdgpu_device *)handle; 769 - struct ras_common_if **ras_if = NULL; 770 - struct ras_ih_if ih_info = { 771 - .cb = gmc_v9_0_process_ras_data_cb, 772 - }; 773 - int r; 774 - 775 - if (ras_block->block == AMDGPU_RAS_BLOCK__UMC) 776 - ras_if = &adev->gmc.umc_ras_if; 777 - else if (ras_block->block == AMDGPU_RAS_BLOCK__MMHUB) 778 - ras_if = &adev->gmc.mmhub_ras_if; 779 - else 780 - BUG(); 781 - 782 - if (!amdgpu_ras_is_supported(adev, ras_block->block)) { 783 - amdgpu_ras_feature_enable_on_boot(adev, ras_block, 0); 784 - return 0; 785 - } 786 - 787 - /* handle resume path. */ 788 - if (*ras_if) { 789 - /* resend ras TA enable cmd during resume. 790 - * prepare to handle failure. 791 - */ 792 - ih_info.head = **ras_if; 793 - r = amdgpu_ras_feature_enable_on_boot(adev, *ras_if, 1); 794 - if (r) { 795 - if (r == -EAGAIN) { 796 - /* request a gpu reset. will run again. */ 797 - amdgpu_ras_request_reset_on_boot(adev, 798 - ras_block->block); 799 - return 0; 800 - } 801 - /* fail to enable ras, cleanup all. */ 802 - goto irq; 803 - } 804 - /* enable successfully. continue. */ 805 - goto resume; 806 - } 807 - 808 - *ras_if = kmalloc(sizeof(**ras_if), GFP_KERNEL); 809 - if (!*ras_if) 810 - return -ENOMEM; 811 - 812 - **ras_if = *ras_block; 813 - 814 - r = amdgpu_ras_feature_enable_on_boot(adev, *ras_if, 1); 815 - if (r) { 816 - if (r == -EAGAIN) { 817 - amdgpu_ras_request_reset_on_boot(adev, 818 - ras_block->block); 819 - r = 0; 820 - } 821 - goto feature; 822 - } 823 - 824 - ih_info.head = **ras_if; 825 - fs_info->head = **ras_if; 826 - 827 - if (ras_block->block == AMDGPU_RAS_BLOCK__UMC) { 828 - r = amdgpu_ras_interrupt_add_handler(adev, &ih_info); 829 - if (r) 830 - goto interrupt; 831 - } 832 - 833 - amdgpu_ras_debugfs_create(adev, fs_info); 834 - 835 - r = amdgpu_ras_sysfs_create(adev, fs_info); 836 - if (r) 837 - goto sysfs; 838 - resume: 839 - if (ras_block->block == AMDGPU_RAS_BLOCK__UMC) { 840 - r = amdgpu_irq_get(adev, &adev->gmc.ecc_irq, 0); 841 - if (r) 842 - goto irq; 843 - } 844 - 845 - return 0; 846 - irq: 847 - amdgpu_ras_sysfs_remove(adev, *ras_if); 848 - sysfs: 849 - amdgpu_ras_debugfs_remove(adev, *ras_if); 850 - if (ras_block->block == AMDGPU_RAS_BLOCK__UMC) 851 - amdgpu_ras_interrupt_remove_handler(adev, &ih_info); 852 - interrupt: 853 - amdgpu_ras_feature_enable(adev, *ras_if, 0); 854 - feature: 855 - kfree(*ras_if); 856 - *ras_if = NULL; 857 - return r; 858 - } 859 - 860 765 static int gmc_v9_0_ecc_late_init(void *handle) 861 766 { 862 767 int r; 863 - 768 + struct amdgpu_device *adev = (struct amdgpu_device *)handle; 769 + struct ras_ih_if mmhub_ih_info; 864 770 struct ras_fs_if umc_fs_info = { 865 771 .sysfs_name = "umc_err_count", 866 772 .debugfs_name = "umc_err_inject", 867 773 }; 868 - struct ras_common_if umc_ras_block = { 869 - .block = AMDGPU_RAS_BLOCK__UMC, 870 - .type = AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE, 871 - .sub_block_index = 0, 872 - .name = "umc", 774 + struct ras_ih_if umc_ih_info = { 775 + .cb = gmc_v9_0_process_ras_data_cb, 873 776 }; 874 777 struct ras_fs_if mmhub_fs_info = { 875 778 .sysfs_name = "mmhub_err_count", 876 779 .debugfs_name = "mmhub_err_inject", 877 780 }; 878 - struct ras_common_if mmhub_ras_block = { 879 - .block = AMDGPU_RAS_BLOCK__MMHUB, 880 - .type = AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE, 881 - .sub_block_index = 0, 882 - .name = "mmhub", 883 - }; 884 781 885 - r = gmc_v9_0_ecc_ras_block_late_init(handle, 886 - &umc_fs_info, &umc_ras_block); 782 + if (!adev->gmc.umc_ras_if) { 783 + adev->gmc.umc_ras_if = kmalloc(sizeof(struct ras_common_if), GFP_KERNEL); 784 + if (!adev->gmc.umc_ras_if) 785 + return -ENOMEM; 786 + adev->gmc.umc_ras_if->block = AMDGPU_RAS_BLOCK__UMC; 787 + adev->gmc.umc_ras_if->type = AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE; 788 + adev->gmc.umc_ras_if->sub_block_index = 0; 789 + strcpy(adev->gmc.umc_ras_if->name, "umc"); 790 + } 791 + umc_ih_info.head = umc_fs_info.head = *adev->gmc.umc_ras_if; 792 + 793 + r = amdgpu_ras_late_init(adev, adev->gmc.umc_ras_if, 794 + &umc_fs_info, &umc_ih_info); 887 795 if (r) 888 - return r; 796 + goto free; 889 797 890 - r = gmc_v9_0_ecc_ras_block_late_init(handle, 891 - &mmhub_fs_info, &mmhub_ras_block); 798 + if (amdgpu_ras_is_supported(adev, adev->gmc.umc_ras_if->block)) { 799 + r = amdgpu_irq_get(adev, &adev->gmc.ecc_irq, 0); 800 + if (r) 801 + goto umc_late_fini; 802 + } 803 + 804 + if (!adev->gmc.mmhub_ras_if) { 805 + adev->gmc.mmhub_ras_if = kmalloc(sizeof(struct ras_common_if), GFP_KERNEL); 806 + if (!adev->gmc.mmhub_ras_if) 807 + return -ENOMEM; 808 + adev->gmc.mmhub_ras_if->block = AMDGPU_RAS_BLOCK__MMHUB; 809 + adev->gmc.mmhub_ras_if->type = AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE; 810 + adev->gmc.mmhub_ras_if->sub_block_index = 0; 811 + strcpy(adev->gmc.mmhub_ras_if->name, "mmhub"); 812 + } 813 + mmhub_ih_info.head = mmhub_fs_info.head = *adev->gmc.mmhub_ras_if; 814 + r = amdgpu_ras_late_init(adev, adev->gmc.mmhub_ras_if, 815 + &mmhub_fs_info, &mmhub_ih_info); 816 + if (r) 817 + goto mmhub_late_fini; 818 + 819 + return 0; 820 + mmhub_late_fini: 821 + amdgpu_ras_late_fini(adev, adev->gmc.mmhub_ras_if, &mmhub_ih_info); 822 + umc_late_fini: 823 + amdgpu_ras_late_fini(adev, adev->gmc.umc_ras_if, &umc_ih_info); 824 + free: 825 + kfree(adev->gmc.umc_ras_if); 826 + kfree(adev->gmc.mmhub_ras_if); 892 827 return r; 893 828 } 894 829