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