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 */ 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 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 */ 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 */ 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 */ 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