From 74d44a49f89efc02decda22d075276a8a763be45 Mon Sep 17 00:00:00 2001 From: Soby Mathew Date: Wed, 3 May 2017 12:58:41 +0100 Subject: [PATCH] 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 --- plat/arm/css/common/css_bl2_setup.c | 7 +++-- plat/arm/css/common/css_bl2u_setup.c | 9 ++++--- plat/arm/css/common/css_common.mk | 4 +-- plat/arm/css/common/css_scp_bootloader.h | 12 --------- .../scp/css_bom_bootloader.c} | 13 +++------- plat/arm/css/drivers/scp/css_scp.h | 26 ++++++++++++++++--- plat/arm/css/drivers/scpi/css_scpi.h | 12 ++++----- 7 files changed, 45 insertions(+), 38 deletions(-) delete mode 100644 plat/arm/css/common/css_scp_bootloader.h rename plat/arm/css/{common/css_scp_bootloader.c => drivers/scp/css_bom_bootloader.c} (93%) 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 #include #include -#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,9 +34,12 @@ 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 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 #include #include -#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,9 +40,12 @@ 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 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.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__ */ diff --git a/plat/arm/css/common/css_scp_bootloader.c b/plat/arm/css/drivers/scp/css_bom_bootloader.c similarity index 93% rename from plat/arm/css/common/css_scp_bootloader.c rename to plat/arm/css/drivers/scp/css_bom_bootloader.c index 3db5cf585..e4a44fe64 100644 --- a/plat/arm/css/common/css_scp_bootloader.c +++ b/plat/arm/css/drivers/scp/css_bom_bootloader.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2016, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2014-2017, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -10,9 +10,7 @@ #include #include #include -#include "../drivers/scpi/css_mhu.h" -#include "../drivers/scpi/css_scpi.h" -#include "css_scp_bootloader.h" +#include "../scpi/css_mhu.h" /* ID of the MHU slot used for the BOM protocol */ #define BOM_MHU_SLOT_ID 0 @@ -88,7 +86,7 @@ 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) +int css_scp_boot_image_xfer(void *image, unsigned int image_size) { uint32_t response; uint32_t checksum; @@ -170,8 +168,5 @@ int scp_bootloader_transfer(void *image, unsigned int image_size) 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(); + return 0; } diff --git a/plat/arm/css/drivers/scp/css_scp.h b/plat/arm/css/drivers/scp/css_scp.h index 165226d28..097a9f587 100644 --- a/plat/arm/css/drivers/scp/css_scp.h +++ b/plat/arm/css/drivers/scp/css_scp.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -7,13 +7,31 @@ #ifndef __CSS_SCP_H__ #define __CSS_SCP_H__ -#include +#include +#include "../scpi/css_scpi.h" -void css_scp_suspend(const psci_power_state_t *target_state); -void css_scp_off(const psci_power_state_t *target_state); +/* Forward declarations */ +struct psci_power_state; + +/* API for power management by SCP */ +void css_scp_suspend(const struct psci_power_state *target_state); +void css_scp_off(const struct psci_power_state *target_state); void css_scp_on(u_register_t mpidr); int css_scp_get_power_state(u_register_t mpidr, unsigned int power_level); void __dead2 css_scp_sys_shutdown(void); void __dead2 css_scp_sys_reboot(void); +/* API for SCP Boot Image transfer. Return 0 on success, -1 on error */ +int css_scp_boot_image_xfer(void *image, unsigned int image_size); + +/* + * API to wait for SCP to signal till it's ready after booting the transferred + * image. + */ +static inline int css_scp_boot_ready(void) +{ + VERBOSE("Waiting for SCP to signal it is ready to go on\n"); + return scpi_wait_ready(); +} + #endif /* __CSS_SCP_H__ */ diff --git a/plat/arm/css/drivers/scpi/css_scpi.h b/plat/arm/css/drivers/scpi/css_scpi.h index 0e26c3df2..2a7e624ab 100644 --- a/plat/arm/css/drivers/scpi/css_scpi.h +++ b/plat/arm/css/drivers/scpi/css_scpi.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2016, ARM Limited and Contributors. All rights reserved. + * Copyright (c) 2014-2017, ARM Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -97,11 +97,11 @@ typedef enum { scpi_system_reset = 2 } scpi_system_state_t; -extern int scpi_wait_ready(void); -extern void scpi_set_css_power_state(unsigned int mpidr, - scpi_power_state_t cpu_state, - scpi_power_state_t cluster_state, - scpi_power_state_t css_state); +int scpi_wait_ready(void); +void scpi_set_css_power_state(unsigned int mpidr, + scpi_power_state_t cpu_state, + scpi_power_state_t cluster_state, + scpi_power_state_t css_state); int scpi_get_css_power_state(unsigned int mpidr, unsigned int *cpu_state_p, unsigned int *cluster_state_p); uint32_t scpi_sys_power_state(scpi_system_state_t system_state);