1ef69e1eaSDimitris Papastamos /* 2ef69e1eaSDimitris Papastamos * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. 3ef69e1eaSDimitris Papastamos * 4ef69e1eaSDimitris Papastamos * SPDX-License-Identifier: BSD-3-Clause 5ef69e1eaSDimitris Papastamos */ 6ef69e1eaSDimitris Papastamos 7ef69e1eaSDimitris Papastamos #include <amu.h> 8ef69e1eaSDimitris Papastamos #include <arch.h> 9ef69e1eaSDimitris Papastamos #include <arch_helpers.h> 10*0767d50eSDimitris Papastamos #include <debug.h> 11ef69e1eaSDimitris Papastamos 12ef69e1eaSDimitris Papastamos void amu_enable(int el2_unused) 13ef69e1eaSDimitris Papastamos { 14ef69e1eaSDimitris Papastamos uint64_t features; 15ef69e1eaSDimitris Papastamos 16ef69e1eaSDimitris Papastamos features = read_id_pfr0() >> ID_PFR0_AMU_SHIFT; 17*0767d50eSDimitris Papastamos if ((features & ID_PFR0_AMU_MASK) != 1) { 18*0767d50eSDimitris Papastamos WARN("Cannot enable AMU - not supported\n"); 19*0767d50eSDimitris Papastamos return; 20*0767d50eSDimitris Papastamos } 21*0767d50eSDimitris Papastamos 22ef69e1eaSDimitris Papastamos if (el2_unused) { 23ef69e1eaSDimitris Papastamos uint64_t v; 24ef69e1eaSDimitris Papastamos 25ef69e1eaSDimitris Papastamos /* 26ef69e1eaSDimitris Papastamos * Non-secure access from EL0 or EL1 to the Activity Monitor 27ef69e1eaSDimitris Papastamos * registers do not trap to EL2. 28ef69e1eaSDimitris Papastamos */ 29ef69e1eaSDimitris Papastamos v = read_hcptr(); 30ef69e1eaSDimitris Papastamos v &= ~TAM_BIT; 31ef69e1eaSDimitris Papastamos write_hcptr(v); 32ef69e1eaSDimitris Papastamos } 33ef69e1eaSDimitris Papastamos 34ef69e1eaSDimitris Papastamos /* Enable group 0 counters */ 35ef69e1eaSDimitris Papastamos write_amcntenset0(AMU_GROUP0_COUNTERS_MASK); 36ef69e1eaSDimitris Papastamos } 37