1566034fcSSoby Mathew /* 2566034fcSSoby Mathew * Copyright (c) 2018, ARM Limited and Contributors. All rights reserved. 3566034fcSSoby Mathew * 4566034fcSSoby Mathew * SPDX-License-Identifier: BSD-3-Clause 5566034fcSSoby Mathew */ 6566034fcSSoby Mathew 7566034fcSSoby Mathew #include <arch_helpers.h> 8566034fcSSoby Mathew #include <assert.h> 9566034fcSSoby Mathew #include <bl_common.h> 10566034fcSSoby Mathew #include <debug.h> 11566034fcSSoby Mathew #include <errno.h> 126d01a463SJohn Tsichritzis #if TRUSTED_BOARD_BOOT 136d01a463SJohn Tsichritzis #include <mbedtls_config.h> 146d01a463SJohn Tsichritzis #endif 15a6f340feSSoby Mathew #include <platform.h> 1603987d01SAntonio Nino Diaz #include <xlat_tables_compat.h> 17566034fcSSoby Mathew 18566034fcSSoby Mathew /* 19566034fcSSoby Mathew * The following platform functions are weakly defined. The Platforms 20566034fcSSoby Mathew * may redefine with strong definition. 21566034fcSSoby Mathew */ 22566034fcSSoby Mathew #pragma weak bl2_el3_plat_prepare_exit 23566034fcSSoby Mathew #pragma weak plat_error_handler 24566034fcSSoby Mathew #pragma weak bl2_plat_preload_setup 25566034fcSSoby Mathew #pragma weak bl2_plat_handle_pre_image_load 26566034fcSSoby Mathew #pragma weak bl2_plat_handle_post_image_load 27566034fcSSoby Mathew #pragma weak plat_try_next_boot_source 286d01a463SJohn Tsichritzis #pragma weak plat_get_mbedtls_heap 29566034fcSSoby Mathew 30566034fcSSoby Mathew void bl2_el3_plat_prepare_exit(void) 31566034fcSSoby Mathew { 32566034fcSSoby Mathew } 33566034fcSSoby Mathew 34566034fcSSoby Mathew void __dead2 plat_error_handler(int err) 35566034fcSSoby Mathew { 36566034fcSSoby Mathew while (1) 37566034fcSSoby Mathew wfi(); 38566034fcSSoby Mathew } 39566034fcSSoby Mathew 40566034fcSSoby Mathew void bl2_plat_preload_setup(void) 41566034fcSSoby Mathew { 42566034fcSSoby Mathew } 43566034fcSSoby Mathew 44566034fcSSoby Mathew int bl2_plat_handle_pre_image_load(unsigned int image_id) 45566034fcSSoby Mathew { 46566034fcSSoby Mathew return 0; 47566034fcSSoby Mathew } 48566034fcSSoby Mathew 49566034fcSSoby Mathew int bl2_plat_handle_post_image_load(unsigned int image_id) 50566034fcSSoby Mathew { 51566034fcSSoby Mathew return 0; 52566034fcSSoby Mathew } 53566034fcSSoby Mathew 54566034fcSSoby Mathew int plat_try_next_boot_source(void) 55566034fcSSoby Mathew { 56566034fcSSoby Mathew return 0; 57566034fcSSoby Mathew } 58a6f340feSSoby Mathew 596d01a463SJohn Tsichritzis #if TRUSTED_BOARD_BOOT 606d01a463SJohn Tsichritzis /* 616d01a463SJohn Tsichritzis * The following default implementation of the function simply returns the 626d01a463SJohn Tsichritzis * by-default allocated heap. 636d01a463SJohn Tsichritzis */ 646d01a463SJohn Tsichritzis int plat_get_mbedtls_heap(void **heap_addr, size_t *heap_size) 656d01a463SJohn Tsichritzis { 666d01a463SJohn Tsichritzis static unsigned char heap[TF_MBEDTLS_HEAP_SIZE]; 676d01a463SJohn Tsichritzis 686d01a463SJohn Tsichritzis assert(heap_addr != NULL); 696d01a463SJohn Tsichritzis assert(heap_size != NULL); 706d01a463SJohn Tsichritzis 716d01a463SJohn Tsichritzis *heap_addr = heap; 726d01a463SJohn Tsichritzis *heap_size = sizeof(heap); 736d01a463SJohn Tsichritzis return 0; 746d01a463SJohn Tsichritzis } 756d01a463SJohn Tsichritzis #endif /* TRUSTED_BOARD_BOOT */ 76*0916c38dSRoberto Vargas 77*0916c38dSRoberto Vargas /* 78*0916c38dSRoberto Vargas * Set up the page tables for the generic and platform-specific memory regions. 79*0916c38dSRoberto Vargas * The size of the Trusted SRAM seen by the BL image must be specified as well 80*0916c38dSRoberto Vargas * as an array specifying the generic memory regions which can be; 81*0916c38dSRoberto Vargas * - Code section; 82*0916c38dSRoberto Vargas * - Read-only data section; 83*0916c38dSRoberto Vargas * - Init code section, if applicable 84*0916c38dSRoberto Vargas * - Coherent memory region, if applicable. 85*0916c38dSRoberto Vargas */ 86*0916c38dSRoberto Vargas 87*0916c38dSRoberto Vargas void __init setup_page_tables(const mmap_region_t *bl_regions, 88*0916c38dSRoberto Vargas const mmap_region_t *plat_regions) 89*0916c38dSRoberto Vargas { 90*0916c38dSRoberto Vargas #if LOG_LEVEL >= LOG_LEVEL_VERBOSE 91*0916c38dSRoberto Vargas const mmap_region_t *regions = bl_regions; 92*0916c38dSRoberto Vargas 93*0916c38dSRoberto Vargas while (regions->size != 0U) { 94*0916c38dSRoberto Vargas VERBOSE("Region: 0x%lx - 0x%lx has attributes 0x%x\n", 95*0916c38dSRoberto Vargas regions->base_va, 96*0916c38dSRoberto Vargas regions->base_va + regions->size, 97*0916c38dSRoberto Vargas regions->attr); 98*0916c38dSRoberto Vargas regions++; 99*0916c38dSRoberto Vargas } 100*0916c38dSRoberto Vargas #endif 101*0916c38dSRoberto Vargas /* 102*0916c38dSRoberto Vargas * Map the Trusted SRAM with appropriate memory attributes. 103*0916c38dSRoberto Vargas * Subsequent mappings will adjust the attributes for specific regions. 104*0916c38dSRoberto Vargas */ 105*0916c38dSRoberto Vargas mmap_add(bl_regions); 106*0916c38dSRoberto Vargas 107*0916c38dSRoberto Vargas /* Now (re-)map the platform-specific memory regions */ 108*0916c38dSRoberto Vargas mmap_add(plat_regions); 109*0916c38dSRoberto Vargas 110*0916c38dSRoberto Vargas /* Create the page tables to reflect the above mappings */ 111*0916c38dSRoberto Vargas init_xlat_tables(); 112*0916c38dSRoberto Vargas } 113