aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3928-drm-amdgpu-move-umc-ras-irq-functions-to-umc-block.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3928-drm-amdgpu-move-umc-ras-irq-functions-to-umc-block.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3928-drm-amdgpu-move-umc-ras-irq-functions-to-umc-block.patch208
1 files changed, 208 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3928-drm-amdgpu-move-umc-ras-irq-functions-to-umc-block.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3928-drm-amdgpu-move-umc-ras-irq-functions-to-umc-block.patch
new file mode 100644
index 00000000..85e45478
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3928-drm-amdgpu-move-umc-ras-irq-functions-to-umc-block.patch
@@ -0,0 +1,208 @@
+From 022ef19f50a9c183d2b0ad95716e594430ca260c Mon Sep 17 00:00:00 2001
+From: Tao Zhou <tao.zhou1@amd.com>
+Date: Thu, 12 Sep 2019 11:11:25 +0800
+Subject: [PATCH 3928/4256] drm/amdgpu: move umc ras irq functions to umc block
+
+move umc ras irq functions from gmc v9 to generic umc block, these
+functions are relevant to umc and they can be shared among all
+generations of umc
+
+Signed-off-by: Tao Zhou <tao.zhou1@amd.com>
+Reviewed-by: Guchun Chen <guchun.chen@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c | 65 ++++++++++++++++++++++-
+ drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h | 6 +++
+ drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 68 +------------------------
+ 3 files changed, 72 insertions(+), 67 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c
+index c5d8b08af731..d11b4d38ca1e 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c
+@@ -21,7 +21,6 @@
+ *
+ */
+
+-#include "amdgpu.h"
+ #include "amdgpu_ras.h"
+
+ int amdgpu_umc_ras_late_init(struct amdgpu_device *adev, void *ras_ih_info)
+@@ -75,3 +74,67 @@ int amdgpu_umc_ras_late_init(struct amdgpu_device *adev, void *ras_ih_info)
+ adev->gmc.umc_ras_if = NULL;
+ return r;
+ }
++
++int amdgpu_umc_process_ras_data_cb(struct amdgpu_device *adev,
++ void *ras_error_status,
++ struct amdgpu_iv_entry *entry)
++{
++ struct ras_err_data *err_data = (struct ras_err_data *)ras_error_status;
++
++ if (amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
++ return AMDGPU_RAS_SUCCESS;
++
++ kgd2kfd_set_sram_ecc_flag(adev->kfd.dev);
++ if (adev->umc.funcs &&
++ adev->umc.funcs->query_ras_error_count)
++ adev->umc.funcs->query_ras_error_count(adev, ras_error_status);
++
++ if (adev->umc.funcs &&
++ adev->umc.funcs->query_ras_error_address &&
++ adev->umc.max_ras_err_cnt_per_query) {
++ err_data->err_addr =
++ kcalloc(adev->umc.max_ras_err_cnt_per_query,
++ sizeof(struct eeprom_table_record), GFP_KERNEL);
++ /* still call query_ras_error_address to clear error status
++ * even NOMEM error is encountered
++ */
++ if(!err_data->err_addr)
++ DRM_WARN("Failed to alloc memory for umc error address record!\n");
++
++ /* umc query_ras_error_address is also responsible for clearing
++ * error status
++ */
++ adev->umc.funcs->query_ras_error_address(adev, ras_error_status);
++ }
++
++ /* only uncorrectable error needs gpu reset */
++ if (err_data->ue_count) {
++ if (err_data->err_addr_cnt &&
++ amdgpu_ras_add_bad_pages(adev, err_data->err_addr,
++ err_data->err_addr_cnt))
++ DRM_WARN("Failed to add ras bad page!\n");
++
++ amdgpu_ras_reset_gpu(adev, 0);
++ }
++
++ kfree(err_data->err_addr);
++ return AMDGPU_RAS_SUCCESS;
++}
++
++int amdgpu_umc_process_ecc_irq(struct amdgpu_device *adev,
++ struct amdgpu_irq_src *source,
++ struct amdgpu_iv_entry *entry)
++{
++ struct ras_common_if *ras_if = adev->gmc.umc_ras_if;
++ struct ras_dispatch_if ih_data = {
++ .entry = entry,
++ };
++
++ if (!ras_if)
++ return 0;
++
++ ih_data.head = *ras_if;
++
++ amdgpu_ras_interrupt_dispatch(adev, &ih_data);
++ return 0;
++}
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h
+index c907b14c9be8..9ac1c2f79299 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h
+@@ -82,4 +82,10 @@ struct amdgpu_umc {
+ };
+
+ int amdgpu_umc_ras_late_init(struct amdgpu_device *adev, void *ras_ih_info);
++int amdgpu_umc_process_ras_data_cb(struct amdgpu_device *adev,
++ void *ras_error_status,
++ struct amdgpu_iv_entry *entry);
++int amdgpu_umc_process_ecc_irq(struct amdgpu_device *adev,
++ struct amdgpu_irq_src *source,
++ struct amdgpu_iv_entry *entry);
+ #endif
+diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+index 534c5761c079..d6a99e2d6343 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+@@ -241,70 +241,6 @@ static int gmc_v9_0_ecc_interrupt_state(struct amdgpu_device *adev,
+ return 0;
+ }
+
+-static int gmc_v9_0_process_ras_data_cb(struct amdgpu_device *adev,
+- void *ras_error_status,
+- struct amdgpu_iv_entry *entry)
+-{
+- struct ras_err_data *err_data = (struct ras_err_data *)ras_error_status;
+-
+- if (amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX))
+- return AMDGPU_RAS_SUCCESS;
+-
+- kgd2kfd_set_sram_ecc_flag(adev->kfd.dev);
+- if (adev->umc.funcs &&
+- adev->umc.funcs->query_ras_error_count)
+- adev->umc.funcs->query_ras_error_count(adev, ras_error_status);
+-
+- if (adev->umc.funcs &&
+- adev->umc.funcs->query_ras_error_address &&
+- adev->umc.max_ras_err_cnt_per_query) {
+- err_data->err_addr =
+- kcalloc(adev->umc.max_ras_err_cnt_per_query,
+- sizeof(struct eeprom_table_record), GFP_KERNEL);
+- /* still call query_ras_error_address to clear error status
+- * even NOMEM error is encountered
+- */
+- if(!err_data->err_addr)
+- DRM_WARN("Failed to alloc memory for umc error address record!\n");
+-
+- /* umc query_ras_error_address is also responsible for clearing
+- * error status
+- */
+- adev->umc.funcs->query_ras_error_address(adev, err_data);
+- }
+-
+- /* only uncorrectable error needs gpu reset */
+- if (err_data->ue_count) {
+- if (err_data->err_addr_cnt &&
+- amdgpu_ras_add_bad_pages(adev, err_data->err_addr,
+- err_data->err_addr_cnt))
+- DRM_WARN("Failed to add ras bad page!\n");
+-
+- amdgpu_ras_reset_gpu(adev, 0);
+- }
+-
+- kfree(err_data->err_addr);
+- return AMDGPU_RAS_SUCCESS;
+-}
+-
+-static int gmc_v9_0_process_ecc_irq(struct amdgpu_device *adev,
+- struct amdgpu_irq_src *source,
+- struct amdgpu_iv_entry *entry)
+-{
+- struct ras_common_if *ras_if = adev->gmc.umc_ras_if;
+- struct ras_dispatch_if ih_data = {
+- .entry = entry,
+- };
+-
+- if (!ras_if)
+- return 0;
+-
+- ih_data.head = *ras_if;
+-
+- amdgpu_ras_interrupt_dispatch(adev, &ih_data);
+- return 0;
+-}
+-
+ static int gmc_v9_0_vm_fault_interrupt_state(struct amdgpu_device *adev,
+ struct amdgpu_irq_src *src,
+ unsigned type,
+@@ -445,7 +381,7 @@ static const struct amdgpu_irq_src_funcs gmc_v9_0_irq_funcs = {
+
+ static const struct amdgpu_irq_src_funcs gmc_v9_0_ecc_funcs = {
+ .set = gmc_v9_0_ecc_interrupt_state,
+- .process = gmc_v9_0_process_ecc_irq,
++ .process = amdgpu_umc_process_ecc_irq,
+ };
+
+ static void gmc_v9_0_set_irq_funcs(struct amdgpu_device *adev)
+@@ -801,7 +737,7 @@ static int gmc_v9_0_ecc_late_init(void *handle)
+ int r;
+ struct amdgpu_device *adev = (struct amdgpu_device *)handle;
+ struct ras_ih_if umc_ih_info = {
+- .cb = gmc_v9_0_process_ras_data_cb,
++ .cb = amdgpu_umc_process_ras_data_cb,
+ };
+
+ if (adev->umc.funcs && adev->umc.funcs->ras_late_init) {
+--
+2.17.1
+