aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3743-drm-amdgpu-sdma-switch-to-amdgpu_sdma_ras_late_init-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3743-drm-amdgpu-sdma-switch-to-amdgpu_sdma_ras_late_init-.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3743-drm-amdgpu-sdma-switch-to-amdgpu_sdma_ras_late_init-.patch153
1 files changed, 153 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3743-drm-amdgpu-sdma-switch-to-amdgpu_sdma_ras_late_init-.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3743-drm-amdgpu-sdma-switch-to-amdgpu_sdma_ras_late_init-.patch
new file mode 100644
index 00000000..9772c158
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3743-drm-amdgpu-sdma-switch-to-amdgpu_sdma_ras_late_init-.patch
@@ -0,0 +1,153 @@
+From 84948b7edd03e91b08875b0d5ef88cf0a596e794 Mon Sep 17 00:00:00 2001
+From: Hawking Zhang <Hawking.Zhang@amd.com>
+Date: Tue, 3 Sep 2019 06:02:07 +0800
+Subject: [PATCH 3743/4256] drm/amdgpu/sdma: switch to
+ amdgpu_sdma_ras_late_init helper function
+
+amdgpu_sdma_ras_late_init is used to init sdma specfic
+ras debugfs/sysfs node and sdma specific interrupt handler.
+It can be shared among sdma generations
+
+Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com>
+Reviewed-by: Tao Zhou <tao.zhou1@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c | 52 ++++++++++++++++++++++++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h | 2 +
+ drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 42 +------------------
+ 3 files changed, 55 insertions(+), 41 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
+index 7ddffbf65999..a25301b75ef7 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c
+@@ -23,6 +23,7 @@
+ #include <drm/drmP.h>
+ #include "amdgpu.h"
+ #include "amdgpu_sdma.h"
++#include "amdgpu_ras.h"
+
+ #define AMDGPU_CSA_SDMA_SIZE 64
+ /* SDMA CSA reside in the 3rd page of CSA */
+@@ -83,3 +84,54 @@ uint64_t amdgpu_sdma_get_csa_mc_addr(struct amdgpu_ring *ring,
+
+ return csa_mc_addr;
+ }
++
++int amdgpu_sdma_ras_late_init(struct amdgpu_device *adev,
++ void *ras_ih_info)
++{
++ int r, i;
++ struct ras_ih_if *ih_info = (struct ras_ih_if *)ras_ih_info;
++ struct ras_fs_if fs_info = {
++ .sysfs_name = "sdma_err_count",
++ .debugfs_name = "sdma_err_inject",
++ };
++
++ if (!ih_info)
++ return -EINVAL;
++
++ if (!adev->sdma.ras_if) {
++ adev->sdma.ras_if = kmalloc(sizeof(struct ras_common_if), GFP_KERNEL);
++ if (!adev->sdma.ras_if)
++ return -ENOMEM;
++ adev->sdma.ras_if->block = AMDGPU_RAS_BLOCK__SDMA;
++ adev->sdma.ras_if->type = AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE;
++ adev->sdma.ras_if->sub_block_index = 0;
++ strcpy(adev->sdma.ras_if->name, "sdma");
++ }
++ fs_info.head = ih_info->head = *adev->sdma.ras_if;
++
++ r = amdgpu_ras_late_init(adev, adev->sdma.ras_if,
++ &fs_info, ih_info);
++ if (r)
++ goto free;
++
++ if (amdgpu_ras_is_supported(adev, adev->sdma.ras_if->block)) {
++ for (i = 0; i < adev->sdma.num_instances; i++) {
++ r = amdgpu_irq_get(adev, &adev->sdma.ecc_irq,
++ AMDGPU_SDMA_IRQ_INSTANCE0 + i);
++ if (r)
++ goto late_fini;
++ }
++ } else {
++ r = 0;
++ goto free;
++ }
++
++ return 0;
++
++late_fini:
++ amdgpu_ras_late_fini(adev, adev->sdma.ras_if, ih_info);
++free:
++ kfree(adev->sdma.ras_if);
++ adev->sdma.ras_if = NULL;
++ return r;
++}
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
+index a9ae0d8a0589..79dcb907d00d 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.h
+@@ -104,4 +104,6 @@ struct amdgpu_sdma_instance *
+ amdgpu_sdma_get_instance_from_ring(struct amdgpu_ring *ring);
+ int amdgpu_sdma_get_index_from_ring(struct amdgpu_ring *ring, uint32_t *index);
+ uint64_t amdgpu_sdma_get_csa_mc_addr(struct amdgpu_ring *ring, unsigned vmid);
++int amdgpu_sdma_ras_late_init(struct amdgpu_device *adev,
++ void *ras_ih_info);
+ #endif
+diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+index b837ffd161e6..9cf417a76697 100644
+--- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
+@@ -1698,48 +1698,8 @@ static int sdma_v4_0_late_init(void *handle)
+ struct ras_ih_if ih_info = {
+ .cb = sdma_v4_0_process_ras_data_cb,
+ };
+- struct ras_fs_if fs_info = {
+- .sysfs_name = "sdma_err_count",
+- .debugfs_name = "sdma_err_inject",
+- };
+- int r, i;
+-
+- if (!adev->sdma.ras_if) {
+- adev->sdma.ras_if = kmalloc(sizeof(struct ras_common_if), GFP_KERNEL);
+- if (!adev->sdma.ras_if)
+- return -ENOMEM;
+- adev->sdma.ras_if->block = AMDGPU_RAS_BLOCK__SDMA;
+- adev->sdma.ras_if->type = AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE;
+- adev->sdma.ras_if->sub_block_index = 0;
+- strcpy(adev->sdma.ras_if->name, "sdma");
+- }
+- fs_info.head = ih_info.head = *adev->sdma.ras_if;
+-
+- r = amdgpu_ras_late_init(adev, adev->sdma.ras_if,
+- &fs_info, &ih_info);
+- if (r)
+- goto free;
+-
+- if (amdgpu_ras_is_supported(adev, adev->sdma.ras_if->block)) {
+- for (i = 0; i < adev->sdma.num_instances; i++) {
+- r = amdgpu_irq_get(adev, &adev->sdma.ecc_irq,
+- AMDGPU_SDMA_IRQ_INSTANCE0 + i);
+- if (r)
+- goto late_fini;
+- }
+- } else {
+- /* free sdma ras_if if sdma ras is not supported */
+- r = 0;
+- goto free;
+- }
+
+- return 0;
+-late_fini:
+- amdgpu_ras_late_fini(adev, adev->sdma.ras_if, &ih_info);
+-free:
+- kfree(adev->sdma.ras_if);
+- adev->sdma.ras_if = NULL;
+- return r;
++ return amdgpu_sdma_ras_late_init(adev, &ih_info);
+ }
+
+ static int sdma_v4_0_sw_init(void *handle)
+--
+2.17.1
+