xref: /rk3399_ARM-atf/drivers/arm/gic/v3/gic600ae_fmu.c (revision 308dce40679f63db504cd3d746a0c37a2a05f473)
12c248adeSVarun Wadekar /*
2*308dce40SVarun Wadekar  * Copyright (c) 2021-2022, NVIDIA Corporation. All rights reserved.
32c248adeSVarun Wadekar  *
42c248adeSVarun Wadekar  * SPDX-License-Identifier: BSD-3-Clause
52c248adeSVarun Wadekar  */
62c248adeSVarun Wadekar 
72c248adeSVarun Wadekar /*
82c248adeSVarun Wadekar  * Driver for GIC-600AE Fault Management Unit
92c248adeSVarun Wadekar  */
102c248adeSVarun Wadekar 
112c248adeSVarun Wadekar #include <assert.h>
12*308dce40SVarun Wadekar #include <inttypes.h>
132c248adeSVarun Wadekar 
142c248adeSVarun Wadekar #include <arch_helpers.h>
152c248adeSVarun Wadekar #include <common/debug.h>
162c248adeSVarun Wadekar #include <drivers/arm/gic600ae_fmu.h>
172c248adeSVarun Wadekar #include <drivers/arm/gicv3.h>
182c248adeSVarun Wadekar 
192c248adeSVarun Wadekar /* GIC-600 AE FMU specific register offsets */
202c248adeSVarun Wadekar 
212c248adeSVarun Wadekar /* GIC-600 AE FMU specific macros */
222c248adeSVarun Wadekar #define FMU_ERRIDR_NUM			U(44)
232c248adeSVarun Wadekar #define FMU_ERRIDR_NUM_MASK		U(0xFFFF)
242c248adeSVarun Wadekar 
252c248adeSVarun Wadekar /* Safety mechanisms for GICD block */
262c248adeSVarun Wadekar static char *gicd_sm_info[] = {
272c248adeSVarun Wadekar 	"Reserved",
282c248adeSVarun Wadekar 	"GICD dual lockstep error",
292c248adeSVarun Wadekar 	"GICD AXI4 slave interface error",
302c248adeSVarun Wadekar 	"GICD-PPI AXI4-Stream interface error",
312c248adeSVarun Wadekar 	"GICD-ITS AXI4-Stream interface error",
322c248adeSVarun Wadekar 	"GICD-SPI-Collator AXI4-Stream interface error",
332c248adeSVarun Wadekar 	"GICD AXI4 master interface error",
342c248adeSVarun Wadekar 	"SPI RAM DED error",
352c248adeSVarun Wadekar 	"SGI RAM DED error",
362c248adeSVarun Wadekar 	"Reserved",
372c248adeSVarun Wadekar 	"LPI RAM DED error",
382c248adeSVarun Wadekar 	"GICD-remote-GICD AXI4-Stream interface error",
392c248adeSVarun Wadekar 	"GICD Q-Channel interface error",
402c248adeSVarun Wadekar 	"GICD P-Channel interface error",
412c248adeSVarun Wadekar 	"SPI RAM address decode error",
422c248adeSVarun Wadekar 	"SGI RAM address decode error",
432c248adeSVarun Wadekar 	"Reserved",
442c248adeSVarun Wadekar 	"LPI RAM address decode error",
452c248adeSVarun Wadekar 	"FMU dual lockstep error",
462c248adeSVarun Wadekar 	"FMU ping ACK error",
472c248adeSVarun Wadekar 	"FMU APB parity error",
482c248adeSVarun Wadekar 	"GICD-Wake AXI4-Stream interface error",
492c248adeSVarun Wadekar 	"GICD PageOffset or Chip ID error",
502c248adeSVarun Wadekar 	"MBIST REQ error",
512c248adeSVarun Wadekar 	"SPI RAM SEC error",
522c248adeSVarun Wadekar 	"SGI RAM SEC error",
532c248adeSVarun Wadekar 	"Reserved",
542c248adeSVarun Wadekar 	"LPI RAM SEC error",
552c248adeSVarun Wadekar 	"User custom SM0 error",
562c248adeSVarun Wadekar 	"User custom SM1 error",
572c248adeSVarun Wadekar 	"GICD-ITS Monolithic switch error",
582c248adeSVarun Wadekar 	"GICD-ITS Q-Channel interface error",
592c248adeSVarun Wadekar 	"GICD-ITS Monolithic interface error",
602c248adeSVarun Wadekar 	"GICD FMU ClkGate override"
612c248adeSVarun Wadekar };
622c248adeSVarun Wadekar 
632c248adeSVarun Wadekar /* Safety mechanisms for PPI block */
642c248adeSVarun Wadekar static char *ppi_sm_info[] = {
652c248adeSVarun Wadekar 	"Reserved",
662c248adeSVarun Wadekar 	"PPI dual lockstep error",
672c248adeSVarun Wadekar 	"PPI-GICD AXI4-Stream interface error",
682c248adeSVarun Wadekar 	"PPI-CPU-IF AXI4-Stream interface error",
692c248adeSVarun Wadekar 	"PPI Q-Channel interface error",
702c248adeSVarun Wadekar 	"PPI RAM DED error",
712c248adeSVarun Wadekar 	"PPI RAM address decode error",
722c248adeSVarun Wadekar 	"PPI RAM SEC error",
732c248adeSVarun Wadekar 	"PPI User0 SM",
742c248adeSVarun Wadekar 	"PPI User1 SM",
752c248adeSVarun Wadekar 	"MBIST REQ error",
762c248adeSVarun Wadekar 	"PPI interrupt parity protection error",
772c248adeSVarun Wadekar 	"PPI FMU ClkGate override"
782c248adeSVarun Wadekar };
792c248adeSVarun Wadekar 
802c248adeSVarun Wadekar /* Safety mechanisms for ITS block */
812c248adeSVarun Wadekar static char *its_sm_info[] = {
822c248adeSVarun Wadekar 	"Reserved",
832c248adeSVarun Wadekar 	"ITS dual lockstep error",
842c248adeSVarun Wadekar 	"ITS-GICD AXI4-Stream interface error",
852c248adeSVarun Wadekar 	"ITS AXI4 slave interface error",
862c248adeSVarun Wadekar 	"ITS AXI4 master interface error",
872c248adeSVarun Wadekar 	"ITS Q-Channel interface error",
882c248adeSVarun Wadekar 	"ITS RAM DED error",
892c248adeSVarun Wadekar 	"ITS RAM address decode error",
902c248adeSVarun Wadekar 	"Bypass ACE switch error",
912c248adeSVarun Wadekar 	"ITS RAM SEC error",
922c248adeSVarun Wadekar 	"ITS User0 SM",
932c248adeSVarun Wadekar 	"ITS User1 SM",
942c248adeSVarun Wadekar 	"ITS-GICD Monolithic interface error",
952c248adeSVarun Wadekar 	"MBIST REQ error",
962c248adeSVarun Wadekar 	"ITS FMU ClkGate override"
972c248adeSVarun Wadekar };
982c248adeSVarun Wadekar 
992c248adeSVarun Wadekar /* Safety mechanisms for SPI Collator block */
1002c248adeSVarun Wadekar static char *spicol_sm_info[] = {
1012c248adeSVarun Wadekar 	"Reserved",
1022c248adeSVarun Wadekar 	"SPI Collator dual lockstep error",
1032c248adeSVarun Wadekar 	"SPI-Collator-GICD AXI4-Stream interface error",
1042c248adeSVarun Wadekar 	"SPI Collator Q-Channel interface error",
1052c248adeSVarun Wadekar 	"SPI Collator Q-Channel clock error",
1062c248adeSVarun Wadekar 	"SPI interrupt parity error"
1072c248adeSVarun Wadekar };
1082c248adeSVarun Wadekar 
1092c248adeSVarun Wadekar /* Safety mechanisms for Wake Request block */
1102c248adeSVarun Wadekar static char *wkrqst_sm_info[] = {
1112c248adeSVarun Wadekar 	"Reserved",
1122c248adeSVarun Wadekar 	"Wake dual lockstep error",
1132c248adeSVarun Wadekar 	"Wake-GICD AXI4-Stream interface error"
1142c248adeSVarun Wadekar };
1152c248adeSVarun Wadekar 
116*308dce40SVarun Wadekar /* Helper function to find detailed information for a specific IERR */
117*308dce40SVarun Wadekar static char __unused *ras_ierr_to_str(unsigned int blkid, unsigned int ierr)
118*308dce40SVarun Wadekar {
119*308dce40SVarun Wadekar 	char *str = NULL;
120*308dce40SVarun Wadekar 
121*308dce40SVarun Wadekar 	/* Find the correct record */
122*308dce40SVarun Wadekar 	switch (blkid) {
123*308dce40SVarun Wadekar 	case FMU_BLK_GICD:
124*308dce40SVarun Wadekar 		assert(ierr < ARRAY_SIZE(gicd_sm_info));
125*308dce40SVarun Wadekar 		str = gicd_sm_info[ierr];
126*308dce40SVarun Wadekar 		break;
127*308dce40SVarun Wadekar 
128*308dce40SVarun Wadekar 	case FMU_BLK_SPICOL:
129*308dce40SVarun Wadekar 		assert(ierr < ARRAY_SIZE(spicol_sm_info));
130*308dce40SVarun Wadekar 		str = spicol_sm_info[ierr];
131*308dce40SVarun Wadekar 		break;
132*308dce40SVarun Wadekar 
133*308dce40SVarun Wadekar 	case FMU_BLK_WAKERQ:
134*308dce40SVarun Wadekar 		assert(ierr < ARRAY_SIZE(wkrqst_sm_info));
135*308dce40SVarun Wadekar 		str = wkrqst_sm_info[ierr];
136*308dce40SVarun Wadekar 		break;
137*308dce40SVarun Wadekar 
138*308dce40SVarun Wadekar 	case FMU_BLK_ITS0...FMU_BLK_ITS7:
139*308dce40SVarun Wadekar 		assert(ierr < ARRAY_SIZE(its_sm_info));
140*308dce40SVarun Wadekar 		str = its_sm_info[ierr];
141*308dce40SVarun Wadekar 		break;
142*308dce40SVarun Wadekar 
143*308dce40SVarun Wadekar 	case FMU_BLK_PPI0...FMU_BLK_PPI31:
144*308dce40SVarun Wadekar 		assert(ierr < ARRAY_SIZE(ppi_sm_info));
145*308dce40SVarun Wadekar 		str = ppi_sm_info[ierr];
146*308dce40SVarun Wadekar 		break;
147*308dce40SVarun Wadekar 
148*308dce40SVarun Wadekar 	default:
149*308dce40SVarun Wadekar 		assert(false);
150*308dce40SVarun Wadekar 		break;
151*308dce40SVarun Wadekar 	}
152*308dce40SVarun Wadekar 
153*308dce40SVarun Wadekar 	return str;
154*308dce40SVarun Wadekar }
155*308dce40SVarun Wadekar 
156*308dce40SVarun Wadekar /*
157*308dce40SVarun Wadekar  * Probe for error in memory-mapped registers containing error records.
158*308dce40SVarun Wadekar  * Upon detecting an error, set probe data to the index of the record
159*308dce40SVarun Wadekar  * in error, and return 1; otherwise, return 0.
160*308dce40SVarun Wadekar  */
161*308dce40SVarun Wadekar int gic600_fmu_probe(uint64_t base, int *probe_data)
162*308dce40SVarun Wadekar {
163*308dce40SVarun Wadekar 	uint64_t gsr;
164*308dce40SVarun Wadekar 
165*308dce40SVarun Wadekar 	assert(base != 0UL);
166*308dce40SVarun Wadekar 
167*308dce40SVarun Wadekar 	/*
168*308dce40SVarun Wadekar 	 * Read ERR_GSR to find the error record 'M'
169*308dce40SVarun Wadekar 	 */
170*308dce40SVarun Wadekar 	gsr = gic_fmu_read_errgsr(base);
171*308dce40SVarun Wadekar 	if (gsr == U(0)) {
172*308dce40SVarun Wadekar 		return 0;
173*308dce40SVarun Wadekar 	}
174*308dce40SVarun Wadekar 
175*308dce40SVarun Wadekar 	/* Return the index of the record in error */
176*308dce40SVarun Wadekar 	if (probe_data != NULL) {
177*308dce40SVarun Wadekar 		*probe_data = (int)__builtin_ctzll(gsr);
178*308dce40SVarun Wadekar 	}
179*308dce40SVarun Wadekar 
180*308dce40SVarun Wadekar 	return 1;
181*308dce40SVarun Wadekar }
182*308dce40SVarun Wadekar 
183*308dce40SVarun Wadekar /*
184*308dce40SVarun Wadekar  * The handler function to read RAS records and find the safety
185*308dce40SVarun Wadekar  * mechanism with the error.
186*308dce40SVarun Wadekar  */
187*308dce40SVarun Wadekar int gic600_fmu_ras_handler(uint64_t base, int probe_data)
188*308dce40SVarun Wadekar {
189*308dce40SVarun Wadekar 	uint64_t errstatus;
190*308dce40SVarun Wadekar 	unsigned int blkid = (unsigned int)probe_data, ierr, serr;
191*308dce40SVarun Wadekar 
192*308dce40SVarun Wadekar 	assert(base != 0UL);
193*308dce40SVarun Wadekar 
194*308dce40SVarun Wadekar 	/*
195*308dce40SVarun Wadekar 	 * FMU_ERRGSR indicates the ID of the GIC
196*308dce40SVarun Wadekar 	 * block that faulted.
197*308dce40SVarun Wadekar 	 */
198*308dce40SVarun Wadekar 	assert(blkid <= FMU_BLK_PPI31);
199*308dce40SVarun Wadekar 
200*308dce40SVarun Wadekar 	/*
201*308dce40SVarun Wadekar 	 * Find more information by reading FMU_ERR<M>STATUS
202*308dce40SVarun Wadekar 	 * register
203*308dce40SVarun Wadekar 	 */
204*308dce40SVarun Wadekar 	errstatus = gic_fmu_read_errstatus(base, blkid);
205*308dce40SVarun Wadekar 
206*308dce40SVarun Wadekar 	/*
207*308dce40SVarun Wadekar 	 * If FMU_ERR<M>STATUS.V is set to 0, no RAS records
208*308dce40SVarun Wadekar 	 * need to be scanned.
209*308dce40SVarun Wadekar 	 */
210*308dce40SVarun Wadekar 	if ((errstatus & FMU_ERRSTATUS_V_BIT) == U(0)) {
211*308dce40SVarun Wadekar 		return 0;
212*308dce40SVarun Wadekar 	}
213*308dce40SVarun Wadekar 
214*308dce40SVarun Wadekar 	/*
215*308dce40SVarun Wadekar 	 * FMU_ERR<M>STATUS.IERR indicates which Safety Mechanism
216*308dce40SVarun Wadekar 	 * reported the error.
217*308dce40SVarun Wadekar 	 */
218*308dce40SVarun Wadekar 	ierr = (errstatus >> FMU_ERRSTATUS_IERR_SHIFT) &
219*308dce40SVarun Wadekar 			FMU_ERRSTATUS_IERR_MASK;
220*308dce40SVarun Wadekar 
221*308dce40SVarun Wadekar 	/*
222*308dce40SVarun Wadekar 	 * FMU_ERR<M>STATUS.SERR indicates architecturally
223*308dce40SVarun Wadekar 	 * defined primary error code.
224*308dce40SVarun Wadekar 	 */
225*308dce40SVarun Wadekar 	serr = errstatus & FMU_ERRSTATUS_SERR_MASK;
226*308dce40SVarun Wadekar 
227*308dce40SVarun Wadekar 	ERROR("**************************************\n");
228*308dce40SVarun Wadekar 	ERROR("RAS %s Error detected by GIC600 AE FMU\n",
229*308dce40SVarun Wadekar 		((errstatus & FMU_ERRSTATUS_UE_BIT) != 0U) ?
230*308dce40SVarun Wadekar 			"Uncorrectable" : "Corrected");
231*308dce40SVarun Wadekar 	ERROR("\tStatus = 0x%lx \n", errstatus);
232*308dce40SVarun Wadekar 	ERROR("\tBlock ID = 0x%x\n", blkid);
233*308dce40SVarun Wadekar 	ERROR("\tSafety Mechanism ID = 0x%x (%s)\n", ierr,
234*308dce40SVarun Wadekar 		ras_ierr_to_str(blkid, ierr));
235*308dce40SVarun Wadekar 	ERROR("\tArchitecturally defined primary error code = 0x%x\n",
236*308dce40SVarun Wadekar 		serr);
237*308dce40SVarun Wadekar 	ERROR("**************************************\n");
238*308dce40SVarun Wadekar 
239*308dce40SVarun Wadekar 	/* Clear FMU_ERR<M>STATUS */
240*308dce40SVarun Wadekar 	gic_fmu_write_errstatus(base, probe_data, errstatus);
241*308dce40SVarun Wadekar 
242*308dce40SVarun Wadekar 	return 0;
243*308dce40SVarun Wadekar }
244*308dce40SVarun Wadekar 
2452c248adeSVarun Wadekar /*
2462c248adeSVarun Wadekar  * Initialization sequence for the FMU
2472c248adeSVarun Wadekar  *
2482c248adeSVarun Wadekar  * 1. enable error detection for error records that are passed in the blk_present_mask
2492c248adeSVarun Wadekar  * 2. enable MBIST REQ and FMU Clk Gate override safety mechanisms for error records
2502c248adeSVarun Wadekar  *    that are present on the platform
2512c248adeSVarun Wadekar  *
2522c248adeSVarun Wadekar  * The platforms are expected to pass `errctlr_ce_en` and `errctlr_ue_en`.
2532c248adeSVarun Wadekar  */
2542c248adeSVarun Wadekar void gic600_fmu_init(uint64_t base, uint64_t blk_present_mask,
2552c248adeSVarun Wadekar 		     bool errctlr_ce_en, bool errctlr_ue_en)
2562c248adeSVarun Wadekar {
2572c248adeSVarun Wadekar 	unsigned int num_blk = gic_fmu_read_erridr(base) & FMU_ERRIDR_NUM_MASK;
2582c248adeSVarun Wadekar 	uint64_t errctlr;
2592c248adeSVarun Wadekar 	uint32_t smen;
2602c248adeSVarun Wadekar 
2612c248adeSVarun Wadekar 	INFO("GIC600-AE FMU supports %d error records\n", num_blk);
2622c248adeSVarun Wadekar 
2632c248adeSVarun Wadekar 	assert(num_blk == FMU_ERRIDR_NUM);
2642c248adeSVarun Wadekar 
2652c248adeSVarun Wadekar 	/* sanitize block present mask */
2662c248adeSVarun Wadekar 	blk_present_mask &= FMU_BLK_PRESENT_MASK;
2672c248adeSVarun Wadekar 
2682c248adeSVarun Wadekar 	/* Enable error detection for all error records */
2692c248adeSVarun Wadekar 	for (unsigned int i = 0U; i < num_blk; i++) {
2702c248adeSVarun Wadekar 
2712c248adeSVarun Wadekar 		/* Skip next steps if the block is not present */
2722c248adeSVarun Wadekar 		if ((blk_present_mask & BIT(i)) == 0U) {
2732c248adeSVarun Wadekar 			continue;
2742c248adeSVarun Wadekar 		}
2752c248adeSVarun Wadekar 
2762c248adeSVarun Wadekar 		/* Read the error record control register */
2772c248adeSVarun Wadekar 		errctlr = gic_fmu_read_errctlr(base, i);
2782c248adeSVarun Wadekar 
2792c248adeSVarun Wadekar 		/* Enable error reporting and logging, if it is disabled */
2802c248adeSVarun Wadekar 		if ((errctlr & FMU_ERRCTLR_ED_BIT) == 0U) {
2812c248adeSVarun Wadekar 			errctlr |= FMU_ERRCTLR_ED_BIT;
2822c248adeSVarun Wadekar 		}
2832c248adeSVarun Wadekar 
2842c248adeSVarun Wadekar 		/* Enable client provided ERRCTLR settings */
2852c248adeSVarun Wadekar 		errctlr |= (errctlr_ce_en ? (FMU_ERRCTLR_CI_BIT | FMU_ERRCTLR_CE_EN_BIT) : 0);
2862c248adeSVarun Wadekar 		errctlr |= (errctlr_ue_en ? FMU_ERRCTLR_UI_BIT : 0U);
2872c248adeSVarun Wadekar 
2882c248adeSVarun Wadekar 		gic_fmu_write_errctlr(base, i, errctlr);
2892c248adeSVarun Wadekar 	}
2902c248adeSVarun Wadekar 
2912c248adeSVarun Wadekar 	/*
2922c248adeSVarun Wadekar 	 * Enable MBIST REQ error and FMU CLK gate override safety mechanisms for
2932c248adeSVarun Wadekar 	 * all blocks
2942c248adeSVarun Wadekar 	 *
2952c248adeSVarun Wadekar 	 * GICD, SMID 23 and SMID 33
2962c248adeSVarun Wadekar 	 * PPI, SMID 10 and SMID 12
2972c248adeSVarun Wadekar 	 * ITS, SMID 13 and SMID 14
2982c248adeSVarun Wadekar 	 */
2992c248adeSVarun Wadekar 	if ((blk_present_mask & BIT(FMU_BLK_GICD)) != 0U) {
3002c248adeSVarun Wadekar 		smen = (GICD_MBIST_REQ_ERROR << FMU_SMEN_SMID_SHIFT) |
3012c248adeSVarun Wadekar 			(FMU_BLK_GICD << FMU_SMEN_BLK_SHIFT);
3022c248adeSVarun Wadekar 		gic_fmu_write_smen(base, smen);
3032c248adeSVarun Wadekar 
3042c248adeSVarun Wadekar 		smen = (GICD_FMU_CLKGATE_ERROR << FMU_SMEN_SMID_SHIFT) |
3052c248adeSVarun Wadekar 			(FMU_BLK_GICD << FMU_SMEN_BLK_SHIFT);
3062c248adeSVarun Wadekar 		gic_fmu_write_smen(base, smen);
3072c248adeSVarun Wadekar 	}
3082c248adeSVarun Wadekar 
3092c248adeSVarun Wadekar 	for (unsigned int i = FMU_BLK_PPI0; i < FMU_BLK_PPI31; i++) {
3102c248adeSVarun Wadekar 		if ((blk_present_mask & BIT(i)) != 0U) {
3112c248adeSVarun Wadekar 			smen = (PPI_MBIST_REQ_ERROR << FMU_SMEN_SMID_SHIFT) |
3122c248adeSVarun Wadekar 				(i << FMU_SMEN_BLK_SHIFT);
3132c248adeSVarun Wadekar 			gic_fmu_write_smen(base, smen);
3142c248adeSVarun Wadekar 
3152c248adeSVarun Wadekar 			smen = (PPI_FMU_CLKGATE_ERROR << FMU_SMEN_SMID_SHIFT) |
3162c248adeSVarun Wadekar 				(i << FMU_SMEN_BLK_SHIFT);
3172c248adeSVarun Wadekar 			gic_fmu_write_smen(base, smen);
3182c248adeSVarun Wadekar 		}
3192c248adeSVarun Wadekar 	}
3202c248adeSVarun Wadekar 
3212c248adeSVarun Wadekar 	for (unsigned int i = FMU_BLK_ITS0; i < FMU_BLK_ITS7; i++) {
3222c248adeSVarun Wadekar 		if ((blk_present_mask & BIT(i)) != 0U) {
3232c248adeSVarun Wadekar 			smen = (ITS_MBIST_REQ_ERROR << FMU_SMEN_SMID_SHIFT) |
3242c248adeSVarun Wadekar 				(i << FMU_SMEN_BLK_SHIFT);
3252c248adeSVarun Wadekar 			gic_fmu_write_smen(base, smen);
3262c248adeSVarun Wadekar 
3272c248adeSVarun Wadekar 			smen = (ITS_FMU_CLKGATE_ERROR << FMU_SMEN_SMID_SHIFT) |
3282c248adeSVarun Wadekar 				(i << FMU_SMEN_BLK_SHIFT);
3292c248adeSVarun Wadekar 			gic_fmu_write_smen(base, smen);
3302c248adeSVarun Wadekar 		}
3312c248adeSVarun Wadekar 	}
3322c248adeSVarun Wadekar }
3332c248adeSVarun Wadekar 
3342c248adeSVarun Wadekar /*
3352c248adeSVarun Wadekar  * This function enable the GICD background ping engine. The GICD sends ping
3362c248adeSVarun Wadekar  * messages to each remote GIC block, and expects a PING_ACK back within the
3372c248adeSVarun Wadekar  * specified timeout. Pings need to be enabled after programming the timeout
3382c248adeSVarun Wadekar  * value.
3392c248adeSVarun Wadekar  */
3402c248adeSVarun Wadekar void gic600_fmu_enable_ping(uint64_t base, uint64_t blk_present_mask,
3412c248adeSVarun Wadekar 		unsigned int timeout_val, unsigned int interval_diff)
3422c248adeSVarun Wadekar {
3432c248adeSVarun Wadekar 	/*
3442c248adeSVarun Wadekar 	 * Populate the PING Mask to skip a specific block while generating
3452c248adeSVarun Wadekar 	 * background ping messages and enable the ping mechanism.
3462c248adeSVarun Wadekar 	 */
3472c248adeSVarun Wadekar 	gic_fmu_write_pingmask(base, ~blk_present_mask);
3482c248adeSVarun Wadekar 	gic_fmu_write_pingctlr(base, (interval_diff << FMU_PINGCTLR_INTDIFF_SHIFT) |
3492c248adeSVarun Wadekar 		(timeout_val << FMU_PINGCTLR_TIMEOUTVAL_SHIFT) | FMU_PINGCTLR_EN_BIT);
3502c248adeSVarun Wadekar }
3512c248adeSVarun Wadekar 
3522c248adeSVarun Wadekar /* Print the safety mechanism description for a given block */
3532c248adeSVarun Wadekar void gic600_fmu_print_sm_info(uint64_t base, unsigned int blk, unsigned int smid)
3542c248adeSVarun Wadekar {
3552c248adeSVarun Wadekar 	if (blk == FMU_BLK_GICD && smid <= FMU_SMID_GICD_MAX) {
3562c248adeSVarun Wadekar 		INFO("GICD, SMID %d: %s\n", smid, gicd_sm_info[smid]);
3572c248adeSVarun Wadekar 	}
3582c248adeSVarun Wadekar 
3592c248adeSVarun Wadekar 	if (blk == FMU_BLK_SPICOL && smid <= FMU_SMID_SPICOL_MAX) {
3602c248adeSVarun Wadekar 		INFO("SPI Collator, SMID %d: %s\n", smid, spicol_sm_info[smid]);
3612c248adeSVarun Wadekar 	}
3622c248adeSVarun Wadekar 
3632c248adeSVarun Wadekar 	if (blk == FMU_BLK_WAKERQ && (smid <= FMU_SMID_WAKERQ_MAX)) {
3642c248adeSVarun Wadekar 		INFO("Wake Request, SMID %d: %s\n", smid, wkrqst_sm_info[smid]);
3652c248adeSVarun Wadekar 	}
3662c248adeSVarun Wadekar 
3672c248adeSVarun Wadekar 	if (((blk >= FMU_BLK_ITS0) && (blk <= FMU_BLK_ITS7)) && (smid <= FMU_SMID_ITS_MAX)) {
3682c248adeSVarun Wadekar 		INFO("ITS, SMID %d: %s\n", smid, its_sm_info[smid]);
3692c248adeSVarun Wadekar 	}
3702c248adeSVarun Wadekar 
3712c248adeSVarun Wadekar 	if (((blk >= FMU_BLK_PPI0) && (blk <= FMU_BLK_PPI31)) && (smid <= FMU_SMID_PPI_MAX)) {
3722c248adeSVarun Wadekar 		INFO("PPI, SMID %d: %s\n", smid, ppi_sm_info[smid]);
3732c248adeSVarun Wadekar 	}
3742c248adeSVarun Wadekar }
375