130d81c36SJeenu Viswambharan /* 230d81c36SJeenu Viswambharan * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. 330d81c36SJeenu Viswambharan * 430d81c36SJeenu Viswambharan * SPDX-License-Identifier: BSD-3-Clause 530d81c36SJeenu Viswambharan */ 630d81c36SJeenu Viswambharan 7b56dc2a9SJeenu Viswambharan #ifndef RAS_ARCH_H 8b56dc2a9SJeenu Viswambharan #define RAS_ARCH_H 930d81c36SJeenu Viswambharan 1030d81c36SJeenu Viswambharan /* 1130d81c36SJeenu Viswambharan * Size of nodes implementing Standard Error Records - currently only 4k is 1230d81c36SJeenu Viswambharan * supported. 1330d81c36SJeenu Viswambharan */ 1430a8d96eSJeenu Viswambharan #define STD_ERR_NODE_SIZE_NUM_K 4U 1530d81c36SJeenu Viswambharan 1630d81c36SJeenu Viswambharan /* 1730d81c36SJeenu Viswambharan * Individual register offsets within an error record in Standard Error Record 1830d81c36SJeenu Viswambharan * format when error records are accessed through memory-mapped registers. 1930d81c36SJeenu Viswambharan */ 2030a8d96eSJeenu Viswambharan #define ERR_FR(n) (0x0ULL + (64ULL * (n))) 2130a8d96eSJeenu Viswambharan #define ERR_CTLR(n) (0x8ULL + (64ULL * (n))) 2230a8d96eSJeenu Viswambharan #define ERR_STATUS(n) (0x10ULL + (64ULL * (n))) 2330a8d96eSJeenu Viswambharan #define ERR_ADDR(n) (0x18ULL + (64ULL * (n))) 2430a8d96eSJeenu Viswambharan #define ERR_MISC0(n) (0x20ULL + (64ULL * (n))) 2530a8d96eSJeenu Viswambharan #define ERR_MISC1(n) (0x28ULL + (64ULL * (n))) 2630d81c36SJeenu Viswambharan 2730d81c36SJeenu Viswambharan /* Group Status Register (ERR_STATUS) offset */ 2830d81c36SJeenu Viswambharan #define ERR_GSR(base, size_num_k, n) \ 2930a8d96eSJeenu Viswambharan ((base) + (0x380ULL * (size_num_k)) + (8ULL * (n))) 3030d81c36SJeenu Viswambharan 3130d81c36SJeenu Viswambharan /* Management register offsets */ 3230d81c36SJeenu Viswambharan #define ERR_DEVID(base, size_num_k) \ 3330a8d96eSJeenu Viswambharan ((base) + ((0x400ULL * (size_num_k)) - 0x100ULL) + 0xc8ULL) 3430d81c36SJeenu Viswambharan 3530a8d96eSJeenu Viswambharan #define ERR_DEVID_MASK 0xffffUL 3630d81c36SJeenu Viswambharan 3730d81c36SJeenu Viswambharan /* Standard Error Record status register fields */ 3830d81c36SJeenu Viswambharan #define ERR_STATUS_AV_SHIFT 31 3930d81c36SJeenu Viswambharan #define ERR_STATUS_AV_MASK U(0x1) 4030d81c36SJeenu Viswambharan 4130d81c36SJeenu Viswambharan #define ERR_STATUS_V_SHIFT 30 4230d81c36SJeenu Viswambharan #define ERR_STATUS_V_MASK U(0x1) 4330d81c36SJeenu Viswambharan 4430d81c36SJeenu Viswambharan #define ERR_STATUS_UE_SHIFT 29 4530d81c36SJeenu Viswambharan #define ERR_STATUS_UE_MASK U(0x1) 4630d81c36SJeenu Viswambharan 4730d81c36SJeenu Viswambharan #define ERR_STATUS_ER_SHIFT 28 4830d81c36SJeenu Viswambharan #define ERR_STATUS_ER_MASK U(0x1) 4930d81c36SJeenu Viswambharan 5030d81c36SJeenu Viswambharan #define ERR_STATUS_OF_SHIFT 27 5130d81c36SJeenu Viswambharan #define ERR_STATUS_OF_MASK U(0x1) 5230d81c36SJeenu Viswambharan 5330d81c36SJeenu Viswambharan #define ERR_STATUS_MV_SHIFT 26 5430d81c36SJeenu Viswambharan #define ERR_STATUS_MV_MASK U(0x1) 5530d81c36SJeenu Viswambharan 5630d81c36SJeenu Viswambharan #define ERR_STATUS_CE_SHIFT 24 5730d81c36SJeenu Viswambharan #define ERR_STATUS_CE_MASK U(0x3) 5830d81c36SJeenu Viswambharan 5930d81c36SJeenu Viswambharan #define ERR_STATUS_DE_SHIFT 23 6030d81c36SJeenu Viswambharan #define ERR_STATUS_DE_MASK U(0x1) 6130d81c36SJeenu Viswambharan 6230d81c36SJeenu Viswambharan #define ERR_STATUS_PN_SHIFT 22 6330d81c36SJeenu Viswambharan #define ERR_STATUS_PN_MASK U(0x1) 6430d81c36SJeenu Viswambharan 6530d81c36SJeenu Viswambharan #define ERR_STATUS_UET_SHIFT 20 6630d81c36SJeenu Viswambharan #define ERR_STATUS_UET_MASK U(0x3) 6730d81c36SJeenu Viswambharan 6830d81c36SJeenu Viswambharan #define ERR_STATUS_IERR_SHIFT 8 6930d81c36SJeenu Viswambharan #define ERR_STATUS_IERR_MASK U(0xff) 7030d81c36SJeenu Viswambharan 7130d81c36SJeenu Viswambharan #define ERR_STATUS_SERR_SHIFT 0 7230d81c36SJeenu Viswambharan #define ERR_STATUS_SERR_MASK U(0xff) 7330d81c36SJeenu Viswambharan 7430d81c36SJeenu Viswambharan #define ERR_STATUS_GET_FIELD(_status, _field) \ 7530d81c36SJeenu Viswambharan (((_status) >> ERR_STATUS_ ##_field ##_SHIFT) & ERR_STATUS_ ##_field ##_MASK) 7630d81c36SJeenu Viswambharan 7730d81c36SJeenu Viswambharan #define ERR_STATUS_CLR_FIELD(_status, _field) \ 7830d81c36SJeenu Viswambharan (_status) &= ~(ERR_STATUS_ ##_field ##_MASK << ERR_STATUS_ ##_field ##_SHIFT) 7930d81c36SJeenu Viswambharan 8030d81c36SJeenu Viswambharan #define ERR_STATUS_SET_FIELD(_status, _field, _value) \ 8130d81c36SJeenu Viswambharan (_status) |= (((_value) & ERR_STATUS_ ##_field ##_MASK) << ERR_STATUS_ ##_field ##_SHIFT) 8230d81c36SJeenu Viswambharan 8330d81c36SJeenu Viswambharan #define ERR_STATUS_WRITE_FIELD(_status, _field, _value) do { \ 8430d81c36SJeenu Viswambharan ERR_STATUS_CLR_FIELD(_status, _field, _value); \ 8530d81c36SJeenu Viswambharan ERR_STATUS_SET_FIELD(_status, _field, _value); \ 8630d81c36SJeenu Viswambharan } while (0) 8730d81c36SJeenu Viswambharan 8830d81c36SJeenu Viswambharan 8930d81c36SJeenu Viswambharan /* Standard Error Record control register fields */ 9030d81c36SJeenu Viswambharan #define ERR_CTLR_WDUI_SHIFT 11 9130d81c36SJeenu Viswambharan #define ERR_CTLR_WDUI_MASK 0x1 9230d81c36SJeenu Viswambharan 9330d81c36SJeenu Viswambharan #define ERR_CTLR_RDUI_SHIFT 10 9430d81c36SJeenu Viswambharan #define ERR_CTLR_RDUI_MASK 0x1 9530d81c36SJeenu Viswambharan #define ERR_CTLR_DUI_SHIFT ERR_CTLR_RDUI_SHIFT 9630d81c36SJeenu Viswambharan #define ERR_CTLR_DUI_MASK ERR_CTLR_RDUI_MASK 9730d81c36SJeenu Viswambharan 9830d81c36SJeenu Viswambharan #define ERR_CTLR_WCFI_SHIFT 9 9930d81c36SJeenu Viswambharan #define ERR_CTLR_WCFI_MASK 0x1 10030d81c36SJeenu Viswambharan 10130d81c36SJeenu Viswambharan #define ERR_CTLR_RCFI_SHIFT 8 10230d81c36SJeenu Viswambharan #define ERR_CTLR_RCFI_MASK 0x1 10330d81c36SJeenu Viswambharan #define ERR_CTLR_CFI_SHIFT ERR_CTLR_RCFI_SHIFT 10430d81c36SJeenu Viswambharan #define ERR_CTLR_CFI_MASK ERR_CTLR_RCFI_MASK 10530d81c36SJeenu Viswambharan 10630d81c36SJeenu Viswambharan #define ERR_CTLR_WUE_SHIFT 7 10730d81c36SJeenu Viswambharan #define ERR_CTLR_WUE_MASK 0x1 10830d81c36SJeenu Viswambharan 10930d81c36SJeenu Viswambharan #define ERR_CTLR_WFI_SHIFT 6 11030d81c36SJeenu Viswambharan #define ERR_CTLR_WFI_MASK 0x1 11130d81c36SJeenu Viswambharan 11230d81c36SJeenu Viswambharan #define ERR_CTLR_WUI_SHIFT 5 11330d81c36SJeenu Viswambharan #define ERR_CTLR_WUI_MASK 0x1 11430d81c36SJeenu Viswambharan 11530d81c36SJeenu Viswambharan #define ERR_CTLR_RUE_SHIFT 4 11630d81c36SJeenu Viswambharan #define ERR_CTLR_RUE_MASK 0x1 11730d81c36SJeenu Viswambharan #define ERR_CTLR_UE_SHIFT ERR_CTLR_RUE_SHIFT 11830d81c36SJeenu Viswambharan #define ERR_CTLR_UE_MASK ERR_CTLR_RUE_MASK 11930d81c36SJeenu Viswambharan 12030d81c36SJeenu Viswambharan #define ERR_CTLR_RFI_SHIFT 3 12130d81c36SJeenu Viswambharan #define ERR_CTLR_RFI_MASK 0x1 12230d81c36SJeenu Viswambharan #define ERR_CTLR_FI_SHIFT ERR_CTLR_RFI_SHIFT 12330d81c36SJeenu Viswambharan #define ERR_CTLR_FI_MASK ERR_CTLR_RFI_MASK 12430d81c36SJeenu Viswambharan 12530d81c36SJeenu Viswambharan #define ERR_CTLR_RUI_SHIFT 2 12630d81c36SJeenu Viswambharan #define ERR_CTLR_RUI_MASK 0x1 12730d81c36SJeenu Viswambharan #define ERR_CTLR_UI_SHIFT ERR_CTLR_RUI_SHIFT 12830d81c36SJeenu Viswambharan #define ERR_CTLR_UI_MASK ERR_CTLR_RUI_MASK 12930d81c36SJeenu Viswambharan 13030d81c36SJeenu Viswambharan #define ERR_CTLR_ED_SHIFT 0 13130d81c36SJeenu Viswambharan #define ERR_CTLR_ED_MASK 0x1 13230d81c36SJeenu Viswambharan 13330d81c36SJeenu Viswambharan #define ERR_CTLR_CLR_FIELD(_ctlr, _field) \ 13430d81c36SJeenu Viswambharan (_ctlr) &= ~(ERR_CTLR_ ##_field _MASK << ERR_CTLR_ ##_field ##_SHIFT) 13530d81c36SJeenu Viswambharan 13630d81c36SJeenu Viswambharan #define ERR_CTLR_SET_FIELD(_ctlr, _field, _value) \ 13730d81c36SJeenu Viswambharan (_ctlr) |= (((_value) & ERR_CTLR_ ##_field ##_MASK) << ERR_CTLR_ ##_field ##_SHIFT) 13830d81c36SJeenu Viswambharan 13930d81c36SJeenu Viswambharan #define ERR_CTLR_ENABLE_FIELD(_ctlr, _field) \ 14030d81c36SJeenu Viswambharan ERR_CTLR_SET_FIELD(_ctlr, _field, ERR_CTLR_ ##_field ##_MASK) 14130d81c36SJeenu Viswambharan 142b56dc2a9SJeenu Viswambharan /* Uncorrected error types for Asynchronous exceptions */ 14330d81c36SJeenu Viswambharan #define ERROR_STATUS_UET_UC 0x0 /* Uncontainable */ 14430d81c36SJeenu Viswambharan #define ERROR_STATUS_UET_UEU 0x1 /* Unrecoverable */ 14530d81c36SJeenu Viswambharan #define ERROR_STATUS_UET_UEO 0x2 /* Restable */ 14630d81c36SJeenu Viswambharan #define ERROR_STATUS_UET_UER 0x3 /* Recoverable */ 14730d81c36SJeenu Viswambharan 148b56dc2a9SJeenu Viswambharan /* Error types for Synchronous exceptions */ 149b56dc2a9SJeenu Viswambharan #define ERROR_STATUS_SET_UER 0x0 /* Recoverable */ 150b56dc2a9SJeenu Viswambharan #define ERROR_STATUS_SET_UEO 0x1 /* Restable */ 151b56dc2a9SJeenu Viswambharan #define ERROR_STATUS_SET_UC 0x2 /* Uncontainable */ 152b56dc2a9SJeenu Viswambharan #define ERROR_STATUS_SET_CE 0x3 /* Corrected */ 153b56dc2a9SJeenu Viswambharan 154b56dc2a9SJeenu Viswambharan /* Implementation Defined Syndrome bit in ESR */ 155b56dc2a9SJeenu Viswambharan #define SERROR_IDS_BIT U(24) 156b56dc2a9SJeenu Viswambharan 157b56dc2a9SJeenu Viswambharan /* 158b56dc2a9SJeenu Viswambharan * Asynchronous Error Type in exception syndrome. The field has same values in 159b56dc2a9SJeenu Viswambharan * both DISR_EL1 and ESR_EL3 for SError. 160b56dc2a9SJeenu Viswambharan */ 161b56dc2a9SJeenu Viswambharan #define EABORT_AET_SHIFT U(10) 162b56dc2a9SJeenu Viswambharan #define EABORT_AET_WIDTH U(3) 163b56dc2a9SJeenu Viswambharan #define EABORT_AET_MASK U(0x7) 164b56dc2a9SJeenu Viswambharan 165b56dc2a9SJeenu Viswambharan /* DFSC field in Asynchronous exception syndrome */ 166b56dc2a9SJeenu Viswambharan #define EABORT_DFSC_SHIFT U(0) 167b56dc2a9SJeenu Viswambharan #define EABORT_DFSC_WIDTH U(6) 168b56dc2a9SJeenu Viswambharan #define EABORT_DFSC_MASK U(0x3f) 169b56dc2a9SJeenu Viswambharan 170b56dc2a9SJeenu Viswambharan /* Synchronous Error Type in exception syndrome. */ 171b56dc2a9SJeenu Viswambharan #define EABORT_SET_SHIFT U(11) 172b56dc2a9SJeenu Viswambharan #define EABORT_SET_WIDTH U(2) 173b56dc2a9SJeenu Viswambharan #define EABORT_SET_MASK U(0x3) 174b56dc2a9SJeenu Viswambharan 175b56dc2a9SJeenu Viswambharan /* DFSC code for SErrors */ 176b56dc2a9SJeenu Viswambharan #define DFSC_SERROR 0x11 177b56dc2a9SJeenu Viswambharan 178b56dc2a9SJeenu Viswambharan /* I/DFSC code for synchronous external abort */ 179b56dc2a9SJeenu Viswambharan #define SYNC_EA_FSC 0x10 180b56dc2a9SJeenu Viswambharan 181b56dc2a9SJeenu Viswambharan #ifndef __ASSEMBLY__ 182b56dc2a9SJeenu Viswambharan 183b56dc2a9SJeenu Viswambharan #include <arch.h> 184b56dc2a9SJeenu Viswambharan #include <arch_helpers.h> 185b56dc2a9SJeenu Viswambharan #include <assert.h> 186b56dc2a9SJeenu Viswambharan #include <context.h> 187*09d40e0eSAntonio Nino Diaz #include <lib/mmio.h> 188b56dc2a9SJeenu Viswambharan #include <stdint.h> 18930d81c36SJeenu Viswambharan 19030d81c36SJeenu Viswambharan /* 19130d81c36SJeenu Viswambharan * Standard Error Record accessors for memory-mapped registers. 19230d81c36SJeenu Viswambharan */ 19330d81c36SJeenu Viswambharan 19430d81c36SJeenu Viswambharan static inline uint64_t ser_get_feature(uintptr_t base, unsigned int idx) 19530d81c36SJeenu Viswambharan { 19630d81c36SJeenu Viswambharan return mmio_read_64(base + ERR_FR(idx)); 19730d81c36SJeenu Viswambharan } 19830d81c36SJeenu Viswambharan 19930d81c36SJeenu Viswambharan static inline uint64_t ser_get_control(uintptr_t base, unsigned int idx) 20030d81c36SJeenu Viswambharan { 20130d81c36SJeenu Viswambharan return mmio_read_64(base + ERR_CTLR(idx)); 20230d81c36SJeenu Viswambharan } 20330d81c36SJeenu Viswambharan 20430d81c36SJeenu Viswambharan static inline uint64_t ser_get_status(uintptr_t base, unsigned int idx) 20530d81c36SJeenu Viswambharan { 20630d81c36SJeenu Viswambharan return mmio_read_64(base + ERR_STATUS(idx)); 20730d81c36SJeenu Viswambharan } 20830d81c36SJeenu Viswambharan 20930d81c36SJeenu Viswambharan /* 21030d81c36SJeenu Viswambharan * Error handling agent would write to the status register to clear an 21130d81c36SJeenu Viswambharan * identified/handled error. Most fields in the status register are 21230d81c36SJeenu Viswambharan * conditional write-one-to-clear. 21330d81c36SJeenu Viswambharan * 21430d81c36SJeenu Viswambharan * Typically, to clear the status, it suffices to write back the same value 21530d81c36SJeenu Viswambharan * previously read. However, if there were new, higher-priority errors recorded 21630d81c36SJeenu Viswambharan * on the node since status was last read, writing read value won't clear the 21730d81c36SJeenu Viswambharan * status. Therefore, an error handling agent must wait on and verify the status 21830d81c36SJeenu Viswambharan * has indeed been cleared. 21930d81c36SJeenu Viswambharan */ 22030d81c36SJeenu Viswambharan static inline void ser_set_status(uintptr_t base, unsigned int idx, 22130d81c36SJeenu Viswambharan uint64_t status) 22230d81c36SJeenu Viswambharan { 22330d81c36SJeenu Viswambharan mmio_write_64(base + ERR_STATUS(idx), status); 22430d81c36SJeenu Viswambharan } 22530d81c36SJeenu Viswambharan 22630d81c36SJeenu Viswambharan static inline uint64_t ser_get_addr(uintptr_t base, unsigned int idx) 22730d81c36SJeenu Viswambharan { 22830d81c36SJeenu Viswambharan return mmio_read_64(base + ERR_ADDR(idx)); 22930d81c36SJeenu Viswambharan } 23030d81c36SJeenu Viswambharan 23130d81c36SJeenu Viswambharan static inline uint64_t ser_get_misc0(uintptr_t base, unsigned int idx) 23230d81c36SJeenu Viswambharan { 23330d81c36SJeenu Viswambharan return mmio_read_64(base + ERR_MISC0(idx)); 23430d81c36SJeenu Viswambharan } 23530d81c36SJeenu Viswambharan 23630d81c36SJeenu Viswambharan static inline uint64_t ser_get_misc1(uintptr_t base, unsigned int idx) 23730d81c36SJeenu Viswambharan { 23830d81c36SJeenu Viswambharan return mmio_read_64(base + ERR_MISC1(idx)); 23930d81c36SJeenu Viswambharan } 24030d81c36SJeenu Viswambharan 24130d81c36SJeenu Viswambharan 24230d81c36SJeenu Viswambharan /* 24330d81c36SJeenu Viswambharan * Standard Error Record helpers for System registers. 24430d81c36SJeenu Viswambharan */ 24530d81c36SJeenu Viswambharan static inline void ser_sys_select_record(unsigned int idx) 24630d81c36SJeenu Viswambharan { 24730a8d96eSJeenu Viswambharan unsigned int max_idx __unused = 24830a8d96eSJeenu Viswambharan (unsigned int) read_erridr_el1() & ERRIDR_MASK; 24930d81c36SJeenu Viswambharan 25030d81c36SJeenu Viswambharan assert(idx < max_idx); 25130d81c36SJeenu Viswambharan 25230d81c36SJeenu Viswambharan write_errselr_el1(idx); 25330d81c36SJeenu Viswambharan isb(); 25430d81c36SJeenu Viswambharan } 25530d81c36SJeenu Viswambharan 25630d81c36SJeenu Viswambharan /* Library functions to probe Standard Error Record */ 25730d81c36SJeenu Viswambharan int ser_probe_memmap(uintptr_t base, unsigned int size_num_k, int *probe_data); 25830d81c36SJeenu Viswambharan int ser_probe_sysreg(unsigned int idx_start, unsigned int num_idx, int *probe_data); 259b56dc2a9SJeenu Viswambharan #endif /* __ASSEMBLY__ */ 26030d81c36SJeenu Viswambharan 261b56dc2a9SJeenu Viswambharan #endif /* RAS_ARCH_H */ 262