hikey_common.c 3.04 KB
Newer Older
Haojian Zhuang's avatar
Haojian Zhuang committed
1
/*
2
 * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
Haojian Zhuang's avatar
Haojian Zhuang committed
3
4
5
6
7
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include <assert.h>
8
9
10
11
12
13
14
15

#include <arch_helpers.h>
#include <common/bl_common.h>
#include <common/debug.h>
#include <lib/mmio.h>
#include <lib/xlat_tables/xlat_tables.h>
#include <plat/common/platform.h>

16
17
#include <hikey_def.h>
#include <hikey_layout.h>
Haojian Zhuang's avatar
Haojian Zhuang committed
18
19

#define MAP_DDR		MAP_REGION_FLAT(DDR_BASE,			\
20
					DDR_SIZE - DDR_SEC_SIZE,	\
Haojian Zhuang's avatar
Haojian Zhuang committed
21
22
23
24
25
26
					MT_DEVICE | MT_RW | MT_NS)

#define MAP_DEVICE	MAP_REGION_FLAT(DEVICE_BASE,			\
					DEVICE_SIZE,			\
					MT_DEVICE | MT_RW | MT_SECURE)

27
28
29
30
#define MAP_TSP_MEM	MAP_REGION_FLAT(TSP_SEC_MEM_BASE,		\
					TSP_SEC_MEM_SIZE,		\
					MT_MEMORY | MT_RW | MT_SECURE)

Haojian Zhuang's avatar
Haojian Zhuang committed
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#define MAP_ROM_PARAM	MAP_REGION_FLAT(XG2RAM0_BASE,			\
					BL1_XG2RAM0_OFFSET,		\
					MT_DEVICE | MT_RO | MT_SECURE)

#define MAP_SRAM	MAP_REGION_FLAT(SRAM_BASE,			\
					SRAM_SIZE,			\
					MT_DEVICE | MT_RW | MT_SECURE)

/*
 * BL1 needs to access the areas of MMC_SRAM.
 * BL1 loads BL2 from eMMC into SRAM before DDR initialized.
 */
#define MAP_MMC_SRAM	MAP_REGION_FLAT(HIKEY_BL1_MMC_DESC_BASE,	\
					HIKEY_BL1_MMC_DESC_SIZE +	\
					HIKEY_BL1_MMC_DATA_SIZE,	\
					MT_DEVICE | MT_RW | MT_SECURE)

/*
 * Table of regions for different BL stages to map using the MMU.
 * This doesn't include Trusted RAM as the 'mem_layout' argument passed to
 * hikey_init_mmu_elx() will give the available subset of that,
 */
Roberto Vargas's avatar
Roberto Vargas committed
53
#ifdef IMAGE_BL1
Haojian Zhuang's avatar
Haojian Zhuang committed
54
55
56
57
58
59
60
61
static const mmap_region_t hikey_mmap[] = {
	MAP_DEVICE,
	MAP_ROM_PARAM,
	MAP_MMC_SRAM,
	{0}
};
#endif

Roberto Vargas's avatar
Roberto Vargas committed
62
#ifdef IMAGE_BL2
Haojian Zhuang's avatar
Haojian Zhuang committed
63
64
65
static const mmap_region_t hikey_mmap[] = {
	MAP_DDR,
	MAP_DEVICE,
66
	MAP_TSP_MEM,
Haojian Zhuang's avatar
Haojian Zhuang committed
67
	MAP_SRAM,
Haojian Zhuang's avatar
Haojian Zhuang committed
68
69
70
71
	{0}
};
#endif

Roberto Vargas's avatar
Roberto Vargas committed
72
#ifdef IMAGE_BL31
Haojian Zhuang's avatar
Haojian Zhuang committed
73
74
75
static const mmap_region_t hikey_mmap[] = {
	MAP_DEVICE,
	MAP_SRAM,
76
77
78
79
80
	MAP_TSP_MEM,
	{0}
};
#endif

Roberto Vargas's avatar
Roberto Vargas committed
81
#ifdef IMAGE_BL32
82
83
84
static const mmap_region_t hikey_mmap[] = {
	MAP_DEVICE,
	MAP_DDR,
Haojian Zhuang's avatar
Haojian Zhuang committed
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
	{0}
};
#endif

/*
 * Macro generating the code for the function setting up the pagetables as per
 * the platform memory map & initialize the mmu, for the given exception level
 */
#define HIKEY_CONFIGURE_MMU_EL(_el)				\
	void hikey_init_mmu_el##_el(unsigned long total_base,	\
				  unsigned long total_size,	\
				  unsigned long ro_start,	\
				  unsigned long ro_limit,	\
				  unsigned long coh_start,	\
				  unsigned long coh_limit)	\
	{							\
	       mmap_add_region(total_base, total_base,		\
			       total_size,			\
			       MT_MEMORY | MT_RW | MT_SECURE);	\
	       mmap_add_region(ro_start, ro_start,		\
			       ro_limit - ro_start,		\
			       MT_MEMORY | MT_RO | MT_SECURE);	\
	       mmap_add_region(coh_start, coh_start,		\
			       coh_limit - coh_start,		\
			       MT_DEVICE | MT_RW | MT_SECURE);	\
	       mmap_add(hikey_mmap);				\
	       init_xlat_tables();				\
								\
	       enable_mmu_el##_el(0);				\
	}

/* Define EL1 and EL3 variants of the function initialising the MMU */
HIKEY_CONFIGURE_MMU_EL(1)
HIKEY_CONFIGURE_MMU_EL(3)

unsigned long plat_get_ns_image_entrypoint(void)
{
	return HIKEY_NS_IMAGE_OFFSET;
}

unsigned int plat_get_syscnt_freq2(void)
{
	return 1200000;
}