xref: /rk3399_ARM-atf/drivers/arm/css/scp/css_sds.c (revision 5932d194d7de355616de46adea8248224190b63e)
12d4135e0SAntonio Nino Diaz /*
22d4135e0SAntonio Nino Diaz  * Copyright (c) 2014-2017, 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>
13*5932d194SAntonio 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 
232d4135e0SAntonio Nino Diaz 	ret = sds_init();
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;
312d4135e0SAntonio Nino Diaz 	ret = sds_struct_write(SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_ADDR_OFFSET,
322d4135e0SAntonio Nino Diaz 			&image_offset, SDS_SCP_IMG_ADDR_SIZE,
332d4135e0SAntonio Nino Diaz 			SDS_ACCESS_MODE_NON_CACHED);
342d4135e0SAntonio Nino Diaz 	if (ret != SDS_OK)
352d4135e0SAntonio Nino Diaz 		goto sds_fail;
362d4135e0SAntonio Nino Diaz 
372d4135e0SAntonio Nino Diaz 	ret = sds_struct_write(SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_SIZE_OFFSET,
382d4135e0SAntonio Nino Diaz 			&image_size, SDS_SCP_IMG_SIZE_SIZE,
392d4135e0SAntonio Nino Diaz 			SDS_ACCESS_MODE_NON_CACHED);
402d4135e0SAntonio Nino Diaz 	if (ret != SDS_OK)
412d4135e0SAntonio Nino Diaz 		goto sds_fail;
422d4135e0SAntonio Nino Diaz 
432d4135e0SAntonio Nino Diaz 	VERBOSE("Marking SCP image metadata as valid\n");
442d4135e0SAntonio Nino Diaz 	image_flags = SDS_SCP_IMG_VALID_FLAG_BIT;
452d4135e0SAntonio Nino Diaz 	ret = sds_struct_write(SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_FLAG_OFFSET,
462d4135e0SAntonio Nino Diaz 			&image_flags, SDS_SCP_IMG_FLAG_SIZE,
472d4135e0SAntonio Nino Diaz 			SDS_ACCESS_MODE_NON_CACHED);
482d4135e0SAntonio Nino Diaz 	if (ret != SDS_OK)
492d4135e0SAntonio Nino Diaz 		goto sds_fail;
502d4135e0SAntonio Nino Diaz 
512d4135e0SAntonio Nino Diaz 	return 0;
522d4135e0SAntonio Nino Diaz sds_fail:
532d4135e0SAntonio Nino Diaz 	ERROR("SCP SDS write to SCP IMG struct failed\n");
542d4135e0SAntonio Nino Diaz 	panic();
552d4135e0SAntonio Nino Diaz }
562d4135e0SAntonio Nino Diaz 
572d4135e0SAntonio Nino Diaz /*
582d4135e0SAntonio Nino Diaz  * API to wait for SCP to signal till it's ready after booting the transferred
592d4135e0SAntonio Nino Diaz  * image.
602d4135e0SAntonio Nino Diaz  */
612d4135e0SAntonio Nino Diaz int css_scp_boot_ready(void)
622d4135e0SAntonio Nino Diaz {
632d4135e0SAntonio Nino Diaz 	uint32_t scp_feature_availability_flags;
642d4135e0SAntonio Nino Diaz 	int ret, retry = CSS_SCP_READY_10US_RETRIES;
652d4135e0SAntonio Nino Diaz 
662d4135e0SAntonio Nino Diaz 
672d4135e0SAntonio Nino Diaz 	VERBOSE("Waiting for SCP RAM to complete its initialization process\n");
682d4135e0SAntonio Nino Diaz 
692d4135e0SAntonio Nino Diaz 	/* Wait for the SCP RAM Firmware to complete its initialization process */
702d4135e0SAntonio Nino Diaz 	while (retry > 0) {
712d4135e0SAntonio Nino Diaz 		ret = sds_struct_read(SDS_FEATURE_AVAIL_STRUCT_ID, 0,
722d4135e0SAntonio Nino Diaz 				&scp_feature_availability_flags,
732d4135e0SAntonio Nino Diaz 				SDS_FEATURE_AVAIL_SIZE,
742d4135e0SAntonio Nino Diaz 				SDS_ACCESS_MODE_NON_CACHED);
752d4135e0SAntonio Nino Diaz 		if (ret == SDS_ERR_STRUCT_NOT_FINALIZED)
762d4135e0SAntonio Nino Diaz 			continue;
772d4135e0SAntonio Nino Diaz 
782d4135e0SAntonio Nino Diaz 		if (ret != SDS_OK) {
792d4135e0SAntonio Nino Diaz 			ERROR(" sds_struct_read failed\n");
802d4135e0SAntonio Nino Diaz 			panic();
812d4135e0SAntonio Nino Diaz 		}
822d4135e0SAntonio Nino Diaz 
832d4135e0SAntonio Nino Diaz 		if (scp_feature_availability_flags &
842d4135e0SAntonio Nino Diaz 				SDS_FEATURE_AVAIL_SCP_RAM_READY_BIT)
852d4135e0SAntonio Nino Diaz 			return 0;
862d4135e0SAntonio Nino Diaz 
872d4135e0SAntonio Nino Diaz 		udelay(10);
882d4135e0SAntonio Nino Diaz 		retry--;
892d4135e0SAntonio Nino Diaz 	}
902d4135e0SAntonio Nino Diaz 
912d4135e0SAntonio Nino Diaz 	ERROR("Timeout of %d ms expired waiting for SCP RAM Ready flag\n",
922d4135e0SAntonio Nino Diaz 			CSS_SCP_READY_10US_RETRIES/100);
932d4135e0SAntonio Nino Diaz 
942d4135e0SAntonio Nino Diaz 	plat_panic_handler();
952d4135e0SAntonio Nino Diaz }
96