xref: /arm-trusted-firmware/drivers/arm/css/scp/css_sds.c (revision 91f16700b400a8c0651d24a598fc48ee2997a0d7)
1*91f16700Schasinglulu /*
2*91f16700Schasinglulu  * Copyright (c) 2014-2017, ARM Limited and Contributors. All rights reserved.
3*91f16700Schasinglulu  *
4*91f16700Schasinglulu  * SPDX-License-Identifier: BSD-3-Clause
5*91f16700Schasinglulu  */
6*91f16700Schasinglulu 
7*91f16700Schasinglulu #include <assert.h>
8*91f16700Schasinglulu #include <stdint.h>
9*91f16700Schasinglulu 
10*91f16700Schasinglulu #include <arch_helpers.h>
11*91f16700Schasinglulu #include <common/debug.h>
12*91f16700Schasinglulu #include <drivers/arm/css/css_scp.h>
13*91f16700Schasinglulu #include <drivers/arm/css/sds.h>
14*91f16700Schasinglulu #include <drivers/delay_timer.h>
15*91f16700Schasinglulu #include <plat/common/platform.h>
16*91f16700Schasinglulu #include <platform_def.h>
17*91f16700Schasinglulu 
18*91f16700Schasinglulu int css_scp_boot_image_xfer(void *image, unsigned int image_size)
19*91f16700Schasinglulu {
20*91f16700Schasinglulu 	int ret;
21*91f16700Schasinglulu 	unsigned int image_offset, image_flags;
22*91f16700Schasinglulu 
23*91f16700Schasinglulu 	ret = sds_init();
24*91f16700Schasinglulu 	if (ret != SDS_OK) {
25*91f16700Schasinglulu 		ERROR("SCP SDS initialization failed\n");
26*91f16700Schasinglulu 		panic();
27*91f16700Schasinglulu 	}
28*91f16700Schasinglulu 
29*91f16700Schasinglulu 	VERBOSE("Writing SCP image metadata\n");
30*91f16700Schasinglulu 	image_offset = (uintptr_t) image - ARM_TRUSTED_SRAM_BASE;
31*91f16700Schasinglulu 	ret = sds_struct_write(SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_ADDR_OFFSET,
32*91f16700Schasinglulu 			&image_offset, SDS_SCP_IMG_ADDR_SIZE,
33*91f16700Schasinglulu 			SDS_ACCESS_MODE_NON_CACHED);
34*91f16700Schasinglulu 	if (ret != SDS_OK)
35*91f16700Schasinglulu 		goto sds_fail;
36*91f16700Schasinglulu 
37*91f16700Schasinglulu 	ret = sds_struct_write(SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_SIZE_OFFSET,
38*91f16700Schasinglulu 			&image_size, SDS_SCP_IMG_SIZE_SIZE,
39*91f16700Schasinglulu 			SDS_ACCESS_MODE_NON_CACHED);
40*91f16700Schasinglulu 	if (ret != SDS_OK)
41*91f16700Schasinglulu 		goto sds_fail;
42*91f16700Schasinglulu 
43*91f16700Schasinglulu 	VERBOSE("Marking SCP image metadata as valid\n");
44*91f16700Schasinglulu 	image_flags = SDS_SCP_IMG_VALID_FLAG_BIT;
45*91f16700Schasinglulu 	ret = sds_struct_write(SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_FLAG_OFFSET,
46*91f16700Schasinglulu 			&image_flags, SDS_SCP_IMG_FLAG_SIZE,
47*91f16700Schasinglulu 			SDS_ACCESS_MODE_NON_CACHED);
48*91f16700Schasinglulu 	if (ret != SDS_OK)
49*91f16700Schasinglulu 		goto sds_fail;
50*91f16700Schasinglulu 
51*91f16700Schasinglulu 	return 0;
52*91f16700Schasinglulu sds_fail:
53*91f16700Schasinglulu 	ERROR("SCP SDS write to SCP IMG struct failed\n");
54*91f16700Schasinglulu 	panic();
55*91f16700Schasinglulu }
56*91f16700Schasinglulu 
57*91f16700Schasinglulu /*
58*91f16700Schasinglulu  * API to wait for SCP to signal till it's ready after booting the transferred
59*91f16700Schasinglulu  * image.
60*91f16700Schasinglulu  */
61*91f16700Schasinglulu int css_scp_boot_ready(void)
62*91f16700Schasinglulu {
63*91f16700Schasinglulu 	uint32_t scp_feature_availability_flags;
64*91f16700Schasinglulu 	int ret, retry = CSS_SCP_READY_10US_RETRIES;
65*91f16700Schasinglulu 
66*91f16700Schasinglulu 
67*91f16700Schasinglulu 	VERBOSE("Waiting for SCP RAM to complete its initialization process\n");
68*91f16700Schasinglulu 
69*91f16700Schasinglulu 	/* Wait for the SCP RAM Firmware to complete its initialization process */
70*91f16700Schasinglulu 	while (retry > 0) {
71*91f16700Schasinglulu 		ret = sds_struct_read(SDS_FEATURE_AVAIL_STRUCT_ID, 0,
72*91f16700Schasinglulu 				&scp_feature_availability_flags,
73*91f16700Schasinglulu 				SDS_FEATURE_AVAIL_SIZE,
74*91f16700Schasinglulu 				SDS_ACCESS_MODE_NON_CACHED);
75*91f16700Schasinglulu 		if (ret == SDS_ERR_STRUCT_NOT_FINALIZED)
76*91f16700Schasinglulu 			continue;
77*91f16700Schasinglulu 
78*91f16700Schasinglulu 		if (ret != SDS_OK) {
79*91f16700Schasinglulu 			ERROR(" sds_struct_read failed\n");
80*91f16700Schasinglulu 			panic();
81*91f16700Schasinglulu 		}
82*91f16700Schasinglulu 
83*91f16700Schasinglulu 		if (scp_feature_availability_flags &
84*91f16700Schasinglulu 				SDS_FEATURE_AVAIL_SCP_RAM_READY_BIT)
85*91f16700Schasinglulu 			return 0;
86*91f16700Schasinglulu 
87*91f16700Schasinglulu 		udelay(10);
88*91f16700Schasinglulu 		retry--;
89*91f16700Schasinglulu 	}
90*91f16700Schasinglulu 
91*91f16700Schasinglulu 	ERROR("Timeout of %d ms expired waiting for SCP RAM Ready flag\n",
92*91f16700Schasinglulu 			CSS_SCP_READY_10US_RETRIES/100);
93*91f16700Schasinglulu 
94*91f16700Schasinglulu 	plat_panic_handler();
95*91f16700Schasinglulu }
96