diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/cpus/aarch64/cortex_a75.S | 29 | ||||
| -rw-r--r-- | lib/el3_runtime/aarch32/context_mgmt.c | 4 | ||||
| -rw-r--r-- | lib/el3_runtime/aarch64/context_mgmt.c | 5 | ||||
| -rw-r--r-- | lib/extensions/amu/aarch32/amu.c | 32 | ||||
| -rw-r--r-- | lib/extensions/amu/aarch64/amu.c | 40 | 
5 files changed, 109 insertions, 1 deletions
| diff --git a/lib/cpus/aarch64/cortex_a75.S b/lib/cpus/aarch64/cortex_a75.S index 1f4500cb..4cab9e4f 100644 --- a/lib/cpus/aarch64/cortex_a75.S +++ b/lib/cpus/aarch64/cortex_a75.S @@ -11,6 +11,33 @@  #include <plat_macros.S>  #include <cortex_a75.h> +func cortex_a75_reset_func +#if ENABLE_AMU +	/* Make sure accesses from EL0/EL1 and EL2 are not trapped to EL3 */ +	mrs	x0, actlr_el3 +	orr	x0, x0, #CORTEX_A75_ACTLR_AMEN_BIT +	msr	actlr_el3, x0 +	isb + +	/* Make sure accesses from EL0/EL1 are not trapped to EL2 */ +	mrs	x0, actlr_el2 +	orr	x0, x0, #CORTEX_A75_ACTLR_AMEN_BIT +	msr	actlr_el2, x0 +	isb + +	/* Enable group0 counters */ +	mov	x0, #CORTEX_A75_AMU_GROUP0_MASK +	msr	CPUAMCNTENSET_EL0, x0 +	isb + +	/* Enable group1 counters */ +	mov	x0, #CORTEX_A75_AMU_GROUP1_MASK +	msr	CPUAMCNTENSET_EL0, x0 +	isb +#endif +	ret +endfunc cortex_a75_reset_func +  	/* ---------------------------------------------  	 * HW will do the cache maintenance while powering down  	 * --------------------------------------------- @@ -47,5 +74,5 @@ func cortex_a75_cpu_reg_dump  endfunc cortex_a75_cpu_reg_dump  declare_cpu_ops cortex_a75, CORTEX_A75_MIDR, \ -	CPU_NO_RESET_FUNC, \ +	cortex_a75_reset_func, \  	cortex_a75_core_pwr_dwn diff --git a/lib/el3_runtime/aarch32/context_mgmt.c b/lib/el3_runtime/aarch32/context_mgmt.c index a8672d6c..76e440e3 100644 --- a/lib/el3_runtime/aarch32/context_mgmt.c +++ b/lib/el3_runtime/aarch32/context_mgmt.c @@ -4,6 +4,7 @@   * SPDX-License-Identifier: BSD-3-Clause   */ +#include <amu.h>  #include <arch.h>  #include <arch_helpers.h>  #include <assert.h> @@ -132,6 +133,9 @@ static void cm_init_context_common(cpu_context_t *ctx, const entry_point_info_t  static void enable_extensions_nonsecure(int el2_unused)  {  #if IMAGE_BL32 +#if ENABLE_AMU +	amu_enable(el2_unused); +#endif  #endif  } diff --git a/lib/el3_runtime/aarch64/context_mgmt.c b/lib/el3_runtime/aarch64/context_mgmt.c index 8f1523f0..b892729e 100644 --- a/lib/el3_runtime/aarch64/context_mgmt.c +++ b/lib/el3_runtime/aarch64/context_mgmt.c @@ -4,6 +4,7 @@   * SPDX-License-Identifier: BSD-3-Clause   */ +#include <amu.h>  #include <arch.h>  #include <arch_helpers.h>  #include <assert.h> @@ -220,6 +221,10 @@ static void enable_extensions_nonsecure(int el2_unused)  #if ENABLE_SPE_FOR_LOWER_ELS  	spe_enable(el2_unused);  #endif + +#if ENABLE_AMU +	amu_enable(el2_unused); +#endif  #endif  } diff --git a/lib/extensions/amu/aarch32/amu.c b/lib/extensions/amu/aarch32/amu.c new file mode 100644 index 00000000..d450bd69 --- /dev/null +++ b/lib/extensions/amu/aarch32/amu.c @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include <amu.h> +#include <arch.h> +#include <arch_helpers.h> + +void amu_enable(int el2_unused) +{ +	uint64_t features; + +	features = read_id_pfr0() >> ID_PFR0_AMU_SHIFT; +	if ((features & ID_PFR0_AMU_MASK) == 1) { +		if (el2_unused) { +			uint64_t v; + +			/* +			 * Non-secure access from EL0 or EL1 to the Activity Monitor +			 * registers do not trap to EL2. +			 */ +			v = read_hcptr(); +			v &= ~TAM_BIT; +			write_hcptr(v); +		} + +		/* Enable group 0 counters */ +		write_amcntenset0(AMU_GROUP0_COUNTERS_MASK); +	} +} diff --git a/lib/extensions/amu/aarch64/amu.c b/lib/extensions/amu/aarch64/amu.c new file mode 100644 index 00000000..007b3494 --- /dev/null +++ b/lib/extensions/amu/aarch64/amu.c @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include <amu.h> +#include <arch.h> +#include <arch_helpers.h> + +void amu_enable(int el2_unused) +{ +	uint64_t features; + +	features = read_id_aa64pfr0_el1() >> ID_AA64PFR0_AMU_SHIFT; +	if ((features & ID_AA64PFR0_AMU_MASK) == 1) { +		uint64_t v; + +		if (el2_unused) { +			/* +			 * CPTR_EL2.TAM: Set to zero so any accesses to +			 * the Activity Monitor registers do not trap to EL2. +			 */ +			v = read_cptr_el2(); +			v &= ~CPTR_EL2_TAM_BIT; +			write_cptr_el2(v); +		} + +		/* +		 * CPTR_EL3.TAM: Set to zero so that any accesses to +		 * the Activity Monitor registers do not trap to EL3. +		 */ +		v = read_cptr_el3(); +		v &= ~TAM_BIT; +		write_cptr_el3(v); + +		/* Enable group 0 counters */ +		write_amcntenset0_el0(AMU_GROUP0_COUNTERS_MASK); +	} +} | 
