1 /*
2 * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 #include <assert.h>
8
9 #include <arch_helpers.h>
10 #include <common/bl_common.h>
11 #include <common/debug.h>
12 #include <lib/mmio.h>
13 #include <lib/xlat_tables/xlat_tables.h>
14 #include <plat/common/platform.h>
15
16 #include <hikey_def.h>
17 #include <hikey_layout.h>
18
19 #define MAP_DDR MAP_REGION_FLAT(DDR_BASE, \
20 DDR_SIZE - DDR_SEC_SIZE, \
21 MT_DEVICE | MT_RW | MT_NS)
22
23 #define MAP_DEVICE MAP_REGION_FLAT(DEVICE_BASE, \
24 DEVICE_SIZE, \
25 MT_DEVICE | MT_RW | MT_SECURE)
26
27 #define MAP_TSP_MEM MAP_REGION_FLAT(TSP_SEC_MEM_BASE, \
28 TSP_SEC_MEM_SIZE, \
29 MT_MEMORY | MT_RW | MT_SECURE)
30
31 #define MAP_ROM_PARAM MAP_REGION_FLAT(XG2RAM0_BASE, \
32 BL1_XG2RAM0_OFFSET, \
33 MT_DEVICE | MT_RO | MT_SECURE)
34
35 #define MAP_SRAM MAP_REGION_FLAT(SRAM_BASE, \
36 SRAM_SIZE, \
37 MT_DEVICE | MT_RW | MT_SECURE)
38
39 /*
40 * BL1 needs to access the areas of MMC_SRAM.
41 * BL1 loads BL2 from eMMC into SRAM before DDR initialized.
42 */
43 #define MAP_MMC_SRAM MAP_REGION_FLAT(HIKEY_BL1_MMC_DESC_BASE, \
44 HIKEY_BL1_MMC_DESC_SIZE + \
45 HIKEY_BL1_MMC_DATA_SIZE, \
46 MT_DEVICE | MT_RW | MT_SECURE)
47
48 /*
49 * Table of regions for different BL stages to map using the MMU.
50 * This doesn't include Trusted RAM as the 'mem_layout' argument passed to
51 * hikey_init_mmu_elx() will give the available subset of that,
52 */
53 #ifdef IMAGE_BL1
54 static const mmap_region_t hikey_mmap[] = {
55 MAP_DEVICE,
56 MAP_ROM_PARAM,
57 MAP_MMC_SRAM,
58 {0}
59 };
60 #endif
61
62 #ifdef IMAGE_BL2
63 static const mmap_region_t hikey_mmap[] = {
64 MAP_DDR,
65 MAP_DEVICE,
66 MAP_TSP_MEM,
67 MAP_SRAM,
68 {0}
69 };
70 #endif
71
72 #ifdef IMAGE_BL31
73 static const mmap_region_t hikey_mmap[] = {
74 MAP_DEVICE,
75 MAP_SRAM,
76 MAP_TSP_MEM,
77 {0}
78 };
79 #endif
80
81 #ifdef IMAGE_BL32
82 static const mmap_region_t hikey_mmap[] = {
83 MAP_DEVICE,
84 MAP_DDR,
85 {0}
86 };
87 #endif
88
89 /*
90 * Macro generating the code for the function setting up the pagetables as per
91 * the platform memory map & initialize the mmu, for the given exception level
92 */
93 #define HIKEY_CONFIGURE_MMU_EL(_el) \
94 void hikey_init_mmu_el##_el(unsigned long total_base, \
95 unsigned long total_size, \
96 unsigned long ro_start, \
97 unsigned long ro_limit, \
98 unsigned long coh_start, \
99 unsigned long coh_limit) \
100 { \
101 mmap_add_region(total_base, total_base, \
102 total_size, \
103 MT_MEMORY | MT_RW | MT_SECURE); \
104 mmap_add_region(ro_start, ro_start, \
105 ro_limit - ro_start, \
106 MT_MEMORY | MT_RO | MT_SECURE); \
107 mmap_add_region(coh_start, coh_start, \
108 coh_limit - coh_start, \
109 MT_DEVICE | MT_RW | MT_SECURE); \
110 mmap_add(hikey_mmap); \
111 init_xlat_tables(); \
112 \
113 enable_mmu_el##_el(0); \
114 }
115
116 /* Define EL1 and EL3 variants of the function initialising the MMU */
117 HIKEY_CONFIGURE_MMU_EL(1)
118 HIKEY_CONFIGURE_MMU_EL(3)
119
plat_get_ns_image_entrypoint(void)120 unsigned long plat_get_ns_image_entrypoint(void)
121 {
122 return HIKEY_NS_IMAGE_OFFSET;
123 }
124
plat_get_syscnt_freq2(void)125 unsigned int plat_get_syscnt_freq2(void)
126 {
127 return 1200000;
128 }
129