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