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