12d4135e0SAntonio Nino Diaz /* 2*8d1a04bdSTamas Ban * Copyright (c) 2014-2024, Arm Limited and Contributors. All rights reserved. 32d4135e0SAntonio Nino Diaz * 42d4135e0SAntonio Nino Diaz * SPDX-License-Identifier: BSD-3-Clause 52d4135e0SAntonio Nino Diaz */ 62d4135e0SAntonio Nino Diaz 72d4135e0SAntonio Nino Diaz #include <assert.h> 82d4135e0SAntonio Nino Diaz #include <stdint.h> 92d4135e0SAntonio Nino Diaz 102d4135e0SAntonio Nino Diaz #include <arch_helpers.h> 112d4135e0SAntonio Nino Diaz #include <common/debug.h> 122d4135e0SAntonio Nino Diaz #include <drivers/arm/css/css_scp.h> 135932d194SAntonio Nino Diaz #include <drivers/arm/css/sds.h> 142d4135e0SAntonio Nino Diaz #include <drivers/delay_timer.h> 152d4135e0SAntonio Nino Diaz #include <plat/common/platform.h> 162d4135e0SAntonio Nino Diaz #include <platform_def.h> 172d4135e0SAntonio Nino Diaz 182d4135e0SAntonio Nino Diaz int css_scp_boot_image_xfer(void *image, unsigned int image_size) 192d4135e0SAntonio Nino Diaz { 202d4135e0SAntonio Nino Diaz int ret; 212d4135e0SAntonio Nino Diaz unsigned int image_offset, image_flags; 222d4135e0SAntonio Nino Diaz 23*8d1a04bdSTamas Ban ret = sds_init(SDS_SCP_AP_REGION_ID); 242d4135e0SAntonio Nino Diaz if (ret != SDS_OK) { 252d4135e0SAntonio Nino Diaz ERROR("SCP SDS initialization failed\n"); 262d4135e0SAntonio Nino Diaz panic(); 272d4135e0SAntonio Nino Diaz } 282d4135e0SAntonio Nino Diaz 292d4135e0SAntonio Nino Diaz VERBOSE("Writing SCP image metadata\n"); 302d4135e0SAntonio Nino Diaz image_offset = (uintptr_t) image - ARM_TRUSTED_SRAM_BASE; 31*8d1a04bdSTamas Ban ret = sds_struct_write(SDS_SCP_AP_REGION_ID, 32*8d1a04bdSTamas Ban SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_ADDR_OFFSET, 332d4135e0SAntonio Nino Diaz &image_offset, SDS_SCP_IMG_ADDR_SIZE, 342d4135e0SAntonio Nino Diaz SDS_ACCESS_MODE_NON_CACHED); 352d4135e0SAntonio Nino Diaz if (ret != SDS_OK) 362d4135e0SAntonio Nino Diaz goto sds_fail; 372d4135e0SAntonio Nino Diaz 38*8d1a04bdSTamas Ban ret = sds_struct_write(SDS_SCP_AP_REGION_ID, 39*8d1a04bdSTamas Ban SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_SIZE_OFFSET, 402d4135e0SAntonio Nino Diaz &image_size, SDS_SCP_IMG_SIZE_SIZE, 412d4135e0SAntonio Nino Diaz SDS_ACCESS_MODE_NON_CACHED); 422d4135e0SAntonio Nino Diaz if (ret != SDS_OK) 432d4135e0SAntonio Nino Diaz goto sds_fail; 442d4135e0SAntonio Nino Diaz 452d4135e0SAntonio Nino Diaz VERBOSE("Marking SCP image metadata as valid\n"); 462d4135e0SAntonio Nino Diaz image_flags = SDS_SCP_IMG_VALID_FLAG_BIT; 47*8d1a04bdSTamas Ban ret = sds_struct_write(SDS_SCP_AP_REGION_ID, 48*8d1a04bdSTamas Ban SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_FLAG_OFFSET, 492d4135e0SAntonio Nino Diaz &image_flags, SDS_SCP_IMG_FLAG_SIZE, 502d4135e0SAntonio Nino Diaz SDS_ACCESS_MODE_NON_CACHED); 512d4135e0SAntonio Nino Diaz if (ret != SDS_OK) 522d4135e0SAntonio Nino Diaz goto sds_fail; 532d4135e0SAntonio Nino Diaz 542d4135e0SAntonio Nino Diaz return 0; 552d4135e0SAntonio Nino Diaz sds_fail: 562d4135e0SAntonio Nino Diaz ERROR("SCP SDS write to SCP IMG struct failed\n"); 572d4135e0SAntonio Nino Diaz panic(); 582d4135e0SAntonio Nino Diaz } 592d4135e0SAntonio Nino Diaz 602d4135e0SAntonio Nino Diaz /* 612d4135e0SAntonio Nino Diaz * API to wait for SCP to signal till it's ready after booting the transferred 622d4135e0SAntonio Nino Diaz * image. 632d4135e0SAntonio Nino Diaz */ 642d4135e0SAntonio Nino Diaz int css_scp_boot_ready(void) 652d4135e0SAntonio Nino Diaz { 662d4135e0SAntonio Nino Diaz uint32_t scp_feature_availability_flags; 672d4135e0SAntonio Nino Diaz int ret, retry = CSS_SCP_READY_10US_RETRIES; 682d4135e0SAntonio Nino Diaz 692d4135e0SAntonio Nino Diaz 702d4135e0SAntonio Nino Diaz VERBOSE("Waiting for SCP RAM to complete its initialization process\n"); 712d4135e0SAntonio Nino Diaz 722d4135e0SAntonio Nino Diaz /* Wait for the SCP RAM Firmware to complete its initialization process */ 732d4135e0SAntonio Nino Diaz while (retry > 0) { 74*8d1a04bdSTamas Ban ret = sds_struct_read(SDS_SCP_AP_REGION_ID, 75*8d1a04bdSTamas Ban SDS_FEATURE_AVAIL_STRUCT_ID, 0, 762d4135e0SAntonio Nino Diaz &scp_feature_availability_flags, 772d4135e0SAntonio Nino Diaz SDS_FEATURE_AVAIL_SIZE, 782d4135e0SAntonio Nino Diaz SDS_ACCESS_MODE_NON_CACHED); 792d4135e0SAntonio Nino Diaz if (ret == SDS_ERR_STRUCT_NOT_FINALIZED) 802d4135e0SAntonio Nino Diaz continue; 812d4135e0SAntonio Nino Diaz 822d4135e0SAntonio Nino Diaz if (ret != SDS_OK) { 832d4135e0SAntonio Nino Diaz ERROR(" sds_struct_read failed\n"); 842d4135e0SAntonio Nino Diaz panic(); 852d4135e0SAntonio Nino Diaz } 862d4135e0SAntonio Nino Diaz 872d4135e0SAntonio Nino Diaz if (scp_feature_availability_flags & 882d4135e0SAntonio Nino Diaz SDS_FEATURE_AVAIL_SCP_RAM_READY_BIT) 892d4135e0SAntonio Nino Diaz return 0; 902d4135e0SAntonio Nino Diaz 912d4135e0SAntonio Nino Diaz udelay(10); 922d4135e0SAntonio Nino Diaz retry--; 932d4135e0SAntonio Nino Diaz } 942d4135e0SAntonio Nino Diaz 952d4135e0SAntonio Nino Diaz ERROR("Timeout of %d ms expired waiting for SCP RAM Ready flag\n", 962d4135e0SAntonio Nino Diaz CSS_SCP_READY_10US_RETRIES/100); 972d4135e0SAntonio Nino Diaz 982d4135e0SAntonio Nino Diaz plat_panic_handler(); 992d4135e0SAntonio Nino Diaz } 100