xref: /rk3399_ARM-atf/include/lib/extensions/ras_arch.h (revision 30a8d96e4689be30b2caeb23fd071fadd1ec87cd)
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  */
14*30a8d96eSJeenu 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  */
20*30a8d96eSJeenu Viswambharan #define ERR_FR(n)	(0x0ULL + (64ULL * (n)))
21*30a8d96eSJeenu Viswambharan #define ERR_CTLR(n)	(0x8ULL + (64ULL * (n)))
22*30a8d96eSJeenu Viswambharan #define ERR_STATUS(n)	(0x10ULL + (64ULL * (n)))
23*30a8d96eSJeenu Viswambharan #define ERR_ADDR(n)	(0x18ULL + (64ULL * (n)))
24*30a8d96eSJeenu Viswambharan #define ERR_MISC0(n)	(0x20ULL + (64ULL * (n)))
25*30a8d96eSJeenu 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) \
29*30a8d96eSJeenu Viswambharan 	((base) + (0x380ULL * (size_num_k)) + (8ULL * (n)))
3030d81c36SJeenu Viswambharan 
3130d81c36SJeenu Viswambharan /* Management register offsets */
3230d81c36SJeenu Viswambharan #define ERR_DEVID(base, size_num_k) \
33*30a8d96eSJeenu Viswambharan 	((base) + ((0x400ULL * (size_num_k)) - 0x100ULL) + 0xc8ULL)
3430d81c36SJeenu Viswambharan 
35*30a8d96eSJeenu 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>
187b56dc2a9SJeenu Viswambharan #include <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 {
247*30a8d96eSJeenu Viswambharan 	unsigned int max_idx __unused =
248*30a8d96eSJeenu 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