aboutsummaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorChristophe Lombard <clombard@linux.vnet.ibm.com>2021-10-14 17:56:59 +0200
committerVasant Hegde <hegdevasant@linux.vnet.ibm.com>2021-10-19 12:26:01 +0530
commita3bbeac7e23795456df4f3f52d442bd1ba35eaa3 (patch)
treeb8d649bbffb04b129cc972bbb2c097cfd3f21184 /hw
parentd4cd8a29e4c548f6383b47604a83c69b58d849e8 (diff)
downloadskiboot-a3bbeac7e23795456df4f3f52d442bd1ba35eaa3.zip
skiboot-a3bbeac7e23795456df4f3f52d442bd1ba35eaa3.tar.gz
skiboot-a3bbeac7e23795456df4f3f52d442bd1ba35eaa3.tar.bz2
pau: hmi scom dump
This patch add a new function to dump PAU registers when a HMI has been raised and an OpenCAPI link has been hit by an error. For each register, the scom address and the register value are printed. The hmi.c has been redesigned in order to support the new PHB/PCIEX type (PAU OpenCapi). Now, the *npu* functions support NPU and PAU units of P8, P9 and P10 chips. Signed-off-by: Christophe Lombard <clombard@linux.vnet.ibm.com> Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Diffstat (limited to 'hw')
-rw-r--r--hw/npu2-common.c27
-rw-r--r--hw/pau.c44
2 files changed, 47 insertions, 24 deletions
diff --git a/hw/npu2-common.c b/hw/npu2-common.c
index 3bc9bce..b3f500f 100644
--- a/hw/npu2-common.c
+++ b/hw/npu2-common.c
@@ -296,31 +296,10 @@ static void show_all_regs(struct npu2 *npu, int brick_index)
}
}
-void npu2_dump_scoms(int chip_id)
+void npu2_dump_scoms(struct npu2 *npu, int chip_id)
{
- struct npu2 *npu;
- struct phb *phb;
- struct npu2_dev *dev;
-
- /*
- * Look for the npu2 structure for that chip ID. We can access it
- * through the array of phbs, looking for a nvlink or opencapi
- * phb. We can have several entries, but they all point
- * to the same npu2 structure
- */
- for_each_phb(phb) {
- npu = NULL;
- if (phb->phb_type == phb_type_npu_v2) {
- npu = phb_to_npu2_nvlink(phb);
- } else if (phb->phb_type == phb_type_npu_v2_opencapi) {
- dev = phb_to_npu2_dev_ocapi(phb);
- npu = dev->npu;
- }
- if (npu && npu->chip_id == chip_id) {
- show_all_regs(npu, -1 /* all bricks */);
- break;
- }
- }
+ if (npu && npu->chip_id == chip_id)
+ show_all_regs(npu, -1 /* all bricks */);
}
static uint64_t npu2_ipi_attributes(struct irq_source *is __unused, uint32_t isn __unused)
diff --git a/hw/pau.c b/hw/pau.c
index d632b2b..324d1af 100644
--- a/hw/pau.c
+++ b/hw/pau.c
@@ -32,6 +32,50 @@ struct pau_dev *pau_next_dev(struct pau *pau, struct pau_dev *dev,
return NULL;
}
+static void pau_opencapi_dump_scom_reg(struct pau *pau, uint64_t reg)
+{
+ PAUDBG(pau, "0x%llx = 0x%016llx\n", reg, pau_read(pau, reg));
+}
+
+void pau_opencapi_dump_scoms(struct pau *pau)
+{
+ struct pau_dev *dev;
+ uint64_t cq_sm;
+
+ for (uint32_t i = 1; i < 4; i++) {
+ cq_sm = PAU_BLOCK_CQ_SM(i);
+
+ pau_opencapi_dump_scom_reg(pau, cq_sm + PAU_REG_OFFSET(PAU_MCP_MISC_CERR_MESSAGE0));
+ pau_opencapi_dump_scom_reg(pau, cq_sm + PAU_REG_OFFSET(PAU_MCP_MISC_CERR_MESSAGE1));
+ pau_opencapi_dump_scom_reg(pau, cq_sm + PAU_REG_OFFSET(PAU_MCP_MISC_CERR_MESSAGE2));
+ pau_opencapi_dump_scom_reg(pau, cq_sm + PAU_REG_OFFSET(PAU_MCP_MISC_CERR_MESSAGE3));
+ pau_opencapi_dump_scom_reg(pau, cq_sm + PAU_REG_OFFSET(PAU_MCP_MISC_CERR_MESSAGE4));
+ pau_opencapi_dump_scom_reg(pau, cq_sm + PAU_REG_OFFSET(PAU_MCP_MISC_CERR_MESSAGE5));
+ pau_opencapi_dump_scom_reg(pau, cq_sm + PAU_REG_OFFSET(PAU_MCP_MISC_CERR_MESSAGE6));
+ pau_opencapi_dump_scom_reg(pau, cq_sm + PAU_REG_OFFSET(PAU_MCP_MISC_CERR_MESSAGE7));
+ pau_opencapi_dump_scom_reg(pau, cq_sm + PAU_REG_OFFSET(PAU_MCP_MISC_CERR_FIRST0));
+ pau_opencapi_dump_scom_reg(pau, cq_sm + PAU_REG_OFFSET(PAU_MCP_MISC_CERR_FIRST1));
+ pau_opencapi_dump_scom_reg(pau, cq_sm + PAU_REG_OFFSET(PAU_MCP_MISC_CERR_FIRST2));
+ }
+
+ pau_opencapi_dump_scom_reg(pau, PAU_CTL_MISC_CERR_MESSAGE0);
+ pau_opencapi_dump_scom_reg(pau, PAU_CTL_MISC_CERR_MESSAGE1);
+ pau_opencapi_dump_scom_reg(pau, PAU_CTL_MISC_CERR_MESSAGE2);
+ pau_opencapi_dump_scom_reg(pau, PAU_CTL_MISC_CERR_FIRST0);
+ pau_opencapi_dump_scom_reg(pau, PAU_CTL_MISC_CERR_FIRST1);
+ pau_opencapi_dump_scom_reg(pau, PAU_DAT_MISC_CERR_ECC_HOLD);
+ pau_opencapi_dump_scom_reg(pau, PAU_DAT_MISC_CERR_ECC_MASK);
+ pau_opencapi_dump_scom_reg(pau, PAU_DAT_MISC_CERR_ECC_FIRST);
+
+ pau_for_each_opencapi_dev(dev, pau) {
+ pau_opencapi_dump_scom_reg(pau, PAU_OTL_MISC_ERR_RPT_HOLD0(dev->index));
+ pau_opencapi_dump_scom_reg(pau, PAU_OTL_MISC_OTL_REM0(dev->index));
+ pau_opencapi_dump_scom_reg(pau, PAU_OTL_MISC_ERROR_SIG_RXI(dev->index));
+ pau_opencapi_dump_scom_reg(pau, PAU_OTL_MISC_ERROR_SIG_RXO(dev->index));
+ pau_opencapi_dump_scom_reg(pau, PAU_OTL_MISC_ERR_RPT_HOLD1(dev->index));
+ }
+}
+
static void pau_dt_create_link(struct dt_node *pau, uint32_t pau_index,
uint32_t dev_index)
{