xref: /rk3399_ARM-atf/plat/marvell/armada/common/aarch64/marvell_common.c (revision 9935047b2086faa3bf3ccf0b95a76510eb5a160b)
1*a2847172SGrzegorz Jaszczyk /*
2*a2847172SGrzegorz Jaszczyk  * Copyright (C) 2018 Marvell International Ltd.
3*a2847172SGrzegorz Jaszczyk  *
4*a2847172SGrzegorz Jaszczyk  * SPDX-License-Identifier:     BSD-3-Clause
5*a2847172SGrzegorz Jaszczyk  * https://spdx.org/licenses
6*a2847172SGrzegorz Jaszczyk  */
7*a2847172SGrzegorz Jaszczyk 
8*a2847172SGrzegorz Jaszczyk #include <assert.h>
9*a2847172SGrzegorz Jaszczyk 
10*a2847172SGrzegorz Jaszczyk #include <platform_def.h>
11*a2847172SGrzegorz Jaszczyk 
12*a2847172SGrzegorz Jaszczyk #include <arch.h>
13*a2847172SGrzegorz Jaszczyk #include <arch_helpers.h>
14*a2847172SGrzegorz Jaszczyk #include <common/debug.h>
15*a2847172SGrzegorz Jaszczyk #include <lib/mmio.h>
16*a2847172SGrzegorz Jaszczyk #include <lib/xlat_tables/xlat_tables_v2.h>
17*a2847172SGrzegorz Jaszczyk 
18*a2847172SGrzegorz Jaszczyk #include <plat_marvell.h>
19*a2847172SGrzegorz Jaszczyk 
20*a2847172SGrzegorz Jaszczyk /* Weak definitions may be overridden in specific ARM standard platform */
21*a2847172SGrzegorz Jaszczyk #pragma weak plat_get_ns_image_entrypoint
22*a2847172SGrzegorz Jaszczyk #pragma weak plat_marvell_get_mmap
23*a2847172SGrzegorz Jaszczyk 
24*a2847172SGrzegorz Jaszczyk /*
25*a2847172SGrzegorz Jaszczyk  * Set up the page tables for the generic and platform-specific memory regions.
26*a2847172SGrzegorz Jaszczyk  * The extents of the generic memory regions are specified by the function
27*a2847172SGrzegorz Jaszczyk  * arguments and consist of:
28*a2847172SGrzegorz Jaszczyk  * - Trusted SRAM seen by the BL image;
29*a2847172SGrzegorz Jaszczyk  * - Code section;
30*a2847172SGrzegorz Jaszczyk  * - Read-only data section;
31*a2847172SGrzegorz Jaszczyk  * - Coherent memory region, if applicable.
32*a2847172SGrzegorz Jaszczyk  */
marvell_setup_page_tables(uintptr_t total_base,size_t total_size,uintptr_t code_start,uintptr_t code_limit,uintptr_t rodata_start,uintptr_t rodata_limit,uintptr_t coh_start,uintptr_t coh_limit)33*a2847172SGrzegorz Jaszczyk void marvell_setup_page_tables(uintptr_t total_base,
34*a2847172SGrzegorz Jaszczyk 			       size_t total_size,
35*a2847172SGrzegorz Jaszczyk 			       uintptr_t code_start,
36*a2847172SGrzegorz Jaszczyk 			       uintptr_t code_limit,
37*a2847172SGrzegorz Jaszczyk 			       uintptr_t rodata_start,
38*a2847172SGrzegorz Jaszczyk 			       uintptr_t rodata_limit
39*a2847172SGrzegorz Jaszczyk #if USE_COHERENT_MEM
40*a2847172SGrzegorz Jaszczyk 			       ,
41*a2847172SGrzegorz Jaszczyk 			       uintptr_t coh_start,
42*a2847172SGrzegorz Jaszczyk 			       uintptr_t coh_limit
43*a2847172SGrzegorz Jaszczyk #endif
44*a2847172SGrzegorz Jaszczyk 			   )
45*a2847172SGrzegorz Jaszczyk {
46*a2847172SGrzegorz Jaszczyk 	/*
47*a2847172SGrzegorz Jaszczyk 	 * Map the Trusted SRAM with appropriate memory attributes.
48*a2847172SGrzegorz Jaszczyk 	 * Subsequent mappings will adjust the attributes for specific regions.
49*a2847172SGrzegorz Jaszczyk 	 */
50*a2847172SGrzegorz Jaszczyk 	VERBOSE("Trusted SRAM seen by this BL image: %p - %p\n",
51*a2847172SGrzegorz Jaszczyk 		(void *) total_base, (void *) (total_base + total_size));
52*a2847172SGrzegorz Jaszczyk 	mmap_add_region(total_base, total_base,
53*a2847172SGrzegorz Jaszczyk 			total_size,
54*a2847172SGrzegorz Jaszczyk 			MT_MEMORY | MT_RW | MT_SECURE);
55*a2847172SGrzegorz Jaszczyk 
56*a2847172SGrzegorz Jaszczyk 	/* Re-map the code section */
57*a2847172SGrzegorz Jaszczyk 	VERBOSE("Code region: %p - %p\n",
58*a2847172SGrzegorz Jaszczyk 		(void *) code_start, (void *) code_limit);
59*a2847172SGrzegorz Jaszczyk 	mmap_add_region(code_start, code_start,
60*a2847172SGrzegorz Jaszczyk 			code_limit - code_start,
61*a2847172SGrzegorz Jaszczyk 			MT_CODE | MT_SECURE);
62*a2847172SGrzegorz Jaszczyk 
63*a2847172SGrzegorz Jaszczyk 	/* Re-map the read-only data section */
64*a2847172SGrzegorz Jaszczyk 	VERBOSE("Read-only data region: %p - %p\n",
65*a2847172SGrzegorz Jaszczyk 		(void *) rodata_start, (void *) rodata_limit);
66*a2847172SGrzegorz Jaszczyk 	mmap_add_region(rodata_start, rodata_start,
67*a2847172SGrzegorz Jaszczyk 			rodata_limit - rodata_start,
68*a2847172SGrzegorz Jaszczyk 			MT_RO_DATA | MT_SECURE);
69*a2847172SGrzegorz Jaszczyk 
70*a2847172SGrzegorz Jaszczyk #if USE_COHERENT_MEM
71*a2847172SGrzegorz Jaszczyk 	/* Re-map the coherent memory region */
72*a2847172SGrzegorz Jaszczyk 	VERBOSE("Coherent region: %p - %p\n",
73*a2847172SGrzegorz Jaszczyk 		(void *) coh_start, (void *) coh_limit);
74*a2847172SGrzegorz Jaszczyk 	mmap_add_region(coh_start, coh_start,
75*a2847172SGrzegorz Jaszczyk 			coh_limit - coh_start,
76*a2847172SGrzegorz Jaszczyk 			MT_DEVICE | MT_RW | MT_SECURE);
77*a2847172SGrzegorz Jaszczyk #endif
78*a2847172SGrzegorz Jaszczyk 
79*a2847172SGrzegorz Jaszczyk 	/* Now (re-)map the platform-specific memory regions */
80*a2847172SGrzegorz Jaszczyk 	mmap_add(plat_marvell_get_mmap());
81*a2847172SGrzegorz Jaszczyk 
82*a2847172SGrzegorz Jaszczyk 	/* Create the page tables to reflect the above mappings */
83*a2847172SGrzegorz Jaszczyk 	init_xlat_tables();
84*a2847172SGrzegorz Jaszczyk }
85*a2847172SGrzegorz Jaszczyk 
plat_get_ns_image_entrypoint(void)86*a2847172SGrzegorz Jaszczyk unsigned long plat_get_ns_image_entrypoint(void)
87*a2847172SGrzegorz Jaszczyk {
88*a2847172SGrzegorz Jaszczyk 	return PLAT_MARVELL_NS_IMAGE_OFFSET;
89*a2847172SGrzegorz Jaszczyk }
90*a2847172SGrzegorz Jaszczyk 
91*a2847172SGrzegorz Jaszczyk /*****************************************************************************
92*a2847172SGrzegorz Jaszczyk  * Gets SPSR for BL32 entry
93*a2847172SGrzegorz Jaszczyk  *****************************************************************************
94*a2847172SGrzegorz Jaszczyk  */
marvell_get_spsr_for_bl32_entry(void)95*a2847172SGrzegorz Jaszczyk uint32_t marvell_get_spsr_for_bl32_entry(void)
96*a2847172SGrzegorz Jaszczyk {
97*a2847172SGrzegorz Jaszczyk 	/*
98*a2847172SGrzegorz Jaszczyk 	 * The Secure Payload Dispatcher service is responsible for
99*a2847172SGrzegorz Jaszczyk 	 * setting the SPSR prior to entry into the BL32 image.
100*a2847172SGrzegorz Jaszczyk 	 */
101*a2847172SGrzegorz Jaszczyk 	return 0;
102*a2847172SGrzegorz Jaszczyk }
103*a2847172SGrzegorz Jaszczyk 
104*a2847172SGrzegorz Jaszczyk /*****************************************************************************
105*a2847172SGrzegorz Jaszczyk  * Gets SPSR for BL33 entry
106*a2847172SGrzegorz Jaszczyk  *****************************************************************************
107*a2847172SGrzegorz Jaszczyk  */
marvell_get_spsr_for_bl33_entry(void)108*a2847172SGrzegorz Jaszczyk uint32_t marvell_get_spsr_for_bl33_entry(void)
109*a2847172SGrzegorz Jaszczyk {
110*a2847172SGrzegorz Jaszczyk 	unsigned long el_status;
111*a2847172SGrzegorz Jaszczyk 	unsigned int mode;
112*a2847172SGrzegorz Jaszczyk 	uint32_t spsr;
113*a2847172SGrzegorz Jaszczyk 
114*a2847172SGrzegorz Jaszczyk 	/* Figure out what mode we enter the non-secure world in */
115*a2847172SGrzegorz Jaszczyk 	el_status = read_id_aa64pfr0_el1() >> ID_AA64PFR0_EL2_SHIFT;
116*a2847172SGrzegorz Jaszczyk 	el_status &= ID_AA64PFR0_ELX_MASK;
117*a2847172SGrzegorz Jaszczyk 
118*a2847172SGrzegorz Jaszczyk 	mode = (el_status) ? MODE_EL2 : MODE_EL1;
119*a2847172SGrzegorz Jaszczyk 
120*a2847172SGrzegorz Jaszczyk 	/*
121*a2847172SGrzegorz Jaszczyk 	 * TODO: Consider the possibility of specifying the SPSR in
122*a2847172SGrzegorz Jaszczyk 	 * the FIP ToC and allowing the platform to have a say as
123*a2847172SGrzegorz Jaszczyk 	 * well.
124*a2847172SGrzegorz Jaszczyk 	 */
125*a2847172SGrzegorz Jaszczyk 	spsr = SPSR_64(mode, MODE_SP_ELX, DISABLE_ALL_EXCEPTIONS);
126*a2847172SGrzegorz Jaszczyk 	return spsr;
127*a2847172SGrzegorz Jaszczyk }
128*a2847172SGrzegorz Jaszczyk 
129*a2847172SGrzegorz Jaszczyk /*****************************************************************************
130*a2847172SGrzegorz Jaszczyk  * Returns ARM platform specific memory map regions.
131*a2847172SGrzegorz Jaszczyk  *****************************************************************************
132*a2847172SGrzegorz Jaszczyk  */
plat_marvell_get_mmap(void)133*a2847172SGrzegorz Jaszczyk const mmap_region_t *plat_marvell_get_mmap(void)
134*a2847172SGrzegorz Jaszczyk {
135*a2847172SGrzegorz Jaszczyk 	return plat_marvell_mmap;
136*a2847172SGrzegorz Jaszczyk }
137*a2847172SGrzegorz Jaszczyk 
138