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