| /* |
| * Copyright (c) 2021-2023, Arm Limited. All rights reserved. |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| |
| #ifndef SME_H |
| #define SME_H |
| |
| #include <stdlib.h> /* for rand() */ |
| |
| #define MAX_VL (512) |
| #define MAX_VL_B (MAX_VL / 8) |
| #define SME_SVQ_ARCH_MAX (MASK(SMCR_ELX_LEN) >> SMCR_ELX_LEN_SHIFT) |
| |
| /* get a random Streaming SVE VQ b/w 0 to SME_SVQ_ARCH_MAX */ |
| #define SME_GET_RANDOM_SVQ (rand() % (SME_SVQ_ARCH_MAX + 1)) |
| |
| typedef enum { |
| SMSTART, /* enters streaming sve mode and enables SME ZA array */ |
| SMSTART_SM, /* enters streaming sve mode only */ |
| SMSTART_ZA, /* enables SME ZA array storage only */ |
| } smestart_instruction_type_t; |
| |
| typedef enum { |
| SMSTOP, /* exits streaming sve mode, & disables SME ZA array */ |
| SMSTOP_SM, /* exits streaming sve mode only */ |
| SMSTOP_ZA, /* disables SME ZA array storage only */ |
| } smestop_instruction_type_t; |
| |
| /* SME feature related prototypes. */ |
| void sme_smstart(smestart_instruction_type_t smstart_type); |
| void sme_smstop(smestop_instruction_type_t smstop_type); |
| |
| /* Assembly function prototypes. */ |
| uint64_t sme_rdsvl_1(void); |
| void sme_try_illegal_instruction(void); |
| void sme_vector_to_ZA(const uint64_t *input_vector); |
| void sme_ZA_to_vector(const uint64_t *output_vector); |
| void sme2_load_zt0_instruction(const uint64_t *inputbuf); |
| void sme2_store_zt0_instruction(const uint64_t *outputbuf); |
| void sme_config_svq(uint32_t svq); |
| void sme_enable_fa64(void); |
| void sme_disable_fa64(void); |
| bool sme_smstat_sm(void); |
| bool sme_feat_fa64_enabled(void); |
| |
| #endif /* SME_H */ |