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