@@ -33,6 +33,9 @@
/* SPR_MODE scom address */
#define P9_SCOM_SPR_MODE 0x20010A84
+/* TOD Error inject register scom address */
+#define TOD_ERROR_INJECT 0x40031
+
/* TB Errors */
#define TB_ERROR_MASK PPC_BITMASK(10, 15)
/* Core level TB errors */
@@ -44,6 +47,21 @@
#define TB_ERROR_SPURR_PARITY 0x5
#define TB_ERROR_DEC_PARITY 0x6
+/* TOD Errors */
+#define TOD_ERR_MPATH_CREG_PARITY PPC_BIT(0)
+#define TOD_ERR_PPORT0_CREG_PARITY PPC_BIT(3)
+#define TOD_ERR_PPORT1_CREG_PARITY PPC_BIT(4)
+#define TOD_ERR_SPORT0_CREG_PARITY PPC_BIT(5)
+#define TOD_ERR_SPORT1_CREG_PARITY PPC_BIT(6)
+#define TOD_ERR_SPATH_CREG_PARITY PPC_BIT(7)
+#define TOD_ERR_IPATH_CREG_PARITY PPC_BIT(8)
+#define TOD_ERR_PSMS_CREG_PARITY PPC_BIT(9)
+#define TOD_ERR_PSS_HAMMING_DISTANCE PPC_BIT(18)
+#define TOD_ERR_DELAY_COMPL_PARITY PPC_BIT(22)
+#define TOD_ERR_CTCR_PARITY PPC_BIT(32)
+#define TOD_ERR_TOD_SYNC_CHECK PPC_BIT(33)
+#define TOD_ERR_TOD_FSM_PARITY PPC_BIT(34)
+
typedef struct error_type {
char *name;
char *desc;
@@ -59,6 +77,45 @@ static error_type_t tb_error_type[] = {
{ "dec_parity", "DEC parity error", TB_ERROR_DEC_PARITY },
};
+static error_type_t tod_error_type[] = {
+ { "mp_reg_parity",
+ "Master path control register (0x00): data parity error",
+ TOD_ERR_MPATH_CREG_PARITY },
+ { "pp0_reg_parity",
+ "port-0 primary configuration register (0x01): data parity error",
+ TOD_ERR_PPORT0_CREG_PARITY },
+ { "pp1_reg_parity",
+ "port-1 primary configuration register (0x02): data parity error",
+ TOD_ERR_PPORT1_CREG_PARITY },
+ { "sp0_reg_parity",
+ "port-0 secondary configuration register (0x03): data parity error",
+ TOD_ERR_SPORT0_CREG_PARITY },
+ { "sp1_reg_parity",
+ "port-1 secondary configuration register (0x04): data parity error",
+ TOD_ERR_SPORT1_CREG_PARITY },
+ { "sp_reg_parity",
+ "slave path control register (0x05): data parity error",
+ TOD_ERR_SPATH_CREG_PARITY },
+ { "ip_reg_parity",
+ "internal path control register (0x06): data parity error",
+ TOD_ERR_IPATH_CREG_PARITY },
+ { "psms_reg_parity",
+ "primary/secondary master/slave control register (0x07): data parity error",
+ TOD_ERR_PSMS_CREG_PARITY },
+ { "pss_hum_dist", "PSS Hamming Distance",
+ TOD_ERR_PSS_HAMMING_DISTANCE },
+ { "delay_parity",
+ "internal path: delay, STEP check components: parity error",
+ TOD_ERR_DELAY_COMPL_PARITY },
+ { "ch_reg_parity",
+ "chip control register (0x10): data parity error",
+ TOD_ERR_CTCR_PARITY },
+ { "sync_check", "internal path: SYNC check error",
+ TOD_ERR_TOD_SYNC_CHECK },
+ { "fsm_st_parity", "internal path: FSM state parity error",
+ TOD_ERR_TOD_FSM_PARITY },
+};
+
static int timefac_inject_tb_error(struct pdbg_target *target, void *data)
{
int target_type = 0;
@@ -101,6 +158,23 @@ static int timefac_inject_tb_error(struct pdbg_target *target, void *data)
return rc;
}
+static int timefac_inject_tod_error(struct pdbg_target *target, void *data)
+{
+ uint64_t err_val;
+ int rc;
+
+ err_val = *((uint64_t *)data);
+
+ if (TARGET_TYPE_PROC != get_target_type(target))
+ return -EINVAL;
+
+ rc = target_inject_error(target, TOD_ERROR_INJECT, err_val);
+ if (rc) {
+ printf("Failed to inject\n");
+ }
+ return rc;
+}
+
void timefac_err_init(void)
{
int i;
@@ -111,4 +185,11 @@ void timefac_err_init(void)
tb_error_type[i].desc, timefac_inject_tb_error,
&tb_error_type[i].error);
+ /* Register TOD error injects */
+ for (i = 0; i < ARRAY_SIZE(tod_error_type); i++)
+ register_error_inject("tod", tod_error_type[i].name,
+ tod_error_type[i].desc,
+ timefac_inject_tod_error,
+ &tod_error_type[i].error);
+
}
Add TOD error injections. # ./pdbg -p0 inject tod pp0_reg_parity p0: 0x40031 = 0x1000000000000000 # Signed-off-by: Mahesh Salgaonkar <mahesh@linux.ibm.com> --- src/timefac_error.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+)