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