xref: /arm-trusted-firmware/include/drivers/arm/gic600ae_fmu.h (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
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