101f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang/*
201f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * Copyright (c) 2014-2015, Linaro Ltd and Contributors. All rights reserved.
301f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * Copyright (c) 2014-2015, Hisilicon Ltd and Contributors. All rights reserved.
401f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang *
501f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * Redistribution and use in source and binary forms, with or without
601f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * modification, are permitted provided that the following conditions are met:
701f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang *
801f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * Redistributions of source code must retain the above copyright notice, this
901f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * list of conditions and the following disclaimer.
1001f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang *
1101f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * Redistributions in binary form must reproduce the above copyright notice,
1201f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * this list of conditions and the following disclaimer in the documentation
1301f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * and/or other materials provided with the distribution.
1401f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang *
1501f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * Neither the name of ARM nor the names of its contributors may be used
1601f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * to endorse or promote products derived from this software without specific
1701f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * prior written permission.
1801f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang *
1901f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
2001f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2101f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2201f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
2301f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2401f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2501f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2601f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2701f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2801f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2901f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * POSSIBILITY OF SUCH DAMAGE.
3001f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang */
3101f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang
3201f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang#include <arch_helpers.h>
3301f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang#include <arm_gic.h>
3401f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang#include <assert.h>
3501f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang#include <bl_common.h>
3601f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang#include <debug.h>
3701f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang#include <mmio.h>
3801f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang#include <platform.h>
3901f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang#include <platform_def.h>
40ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#include <xlat_tables.h>
4101f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang#include <../hikey_def.h>
4201f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang
43ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#define MAP_DEVICE	MAP_REGION_FLAT(DEVICE_BASE,			\
44ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang					DEVICE_SIZE,			\
45ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang					MT_DEVICE | MT_RW | MT_SECURE)
46ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang
47ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#define MAP_NS_DRAM	MAP_REGION_FLAT(DRAM_NS_BASE,			\
48ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang					DRAM_NS_SIZE,			\
49ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang					MT_DEVICE | MT_RW | MT_NS)
50ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang
51158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong#define MAP_TSP_MEM	MAP_REGION_FLAT(TSP_SEC_MEM_BASE, 		\
52158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong					TSP_SEC_MEM_SIZE,		\
53158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong					MT_MEMORY | MT_RW | MT_SECURE)
54158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong
55ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#define MAP_ROM_PARAM	MAP_REGION_FLAT(XG2RAM0_BASE,			\
56ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang					0x1000,				\
57ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang					MT_DEVICE | MT_RW | MT_NS)
58ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang
5908d91cc8d7d6b9c37e2ce30f3e70c65521a641d5Leo Yan#define MAP_SRAM	MAP_REGION_FLAT(SRAM_BASE,			\
6008d91cc8d7d6b9c37e2ce30f3e70c65521a641d5Leo Yan					SRAM_SIZE,			\
6108d91cc8d7d6b9c37e2ce30f3e70c65521a641d5Leo Yan					MT_DEVICE | MT_RW | MT_SECURE)
6208d91cc8d7d6b9c37e2ce30f3e70c65521a641d5Leo Yan
63ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang/*
64ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang * Table of regions for different BL stages to map using the MMU.
65ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang * This doesn't include Trusted RAM as the 'mem_layout' argument passed to
66ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang * configure_mmu_elx() will give the available subset of that,
67ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang */
68ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#if IMAGE_BL1
69ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuangstatic const mmap_region_t hikey_mmap[] = {
70ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang	MAP_DEVICE,
71ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang	MAP_NS_DRAM,
72ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang	MAP_ROM_PARAM,
73ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang	{0}
74ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang};
75ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#endif
76ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#if IMAGE_BL2
77ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuangstatic const mmap_region_t hikey_mmap[] = {
78ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang	MAP_DEVICE,
79ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang	MAP_NS_DRAM,
80158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong	MAP_TSP_MEM,
8108d91cc8d7d6b9c37e2ce30f3e70c65521a641d5Leo Yan	MAP_SRAM,
82ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang	{0}
83ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang};
84ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#endif
85ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#if IMAGE_BL31
86ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuangstatic const mmap_region_t hikey_mmap[] = {
87ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang	MAP_DEVICE,
88ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang	MAP_NS_DRAM,
89158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong	MAP_TSP_MEM,
90c15ac82ebd42ece65700e462de57e4e6eb4badacLeo Yan	MAP_SRAM,
91158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong	{0}
92158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong};
93158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong#endif
94158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong#if IMAGE_BL32
95158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chongstatic const mmap_region_t hikey_mmap[] = {
96158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong	MAP_DEVICE,
97158c954e153ccb8938bf8ec7d9865ec10a15909bVictor Chong	MAP_NS_DRAM,
98ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang	{0}
99ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang};
100ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#endif
101ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang
10201f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang/* Array of secure interrupts to be configured by the gic driver */
10301f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuangconst unsigned int irq_sec_array[] = {
10401f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang	IRQ_SEC_PHY_TIMER,
10501f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang	IRQ_SEC_SGI_0,
10601f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang	IRQ_SEC_SGI_1,
10701f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang	IRQ_SEC_SGI_2,
10801f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang	IRQ_SEC_SGI_3,
10901f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang	IRQ_SEC_SGI_4,
11001f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang	IRQ_SEC_SGI_5,
11101f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang	IRQ_SEC_SGI_6,
11201f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang	IRQ_SEC_SGI_7
11301f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang};
11401f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang
11501f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuangconst unsigned int num_sec_irqs = sizeof(irq_sec_array) /
11601f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang	sizeof(irq_sec_array[0]);
11701f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang
11801f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang/*******************************************************************************
11901f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * Macro generating the code for the function setting up the pagetables as per
12001f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang * the platform memory map & initialize the mmu, for the given exception level
12101f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang ******************************************************************************/
122ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang#define DEFINE_CONFIGURE_MMU_EL(_el)				\
123ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang	void configure_mmu_el##_el(unsigned long total_base,	\
124ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang				  unsigned long total_size,	\
125ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang				  unsigned long ro_start,	\
126ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang				  unsigned long ro_limit,	\
127ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang				  unsigned long coh_start,	\
128ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang				  unsigned long coh_limit)	\
129ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang	{							\
130ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang	       mmap_add_region(total_base, total_base,		\
131ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang			       total_size,			\
132ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang			       MT_MEMORY | MT_RW | MT_SECURE);	\
133ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang	       mmap_add_region(ro_start, ro_start,		\
134ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang			       ro_limit - ro_start,		\
135ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang			       MT_MEMORY | MT_RO | MT_SECURE);	\
136ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang	       mmap_add_region(coh_start, coh_start,		\
137ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang			       coh_limit - coh_start,		\
138ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang			       MT_DEVICE | MT_RW | MT_SECURE);	\
139ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang	       mmap_add(hikey_mmap);				\
140ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang	       init_xlat_tables();				\
141ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang								\
142ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang	       enable_mmu_el##_el(0);				\
143ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang	}
144ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang
145ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian Zhuang/* Define EL1 and EL3 variants of the function initialising the MMU */
146ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian ZhuangDEFINE_CONFIGURE_MMU_EL(1)
147ceaff43ed7063794bbfa7411ef6f1878c65f820cHaojian ZhuangDEFINE_CONFIGURE_MMU_EL(3)
14801f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang
14901f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuangunsigned long plat_get_ns_image_entrypoint(void)
15001f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang{
15101f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang	return NS_IMAGE_OFFSET;
15201f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang}
15301f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang
15401f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuanguint64_t plat_get_syscnt_freq(void)
15501f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang{
15601f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang	return 1200000;
15701f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang}
15801f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang
15901f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuangvoid plat_gic_init(void)
16001f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang{
16101f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang	arm_gic_init(GICC_BASE, GICD_BASE, 0, irq_sec_array, num_sec_irqs);
16201f4049fd098df8a5b7498442361d6ac3f39bef4Haojian Zhuang}
163