xref: /rk3399_ARM-atf/drivers/arm/css/scp/css_sds.c (revision 8d1a04bd3717dcb3ad9a7a7ed56543ec278d5856)
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