GK SDK 源码库: XMIPCLinuxV100R005C00SPC030 (kernel/tools/open_source excluded)
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* Copyright (c) 2017-2021, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef AMU_H
|
||||
#define AMU_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <context.h>
|
||||
|
||||
#include <platform_def.h>
|
||||
|
||||
#if __aarch64__
|
||||
void amu_enable(bool el2_unused, cpu_context_t *ctx);
|
||||
#else
|
||||
void amu_enable(bool el2_unused);
|
||||
#endif
|
||||
|
||||
#if ENABLE_AMU_AUXILIARY_COUNTERS
|
||||
/*
|
||||
* AMU data for a single core.
|
||||
*/
|
||||
struct amu_core {
|
||||
uint16_t enable; /* Mask of auxiliary counters to enable */
|
||||
};
|
||||
|
||||
/*
|
||||
* Topological platform data specific to the AMU.
|
||||
*/
|
||||
struct amu_topology {
|
||||
struct amu_core cores[PLATFORM_CORE_COUNT]; /* Per-core data */
|
||||
};
|
||||
|
||||
#if !ENABLE_AMU_FCONF
|
||||
/*
|
||||
* Retrieve the platform's AMU topology. A `NULL` return value is treated as a
|
||||
* non-fatal error, in which case no auxiliary counters will be enabled.
|
||||
*/
|
||||
const struct amu_topology *plat_amu_topology(void);
|
||||
#endif /* ENABLE_AMU_FCONF */
|
||||
#endif /* ENABLE_AMU_AUXILIARY_COUNTERS */
|
||||
|
||||
#endif /* AMU_H */
|
||||
@@ -0,0 +1,12 @@
|
||||
/*
|
||||
* Copyright (c) 2022, Arm Limited. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef BRBE_H
|
||||
#define BRBE_H
|
||||
|
||||
void brbe_enable(void);
|
||||
|
||||
#endif /* BRBE_H */
|
||||
@@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef MPAM_H
|
||||
#define MPAM_H
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
void mpam_enable(bool el2_unused);
|
||||
|
||||
#endif /* MPAM_H */
|
||||
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* Copyright (c) 2019, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef PAUTH_H
|
||||
#define PAUTH_H
|
||||
|
||||
/*******************************************************************************
|
||||
* ARMv8.3-PAuth support functions
|
||||
******************************************************************************/
|
||||
|
||||
/* Disable ARMv8.3 pointer authentication in EL1/EL3 */
|
||||
void pauth_disable_el1(void);
|
||||
void pauth_disable_el3(void);
|
||||
|
||||
#endif /* PAUTH_H */
|
||||
@@ -0,0 +1,203 @@
|
||||
/*
|
||||
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
|
||||
* Copyright (c) 2020, NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef RAS_H
|
||||
#define RAS_H
|
||||
|
||||
#define ERR_HANDLER_VERSION 1U
|
||||
|
||||
/* Error record access mechanism */
|
||||
#define ERR_ACCESS_SYSREG 0
|
||||
#define ERR_ACCESS_MEMMAP 1
|
||||
|
||||
/*
|
||||
* Register all error records on the platform.
|
||||
*
|
||||
* This macro must be used in the same file as the array of error record info
|
||||
* are declared. Only then would ARRAY_SIZE() yield a meaningful value.
|
||||
*/
|
||||
#define REGISTER_ERR_RECORD_INFO(_records) \
|
||||
const struct err_record_mapping err_record_mappings = { \
|
||||
.err_records = (_records), \
|
||||
.num_err_records = ARRAY_SIZE(_records), \
|
||||
}
|
||||
|
||||
/* Error record info iterator */
|
||||
#define for_each_err_record_info(_i, _info) \
|
||||
for ((_i) = 0, (_info) = err_record_mappings.err_records; \
|
||||
(_i) < err_record_mappings.num_err_records; \
|
||||
(_i)++, (_info)++)
|
||||
|
||||
#define ERR_RECORD_COMMON_(_probe, _handler, _aux) \
|
||||
.probe = _probe, \
|
||||
.handler = _handler, \
|
||||
.aux_data = _aux,
|
||||
|
||||
#define ERR_RECORD_SYSREG_V1(_idx_start, _num_idx, _probe, _handler, _aux) \
|
||||
{ \
|
||||
.version = 1, \
|
||||
.sysreg.idx_start = _idx_start, \
|
||||
.sysreg.num_idx = _num_idx, \
|
||||
.access = ERR_ACCESS_SYSREG, \
|
||||
ERR_RECORD_COMMON_(_probe, _handler, _aux) \
|
||||
}
|
||||
|
||||
#define ERR_RECORD_MEMMAP_V1(_base_addr, _size_num_k, _probe, _handler, _aux) \
|
||||
{ \
|
||||
.version = 1, \
|
||||
.memmap.base_addr = _base_addr, \
|
||||
.memmap.size_num_k = _size_num_k, \
|
||||
.access = ERR_ACCESS_MEMMAP, \
|
||||
ERR_RECORD_COMMON_(_probe, _handler, _aux) \
|
||||
}
|
||||
|
||||
/*
|
||||
* Macro to be used to name and declare an array of RAS interrupts along with
|
||||
* their handlers.
|
||||
*
|
||||
* This macro must be used in the same file as the array of interrupts are
|
||||
* declared. Only then would ARRAY_SIZE() yield a meaningful value. Also, the
|
||||
* array is expected to be sorted in the increasing order of interrupt number.
|
||||
*/
|
||||
#define REGISTER_RAS_INTERRUPTS(_array) \
|
||||
const struct ras_interrupt_mapping ras_interrupt_mappings = { \
|
||||
.intrs = (_array), \
|
||||
.num_intrs = ARRAY_SIZE(_array), \
|
||||
}
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include <lib/extensions/ras_arch.h>
|
||||
|
||||
struct err_record_info;
|
||||
|
||||
struct ras_interrupt {
|
||||
/* Interrupt number, and the associated error record info */
|
||||
unsigned int intr_number;
|
||||
struct err_record_info *err_record;
|
||||
void *cookie;
|
||||
};
|
||||
|
||||
/* Function to probe a error record group for error */
|
||||
typedef int (*err_record_probe_t)(const struct err_record_info *info,
|
||||
int *probe_data);
|
||||
|
||||
/* Data passed to error record group handler */
|
||||
struct err_handler_data {
|
||||
/* Info passed on from top-level exception handler */
|
||||
uint64_t flags;
|
||||
void *cookie;
|
||||
void *handle;
|
||||
|
||||
/* Data structure version */
|
||||
unsigned int version;
|
||||
|
||||
/* Reason for EA: one the ERROR_* constants */
|
||||
unsigned int ea_reason;
|
||||
|
||||
/*
|
||||
* For EAs received at vector, the value read from ESR; for an EA
|
||||
* synchronized by ESB, the value of DISR.
|
||||
*/
|
||||
uint32_t syndrome;
|
||||
|
||||
/* For errors signalled via interrupt, the raw interrupt ID; otherwise, 0. */
|
||||
unsigned int interrupt;
|
||||
};
|
||||
|
||||
/* Function to handle error from an error record group */
|
||||
typedef int (*err_record_handler_t)(const struct err_record_info *info,
|
||||
int probe_data, const struct err_handler_data *const data);
|
||||
|
||||
/* Error record information */
|
||||
struct err_record_info {
|
||||
/* Function to probe error record group for errors */
|
||||
err_record_probe_t probe;
|
||||
|
||||
/* Function to handle error record group errors */
|
||||
err_record_handler_t handler;
|
||||
|
||||
/* Opaque group-specific data */
|
||||
void *aux_data;
|
||||
|
||||
/* Additional information for Standard Error Records */
|
||||
union {
|
||||
struct {
|
||||
/*
|
||||
* For a group accessed via memory-mapped register,
|
||||
* base address of the page hosting error records, and
|
||||
* the size of the record group.
|
||||
*/
|
||||
uintptr_t base_addr;
|
||||
|
||||
/* Size of group in number of KBs */
|
||||
unsigned int size_num_k;
|
||||
} memmap;
|
||||
|
||||
struct {
|
||||
/*
|
||||
* For error records accessed via system register, index of
|
||||
* the error record.
|
||||
*/
|
||||
unsigned int idx_start;
|
||||
unsigned int num_idx;
|
||||
} sysreg;
|
||||
};
|
||||
|
||||
/* Data structure version */
|
||||
unsigned int version;
|
||||
|
||||
/* Error record access mechanism */
|
||||
unsigned int access:1;
|
||||
};
|
||||
|
||||
struct err_record_mapping {
|
||||
struct err_record_info *err_records;
|
||||
size_t num_err_records;
|
||||
};
|
||||
|
||||
struct ras_interrupt_mapping {
|
||||
struct ras_interrupt *intrs;
|
||||
size_t num_intrs;
|
||||
};
|
||||
|
||||
extern const struct err_record_mapping err_record_mappings;
|
||||
extern const struct ras_interrupt_mapping ras_interrupt_mappings;
|
||||
|
||||
|
||||
/*
|
||||
* Helper functions to probe memory-mapped and system registers implemented in
|
||||
* Standard Error Record format
|
||||
*/
|
||||
static inline int ras_err_ser_probe_memmap(const struct err_record_info *info,
|
||||
int *probe_data)
|
||||
{
|
||||
assert(info->version == ERR_HANDLER_VERSION);
|
||||
|
||||
return ser_probe_memmap(info->memmap.base_addr, info->memmap.size_num_k,
|
||||
probe_data);
|
||||
}
|
||||
|
||||
static inline int ras_err_ser_probe_sysreg(const struct err_record_info *info,
|
||||
int *probe_data)
|
||||
{
|
||||
assert(info->version == ERR_HANDLER_VERSION);
|
||||
|
||||
return ser_probe_sysreg(info->sysreg.idx_start, info->sysreg.num_idx,
|
||||
probe_data);
|
||||
}
|
||||
|
||||
const char *ras_serr_to_str(unsigned int serr);
|
||||
int ras_ea_handler(unsigned int ea_reason, uint64_t syndrome, void *cookie,
|
||||
void *handle, uint64_t flags);
|
||||
void ras_init(void);
|
||||
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif /* RAS_H */
|
||||
@@ -0,0 +1,265 @@
|
||||
/*
|
||||
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
|
||||
* Copyright (c) 2020, NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef RAS_ARCH_H
|
||||
#define RAS_ARCH_H
|
||||
|
||||
/*
|
||||
* Size of nodes implementing Standard Error Records - currently only 4k is
|
||||
* supported.
|
||||
*/
|
||||
#define STD_ERR_NODE_SIZE_NUM_K 4U
|
||||
|
||||
/*
|
||||
* Individual register offsets within an error record in Standard Error Record
|
||||
* format when error records are accessed through memory-mapped registers.
|
||||
*/
|
||||
#define ERR_FR(n) (0x0ULL + (64ULL * (n)))
|
||||
#define ERR_CTLR(n) (0x8ULL + (64ULL * (n)))
|
||||
#define ERR_STATUS(n) (0x10ULL + (64ULL * (n)))
|
||||
#define ERR_ADDR(n) (0x18ULL + (64ULL * (n)))
|
||||
#define ERR_MISC0(n) (0x20ULL + (64ULL * (n)))
|
||||
#define ERR_MISC1(n) (0x28ULL + (64ULL * (n)))
|
||||
|
||||
/* Group Status Register (ERR_STATUS) offset */
|
||||
#define ERR_GSR(base, size_num_k, n) \
|
||||
((base) + (0x380ULL * (size_num_k)) + (8ULL * (n)))
|
||||
|
||||
/* Management register offsets */
|
||||
#define ERR_DEVID(base, size_num_k) \
|
||||
((base) + ((0x400ULL * (size_num_k)) - 0x100ULL) + 0xc8ULL)
|
||||
|
||||
#define ERR_DEVID_MASK 0xffffUL
|
||||
|
||||
/* Standard Error Record status register fields */
|
||||
#define ERR_STATUS_AV_SHIFT 31
|
||||
#define ERR_STATUS_AV_MASK U(0x1)
|
||||
|
||||
#define ERR_STATUS_V_SHIFT 30
|
||||
#define ERR_STATUS_V_MASK U(0x1)
|
||||
|
||||
#define ERR_STATUS_UE_SHIFT 29
|
||||
#define ERR_STATUS_UE_MASK U(0x1)
|
||||
|
||||
#define ERR_STATUS_ER_SHIFT 28
|
||||
#define ERR_STATUS_ER_MASK U(0x1)
|
||||
|
||||
#define ERR_STATUS_OF_SHIFT 27
|
||||
#define ERR_STATUS_OF_MASK U(0x1)
|
||||
|
||||
#define ERR_STATUS_MV_SHIFT 26
|
||||
#define ERR_STATUS_MV_MASK U(0x1)
|
||||
|
||||
#define ERR_STATUS_CE_SHIFT 24
|
||||
#define ERR_STATUS_CE_MASK U(0x3)
|
||||
|
||||
#define ERR_STATUS_DE_SHIFT 23
|
||||
#define ERR_STATUS_DE_MASK U(0x1)
|
||||
|
||||
#define ERR_STATUS_PN_SHIFT 22
|
||||
#define ERR_STATUS_PN_MASK U(0x1)
|
||||
|
||||
#define ERR_STATUS_UET_SHIFT 20
|
||||
#define ERR_STATUS_UET_MASK U(0x3)
|
||||
|
||||
#define ERR_STATUS_IERR_SHIFT 8
|
||||
#define ERR_STATUS_IERR_MASK U(0xff)
|
||||
|
||||
#define ERR_STATUS_SERR_SHIFT 0
|
||||
#define ERR_STATUS_SERR_MASK U(0xff)
|
||||
|
||||
#define ERR_STATUS_GET_FIELD(_status, _field) \
|
||||
(((_status) >> ERR_STATUS_ ##_field ##_SHIFT) & ERR_STATUS_ ##_field ##_MASK)
|
||||
|
||||
#define ERR_STATUS_CLR_FIELD(_status, _field) \
|
||||
(_status) &= ~(ERR_STATUS_ ##_field ##_MASK << ERR_STATUS_ ##_field ##_SHIFT)
|
||||
|
||||
#define ERR_STATUS_SET_FIELD(_status, _field, _value) \
|
||||
(_status) |= (((_value) & ERR_STATUS_ ##_field ##_MASK) << ERR_STATUS_ ##_field ##_SHIFT)
|
||||
|
||||
#define ERR_STATUS_WRITE_FIELD(_status, _field, _value) do { \
|
||||
ERR_STATUS_CLR_FIELD(_status, _field, _value); \
|
||||
ERR_STATUS_SET_FIELD(_status, _field, _value); \
|
||||
} while (0)
|
||||
|
||||
|
||||
/* Standard Error Record control register fields */
|
||||
#define ERR_CTLR_WDUI_SHIFT 11
|
||||
#define ERR_CTLR_WDUI_MASK 0x1
|
||||
|
||||
#define ERR_CTLR_RDUI_SHIFT 10
|
||||
#define ERR_CTLR_RDUI_MASK 0x1
|
||||
#define ERR_CTLR_DUI_SHIFT ERR_CTLR_RDUI_SHIFT
|
||||
#define ERR_CTLR_DUI_MASK ERR_CTLR_RDUI_MASK
|
||||
|
||||
#define ERR_CTLR_WCFI_SHIFT 9
|
||||
#define ERR_CTLR_WCFI_MASK 0x1
|
||||
|
||||
#define ERR_CTLR_RCFI_SHIFT 8
|
||||
#define ERR_CTLR_RCFI_MASK 0x1
|
||||
#define ERR_CTLR_CFI_SHIFT ERR_CTLR_RCFI_SHIFT
|
||||
#define ERR_CTLR_CFI_MASK ERR_CTLR_RCFI_MASK
|
||||
|
||||
#define ERR_CTLR_WUE_SHIFT 7
|
||||
#define ERR_CTLR_WUE_MASK 0x1
|
||||
|
||||
#define ERR_CTLR_WFI_SHIFT 6
|
||||
#define ERR_CTLR_WFI_MASK 0x1
|
||||
|
||||
#define ERR_CTLR_WUI_SHIFT 5
|
||||
#define ERR_CTLR_WUI_MASK 0x1
|
||||
|
||||
#define ERR_CTLR_RUE_SHIFT 4
|
||||
#define ERR_CTLR_RUE_MASK 0x1
|
||||
#define ERR_CTLR_UE_SHIFT ERR_CTLR_RUE_SHIFT
|
||||
#define ERR_CTLR_UE_MASK ERR_CTLR_RUE_MASK
|
||||
|
||||
#define ERR_CTLR_RFI_SHIFT 3
|
||||
#define ERR_CTLR_RFI_MASK 0x1
|
||||
#define ERR_CTLR_FI_SHIFT ERR_CTLR_RFI_SHIFT
|
||||
#define ERR_CTLR_FI_MASK ERR_CTLR_RFI_MASK
|
||||
|
||||
#define ERR_CTLR_RUI_SHIFT 2
|
||||
#define ERR_CTLR_RUI_MASK 0x1
|
||||
#define ERR_CTLR_UI_SHIFT ERR_CTLR_RUI_SHIFT
|
||||
#define ERR_CTLR_UI_MASK ERR_CTLR_RUI_MASK
|
||||
|
||||
#define ERR_CTLR_ED_SHIFT 0
|
||||
#define ERR_CTLR_ED_MASK 0x1
|
||||
|
||||
#define ERR_CTLR_CLR_FIELD(_ctlr, _field) \
|
||||
(_ctlr) &= ~(ERR_CTLR_ ##_field _MASK << ERR_CTLR_ ##_field ##_SHIFT)
|
||||
|
||||
#define ERR_CTLR_SET_FIELD(_ctlr, _field, _value) \
|
||||
(_ctlr) |= (((_value) & ERR_CTLR_ ##_field ##_MASK) << ERR_CTLR_ ##_field ##_SHIFT)
|
||||
|
||||
#define ERR_CTLR_ENABLE_FIELD(_ctlr, _field) \
|
||||
ERR_CTLR_SET_FIELD(_ctlr, _field, ERR_CTLR_ ##_field ##_MASK)
|
||||
|
||||
/* Uncorrected error types for Asynchronous exceptions */
|
||||
#define ERROR_STATUS_UET_UC 0x0 /* Uncontainable */
|
||||
#define ERROR_STATUS_UET_UEU 0x1 /* Unrecoverable */
|
||||
#define ERROR_STATUS_UET_UEO 0x2 /* Restable */
|
||||
#define ERROR_STATUS_UET_UER 0x3 /* Recoverable */
|
||||
|
||||
/* Error types for Synchronous exceptions */
|
||||
#define ERROR_STATUS_SET_UER 0x0 /* Recoverable */
|
||||
#define ERROR_STATUS_SET_UEO 0x1 /* Restable */
|
||||
#define ERROR_STATUS_SET_UC 0x2 /* Uncontainable */
|
||||
#define ERROR_STATUS_SET_CE 0x3 /* Corrected */
|
||||
|
||||
/* Number of architecturally-defined primary error codes */
|
||||
#define ERROR_STATUS_NUM_SERR U(22)
|
||||
|
||||
/* Implementation Defined Syndrome bit in ESR */
|
||||
#define SERROR_IDS_BIT U(24)
|
||||
|
||||
/*
|
||||
* Asynchronous Error Type in exception syndrome. The field has same values in
|
||||
* both DISR_EL1 and ESR_EL3 for SError.
|
||||
*/
|
||||
#define EABORT_AET_SHIFT U(10)
|
||||
#define EABORT_AET_WIDTH U(3)
|
||||
#define EABORT_AET_MASK U(0x7)
|
||||
|
||||
/* DFSC field in Asynchronous exception syndrome */
|
||||
#define EABORT_DFSC_SHIFT U(0)
|
||||
#define EABORT_DFSC_WIDTH U(6)
|
||||
#define EABORT_DFSC_MASK U(0x3f)
|
||||
|
||||
/* Synchronous Error Type in exception syndrome. */
|
||||
#define EABORT_SET_SHIFT U(11)
|
||||
#define EABORT_SET_WIDTH U(2)
|
||||
#define EABORT_SET_MASK U(0x3)
|
||||
|
||||
/* DFSC code for SErrors */
|
||||
#define DFSC_SERROR 0x11
|
||||
|
||||
/* I/DFSC code for synchronous external abort */
|
||||
#define SYNC_EA_FSC 0x10
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#include <arch.h>
|
||||
#include <arch_helpers.h>
|
||||
#include <assert.h>
|
||||
#include <context.h>
|
||||
#include <lib/mmio.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/*
|
||||
* Standard Error Record accessors for memory-mapped registers.
|
||||
*/
|
||||
|
||||
static inline uint64_t ser_get_feature(uintptr_t base, unsigned int idx)
|
||||
{
|
||||
return mmio_read_64(base + ERR_FR(idx));
|
||||
}
|
||||
|
||||
static inline uint64_t ser_get_control(uintptr_t base, unsigned int idx)
|
||||
{
|
||||
return mmio_read_64(base + ERR_CTLR(idx));
|
||||
}
|
||||
|
||||
static inline uint64_t ser_get_status(uintptr_t base, unsigned int idx)
|
||||
{
|
||||
return mmio_read_64(base + ERR_STATUS(idx));
|
||||
}
|
||||
|
||||
/*
|
||||
* Error handling agent would write to the status register to clear an
|
||||
* identified/handled error. Most fields in the status register are
|
||||
* conditional write-one-to-clear.
|
||||
*
|
||||
* Typically, to clear the status, it suffices to write back the same value
|
||||
* previously read. However, if there were new, higher-priority errors recorded
|
||||
* on the node since status was last read, writing read value won't clear the
|
||||
* status. Therefore, an error handling agent must wait on and verify the status
|
||||
* has indeed been cleared.
|
||||
*/
|
||||
static inline void ser_set_status(uintptr_t base, unsigned int idx,
|
||||
uint64_t status)
|
||||
{
|
||||
mmio_write_64(base + ERR_STATUS(idx), status);
|
||||
}
|
||||
|
||||
static inline uint64_t ser_get_addr(uintptr_t base, unsigned int idx)
|
||||
{
|
||||
return mmio_read_64(base + ERR_ADDR(idx));
|
||||
}
|
||||
|
||||
static inline uint64_t ser_get_misc0(uintptr_t base, unsigned int idx)
|
||||
{
|
||||
return mmio_read_64(base + ERR_MISC0(idx));
|
||||
}
|
||||
|
||||
static inline uint64_t ser_get_misc1(uintptr_t base, unsigned int idx)
|
||||
{
|
||||
return mmio_read_64(base + ERR_MISC1(idx));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Standard Error Record helpers for System registers.
|
||||
*/
|
||||
static inline void ser_sys_select_record(unsigned int idx)
|
||||
{
|
||||
unsigned int max_idx __unused =
|
||||
(unsigned int) read_erridr_el1() & ERRIDR_MASK;
|
||||
|
||||
assert(idx < max_idx);
|
||||
|
||||
write_errselr_el1(idx);
|
||||
isb();
|
||||
}
|
||||
|
||||
/* Library functions to probe Standard Error Record */
|
||||
int ser_probe_memmap(uintptr_t base, unsigned int size_num_k, int *probe_data);
|
||||
int ser_probe_sysreg(unsigned int idx_start, unsigned int num_idx, int *probe_data);
|
||||
#endif /* __ASSEMBLER__ */
|
||||
|
||||
#endif /* RAS_ARCH_H */
|
||||
@@ -0,0 +1,27 @@
|
||||
/*
|
||||
* Copyright (c) 2021, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef SME_H
|
||||
#define SME_H
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#include <context.h>
|
||||
|
||||
/*
|
||||
* Maximum value of LEN field in SMCR_ELx. This is different than the maximum
|
||||
* supported value which is platform dependent. In the first version of SME the
|
||||
* LEN field is limited to 4 bits but will be expanded in future iterations.
|
||||
* To support different versions, the code that discovers the supported vector
|
||||
* lengths will write the max value into SMCR_ELx then read it back to see how
|
||||
* many bits are implemented.
|
||||
*/
|
||||
#define SME_SMCR_LEN_MAX U(0x1FF)
|
||||
|
||||
void sme_enable(cpu_context_t *context);
|
||||
void sme_disable(cpu_context_t *context);
|
||||
|
||||
#endif /* SME_H */
|
||||
@@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef SPE_H
|
||||
#define SPE_H
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
bool spe_supported(void);
|
||||
void spe_enable(bool el2_unused);
|
||||
void spe_disable(void);
|
||||
|
||||
#endif /* SPE_H */
|
||||
@@ -0,0 +1,15 @@
|
||||
/*
|
||||
* Copyright (c) 2017-2021, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef SVE_H
|
||||
#define SVE_H
|
||||
|
||||
#include <context.h>
|
||||
|
||||
void sve_enable(cpu_context_t *context);
|
||||
void sve_disable(cpu_context_t *context);
|
||||
|
||||
#endif /* SVE_H */
|
||||
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* Copyright (c) 2021, Arm Limited. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef SYS_REG_TRACE_H
|
||||
#define SYS_REG_TRACE_H
|
||||
|
||||
#include <context.h>
|
||||
|
||||
#if __aarch64__
|
||||
void sys_reg_trace_enable(cpu_context_t *context);
|
||||
#else
|
||||
void sys_reg_trace_enable(void);
|
||||
#endif /* __aarch64__ */
|
||||
|
||||
#endif /* SYS_REG_TRACE_H */
|
||||
@@ -0,0 +1,12 @@
|
||||
/*
|
||||
* Copyright (c) 2021, Arm Limited. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef TRBE_H
|
||||
#define TRBE_H
|
||||
|
||||
void trbe_enable(void);
|
||||
|
||||
#endif /* TRBE_H */
|
||||
@@ -0,0 +1,12 @@
|
||||
/*
|
||||
* Copyright (c) 2021, Arm Limited. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef TRF_H
|
||||
#define TRF_H
|
||||
|
||||
void trf_enable(void);
|
||||
|
||||
#endif /* TRF_H */
|
||||
Reference in New Issue
Block a user