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