12c248adeSVarun Wadekar /*
2308dce40SVarun 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>
12308dce40SVarun 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
116308dce40SVarun Wadekar /* Helper function to find detailed information for a specific IERR */
ras_ierr_to_str(unsigned int blkid,unsigned int ierr)117308dce40SVarun Wadekar static char __unused *ras_ierr_to_str(unsigned int blkid, unsigned int ierr)
118308dce40SVarun Wadekar {
119308dce40SVarun Wadekar char *str = NULL;
120308dce40SVarun Wadekar
121308dce40SVarun Wadekar /* Find the correct record */
122308dce40SVarun Wadekar switch (blkid) {
123308dce40SVarun Wadekar case FMU_BLK_GICD:
124308dce40SVarun Wadekar assert(ierr < ARRAY_SIZE(gicd_sm_info));
125308dce40SVarun Wadekar str = gicd_sm_info[ierr];
126308dce40SVarun Wadekar break;
127308dce40SVarun Wadekar
128308dce40SVarun Wadekar case FMU_BLK_SPICOL:
129308dce40SVarun Wadekar assert(ierr < ARRAY_SIZE(spicol_sm_info));
130308dce40SVarun Wadekar str = spicol_sm_info[ierr];
131308dce40SVarun Wadekar break;
132308dce40SVarun Wadekar
133308dce40SVarun Wadekar case FMU_BLK_WAKERQ:
134308dce40SVarun Wadekar assert(ierr < ARRAY_SIZE(wkrqst_sm_info));
135308dce40SVarun Wadekar str = wkrqst_sm_info[ierr];
136308dce40SVarun Wadekar break;
137308dce40SVarun Wadekar
138308dce40SVarun Wadekar case FMU_BLK_ITS0...FMU_BLK_ITS7:
139308dce40SVarun Wadekar assert(ierr < ARRAY_SIZE(its_sm_info));
140308dce40SVarun Wadekar str = its_sm_info[ierr];
141308dce40SVarun Wadekar break;
142308dce40SVarun Wadekar
143308dce40SVarun Wadekar case FMU_BLK_PPI0...FMU_BLK_PPI31:
144308dce40SVarun Wadekar assert(ierr < ARRAY_SIZE(ppi_sm_info));
145308dce40SVarun Wadekar str = ppi_sm_info[ierr];
146308dce40SVarun Wadekar break;
147308dce40SVarun Wadekar
148308dce40SVarun Wadekar default:
149308dce40SVarun Wadekar assert(false);
150308dce40SVarun Wadekar break;
151308dce40SVarun Wadekar }
152308dce40SVarun Wadekar
153308dce40SVarun Wadekar return str;
154308dce40SVarun Wadekar }
155308dce40SVarun Wadekar
156308dce40SVarun Wadekar /*
157308dce40SVarun Wadekar * Probe for error in memory-mapped registers containing error records.
158308dce40SVarun Wadekar * Upon detecting an error, set probe data to the index of the record
159308dce40SVarun Wadekar * in error, and return 1; otherwise, return 0.
160308dce40SVarun Wadekar */
gic600_fmu_probe(uint64_t base,int * probe_data)161308dce40SVarun Wadekar int gic600_fmu_probe(uint64_t base, int *probe_data)
162308dce40SVarun Wadekar {
163308dce40SVarun Wadekar uint64_t gsr;
164308dce40SVarun Wadekar
165308dce40SVarun Wadekar assert(base != 0UL);
166308dce40SVarun Wadekar
167308dce40SVarun Wadekar /*
168308dce40SVarun Wadekar * Read ERR_GSR to find the error record 'M'
169308dce40SVarun Wadekar */
170308dce40SVarun Wadekar gsr = gic_fmu_read_errgsr(base);
171308dce40SVarun Wadekar if (gsr == U(0)) {
172308dce40SVarun Wadekar return 0;
173308dce40SVarun Wadekar }
174308dce40SVarun Wadekar
175308dce40SVarun Wadekar /* Return the index of the record in error */
176308dce40SVarun Wadekar if (probe_data != NULL) {
177308dce40SVarun Wadekar *probe_data = (int)__builtin_ctzll(gsr);
178308dce40SVarun Wadekar }
179308dce40SVarun Wadekar
180308dce40SVarun Wadekar return 1;
181308dce40SVarun Wadekar }
182308dce40SVarun Wadekar
183308dce40SVarun Wadekar /*
184308dce40SVarun Wadekar * The handler function to read RAS records and find the safety
185308dce40SVarun Wadekar * mechanism with the error.
186308dce40SVarun Wadekar */
gic600_fmu_ras_handler(uint64_t base,int probe_data)187308dce40SVarun Wadekar int gic600_fmu_ras_handler(uint64_t base, int probe_data)
188308dce40SVarun Wadekar {
189308dce40SVarun Wadekar uint64_t errstatus;
190308dce40SVarun Wadekar unsigned int blkid = (unsigned int)probe_data, ierr, serr;
191308dce40SVarun Wadekar
192308dce40SVarun Wadekar assert(base != 0UL);
193308dce40SVarun Wadekar
194308dce40SVarun Wadekar /*
195308dce40SVarun Wadekar * FMU_ERRGSR indicates the ID of the GIC
196308dce40SVarun Wadekar * block that faulted.
197308dce40SVarun Wadekar */
198308dce40SVarun Wadekar assert(blkid <= FMU_BLK_PPI31);
199308dce40SVarun Wadekar
200308dce40SVarun Wadekar /*
201308dce40SVarun Wadekar * Find more information by reading FMU_ERR<M>STATUS
202308dce40SVarun Wadekar * register
203308dce40SVarun Wadekar */
204308dce40SVarun Wadekar errstatus = gic_fmu_read_errstatus(base, blkid);
205308dce40SVarun Wadekar
206308dce40SVarun Wadekar /*
207308dce40SVarun Wadekar * If FMU_ERR<M>STATUS.V is set to 0, no RAS records
208308dce40SVarun Wadekar * need to be scanned.
209308dce40SVarun Wadekar */
210308dce40SVarun Wadekar if ((errstatus & FMU_ERRSTATUS_V_BIT) == U(0)) {
211308dce40SVarun Wadekar return 0;
212308dce40SVarun Wadekar }
213308dce40SVarun Wadekar
214308dce40SVarun Wadekar /*
215308dce40SVarun Wadekar * FMU_ERR<M>STATUS.IERR indicates which Safety Mechanism
216308dce40SVarun Wadekar * reported the error.
217308dce40SVarun Wadekar */
218308dce40SVarun Wadekar ierr = (errstatus >> FMU_ERRSTATUS_IERR_SHIFT) &
219308dce40SVarun Wadekar FMU_ERRSTATUS_IERR_MASK;
220308dce40SVarun Wadekar
221308dce40SVarun Wadekar /*
222308dce40SVarun Wadekar * FMU_ERR<M>STATUS.SERR indicates architecturally
223308dce40SVarun Wadekar * defined primary error code.
224308dce40SVarun Wadekar */
225308dce40SVarun Wadekar serr = errstatus & FMU_ERRSTATUS_SERR_MASK;
226308dce40SVarun Wadekar
227308dce40SVarun Wadekar ERROR("**************************************\n");
228308dce40SVarun Wadekar ERROR("RAS %s Error detected by GIC600 AE FMU\n",
229308dce40SVarun Wadekar ((errstatus & FMU_ERRSTATUS_UE_BIT) != 0U) ?
230308dce40SVarun Wadekar "Uncorrectable" : "Corrected");
231308dce40SVarun Wadekar ERROR("\tStatus = 0x%lx \n", errstatus);
232308dce40SVarun Wadekar ERROR("\tBlock ID = 0x%x\n", blkid);
233308dce40SVarun Wadekar ERROR("\tSafety Mechanism ID = 0x%x (%s)\n", ierr,
234308dce40SVarun Wadekar ras_ierr_to_str(blkid, ierr));
235308dce40SVarun Wadekar ERROR("\tArchitecturally defined primary error code = 0x%x\n",
236308dce40SVarun Wadekar serr);
237308dce40SVarun Wadekar ERROR("**************************************\n");
238308dce40SVarun Wadekar
239308dce40SVarun Wadekar /* Clear FMU_ERR<M>STATUS */
240308dce40SVarun Wadekar gic_fmu_write_errstatus(base, probe_data, errstatus);
241308dce40SVarun Wadekar
242308dce40SVarun Wadekar return 0;
243308dce40SVarun Wadekar }
244308dce40SVarun 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 */
gic600_fmu_init(uint64_t base,uint64_t blk_present_mask,bool errctlr_ce_en,bool errctlr_ue_en)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
2713f0094c1SVarun Wadekar /*
2723f0094c1SVarun Wadekar * Disable all safety mechanisms for blocks that are not
2733f0094c1SVarun Wadekar * present and skip the next steps.
2743f0094c1SVarun Wadekar */
2752c248adeSVarun Wadekar if ((blk_present_mask & BIT(i)) == 0U) {
2763f0094c1SVarun Wadekar gic_fmu_disable_all_sm_blkid(base, i);
2772c248adeSVarun Wadekar continue;
2782c248adeSVarun Wadekar }
2792c248adeSVarun Wadekar
2802c248adeSVarun Wadekar /* Read the error record control register */
2812c248adeSVarun Wadekar errctlr = gic_fmu_read_errctlr(base, i);
2822c248adeSVarun Wadekar
2832c248adeSVarun Wadekar /* Enable error reporting and logging, if it is disabled */
2842c248adeSVarun Wadekar if ((errctlr & FMU_ERRCTLR_ED_BIT) == 0U) {
2852c248adeSVarun Wadekar errctlr |= FMU_ERRCTLR_ED_BIT;
2862c248adeSVarun Wadekar }
2872c248adeSVarun Wadekar
2882c248adeSVarun Wadekar /* Enable client provided ERRCTLR settings */
2892c248adeSVarun Wadekar errctlr |= (errctlr_ce_en ? (FMU_ERRCTLR_CI_BIT | FMU_ERRCTLR_CE_EN_BIT) : 0);
2902c248adeSVarun Wadekar errctlr |= (errctlr_ue_en ? FMU_ERRCTLR_UI_BIT : 0U);
2912c248adeSVarun Wadekar
2922c248adeSVarun Wadekar gic_fmu_write_errctlr(base, i, errctlr);
2932c248adeSVarun Wadekar }
2942c248adeSVarun Wadekar
2952c248adeSVarun Wadekar /*
2962c248adeSVarun Wadekar * Enable MBIST REQ error and FMU CLK gate override safety mechanisms for
2972c248adeSVarun Wadekar * all blocks
2982c248adeSVarun Wadekar *
2992c248adeSVarun Wadekar * GICD, SMID 23 and SMID 33
3002c248adeSVarun Wadekar * PPI, SMID 10 and SMID 12
3012c248adeSVarun Wadekar * ITS, SMID 13 and SMID 14
3022c248adeSVarun Wadekar */
3032c248adeSVarun Wadekar if ((blk_present_mask & BIT(FMU_BLK_GICD)) != 0U) {
3042c248adeSVarun Wadekar smen = (GICD_MBIST_REQ_ERROR << FMU_SMEN_SMID_SHIFT) |
305*6a1c17c7SVarun Wadekar (FMU_BLK_GICD << FMU_SMEN_BLK_SHIFT) |
306*6a1c17c7SVarun Wadekar FMU_SMEN_EN_BIT;
3072c248adeSVarun Wadekar gic_fmu_write_smen(base, smen);
3082c248adeSVarun Wadekar
3092c248adeSVarun Wadekar smen = (GICD_FMU_CLKGATE_ERROR << FMU_SMEN_SMID_SHIFT) |
310*6a1c17c7SVarun Wadekar (FMU_BLK_GICD << FMU_SMEN_BLK_SHIFT) |
311*6a1c17c7SVarun Wadekar FMU_SMEN_EN_BIT;
3122c248adeSVarun Wadekar gic_fmu_write_smen(base, smen);
3132c248adeSVarun Wadekar }
3142c248adeSVarun Wadekar
3152c248adeSVarun Wadekar for (unsigned int i = FMU_BLK_PPI0; i < FMU_BLK_PPI31; i++) {
3162c248adeSVarun Wadekar if ((blk_present_mask & BIT(i)) != 0U) {
3172c248adeSVarun Wadekar smen = (PPI_MBIST_REQ_ERROR << FMU_SMEN_SMID_SHIFT) |
318*6a1c17c7SVarun Wadekar (i << FMU_SMEN_BLK_SHIFT) |
319*6a1c17c7SVarun Wadekar FMU_SMEN_EN_BIT;
3202c248adeSVarun Wadekar gic_fmu_write_smen(base, smen);
3212c248adeSVarun Wadekar
3222c248adeSVarun Wadekar smen = (PPI_FMU_CLKGATE_ERROR << FMU_SMEN_SMID_SHIFT) |
323*6a1c17c7SVarun Wadekar (i << FMU_SMEN_BLK_SHIFT) |
324*6a1c17c7SVarun Wadekar FMU_SMEN_EN_BIT;
3252c248adeSVarun Wadekar gic_fmu_write_smen(base, smen);
3262c248adeSVarun Wadekar }
3272c248adeSVarun Wadekar }
3282c248adeSVarun Wadekar
3292c248adeSVarun Wadekar for (unsigned int i = FMU_BLK_ITS0; i < FMU_BLK_ITS7; i++) {
3302c248adeSVarun Wadekar if ((blk_present_mask & BIT(i)) != 0U) {
3312c248adeSVarun Wadekar smen = (ITS_MBIST_REQ_ERROR << FMU_SMEN_SMID_SHIFT) |
332*6a1c17c7SVarun Wadekar (i << FMU_SMEN_BLK_SHIFT) |
333*6a1c17c7SVarun Wadekar FMU_SMEN_EN_BIT;
3342c248adeSVarun Wadekar gic_fmu_write_smen(base, smen);
3352c248adeSVarun Wadekar
3362c248adeSVarun Wadekar smen = (ITS_FMU_CLKGATE_ERROR << FMU_SMEN_SMID_SHIFT) |
337*6a1c17c7SVarun Wadekar (i << FMU_SMEN_BLK_SHIFT) |
338*6a1c17c7SVarun Wadekar FMU_SMEN_EN_BIT;
3392c248adeSVarun Wadekar gic_fmu_write_smen(base, smen);
3402c248adeSVarun Wadekar }
3412c248adeSVarun Wadekar }
3422c248adeSVarun Wadekar }
3432c248adeSVarun Wadekar
3442c248adeSVarun Wadekar /*
3452c248adeSVarun Wadekar * This function enable the GICD background ping engine. The GICD sends ping
3462c248adeSVarun Wadekar * messages to each remote GIC block, and expects a PING_ACK back within the
3472c248adeSVarun Wadekar * specified timeout. Pings need to be enabled after programming the timeout
3482c248adeSVarun Wadekar * value.
3492c248adeSVarun Wadekar */
gic600_fmu_enable_ping(uint64_t base,uint64_t blk_present_mask,unsigned int timeout_val,unsigned int interval_diff)3502c248adeSVarun Wadekar void gic600_fmu_enable_ping(uint64_t base, uint64_t blk_present_mask,
3512c248adeSVarun Wadekar unsigned int timeout_val, unsigned int interval_diff)
3522c248adeSVarun Wadekar {
3532c248adeSVarun Wadekar /*
3542c248adeSVarun Wadekar * Populate the PING Mask to skip a specific block while generating
3552c248adeSVarun Wadekar * background ping messages and enable the ping mechanism.
3562c248adeSVarun Wadekar */
3572c248adeSVarun Wadekar gic_fmu_write_pingmask(base, ~blk_present_mask);
3582c248adeSVarun Wadekar gic_fmu_write_pingctlr(base, (interval_diff << FMU_PINGCTLR_INTDIFF_SHIFT) |
3592c248adeSVarun Wadekar (timeout_val << FMU_PINGCTLR_TIMEOUTVAL_SHIFT) | FMU_PINGCTLR_EN_BIT);
3602c248adeSVarun Wadekar }
3612c248adeSVarun Wadekar
3622c248adeSVarun Wadekar /* Print the safety mechanism description for a given block */
gic600_fmu_print_sm_info(uint64_t base,unsigned int blk,unsigned int smid)3632c248adeSVarun Wadekar void gic600_fmu_print_sm_info(uint64_t base, unsigned int blk, unsigned int smid)
3642c248adeSVarun Wadekar {
3652c248adeSVarun Wadekar if (blk == FMU_BLK_GICD && smid <= FMU_SMID_GICD_MAX) {
3662c248adeSVarun Wadekar INFO("GICD, SMID %d: %s\n", smid, gicd_sm_info[smid]);
3672c248adeSVarun Wadekar }
3682c248adeSVarun Wadekar
3692c248adeSVarun Wadekar if (blk == FMU_BLK_SPICOL && smid <= FMU_SMID_SPICOL_MAX) {
3702c248adeSVarun Wadekar INFO("SPI Collator, SMID %d: %s\n", smid, spicol_sm_info[smid]);
3712c248adeSVarun Wadekar }
3722c248adeSVarun Wadekar
3732c248adeSVarun Wadekar if (blk == FMU_BLK_WAKERQ && (smid <= FMU_SMID_WAKERQ_MAX)) {
3742c248adeSVarun Wadekar INFO("Wake Request, SMID %d: %s\n", smid, wkrqst_sm_info[smid]);
3752c248adeSVarun Wadekar }
3762c248adeSVarun Wadekar
3772c248adeSVarun Wadekar if (((blk >= FMU_BLK_ITS0) && (blk <= FMU_BLK_ITS7)) && (smid <= FMU_SMID_ITS_MAX)) {
3782c248adeSVarun Wadekar INFO("ITS, SMID %d: %s\n", smid, its_sm_info[smid]);
3792c248adeSVarun Wadekar }
3802c248adeSVarun Wadekar
3812c248adeSVarun Wadekar if (((blk >= FMU_BLK_PPI0) && (blk <= FMU_BLK_PPI31)) && (smid <= FMU_SMID_PPI_MAX)) {
3822c248adeSVarun Wadekar INFO("PPI, SMID %d: %s\n", smid, ppi_sm_info[smid]);
3832c248adeSVarun Wadekar }
3842c248adeSVarun Wadekar }
385