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