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

drm/amdgpu: add mmhub ras_late_init callback function (v2)

The function will be called in late init phase to do mmhub
ras init

v2: check ras_late_init function pointer before invoking the
function

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
dda79907 2452e778

+35 -22
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_mmhub.h
··· 23 23 24 24 struct amdgpu_mmhub_funcs { 25 25 void (*ras_init)(struct amdgpu_device *adev); 26 + int (*ras_late_init)(struct amdgpu_device *adev); 26 27 void (*query_ras_error_count)(struct amdgpu_device *adev, 27 28 void *ras_error_status); 28 29 };
+4 -22
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
··· 766 766 { 767 767 int r; 768 768 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 769 - struct ras_ih_if mmhub_ih_info; 770 769 struct ras_fs_if umc_fs_info = { 771 770 .sysfs_name = "umc_err_count", 772 771 .debugfs_name = "umc_err_inject", 773 772 }; 774 773 struct ras_ih_if umc_ih_info = { 775 774 .cb = gmc_v9_0_process_ras_data_cb, 776 - }; 777 - struct ras_fs_if mmhub_fs_info = { 778 - .sysfs_name = "mmhub_err_count", 779 - .debugfs_name = "mmhub_err_inject", 780 775 }; 781 776 782 777 if (!adev->gmc.umc_ras_if) { ··· 796 801 goto umc_late_fini; 797 802 } 798 803 799 - if (!adev->gmc.mmhub_ras_if) { 800 - adev->gmc.mmhub_ras_if = kmalloc(sizeof(struct ras_common_if), GFP_KERNEL); 801 - if (!adev->gmc.mmhub_ras_if) 802 - return -ENOMEM; 803 - adev->gmc.mmhub_ras_if->block = AMDGPU_RAS_BLOCK__MMHUB; 804 - adev->gmc.mmhub_ras_if->type = AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE; 805 - adev->gmc.mmhub_ras_if->sub_block_index = 0; 806 - strcpy(adev->gmc.mmhub_ras_if->name, "mmhub"); 804 + if (adev->mmhub_funcs->ras_late_init) { 805 + r = adev->mmhub_funcs->ras_late_init(adev); 806 + if (r) 807 + return r; 807 808 } 808 - mmhub_ih_info.head = mmhub_fs_info.head = *adev->gmc.mmhub_ras_if; 809 - r = amdgpu_ras_late_init(adev, adev->gmc.mmhub_ras_if, 810 - &mmhub_fs_info, &mmhub_ih_info); 811 - if (r) 812 - goto mmhub_late_fini; 813 - 814 809 return 0; 815 - mmhub_late_fini: 816 - amdgpu_ras_late_fini(adev, adev->gmc.mmhub_ras_if, &mmhub_ih_info); 817 810 umc_late_fini: 818 811 amdgpu_ras_late_fini(adev, adev->gmc.umc_ras_if, &umc_ih_info); 819 812 free: 820 813 kfree(adev->gmc.umc_ras_if); 821 - kfree(adev->gmc.mmhub_ras_if); 822 814 return r; 823 815 } 824 816
+30
drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c
··· 31 31 #include "vega10_enum.h" 32 32 33 33 #include "soc15_common.h" 34 + #include "amdgpu_ras.h" 34 35 35 36 #define mmDAGB0_CNTL_MISC2_RV 0x008f 36 37 #define mmDAGB0_CNTL_MISC2_RV_BASE_IDX 0 ··· 616 615 } 617 616 } 618 617 618 + static int mmhub_v1_0_ras_late_init(struct amdgpu_device *adev) 619 + { 620 + int r; 621 + struct ras_ih_if mmhub_ih_info = { 622 + .cb = NULL, 623 + }; 624 + struct ras_fs_if mmhub_fs_info = { 625 + .sysfs_name = "mmhub_err_count", 626 + .debugfs_name = "mmhub_err_inject", 627 + }; 628 + 629 + if (!adev->gmc.mmhub_ras_if) { 630 + adev->gmc.mmhub_ras_if = kmalloc(sizeof(struct ras_common_if), GFP_KERNEL); 631 + if (!adev->gmc.mmhub_ras_if) 632 + return -ENOMEM; 633 + adev->gmc.mmhub_ras_if->block = AMDGPU_RAS_BLOCK__MMHUB; 634 + adev->gmc.mmhub_ras_if->type = AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE; 635 + adev->gmc.mmhub_ras_if->sub_block_index = 0; 636 + strcpy(adev->gmc.mmhub_ras_if->name, "mmhub"); 637 + } 638 + mmhub_ih_info.head = mmhub_fs_info.head = *adev->gmc.mmhub_ras_if; 639 + r = amdgpu_ras_late_init(adev, adev->gmc.mmhub_ras_if, 640 + &mmhub_fs_info, &mmhub_ih_info); 641 + if (r) 642 + kfree(adev->gmc.mmhub_ras_if); 643 + return r; 644 + } 645 + 619 646 const struct amdgpu_mmhub_funcs mmhub_v1_0_funcs = { 647 + .ras_late_init = mmhub_v1_0_ras_late_init, 620 648 .query_ras_error_count = mmhub_v1_0_query_ras_error_count, 621 649 };