aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3660-drm-amdgpu-add-ras_controller-and-err_event_athub-in.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3660-drm-amdgpu-add-ras_controller-and-err_event_athub-in.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3660-drm-amdgpu-add-ras_controller-and-err_event_athub-in.patch226
1 files changed, 226 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3660-drm-amdgpu-add-ras_controller-and-err_event_athub-in.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3660-drm-amdgpu-add-ras_controller-and-err_event_athub-in.patch
new file mode 100644
index 00000000..d858e065
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3660-drm-amdgpu-add-ras_controller-and-err_event_athub-in.patch
@@ -0,0 +1,226 @@
+From 8b13868985c28be8026995b653e78dbf192bd8ba Mon Sep 17 00:00:00 2001
+From: Hawking Zhang <Hawking.Zhang@amd.com>
+Date: Wed, 5 Jun 2019 14:57:00 +0800
+Subject: [PATCH 3660/4256] drm/amdgpu: add ras_controller and err_event_athub
+ interrupt support
+
+Ras controller interrupt and Ras err event athub interrupt are two dedicated
+interrupts for RAS support.
+
+Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h | 4 +
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 14 +++
+ drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c | 125 +++++++++++++++++++++++
+ 3 files changed, 143 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h
+index 28417e485c58..a04c5ea03418 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_nbio.h
+@@ -79,10 +79,14 @@ struct amdgpu_nbio_funcs {
+ void (*remap_hdp_registers)(struct amdgpu_device *adev);
+ void (*handle_ras_controller_intr_no_bifring)(struct amdgpu_device *adev);
+ void (*handle_ras_err_event_athub_intr_no_bifring)(struct amdgpu_device *adev);
++ int (*init_ras_controller_interrupt)(struct amdgpu_device *adev);
++ int (*init_ras_err_event_athub_interrupt)(struct amdgpu_device *adev);
+ };
+
+ struct amdgpu_nbio {
+ const struct nbio_hdp_flush_reg *hdp_flush_reg;
++ struct amdgpu_irq_src ras_controller_irq;
++ struct amdgpu_irq_src ras_err_event_athub_irq;
+ const struct amdgpu_nbio_funcs *funcs;
+ };
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
+index df4b9ae39c5e..230f7e63e4d8 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
+@@ -27,6 +27,7 @@
+ #include "amdgpu.h"
+ #include "amdgpu_ras.h"
+ #include "amdgpu_atomfirmware.h"
++#include "ivsrcid/nbio/irqsrcs_nbif_7_4.h"
+
+ const char *ras_error_string[] = {
+ "none",
+@@ -1498,6 +1499,7 @@ static void amdgpu_ras_check_supported(struct amdgpu_device *adev,
+ int amdgpu_ras_init(struct amdgpu_device *adev)
+ {
+ struct amdgpu_ras *con = amdgpu_ras_get_context(adev);
++ int r;
+
+ if (con)
+ return 0;
+@@ -1525,6 +1527,18 @@ int amdgpu_ras_init(struct amdgpu_device *adev)
+ /* Might need get this flag from vbios. */
+ con->flags = RAS_DEFAULT_FLAGS;
+
++ if (adev->nbio.funcs->init_ras_controller_interrupt) {
++ r = adev->nbio.funcs->init_ras_controller_interrupt(adev);
++ if (r)
++ return r;
++ }
++
++ if (adev->nbio.funcs->init_ras_err_event_athub_interrupt) {
++ r = adev->nbio.funcs->init_ras_err_event_athub_interrupt(adev);
++ if (r)
++ return r;
++ }
++
+ if (amdgpu_ras_recovery_init(adev))
+ goto recovery_out;
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c b/drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c
+index 6ecdd5e3ca3f..faf9300630a5 100644
+--- a/drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c
++++ b/drivers/gpu/drm/amd/amdgpu/nbio_v7_4.c
+@@ -27,6 +27,7 @@
+ #include "nbio/nbio_7_4_offset.h"
+ #include "nbio/nbio_7_4_sh_mask.h"
+ #include "nbio/nbio_7_4_0_smn.h"
++#include "ivsrcid/nbio/irqsrcs_nbif_7_4.h"
+ #include <uapi/linux/kfd_ioctl.h>
+
+ #define smnNBIF_MGCG_CTRL_LCLK 0x1013a21c
+@@ -345,6 +346,128 @@ static void nbio_v7_4_handle_ras_err_event_athub_intr_no_bifring(struct amdgpu_d
+ }
+ }
+
++
++static int nbio_v7_4_set_ras_controller_irq_state(struct amdgpu_device *adev,
++ struct amdgpu_irq_src *src,
++ unsigned type,
++ enum amdgpu_interrupt_state state)
++{
++ /* The ras_controller_irq enablement should be done in psp bl when it
++ * tries to enable ras feature. Driver only need to set the correct interrupt
++ * vector for bare-metal and sriov use case respectively
++ */
++ uint32_t bif_intr_cntl;
++
++ bif_intr_cntl = RREG32_SOC15(NBIO, 0, mmBIF_INTR_CNTL);
++ if (state == AMDGPU_IRQ_STATE_ENABLE) {
++ /* set interrupt vector select bit to 0 to select
++ * vetcor 1 for bare metal case */
++ bif_intr_cntl = REG_SET_FIELD(bif_intr_cntl,
++ BIF_INTR_CNTL,
++ RAS_INTR_VEC_SEL, 0);
++ WREG32_SOC15(NBIO, 0, mmBIF_INTR_CNTL, bif_intr_cntl);
++ }
++
++ return 0;
++}
++
++static int nbio_v7_4_process_ras_controller_irq(struct amdgpu_device *adev,
++ struct amdgpu_irq_src *source,
++ struct amdgpu_iv_entry *entry)
++{
++ /* By design, the ih cookie for ras_controller_irq should be written
++ * to BIFring instead of general iv ring. However, due to known bif ring
++ * hw bug, it has to be disabled. There is no chance the process function
++ * will be involked. Just left it as a dummy one.
++ */
++ return 0;
++}
++
++static int nbio_v7_4_set_ras_err_event_athub_irq_state(struct amdgpu_device *adev,
++ struct amdgpu_irq_src *src,
++ unsigned type,
++ enum amdgpu_interrupt_state state)
++{
++ /* The ras_controller_irq enablement should be done in psp bl when it
++ * tries to enable ras feature. Driver only need to set the correct interrupt
++ * vector for bare-metal and sriov use case respectively
++ */
++ uint32_t bif_intr_cntl;
++
++ bif_intr_cntl = RREG32_SOC15(NBIO, 0, mmBIF_INTR_CNTL);
++ if (state == AMDGPU_IRQ_STATE_ENABLE) {
++ /* set interrupt vector select bit to 0 to select
++ * vetcor 1 for bare metal case */
++ bif_intr_cntl = REG_SET_FIELD(bif_intr_cntl,
++ BIF_INTR_CNTL,
++ RAS_INTR_VEC_SEL, 0);
++ WREG32_SOC15(NBIO, 0, mmBIF_INTR_CNTL, bif_intr_cntl);
++ }
++
++ return 0;
++}
++
++static int nbio_v7_4_process_err_event_athub_irq(struct amdgpu_device *adev,
++ struct amdgpu_irq_src *source,
++ struct amdgpu_iv_entry *entry)
++{
++ /* By design, the ih cookie for err_event_athub_irq should be written
++ * to BIFring instead of general iv ring. However, due to known bif ring
++ * hw bug, it has to be disabled. There is no chance the process function
++ * will be involked. Just left it as a dummy one.
++ */
++ return 0;
++}
++
++static const struct amdgpu_irq_src_funcs nbio_v7_4_ras_controller_irq_funcs = {
++ .set = nbio_v7_4_set_ras_controller_irq_state,
++ .process = nbio_v7_4_process_ras_controller_irq,
++};
++
++static const struct amdgpu_irq_src_funcs nbio_v7_4_ras_err_event_athub_irq_funcs = {
++ .set = nbio_v7_4_set_ras_err_event_athub_irq_state,
++ .process = nbio_v7_4_process_err_event_athub_irq,
++};
++
++static int nbio_v7_4_init_ras_controller_interrupt (struct amdgpu_device *adev)
++{
++ int r;
++
++ /* init the irq funcs */
++ adev->nbio.ras_controller_irq.funcs =
++ &nbio_v7_4_ras_controller_irq_funcs;
++ adev->nbio.ras_controller_irq.num_types = 1;
++
++ /* register ras controller interrupt */
++ r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_BIF,
++ NBIF_7_4__SRCID__RAS_CONTROLLER_INTERRUPT,
++ &adev->nbio.ras_controller_irq);
++ if (r)
++ return r;
++
++ return 0;
++}
++
++static int nbio_v7_4_init_ras_err_event_athub_interrupt (struct amdgpu_device *adev)
++{
++
++ int r;
++
++ /* init the irq funcs */
++ adev->nbio.ras_err_event_athub_irq.funcs =
++ &nbio_v7_4_ras_err_event_athub_irq_funcs;
++ adev->nbio.ras_err_event_athub_irq.num_types = 1;
++
++ /* register ras err event athub interrupt */
++ r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_BIF,
++ NBIF_7_4__SRCID__ERREVENT_ATHUB_INTERRUPT,
++ &adev->nbio.ras_err_event_athub_irq);
++ if (r)
++ return r;
++
++ return 0;
++}
++
+ const struct amdgpu_nbio_funcs nbio_v7_4_funcs = {
+ .get_hdp_flush_req_offset = nbio_v7_4_get_hdp_flush_req_offset,
+ .get_hdp_flush_done_offset = nbio_v7_4_get_hdp_flush_done_offset,
+@@ -368,4 +491,6 @@ const struct amdgpu_nbio_funcs nbio_v7_4_funcs = {
+ .remap_hdp_registers = nbio_v7_4_remap_hdp_registers,
+ .handle_ras_controller_intr_no_bifring = nbio_v7_4_handle_ras_controller_intr_no_bifring,
+ .handle_ras_err_event_athub_intr_no_bifring = nbio_v7_4_handle_ras_err_event_athub_intr_no_bifring,
++ .init_ras_controller_interrupt = nbio_v7_4_init_ras_controller_interrupt,
++ .init_ras_err_event_athub_interrupt = nbio_v7_4_init_ras_err_event_athub_interrupt,
+ };
+--
+2.17.1
+