xref: /arm-trusted-firmware/drivers/arm/gic/v3/gic600ae_fmu.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2021-2022, NVIDIA Corporation. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu /*
8*91f16700Schasinglulu  * Driver for GIC-600AE Fault Management Unit
9*91f16700Schasinglulu  */
10*91f16700Schasinglulu 
11*91f16700Schasinglulu #include <assert.h>
12*91f16700Schasinglulu #include <inttypes.h>
13*91f16700Schasinglulu 
14*91f16700Schasinglulu #include <arch_helpers.h>
15*91f16700Schasinglulu #include <common/debug.h>
16*91f16700Schasinglulu #include <drivers/arm/gic600ae_fmu.h>
17*91f16700Schasinglulu #include <drivers/arm/gicv3.h>
18*91f16700Schasinglulu 
19*91f16700Schasinglulu /* GIC-600 AE FMU specific register offsets */
20*91f16700Schasinglulu 
21*91f16700Schasinglulu /* GIC-600 AE FMU specific macros */
22*91f16700Schasinglulu #define FMU_ERRIDR_NUM			U(44)
23*91f16700Schasinglulu #define FMU_ERRIDR_NUM_MASK		U(0xFFFF)
24*91f16700Schasinglulu 
25*91f16700Schasinglulu /* Safety mechanisms for GICD block */
26*91f16700Schasinglulu static char *gicd_sm_info[] = {
27*91f16700Schasinglulu 	"Reserved",
28*91f16700Schasinglulu 	"GICD dual lockstep error",
29*91f16700Schasinglulu 	"GICD AXI4 slave interface error",
30*91f16700Schasinglulu 	"GICD-PPI AXI4-Stream interface error",
31*91f16700Schasinglulu 	"GICD-ITS AXI4-Stream interface error",
32*91f16700Schasinglulu 	"GICD-SPI-Collator AXI4-Stream interface error",
33*91f16700Schasinglulu 	"GICD AXI4 master interface error",
34*91f16700Schasinglulu 	"SPI RAM DED error",
35*91f16700Schasinglulu 	"SGI RAM DED error",
36*91f16700Schasinglulu 	"Reserved",
37*91f16700Schasinglulu 	"LPI RAM DED error",
38*91f16700Schasinglulu 	"GICD-remote-GICD AXI4-Stream interface error",
39*91f16700Schasinglulu 	"GICD Q-Channel interface error",
40*91f16700Schasinglulu 	"GICD P-Channel interface error",
41*91f16700Schasinglulu 	"SPI RAM address decode error",
42*91f16700Schasinglulu 	"SGI RAM address decode error",
43*91f16700Schasinglulu 	"Reserved",
44*91f16700Schasinglulu 	"LPI RAM address decode error",
45*91f16700Schasinglulu 	"FMU dual lockstep error",
46*91f16700Schasinglulu 	"FMU ping ACK error",
47*91f16700Schasinglulu 	"FMU APB parity error",
48*91f16700Schasinglulu 	"GICD-Wake AXI4-Stream interface error",
49*91f16700Schasinglulu 	"GICD PageOffset or Chip ID error",
50*91f16700Schasinglulu 	"MBIST REQ error",
51*91f16700Schasinglulu 	"SPI RAM SEC error",
52*91f16700Schasinglulu 	"SGI RAM SEC error",
53*91f16700Schasinglulu 	"Reserved",
54*91f16700Schasinglulu 	"LPI RAM SEC error",
55*91f16700Schasinglulu 	"User custom SM0 error",
56*91f16700Schasinglulu 	"User custom SM1 error",
57*91f16700Schasinglulu 	"GICD-ITS Monolithic switch error",
58*91f16700Schasinglulu 	"GICD-ITS Q-Channel interface error",
59*91f16700Schasinglulu 	"GICD-ITS Monolithic interface error",
60*91f16700Schasinglulu 	"GICD FMU ClkGate override"
61*91f16700Schasinglulu };
62*91f16700Schasinglulu 
63*91f16700Schasinglulu /* Safety mechanisms for PPI block */
64*91f16700Schasinglulu static char *ppi_sm_info[] = {
65*91f16700Schasinglulu 	"Reserved",
66*91f16700Schasinglulu 	"PPI dual lockstep error",
67*91f16700Schasinglulu 	"PPI-GICD AXI4-Stream interface error",
68*91f16700Schasinglulu 	"PPI-CPU-IF AXI4-Stream interface error",
69*91f16700Schasinglulu 	"PPI Q-Channel interface error",
70*91f16700Schasinglulu 	"PPI RAM DED error",
71*91f16700Schasinglulu 	"PPI RAM address decode error",
72*91f16700Schasinglulu 	"PPI RAM SEC error",
73*91f16700Schasinglulu 	"PPI User0 SM",
74*91f16700Schasinglulu 	"PPI User1 SM",
75*91f16700Schasinglulu 	"MBIST REQ error",
76*91f16700Schasinglulu 	"PPI interrupt parity protection error",
77*91f16700Schasinglulu 	"PPI FMU ClkGate override"
78*91f16700Schasinglulu };
79*91f16700Schasinglulu 
80*91f16700Schasinglulu /* Safety mechanisms for ITS block */
81*91f16700Schasinglulu static char *its_sm_info[] = {
82*91f16700Schasinglulu 	"Reserved",
83*91f16700Schasinglulu 	"ITS dual lockstep error",
84*91f16700Schasinglulu 	"ITS-GICD AXI4-Stream interface error",
85*91f16700Schasinglulu 	"ITS AXI4 slave interface error",
86*91f16700Schasinglulu 	"ITS AXI4 master interface error",
87*91f16700Schasinglulu 	"ITS Q-Channel interface error",
88*91f16700Schasinglulu 	"ITS RAM DED error",
89*91f16700Schasinglulu 	"ITS RAM address decode error",
90*91f16700Schasinglulu 	"Bypass ACE switch error",
91*91f16700Schasinglulu 	"ITS RAM SEC error",
92*91f16700Schasinglulu 	"ITS User0 SM",
93*91f16700Schasinglulu 	"ITS User1 SM",
94*91f16700Schasinglulu 	"ITS-GICD Monolithic interface error",
95*91f16700Schasinglulu 	"MBIST REQ error",
96*91f16700Schasinglulu 	"ITS FMU ClkGate override"
97*91f16700Schasinglulu };
98*91f16700Schasinglulu 
99*91f16700Schasinglulu /* Safety mechanisms for SPI Collator block */
100*91f16700Schasinglulu static char *spicol_sm_info[] = {
101*91f16700Schasinglulu 	"Reserved",
102*91f16700Schasinglulu 	"SPI Collator dual lockstep error",
103*91f16700Schasinglulu 	"SPI-Collator-GICD AXI4-Stream interface error",
104*91f16700Schasinglulu 	"SPI Collator Q-Channel interface error",
105*91f16700Schasinglulu 	"SPI Collator Q-Channel clock error",
106*91f16700Schasinglulu 	"SPI interrupt parity error"
107*91f16700Schasinglulu };
108*91f16700Schasinglulu 
109*91f16700Schasinglulu /* Safety mechanisms for Wake Request block */
110*91f16700Schasinglulu static char *wkrqst_sm_info[] = {
111*91f16700Schasinglulu 	"Reserved",
112*91f16700Schasinglulu 	"Wake dual lockstep error",
113*91f16700Schasinglulu 	"Wake-GICD AXI4-Stream interface error"
114*91f16700Schasinglulu };
115*91f16700Schasinglulu 
116*91f16700Schasinglulu /* Helper function to find detailed information for a specific IERR */
117*91f16700Schasinglulu static char __unused *ras_ierr_to_str(unsigned int blkid, unsigned int ierr)
118*91f16700Schasinglulu {
119*91f16700Schasinglulu 	char *str = NULL;
120*91f16700Schasinglulu 
121*91f16700Schasinglulu 	/* Find the correct record */
122*91f16700Schasinglulu 	switch (blkid) {
123*91f16700Schasinglulu 	case FMU_BLK_GICD:
124*91f16700Schasinglulu 		assert(ierr < ARRAY_SIZE(gicd_sm_info));
125*91f16700Schasinglulu 		str = gicd_sm_info[ierr];
126*91f16700Schasinglulu 		break;
127*91f16700Schasinglulu 
128*91f16700Schasinglulu 	case FMU_BLK_SPICOL:
129*91f16700Schasinglulu 		assert(ierr < ARRAY_SIZE(spicol_sm_info));
130*91f16700Schasinglulu 		str = spicol_sm_info[ierr];
131*91f16700Schasinglulu 		break;
132*91f16700Schasinglulu 
133*91f16700Schasinglulu 	case FMU_BLK_WAKERQ:
134*91f16700Schasinglulu 		assert(ierr < ARRAY_SIZE(wkrqst_sm_info));
135*91f16700Schasinglulu 		str = wkrqst_sm_info[ierr];
136*91f16700Schasinglulu 		break;
137*91f16700Schasinglulu 
138*91f16700Schasinglulu 	case FMU_BLK_ITS0...FMU_BLK_ITS7:
139*91f16700Schasinglulu 		assert(ierr < ARRAY_SIZE(its_sm_info));
140*91f16700Schasinglulu 		str = its_sm_info[ierr];
141*91f16700Schasinglulu 		break;
142*91f16700Schasinglulu 
143*91f16700Schasinglulu 	case FMU_BLK_PPI0...FMU_BLK_PPI31:
144*91f16700Schasinglulu 		assert(ierr < ARRAY_SIZE(ppi_sm_info));
145*91f16700Schasinglulu 		str = ppi_sm_info[ierr];
146*91f16700Schasinglulu 		break;
147*91f16700Schasinglulu 
148*91f16700Schasinglulu 	default:
149*91f16700Schasinglulu 		assert(false);
150*91f16700Schasinglulu 		break;
151*91f16700Schasinglulu 	}
152*91f16700Schasinglulu 
153*91f16700Schasinglulu 	return str;
154*91f16700Schasinglulu }
155*91f16700Schasinglulu 
156*91f16700Schasinglulu /*
157*91f16700Schasinglulu  * Probe for error in memory-mapped registers containing error records.
158*91f16700Schasinglulu  * Upon detecting an error, set probe data to the index of the record
159*91f16700Schasinglulu  * in error, and return 1; otherwise, return 0.
160*91f16700Schasinglulu  */
161*91f16700Schasinglulu int gic600_fmu_probe(uint64_t base, int *probe_data)
162*91f16700Schasinglulu {
163*91f16700Schasinglulu 	uint64_t gsr;
164*91f16700Schasinglulu 
165*91f16700Schasinglulu 	assert(base != 0UL);
166*91f16700Schasinglulu 
167*91f16700Schasinglulu 	/*
168*91f16700Schasinglulu 	 * Read ERR_GSR to find the error record 'M'
169*91f16700Schasinglulu 	 */
170*91f16700Schasinglulu 	gsr = gic_fmu_read_errgsr(base);
171*91f16700Schasinglulu 	if (gsr == U(0)) {
172*91f16700Schasinglulu 		return 0;
173*91f16700Schasinglulu 	}
174*91f16700Schasinglulu 
175*91f16700Schasinglulu 	/* Return the index of the record in error */
176*91f16700Schasinglulu 	if (probe_data != NULL) {
177*91f16700Schasinglulu 		*probe_data = (int)__builtin_ctzll(gsr);
178*91f16700Schasinglulu 	}
179*91f16700Schasinglulu 
180*91f16700Schasinglulu 	return 1;
181*91f16700Schasinglulu }
182*91f16700Schasinglulu 
183*91f16700Schasinglulu /*
184*91f16700Schasinglulu  * The handler function to read RAS records and find the safety
185*91f16700Schasinglulu  * mechanism with the error.
186*91f16700Schasinglulu  */
187*91f16700Schasinglulu int gic600_fmu_ras_handler(uint64_t base, int probe_data)
188*91f16700Schasinglulu {
189*91f16700Schasinglulu 	uint64_t errstatus;
190*91f16700Schasinglulu 	unsigned int blkid = (unsigned int)probe_data, ierr, serr;
191*91f16700Schasinglulu 
192*91f16700Schasinglulu 	assert(base != 0UL);
193*91f16700Schasinglulu 
194*91f16700Schasinglulu 	/*
195*91f16700Schasinglulu 	 * FMU_ERRGSR indicates the ID of the GIC
196*91f16700Schasinglulu 	 * block that faulted.
197*91f16700Schasinglulu 	 */
198*91f16700Schasinglulu 	assert(blkid <= FMU_BLK_PPI31);
199*91f16700Schasinglulu 
200*91f16700Schasinglulu 	/*
201*91f16700Schasinglulu 	 * Find more information by reading FMU_ERR<M>STATUS
202*91f16700Schasinglulu 	 * register
203*91f16700Schasinglulu 	 */
204*91f16700Schasinglulu 	errstatus = gic_fmu_read_errstatus(base, blkid);
205*91f16700Schasinglulu 
206*91f16700Schasinglulu 	/*
207*91f16700Schasinglulu 	 * If FMU_ERR<M>STATUS.V is set to 0, no RAS records
208*91f16700Schasinglulu 	 * need to be scanned.
209*91f16700Schasinglulu 	 */
210*91f16700Schasinglulu 	if ((errstatus & FMU_ERRSTATUS_V_BIT) == U(0)) {
211*91f16700Schasinglulu 		return 0;
212*91f16700Schasinglulu 	}
213*91f16700Schasinglulu 
214*91f16700Schasinglulu 	/*
215*91f16700Schasinglulu 	 * FMU_ERR<M>STATUS.IERR indicates which Safety Mechanism
216*91f16700Schasinglulu 	 * reported the error.
217*91f16700Schasinglulu 	 */
218*91f16700Schasinglulu 	ierr = (errstatus >> FMU_ERRSTATUS_IERR_SHIFT) &
219*91f16700Schasinglulu 			FMU_ERRSTATUS_IERR_MASK;
220*91f16700Schasinglulu 
221*91f16700Schasinglulu 	/*
222*91f16700Schasinglulu 	 * FMU_ERR<M>STATUS.SERR indicates architecturally
223*91f16700Schasinglulu 	 * defined primary error code.
224*91f16700Schasinglulu 	 */
225*91f16700Schasinglulu 	serr = errstatus & FMU_ERRSTATUS_SERR_MASK;
226*91f16700Schasinglulu 
227*91f16700Schasinglulu 	ERROR("**************************************\n");
228*91f16700Schasinglulu 	ERROR("RAS %s Error detected by GIC600 AE FMU\n",
229*91f16700Schasinglulu 		((errstatus & FMU_ERRSTATUS_UE_BIT) != 0U) ?
230*91f16700Schasinglulu 			"Uncorrectable" : "Corrected");
231*91f16700Schasinglulu 	ERROR("\tStatus = 0x%lx \n", errstatus);
232*91f16700Schasinglulu 	ERROR("\tBlock ID = 0x%x\n", blkid);
233*91f16700Schasinglulu 	ERROR("\tSafety Mechanism ID = 0x%x (%s)\n", ierr,
234*91f16700Schasinglulu 		ras_ierr_to_str(blkid, ierr));
235*91f16700Schasinglulu 	ERROR("\tArchitecturally defined primary error code = 0x%x\n",
236*91f16700Schasinglulu 		serr);
237*91f16700Schasinglulu 	ERROR("**************************************\n");
238*91f16700Schasinglulu 
239*91f16700Schasinglulu 	/* Clear FMU_ERR<M>STATUS */
240*91f16700Schasinglulu 	gic_fmu_write_errstatus(base, probe_data, errstatus);
241*91f16700Schasinglulu 
242*91f16700Schasinglulu 	return 0;
243*91f16700Schasinglulu }
244*91f16700Schasinglulu 
245*91f16700Schasinglulu /*
246*91f16700Schasinglulu  * Initialization sequence for the FMU
247*91f16700Schasinglulu  *
248*91f16700Schasinglulu  * 1. enable error detection for error records that are passed in the blk_present_mask
249*91f16700Schasinglulu  * 2. enable MBIST REQ and FMU Clk Gate override safety mechanisms for error records
250*91f16700Schasinglulu  *    that are present on the platform
251*91f16700Schasinglulu  *
252*91f16700Schasinglulu  * The platforms are expected to pass `errctlr_ce_en` and `errctlr_ue_en`.
253*91f16700Schasinglulu  */
254*91f16700Schasinglulu void gic600_fmu_init(uint64_t base, uint64_t blk_present_mask,
255*91f16700Schasinglulu 		     bool errctlr_ce_en, bool errctlr_ue_en)
256*91f16700Schasinglulu {
257*91f16700Schasinglulu 	unsigned int num_blk = gic_fmu_read_erridr(base) & FMU_ERRIDR_NUM_MASK;
258*91f16700Schasinglulu 	uint64_t errctlr;
259*91f16700Schasinglulu 	uint32_t smen;
260*91f16700Schasinglulu 
261*91f16700Schasinglulu 	INFO("GIC600-AE FMU supports %d error records\n", num_blk);
262*91f16700Schasinglulu 
263*91f16700Schasinglulu 	assert(num_blk == FMU_ERRIDR_NUM);
264*91f16700Schasinglulu 
265*91f16700Schasinglulu 	/* sanitize block present mask */
266*91f16700Schasinglulu 	blk_present_mask &= FMU_BLK_PRESENT_MASK;
267*91f16700Schasinglulu 
268*91f16700Schasinglulu 	/* Enable error detection for all error records */
269*91f16700Schasinglulu 	for (unsigned int i = 0U; i < num_blk; i++) {
270*91f16700Schasinglulu 
271*91f16700Schasinglulu 		/*
272*91f16700Schasinglulu 		 * Disable all safety mechanisms for blocks that are not
273*91f16700Schasinglulu 		 * present and skip the next steps.
274*91f16700Schasinglulu 		 */
275*91f16700Schasinglulu 		if ((blk_present_mask & BIT(i)) == 0U) {
276*91f16700Schasinglulu 			gic_fmu_disable_all_sm_blkid(base, i);
277*91f16700Schasinglulu 			continue;
278*91f16700Schasinglulu 		}
279*91f16700Schasinglulu 
280*91f16700Schasinglulu 		/* Read the error record control register */
281*91f16700Schasinglulu 		errctlr = gic_fmu_read_errctlr(base, i);
282*91f16700Schasinglulu 
283*91f16700Schasinglulu 		/* Enable error reporting and logging, if it is disabled */
284*91f16700Schasinglulu 		if ((errctlr & FMU_ERRCTLR_ED_BIT) == 0U) {
285*91f16700Schasinglulu 			errctlr |= FMU_ERRCTLR_ED_BIT;
286*91f16700Schasinglulu 		}
287*91f16700Schasinglulu 
288*91f16700Schasinglulu 		/* Enable client provided ERRCTLR settings */
289*91f16700Schasinglulu 		errctlr |= (errctlr_ce_en ? (FMU_ERRCTLR_CI_BIT | FMU_ERRCTLR_CE_EN_BIT) : 0);
290*91f16700Schasinglulu 		errctlr |= (errctlr_ue_en ? FMU_ERRCTLR_UI_BIT : 0U);
291*91f16700Schasinglulu 
292*91f16700Schasinglulu 		gic_fmu_write_errctlr(base, i, errctlr);
293*91f16700Schasinglulu 	}
294*91f16700Schasinglulu 
295*91f16700Schasinglulu 	/*
296*91f16700Schasinglulu 	 * Enable MBIST REQ error and FMU CLK gate override safety mechanisms for
297*91f16700Schasinglulu 	 * all blocks
298*91f16700Schasinglulu 	 *
299*91f16700Schasinglulu 	 * GICD, SMID 23 and SMID 33
300*91f16700Schasinglulu 	 * PPI, SMID 10 and SMID 12
301*91f16700Schasinglulu 	 * ITS, SMID 13 and SMID 14
302*91f16700Schasinglulu 	 */
303*91f16700Schasinglulu 	if ((blk_present_mask & BIT(FMU_BLK_GICD)) != 0U) {
304*91f16700Schasinglulu 		smen = (GICD_MBIST_REQ_ERROR << FMU_SMEN_SMID_SHIFT) |
305*91f16700Schasinglulu 			(FMU_BLK_GICD << FMU_SMEN_BLK_SHIFT) |
306*91f16700Schasinglulu 			FMU_SMEN_EN_BIT;
307*91f16700Schasinglulu 		gic_fmu_write_smen(base, smen);
308*91f16700Schasinglulu 
309*91f16700Schasinglulu 		smen = (GICD_FMU_CLKGATE_ERROR << FMU_SMEN_SMID_SHIFT) |
310*91f16700Schasinglulu 			(FMU_BLK_GICD << FMU_SMEN_BLK_SHIFT) |
311*91f16700Schasinglulu 			FMU_SMEN_EN_BIT;
312*91f16700Schasinglulu 		gic_fmu_write_smen(base, smen);
313*91f16700Schasinglulu 	}
314*91f16700Schasinglulu 
315*91f16700Schasinglulu 	for (unsigned int i = FMU_BLK_PPI0; i < FMU_BLK_PPI31; i++) {
316*91f16700Schasinglulu 		if ((blk_present_mask & BIT(i)) != 0U) {
317*91f16700Schasinglulu 			smen = (PPI_MBIST_REQ_ERROR << FMU_SMEN_SMID_SHIFT) |
318*91f16700Schasinglulu 				(i << FMU_SMEN_BLK_SHIFT) |
319*91f16700Schasinglulu 				FMU_SMEN_EN_BIT;
320*91f16700Schasinglulu 			gic_fmu_write_smen(base, smen);
321*91f16700Schasinglulu 
322*91f16700Schasinglulu 			smen = (PPI_FMU_CLKGATE_ERROR << FMU_SMEN_SMID_SHIFT) |
323*91f16700Schasinglulu 				(i << FMU_SMEN_BLK_SHIFT) |
324*91f16700Schasinglulu 				FMU_SMEN_EN_BIT;
325*91f16700Schasinglulu 			gic_fmu_write_smen(base, smen);
326*91f16700Schasinglulu 		}
327*91f16700Schasinglulu 	}
328*91f16700Schasinglulu 
329*91f16700Schasinglulu 	for (unsigned int i = FMU_BLK_ITS0; i < FMU_BLK_ITS7; i++) {
330*91f16700Schasinglulu 		if ((blk_present_mask & BIT(i)) != 0U) {
331*91f16700Schasinglulu 			smen = (ITS_MBIST_REQ_ERROR << FMU_SMEN_SMID_SHIFT) |
332*91f16700Schasinglulu 				(i << FMU_SMEN_BLK_SHIFT) |
333*91f16700Schasinglulu 				FMU_SMEN_EN_BIT;
334*91f16700Schasinglulu 			gic_fmu_write_smen(base, smen);
335*91f16700Schasinglulu 
336*91f16700Schasinglulu 			smen = (ITS_FMU_CLKGATE_ERROR << FMU_SMEN_SMID_SHIFT) |
337*91f16700Schasinglulu 				(i << FMU_SMEN_BLK_SHIFT) |
338*91f16700Schasinglulu 				FMU_SMEN_EN_BIT;
339*91f16700Schasinglulu 			gic_fmu_write_smen(base, smen);
340*91f16700Schasinglulu 		}
341*91f16700Schasinglulu 	}
342*91f16700Schasinglulu }
343*91f16700Schasinglulu 
344*91f16700Schasinglulu /*
345*91f16700Schasinglulu  * This function enable the GICD background ping engine. The GICD sends ping
346*91f16700Schasinglulu  * messages to each remote GIC block, and expects a PING_ACK back within the
347*91f16700Schasinglulu  * specified timeout. Pings need to be enabled after programming the timeout
348*91f16700Schasinglulu  * value.
349*91f16700Schasinglulu  */
350*91f16700Schasinglulu void gic600_fmu_enable_ping(uint64_t base, uint64_t blk_present_mask,
351*91f16700Schasinglulu 		unsigned int timeout_val, unsigned int interval_diff)
352*91f16700Schasinglulu {
353*91f16700Schasinglulu 	/*
354*91f16700Schasinglulu 	 * Populate the PING Mask to skip a specific block while generating
355*91f16700Schasinglulu 	 * background ping messages and enable the ping mechanism.
356*91f16700Schasinglulu 	 */
357*91f16700Schasinglulu 	gic_fmu_write_pingmask(base, ~blk_present_mask);
358*91f16700Schasinglulu 	gic_fmu_write_pingctlr(base, (interval_diff << FMU_PINGCTLR_INTDIFF_SHIFT) |
359*91f16700Schasinglulu 		(timeout_val << FMU_PINGCTLR_TIMEOUTVAL_SHIFT) | FMU_PINGCTLR_EN_BIT);
360*91f16700Schasinglulu }
361*91f16700Schasinglulu 
362*91f16700Schasinglulu /* Print the safety mechanism description for a given block */
363*91f16700Schasinglulu void gic600_fmu_print_sm_info(uint64_t base, unsigned int blk, unsigned int smid)
364*91f16700Schasinglulu {
365*91f16700Schasinglulu 	if (blk == FMU_BLK_GICD && smid <= FMU_SMID_GICD_MAX) {
366*91f16700Schasinglulu 		INFO("GICD, SMID %d: %s\n", smid, gicd_sm_info[smid]);
367*91f16700Schasinglulu 	}
368*91f16700Schasinglulu 
369*91f16700Schasinglulu 	if (blk == FMU_BLK_SPICOL && smid <= FMU_SMID_SPICOL_MAX) {
370*91f16700Schasinglulu 		INFO("SPI Collator, SMID %d: %s\n", smid, spicol_sm_info[smid]);
371*91f16700Schasinglulu 	}
372*91f16700Schasinglulu 
373*91f16700Schasinglulu 	if (blk == FMU_BLK_WAKERQ && (smid <= FMU_SMID_WAKERQ_MAX)) {
374*91f16700Schasinglulu 		INFO("Wake Request, SMID %d: %s\n", smid, wkrqst_sm_info[smid]);
375*91f16700Schasinglulu 	}
376*91f16700Schasinglulu 
377*91f16700Schasinglulu 	if (((blk >= FMU_BLK_ITS0) && (blk <= FMU_BLK_ITS7)) && (smid <= FMU_SMID_ITS_MAX)) {
378*91f16700Schasinglulu 		INFO("ITS, SMID %d: %s\n", smid, its_sm_info[smid]);
379*91f16700Schasinglulu 	}
380*91f16700Schasinglulu 
381*91f16700Schasinglulu 	if (((blk >= FMU_BLK_PPI0) && (blk <= FMU_BLK_PPI31)) && (smid <= FMU_SMID_PPI_MAX)) {
382*91f16700Schasinglulu 		INFO("PPI, SMID %d: %s\n", smid, ppi_sm_info[smid]);
383*91f16700Schasinglulu 	}
384*91f16700Schasinglulu }
385