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