1/* 2 * Copyright 2020, Data61, CSIRO (ABN 41 687 119 230) 3 * 4 * SPDX-License-Identifier: GPL-2.0-only 5 */ 6 7#include <plat/machine/hardware.h> 8#include <arch/user_access.h> 9 10/* bits in the CNTKCTL_EL1 */ 11#define EL0VCTEN BIT(1) 12#define EL0PCTEN BIT(0) 13#define EL0VTEN BIT(8) 14#define EL0PTEN BIT(9) 15 16/* bits in CNTHCTL_EL2 */ 17#define EL1PCEN BIT(1) 18#define EL1PCTEN BIT(0) 19 20#define PMUSERENR_EL0_EN BIT(0) 21 22static void check_export_pmu(void) 23{ 24#if defined CONFIG_EXPORT_PMU_USER || defined CONFIG_ENABLE_BENCHMARKS 25 /* allow PL0 to access the PMU */ 26 uint32_t val = PMUSERENR_EL0_EN; 27 MSR("PMUSERENR_EL0", val); 28#endif 29} 30 31static void check_export_arch_timer(void) 32{ 33 uint32_t val = 0; 34#ifdef CONFIG_EXPORT_PCNT_USER 35 val |= EL0PCTEN; 36#endif /* CONFIG_EXPORT_PCNT_USER */ 37#ifdef CONFIG_EXPORT_PTMR_USER 38 val |= EL0PTEN; 39#endif /* CONFIG_EXPORT_PTMR_USER */ 40#ifdef CONFIG_EXPORT_VCNT_USER 41 val |= EL0VCTEN; 42#endif /* CONFIG_EXPORT_VCNT_USER */ 43#ifdef CONFIG_EXPORT_VTMR_USER 44 val |= EL0VTEN; 45#endif /* CONFIG_EXPORT_VTMR_USER */ 46 MSR("CNTKCTL_EL1", val); 47 48#ifdef CONFIG_ARM_HYPERVISOR_SUPPORT 49 val = 0; 50#ifdef CONFIG_EXPORT_PCNT_USER 51 val |= EL1PCTEN; 52#endif /* CONFIG_EXPORT_PCNT_USER */ 53#ifdef CONFIG_EXPORT_PTMR_USER 54 val |= EL1PCEN; 55#endif /* CONFIG_EXPORT_PTMR_USER */ 56 MSR("CNTHCTL_EL2", val); 57#endif /* CONFIG_ARM_HYPERVISOR_SUPPORT */ 58} 59 60void armv_init_user_access(void) 61{ 62 check_export_pmu(); 63 check_export_arch_timer(); 64} 65