* [PATCH 1/5] drm/amdgpu: drop psp v13 query_boot_status implementation
@ 2024-01-07 15:40 Hawking Zhang
2024-01-07 15:40 ` [PATCH 4/5] drm/amdgpu: Query boot status if discovery failed Hawking Zhang
` (4 more replies)
0 siblings, 5 replies; 8+ messages in thread
From: Hawking Zhang @ 2024-01-07 15:40 UTC (permalink / raw)
To: amd-gfx, Tao Zhou, Stanley Yang, Yang Wang, YiPeng Chai,
Candice Li
Cc: Alex Deucher, Le Ma, Lijo Lazar, Hawking Zhang
Will replace it with new implementation to cover
boot fails in ip discovery phase.
Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 2 -
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 15 -----
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h | 4 --
drivers/gpu/drm/amd/amdgpu/psp_v13_0.c | 78 ----------------------
4 files changed, 99 deletions(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index a39c9fea55c4..abad5773714c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -1218,8 +1218,6 @@ static int amdgpu_device_asic_init(struct amdgpu_device *adev)
amdgpu_ip_version(adev, GC_HWIP, 0) >= IP_VERSION(11, 0, 0)) {
amdgpu_psp_wait_for_bootloader(adev);
ret = amdgpu_atomfirmware_asic_init(adev, true);
- /* TODO: check the return val and stop device initialization if boot fails */
- amdgpu_psp_query_boot_status(adev);
return ret;
} else {
return amdgpu_atom_asic_init(adev->mode_info.atom_context);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
index 2addbdf88394..90451cabb919 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
@@ -2125,21 +2125,6 @@ int amdgpu_psp_wait_for_bootloader(struct amdgpu_device *adev)
return ret;
}
-int amdgpu_psp_query_boot_status(struct amdgpu_device *adev)
-{
- struct psp_context *psp = &adev->psp;
- int ret = 0;
-
- if (amdgpu_sriov_vf(adev) || (adev->flags & AMD_IS_APU))
- return 0;
-
- if (psp->funcs &&
- psp->funcs->query_boot_status)
- ret = psp->funcs->query_boot_status(psp);
-
- return ret;
-}
-
static int psp_hw_start(struct psp_context *psp)
{
struct amdgpu_device *adev = psp->adev;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
index c4d9cbde55b9..09d1f8f72a9c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
@@ -134,7 +134,6 @@ struct psp_funcs {
int (*update_spirom)(struct psp_context *psp, uint64_t fw_pri_mc_addr);
int (*vbflash_stat)(struct psp_context *psp);
int (*fatal_error_recovery_quirk)(struct psp_context *psp);
- int (*query_boot_status)(struct psp_context *psp);
};
struct ta_funcs {
@@ -538,7 +537,4 @@ int psp_spatial_partition(struct psp_context *psp, int mode);
int is_psp_fw_valid(struct psp_bin_desc bin);
int amdgpu_psp_wait_for_bootloader(struct amdgpu_device *adev);
-
-int amdgpu_psp_query_boot_status(struct amdgpu_device *adev);
-
#endif
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c
index df1844d0800f..6fad451a85be 100644
--- a/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c
@@ -763,83 +763,6 @@ static int psp_v13_0_fatal_error_recovery_quirk(struct psp_context *psp)
return 0;
}
-
-static void psp_v13_0_boot_error_reporting(struct amdgpu_device *adev,
- uint32_t inst,
- uint32_t boot_error)
-{
- uint32_t socket_id;
- uint32_t aid_id;
- uint32_t hbm_id;
- uint32_t reg_data;
-
- socket_id = REG_GET_FIELD(boot_error, MP0_SMN_C2PMSG_126, SOCKET_ID);
- aid_id = REG_GET_FIELD(boot_error, MP0_SMN_C2PMSG_126, AID_ID);
- hbm_id = REG_GET_FIELD(boot_error, MP0_SMN_C2PMSG_126, HBM_ID);
-
- reg_data = RREG32_SOC15(MP0, inst, regMP0_SMN_C2PMSG_109);
- dev_info(adev->dev, "socket: %d, aid: %d, firmware boot failed, fw status is 0x%x\n",
- socket_id, aid_id, reg_data);
-
- if (REG_GET_FIELD(boot_error, MP0_SMN_C2PMSG_126, GPU_ERR_MEM_TRAINING))
- dev_info(adev->dev, "socket: %d, aid: %d, hbm: %d, memory training failed\n",
- socket_id, aid_id, hbm_id);
-
- if (REG_GET_FIELD(boot_error, MP0_SMN_C2PMSG_126, GPU_ERR_FW_LOAD))
- dev_info(adev->dev, "socket: %d, aid: %d, firmware load failed at boot time\n",
- socket_id, aid_id);
-
- if (REG_GET_FIELD(boot_error, MP0_SMN_C2PMSG_126, GPU_ERR_WAFL_LINK_TRAINING))
- dev_info(adev->dev, "socket: %d, aid: %d, wafl link training failed\n",
- socket_id, aid_id);
-
- if (REG_GET_FIELD(boot_error, MP0_SMN_C2PMSG_126, GPU_ERR_XGMI_LINK_TRAINING))
- dev_info(adev->dev, "socket: %d, aid: %d, xgmi link training failed\n",
- socket_id, aid_id);
-
- if (REG_GET_FIELD(boot_error, MP0_SMN_C2PMSG_126, GPU_ERR_USR_CP_LINK_TRAINING))
- dev_info(adev->dev, "socket: %d, aid: %d, usr cp link training failed\n",
- socket_id, aid_id);
-
- if (REG_GET_FIELD(boot_error, MP0_SMN_C2PMSG_126, GPU_ERR_USR_DP_LINK_TRAINING))
- dev_info(adev->dev, "socket: %d, aid: %d, usr dp link training failed\n",
- socket_id, aid_id);
-
- if (REG_GET_FIELD(boot_error, MP0_SMN_C2PMSG_126, GPU_ERR_HBM_MEM_TEST))
- dev_info(adev->dev, "socket: %d, aid: %d, hbm: %d, hbm memory test failed\n",
- socket_id, aid_id, hbm_id);
-
- if (REG_GET_FIELD(boot_error, MP0_SMN_C2PMSG_126, GPU_ERR_HBM_BIST_TEST))
- dev_info(adev->dev, "socket: %d, aid: %d, hbm: %d, hbm bist test failed\n",
- socket_id, aid_id, hbm_id);
-}
-
-static int psp_v13_0_query_boot_status(struct psp_context *psp)
-{
- struct amdgpu_device *adev = psp->adev;
- int inst_mask = adev->aid_mask;
- uint32_t reg_data;
- uint32_t i;
- int ret = 0;
-
- if (amdgpu_ip_version(adev, MP0_HWIP, 0) != IP_VERSION(13, 0, 6))
- return 0;
-
- if (RREG32_SOC15(MP0, 0, regMP0_SMN_C2PMSG_59) < 0x00a10109)
- return 0;
-
- for_each_inst(i, inst_mask) {
- reg_data = RREG32_SOC15(MP0, i, regMP0_SMN_C2PMSG_126);
- if (!REG_GET_FIELD(reg_data, MP0_SMN_C2PMSG_126, BOOT_STATUS)) {
- psp_v13_0_boot_error_reporting(adev, i, reg_data);
- ret = -EINVAL;
- break;
- }
- }
-
- return ret;
-}
-
static const struct psp_funcs psp_v13_0_funcs = {
.init_microcode = psp_v13_0_init_microcode,
.wait_for_bootloader = psp_v13_0_wait_for_bootloader_steady_state,
@@ -862,7 +785,6 @@ static const struct psp_funcs psp_v13_0_funcs = {
.update_spirom = psp_v13_0_update_spirom,
.vbflash_stat = psp_v13_0_vbflash_status,
.fatal_error_recovery_quirk = psp_v13_0_fatal_error_recovery_quirk,
- .query_boot_status = psp_v13_0_query_boot_status,
};
void psp_v13_0_set_psp_funcs(struct psp_context *psp)
--
2.17.1
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 4/5] drm/amdgpu: Query boot status if discovery failed 2024-01-07 15:40 [PATCH 1/5] drm/amdgpu: drop psp v13 query_boot_status implementation Hawking Zhang @ 2024-01-07 15:40 ` Hawking Zhang 2024-01-07 15:40 ` [PATCH 5/5] drm/amdgpu: Query boot status if boot failed Hawking Zhang ` (3 subsequent siblings) 4 siblings, 0 replies; 8+ messages in thread From: Hawking Zhang @ 2024-01-07 15:40 UTC (permalink / raw) To: amd-gfx, Tao Zhou, Stanley Yang, Yang Wang, YiPeng Chai, Candice Li Cc: Alex Deucher, Le Ma, Lijo Lazar, Hawking Zhang Check and report boot status if discovery failed. Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c index b8fde08aec8e..302b71e9f1e2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c @@ -27,6 +27,7 @@ #include "amdgpu_discovery.h" #include "soc15_hw_ip.h" #include "discovery.h" +#include "amdgpu_ras.h" #include "soc15.h" #include "gfx_v9_0.h" @@ -98,6 +99,7 @@ #define FIRMWARE_IP_DISCOVERY "amdgpu/ip_discovery.bin" MODULE_FIRMWARE(FIRMWARE_IP_DISCOVERY); +#define mmIP_DISCOVERY_VERSION 0x16A00 #define mmRCC_CONFIG_MEMSIZE 0xde3 #define mmMP0_SMN_C2PMSG_33 0x16061 #define mmMM_INDEX 0x0 @@ -518,7 +520,9 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev) out: kfree(adev->mman.discovery_bin); adev->mman.discovery_bin = NULL; - + if ((amdgpu_discovery != 2) && + (RREG32(mmIP_DISCOVERY_VERSION) == 4)) + amdgpu_ras_query_boot_status(adev, 4); return r; } -- 2.17.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 5/5] drm/amdgpu: Query boot status if boot failed 2024-01-07 15:40 [PATCH 1/5] drm/amdgpu: drop psp v13 query_boot_status implementation Hawking Zhang 2024-01-07 15:40 ` [PATCH 4/5] drm/amdgpu: Query boot status if discovery failed Hawking Zhang @ 2024-01-07 15:40 ` Hawking Zhang 2024-01-07 15:40 ` [PATCH v2 v2 2/5] drm/amdgpu: Init pcie_index/data address as fallback (v2) Hawking Zhang ` (2 subsequent siblings) 4 siblings, 0 replies; 8+ messages in thread From: Hawking Zhang @ 2024-01-07 15:40 UTC (permalink / raw) To: amd-gfx, Tao Zhou, Stanley Yang, Yang Wang, YiPeng Chai, Candice Li Cc: Alex Deucher, Le Ma, Lijo Lazar, Hawking Zhang Check and report firmware boot status if it doesn't reach steady status. Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com> --- drivers/gpu/drm/amd/amdgpu/psp_v13_0.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c index 6fad451a85be..676bec2cc157 100644 --- a/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c +++ b/drivers/gpu/drm/amd/amdgpu/psp_v13_0.c @@ -187,11 +187,18 @@ static int psp_v13_0_wait_for_bootloader(struct psp_context *psp) static int psp_v13_0_wait_for_bootloader_steady_state(struct psp_context *psp) { struct amdgpu_device *adev = psp->adev; + int ret; if (amdgpu_ip_version(adev, MP0_HWIP, 0) == IP_VERSION(13, 0, 6)) { - psp_v13_0_wait_for_vmbx_ready(psp); + ret = psp_v13_0_wait_for_vmbx_ready(psp); + if (ret) + amdgpu_ras_query_boot_status(adev, 4); + + ret = psp_v13_0_wait_for_bootloader(psp); + if (ret) + amdgpu_ras_query_boot_status(adev, 4); - return psp_v13_0_wait_for_bootloader(psp); + return ret; } return 0; -- 2.17.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 v2 2/5] drm/amdgpu: Init pcie_index/data address as fallback (v2) 2024-01-07 15:40 [PATCH 1/5] drm/amdgpu: drop psp v13 query_boot_status implementation Hawking Zhang 2024-01-07 15:40 ` [PATCH 4/5] drm/amdgpu: Query boot status if discovery failed Hawking Zhang 2024-01-07 15:40 ` [PATCH 5/5] drm/amdgpu: Query boot status if boot failed Hawking Zhang @ 2024-01-07 15:40 ` Hawking Zhang 2024-01-08 5:53 ` Wang, Yang(Kevin) 2024-01-07 15:40 ` [PATCH v2 v2 3/5] drm/amdgpu: Add ras helper to query boot errors v2 Hawking Zhang 2024-01-07 15:40 ` [PATCH v2 v2 4/5] drm/amdgpu: Query boot status if discovery failed Hawking Zhang 4 siblings, 1 reply; 8+ messages in thread From: Hawking Zhang @ 2024-01-07 15:40 UTC (permalink / raw) To: amd-gfx, Tao Zhou, Stanley Yang, Yang Wang, YiPeng Chai, Candice Li Cc: Alex Deucher, Le Ma, Lijo Lazar, Hawking Zhang To allow using this helper for indirect access when nbio funcs is not available. For instance, in ip discovery phase. v2: define macro for pcie_index/data/index_hi fallback. Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 23 +++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index abad5773714c..05d7cdcf28b0 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -96,6 +96,9 @@ MODULE_FIRMWARE("amdgpu/navi12_gpu_info.bin"); #define AMDGPU_RESUME_MS 2000 #define AMDGPU_MAX_RETRY_LIMIT 2 #define AMDGPU_RETRY_SRIOV_RESET(r) ((r) == -EBUSY || (r) == -ETIMEDOUT || (r) == -EINVAL) +#define AMDGPU_PCIE_INDEX_FALLBACK (0x38 >> 2) +#define AMDGPU_PCIE_INDEX_HI_FALLBACK (0x44 >> 2) +#define AMDGPU_PCIE_DATA_FALLBACK (0x3C >> 2) static const struct drm_driver amdgpu_kms_driver; @@ -781,12 +784,22 @@ u32 amdgpu_device_indirect_rreg_ext(struct amdgpu_device *adev, void __iomem *pcie_index_hi_offset; void __iomem *pcie_data_offset; - pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev); - pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev); - if ((reg_addr >> 32) && (adev->nbio.funcs->get_pcie_index_hi_offset)) - pcie_index_hi = adev->nbio.funcs->get_pcie_index_hi_offset(adev); - else + if (unlikely(!adev->nbio.funcs)) { + pcie_index = AMDGPU_PCIE_INDEX_FALLBACK; + pcie_data = AMDGPU_PCIE_DATA_FALLBACK; + } else { + pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev); + pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev); + } + + if (reg_addr >> 32) { + if (unlikely(!adev->nbio.funcs)) + pcie_index_hi = AMDGPU_PCIE_INDEX_HI_FALLBACK; + else + pcie_index_hi = adev->nbio.funcs->get_pcie_index_hi_offset(adev); + } else { pcie_index_hi = 0; + } spin_lock_irqsave(&adev->pcie_idx_lock, flags); pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4; -- 2.17.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* RE: [PATCH v2 v2 2/5] drm/amdgpu: Init pcie_index/data address as fallback (v2) 2024-01-07 15:40 ` [PATCH v2 v2 2/5] drm/amdgpu: Init pcie_index/data address as fallback (v2) Hawking Zhang @ 2024-01-08 5:53 ` Wang, Yang(Kevin) 0 siblings, 0 replies; 8+ messages in thread From: Wang, Yang(Kevin) @ 2024-01-08 5:53 UTC (permalink / raw) To: Zhang, Hawking, amd-gfx@lists.freedesktop.org, Zhou1, Tao, Yang, Stanley, Chai, Thomas, Li, Candice Cc: Deucher, Alexander, Ma, Le, Lazar, Lijo, Zhang, Hawking [AMD Official Use Only - General] -----Original Message----- From: Hawking Zhang <Hawking.Zhang@amd.com> Sent: Sunday, January 7, 2024 11:40 PM To: amd-gfx@lists.freedesktop.org; Zhou1, Tao <Tao.Zhou1@amd.com>; Yang, Stanley <Stanley.Yang@amd.com>; Wang, Yang(Kevin) <KevinYang.Wang@amd.com>; Chai, Thomas <YiPeng.Chai@amd.com>; Li, Candice <Candice.Li@amd.com> Cc: Zhang, Hawking <Hawking.Zhang@amd.com>; Deucher, Alexander <Alexander.Deucher@amd.com>; Lazar, Lijo <Lijo.Lazar@amd.com>; Ma, Le <Le.Ma@amd.com> Subject: [PATCH v2 v2 2/5] drm/amdgpu: Init pcie_index/data address as fallback (v2) To allow using this helper for indirect access when nbio funcs is not available. For instance, in ip discovery phase. v2: define macro for pcie_index/data/index_hi fallback. Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 23 +++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c index abad5773714c..05d7cdcf28b0 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c @@ -96,6 +96,9 @@ MODULE_FIRMWARE("amdgpu/navi12_gpu_info.bin"); #define AMDGPU_RESUME_MS 2000 #define AMDGPU_MAX_RETRY_LIMIT 2 #define AMDGPU_RETRY_SRIOV_RESET(r) ((r) == -EBUSY || (r) == -ETIMEDOUT || (r) == -EINVAL) +#define AMDGPU_PCIE_INDEX_FALLBACK (0x38 >> 2) #define +AMDGPU_PCIE_INDEX_HI_FALLBACK (0x44 >> 2) #define +AMDGPU_PCIE_DATA_FALLBACK (0x3C >> 2) static const struct drm_driver amdgpu_kms_driver; @@ -781,12 +784,22 @@ u32 amdgpu_device_indirect_rreg_ext(struct amdgpu_device *adev, void __iomem *pcie_index_hi_offset; void __iomem *pcie_data_offset; - pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev); - pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev); - if ((reg_addr >> 32) && (adev->nbio.funcs->get_pcie_index_hi_offset)) - pcie_index_hi = adev->nbio.funcs->get_pcie_index_hi_offset(adev); - else + if (unlikely(!adev->nbio.funcs)) { + pcie_index = AMDGPU_PCIE_INDEX_FALLBACK; + pcie_data = AMDGPU_PCIE_DATA_FALLBACK; + } else { + pcie_index = adev->nbio.funcs->get_pcie_index_offset(adev); + pcie_data = adev->nbio.funcs->get_pcie_data_offset(adev); + } + + if (reg_addr >> 32) { [kevin]: Gentle reminder that the macro 'upper_32_bits()' can help on it . Series is. Reviewed-by: Yang Wang <kevinyang.wang@amd.com> Best Regards, Kevin + if (unlikely(!adev->nbio.funcs)) + pcie_index_hi = AMDGPU_PCIE_INDEX_HI_FALLBACK; + else + pcie_index_hi = adev->nbio.funcs->get_pcie_index_hi_offset(adev); + } else { pcie_index_hi = 0; + } spin_lock_irqsave(&adev->pcie_idx_lock, flags); pcie_index_offset = (void __iomem *)adev->rmmio + pcie_index * 4; -- 2.17.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH v2 v2 3/5] drm/amdgpu: Add ras helper to query boot errors v2 2024-01-07 15:40 [PATCH 1/5] drm/amdgpu: drop psp v13 query_boot_status implementation Hawking Zhang ` (2 preceding siblings ...) 2024-01-07 15:40 ` [PATCH v2 v2 2/5] drm/amdgpu: Init pcie_index/data address as fallback (v2) Hawking Zhang @ 2024-01-07 15:40 ` Hawking Zhang 2024-01-08 11:33 ` Ma, Le 2024-01-07 15:40 ` [PATCH v2 v2 4/5] drm/amdgpu: Query boot status if discovery failed Hawking Zhang 4 siblings, 1 reply; 8+ messages in thread From: Hawking Zhang @ 2024-01-07 15:40 UTC (permalink / raw) To: amd-gfx, Tao Zhou, Stanley Yang, Yang Wang, YiPeng Chai, Candice Li Cc: Alex Deucher, Le Ma, Lijo Lazar, Hawking Zhang Add ras helper function to query boot time gpu errors. v2: use aqua_vanjaram smn addressing pattern Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 95 +++++++++++++++++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h | 15 +++- 3 files changed, 110 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h index 9da14436a373..df3aa69be425 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -1330,6 +1330,7 @@ int emu_soc_asic_init(struct amdgpu_device *adev); #define WREG32_FIELD_OFFSET(reg, offset, field, val) \ WREG32(mm##reg + offset, (RREG32(mm##reg + offset) & ~REG_FIELD_MASK(reg, field)) | (val) << REG_FIELD_SHIFT(reg, field)) +#define AMDGPU_GET_REG_FIELD(x, h, l) (((x) & GENMASK_ULL(h, l)) >> (l)) /* * BIOS helpers. */ diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c index fc42fb6ee191..a901b00d4949 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c @@ -3763,3 +3763,98 @@ int amdgpu_ras_error_statistic_ce_count(struct ras_err_data *err_data, return 0; } + +#define mmMP0_SMN_C2PMSG_92 0x1609C +#define mmMP0_SMN_C2PMSG_126 0x160BE +static void amdgpu_ras_boot_time_error_reporting(struct amdgpu_device *adev, + u32 instance, u32 boot_error) +{ + u32 socket_id, aid_id, hbm_id; + u32 reg_data; + u64 reg_addr; + + socket_id = AMDGPU_RAS_GPU_ERR_SOCKET_ID(boot_error); + aid_id = AMDGPU_RAS_GPU_ERR_AID_ID(boot_error); + hbm_id = AMDGPU_RAS_GPU_ERR_HBM_ID(boot_error); + + /* The pattern for smn addressing in other SOC could be different from + * the one for aqua_vanjaram. We should revisit the code if the pattern + * is changed. In such case, replace the aqua_vanjaram implementation + * with more common helper */ + reg_addr = (mmMP0_SMN_C2PMSG_92 << 2) + + aqua_vanjaram_encode_ext_smn_addressing(instance); + + reg_data = amdgpu_device_indirect_rreg_ext(adev, reg_addr); + dev_err(adev->dev, "socket: %d, aid: %d, firmware boot failed, fw status is 0x%x\n", + socket_id, aid_id, reg_data); + + if (AMDGPU_RAS_GPU_ERR_MEM_TRAINING(boot_error)) + dev_info(adev->dev, "socket: %d, aid: %d, hbm: %d, memory training failed\n", + socket_id, aid_id, hbm_id); + + if (AMDGPU_RAS_GPU_ERR_FW_LOAD(boot_error)) + dev_info(adev->dev, "socket: %d, aid: %d, firmware load failed at boot time\n", + socket_id, aid_id); + + if (AMDGPU_RAS_GPU_ERR_WAFL_LINK_TRAINING(boot_error)) + dev_info(adev->dev, "socket: %d, aid: %d, wafl link training failed\n", + socket_id, aid_id); + + if (AMDGPU_RAS_GPU_ERR_XGMI_LINK_TRAINING(boot_error)) + dev_info(adev->dev, "socket: %d, aid: %d, xgmi link training failed\n", + socket_id, aid_id); + + if (AMDGPU_RAS_GPU_ERR_USR_CP_LINK_TRAINING(boot_error)) + dev_info(adev->dev, "socket: %d, aid: %d, usr cp link training failed\n", + socket_id, aid_id); + + if (AMDGPU_RAS_GPU_ERR_USR_DP_LINK_TRAINING(boot_error)) + dev_info(adev->dev, "socket: %d, aid: %d, usr dp link training failed\n", + socket_id, aid_id); + + if (AMDGPU_RAS_GPU_ERR_HBM_MEM_TEST(boot_error)) + dev_info(adev->dev, "socket: %d, aid: %d, hbm: %d, hbm memory test failed\n", + socket_id, aid_id, hbm_id); + + if (AMDGPU_RAS_GPU_ERR_HBM_BIST_TEST(boot_error)) + dev_info(adev->dev, "socket: %d, aid: %d, hbm: %d, hbm bist test failed\n", + socket_id, aid_id, hbm_id); +} + +static int amdgpu_ras_wait_for_boot_complete(struct amdgpu_device *adev, + u32 instance, u32 *boot_error) +{ + u32 reg_addr; + u32 reg_data; + int retry_loop; + + /* The pattern for smn addressing in other SOC could be different from + * the one for aqua_vanjaram. We should revisit the code if the pattern + * is changed. In such case, replace the aqua_vanjaram implementation + * with more common helper */ + reg_addr = (mmMP0_SMN_C2PMSG_126 << 2) + + aqua_vanjaram_encode_ext_smn_addressing(instance); + + for (retry_loop = 0; retry_loop < 1000; retry_loop++) { + reg_data = amdgpu_device_indirect_rreg_ext(adev, reg_addr); + if (AMDGPU_RAS_GPU_ERR_BOOT_STATUS(reg_data)) { + *boot_error = reg_data; + return 0; + } + msleep(1); + } + + *boot_error = reg_data; + return -ETIME; +} + +void amdgpu_ras_query_boot_status(struct amdgpu_device *adev, u32 num_instances) +{ + u32 boot_error = 0; + u32 i; + + for (i = 0; i < num_instances; i++) { + if (amdgpu_ras_wait_for_boot_complete(adev, i, &boot_error)) + amdgpu_ras_boot_time_error_reporting(adev, i, boot_error); + } +} diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h index 76fb85628716..5785b705c692 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h @@ -32,6 +32,19 @@ struct amdgpu_iv_entry; +#define AMDGPU_RAS_GPU_ERR_MEM_TRAINING(x) AMDGPU_GET_REG_FIELD(x, 0, 0) +#define AMDGPU_RAS_GPU_ERR_FW_LOAD(x) AMDGPU_GET_REG_FIELD(x, 1, 1) +#define AMDGPU_RAS_GPU_ERR_WAFL_LINK_TRAINING(x) AMDGPU_GET_REG_FIELD(x, 2, 2) +#define AMDGPU_RAS_GPU_ERR_XGMI_LINK_TRAINING(x) AMDGPU_GET_REG_FIELD(x, 3, 3) +#define AMDGPU_RAS_GPU_ERR_USR_CP_LINK_TRAINING(x) AMDGPU_GET_REG_FIELD(x, 4, 4) +#define AMDGPU_RAS_GPU_ERR_USR_DP_LINK_TRAINING(x) AMDGPU_GET_REG_FIELD(x, 5, 5) +#define AMDGPU_RAS_GPU_ERR_HBM_MEM_TEST(x) AMDGPU_GET_REG_FIELD(x, 6, 6) +#define AMDGPU_RAS_GPU_ERR_HBM_BIST_TEST(x) AMDGPU_GET_REG_FIELD(x, 7, 7) +#define AMDGPU_RAS_GPU_ERR_SOCKET_ID(x) AMDGPU_GET_REG_FIELD(x, 10, 8) +#define AMDGPU_RAS_GPU_ERR_AID_ID(x) AMDGPU_GET_REG_FIELD(x, 12, 11) +#define AMDGPU_RAS_GPU_ERR_HBM_ID(x) AMDGPU_GET_REG_FIELD(x, 13, 13) +#define AMDGPU_RAS_GPU_ERR_BOOT_STATUS(x) AMDGPU_GET_REG_FIELD(x, 31, 31) + #define AMDGPU_RAS_FLAG_INIT_BY_VBIOS (0x1 << 0) /* position of instance value in sub_block_index of * ta_ras_trigger_error_input, the sub block uses lower 12 bits @@ -818,5 +831,5 @@ int amdgpu_ras_error_statistic_ce_count(struct ras_err_data *err_data, int amdgpu_ras_error_statistic_ue_count(struct ras_err_data *err_data, struct amdgpu_smuio_mcm_config_info *mcm_info, struct ras_err_addr *err_addr, u64 count); - +void amdgpu_ras_query_boot_status(struct amdgpu_device *adev, u32 num_instances); #endif -- 2.17.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* RE: [PATCH v2 v2 3/5] drm/amdgpu: Add ras helper to query boot errors v2 2024-01-07 15:40 ` [PATCH v2 v2 3/5] drm/amdgpu: Add ras helper to query boot errors v2 Hawking Zhang @ 2024-01-08 11:33 ` Ma, Le 0 siblings, 0 replies; 8+ messages in thread From: Ma, Le @ 2024-01-08 11:33 UTC (permalink / raw) To: Zhang, Hawking, amd-gfx@lists.freedesktop.org, Zhou1, Tao, Yang, Stanley, Wang, Yang(Kevin), Chai, Thomas, Li, Candice Cc: Deucher, Alexander, Lazar, Lijo [AMD Official Use Only - General] The patch series is Reviewed-by: Le Ma <le.ma@amd.com> . If pattern is changed on future asic, we may consider using macro of asic function callback as well. > -----Original Message----- > From: Hawking Zhang <Hawking.Zhang@amd.com> > Sent: Sunday, January 7, 2024 11:40 PM > To: amd-gfx@lists.freedesktop.org; Zhou1, Tao <Tao.Zhou1@amd.com>; Yang, > Stanley <Stanley.Yang@amd.com>; Wang, Yang(Kevin) > <KevinYang.Wang@amd.com>; Chai, Thomas <YiPeng.Chai@amd.com>; Li, > Candice <Candice.Li@amd.com> > Cc: Zhang, Hawking <Hawking.Zhang@amd.com>; Deucher, Alexander > <Alexander.Deucher@amd.com>; Lazar, Lijo <Lijo.Lazar@amd.com>; Ma, Le > <Le.Ma@amd.com> > Subject: [PATCH v2 v2 3/5] drm/amdgpu: Add ras helper to query boot errors v2 > > Add ras helper function to query boot time gpu errors. > v2: use aqua_vanjaram smn addressing pattern > > Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + > drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 95 > +++++++++++++++++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h | > 15 +++- > 3 files changed, 110 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > index 9da14436a373..df3aa69be425 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h > @@ -1330,6 +1330,7 @@ int emu_soc_asic_init(struct amdgpu_device *adev); > #define WREG32_FIELD_OFFSET(reg, offset, field, val) \ > WREG32(mm##reg + offset, (RREG32(mm##reg + offset) & > ~REG_FIELD_MASK(reg, field)) | (val) << REG_FIELD_SHIFT(reg, field)) > > +#define AMDGPU_GET_REG_FIELD(x, h, l) (((x) & GENMASK_ULL(h, l)) >> > +(l)) > /* > * BIOS helpers. > */ > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c > b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c > index fc42fb6ee191..a901b00d4949 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c > @@ -3763,3 +3763,98 @@ int amdgpu_ras_error_statistic_ce_count(struct > ras_err_data *err_data, > > return 0; > } > + > +#define mmMP0_SMN_C2PMSG_92 0x1609C > +#define mmMP0_SMN_C2PMSG_126 0x160BE > +static void amdgpu_ras_boot_time_error_reporting(struct amdgpu_device > *adev, > + u32 instance, u32 boot_error) > +{ > + u32 socket_id, aid_id, hbm_id; > + u32 reg_data; > + u64 reg_addr; > + > + socket_id = AMDGPU_RAS_GPU_ERR_SOCKET_ID(boot_error); > + aid_id = AMDGPU_RAS_GPU_ERR_AID_ID(boot_error); > + hbm_id = AMDGPU_RAS_GPU_ERR_HBM_ID(boot_error); > + > + /* The pattern for smn addressing in other SOC could be different from > + * the one for aqua_vanjaram. We should revisit the code if the pattern > + * is changed. In such case, replace the aqua_vanjaram implementation > + * with more common helper */ > + reg_addr = (mmMP0_SMN_C2PMSG_92 << 2) + > + aqua_vanjaram_encode_ext_smn_addressing(instance); > + > + reg_data = amdgpu_device_indirect_rreg_ext(adev, reg_addr); > + dev_err(adev->dev, "socket: %d, aid: %d, firmware boot failed, fw > status is 0x%x\n", > + socket_id, aid_id, reg_data); > + > + if (AMDGPU_RAS_GPU_ERR_MEM_TRAINING(boot_error)) > + dev_info(adev->dev, "socket: %d, aid: %d, hbm: %d, memory > training failed\n", > + socket_id, aid_id, hbm_id); > + > + if (AMDGPU_RAS_GPU_ERR_FW_LOAD(boot_error)) > + dev_info(adev->dev, "socket: %d, aid: %d, firmware load failed > at boot time\n", > + socket_id, aid_id); > + > + if (AMDGPU_RAS_GPU_ERR_WAFL_LINK_TRAINING(boot_error)) > + dev_info(adev->dev, "socket: %d, aid: %d, wafl link training > failed\n", > + socket_id, aid_id); > + > + if (AMDGPU_RAS_GPU_ERR_XGMI_LINK_TRAINING(boot_error)) > + dev_info(adev->dev, "socket: %d, aid: %d, xgmi link training > failed\n", > + socket_id, aid_id); > + > + if (AMDGPU_RAS_GPU_ERR_USR_CP_LINK_TRAINING(boot_error)) > + dev_info(adev->dev, "socket: %d, aid: %d, usr cp link training > failed\n", > + socket_id, aid_id); > + > + if (AMDGPU_RAS_GPU_ERR_USR_DP_LINK_TRAINING(boot_error)) > + dev_info(adev->dev, "socket: %d, aid: %d, usr dp link training > failed\n", > + socket_id, aid_id); > + > + if (AMDGPU_RAS_GPU_ERR_HBM_MEM_TEST(boot_error)) > + dev_info(adev->dev, "socket: %d, aid: %d, hbm: %d, hbm > memory test failed\n", > + socket_id, aid_id, hbm_id); > + > + if (AMDGPU_RAS_GPU_ERR_HBM_BIST_TEST(boot_error)) > + dev_info(adev->dev, "socket: %d, aid: %d, hbm: %d, hbm bist > test failed\n", > + socket_id, aid_id, hbm_id); > +} > + > +static int amdgpu_ras_wait_for_boot_complete(struct amdgpu_device *adev, > + u32 instance, u32 *boot_error) { > + u32 reg_addr; > + u32 reg_data; > + int retry_loop; > + > + /* The pattern for smn addressing in other SOC could be different from > + * the one for aqua_vanjaram. We should revisit the code if the pattern > + * is changed. In such case, replace the aqua_vanjaram implementation > + * with more common helper */ > + reg_addr = (mmMP0_SMN_C2PMSG_126 << 2) + > + aqua_vanjaram_encode_ext_smn_addressing(instance); > + > + for (retry_loop = 0; retry_loop < 1000; retry_loop++) { > + reg_data = amdgpu_device_indirect_rreg_ext(adev, reg_addr); > + if (AMDGPU_RAS_GPU_ERR_BOOT_STATUS(reg_data)) { > + *boot_error = reg_data; > + return 0; > + } > + msleep(1); > + } > + > + *boot_error = reg_data; > + return -ETIME; > +} > + > +void amdgpu_ras_query_boot_status(struct amdgpu_device *adev, u32 > +num_instances) { > + u32 boot_error = 0; > + u32 i; > + > + for (i = 0; i < num_instances; i++) { > + if (amdgpu_ras_wait_for_boot_complete(adev, i, &boot_error)) > + amdgpu_ras_boot_time_error_reporting(adev, i, > boot_error); > + } > +} > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h > b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h > index 76fb85628716..5785b705c692 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h > @@ -32,6 +32,19 @@ > > struct amdgpu_iv_entry; > > +#define AMDGPU_RAS_GPU_ERR_MEM_TRAINING(x) > AMDGPU_GET_REG_FIELD(x, 0, 0) > +#define AMDGPU_RAS_GPU_ERR_FW_LOAD(x) > AMDGPU_GET_REG_FIELD(x, 1, 1) > +#define AMDGPU_RAS_GPU_ERR_WAFL_LINK_TRAINING(x) > AMDGPU_GET_REG_FIELD(x, 2, 2) > +#define AMDGPU_RAS_GPU_ERR_XGMI_LINK_TRAINING(x) > AMDGPU_GET_REG_FIELD(x, 3, 3) > +#define AMDGPU_RAS_GPU_ERR_USR_CP_LINK_TRAINING(x) > AMDGPU_GET_REG_FIELD(x, 4, 4) > +#define AMDGPU_RAS_GPU_ERR_USR_DP_LINK_TRAINING(x) > AMDGPU_GET_REG_FIELD(x, 5, 5) > +#define AMDGPU_RAS_GPU_ERR_HBM_MEM_TEST(x) > AMDGPU_GET_REG_FIELD(x, 6, 6) > +#define AMDGPU_RAS_GPU_ERR_HBM_BIST_TEST(x) > AMDGPU_GET_REG_FIELD(x, 7, 7) > +#define AMDGPU_RAS_GPU_ERR_SOCKET_ID(x) > AMDGPU_GET_REG_FIELD(x, 10, 8) > +#define AMDGPU_RAS_GPU_ERR_AID_ID(x) > AMDGPU_GET_REG_FIELD(x, 12, 11) > +#define AMDGPU_RAS_GPU_ERR_HBM_ID(x) > AMDGPU_GET_REG_FIELD(x, 13, 13) > +#define AMDGPU_RAS_GPU_ERR_BOOT_STATUS(x) > AMDGPU_GET_REG_FIELD(x, 31, 31) > + > #define AMDGPU_RAS_FLAG_INIT_BY_VBIOS (0x1 << 0) > /* position of instance value in sub_block_index of > * ta_ras_trigger_error_input, the sub block uses lower 12 bits @@ -818,5 > +831,5 @@ int amdgpu_ras_error_statistic_ce_count(struct ras_err_data > *err_data, int amdgpu_ras_error_statistic_ue_count(struct ras_err_data > *err_data, > struct amdgpu_smuio_mcm_config_info *mcm_info, > struct ras_err_addr *err_addr, u64 count); > - > +void amdgpu_ras_query_boot_status(struct amdgpu_device *adev, u32 > +num_instances); > #endif > -- > 2.17.1 ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH v2 v2 4/5] drm/amdgpu: Query boot status if discovery failed 2024-01-07 15:40 [PATCH 1/5] drm/amdgpu: drop psp v13 query_boot_status implementation Hawking Zhang ` (3 preceding siblings ...) 2024-01-07 15:40 ` [PATCH v2 v2 3/5] drm/amdgpu: Add ras helper to query boot errors v2 Hawking Zhang @ 2024-01-07 15:40 ` Hawking Zhang 4 siblings, 0 replies; 8+ messages in thread From: Hawking Zhang @ 2024-01-07 15:40 UTC (permalink / raw) To: amd-gfx, Tao Zhou, Stanley Yang, Yang Wang, YiPeng Chai, Candice Li Cc: Alex Deucher, Le Ma, Lijo Lazar, Hawking Zhang Check and report boot status if discovery failed. Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c index b8fde08aec8e..302b71e9f1e2 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_discovery.c @@ -27,6 +27,7 @@ #include "amdgpu_discovery.h" #include "soc15_hw_ip.h" #include "discovery.h" +#include "amdgpu_ras.h" #include "soc15.h" #include "gfx_v9_0.h" @@ -98,6 +99,7 @@ #define FIRMWARE_IP_DISCOVERY "amdgpu/ip_discovery.bin" MODULE_FIRMWARE(FIRMWARE_IP_DISCOVERY); +#define mmIP_DISCOVERY_VERSION 0x16A00 #define mmRCC_CONFIG_MEMSIZE 0xde3 #define mmMP0_SMN_C2PMSG_33 0x16061 #define mmMM_INDEX 0x0 @@ -518,7 +520,9 @@ static int amdgpu_discovery_init(struct amdgpu_device *adev) out: kfree(adev->mman.discovery_bin); adev->mman.discovery_bin = NULL; - + if ((amdgpu_discovery != 2) && + (RREG32(mmIP_DISCOVERY_VERSION) == 4)) + amdgpu_ras_query_boot_status(adev, 4); return r; } -- 2.17.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-01-08 11:34 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-01-07 15:40 [PATCH 1/5] drm/amdgpu: drop psp v13 query_boot_status implementation Hawking Zhang 2024-01-07 15:40 ` [PATCH 4/5] drm/amdgpu: Query boot status if discovery failed Hawking Zhang 2024-01-07 15:40 ` [PATCH 5/5] drm/amdgpu: Query boot status if boot failed Hawking Zhang 2024-01-07 15:40 ` [PATCH v2 v2 2/5] drm/amdgpu: Init pcie_index/data address as fallback (v2) Hawking Zhang 2024-01-08 5:53 ` Wang, Yang(Kevin) 2024-01-07 15:40 ` [PATCH v2 v2 3/5] drm/amdgpu: Add ras helper to query boot errors v2 Hawking Zhang 2024-01-08 11:33 ` Ma, Le 2024-01-07 15:40 ` [PATCH v2 v2 4/5] drm/amdgpu: Query boot status if discovery failed Hawking Zhang
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox