xref: /rk3399_ARM-atf/include/drivers/arm/gic600ae_fmu.h (revision 308dce40679f63db504cd3d746a0c37a2a05f473)
12c248adeSVarun Wadekar /*
22c248adeSVarun Wadekar  * Copyright (c) 2021, NVIDIA Corporation. All rights reserved.
32c248adeSVarun Wadekar  *
42c248adeSVarun Wadekar  * SPDX-License-Identifier: BSD-3-Clause
52c248adeSVarun Wadekar  */
62c248adeSVarun Wadekar 
72c248adeSVarun Wadekar #ifndef GIC600AE_FMU_H
82c248adeSVarun Wadekar #define GIC600AE_FMU_H
92c248adeSVarun Wadekar 
102c248adeSVarun Wadekar /*******************************************************************************
112c248adeSVarun Wadekar  * GIC600-AE FMU register offsets and constants
122c248adeSVarun Wadekar  ******************************************************************************/
132c248adeSVarun Wadekar #define GICFMU_ERRFR_LO		U(0x000)
142c248adeSVarun Wadekar #define GICFMU_ERRFR_HI		U(0x004)
152c248adeSVarun Wadekar #define GICFMU_ERRCTLR_LO	U(0x008)
162c248adeSVarun Wadekar #define GICFMU_ERRCTLR_HI	U(0x00C)
172c248adeSVarun Wadekar #define GICFMU_ERRSTATUS_LO	U(0x010)
182c248adeSVarun Wadekar #define GICFMU_ERRSTATUS_HI	U(0x014)
192c248adeSVarun Wadekar #define GICFMU_ERRGSR_LO	U(0xE00)
202c248adeSVarun Wadekar #define GICFMU_ERRGSR_HI	U(0xE04)
212c248adeSVarun Wadekar #define GICFMU_KEY		U(0xEA0)
222c248adeSVarun Wadekar #define GICFMU_PINGCTLR		U(0xEA4)
232c248adeSVarun Wadekar #define GICFMU_PINGNOW		U(0xEA8)
242c248adeSVarun Wadekar #define GICFMU_SMEN		U(0xEB0)
252c248adeSVarun Wadekar #define GICFMU_SMINJERR		U(0xEB4)
262c248adeSVarun Wadekar #define GICFMU_PINGMASK_LO	U(0xEC0)
272c248adeSVarun Wadekar #define GICFMU_PINGMASK_HI	U(0xEC4)
282c248adeSVarun Wadekar #define GICFMU_STATUS		U(0xF00)
292c248adeSVarun Wadekar #define GICFMU_ERRIDR		U(0xFC8)
302c248adeSVarun Wadekar 
312c248adeSVarun Wadekar /* ERRCTLR bits */
322c248adeSVarun Wadekar #define FMU_ERRCTLR_ED_BIT	BIT(0)
332c248adeSVarun Wadekar #define FMU_ERRCTLR_CE_EN_BIT	BIT(1)
342c248adeSVarun Wadekar #define FMU_ERRCTLR_UI_BIT	BIT(2)
352c248adeSVarun Wadekar #define FMU_ERRCTLR_CI_BIT	BIT(3)
362c248adeSVarun Wadekar 
372c248adeSVarun Wadekar /* SMEN constants */
382c248adeSVarun Wadekar #define FMU_SMEN_BLK_SHIFT	U(8)
392c248adeSVarun Wadekar #define FMU_SMEN_SMID_SHIFT	U(24)
402c248adeSVarun Wadekar 
412c248adeSVarun Wadekar /* Error record IDs */
422c248adeSVarun Wadekar #define FMU_BLK_GICD		U(0)
432c248adeSVarun Wadekar #define FMU_BLK_SPICOL		U(1)
442c248adeSVarun Wadekar #define FMU_BLK_WAKERQ		U(2)
452c248adeSVarun Wadekar #define FMU_BLK_ITS0		U(4)
462c248adeSVarun Wadekar #define FMU_BLK_ITS1		U(5)
472c248adeSVarun Wadekar #define FMU_BLK_ITS2		U(6)
482c248adeSVarun Wadekar #define FMU_BLK_ITS3		U(7)
492c248adeSVarun Wadekar #define FMU_BLK_ITS4		U(8)
502c248adeSVarun Wadekar #define FMU_BLK_ITS5		U(9)
512c248adeSVarun Wadekar #define FMU_BLK_ITS6		U(10)
522c248adeSVarun Wadekar #define FMU_BLK_ITS7		U(11)
532c248adeSVarun Wadekar #define FMU_BLK_PPI0		U(12)
542c248adeSVarun Wadekar #define FMU_BLK_PPI1		U(13)
552c248adeSVarun Wadekar #define FMU_BLK_PPI2		U(14)
562c248adeSVarun Wadekar #define FMU_BLK_PPI3		U(15)
572c248adeSVarun Wadekar #define FMU_BLK_PPI4		U(16)
582c248adeSVarun Wadekar #define FMU_BLK_PPI5		U(17)
592c248adeSVarun Wadekar #define FMU_BLK_PPI6		U(18)
602c248adeSVarun Wadekar #define FMU_BLK_PPI7		U(19)
612c248adeSVarun Wadekar #define FMU_BLK_PPI8		U(20)
622c248adeSVarun Wadekar #define FMU_BLK_PPI9		U(21)
632c248adeSVarun Wadekar #define FMU_BLK_PPI10		U(22)
642c248adeSVarun Wadekar #define FMU_BLK_PPI11		U(23)
652c248adeSVarun Wadekar #define FMU_BLK_PPI12		U(24)
662c248adeSVarun Wadekar #define FMU_BLK_PPI13		U(25)
672c248adeSVarun Wadekar #define FMU_BLK_PPI14		U(26)
682c248adeSVarun Wadekar #define FMU_BLK_PPI15		U(27)
692c248adeSVarun Wadekar #define FMU_BLK_PPI16		U(28)
702c248adeSVarun Wadekar #define FMU_BLK_PPI17		U(29)
712c248adeSVarun Wadekar #define FMU_BLK_PPI18		U(30)
722c248adeSVarun Wadekar #define FMU_BLK_PPI19		U(31)
732c248adeSVarun Wadekar #define FMU_BLK_PPI20		U(32)
742c248adeSVarun Wadekar #define FMU_BLK_PPI21		U(33)
752c248adeSVarun Wadekar #define FMU_BLK_PPI22		U(34)
762c248adeSVarun Wadekar #define FMU_BLK_PPI23		U(35)
772c248adeSVarun Wadekar #define FMU_BLK_PPI24		U(36)
782c248adeSVarun Wadekar #define FMU_BLK_PPI25		U(37)
792c248adeSVarun Wadekar #define FMU_BLK_PPI26		U(38)
802c248adeSVarun Wadekar #define FMU_BLK_PPI27		U(39)
812c248adeSVarun Wadekar #define FMU_BLK_PPI28		U(40)
822c248adeSVarun Wadekar #define FMU_BLK_PPI29		U(41)
832c248adeSVarun Wadekar #define FMU_BLK_PPI30		U(42)
842c248adeSVarun Wadekar #define FMU_BLK_PPI31		U(43)
852c248adeSVarun Wadekar #define FMU_BLK_PRESENT_MASK	U(0xFFFFFFFFFFF)
862c248adeSVarun Wadekar 
872c248adeSVarun Wadekar /* Safety Mechamism limit */
882c248adeSVarun Wadekar #define FMU_SMID_GICD_MAX	U(33)
892c248adeSVarun Wadekar #define FMU_SMID_SPICOL_MAX	U(5)
902c248adeSVarun Wadekar #define FMU_SMID_WAKERQ_MAX	U(2)
912c248adeSVarun Wadekar #define FMU_SMID_ITS_MAX	U(14)
922c248adeSVarun Wadekar #define FMU_SMID_PPI_MAX	U(12)
932c248adeSVarun Wadekar 
942c248adeSVarun Wadekar /* MBIST Safety Mechanism ID */
952c248adeSVarun Wadekar #define GICD_MBIST_REQ_ERROR	U(23)
962c248adeSVarun Wadekar #define GICD_FMU_CLKGATE_ERROR	U(33)
972c248adeSVarun Wadekar #define PPI_MBIST_REQ_ERROR	U(10)
982c248adeSVarun Wadekar #define PPI_FMU_CLKGATE_ERROR	U(12)
992c248adeSVarun Wadekar #define ITS_MBIST_REQ_ERROR	U(13)
1002c248adeSVarun Wadekar #define ITS_FMU_CLKGATE_ERROR	U(14)
1012c248adeSVarun Wadekar 
1022c248adeSVarun Wadekar /* ERRSTATUS bits */
103*308dce40SVarun Wadekar #define FMU_ERRSTATUS_BLKID_SHIFT	U(32)
104*308dce40SVarun Wadekar #define FMU_ERRSTATUS_BLKID_MASK	U(0xFF)
1052c248adeSVarun Wadekar #define FMU_ERRSTATUS_V_BIT		BIT(30)
1062c248adeSVarun Wadekar #define FMU_ERRSTATUS_UE_BIT		BIT(29)
1072c248adeSVarun Wadekar #define FMU_ERRSTATUS_OV_BIT		BIT(27)
1082c248adeSVarun Wadekar #define FMU_ERRSTATUS_CE_BITS		(BIT(25) | BIT(24))
1092c248adeSVarun Wadekar #define FMU_ERRSTATUS_CLEAR		(FMU_ERRSTATUS_V_BIT | FMU_ERRSTATUS_UE_BIT | \
1102c248adeSVarun Wadekar 					 FMU_ERRSTATUS_OV_BIT | FMU_ERRSTATUS_CE_BITS)
111*308dce40SVarun Wadekar #define FMU_ERRSTATUS_IERR_MASK		U(0xFF)
112*308dce40SVarun Wadekar #define FMU_ERRSTATUS_IERR_SHIFT	U(8)
113*308dce40SVarun Wadekar #define FMU_ERRSTATUS_SERR_MASK		U(0xFF)
1142c248adeSVarun Wadekar 
1152c248adeSVarun Wadekar /* PINGCTLR constants */
1162c248adeSVarun Wadekar #define FMU_PINGCTLR_INTDIFF_SHIFT	U(16)
1172c248adeSVarun Wadekar #define FMU_PINGCTLR_TIMEOUTVAL_SHIFT	U(4)
1182c248adeSVarun Wadekar #define FMU_PINGCTLR_EN_BIT		BIT(0)
1192c248adeSVarun Wadekar 
1202c248adeSVarun Wadekar #ifndef __ASSEMBLER__
1212c248adeSVarun Wadekar 
1222c248adeSVarun Wadekar #include <stdint.h>
1232c248adeSVarun Wadekar 
1242c248adeSVarun Wadekar #include <arch_helpers.h>
1252c248adeSVarun Wadekar 
1262c248adeSVarun Wadekar /*******************************************************************************
1272c248adeSVarun Wadekar  * GIC600 FMU EL3 driver API
1282c248adeSVarun Wadekar  ******************************************************************************/
1292c248adeSVarun Wadekar uint64_t gic_fmu_read_errfr(uintptr_t base, unsigned int n);
1302c248adeSVarun Wadekar uint64_t gic_fmu_read_errctlr(uintptr_t base, unsigned int n);
1312c248adeSVarun Wadekar uint64_t gic_fmu_read_errstatus(uintptr_t base, unsigned int n);
1322c248adeSVarun Wadekar uint64_t gic_fmu_read_errgsr(uintptr_t base);
1332c248adeSVarun Wadekar uint32_t gic_fmu_read_pingctlr(uintptr_t base);
1342c248adeSVarun Wadekar uint32_t gic_fmu_read_pingnow(uintptr_t base);
1352c248adeSVarun Wadekar uint64_t gic_fmu_read_pingmask(uintptr_t base);
1362c248adeSVarun Wadekar uint32_t gic_fmu_read_status(uintptr_t base);
1372c248adeSVarun Wadekar uint32_t gic_fmu_read_erridr(uintptr_t base);
1382c248adeSVarun Wadekar void gic_fmu_write_errctlr(uintptr_t base, unsigned int n, uint64_t val);
1392c248adeSVarun Wadekar void gic_fmu_write_errstatus(uintptr_t base, unsigned int n, uint64_t val);
1402c248adeSVarun Wadekar void gic_fmu_write_pingctlr(uintptr_t base, uint32_t val);
1412c248adeSVarun Wadekar void gic_fmu_write_pingnow(uintptr_t base, uint32_t val);
1422c248adeSVarun Wadekar void gic_fmu_write_smen(uintptr_t base, uint32_t val);
1432c248adeSVarun Wadekar void gic_fmu_write_sminjerr(uintptr_t base, uint32_t val);
1442c248adeSVarun Wadekar void gic_fmu_write_pingmask(uintptr_t base, uint64_t val);
1452c248adeSVarun Wadekar 
1462c248adeSVarun Wadekar void gic600_fmu_init(uint64_t base, uint64_t blk_present_mask, bool errctlr_ce_en, bool errctlr_ue_en);
1472c248adeSVarun Wadekar void gic600_fmu_enable_ping(uint64_t base, uint64_t blk_present_mask,
1482c248adeSVarun Wadekar 		unsigned int timeout_val, unsigned int interval_diff);
1492c248adeSVarun Wadekar void gic600_fmu_print_sm_info(uint64_t base, unsigned int blk, unsigned int smid);
150*308dce40SVarun Wadekar int gic600_fmu_probe(uint64_t base, int *probe_data);
151*308dce40SVarun Wadekar int gic600_fmu_ras_handler(uint64_t base, int probe_data);
1522c248adeSVarun Wadekar 
1532c248adeSVarun Wadekar #endif /* __ASSEMBLER__ */
1542c248adeSVarun Wadekar 
1552c248adeSVarun Wadekar #endif /* GIC600AE_FMU_H */
156