Merge changes from topic "fw-update-2" into integration

* changes:
  feat(sw_crc32): add software CRC32 support
  refactor(hw_crc32): renamed hw_crc32 to tf_crc32
  feat(fwu): avoid booting with an alternate boot source
  docs(fwu): add firmware update documentation
  feat(fwu): avoid NV counter upgrade in trial run state
  feat(plat/arm): add FWU support in Arm platforms
  feat(fwu): initialize FWU driver in BL2
  feat(fwu): add FWU driver
  feat(fwu): introduce FWU platform-specific functions declarations
  docs(fwu_metadata): add FWU metadata build options
  feat(fwu_metadata): add FWU metadata header and build options
This commit is contained in:
Madhukar Pappireddy 2021-08-02 22:53:50 +02:00 committed by TrustedFirmware Code Review
commit 5e4e13e173
22 changed files with 572 additions and 36 deletions

View file

@ -746,6 +746,10 @@ ifeq ($(MEASURED_BOOT),1)
endif
endif
ifeq ($(PSA_FWU_SUPPORT),1)
$(info PSA_FWU_SUPPORT is an experimental feature)
endif
ifeq (${ARM_XLAT_TABLES_LIB_V1}, 1)
ifeq (${ALLOW_RO_XLAT_TABLES}, 1)
$(error "ALLOW_RO_XLAT_TABLES requires translation tables library v2")
@ -959,6 +963,7 @@ $(eval $(call assert_booleans,\
USE_SP804_TIMER \
ENABLE_FEAT_RNG \
ENABLE_FEAT_SB \
PSA_FWU_SUPPORT \
)))
$(eval $(call assert_numerics,\
@ -967,6 +972,8 @@ $(eval $(call assert_numerics,\
ARM_ARCH_MINOR \
BRANCH_PROTECTION \
FW_ENC_STATUS \
NR_OF_FW_BANKS \
NR_OF_IMAGES_IN_FW_BANK \
)))
ifdef KEY_SIZE
@ -1054,6 +1061,9 @@ $(eval $(call add_defines,\
USE_SP804_TIMER \
ENABLE_FEAT_RNG \
ENABLE_FEAT_SB \
NR_OF_FW_BANKS \
NR_OF_IMAGES_IN_FW_BANK \
PSA_FWU_SUPPORT \
)))
ifeq (${SANITIZE_UB},trap)

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013-2020, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2013-2021, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@ -14,6 +14,7 @@
#include <common/debug.h>
#include <drivers/auth/auth_mod.h>
#include <drivers/console.h>
#include <drivers/fwu/fwu.h>
#if MEASURED_BOOT
#include <drivers/measured_boot/measured_boot.h>
#endif
@ -88,6 +89,10 @@ void bl2_main(void)
/* Perform remaining generic architectural setup in S-EL1 */
bl2_arch_setup();
#if PSA_FWU_SUPPORT
fwu_init();
#endif /* PSA_FWU_SUPPORT */
#if TRUSTED_BOARD_BOOT
/* Initialize authentication module */
auth_mod_init();

View file

@ -239,9 +239,18 @@ int load_auth_image(unsigned int image_id, image_info_t *image_data)
{
int err;
/*
* All firmware banks should be part of the same non-volatile storage as per
* PSA FWU specification, hence don't check for any alternate boot source
* when PSA FWU is enabled.
*/
#if PSA_FWU_SUPPORT
err = load_auth_image_internal(image_id, image_data);
#else
do {
err = load_auth_image_internal(image_id, image_data);
} while ((err != 0) && (plat_try_next_boot_source() != 0));
#endif /* PSA_FWU_SUPPORT */
return err;
}

View file

@ -9,8 +9,9 @@
#include <arm_acle.h>
#include <common/debug.h>
#include <common/tf_crc32.h>
/* hw_crc32 - compute CRC using Arm intrinsic function
/* compute CRC using Arm intrinsic function
*
* This function is useful for the platforms with the CPU ARMv8.0
* (with CRC instructions supported), and onwards.
@ -23,7 +24,7 @@
*
* Return calculated CRC value
*/
uint32_t hw_crc32(uint32_t crc, const unsigned char *buf, size_t size)
uint32_t tf_crc32(uint32_t crc, const unsigned char *buf, size_t size)
{
assert(buf != NULL);

View file

@ -860,9 +860,31 @@ commands can be used:
# Resume execution
continue
Firmware update options
-----------------------
- ``NR_OF_FW_BANKS``: Define the number of firmware banks. This flag is used
in defining the firmware update metadata structure. This flag is by default
set to '2'.
- ``NR_OF_IMAGES_IN_FW_BANK``: Define the number of firmware images in each
firmware bank. Each firmware bank must have the same number of images as per
the `PSA FW update specification`_.
This flag is used in defining the firmware update metadata structure. This
flag is by default set to '1'.
- ``PSA_FWU_SUPPORT``: Enable the firmware update mechanism as per the
`PSA FW update specification`_. The default value is 0, and this is an
experimental feature.
PSA firmware update implementation has some limitations, such as BL2 is
not part of the protocol-updatable images, if BL2 needs to be updated, then
it should be done through another platform-defined mechanism, and it assumes
that the platform's hardware supports CRC32 instructions.
--------------
*Copyright (c) 2019-2021, Arm Limited. All rights reserved.*
.. _DEN0115: https://developer.arm.com/docs/den0115/latest
.. _PSA FW update specification: https://developer.arm.com/documentation/den0118/a/

View file

@ -894,6 +894,54 @@ On success the function should return 0 and a negative error code otherwise.
Note that this API depends on ``DECRYPTION_SUPPORT`` build flag which is
marked as experimental.
Function : plat_fwu_set_images_source() [when PSA_FWU_SUPPORT == 1]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
::
Argument : struct fwu_metadata *metadata
Return : void
This function is mandatory when PSA_FWU_SUPPORT is enabled.
It provides a means to retrieve image specification (offset in
non-volatile storage and length) of active/updated images using the passed
FWU metadata, and update I/O policies of active/updated images using retrieved
image specification information.
Further I/O layer operations such as I/O open, I/O read, etc. on these
images rely on this function call.
In Arm platforms, this function is used to set an I/O policy of the FIP image,
container of all active/updated secure and non-secure images.
Function : plat_fwu_set_metadata_image_source() [when PSA_FWU_SUPPORT == 1]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
::
Argument : unsigned int image_id, uintptr_t *dev_handle,
uintptr_t *image_spec
Return : int
This function is mandatory when PSA_FWU_SUPPORT is enabled. It is
responsible for setting up the platform I/O policy of the requested metadata
image (either FWU_METADATA_IMAGE_ID or BKUP_FWU_METADATA_IMAGE_ID) that will
be used to load this image from the platform's non-volatile storage.
FWU metadata can not be always stored as a raw image in non-volatile storage
to define its image specification (offset in non-volatile storage and length)
statically in I/O policy.
For example, the FWU metadata image is stored as a partition inside the GUID
partition table image. Its specification is defined in the partition table
that needs to be parsed dynamically.
This function provides a means to retrieve such dynamic information to set
the I/O policy of the FWU metadata image.
Further I/O layer operations such as I/O open, I/O read, etc. on FWU metadata
image relies on this function call.
It returns '0' on success, otherwise a negative error value on error.
Alongside, returns device handle and image specification from the I/O policy
of the requested FWU metadata image.
Common optional modifications
-----------------------------

View file

@ -30,6 +30,7 @@ such as:
- `SMC Calling Convention`_
- `System Control and Management Interface (SCMI)`_
- `Software Delegated Exception Interface (SDEI)`_
- `PSA FW update specification`_
Where possible, the code is designed for reuse or porting to other Armv7-A and
Armv8-A model and hardware platforms.
@ -92,3 +93,4 @@ have previously been raised against the software.
.. _System Control and Management Interface (SCMI): http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/DEN0056A_System_Control_and_Management_Interface.pdf
.. _Software Delegated Exception Interface (SDEI): http://infocenter.arm.com/help/topic/com.arm.doc.den0054a/ARM_DEN0054A_Software_Delegated_Exception_Interface.pdf
.. _SMC Calling Convention: https://developer.arm.com/docs/den0028/latest
.. _PSA FW update specification: https://developer.arm.com/documentation/den0118/a/

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2015-2020, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2015-2021, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@ -16,6 +16,7 @@
#include <drivers/auth/auth_mod.h>
#include <drivers/auth/crypto_mod.h>
#include <drivers/auth/img_parser_mod.h>
#include <drivers/fwu/fwu.h>
#include <lib/fconf/fconf_tbbr_getter.h>
#include <plat/common/platform.h>
@ -242,6 +243,7 @@ static int auth_nvctr(const auth_method_param_nv_ctr_t *param,
unsigned int data_len, len, i;
unsigned int plat_nv_ctr;
int rc = 0;
bool is_trial_run = false;
/* Get the counter value from current image. The AM expects the IPM
* to return the counter value as a DER encoded integer */
@ -284,7 +286,10 @@ static int auth_nvctr(const auth_method_param_nv_ctr_t *param,
/* Invalid NV-counter */
return 1;
} else if (*cert_nv_ctr > plat_nv_ctr) {
*need_nv_ctr_upgrade = true;
#if PSA_FWU_SUPPORT && IMAGE_BL2
is_trial_run = fwu_is_trial_run_state();
#endif /* PSA_FWU_SUPPORT && IMAGE_BL2 */
*need_nv_ctr_upgrade = !is_trial_run;
}
return 0;

187
drivers/fwu/fwu.c Normal file
View file

@ -0,0 +1,187 @@
/*
* Copyright (c) 2021, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <assert.h>
#include <common/debug.h>
#include <common/tf_crc32.h>
#include <common/tbbr/tbbr_img_def.h>
#include <drivers/fwu/fwu.h>
#include <drivers/fwu/fwu_metadata.h>
#include <drivers/io/io_storage.h>
#include <plat/common/platform.h>
/*
* Assert that crc_32 is the first member of fwu_metadata structure.
* It avoids accessing data outside of the metadata structure during
* CRC32 computation if the crc_32 field gets moved due the structure
* member(s) addition in the future.
*/
CASSERT((offsetof(struct fwu_metadata, crc_32) == 0),
crc_32_must_be_first_member_of_structure);
static struct fwu_metadata metadata;
static bool is_fwu_initialized;
/*******************************************************************************
* Compute CRC32 of the FWU metadata, and check it against the CRC32 value
* present in the FWU metadata.
*
* return -1 on error, otherwise 0
******************************************************************************/
static int fwu_metadata_crc_check(void)
{
unsigned char *data = (unsigned char *)&metadata;
uint32_t calc_crc = tf_crc32(0U, data + sizeof(metadata.crc_32),
(sizeof(metadata) -
sizeof(metadata.crc_32)));
if (metadata.crc_32 != calc_crc) {
return -1;
}
return 0;
}
/*******************************************************************************
* Check the sanity of FWU metadata.
*
* return -1 on error, otherwise 0
******************************************************************************/
static int fwu_metadata_sanity_check(void)
{
/* ToDo: add more conditions for sanity check */
if ((metadata.active_index >= NR_OF_FW_BANKS) ||
(metadata.previous_active_index >= NR_OF_FW_BANKS)) {
return -1;
}
return 0;
}
/*******************************************************************************
* Verify and load specified FWU metadata image to local FWU metadata structure.
*
* @image_id: FWU metadata image id (either FWU_METADATA_IMAGE_ID or
* BKUP_FWU_METADATA_IMAGE_ID)
*
* return a negative value on error, otherwise 0
******************************************************************************/
static int fwu_metadata_load(unsigned int image_id)
{
int result;
uintptr_t dev_handle, image_handle, image_spec;
size_t bytes_read;
assert((image_id == FWU_METADATA_IMAGE_ID) ||
(image_id == BKUP_FWU_METADATA_IMAGE_ID));
result = plat_fwu_set_metadata_image_source(image_id,
&dev_handle,
&image_spec);
if (result != 0) {
WARN("Failed to set reference to image id=%u (%i)\n",
image_id, result);
return result;
}
result = io_open(dev_handle, image_spec, &image_handle);
if (result != 0) {
WARN("Failed to load image id id=%u (%i)\n",
image_id, result);
return result;
}
result = io_read(image_handle, (uintptr_t)&metadata,
sizeof(struct fwu_metadata), &bytes_read);
if (result != 0) {
WARN("Failed to read image id=%u (%i)\n", image_id, result);
goto exit;
}
if (sizeof(struct fwu_metadata) != bytes_read) {
/* return -1 in case of partial/no read */
result = -1;
WARN("Read bytes (%zu) instead of expected (%zu) bytes\n",
bytes_read, sizeof(struct fwu_metadata));
goto exit;
}
/* sanity check on loaded parameters */
result = fwu_metadata_sanity_check();
if (result != 0) {
WARN("Sanity %s\n", "check failed on FWU metadata");
goto exit;
}
/* CRC check on loaded parameters */
result = fwu_metadata_crc_check();
if (result != 0) {
WARN("CRC %s\n", "check failed on FWU metadata");
}
exit:
(void)io_close(image_handle);
return result;
}
/*******************************************************************************
* The system runs in the trial run state if any of the images in the active
* firmware bank has not been accepted yet.
*
* Returns true if the system is running in the trial state.
******************************************************************************/
bool fwu_is_trial_run_state(void)
{
bool trial_run = false;
assert(is_fwu_initialized == true);
for (unsigned int i = 0U; i < NR_OF_IMAGES_IN_FW_BANK; i++) {
struct fwu_image_entry *entry = &metadata.img_entry[i];
struct fwu_image_properties *img_props =
&entry->img_props[metadata.active_index];
if (img_props->accepted == 0) {
trial_run = true;
break;
}
}
return trial_run;
}
/*******************************************************************************
* Load verified copy of FWU metadata image kept in the platform NV storage
* into local FWU metadata structure.
* Also, update platform I/O policies with the offset address and length of
* firmware-updated images kept in the platform NV storage.
******************************************************************************/
void fwu_init(void)
{
/* Load FWU metadata which will be used to load the images in the
* active bank as per PSA FWU specification
*/
int result = fwu_metadata_load(FWU_METADATA_IMAGE_ID);
if (result != 0) {
WARN("loading of FWU-Metadata failed, "
"using Bkup-FWU-Metadata\n");
result = fwu_metadata_load(BKUP_FWU_METADATA_IMAGE_ID);
if (result != 0) {
ERROR("loading of Bkup-FWU-Metadata failed\n");
panic();
}
}
plat_fwu_set_images_source(&metadata);
is_fwu_initialized = true;
}

11
drivers/fwu/fwu.mk Normal file
View file

@ -0,0 +1,11 @@
#
# Copyright (c) 2021, Arm Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
FWU_SRC_DIR := drivers/fwu/
FWU_SRCS := ${FWU_SRC_DIR}fwu.c
BL2_SOURCES += ${FWU_SRCS}

View file

@ -4,13 +4,13 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef HW_CRC32_H
#define HW_CRC32_H
#ifndef TF_CRC32_H
#define TF_CRC32_H
#include <stddef.h>
#include <stdint.h>
/* compute CRC using Arm intrinsic function */
uint32_t hw_crc32(uint32_t crc, const unsigned char *buf, size_t size);
uint32_t tf_crc32(uint32_t crc, const unsigned char *buf, size_t size);
#endif /* HW_CRC32_H */
#endif /* TF_CRC32_H */

15
include/drivers/fwu/fwu.h Normal file
View file

@ -0,0 +1,15 @@
/*
* Copyright (c) 2021, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef FWU_H
#define FWU_H
#include <stdbool.h>
void fwu_init(void);
bool fwu_is_trial_run_state(void);
#endif /* FWU_H */

View file

@ -0,0 +1,74 @@
/*
* Copyright (c) 2021, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*
* FWU metadata information as per the specification section 4.1:
* https://developer.arm.com/documentation/den0118/a/
*
*/
#ifndef FWU_METADATA_H
#define FWU_METADATA_H
#include <stdint.h>
#include <tools_share/uuid.h>
/* Properties of image in a bank */
struct fwu_image_properties {
/* UUID of the image in this bank */
uuid_t img_uuid;
/* [0]: bit describing the image acceptance status
* 1 means the image is accepted
* [31:1]: MBZ
*/
uint32_t accepted;
/* reserved (MBZ) */
uint32_t reserved;
} __packed;
/* Image entry information */
struct fwu_image_entry {
/* UUID identifying the image type */
uuid_t img_type_uuid;
/* UUID of the storage volume where the image is located */
uuid_t location_uuid;
/* Properties of images with img_type_uuid in the different FW banks */
struct fwu_image_properties img_props[NR_OF_FW_BANKS];
} __packed;
/*
* FWU metadata filled by the updater and consumed by TF-A for
* various purposes as below:
* 1. Get active FW bank.
* 2. Rollback to previous working FW bank.
* 3. Get properties of all images present in all banks.
*/
struct fwu_metadata {
/* Metadata CRC value */
uint32_t crc_32;
/* Metadata version */
uint32_t version;
/* Bank index with which device boots */
uint32_t active_index;
/* Previous bank index with which device booted successfully */
uint32_t previous_active_index;
/* Image entry information */
struct fwu_image_entry img_entry[NR_OF_IMAGES_IN_FW_BANK];
} __packed;
#endif /* FWU_METADATA_H */

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2019-2020, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2019-2021, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@ -91,7 +91,17 @@
/* FW_CONFIG */
#define FW_CONFIG_ID U(31)
/*
* Primary FWU metadata image ID
*/
#define FWU_METADATA_IMAGE_ID U(32)
/*
* Backup FWU metadata image ID
*/
#define BKUP_FWU_METADATA_IMAGE_ID U(33)
/* Max Images */
#define MAX_IMAGE_IDS U(32)
#define MAX_IMAGE_IDS U(34)
#endif /* ARM_TRUSTED_FIRMWARE_EXPORT_COMMON_TBBR_TBBR_IMG_DEF_EXP_H */

View file

@ -153,7 +153,9 @@ void arm_setup_romlib(void);
int arm_io_setup(void);
/* Set image specification in IO block policy */
int arm_set_image_source(unsigned int image_id, const char *part_name);
int arm_set_image_source(unsigned int image_id, const char *part_name,
uintptr_t *dev_handle, uintptr_t *image_spec);
void arm_set_fip_addr(uint32_t active_fw_bank_idx);
/* Security utility functions */
void arm_tzc400_setup(uintptr_t tzc_base,

View file

@ -16,6 +16,7 @@
#if TRNG_SUPPORT
#include "plat_trng.h"
#endif
#include <drivers/fwu/fwu_metadata.h>
/*******************************************************************************
* Forward declarations
@ -349,4 +350,12 @@ int32_t plat_get_soc_revision(void);
*/
int32_t plat_is_smccc_feature_available(u_register_t fid);
/*******************************************************************************
* FWU platform specific functions
******************************************************************************/
int plat_fwu_set_metadata_image_source(unsigned int image_id,
uintptr_t *dev_handle,
uintptr_t *image_spec);
void plat_fwu_set_images_source(struct fwu_metadata *metadata);
#endif /* PLATFORM_H */

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2018-2021, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@ -9,6 +9,7 @@
#include <string.h>
#include <common/debug.h>
#include <common/tf_crc32.h>
#include <lib/utils.h>
#include <tf_gunzip.h>
@ -100,3 +101,15 @@ int gunzip(uintptr_t *in_buf, size_t in_len, uintptr_t *out_buf,
return ret;
}
/* Wrapper function to calculate CRC
* @crc: previous accumulated CRC
* @buf: buffer base address
* @size: size of the buffer
*
* Return calculated CRC32 value
*/
uint32_t tf_crc32(uint32_t crc, const unsigned char *buf, size_t size)
{
return (uint32_t)crc32((unsigned long)crc, buf, size);
}

View file

@ -344,3 +344,14 @@ OPENSSL_DIR := /usr
# Build option to use the SP804 timer instead of the generic one
USE_SP804_TIMER := 0
# Build option to define number of firmware banks, used in firmware update
# metadata structure.
NR_OF_FW_BANKS := 2
# Build option to define number of images in firmware bank, used in firmware
# update metadata structure.
NR_OF_IMAGES_IN_FW_BANK := 1
# Disable Firmware update support by default
PSA_FWU_SUPPORT := 0

View file

@ -94,13 +94,10 @@ void bl2_plat_preload_setup(void)
{
arm_bl2_dyn_cfg_init();
#if ARM_GPT_SUPPORT
int result = arm_set_image_source(FIP_IMAGE_ID, "FIP_A");
if (result != 0) {
panic();
}
#endif /* ARM_GPT_SUPPORT */
#if ARM_GPT_SUPPORT && !PSA_FWU_SUPPORT
/* Always use the FIP from bank 0 */
arm_set_fip_addr(0U);
#endif /* ARM_GPT_SUPPORT && !PSA_FWU_SUPPORT */
}
/*

View file

@ -185,6 +185,18 @@ ifeq (${ARM_ARCH_MINOR},0)
BL2_CPPFLAGS += -march=armv8-a+crc
endif
ifeq ($(PSA_FWU_SUPPORT),1)
# GPT support is recommended as per PSA FWU specification hence
# PSA FWU implementation is tightly coupled with GPT support,
# and it does not support other formats.
ifneq ($(ARM_GPT_SUPPORT),1)
$(error For PSA_FWU_SUPPORT, ARM_GPT_SUPPORT must be enabled)
endif
FWU_MK := drivers/fwu/fwu.mk
$(info Including ${FWU_MK})
include ${FWU_MK}
endif
ifeq (${ARCH}, aarch64)
PLAT_INCLUDES += -Iinclude/plat/arm/common/aarch64
endif
@ -230,7 +242,7 @@ BL2_SOURCES += drivers/delay_timer/delay_timer.c \
drivers/io/io_storage.c \
plat/arm/common/arm_bl2_setup.c \
plat/arm/common/arm_err.c \
common/hw_crc32.c \
common/tf_crc32.c \
${ARM_IO_SOURCES}
# Firmware Configuration Framework sources

View file

@ -5,6 +5,7 @@
*/
#include <common/debug.h>
#include <drivers/fwu/fwu_metadata.h>
#include <drivers/io/io_driver.h>
#include <drivers/io/io_fip.h>
#include <drivers/io/io_memmap.h>
@ -24,6 +25,13 @@ uintptr_t fip_dev_handle;
static const io_dev_connector_t *memmap_dev_con;
uintptr_t memmap_dev_handle;
#if ARM_GPT_SUPPORT
/* fip partition names */
static const char * const fip_part_names[] = {"FIP_A", "FIP_B"};
CASSERT(sizeof(fip_part_names)/sizeof(char *) == NR_OF_FW_BANKS,
assert_fip_partition_names_missing);
#endif /* ARM_GPT_SUPPORT */
/* Weak definitions may be overridden in specific ARM standard platform */
#pragma weak plat_arm_io_setup
#pragma weak plat_arm_get_alt_image_source
@ -139,17 +147,20 @@ bool arm_io_is_toc_valid(void)
}
#if ARM_GPT_SUPPORT
/**********************************************************************
* arm_set_image_source: Set image specification in IO policy
/******************************************************************************
* Retrieve partition entry details such as offset and length, and set these
* details in the I/O policy of the requested image.
*
* @image_id: id of the image whose specification to be set
* @image_id: image id whose I/O policy to be updated
*
* @part_name: name of the partition that to be read for entry details
* @part_name: partition name whose details to be retrieved
*
* set the entry and offset details of partition in global IO policy
* of the image
*********************************************************************/
int arm_set_image_source(unsigned int image_id, const char *part_name)
* Returns 0 on success, error otherwise
* Alongside, returns device handle and image specification of requested
* image.
******************************************************************************/
int arm_set_image_source(unsigned int image_id, const char *part_name,
uintptr_t *dev_handle, uintptr_t *image_spec)
{
const partition_entry_t *entry = get_partition_entry(part_name);
@ -158,19 +169,82 @@ int arm_set_image_source(unsigned int image_id, const char *part_name)
return -ENOENT;
}
const struct plat_io_policy *policy = FCONF_GET_PROPERTY(arm,
io_policies,
image_id);
struct plat_io_policy *policy = FCONF_GET_PROPERTY(arm,
io_policies,
image_id);
assert(policy != NULL);
assert(policy->image_spec != 0UL);
io_block_spec_t *spec = (io_block_spec_t *)policy->image_spec;
/* set offset and length of the image */
io_block_spec_t *image_spec = (io_block_spec_t *)policy->image_spec;
spec->offset = PLAT_ARM_FLASH_IMAGE_BASE + entry->start;
spec->length = entry->length;
image_spec->offset = PLAT_ARM_FLASH_IMAGE_BASE + entry->start;
image_spec->length = entry->length;
*dev_handle = *(policy->dev_handle);
*image_spec = policy->image_spec;
return 0;
}
#endif
/*******************************************************************************
* Set the source offset and length of the FIP image in its I/O policy.
*
* @active_fw_bank_idx: active firmware bank index gathered from FWU metadata.
******************************************************************************/
void arm_set_fip_addr(uint32_t active_fw_bank_idx)
{
uintptr_t dev_handle __unused;
uintptr_t image_spec __unused;
assert(active_fw_bank_idx < NR_OF_FW_BANKS);
INFO("Booting with partition %s\n", fip_part_names[active_fw_bank_idx]);
int result = arm_set_image_source(FIP_IMAGE_ID,
fip_part_names[active_fw_bank_idx],
&dev_handle,
&image_spec);
if (result != 0) {
panic();
}
}
#endif /* ARM_GPT_SUPPORT */
#if PSA_FWU_SUPPORT
/*******************************************************************************
* Read the FIP partition of the GPT image corresponding to the active firmware
* bank to get its offset and length, and update these details in the I/O policy
* of the FIP image.
******************************************************************************/
void plat_fwu_set_images_source(struct fwu_metadata *metadata)
{
arm_set_fip_addr(metadata->active_index);
}
/*******************************************************************************
* Read the requested FWU metadata partition of the GPT image to get its offset
* and length, and update these details in the I/O policy of the requested FWU
* metadata image.
******************************************************************************/
int plat_fwu_set_metadata_image_source(unsigned int image_id,
uintptr_t *dev_handle,
uintptr_t *image_spec)
{
int result = -1;
if (image_id == FWU_METADATA_IMAGE_ID) {
result = arm_set_image_source(FWU_METADATA_IMAGE_ID,
"FWU-Metadata",
dev_handle,
image_spec);
} else if (image_id == BKUP_FWU_METADATA_IMAGE_ID) {
result = arm_set_image_source(BKUP_FWU_METADATA_IMAGE_ID,
"Bkup-FWU-Metadata",
dev_handle,
image_spec);
}
return result;
}
#endif /* PSA_FWU_SUPPORT */

View file

@ -18,6 +18,11 @@
#include <plat/arm/common/arm_fconf_io_storage.h>
#include <platform_def.h>
#if PSA_FWU_SUPPORT
/* metadata entry details */
static io_block_spec_t fwu_metadata_spec;
#endif /* PSA_FWU_SUPPORT */
io_block_spec_t fip_block_spec = {
/*
* This is fixed FIP address used by BL1, BL2 loads partition table
@ -92,6 +97,20 @@ struct plat_io_policy policies[MAX_NUMBER_IDS] = {
open_memmap
},
#endif /* ARM_GPT_SUPPORT */
#if PSA_FWU_SUPPORT
[FWU_METADATA_IMAGE_ID] = {
&memmap_dev_handle,
/* filled runtime from partition information */
(uintptr_t)&fwu_metadata_spec,
open_memmap
},
[BKUP_FWU_METADATA_IMAGE_ID] = {
&memmap_dev_handle,
/* filled runtime from partition information */
(uintptr_t)&fwu_metadata_spec,
open_memmap
},
#endif /* PSA_FWU_SUPPORT */
[FIP_IMAGE_ID] = {
&memmap_dev_handle,
(uintptr_t)&fip_block_spec,