xref: /rk3399_ARM-atf/lib/extensions/sve/sve.c (revision ec767c1b99675fbb50ef1b2fdb2d38e881e4789d)
1 /*
2  * Copyright (c) 2017-2021, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <stdbool.h>
8 
9 #include <arch.h>
10 #include <arch_helpers.h>
11 #include <lib/el3_runtime/pubsub.h>
12 #include <lib/extensions/sve.h>
13 
14 /*
15  * Converts SVE vector size restriction in bytes to LEN according to ZCR_EL3 documentation.
16  * VECTOR_SIZE = (LEN+1) * 128
17  */
18 #define CONVERT_SVE_LENGTH(x)	(((x / 128) - 1))
19 
20 static bool sve_supported(void)
21 {
22 	uint64_t features;
23 
24 	features = read_id_aa64pfr0_el1() >> ID_AA64PFR0_SVE_SHIFT;
25 	return (features & ID_AA64PFR0_SVE_MASK) == 1U;
26 }
27 
28 void sve_enable(cpu_context_t *context)
29 {
30 	if (!sve_supported()) {
31 		return;
32 	}
33 
34 	u_register_t cptr_el3 = read_cptr_el3();
35 
36 	/* Enable access to SVE functionality for all ELs. */
37 	cptr_el3 = (cptr_el3 | CPTR_EZ_BIT) & ~(TFP_BIT);
38 	write_ctx_reg(get_el3state_ctx(context), CTX_CPTR_EL3, cptr_el3);
39 
40 	/* Restrict maximum SVE vector length (SVE_VECTOR_LENGTH+1) * 128. */
41 	write_ctx_reg(get_el3state_ctx(context), CTX_ZCR_EL3,
42 		(ZCR_EL3_LEN_MASK & CONVERT_SVE_LENGTH(512)));
43 }
44