aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3764-drm-amdgpu-move-umc-late-init-from-gmc-to-umc-block.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3764-drm-amdgpu-move-umc-late-init-from-gmc-to-umc-block.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3764-drm-amdgpu-move-umc-late-init-from-gmc-to-umc-block.patch234
1 files changed, 234 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3764-drm-amdgpu-move-umc-late-init-from-gmc-to-umc-block.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3764-drm-amdgpu-move-umc-late-init-from-gmc-to-umc-block.patch
new file mode 100644
index 00000000..ea979341
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3764-drm-amdgpu-move-umc-late-init-from-gmc-to-umc-block.patch
@@ -0,0 +1,234 @@
+From ac4cd7c18c4e824da06d3a45b5ece553ea18d064 Mon Sep 17 00:00:00 2001
+From: Tao Zhou <tao.zhou1@amd.com>
+Date: Thu, 5 Sep 2019 19:16:19 +0800
+Subject: [PATCH 3764/4256] drm/amdgpu: move umc late init from gmc to umc
+ block
+
+umc late init is umc specific, it's more suitable to be put in umc block
+
+Signed-off-by: Tao Zhou <tao.zhou1@amd.com>
+Reviewed-by: Guchun Chen <guchun.chen@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/Makefile | 3 +-
+ drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 48 ----------------
+ drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h | 2 -
+ drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c | 73 +++++++++++++++++++++++++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h | 2 +
+ drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 8 ++-
+ drivers/gpu/drm/amd/amdgpu/umc_v6_1.c | 1 +
+ 7 files changed, 83 insertions(+), 54 deletions(-)
+ create mode 100644 drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/Makefile b/drivers/gpu/drm/amd/amdgpu/Makefile
+index 655e5f0cf7b2..d3c2ccd8f98a 100644
+--- a/drivers/gpu/drm/amd/amdgpu/Makefile
++++ b/drivers/gpu/drm/amd/amdgpu/Makefile
+@@ -55,7 +55,8 @@ amdgpu-y += amdgpu_device.o amdgpu_kms.o \
+ amdgpu_vf_error.o amdgpu_sched.o amdgpu_debugfs.o amdgpu_ids.o \
+ amdgpu_gmc.o amdgpu_mmhub.o amdgpu_xgmi.o amdgpu_csa.o amdgpu_sem.o \
+ amdgpu_ras.o amdgpu_vm_cpu.o amdgpu_vm_sdma.o amdgpu_pmu.o \
+- amdgpu_discovery.o amdgpu_ras_eeprom.o amdgpu_nbio.o smu_v11_0_i2c.o
++ amdgpu_discovery.o amdgpu_ras_eeprom.o amdgpu_nbio.o amdgpu_umc.o \
++ smu_v11_0_i2c.o
+
+ amdgpu-$(CONFIG_PERF_EVENTS) += amdgpu_pmu.o
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
+index 51890b1d8522..dc044eec188e 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
+@@ -304,51 +304,3 @@ bool amdgpu_gmc_filter_faults(struct amdgpu_device *adev, uint64_t addr,
+ gmc->fault_hash[hash].idx = gmc->last_fault++;
+ return false;
+ }
+-
+-int amdgpu_gmc_ras_late_init(struct amdgpu_device *adev,
+- void *ras_ih_info)
+-{
+- int r;
+- struct ras_ih_if *ih_info = (struct ras_ih_if *)ras_ih_info;
+- struct ras_fs_if fs_info = {
+- .sysfs_name = "umc_err_count",
+- .debugfs_name = "umc_err_inject",
+- };
+-
+- if (!ih_info)
+- return -EINVAL;
+-
+- if (!adev->gmc.umc_ras_if) {
+- adev->gmc.umc_ras_if = kmalloc(sizeof(struct ras_common_if), GFP_KERNEL);
+- if (!adev->gmc.umc_ras_if)
+- return -ENOMEM;
+- adev->gmc.umc_ras_if->block = AMDGPU_RAS_BLOCK__UMC;
+- adev->gmc.umc_ras_if->type = AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE;
+- adev->gmc.umc_ras_if->sub_block_index = 0;
+- strcpy(adev->gmc.umc_ras_if->name, "umc");
+- }
+- ih_info->head = fs_info.head = *adev->gmc.umc_ras_if;
+-
+- r = amdgpu_ras_late_init(adev, adev->gmc.umc_ras_if,
+- &fs_info, ih_info);
+- if (r)
+- goto free;
+-
+- if (amdgpu_ras_is_supported(adev, adev->gmc.umc_ras_if->block)) {
+- r = amdgpu_irq_get(adev, &adev->gmc.ecc_irq, 0);
+- if (r)
+- goto late_fini;
+- } else {
+- r = 0;
+- goto free;
+- }
+-
+- return 0;
+-
+-late_fini:
+- amdgpu_ras_late_fini(adev, adev->gmc.umc_ras_if, ih_info);
+-free:
+- kfree(adev->gmc.umc_ras_if);
+- adev->gmc.umc_ras_if = NULL;
+- return r;
+-}
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
+index 03687fa01817..e03351f0ba5a 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.h
+@@ -230,7 +230,5 @@ void amdgpu_gmc_agp_location(struct amdgpu_device *adev,
+ struct amdgpu_gmc *mc);
+ bool amdgpu_gmc_filter_faults(struct amdgpu_device *adev, uint64_t addr,
+ uint16_t pasid, uint64_t timestamp);
+-int amdgpu_gmc_ras_late_init(struct amdgpu_device *adev,
+- void *ih_info);
+
+ #endif
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c
+new file mode 100644
+index 000000000000..c8de127097ab
+--- /dev/null
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.c
+@@ -0,0 +1,73 @@
++/*
++ * Copyright 2019 Advanced Micro Devices, Inc.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a
++ * copy of this software and associated documentation files (the "Software"),
++ * to deal in the Software without restriction, including without limitation
++ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
++ * and/or sell copies of the Software, and to permit persons to whom the
++ * Software is furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
++ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
++ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
++ * OTHER DEALINGS IN THE SOFTWARE.
++ *
++ */
++
++#include "amdgpu.h"
++#include "amdgpu_ras.h"
++
++int amdgpu_umc_ras_late_init(struct amdgpu_device *adev, void *ras_ih_info)
++{
++ int r;
++ struct ras_ih_if *ih_info = (struct ras_ih_if *)ras_ih_info;
++ struct ras_fs_if fs_info = {
++ .sysfs_name = "umc_err_count",
++ .debugfs_name = "umc_err_inject",
++ };
++
++ if (!ih_info)
++ return -EINVAL;
++
++ if (!adev->gmc.umc_ras_if) {
++ adev->gmc.umc_ras_if =
++ kmalloc(sizeof(struct ras_common_if), GFP_KERNEL);
++ if (!adev->gmc.umc_ras_if)
++ return -ENOMEM;
++ adev->gmc.umc_ras_if->block = AMDGPU_RAS_BLOCK__UMC;
++ adev->gmc.umc_ras_if->type = AMDGPU_RAS_ERROR__MULTI_UNCORRECTABLE;
++ adev->gmc.umc_ras_if->sub_block_index = 0;
++ strcpy(adev->gmc.umc_ras_if->name, "umc");
++ }
++ ih_info->head = fs_info.head = *adev->gmc.umc_ras_if;
++
++ r = amdgpu_ras_late_init(adev, adev->gmc.umc_ras_if,
++ &fs_info, ih_info);
++ if (r)
++ goto free;
++
++ if (amdgpu_ras_is_supported(adev, adev->gmc.umc_ras_if->block)) {
++ r = amdgpu_irq_get(adev, &adev->gmc.ecc_irq, 0);
++ if (r)
++ goto late_fini;
++ } else {
++ r = 0;
++ goto free;
++ }
++
++ return 0;
++
++late_fini:
++ amdgpu_ras_late_fini(adev, adev->gmc.umc_ras_if, ih_info);
++free:
++ kfree(adev->gmc.umc_ras_if);
++ adev->gmc.umc_ras_if = NULL;
++ return r;
++}
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h
+index 975afa04df09..6f22c9704555 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_umc.h
+@@ -55,6 +55,7 @@
+
+ struct amdgpu_umc_funcs {
+ void (*ras_init)(struct amdgpu_device *adev);
++ int (*ras_late_init)(struct amdgpu_device *adev, void *ras_ih_info);
+ void (*query_ras_error_count)(struct amdgpu_device *adev,
+ void *ras_error_status);
+ void (*query_ras_error_address)(struct amdgpu_device *adev,
+@@ -79,4 +80,5 @@ struct amdgpu_umc {
+ const struct amdgpu_umc_funcs *funcs;
+ };
+
++int amdgpu_umc_ras_late_init(struct amdgpu_device *adev, void *ras_ih_info);
+ #endif
+diff --git a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+index 7a7068da02dd..64cc3068873a 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
+@@ -793,9 +793,11 @@ static int gmc_v9_0_ecc_late_init(void *handle)
+ .cb = gmc_v9_0_process_ras_data_cb,
+ };
+
+- r = amdgpu_gmc_ras_late_init(adev, &umc_ih_info);
+- if (r)
+- return r;
++ if (adev->umc.funcs && adev->umc.funcs->ras_late_init) {
++ r = adev->umc.funcs->ras_late_init(adev, &umc_ih_info);
++ if (r)
++ return r;
++ }
+
+ if (adev->mmhub_funcs && adev->mmhub_funcs->ras_late_init) {
+ r = adev->mmhub_funcs->ras_late_init(adev);
+diff --git a/drivers/gpu/drm/amd/amdgpu/umc_v6_1.c b/drivers/gpu/drm/amd/amdgpu/umc_v6_1.c
+index 09e316a22f1a..4cdb5c04cd17 100644
+--- a/drivers/gpu/drm/amd/amdgpu/umc_v6_1.c
++++ b/drivers/gpu/drm/amd/amdgpu/umc_v6_1.c
+@@ -273,6 +273,7 @@ static void umc_v6_1_ras_init(struct amdgpu_device *adev)
+
+ const struct amdgpu_umc_funcs umc_v6_1_funcs = {
+ .ras_init = umc_v6_1_ras_init,
++ .ras_late_init = amdgpu_umc_ras_late_init,
+ .query_ras_error_count = umc_v6_1_query_ras_error_count,
+ .query_ras_error_address = umc_v6_1_query_ras_error_address,
+ .enable_umc_index_mode = umc_v6_1_enable_umc_index_mode,
+--
+2.17.1
+