diff options
author | Soby Mathew <soby.mathew@arm.com> | 2017-05-03 12:58:41 +0100 |
---|---|---|
committer | Soby Mathew <soby.mathew@arm.com> | 2017-07-20 17:49:08 +0100 |
commit | 74d44a49f89efc02decda22d075276a8a763be45 (patch) | |
tree | 4ed560fb738d2811532b3a5d76250ee991d1a7b6 /plat/arm/css/common | |
parent | 6c401f316f94faac8e0b2fc63c112fe85e01a995 (diff) | |
download | platform_external_arm-trusted-firmware-74d44a49f89efc02decda22d075276a8a763be45.tar.gz platform_external_arm-trusted-firmware-74d44a49f89efc02decda22d075276a8a763be45.tar.bz2 platform_external_arm-trusted-firmware-74d44a49f89efc02decda22d075276a8a763be45.zip |
CSS: Reorganize the SCP Image transfer functionality
The SCP_BL2 is transferred to SCP during BL2 image load and authenticate
sequence. The Boot-Over-MHU (BOM) protocol is used as transport for this. After
the SCP boots using the transferred image, the AP CPU waits till the `READY`
message is received from SCP. This patch separates the API for transport of
image from the wait for `READY` message and also moves the related files to
the `css/drivers` folder. The previous API `scp_bootloader_transfer` is
renamed to `css_scp_boot_image_xfer` to reflect the css naming convention.
This reorganisation also allows easier switch to a different transport
(eg: Shared Data Structure based transfer) in future
Change-Id: I8a96f9c4616ffde6dbfdf7c18f6f6f8bfa40bbf0
Signed-off-by: Soby Mathew <soby.mathew@arm.com>
Diffstat (limited to 'plat/arm/css/common')
-rw-r--r-- | plat/arm/css/common/css_bl2_setup.c | 7 | ||||
-rw-r--r-- | plat/arm/css/common/css_bl2u_setup.c | 9 | ||||
-rw-r--r-- | plat/arm/css/common/css_common.mk | 4 | ||||
-rw-r--r-- | plat/arm/css/common/css_scp_bootloader.c | 177 | ||||
-rw-r--r-- | plat/arm/css/common/css_scp_bootloader.h | 12 |
5 files changed, 13 insertions, 196 deletions
diff --git a/plat/arm/css/common/css_bl2_setup.c b/plat/arm/css/common/css_bl2_setup.c index 73549aa0b..0712e3a9f 100644 --- a/plat/arm/css/common/css_bl2_setup.c +++ b/plat/arm/css/common/css_bl2_setup.c @@ -11,7 +11,7 @@ #include <plat_arm.h> #include <string.h> #include <utils.h> -#include "css_scp_bootloader.h" +#include "../drivers/scp/css_scp.h" /* Weak definition may be overridden in specific CSS based platform */ #if LOAD_IMAGE_V2 @@ -34,10 +34,13 @@ int bl2_plat_handle_scp_bl2(image_info_t *scp_bl2_image_info) INFO("BL2: Initiating SCP_BL2 transfer to SCP\n"); - ret = scp_bootloader_transfer((void *)scp_bl2_image_info->image_base, + ret = css_scp_boot_image_xfer((void *)scp_bl2_image_info->image_base, scp_bl2_image_info->image_size); if (ret == 0) + ret = css_scp_boot_ready(); + + if (ret == 0) INFO("BL2: SCP_BL2 transferred to SCP\n"); else ERROR("BL2: SCP_BL2 transfer failure\n"); diff --git a/plat/arm/css/common/css_bl2u_setup.c b/plat/arm/css/common/css_bl2u_setup.c index cc1875821..d225151b1 100644 --- a/plat/arm/css/common/css_bl2u_setup.c +++ b/plat/arm/css/common/css_bl2u_setup.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2015-2017, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -7,7 +7,7 @@ #include <bl_common.h> #include <debug.h> #include <plat_arm.h> -#include "css_scp_bootloader.h" +#include "../drivers/scp/css_scp.h" /* Weak definition may be overridden in specific CSS based platform */ #pragma weak bl2u_plat_handle_scp_bl2u @@ -40,10 +40,13 @@ int bl2u_plat_handle_scp_bl2u(void) INFO("BL2U: Initiating SCP_BL2U transfer to SCP\n"); - ret = scp_bootloader_transfer((void *)scp_bl2u_image_info.image_base, + ret = css_scp_boot_image_xfer((void *)scp_bl2u_image_info.image_base, scp_bl2u_image_info.image_size); if (ret == 0) + ret = css_scp_boot_ready(); + + if (ret == 0) INFO("BL2U: SCP_BL2U transferred to SCP\n"); else ERROR("BL2U: SCP_BL2U transfer failure\n"); diff --git a/plat/arm/css/common/css_common.mk b/plat/arm/css/common/css_common.mk index c2ae92150..9381e4cd2 100644 --- a/plat/arm/css/common/css_common.mk +++ b/plat/arm/css/common/css_common.mk @@ -56,8 +56,8 @@ ifeq (${CSS_LOAD_SCP_IMAGES},1) $(eval $(call FWU_FIP_ADD_IMG,SCP_BL2U,--scp-fwu-cfg)) endif - BL2U_SOURCES += plat/arm/css/common/css_scp_bootloader.c - BL2_SOURCES += plat/arm/css/common/css_scp_bootloader.c + BL2U_SOURCES += plat/arm/css/drivers/scp/css_bom_bootloader.c + BL2_SOURCES += plat/arm/css/drivers/scp/css_bom_bootloader.c endif # Enable option to detect whether the SCP ROM firmware in use predates version diff --git a/plat/arm/css/common/css_scp_bootloader.c b/plat/arm/css/common/css_scp_bootloader.c deleted file mode 100644 index 3db5cf585..000000000 --- a/plat/arm/css/common/css_scp_bootloader.c +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (c) 2014-2016, ARM Limited and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include <arch_helpers.h> -#include <assert.h> -#include <css_def.h> -#include <debug.h> -#include <platform.h> -#include <stdint.h> -#include "../drivers/scpi/css_mhu.h" -#include "../drivers/scpi/css_scpi.h" -#include "css_scp_bootloader.h" - -/* ID of the MHU slot used for the BOM protocol */ -#define BOM_MHU_SLOT_ID 0 - -/* Boot commands sent from AP -> SCP */ -#define BOOT_CMD_INFO 0x00 -#define BOOT_CMD_DATA 0x01 - -/* BOM command header */ -typedef struct { - uint32_t id : 8; - uint32_t reserved : 24; -} bom_cmd_t; - -typedef struct { - uint32_t image_size; - uint32_t checksum; -} cmd_info_payload_t; - -/* - * Unlike the SCPI protocol, the boot protocol uses the same memory region - * for both AP -> SCP and SCP -> AP transfers; define the address of this... - */ -#define BOM_SHARED_MEM PLAT_CSS_SCP_COM_SHARED_MEM_BASE -#define BOM_CMD_HEADER ((bom_cmd_t *) BOM_SHARED_MEM) -#define BOM_CMD_PAYLOAD ((void *) (BOM_SHARED_MEM + sizeof(bom_cmd_t))) - -typedef struct { - /* Offset from the base address of the Trusted RAM */ - uint32_t offset; - uint32_t block_size; -} cmd_data_payload_t; - -static void scp_boot_message_start(void) -{ - mhu_secure_message_start(BOM_MHU_SLOT_ID); -} - -static void scp_boot_message_send(size_t payload_size) -{ - /* Ensure that any write to the BOM payload area is seen by SCP before - * we write to the MHU register. If these 2 writes were reordered by - * the CPU then SCP would read stale payload data */ - dmbst(); - - /* Send command to SCP */ - mhu_secure_message_send(BOM_MHU_SLOT_ID); -} - -static uint32_t scp_boot_message_wait(size_t size) -{ - uint32_t mhu_status; - - mhu_status = mhu_secure_message_wait(); - - /* Expect an SCP Boot Protocol message, reject any other protocol */ - if (mhu_status != (1 << BOM_MHU_SLOT_ID)) { - ERROR("MHU: Unexpected protocol (MHU status: 0x%x)\n", - mhu_status); - panic(); - } - - /* Ensure that any read to the BOM payload area is done after reading - * the MHU register. If these 2 reads were reordered then the CPU would - * read invalid payload data */ - dmbld(); - - return *(uint32_t *) BOM_SHARED_MEM; -} - -static void scp_boot_message_end(void) -{ - mhu_secure_message_end(BOM_MHU_SLOT_ID); -} - -int scp_bootloader_transfer(void *image, unsigned int image_size) -{ - uint32_t response; - uint32_t checksum; - cmd_info_payload_t *cmd_info_payload; - cmd_data_payload_t *cmd_data_payload; - - assert((uintptr_t) image == SCP_BL2_BASE); - - if ((image_size == 0) || (image_size % 4 != 0)) { - ERROR("Invalid size for the SCP_BL2 image. Must be a multiple of " - "4 bytes and not zero (current size = 0x%x)\n", - image_size); - return -1; - } - - /* Extract the checksum from the image */ - checksum = *(uint32_t *) image; - image = (char *) image + sizeof(checksum); - image_size -= sizeof(checksum); - - mhu_secure_init(); - - VERBOSE("Send info about the SCP_BL2 image to be transferred to SCP\n"); - - /* - * Send information about the SCP firmware image about to be transferred - * to SCP - */ - scp_boot_message_start(); - - BOM_CMD_HEADER->id = BOOT_CMD_INFO; - cmd_info_payload = BOM_CMD_PAYLOAD; - cmd_info_payload->image_size = image_size; - cmd_info_payload->checksum = checksum; - - scp_boot_message_send(sizeof(*cmd_info_payload)); -#if CSS_DETECT_PRE_1_7_0_SCP - { - const uint32_t deprecated_scp_nack_cmd = 0x404; - uint32_t mhu_status; - - VERBOSE("Detecting SCP version incompatibility\n"); - - mhu_status = mhu_secure_message_wait(); - if (mhu_status == deprecated_scp_nack_cmd) { - ERROR("Detected an incompatible version of the SCP firmware.\n"); - ERROR("Only versions from v1.7.0 onwards are supported.\n"); - ERROR("Please update the SCP firmware.\n"); - return -1; - } - - VERBOSE("SCP version looks OK\n"); - } -#endif /* CSS_DETECT_PRE_1_7_0_SCP */ - response = scp_boot_message_wait(sizeof(response)); - scp_boot_message_end(); - - if (response != 0) { - ERROR("SCP BOOT_CMD_INFO returned error %u\n", response); - return -1; - } - - VERBOSE("Transferring SCP_BL2 image to SCP\n"); - - /* Transfer SCP_BL2 image to SCP */ - scp_boot_message_start(); - - BOM_CMD_HEADER->id = BOOT_CMD_DATA; - cmd_data_payload = BOM_CMD_PAYLOAD; - cmd_data_payload->offset = (uintptr_t) image - ARM_TRUSTED_SRAM_BASE; - cmd_data_payload->block_size = image_size; - - scp_boot_message_send(sizeof(*cmd_data_payload)); - response = scp_boot_message_wait(sizeof(response)); - scp_boot_message_end(); - - if (response != 0) { - ERROR("SCP BOOT_CMD_DATA returned error %u\n", response); - return -1; - } - - VERBOSE("Waiting for SCP to signal it is ready to go on\n"); - - /* Wait for SCP to signal it's ready */ - return scpi_wait_ready(); -} diff --git a/plat/arm/css/common/css_scp_bootloader.h b/plat/arm/css/common/css_scp_bootloader.h deleted file mode 100644 index 0d6a6a2a5..000000000 --- a/plat/arm/css/common/css_scp_bootloader.h +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright (c) 2014, ARM Limited and Contributors. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef __CSS_SCP_BOOTLOADER_H__ -#define __CSS_SCP_BOOTLOADER_H__ - -int scp_bootloader_transfer(void *image, unsigned int image_size); - -#endif /* __CSS_SCP_BOOTLOADER_H__ */ |