1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2021-2023, Arm Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #ifndef SME_H 8*91f16700Schasinglulu #define SME_H 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <stdbool.h> 11*91f16700Schasinglulu #include <context.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu /* 14*91f16700Schasinglulu * Maximum value of LEN field in SMCR_ELx. This is different than the maximum 15*91f16700Schasinglulu * supported value which is platform dependent. In the first version of SME the 16*91f16700Schasinglulu * LEN field is limited to 4 bits but will be expanded in future iterations. 17*91f16700Schasinglulu * To support different versions, the code that discovers the supported vector 18*91f16700Schasinglulu * lengths will write the max value into SMCR_ELx then read it back to see how 19*91f16700Schasinglulu * many bits are implemented. 20*91f16700Schasinglulu */ 21*91f16700Schasinglulu #define SME_SMCR_LEN_MAX U(0x1FF) 22*91f16700Schasinglulu 23*91f16700Schasinglulu #if ENABLE_SME_FOR_NS 24*91f16700Schasinglulu void sme_init_el3(void); 25*91f16700Schasinglulu void sme_init_el2_unused(void); 26*91f16700Schasinglulu void sme_enable(cpu_context_t *context); 27*91f16700Schasinglulu void sme_disable(cpu_context_t *context); 28*91f16700Schasinglulu void sme_enable_per_world(per_world_context_t *per_world_ctx); 29*91f16700Schasinglulu void sme_disable_per_world(per_world_context_t *per_world_ctx); 30*91f16700Schasinglulu #else 31*91f16700Schasinglulu static inline void sme_init_el3(void) 32*91f16700Schasinglulu { 33*91f16700Schasinglulu } 34*91f16700Schasinglulu static inline void sme_init_el2_unused(void) 35*91f16700Schasinglulu { 36*91f16700Schasinglulu } 37*91f16700Schasinglulu static inline void sme_enable(cpu_context_t *context) 38*91f16700Schasinglulu { 39*91f16700Schasinglulu } 40*91f16700Schasinglulu static inline void sme_disable(cpu_context_t *context) 41*91f16700Schasinglulu { 42*91f16700Schasinglulu } 43*91f16700Schasinglulu static inline void sme_enable_per_world(per_world_context_t *per_world_ctx) 44*91f16700Schasinglulu { 45*91f16700Schasinglulu } 46*91f16700Schasinglulu static inline void sme_disable_per_world(per_world_context_t *per_world_ctx) 47*91f16700Schasinglulu { 48*91f16700Schasinglulu } 49*91f16700Schasinglulu #endif /* ENABLE_SME_FOR_NS */ 50*91f16700Schasinglulu 51*91f16700Schasinglulu #endif /* SME_H */ 52