diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3688-drm-amdgpu-add-helper-function-to-do-common-ras_late.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3688-drm-amdgpu-add-helper-function-to-do-common-ras_late.patch | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3688-drm-amdgpu-add-helper-function-to-do-common-ras_late.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3688-drm-amdgpu-add-helper-function-to-do-common-ras_late.patch new file mode 100644 index 00000000..244f7274 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3688-drm-amdgpu-add-helper-function-to-do-common-ras_late.patch @@ -0,0 +1,129 @@ +From df854606ec23fb0ced20f62ce6b71b48e8e98934 Mon Sep 17 00:00:00 2001 +From: Hawking Zhang <Hawking.Zhang@amd.com> +Date: Fri, 30 Aug 2019 13:29:18 +0800 +Subject: [PATCH 3688/4256] drm/amdgpu: add helper function to do common + ras_late_init/fini (v3) + +In late_init for ras, the helper function will be used to +1). disable ras feature if the IP block is masked as disabled +2). send enable feature command if the ip block was masked as enabled +3). create debugfs/sysfs node per IP block +4). register interrupt handler + +v2: check ih_info.cb to decide add interrupt handler or not + +v3: add ras_late_fini for cleanup all the ras fs node and remove +interrupt handler + +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> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 72 +++++++++++++++++++++++++ + drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h | 7 +++ + 2 files changed, 79 insertions(+) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c +index 230f7e63e4d8..2ca3997d4b3a 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c +@@ -1564,6 +1564,78 @@ int amdgpu_ras_init(struct amdgpu_device *adev) + return -EINVAL; + } + ++/* helper function to handle common stuff in ip late init phase */ ++int amdgpu_ras_late_init(struct amdgpu_device *adev, ++ struct ras_common_if *ras_block, ++ struct ras_fs_if *fs_info, ++ struct ras_ih_if *ih_info) ++{ ++ int r; ++ ++ /* disable RAS feature per IP block if it is not supported */ ++ if (!amdgpu_ras_is_supported(adev, ras_block->block)) { ++ amdgpu_ras_feature_enable_on_boot(adev, ras_block, 0); ++ return 0; ++ } ++ ++ r = amdgpu_ras_feature_enable_on_boot(adev, ras_block, 1); ++ if (r) { ++ if (r == -EAGAIN) { ++ /* request gpu reset. will run again */ ++ amdgpu_ras_request_reset_on_boot(adev, ++ ras_block->block); ++ return 0; ++ } else if (adev->in_suspend || adev->in_gpu_reset) { ++ /* in resume phase, if fail to enable ras, ++ * clean up all ras fs nodes, and disable ras */ ++ goto cleanup; ++ } else ++ return r; ++ } ++ ++ /* in resume phase, no need to create ras fs node */ ++ if (adev->in_suspend || adev->in_gpu_reset) ++ return 0; ++ ++ if (ih_info->cb) { ++ r = amdgpu_ras_interrupt_add_handler(adev, ih_info); ++ if (r) ++ goto interrupt; ++ } ++ ++ amdgpu_ras_debugfs_create(adev, fs_info); ++ ++ r = amdgpu_ras_sysfs_create(adev, fs_info); ++ if (r) ++ goto sysfs; ++ ++ return 0; ++cleanup: ++ amdgpu_ras_sysfs_remove(adev, ras_block); ++sysfs: ++ amdgpu_ras_debugfs_remove(adev, ras_block); ++ if (ih_info->cb) ++ amdgpu_ras_interrupt_remove_handler(adev, ih_info); ++interrupt: ++ amdgpu_ras_feature_enable(adev, ras_block, 0); ++ return r; ++} ++ ++/* helper function to remove ras fs node and interrupt handler */ ++void amdgpu_ras_late_fini(struct amdgpu_device *adev, ++ struct ras_common_if *ras_block, ++ struct ras_ih_if *ih_info) ++{ ++ if (!ras_block || !ih_info) ++ return; ++ ++ amdgpu_ras_sysfs_remove(adev, ras_block); ++ amdgpu_ras_debugfs_remove(adev, ras_block); ++ if (ih_info->cb) ++ amdgpu_ras_interrupt_remove_handler(adev, ih_info); ++ amdgpu_ras_feature_enable(adev, ras_block, 0); ++} ++ + /* do some init work after IP late init as dependence. + * and it runs in resume/gpu reset/booting up cases. + */ +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h +index 6c76bb2a6843..66b71525446e 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h +@@ -566,6 +566,13 @@ amdgpu_ras_error_to_ta(enum amdgpu_ras_error_type error) { + int amdgpu_ras_init(struct amdgpu_device *adev); + int amdgpu_ras_fini(struct amdgpu_device *adev); + int amdgpu_ras_pre_fini(struct amdgpu_device *adev); ++int amdgpu_ras_late_init(struct amdgpu_device *adev, ++ struct ras_common_if *ras_block, ++ struct ras_fs_if *fs_info, ++ struct ras_ih_if *ih_info); ++void amdgpu_ras_late_fini(struct amdgpu_device *adev, ++ struct ras_common_if *ras_block, ++ struct ras_ih_if *ih_info); + + int amdgpu_ras_feature_enable(struct amdgpu_device *adev, + struct ras_common_if *head, bool enable); +-- +2.17.1 + |