1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2014-2017, 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 #include <stdint.h> 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <arch_helpers.h> 11*91f16700Schasinglulu #include <common/debug.h> 12*91f16700Schasinglulu #include <drivers/arm/css/css_scp.h> 13*91f16700Schasinglulu #include <drivers/arm/css/sds.h> 14*91f16700Schasinglulu #include <drivers/delay_timer.h> 15*91f16700Schasinglulu #include <plat/common/platform.h> 16*91f16700Schasinglulu #include <platform_def.h> 17*91f16700Schasinglulu 18*91f16700Schasinglulu int css_scp_boot_image_xfer(void *image, unsigned int image_size) 19*91f16700Schasinglulu { 20*91f16700Schasinglulu int ret; 21*91f16700Schasinglulu unsigned int image_offset, image_flags; 22*91f16700Schasinglulu 23*91f16700Schasinglulu ret = sds_init(); 24*91f16700Schasinglulu if (ret != SDS_OK) { 25*91f16700Schasinglulu ERROR("SCP SDS initialization failed\n"); 26*91f16700Schasinglulu panic(); 27*91f16700Schasinglulu } 28*91f16700Schasinglulu 29*91f16700Schasinglulu VERBOSE("Writing SCP image metadata\n"); 30*91f16700Schasinglulu image_offset = (uintptr_t) image - ARM_TRUSTED_SRAM_BASE; 31*91f16700Schasinglulu ret = sds_struct_write(SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_ADDR_OFFSET, 32*91f16700Schasinglulu &image_offset, SDS_SCP_IMG_ADDR_SIZE, 33*91f16700Schasinglulu SDS_ACCESS_MODE_NON_CACHED); 34*91f16700Schasinglulu if (ret != SDS_OK) 35*91f16700Schasinglulu goto sds_fail; 36*91f16700Schasinglulu 37*91f16700Schasinglulu ret = sds_struct_write(SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_SIZE_OFFSET, 38*91f16700Schasinglulu &image_size, SDS_SCP_IMG_SIZE_SIZE, 39*91f16700Schasinglulu SDS_ACCESS_MODE_NON_CACHED); 40*91f16700Schasinglulu if (ret != SDS_OK) 41*91f16700Schasinglulu goto sds_fail; 42*91f16700Schasinglulu 43*91f16700Schasinglulu VERBOSE("Marking SCP image metadata as valid\n"); 44*91f16700Schasinglulu image_flags = SDS_SCP_IMG_VALID_FLAG_BIT; 45*91f16700Schasinglulu ret = sds_struct_write(SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_FLAG_OFFSET, 46*91f16700Schasinglulu &image_flags, SDS_SCP_IMG_FLAG_SIZE, 47*91f16700Schasinglulu SDS_ACCESS_MODE_NON_CACHED); 48*91f16700Schasinglulu if (ret != SDS_OK) 49*91f16700Schasinglulu goto sds_fail; 50*91f16700Schasinglulu 51*91f16700Schasinglulu return 0; 52*91f16700Schasinglulu sds_fail: 53*91f16700Schasinglulu ERROR("SCP SDS write to SCP IMG struct failed\n"); 54*91f16700Schasinglulu panic(); 55*91f16700Schasinglulu } 56*91f16700Schasinglulu 57*91f16700Schasinglulu /* 58*91f16700Schasinglulu * API to wait for SCP to signal till it's ready after booting the transferred 59*91f16700Schasinglulu * image. 60*91f16700Schasinglulu */ 61*91f16700Schasinglulu int css_scp_boot_ready(void) 62*91f16700Schasinglulu { 63*91f16700Schasinglulu uint32_t scp_feature_availability_flags; 64*91f16700Schasinglulu int ret, retry = CSS_SCP_READY_10US_RETRIES; 65*91f16700Schasinglulu 66*91f16700Schasinglulu 67*91f16700Schasinglulu VERBOSE("Waiting for SCP RAM to complete its initialization process\n"); 68*91f16700Schasinglulu 69*91f16700Schasinglulu /* Wait for the SCP RAM Firmware to complete its initialization process */ 70*91f16700Schasinglulu while (retry > 0) { 71*91f16700Schasinglulu ret = sds_struct_read(SDS_FEATURE_AVAIL_STRUCT_ID, 0, 72*91f16700Schasinglulu &scp_feature_availability_flags, 73*91f16700Schasinglulu SDS_FEATURE_AVAIL_SIZE, 74*91f16700Schasinglulu SDS_ACCESS_MODE_NON_CACHED); 75*91f16700Schasinglulu if (ret == SDS_ERR_STRUCT_NOT_FINALIZED) 76*91f16700Schasinglulu continue; 77*91f16700Schasinglulu 78*91f16700Schasinglulu if (ret != SDS_OK) { 79*91f16700Schasinglulu ERROR(" sds_struct_read failed\n"); 80*91f16700Schasinglulu panic(); 81*91f16700Schasinglulu } 82*91f16700Schasinglulu 83*91f16700Schasinglulu if (scp_feature_availability_flags & 84*91f16700Schasinglulu SDS_FEATURE_AVAIL_SCP_RAM_READY_BIT) 85*91f16700Schasinglulu return 0; 86*91f16700Schasinglulu 87*91f16700Schasinglulu udelay(10); 88*91f16700Schasinglulu retry--; 89*91f16700Schasinglulu } 90*91f16700Schasinglulu 91*91f16700Schasinglulu ERROR("Timeout of %d ms expired waiting for SCP RAM Ready flag\n", 92*91f16700Schasinglulu CSS_SCP_READY_10US_RETRIES/100); 93*91f16700Schasinglulu 94*91f16700Schasinglulu plat_panic_handler(); 95*91f16700Schasinglulu } 96