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