blob: d9965c671e2cc2320dadb8f7ac8cc3ffe1812df9 [file] [log] [blame]
Soby Mathew1ced6b82017-06-12 12:37:10 +01001/*
Tamas Ban896c7342023-05-08 13:38:27 +02002 * Copyright (c) 2014-2024, Arm Limited and Contributors. All rights reserved.
Soby Mathew1ced6b82017-06-12 12:37:10 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Soby Mathew1ced6b82017-06-12 12:37:10 +01007#include <assert.h>
Soby Mathew1ced6b82017-06-12 12:37:10 +01008#include <stdint.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +00009
10#include <arch_helpers.h>
11#include <common/debug.h>
Antonio Nino Diaz326f56b2019-01-23 18:55:03 +000012#include <drivers/arm/css/css_scp.h>
Antonio Nino Diaz09d58762019-01-23 19:06:55 +000013#include <drivers/arm/css/sds.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000014#include <drivers/delay_timer.h>
15#include <plat/common/platform.h>
Antonio Nino Diaza320ecd2019-01-15 14:19:50 +000016#include <platform_def.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000017
Soby Mathew1ced6b82017-06-12 12:37:10 +010018int css_scp_boot_image_xfer(void *image, unsigned int image_size)
19{
20 int ret;
21 unsigned int image_offset, image_flags;
22
Tamas Ban896c7342023-05-08 13:38:27 +020023 ret = sds_init(SDS_SCP_AP_REGION_ID);
Soby Mathew1ced6b82017-06-12 12:37:10 +010024 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;
Tamas Ban896c7342023-05-08 13:38:27 +020031 ret = sds_struct_write(SDS_SCP_AP_REGION_ID,
32 SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_ADDR_OFFSET,
Soby Mathew1ced6b82017-06-12 12:37:10 +010033 &image_offset, SDS_SCP_IMG_ADDR_SIZE,
34 SDS_ACCESS_MODE_NON_CACHED);
35 if (ret != SDS_OK)
36 goto sds_fail;
37
Tamas Ban896c7342023-05-08 13:38:27 +020038 ret = sds_struct_write(SDS_SCP_AP_REGION_ID,
39 SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_SIZE_OFFSET,
Soby Mathew1ced6b82017-06-12 12:37:10 +010040 &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;
Tamas Ban896c7342023-05-08 13:38:27 +020047 ret = sds_struct_write(SDS_SCP_AP_REGION_ID,
48 SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_FLAG_OFFSET,
Soby Mathew1ced6b82017-06-12 12:37:10 +010049 &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;
55sds_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 */
64int 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) {
Tamas Ban896c7342023-05-08 13:38:27 +020074 ret = sds_struct_read(SDS_SCP_AP_REGION_ID,
75 SDS_FEATURE_AVAIL_STRUCT_ID, 0,
Soby Mathew1ced6b82017-06-12 12:37:10 +010076 &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}