xref: /rk3399_ARM-atf/plat/renesas/common/aarch64/platform_common.c (revision da04341ed52d214139fe2d16667ef5b58c38e502)
1fd9b3c5aSBiju Das /*
2fd9b3c5aSBiju Das  * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved.
3fd9b3c5aSBiju Das  * Copyright (c) 2015-2017, Renesas Electronics Corporation. All rights reserved.
4fd9b3c5aSBiju Das  *
5fd9b3c5aSBiju Das  * SPDX-License-Identifier: BSD-3-Clause
6fd9b3c5aSBiju Das  */
7fd9b3c5aSBiju Das 
8fd9b3c5aSBiju Das #include <platform_def.h>
9fd9b3c5aSBiju Das 
10fd9b3c5aSBiju Das #include <arch.h>
11fd9b3c5aSBiju Das #include <arch_helpers.h>
12fd9b3c5aSBiju Das #include <common/bl_common.h>
13fd9b3c5aSBiju Das #include <common/debug.h>
14fd9b3c5aSBiju Das #include <common/interrupt_props.h>
15fd9b3c5aSBiju Das #include <drivers/arm/gicv2.h>
16fd9b3c5aSBiju Das #include <drivers/arm/gic_common.h>
17fd9b3c5aSBiju Das #include <lib/mmio.h>
18fd9b3c5aSBiju Das #include <lib/xlat_tables/xlat_tables_v2.h>
19fd9b3c5aSBiju Das #include <plat/common/platform.h>
20fd9b3c5aSBiju Das 
21fd9b3c5aSBiju Das #include "rcar_def.h"
22fd9b3c5aSBiju Das #include "rcar_private.h"
23fd9b3c5aSBiju Das #include "rcar_version.h"
24fd9b3c5aSBiju Das 
25fd9b3c5aSBiju Das #if (IMAGE_BL2)
26fd9b3c5aSBiju Das extern void rcar_read_certificate(uint64_t cert, uint32_t *len, uintptr_t *p);
27fd9b3c5aSBiju Das extern int32_t rcar_get_certificate(const int32_t name, uint32_t *cert);
28fd9b3c5aSBiju Das #endif
29fd9b3c5aSBiju Das 
30fd9b3c5aSBiju Das const uint8_t version_of_renesas[VERSION_OF_RENESAS_MAXLEN]
31*da04341eSChris Kay 		__attribute__ ((__section__(".ro"))) = VERSION_OF_RENESAS;
32fd9b3c5aSBiju Das 
33fd9b3c5aSBiju Das #define MAP_SHARED_RAM		MAP_REGION_FLAT(RCAR_SHARED_MEM_BASE,	\
34fd9b3c5aSBiju Das 					RCAR_SHARED_MEM_SIZE,		\
35fd9b3c5aSBiju Das 					MT_MEMORY | MT_RW | MT_SECURE)
36fd9b3c5aSBiju Das 
37fd9b3c5aSBiju Das #define MAP_FLASH0		MAP_REGION_FLAT(FLASH0_BASE,		\
38fd9b3c5aSBiju Das 					FLASH0_SIZE,			\
39fd9b3c5aSBiju Das 					MT_MEMORY | MT_RO | MT_SECURE)
40fd9b3c5aSBiju Das 
41fd9b3c5aSBiju Das #define MAP_DRAM1_NS		MAP_REGION_FLAT(DRAM1_NS_BASE,		\
42fd9b3c5aSBiju Das 					DRAM1_NS_SIZE,			\
43fd9b3c5aSBiju Das 					MT_MEMORY | MT_RW | MT_NS)
44fd9b3c5aSBiju Das 
45fd9b3c5aSBiju Das #define MAP_DEVICE_RCAR		MAP_REGION_FLAT(DEVICE_RCAR_BASE,	\
46fd9b3c5aSBiju Das 					DEVICE_RCAR_SIZE,		\
47fd9b3c5aSBiju Das 					MT_DEVICE | MT_RW | MT_SECURE)
48fd9b3c5aSBiju Das 
49fd9b3c5aSBiju Das #define MAP_DEVICE_RCAR2	MAP_REGION_FLAT(DEVICE_RCAR_BASE2,	\
50fd9b3c5aSBiju Das 					DEVICE_RCAR_SIZE2,		\
51fd9b3c5aSBiju Das 					MT_DEVICE | MT_RW | MT_SECURE)
52fd9b3c5aSBiju Das 
53fd9b3c5aSBiju Das #define MAP_SRAM		MAP_REGION_FLAT(DEVICE_SRAM_BASE,	\
54fd9b3c5aSBiju Das 					DEVICE_SRAM_SIZE,		\
55fd9b3c5aSBiju Das 					MT_MEMORY | MT_RO | MT_SECURE)
56fd9b3c5aSBiju Das 
57fd9b3c5aSBiju Das #define MAP_SRAM_STACK		MAP_REGION_FLAT(DEVICE_SRAM_STACK_BASE,	\
58fd9b3c5aSBiju Das 					DEVICE_SRAM_STACK_SIZE,		\
59fd9b3c5aSBiju Das 					MT_MEMORY | MT_RW | MT_SECURE)
60fd9b3c5aSBiju Das 
61fd9b3c5aSBiju Das #define MAP_ATFW_CRASH  	MAP_REGION_FLAT(RCAR_BL31_CRASH_BASE,	\
62fd9b3c5aSBiju Das 					RCAR_BL31_CRASH_SIZE,		\
63fd9b3c5aSBiju Das 					MT_MEMORY | MT_RW | MT_SECURE)
64fd9b3c5aSBiju Das 
65fd9b3c5aSBiju Das #define MAP_ATFW_LOG		MAP_REGION_FLAT(RCAR_BL31_LOG_BASE,	\
66fd9b3c5aSBiju Das 					RCAR_BL31_LOG_SIZE,		\
67fd9b3c5aSBiju Das 					MT_DEVICE | MT_RW | MT_SECURE)
68fd9b3c5aSBiju Das #if IMAGE_BL2
69fd9b3c5aSBiju Das #define MAP_DRAM0		MAP_REGION_FLAT(DRAM1_BASE,		\
70fd9b3c5aSBiju Das 					DRAM1_SIZE,			\
71fd9b3c5aSBiju Das 					MT_MEMORY | MT_RW | MT_SECURE)
72fd9b3c5aSBiju Das 
73fd9b3c5aSBiju Das #define MAP_REG0		MAP_REGION_FLAT(DEVICE_RCAR_BASE,	\
74fd9b3c5aSBiju Das 					DEVICE_RCAR_SIZE,		\
75fd9b3c5aSBiju Das 					MT_DEVICE | MT_RW | MT_SECURE)
76fd9b3c5aSBiju Das 
77fd9b3c5aSBiju Das #define MAP_RAM0		MAP_REGION_FLAT(RCAR_SYSRAM_BASE,	\
78fd9b3c5aSBiju Das 					RCAR_SYSRAM_SIZE,		\
79fd9b3c5aSBiju Das 					MT_MEMORY | MT_RW | MT_SECURE)
80fd9b3c5aSBiju Das 
81fd9b3c5aSBiju Das #define MAP_REG1		MAP_REGION_FLAT(REG1_BASE,		\
82fd9b3c5aSBiju Das 					REG1_SIZE,			\
83fd9b3c5aSBiju Das 					MT_DEVICE | MT_RW | MT_SECURE)
84fd9b3c5aSBiju Das 
85fd9b3c5aSBiju Das #define MAP_ROM			MAP_REGION_FLAT(ROM0_BASE,		\
86fd9b3c5aSBiju Das 					ROM0_SIZE,			\
87fd9b3c5aSBiju Das 					MT_MEMORY | MT_RO | MT_SECURE)
88fd9b3c5aSBiju Das 
89fd9b3c5aSBiju Das #define MAP_REG2		MAP_REGION_FLAT(REG2_BASE,		\
90fd9b3c5aSBiju Das 					REG2_SIZE,			\
91fd9b3c5aSBiju Das 					MT_DEVICE | MT_RW | MT_SECURE)
92fd9b3c5aSBiju Das 
93fd9b3c5aSBiju Das #define MAP_DRAM1		MAP_REGION_FLAT(DRAM_40BIT_BASE,	\
94fd9b3c5aSBiju Das 					DRAM_40BIT_SIZE,		\
95fd9b3c5aSBiju Das 					MT_MEMORY | MT_RW | MT_SECURE)
96fd9b3c5aSBiju Das #endif
97fd9b3c5aSBiju Das 
98fd9b3c5aSBiju Das #ifdef BL32_BASE
99fd9b3c5aSBiju Das #define MAP_BL32_MEM		MAP_REGION_FLAT(BL32_BASE,		\
100fd9b3c5aSBiju Das 					BL32_LIMIT - BL32_BASE,		\
101fd9b3c5aSBiju Das 					MT_MEMORY | MT_RW | MT_SECURE)
102fd9b3c5aSBiju Das #endif
103fd9b3c5aSBiju Das 
104fd9b3c5aSBiju Das #if IMAGE_BL2
105fd9b3c5aSBiju Das static const mmap_region_t rcar_mmap[] = {
106fd9b3c5aSBiju Das 	MAP_FLASH0,	/*   0x08000000 -   0x0BFFFFFF  RPC area            */
107fd9b3c5aSBiju Das 	MAP_DRAM0,	/*   0x40000000 -   0xBFFFFFFF  DRAM area(Legacy)   */
108fd9b3c5aSBiju Das 	MAP_REG0,	/*   0xE6000000 -   0xE62FFFFF  SoC register area   */
109fd9b3c5aSBiju Das 	MAP_RAM0,	/*   0xE6300000 -   0xE6303FFF  System RAM area     */
110fd9b3c5aSBiju Das 	MAP_REG1,	/*   0xE6400000 -   0xEAFFFFFF  SoC register area   */
111fd9b3c5aSBiju Das 	MAP_ROM,	/*   0xEB100000 -   0xEB127FFF  boot ROM area       */
112fd9b3c5aSBiju Das 	MAP_REG2,	/*   0xEC000000 -   0xFFFFFFFF  SoC register area   */
113fd9b3c5aSBiju Das 	MAP_DRAM1,	/* 0x0400000000 - 0x07FFFFFFFF  DRAM area(4GB over) */
114fd9b3c5aSBiju Das 	{0}
115fd9b3c5aSBiju Das };
116fd9b3c5aSBiju Das #endif
117fd9b3c5aSBiju Das 
118fd9b3c5aSBiju Das #if IMAGE_BL31
119fd9b3c5aSBiju Das static const mmap_region_t rcar_mmap[] = {
120fd9b3c5aSBiju Das 	MAP_SHARED_RAM,
121fd9b3c5aSBiju Das 	MAP_ATFW_CRASH,
122fd9b3c5aSBiju Das 	MAP_ATFW_LOG,
123fd9b3c5aSBiju Das 	MAP_DEVICE_RCAR,
124fd9b3c5aSBiju Das 	MAP_DEVICE_RCAR2,
125fd9b3c5aSBiju Das 	MAP_SRAM,
126fd9b3c5aSBiju Das 	MAP_SRAM_STACK,
127fd9b3c5aSBiju Das 	{0}
128fd9b3c5aSBiju Das };
129fd9b3c5aSBiju Das #endif
130fd9b3c5aSBiju Das 
131fd9b3c5aSBiju Das #if IMAGE_BL32
132fd9b3c5aSBiju Das static const mmap_region_t rcar_mmap[] = {
133fd9b3c5aSBiju Das 	MAP_DEVICE0,
134fd9b3c5aSBiju Das 	MAP_DEVICE1,
135fd9b3c5aSBiju Das 	{0}
136fd9b3c5aSBiju Das };
137fd9b3c5aSBiju Das #endif
138fd9b3c5aSBiju Das 
139fd9b3c5aSBiju Das CASSERT(ARRAY_SIZE(rcar_mmap) + RCAR_BL_REGIONS
140fd9b3c5aSBiju Das 	<= MAX_MMAP_REGIONS, assert_max_mmap_regions);
141fd9b3c5aSBiju Das 
142fd9b3c5aSBiju Das /*
143fd9b3c5aSBiju Das  * Macro generating the code for the function setting up the pagetables as per
144fd9b3c5aSBiju Das  * the platform memory map & initialize the mmu, for the given exception level
145fd9b3c5aSBiju Das  */
146fd9b3c5aSBiju Das #if USE_COHERENT_MEM
147fd9b3c5aSBiju Das void rcar_configure_mmu_el3(unsigned long total_base,
148fd9b3c5aSBiju Das 			    unsigned long total_size,
149fd9b3c5aSBiju Das 			    unsigned long ro_start,
150fd9b3c5aSBiju Das 			    unsigned long ro_limit,
151fd9b3c5aSBiju Das 			    unsigned long coh_start,
152fd9b3c5aSBiju Das 			    unsigned long coh_limit)
153fd9b3c5aSBiju Das {
154fd9b3c5aSBiju Das 	mmap_add_region(total_base, total_base, total_size,
155fd9b3c5aSBiju Das 			MT_MEMORY | MT_RW | MT_SECURE);
156fd9b3c5aSBiju Das 	mmap_add_region(ro_start, ro_start, ro_limit - ro_start,
157fd9b3c5aSBiju Das 			MT_MEMORY | MT_RO | MT_SECURE);
158fd9b3c5aSBiju Das 	mmap_add_region(coh_start, coh_start, coh_limit - coh_start,
159fd9b3c5aSBiju Das 			MT_DEVICE | MT_RW | MT_SECURE);
160fd9b3c5aSBiju Das 	mmap_add(rcar_mmap);
161fd9b3c5aSBiju Das 
162fd9b3c5aSBiju Das 	init_xlat_tables();
163fd9b3c5aSBiju Das 	enable_mmu_el3(0);
164fd9b3c5aSBiju Das }
165fd9b3c5aSBiju Das #else
166fd9b3c5aSBiju Das void rcar_configure_mmu_el3(unsigned long total_base,
167fd9b3c5aSBiju Das 			    unsigned long total_size,
168fd9b3c5aSBiju Das 			    unsigned long ro_start,
169fd9b3c5aSBiju Das 			    unsigned long ro_limit)
170fd9b3c5aSBiju Das {
171fd9b3c5aSBiju Das 	mmap_add_region(total_base, total_base, total_size,
172fd9b3c5aSBiju Das 			MT_MEMORY | MT_RW | MT_SECURE);
173fd9b3c5aSBiju Das 	mmap_add_region(ro_start, ro_start, ro_limit - ro_start,
174fd9b3c5aSBiju Das 			MT_MEMORY | MT_RO | MT_SECURE);
175fd9b3c5aSBiju Das 	mmap_add(rcar_mmap);
176fd9b3c5aSBiju Das 
177fd9b3c5aSBiju Das 	init_xlat_tables();
178fd9b3c5aSBiju Das 	enable_mmu_el3(0);
179fd9b3c5aSBiju Das }
180fd9b3c5aSBiju Das #endif
181fd9b3c5aSBiju Das 
182fd9b3c5aSBiju Das uintptr_t plat_get_ns_image_entrypoint(void)
183fd9b3c5aSBiju Das {
184fd9b3c5aSBiju Das #if (IMAGE_BL2)
185fd9b3c5aSBiju Das 	uint32_t cert, len;
186fd9b3c5aSBiju Das 	uintptr_t dst;
187fd9b3c5aSBiju Das 	int32_t ret;
188fd9b3c5aSBiju Das 
189fd9b3c5aSBiju Das 	ret = rcar_get_certificate(NON_TRUSTED_FW_CONTENT_CERT_ID, &cert);
190fd9b3c5aSBiju Das 	if (ret) {
191fd9b3c5aSBiju Das 		ERROR("%s : cert file load error", __func__);
192fd9b3c5aSBiju Das 		return NS_IMAGE_OFFSET;
193fd9b3c5aSBiju Das 	}
194fd9b3c5aSBiju Das 
195fd9b3c5aSBiju Das 	rcar_read_certificate((uint64_t) cert, &len, &dst);
196fd9b3c5aSBiju Das 
197fd9b3c5aSBiju Das 	return dst;
198fd9b3c5aSBiju Das #else
199fd9b3c5aSBiju Das 	return NS_IMAGE_OFFSET;
200fd9b3c5aSBiju Das #endif
201fd9b3c5aSBiju Das }
202fd9b3c5aSBiju Das 
203fd9b3c5aSBiju Das unsigned int plat_get_syscnt_freq2(void)
204fd9b3c5aSBiju Das {
205fd9b3c5aSBiju Das 	unsigned int freq;
206fd9b3c5aSBiju Das 
207fd9b3c5aSBiju Das 	freq = mmio_read_32(ARM_SYS_CNTCTL_BASE + CNTFID_OFF);
208fd9b3c5aSBiju Das 	if (freq == 0)
209fd9b3c5aSBiju Das 		panic();
210fd9b3c5aSBiju Das 
211fd9b3c5aSBiju Das 	return freq;
212fd9b3c5aSBiju Das }
213fd9b3c5aSBiju Das 
214fd9b3c5aSBiju Das void plat_rcar_gic_init(void)
215fd9b3c5aSBiju Das {
216fd9b3c5aSBiju Das 	gicv2_distif_init();
217fd9b3c5aSBiju Das 	gicv2_pcpu_distif_init();
218fd9b3c5aSBiju Das 	gicv2_cpuif_enable();
219fd9b3c5aSBiju Das }
220fd9b3c5aSBiju Das 
221fd9b3c5aSBiju Das static const interrupt_prop_t interrupt_props[] = {
222fd9b3c5aSBiju Das #if IMAGE_BL2
223fd9b3c5aSBiju Das 	INTR_PROP_DESC(ARM_IRQ_SEC_WDT, GIC_HIGHEST_SEC_PRIORITY,
224fd9b3c5aSBiju Das 		       GICV2_INTR_GROUP0, GIC_INTR_CFG_LEVEL),
225fd9b3c5aSBiju Das #else
226fd9b3c5aSBiju Das 	INTR_PROP_DESC(ARM_IRQ_SEC_PHY_TIMER, GIC_HIGHEST_SEC_PRIORITY,
227fd9b3c5aSBiju Das 		       GICV2_INTR_GROUP0, GIC_INTR_CFG_LEVEL),
228fd9b3c5aSBiju Das 	INTR_PROP_DESC(ARM_IRQ_SEC_SGI_0, GIC_HIGHEST_SEC_PRIORITY,
229fd9b3c5aSBiju Das 		       GICV2_INTR_GROUP0, GIC_INTR_CFG_EDGE),
230fd9b3c5aSBiju Das 	INTR_PROP_DESC(ARM_IRQ_SEC_SGI_1, GIC_HIGHEST_SEC_PRIORITY,
231fd9b3c5aSBiju Das 		       GICV2_INTR_GROUP0, GIC_INTR_CFG_EDGE),
232fd9b3c5aSBiju Das 	INTR_PROP_DESC(ARM_IRQ_SEC_SGI_2, GIC_HIGHEST_SEC_PRIORITY,
233fd9b3c5aSBiju Das 		       GICV2_INTR_GROUP0, GIC_INTR_CFG_EDGE),
234fd9b3c5aSBiju Das 	INTR_PROP_DESC(ARM_IRQ_SEC_SGI_3, GIC_HIGHEST_SEC_PRIORITY,
235fd9b3c5aSBiju Das 		       GICV2_INTR_GROUP0, GIC_INTR_CFG_EDGE),
236fd9b3c5aSBiju Das 	INTR_PROP_DESC(ARM_IRQ_SEC_SGI_4, GIC_HIGHEST_SEC_PRIORITY,
237fd9b3c5aSBiju Das 		       GICV2_INTR_GROUP0, GIC_INTR_CFG_EDGE),
238fd9b3c5aSBiju Das 	INTR_PROP_DESC(ARM_IRQ_SEC_SGI_5, GIC_HIGHEST_SEC_PRIORITY,
239fd9b3c5aSBiju Das 		       GICV2_INTR_GROUP0, GIC_INTR_CFG_EDGE),
240fd9b3c5aSBiju Das 	INTR_PROP_DESC(ARM_IRQ_SEC_SGI_6, GIC_HIGHEST_SEC_PRIORITY,
241fd9b3c5aSBiju Das 		       GICV2_INTR_GROUP0, GIC_INTR_CFG_EDGE),
242fd9b3c5aSBiju Das 	INTR_PROP_DESC(ARM_IRQ_SEC_SGI_7, GIC_HIGHEST_SEC_PRIORITY,
243fd9b3c5aSBiju Das 		       GICV2_INTR_GROUP0, GIC_INTR_CFG_EDGE),
244fd9b3c5aSBiju Das 	INTR_PROP_DESC(ARM_IRQ_SEC_RPC, GIC_HIGHEST_SEC_PRIORITY,
245fd9b3c5aSBiju Das 		       GICV2_INTR_GROUP0, GIC_INTR_CFG_LEVEL),
246fd9b3c5aSBiju Das 	INTR_PROP_DESC(ARM_IRQ_SEC_TIMER, GIC_HIGHEST_SEC_PRIORITY,
247fd9b3c5aSBiju Das 		       GICV2_INTR_GROUP0, GIC_INTR_CFG_LEVEL),
248fd9b3c5aSBiju Das 	INTR_PROP_DESC(ARM_IRQ_SEC_TIMER_UP, GIC_HIGHEST_SEC_PRIORITY,
249fd9b3c5aSBiju Das 		       GICV2_INTR_GROUP0, GIC_INTR_CFG_LEVEL),
250fd9b3c5aSBiju Das 	INTR_PROP_DESC(ARM_IRQ_SEC_WDT, GIC_HIGHEST_SEC_PRIORITY,
251fd9b3c5aSBiju Das 		       GICV2_INTR_GROUP0, GIC_INTR_CFG_LEVEL),
252fd9b3c5aSBiju Das 	INTR_PROP_DESC(ARM_IRQ_SEC_CRYPT, GIC_HIGHEST_SEC_PRIORITY,
253fd9b3c5aSBiju Das 		       GICV2_INTR_GROUP0, GIC_INTR_CFG_LEVEL),
254fd9b3c5aSBiju Das 	INTR_PROP_DESC(ARM_IRQ_SEC_CRYPT_SecPKA, GIC_HIGHEST_SEC_PRIORITY,
255fd9b3c5aSBiju Das 		       GICV2_INTR_GROUP0, GIC_INTR_CFG_LEVEL),
256fd9b3c5aSBiju Das 	INTR_PROP_DESC(ARM_IRQ_SEC_CRYPT_PubPKA, GIC_HIGHEST_SEC_PRIORITY,
257fd9b3c5aSBiju Das 		       GICV2_INTR_GROUP0, GIC_INTR_CFG_LEVEL),
258fd9b3c5aSBiju Das #endif
259fd9b3c5aSBiju Das };
260fd9b3c5aSBiju Das 
261fd9b3c5aSBiju Das static const gicv2_driver_data_t plat_gicv2_driver_data = {
262fd9b3c5aSBiju Das 	.interrupt_props = interrupt_props,
263fd9b3c5aSBiju Das 	.interrupt_props_num = (uint32_t) ARRAY_SIZE(interrupt_props),
264fd9b3c5aSBiju Das 	.gicd_base = RCAR_GICD_BASE,
265fd9b3c5aSBiju Das 	.gicc_base = RCAR_GICC_BASE,
266fd9b3c5aSBiju Das };
267fd9b3c5aSBiju Das 
268fd9b3c5aSBiju Das void plat_rcar_gic_driver_init(void)
269fd9b3c5aSBiju Das {
270fd9b3c5aSBiju Das 	gicv2_driver_init(&plat_gicv2_driver_data);
271fd9b3c5aSBiju Das }
272