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
css_scp_boot_image_xfer(void * image,unsigned int image_size)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 */
css_scp_boot_ready(void)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