xref: /arm-trusted-firmware/plat/mediatek/mt8173/aarch64/platform_common.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <platform_def.h>
8*91f16700Schasinglulu 
9*91f16700Schasinglulu #include <arch_helpers.h>
10*91f16700Schasinglulu #include <common/bl_common.h>
11*91f16700Schasinglulu #include <common/debug.h>
12*91f16700Schasinglulu #include <drivers/arm/cci.h>
13*91f16700Schasinglulu #include <lib/utils.h>
14*91f16700Schasinglulu #include <lib/xlat_tables/xlat_tables.h>
15*91f16700Schasinglulu 
16*91f16700Schasinglulu #include <mt8173_def.h>
17*91f16700Schasinglulu 
18*91f16700Schasinglulu static const int cci_map[] = {
19*91f16700Schasinglulu 	PLAT_MT_CCI_CLUSTER0_SL_IFACE_IX,
20*91f16700Schasinglulu 	PLAT_MT_CCI_CLUSTER1_SL_IFACE_IX
21*91f16700Schasinglulu };
22*91f16700Schasinglulu 
23*91f16700Schasinglulu /* Table of regions to map using the MMU.  */
24*91f16700Schasinglulu const mmap_region_t plat_mmap[] = {
25*91f16700Schasinglulu 	/* for TF text, RO, RW */
26*91f16700Schasinglulu 	MAP_REGION_FLAT(TZRAM_BASE, TZRAM_SIZE,
27*91f16700Schasinglulu 			MT_MEMORY | MT_RW | MT_SECURE),
28*91f16700Schasinglulu 	MAP_REGION_FLAT(MTK_DEV_RNG0_BASE, MTK_DEV_RNG0_SIZE,
29*91f16700Schasinglulu 			MT_DEVICE | MT_RW | MT_SECURE),
30*91f16700Schasinglulu 	MAP_REGION_FLAT(MTK_DEV_RNG1_BASE, MTK_DEV_RNG1_SIZE,
31*91f16700Schasinglulu 			MT_DEVICE | MT_RW | MT_SECURE),
32*91f16700Schasinglulu 	{ 0 }
33*91f16700Schasinglulu 
34*91f16700Schasinglulu };
35*91f16700Schasinglulu 
36*91f16700Schasinglulu /*******************************************************************************
37*91f16700Schasinglulu  * Macro generating the code for the function setting up the pagetables as per
38*91f16700Schasinglulu  * the platform memory map & initialize the mmu, for the given exception level
39*91f16700Schasinglulu  ******************************************************************************/
40*91f16700Schasinglulu #define DEFINE_CONFIGURE_MMU_EL(_el)					\
41*91f16700Schasinglulu 	void plat_configure_mmu_el ## _el(unsigned long total_base,	\
42*91f16700Schasinglulu 					  unsigned long total_size,	\
43*91f16700Schasinglulu 					  unsigned long ro_start,	\
44*91f16700Schasinglulu 					  unsigned long ro_limit,	\
45*91f16700Schasinglulu 					  unsigned long coh_start,	\
46*91f16700Schasinglulu 					  unsigned long coh_limit)	\
47*91f16700Schasinglulu 	{								\
48*91f16700Schasinglulu 		mmap_add_region(total_base, total_base,			\
49*91f16700Schasinglulu 				total_size,				\
50*91f16700Schasinglulu 				MT_MEMORY | MT_RW | MT_SECURE);		\
51*91f16700Schasinglulu 		mmap_add_region(ro_start, ro_start,			\
52*91f16700Schasinglulu 				ro_limit - ro_start,			\
53*91f16700Schasinglulu 				MT_MEMORY | MT_RO | MT_SECURE);		\
54*91f16700Schasinglulu 		mmap_add_region(coh_start, coh_start,			\
55*91f16700Schasinglulu 				coh_limit - coh_start,			\
56*91f16700Schasinglulu 				MT_DEVICE | MT_RW | MT_SECURE);		\
57*91f16700Schasinglulu 		mmap_add(plat_mmap);					\
58*91f16700Schasinglulu 		init_xlat_tables();					\
59*91f16700Schasinglulu 									\
60*91f16700Schasinglulu 		enable_mmu_el ## _el(0);				\
61*91f16700Schasinglulu 	}
62*91f16700Schasinglulu 
63*91f16700Schasinglulu /* Define EL3 variants of the function initialising the MMU */
64*91f16700Schasinglulu DEFINE_CONFIGURE_MMU_EL(3)
65*91f16700Schasinglulu 
66*91f16700Schasinglulu unsigned int plat_get_syscnt_freq2(void)
67*91f16700Schasinglulu {
68*91f16700Schasinglulu 	return SYS_COUNTER_FREQ_IN_TICKS;
69*91f16700Schasinglulu }
70*91f16700Schasinglulu 
71*91f16700Schasinglulu void plat_cci_init(void)
72*91f16700Schasinglulu {
73*91f16700Schasinglulu 	/* Initialize CCI driver */
74*91f16700Schasinglulu 	cci_init(PLAT_MT_CCI_BASE, cci_map, ARRAY_SIZE(cci_map));
75*91f16700Schasinglulu }
76*91f16700Schasinglulu 
77*91f16700Schasinglulu void plat_cci_enable(void)
78*91f16700Schasinglulu {
79*91f16700Schasinglulu 	/*
80*91f16700Schasinglulu 	 * Enable CCI coherency for this cluster.
81*91f16700Schasinglulu 	 * No need for locks as no other cpu is active at the moment.
82*91f16700Schasinglulu 	 */
83*91f16700Schasinglulu 	cci_enable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(read_mpidr()));
84*91f16700Schasinglulu }
85*91f16700Schasinglulu 
86*91f16700Schasinglulu void plat_cci_disable(void)
87*91f16700Schasinglulu {
88*91f16700Schasinglulu 	cci_disable_snoop_dvm_reqs(MPIDR_AFFLVL1_VAL(read_mpidr()));
89*91f16700Schasinglulu }
90