1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2018-2020, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <assert.h> 8*91f16700Schasinglulu 9*91f16700Schasinglulu #include <arch_helpers.h> 10*91f16700Schasinglulu #include <common/bl_common.h> 11*91f16700Schasinglulu #include <common/debug.h> 12*91f16700Schasinglulu #include <lib/xlat_tables/xlat_tables_compat.h> 13*91f16700Schasinglulu #include <plat/common/platform.h> 14*91f16700Schasinglulu #include <services/arm_arch_svc.h> 15*91f16700Schasinglulu #include <smccc_helpers.h> 16*91f16700Schasinglulu #include <tools_share/firmware_encrypted.h> 17*91f16700Schasinglulu 18*91f16700Schasinglulu /* 19*91f16700Schasinglulu * The following platform functions are weakly defined. The Platforms 20*91f16700Schasinglulu * may redefine with strong definition. 21*91f16700Schasinglulu */ 22*91f16700Schasinglulu #pragma weak bl2_el3_plat_prepare_exit 23*91f16700Schasinglulu #pragma weak plat_error_handler 24*91f16700Schasinglulu #pragma weak bl2_plat_preload_setup 25*91f16700Schasinglulu #pragma weak bl2_plat_handle_pre_image_load 26*91f16700Schasinglulu #pragma weak bl2_plat_handle_post_image_load 27*91f16700Schasinglulu #pragma weak plat_try_next_boot_source 28*91f16700Schasinglulu #pragma weak plat_get_enc_key_info 29*91f16700Schasinglulu #pragma weak plat_is_smccc_feature_available 30*91f16700Schasinglulu #pragma weak plat_get_soc_version 31*91f16700Schasinglulu #pragma weak plat_get_soc_revision 32*91f16700Schasinglulu 33*91f16700Schasinglulu int32_t plat_get_soc_version(void) 34*91f16700Schasinglulu { 35*91f16700Schasinglulu return SMC_ARCH_CALL_NOT_SUPPORTED; 36*91f16700Schasinglulu } 37*91f16700Schasinglulu 38*91f16700Schasinglulu int32_t plat_get_soc_revision(void) 39*91f16700Schasinglulu { 40*91f16700Schasinglulu return SMC_ARCH_CALL_NOT_SUPPORTED; 41*91f16700Schasinglulu } 42*91f16700Schasinglulu 43*91f16700Schasinglulu int32_t plat_is_smccc_feature_available(u_register_t fid __unused) 44*91f16700Schasinglulu { 45*91f16700Schasinglulu return SMC_ARCH_CALL_NOT_SUPPORTED; 46*91f16700Schasinglulu } 47*91f16700Schasinglulu 48*91f16700Schasinglulu void bl2_el3_plat_prepare_exit(void) 49*91f16700Schasinglulu { 50*91f16700Schasinglulu } 51*91f16700Schasinglulu 52*91f16700Schasinglulu void __dead2 plat_error_handler(int err) 53*91f16700Schasinglulu { 54*91f16700Schasinglulu while (1) 55*91f16700Schasinglulu wfi(); 56*91f16700Schasinglulu } 57*91f16700Schasinglulu 58*91f16700Schasinglulu void bl2_plat_preload_setup(void) 59*91f16700Schasinglulu { 60*91f16700Schasinglulu } 61*91f16700Schasinglulu 62*91f16700Schasinglulu int bl2_plat_handle_pre_image_load(unsigned int image_id) 63*91f16700Schasinglulu { 64*91f16700Schasinglulu return 0; 65*91f16700Schasinglulu } 66*91f16700Schasinglulu 67*91f16700Schasinglulu int bl2_plat_handle_post_image_load(unsigned int image_id) 68*91f16700Schasinglulu { 69*91f16700Schasinglulu return 0; 70*91f16700Schasinglulu } 71*91f16700Schasinglulu 72*91f16700Schasinglulu int plat_try_next_boot_source(void) 73*91f16700Schasinglulu { 74*91f16700Schasinglulu return 0; 75*91f16700Schasinglulu } 76*91f16700Schasinglulu 77*91f16700Schasinglulu /* 78*91f16700Schasinglulu * Weak implementation to provide dummy decryption key only for test purposes, 79*91f16700Schasinglulu * platforms must override this API for any real world firmware encryption 80*91f16700Schasinglulu * use-case. 81*91f16700Schasinglulu */ 82*91f16700Schasinglulu int plat_get_enc_key_info(enum fw_enc_status_t fw_enc_status, uint8_t *key, 83*91f16700Schasinglulu size_t *key_len, unsigned int *flags, 84*91f16700Schasinglulu const uint8_t *img_id, size_t img_id_len) 85*91f16700Schasinglulu { 86*91f16700Schasinglulu #define DUMMY_FIP_ENC_KEY { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef, \ 87*91f16700Schasinglulu 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef, \ 88*91f16700Schasinglulu 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef, \ 89*91f16700Schasinglulu 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef } 90*91f16700Schasinglulu 91*91f16700Schasinglulu const uint8_t dummy_key[] = DUMMY_FIP_ENC_KEY; 92*91f16700Schasinglulu 93*91f16700Schasinglulu assert(*key_len >= sizeof(dummy_key)); 94*91f16700Schasinglulu 95*91f16700Schasinglulu *key_len = sizeof(dummy_key); 96*91f16700Schasinglulu memcpy(key, dummy_key, *key_len); 97*91f16700Schasinglulu *flags = 0; 98*91f16700Schasinglulu 99*91f16700Schasinglulu return 0; 100*91f16700Schasinglulu } 101*91f16700Schasinglulu 102*91f16700Schasinglulu /* 103*91f16700Schasinglulu * Set up the page tables for the generic and platform-specific memory regions. 104*91f16700Schasinglulu * The size of the Trusted SRAM seen by the BL image must be specified as well 105*91f16700Schasinglulu * as an array specifying the generic memory regions which can be; 106*91f16700Schasinglulu * - Code section; 107*91f16700Schasinglulu * - Read-only data section; 108*91f16700Schasinglulu * - Init code section, if applicable 109*91f16700Schasinglulu * - Coherent memory region, if applicable. 110*91f16700Schasinglulu */ 111*91f16700Schasinglulu 112*91f16700Schasinglulu void __init setup_page_tables(const mmap_region_t *bl_regions, 113*91f16700Schasinglulu const mmap_region_t *plat_regions) 114*91f16700Schasinglulu { 115*91f16700Schasinglulu #if LOG_LEVEL >= LOG_LEVEL_VERBOSE 116*91f16700Schasinglulu const mmap_region_t *regions = bl_regions; 117*91f16700Schasinglulu 118*91f16700Schasinglulu while (regions->size != 0U) { 119*91f16700Schasinglulu VERBOSE("Region: 0x%lx - 0x%lx has attributes 0x%x\n", 120*91f16700Schasinglulu regions->base_va, 121*91f16700Schasinglulu regions->base_va + regions->size, 122*91f16700Schasinglulu regions->attr); 123*91f16700Schasinglulu regions++; 124*91f16700Schasinglulu } 125*91f16700Schasinglulu #endif 126*91f16700Schasinglulu /* 127*91f16700Schasinglulu * Map the Trusted SRAM with appropriate memory attributes. 128*91f16700Schasinglulu * Subsequent mappings will adjust the attributes for specific regions. 129*91f16700Schasinglulu */ 130*91f16700Schasinglulu mmap_add(bl_regions); 131*91f16700Schasinglulu 132*91f16700Schasinglulu /* Now (re-)map the platform-specific memory regions */ 133*91f16700Schasinglulu mmap_add(plat_regions); 134*91f16700Schasinglulu 135*91f16700Schasinglulu /* Create the page tables to reflect the above mappings */ 136*91f16700Schasinglulu init_xlat_tables(); 137*91f16700Schasinglulu } 138