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