aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3688-drm-amdgpu-add-helper-function-to-do-common-ras_late.patch
diff options
context:
space:
mode:
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.patch129
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
+