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 #ifndef GIC600AE_FMU_H 8*91f16700Schasinglulu #define GIC600AE_FMU_H 9*91f16700Schasinglulu 10*91f16700Schasinglulu /******************************************************************************* 11*91f16700Schasinglulu * GIC600-AE FMU register offsets and constants 12*91f16700Schasinglulu ******************************************************************************/ 13*91f16700Schasinglulu #define GICFMU_ERRFR_LO U(0x000) 14*91f16700Schasinglulu #define GICFMU_ERRFR_HI U(0x004) 15*91f16700Schasinglulu #define GICFMU_ERRCTLR_LO U(0x008) 16*91f16700Schasinglulu #define GICFMU_ERRCTLR_HI U(0x00C) 17*91f16700Schasinglulu #define GICFMU_ERRSTATUS_LO U(0x010) 18*91f16700Schasinglulu #define GICFMU_ERRSTATUS_HI U(0x014) 19*91f16700Schasinglulu #define GICFMU_ERRGSR_LO U(0xE00) 20*91f16700Schasinglulu #define GICFMU_ERRGSR_HI U(0xE04) 21*91f16700Schasinglulu #define GICFMU_KEY U(0xEA0) 22*91f16700Schasinglulu #define GICFMU_PINGCTLR U(0xEA4) 23*91f16700Schasinglulu #define GICFMU_PINGNOW U(0xEA8) 24*91f16700Schasinglulu #define GICFMU_SMEN U(0xEB0) 25*91f16700Schasinglulu #define GICFMU_SMINJERR U(0xEB4) 26*91f16700Schasinglulu #define GICFMU_PINGMASK_LO U(0xEC0) 27*91f16700Schasinglulu #define GICFMU_PINGMASK_HI U(0xEC4) 28*91f16700Schasinglulu #define GICFMU_STATUS U(0xF00) 29*91f16700Schasinglulu #define GICFMU_ERRIDR U(0xFC8) 30*91f16700Schasinglulu 31*91f16700Schasinglulu /* ERRCTLR bits */ 32*91f16700Schasinglulu #define FMU_ERRCTLR_ED_BIT BIT(0) 33*91f16700Schasinglulu #define FMU_ERRCTLR_CE_EN_BIT BIT(1) 34*91f16700Schasinglulu #define FMU_ERRCTLR_UI_BIT BIT(2) 35*91f16700Schasinglulu #define FMU_ERRCTLR_CI_BIT BIT(3) 36*91f16700Schasinglulu 37*91f16700Schasinglulu /* SMEN constants */ 38*91f16700Schasinglulu #define FMU_SMEN_BLK_SHIFT U(8) 39*91f16700Schasinglulu #define FMU_SMEN_SMID_SHIFT U(24) 40*91f16700Schasinglulu #define FMU_SMEN_EN_BIT BIT(0) 41*91f16700Schasinglulu 42*91f16700Schasinglulu /* Error record IDs */ 43*91f16700Schasinglulu #define FMU_BLK_GICD U(0) 44*91f16700Schasinglulu #define FMU_BLK_SPICOL U(1) 45*91f16700Schasinglulu #define FMU_BLK_WAKERQ U(2) 46*91f16700Schasinglulu #define FMU_BLK_ITS0 U(4) 47*91f16700Schasinglulu #define FMU_BLK_ITS1 U(5) 48*91f16700Schasinglulu #define FMU_BLK_ITS2 U(6) 49*91f16700Schasinglulu #define FMU_BLK_ITS3 U(7) 50*91f16700Schasinglulu #define FMU_BLK_ITS4 U(8) 51*91f16700Schasinglulu #define FMU_BLK_ITS5 U(9) 52*91f16700Schasinglulu #define FMU_BLK_ITS6 U(10) 53*91f16700Schasinglulu #define FMU_BLK_ITS7 U(11) 54*91f16700Schasinglulu #define FMU_BLK_PPI0 U(12) 55*91f16700Schasinglulu #define FMU_BLK_PPI1 U(13) 56*91f16700Schasinglulu #define FMU_BLK_PPI2 U(14) 57*91f16700Schasinglulu #define FMU_BLK_PPI3 U(15) 58*91f16700Schasinglulu #define FMU_BLK_PPI4 U(16) 59*91f16700Schasinglulu #define FMU_BLK_PPI5 U(17) 60*91f16700Schasinglulu #define FMU_BLK_PPI6 U(18) 61*91f16700Schasinglulu #define FMU_BLK_PPI7 U(19) 62*91f16700Schasinglulu #define FMU_BLK_PPI8 U(20) 63*91f16700Schasinglulu #define FMU_BLK_PPI9 U(21) 64*91f16700Schasinglulu #define FMU_BLK_PPI10 U(22) 65*91f16700Schasinglulu #define FMU_BLK_PPI11 U(23) 66*91f16700Schasinglulu #define FMU_BLK_PPI12 U(24) 67*91f16700Schasinglulu #define FMU_BLK_PPI13 U(25) 68*91f16700Schasinglulu #define FMU_BLK_PPI14 U(26) 69*91f16700Schasinglulu #define FMU_BLK_PPI15 U(27) 70*91f16700Schasinglulu #define FMU_BLK_PPI16 U(28) 71*91f16700Schasinglulu #define FMU_BLK_PPI17 U(29) 72*91f16700Schasinglulu #define FMU_BLK_PPI18 U(30) 73*91f16700Schasinglulu #define FMU_BLK_PPI19 U(31) 74*91f16700Schasinglulu #define FMU_BLK_PPI20 U(32) 75*91f16700Schasinglulu #define FMU_BLK_PPI21 U(33) 76*91f16700Schasinglulu #define FMU_BLK_PPI22 U(34) 77*91f16700Schasinglulu #define FMU_BLK_PPI23 U(35) 78*91f16700Schasinglulu #define FMU_BLK_PPI24 U(36) 79*91f16700Schasinglulu #define FMU_BLK_PPI25 U(37) 80*91f16700Schasinglulu #define FMU_BLK_PPI26 U(38) 81*91f16700Schasinglulu #define FMU_BLK_PPI27 U(39) 82*91f16700Schasinglulu #define FMU_BLK_PPI28 U(40) 83*91f16700Schasinglulu #define FMU_BLK_PPI29 U(41) 84*91f16700Schasinglulu #define FMU_BLK_PPI30 U(42) 85*91f16700Schasinglulu #define FMU_BLK_PPI31 U(43) 86*91f16700Schasinglulu #define FMU_BLK_PRESENT_MASK U(0xFFFFFFFFFFF) 87*91f16700Schasinglulu 88*91f16700Schasinglulu /* Safety Mechanism limit */ 89*91f16700Schasinglulu #define FMU_SMID_GICD_MAX U(33) 90*91f16700Schasinglulu #define FMU_SMID_PPI_MAX U(12) 91*91f16700Schasinglulu #define FMU_SMID_ITS_MAX U(14) 92*91f16700Schasinglulu #define FMU_SMID_SPICOL_MAX U(5) 93*91f16700Schasinglulu #define FMU_SMID_WAKERQ_MAX U(2) 94*91f16700Schasinglulu 95*91f16700Schasinglulu /* MBIST Safety Mechanism ID */ 96*91f16700Schasinglulu #define GICD_MBIST_REQ_ERROR U(23) 97*91f16700Schasinglulu #define GICD_FMU_CLKGATE_ERROR U(33) 98*91f16700Schasinglulu #define PPI_MBIST_REQ_ERROR U(10) 99*91f16700Schasinglulu #define PPI_FMU_CLKGATE_ERROR U(12) 100*91f16700Schasinglulu #define ITS_MBIST_REQ_ERROR U(13) 101*91f16700Schasinglulu #define ITS_FMU_CLKGATE_ERROR U(14) 102*91f16700Schasinglulu 103*91f16700Schasinglulu /* ERRSTATUS bits */ 104*91f16700Schasinglulu #define FMU_ERRSTATUS_BLKID_SHIFT U(32) 105*91f16700Schasinglulu #define FMU_ERRSTATUS_BLKID_MASK U(0xFF) 106*91f16700Schasinglulu #define FMU_ERRSTATUS_V_BIT BIT(30) 107*91f16700Schasinglulu #define FMU_ERRSTATUS_UE_BIT BIT(29) 108*91f16700Schasinglulu #define FMU_ERRSTATUS_OV_BIT BIT(27) 109*91f16700Schasinglulu #define FMU_ERRSTATUS_CE_BITS (BIT(25) | BIT(24)) 110*91f16700Schasinglulu #define FMU_ERRSTATUS_CLEAR (FMU_ERRSTATUS_V_BIT | FMU_ERRSTATUS_UE_BIT | \ 111*91f16700Schasinglulu FMU_ERRSTATUS_OV_BIT | FMU_ERRSTATUS_CE_BITS) 112*91f16700Schasinglulu #define FMU_ERRSTATUS_IERR_MASK U(0xFF) 113*91f16700Schasinglulu #define FMU_ERRSTATUS_IERR_SHIFT U(8) 114*91f16700Schasinglulu #define FMU_ERRSTATUS_SERR_MASK U(0xFF) 115*91f16700Schasinglulu 116*91f16700Schasinglulu /* PINGCTLR constants */ 117*91f16700Schasinglulu #define FMU_PINGCTLR_INTDIFF_SHIFT U(16) 118*91f16700Schasinglulu #define FMU_PINGCTLR_TIMEOUTVAL_SHIFT U(4) 119*91f16700Schasinglulu #define FMU_PINGCTLR_EN_BIT BIT(0) 120*91f16700Schasinglulu 121*91f16700Schasinglulu #ifndef __ASSEMBLER__ 122*91f16700Schasinglulu 123*91f16700Schasinglulu #include <stdint.h> 124*91f16700Schasinglulu 125*91f16700Schasinglulu #include <arch_helpers.h> 126*91f16700Schasinglulu 127*91f16700Schasinglulu /******************************************************************************* 128*91f16700Schasinglulu * GIC600 FMU EL3 driver API 129*91f16700Schasinglulu ******************************************************************************/ 130*91f16700Schasinglulu uint64_t gic_fmu_read_errfr(uintptr_t base, unsigned int n); 131*91f16700Schasinglulu uint64_t gic_fmu_read_errctlr(uintptr_t base, unsigned int n); 132*91f16700Schasinglulu uint64_t gic_fmu_read_errstatus(uintptr_t base, unsigned int n); 133*91f16700Schasinglulu uint64_t gic_fmu_read_errgsr(uintptr_t base); 134*91f16700Schasinglulu uint32_t gic_fmu_read_pingctlr(uintptr_t base); 135*91f16700Schasinglulu uint32_t gic_fmu_read_pingnow(uintptr_t base); 136*91f16700Schasinglulu uint64_t gic_fmu_read_pingmask(uintptr_t base); 137*91f16700Schasinglulu uint32_t gic_fmu_read_status(uintptr_t base); 138*91f16700Schasinglulu uint32_t gic_fmu_read_erridr(uintptr_t base); 139*91f16700Schasinglulu void gic_fmu_write_errctlr(uintptr_t base, unsigned int n, uint64_t val); 140*91f16700Schasinglulu void gic_fmu_write_errstatus(uintptr_t base, unsigned int n, uint64_t val); 141*91f16700Schasinglulu void gic_fmu_write_pingctlr(uintptr_t base, uint32_t val); 142*91f16700Schasinglulu void gic_fmu_write_pingnow(uintptr_t base, uint32_t val); 143*91f16700Schasinglulu void gic_fmu_write_smen(uintptr_t base, uint32_t val); 144*91f16700Schasinglulu void gic_fmu_write_sminjerr(uintptr_t base, uint32_t val); 145*91f16700Schasinglulu void gic_fmu_write_pingmask(uintptr_t base, uint64_t val); 146*91f16700Schasinglulu void gic_fmu_disable_all_sm_blkid(uintptr_t base, unsigned int blkid); 147*91f16700Schasinglulu 148*91f16700Schasinglulu void gic600_fmu_init(uint64_t base, uint64_t blk_present_mask, bool errctlr_ce_en, bool errctlr_ue_en); 149*91f16700Schasinglulu void gic600_fmu_enable_ping(uint64_t base, uint64_t blk_present_mask, 150*91f16700Schasinglulu unsigned int timeout_val, unsigned int interval_diff); 151*91f16700Schasinglulu void gic600_fmu_print_sm_info(uint64_t base, unsigned int blk, unsigned int smid); 152*91f16700Schasinglulu int gic600_fmu_probe(uint64_t base, int *probe_data); 153*91f16700Schasinglulu int gic600_fmu_ras_handler(uint64_t base, int probe_data); 154*91f16700Schasinglulu 155*91f16700Schasinglulu #endif /* __ASSEMBLER__ */ 156*91f16700Schasinglulu 157*91f16700Schasinglulu #endif /* GIC600AE_FMU_H */ 158