1*8fcd3d96SManish V Badarkhe /* 2*8fcd3d96SManish V Badarkhe * Copyright (c) 2021, Arm Limited. All rights reserved. 3*8fcd3d96SManish V Badarkhe * 4*8fcd3d96SManish V Badarkhe * SPDX-License-Identifier: BSD-3-Clause 5*8fcd3d96SManish V Badarkhe */ 6*8fcd3d96SManish V Badarkhe 7*8fcd3d96SManish V Badarkhe #include <stdbool.h> 8*8fcd3d96SManish V Badarkhe 9*8fcd3d96SManish V Badarkhe #include <arch.h> 10*8fcd3d96SManish V Badarkhe #include <arch_helpers.h> 11*8fcd3d96SManish V Badarkhe #include <lib/extensions/trf.h> 12*8fcd3d96SManish V Badarkhe 13*8fcd3d96SManish V Badarkhe static bool trf_supported(void) 14*8fcd3d96SManish V Badarkhe { 15*8fcd3d96SManish V Badarkhe uint64_t features; 16*8fcd3d96SManish V Badarkhe 17*8fcd3d96SManish V Badarkhe features = read_id_aa64dfr0_el1() >> ID_AA64DFR0_TRACEFILT_SHIFT; 18*8fcd3d96SManish V Badarkhe return ((features & ID_AA64DFR0_TRACEFILT_MASK) == 19*8fcd3d96SManish V Badarkhe ID_AA64DFR0_TRACEFILT_SUPPORTED); 20*8fcd3d96SManish V Badarkhe } 21*8fcd3d96SManish V Badarkhe 22*8fcd3d96SManish V Badarkhe void trf_enable(void) 23*8fcd3d96SManish V Badarkhe { 24*8fcd3d96SManish V Badarkhe uint64_t val; 25*8fcd3d96SManish V Badarkhe 26*8fcd3d96SManish V Badarkhe if (trf_supported()) { 27*8fcd3d96SManish V Badarkhe /* 28*8fcd3d96SManish V Badarkhe * MDCR_EL3.TTRF = b0 29*8fcd3d96SManish V Badarkhe * Allow access of trace filter control registers from NS-EL2 30*8fcd3d96SManish V Badarkhe * and NS-EL1 when NS-EL2 is implemented but not used 31*8fcd3d96SManish V Badarkhe */ 32*8fcd3d96SManish V Badarkhe val = read_mdcr_el3(); 33*8fcd3d96SManish V Badarkhe val &= ~MDCR_TTRF_BIT; 34*8fcd3d96SManish V Badarkhe write_mdcr_el3(val); 35*8fcd3d96SManish V Badarkhe } 36*8fcd3d96SManish V Badarkhe } 37