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