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