1 /* 2 * Copyright (c) 2015-2018, ARM Limited and Contributors. All rights reserved. 3 * 4 * SPDX-License-Identifier: BSD-3-Clause 5 */ 6 7 #include <string.h> 8 9 #include <common/bl_common.h> 10 #include <common/debug.h> 11 #include <lib/mmio.h> 12 #include <lib/utils.h> 13 #include <platform_def.h> 14 15 #include <plat_arm.h> 16 17 #include "../drivers/scp/css_scp.h" 18 19 /* Weak definition may be overridden in specific CSS based platform */ 20 #pragma weak plat_arm_bl2_handle_scp_bl2 21 22 /******************************************************************************* 23 * Transfer SCP_BL2 from Trusted RAM using the SCP Download protocol. 24 * Return 0 on success, -1 otherwise. 25 ******************************************************************************/ 26 int plat_arm_bl2_handle_scp_bl2(image_info_t *scp_bl2_image_info) 27 { 28 int ret; 29 30 INFO("BL2: Initiating SCP_BL2 transfer to SCP\n"); 31 32 ret = css_scp_boot_image_xfer((void *)scp_bl2_image_info->image_base, 33 scp_bl2_image_info->image_size); 34 35 if (ret == 0) 36 ret = css_scp_boot_ready(); 37 38 if (ret == 0) 39 INFO("BL2: SCP_BL2 transferred to SCP\n"); 40 else 41 ERROR("BL2: SCP_BL2 transfer failure\n"); 42 43 return ret; 44 } 45 46 #if !CSS_USE_SCMI_SDS_DRIVER 47 # if defined(EL3_PAYLOAD_BASE) || JUNO_AARCH32_EL3_RUNTIME 48 49 /* 50 * We need to override some of the platform functions when booting an EL3 51 * payload or SP_MIN on Juno AArch32. This needs to be done only for 52 * SCPI/BOM SCP systems as in case of SDS, the structures remain in memory and 53 * don't need to be overwritten. 54 */ 55 56 static unsigned int scp_boot_config; 57 58 void bl2_early_platform_setup2(u_register_t arg0, u_register_t arg1, 59 u_register_t arg2, u_register_t arg3) 60 { 61 arm_bl2_early_platform_setup((uintptr_t)arg0, (meminfo_t *)arg1); 62 63 /* Save SCP Boot config before it gets overwritten by SCP_BL2 loading */ 64 scp_boot_config = mmio_read_32(SCP_BOOT_CFG_ADDR); 65 VERBOSE("BL2: Saved SCP Boot config = 0x%x\n", scp_boot_config); 66 } 67 68 void bl2_platform_setup(void) 69 { 70 arm_bl2_platform_setup(); 71 72 /* 73 * Before releasing the AP cores out of reset, the SCP writes some data 74 * at the beginning of the Trusted SRAM. It is is overwritten before 75 * reaching this function. We need to restore this data, as if the 76 * target had just come out of reset. This implies: 77 * - zeroing the first 128 bytes of Trusted SRAM using zeromem instead 78 * of zero_normalmem since this is device memory. 79 * - restoring the SCP boot configuration. 80 */ 81 VERBOSE("BL2: Restoring SCP reset data in Trusted SRAM\n"); 82 zeromem((void *) ARM_SHARED_RAM_BASE, 128); 83 mmio_write_32(SCP_BOOT_CFG_ADDR, scp_boot_config); 84 } 85 86 # endif /* EL3_PAYLOAD_BASE */ 87 88 #endif /* CSS_USE_SCMI_SDS_DRIVER */ 89