blob: e3f6102fa49a03b7580308a75e9cfa7a5b28c390 [file] [log] [blame]
Soby Mathew1ced6b82017-06-12 12:37:10 +01001/*
2 * Copyright (c) 2014-2017, ARM Limited and Contributors. All rights reserved.
3 *
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>
12#include <drivers/delay_timer.h>
13#include <plat/common/platform.h>
Antonio Nino Diaza320ecd2019-01-15 14:19:50 +000014#include <platform_def.h>
Antonio Nino Diaze0f90632018-12-14 00:18:21 +000015
Roberto Vargasdaaae6c2018-02-12 12:36:17 +000016#include "css_scp.h"
Soby Mathew1ced6b82017-06-12 12:37:10 +010017#include "../sds/sds.h"
18
19int css_scp_boot_image_xfer(void *image, unsigned int image_size)
20{
21 int ret;
22 unsigned int image_offset, image_flags;
23
24 ret = sds_init();
25 if (ret != SDS_OK) {
26 ERROR("SCP SDS initialization failed\n");
27 panic();
28 }
29
30 VERBOSE("Writing SCP image metadata\n");
31 image_offset = (uintptr_t) image - ARM_TRUSTED_SRAM_BASE;
32 ret = sds_struct_write(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_IMG_STRUCT_ID, SDS_SCP_IMG_SIZE_OFFSET,
39 &image_size, SDS_SCP_IMG_SIZE_SIZE,
40 SDS_ACCESS_MODE_NON_CACHED);
41 if (ret != SDS_OK)
42 goto sds_fail;
43
44 VERBOSE("Marking SCP image metadata as valid\n");
45 image_flags = SDS_SCP_IMG_VALID_FLAG_BIT;
46 ret = sds_struct_write(SDS_SCP_IMG_STRUCT_ID, SDS_SCP_IMG_FLAG_OFFSET,
47 &image_flags, SDS_SCP_IMG_FLAG_SIZE,
48 SDS_ACCESS_MODE_NON_CACHED);
49 if (ret != SDS_OK)
50 goto sds_fail;
51
52 return 0;
53sds_fail:
54 ERROR("SCP SDS write to SCP IMG struct failed\n");
55 panic();
56}
57
58/*
59 * API to wait for SCP to signal till it's ready after booting the transferred
60 * image.
61 */
62int css_scp_boot_ready(void)
63{
64 uint32_t scp_feature_availability_flags;
65 int ret, retry = CSS_SCP_READY_10US_RETRIES;
66
67
68 VERBOSE("Waiting for SCP RAM to complete its initialization process\n");
69
70 /* Wait for the SCP RAM Firmware to complete its initialization process */
71 while (retry > 0) {
72 ret = sds_struct_read(SDS_FEATURE_AVAIL_STRUCT_ID, 0,
73 &scp_feature_availability_flags,
74 SDS_FEATURE_AVAIL_SIZE,
75 SDS_ACCESS_MODE_NON_CACHED);
76 if (ret == SDS_ERR_STRUCT_NOT_FINALIZED)
77 continue;
78
79 if (ret != SDS_OK) {
80 ERROR(" sds_struct_read failed\n");
81 panic();
82 }
83
84 if (scp_feature_availability_flags &
85 SDS_FEATURE_AVAIL_SCP_RAM_READY_BIT)
86 return 0;
87
88 udelay(10);
89 retry--;
90 }
91
92 ERROR("Timeout of %d ms expired waiting for SCP RAM Ready flag\n",
93 CSS_SCP_READY_10US_RETRIES/100);
94
95 plat_panic_handler();
96}