mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-16 09:34:18 +00:00
fconf: Move platform io policies into fconf
Use the firmware configuration framework to store the io_policies information inside the configuration device tree instead of the static structure in the code base. The io_policies required by BL1 can't be inside the dtb, as this one is loaded by BL1, and only available at BL2. This change currently only applies to FVP platform. Change-Id: Ic9c1ac3931a4a136aa36f7f58f66d3764c1bfca1 Signed-off-by: Louis Mayencourt <louis.mayencourt@arm.com>
This commit is contained in:
parent
6c97231760
commit
0a6e7e3b76
12 changed files with 386 additions and 5 deletions
2
Makefile
2
Makefile
|
@ -777,6 +777,7 @@ $(eval $(call assert_boolean,SPM_MM))
|
|||
$(eval $(call assert_boolean,TRUSTED_BOARD_BOOT))
|
||||
$(eval $(call assert_boolean,USE_COHERENT_MEM))
|
||||
$(eval $(call assert_boolean,USE_DEBUGFS))
|
||||
$(eval $(call assert_boolean,USE_FCONF_BASED_IO))
|
||||
$(eval $(call assert_boolean,USE_ROMLIB))
|
||||
$(eval $(call assert_boolean,USE_TBBR_DEFS))
|
||||
$(eval $(call assert_boolean,WARMBOOT_ENABLE_DCACHE_EARLY))
|
||||
|
@ -845,6 +846,7 @@ $(eval $(call add_define,SPM_MM))
|
|||
$(eval $(call add_define,TRUSTED_BOARD_BOOT))
|
||||
$(eval $(call add_define,USE_COHERENT_MEM))
|
||||
$(eval $(call add_define,USE_DEBUGFS))
|
||||
$(eval $(call add_define,USE_FCONF_BASED_IO))
|
||||
$(eval $(call add_define,USE_ROMLIB))
|
||||
$(eval $(call add_define,USE_TBBR_DEFS))
|
||||
$(eval $(call add_define,WARMBOOT_ENABLE_DCACHE_EARLY))
|
||||
|
|
|
@ -578,6 +578,11 @@ Common build options
|
|||
exposing a virtual filesystem interface through BL31 as a SiP SMC function.
|
||||
Default is 0.
|
||||
|
||||
- ``USE_FCONF_BASED_IO``: This flag determines whether to use IO based on the
|
||||
firmware configuration framework. This allows moving the io_policies into a
|
||||
configuration device tree, instead of static structure in the code base.
|
||||
|
||||
|
||||
- ``USE_ROMLIB``: This flag determines whether library at ROM will be used.
|
||||
This feature creates a library of functions to be placed in ROM and thus
|
||||
reduces SRAM usage. Refer to :ref:`Library at ROM` for further details. Default
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2014-2019, ARM Limited and Contributors. All rights reserved.
|
||||
* Copyright (c) 2014-2020, ARM Limited and Contributors. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
@ -53,7 +53,7 @@ typedef struct io_file_spec {
|
|||
/* UUID specification - used to refer to data accessed using UUIDs (i.e. FIP
|
||||
* images) */
|
||||
typedef struct io_uuid_spec {
|
||||
const uuid_t uuid;
|
||||
uuid_t uuid;
|
||||
} io_uuid_spec_t;
|
||||
|
||||
/* Block specification - used to refer to data on a device supporting
|
||||
|
|
24
include/plat/arm/common/arm_fconf_getter.h
Normal file
24
include/plat/arm/common/arm_fconf_getter.h
Normal file
|
@ -0,0 +1,24 @@
|
|||
/*
|
||||
* Copyright (c) 2019-2020, ARM Limited. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#ifndef ARM_FCONF_GETTER
|
||||
#define ARM_FCONF_GETTER
|
||||
|
||||
#include <lib/fconf/fconf.h>
|
||||
|
||||
/* ARM io policies */
|
||||
#define arm__io_policies_getter(id) &policies[id]
|
||||
|
||||
struct plat_io_policy {
|
||||
uintptr_t *dev_handle;
|
||||
uintptr_t image_spec;
|
||||
int (*check)(const uintptr_t spec);
|
||||
};
|
||||
|
||||
extern struct plat_io_policy policies[];
|
||||
int fconf_populate_arm_io_policies(uintptr_t config);
|
||||
|
||||
#endif /* ARM_FCONF_GETTER */
|
19
include/plat/arm/common/arm_fconf_io_storage.h
Normal file
19
include/plat/arm/common/arm_fconf_io_storage.h
Normal file
|
@ -0,0 +1,19 @@
|
|||
/*
|
||||
* Copyright (c) 2020, ARM Limited. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
#ifndef ARM_FCONF_IO_STORAGE_H
|
||||
#define ARM_FCONF_IO_STORAGE_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/* IO devices handle */
|
||||
extern uintptr_t memmap_dev_handle;
|
||||
extern uintptr_t fip_dev_handle;
|
||||
|
||||
/* Function declarations */
|
||||
int open_fip(const uintptr_t spec);
|
||||
int open_memmap(const uintptr_t spec);
|
||||
|
||||
#endif /* ARM_FCONF_IO_STORAGE_H */
|
|
@ -27,7 +27,7 @@
|
|||
*/
|
||||
|
||||
/*
|
||||
* Portions copyright (c) 2014, ARM Limited and Contributors.
|
||||
* Portions copyright (c) 2014-2020, ARM Limited and Contributors.
|
||||
* All rights reserved.
|
||||
*/
|
||||
|
||||
|
@ -56,6 +56,11 @@ struct uuid {
|
|||
uint8_t node[_UUID_NODE_LEN];
|
||||
};
|
||||
|
||||
union uuid_helper_t {
|
||||
struct uuid uuid_struct;
|
||||
uint32_t word[4];
|
||||
};
|
||||
|
||||
/* XXX namespace pollution? */
|
||||
typedef struct uuid uuid_t;
|
||||
|
||||
|
|
|
@ -201,6 +201,9 @@ USE_COHERENT_MEM := 1
|
|||
# Build option to add debugfs support
|
||||
USE_DEBUGFS := 0
|
||||
|
||||
# Build option to fconf based io
|
||||
USE_FCONF_BASED_IO := 0
|
||||
|
||||
# Build option to choose whether Trusted Firmware uses library at ROM
|
||||
USE_ROMLIB := 0
|
||||
|
||||
|
|
|
@ -68,4 +68,29 @@
|
|||
mbedtls_heap_addr = <0x0 0x0>;
|
||||
mbedtls_heap_size = <0x0>;
|
||||
};
|
||||
|
||||
arm-io_policies {
|
||||
fip-handles {
|
||||
compatible = "arm,io-fip-handle";
|
||||
scp_bl2_uuid = <0x3dfd6697 0x49e8be89 0xa1785dae 0x13826040>;
|
||||
bl31_uuid = <0x6d08d447 0x4698fe4c 0x5029959b 0x005abdcb>;
|
||||
bl32_uuid = <0x89e1d005 0x4713dc53 0xa502b8d 0x383e7a4b>;
|
||||
bl32_extra1_uuid = <0x9bc2700b 0x40785a2a 0x560a659f 0x88827382>;
|
||||
bl32_extra2_uuid = <0xb17ba88e 0x4d3fa2cf 0xbbe7fd85 0xd92002a5>;
|
||||
bl33_uuid = <0xa7eed0d6 0x4bd5eafc 0x34998297 0xe4b634f2>;
|
||||
hw_cfg_uuid = <0xd9f1b808 0x4993cfc9 0xbc6f62a9 0xcc65726b>;
|
||||
soc_fw_cfg_uuid = <0x4b817999 0x46fb7603 0x268d8e8c 0xe059787f>;
|
||||
tos_fw_cfg_uuid = <0x1a7c2526 0x477fc6db 0xc4c4968d 0x218024b0>;
|
||||
nt_fw_cfg_uuid = <0x1598da28 0x447ee893 0xaf1a66ac 0xf9501580>;
|
||||
t_key_cert_uuid = <0x90e87e82 0x11e460f8 0x7a77b4a1 0x4cf9b421>;
|
||||
scp_fw_key_uuid = <0xa1214202 0x11e460f8 0x3cf39b8d 0x14a0150e>;
|
||||
soc_fw_key_uuid = <0xccbeb88a 0x11e460f9 0x48ebd09a 0xf8dcd822>;
|
||||
tos_fw_key_cert_uuid = <0x3d67794 0x11e460fb 0x10b7dd85 0x4ee8c5b>;
|
||||
nt_fw_key_cert_uuid = <0x2a83d58a 0x11e460fb 0x30dfaf8a 0x5998c4bb>;
|
||||
scp_fw_content_cert_uuid = <0x046fbe44 0x11e4635e 0xd8738bb2 0x5696aeea>;
|
||||
soc_fw_content_cert_uuid = <0x200cb2e2 0x11e4635e 0xccabe89c 0x66b62bf9>;
|
||||
tos_fw_content_cert_uuid = <0x11449fa4 0x11e4635e 0x53f2887 0x3df32a72>;
|
||||
nt_fw_content_cert_uuid = <0xf3c1c48e 0x11e4635d 0xee87a9a7 0xa73fb240>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -10,6 +10,11 @@ FVP_USE_GIC_DRIVER := FVP_GICV3
|
|||
# Use the SP804 timer instead of the generic one
|
||||
FVP_USE_SP804_TIMER := 0
|
||||
|
||||
# Use fconf based io for FVP
|
||||
ifeq ($(BL2_AT_EL3), 0)
|
||||
USE_FCONF_BASED_IO := 1
|
||||
endif
|
||||
|
||||
# Default cluster count for FVP
|
||||
FVP_CLUSTER_COUNT := 2
|
||||
|
||||
|
|
|
@ -177,12 +177,20 @@ include lib/xlat_tables_v2/xlat_tables.mk
|
|||
PLAT_BL_COMMON_SOURCES += ${XLAT_TABLES_LIB_SRCS}
|
||||
endif
|
||||
|
||||
ifeq (${USE_FCONF_BASED_IO}, 0)
|
||||
ARM_IO_SOURCES += plat/arm/common/arm_io_storage.c
|
||||
else
|
||||
ARM_IO_SOURCES += plat/arm/common/arm_fconf_io_storage.c \
|
||||
plat/arm/common/fconf/arm_fconf_io.c
|
||||
endif
|
||||
|
||||
BL1_SOURCES += drivers/io/io_fip.c \
|
||||
drivers/io/io_memmap.c \
|
||||
drivers/io/io_storage.c \
|
||||
plat/arm/common/arm_bl1_setup.c \
|
||||
plat/arm/common/arm_err.c \
|
||||
plat/arm/common/arm_io_storage.c
|
||||
${ARM_IO_SOURCES}
|
||||
|
||||
ifdef EL3_PAYLOAD_BASE
|
||||
# Need the plat_arm_program_trusted_mailbox() function to release secondary CPUs from
|
||||
# their holding pen
|
||||
|
@ -196,7 +204,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 \
|
||||
plat/arm/common/arm_io_storage.c
|
||||
${ARM_IO_SOURCES}
|
||||
|
||||
# Firmware Configuration Framework sources
|
||||
include lib/fconf/fconf.mk
|
||||
|
|
142
plat/arm/common/arm_fconf_io_storage.c
Normal file
142
plat/arm/common/arm_fconf_io_storage.c
Normal file
|
@ -0,0 +1,142 @@
|
|||
/*
|
||||
* Copyright (c) 2015-2020, ARM Limited. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include <common/debug.h>
|
||||
#include <drivers/io/io_driver.h>
|
||||
#include <drivers/io/io_fip.h>
|
||||
#include <drivers/io/io_memmap.h>
|
||||
#include <drivers/io/io_storage.h>
|
||||
#include <lib/utils.h>
|
||||
#include <tools_share/firmware_image_package.h>
|
||||
|
||||
#include <plat/arm/common/arm_fconf_getter.h>
|
||||
#include <plat/arm/common/arm_fconf_io_storage.h>
|
||||
#include <plat/arm/common/plat_arm.h>
|
||||
#include <plat/common/platform.h>
|
||||
#include <platform_def.h>
|
||||
|
||||
/* IO devices */
|
||||
static const io_dev_connector_t *fip_dev_con;
|
||||
uintptr_t fip_dev_handle;
|
||||
static const io_dev_connector_t *memmap_dev_con;
|
||||
uintptr_t memmap_dev_handle;
|
||||
|
||||
/* Weak definitions may be overridden in specific ARM standard platform */
|
||||
#pragma weak plat_arm_io_setup
|
||||
#pragma weak plat_arm_get_alt_image_source
|
||||
|
||||
int open_fip(const uintptr_t spec)
|
||||
{
|
||||
int result;
|
||||
uintptr_t local_image_handle;
|
||||
|
||||
/* See if a Firmware Image Package is available */
|
||||
result = io_dev_init(fip_dev_handle, (uintptr_t)FIP_IMAGE_ID);
|
||||
if (result == 0) {
|
||||
result = io_open(fip_dev_handle, spec, &local_image_handle);
|
||||
if (result == 0) {
|
||||
VERBOSE("Using FIP\n");
|
||||
io_close(local_image_handle);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
int open_memmap(const uintptr_t spec)
|
||||
{
|
||||
int result;
|
||||
uintptr_t local_image_handle;
|
||||
|
||||
result = io_dev_init(memmap_dev_handle, (uintptr_t)NULL);
|
||||
if (result == 0) {
|
||||
result = io_open(memmap_dev_handle, spec, &local_image_handle);
|
||||
if (result == 0) {
|
||||
VERBOSE("Using Memmap\n");
|
||||
io_close(local_image_handle);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void arm_io_setup(void)
|
||||
{
|
||||
int io_result;
|
||||
|
||||
io_result = register_io_dev_fip(&fip_dev_con);
|
||||
assert(io_result == 0);
|
||||
|
||||
io_result = register_io_dev_memmap(&memmap_dev_con);
|
||||
assert(io_result == 0);
|
||||
|
||||
/* Open connections to devices and cache the handles */
|
||||
io_result = io_dev_open(fip_dev_con, (uintptr_t)NULL,
|
||||
&fip_dev_handle);
|
||||
assert(io_result == 0);
|
||||
|
||||
io_result = io_dev_open(memmap_dev_con, (uintptr_t)NULL,
|
||||
&memmap_dev_handle);
|
||||
assert(io_result == 0);
|
||||
|
||||
/* Ignore improbable errors in release builds */
|
||||
(void)io_result;
|
||||
}
|
||||
|
||||
void plat_arm_io_setup(void)
|
||||
{
|
||||
arm_io_setup();
|
||||
}
|
||||
|
||||
int plat_arm_get_alt_image_source(
|
||||
unsigned int image_id __unused,
|
||||
uintptr_t *dev_handle __unused,
|
||||
uintptr_t *image_spec __unused)
|
||||
{
|
||||
/* By default do not try an alternative */
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
/* Return an IO device handle and specification which can be used to access
|
||||
* an image. Use this to enforce platform load policy */
|
||||
int plat_get_image_source(unsigned int image_id, uintptr_t *dev_handle,
|
||||
uintptr_t *image_spec)
|
||||
{
|
||||
int result;
|
||||
const struct plat_io_policy *policy;
|
||||
|
||||
assert(image_id < MAX_NUMBER_IDS);
|
||||
|
||||
policy = FCONF_GET_PROPERTY(arm, io_policies, image_id);
|
||||
result = policy->check(policy->image_spec);
|
||||
if (result == 0) {
|
||||
*image_spec = policy->image_spec;
|
||||
*dev_handle = *(policy->dev_handle);
|
||||
} else {
|
||||
VERBOSE("Trying alternative IO\n");
|
||||
result = plat_arm_get_alt_image_source(image_id, dev_handle,
|
||||
image_spec);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
* See if a Firmware Image Package is available,
|
||||
* by checking if TOC is valid or not.
|
||||
*/
|
||||
int arm_io_is_toc_valid(void)
|
||||
{
|
||||
int result;
|
||||
|
||||
result = io_dev_init(fip_dev_handle, (uintptr_t)FIP_IMAGE_ID);
|
||||
|
||||
if (result == 0) {
|
||||
return 1UL;
|
||||
} else {
|
||||
return 0UL;
|
||||
}
|
||||
}
|
143
plat/arm/common/fconf/arm_fconf_io.c
Normal file
143
plat/arm/common/fconf/arm_fconf_io.c
Normal file
|
@ -0,0 +1,143 @@
|
|||
/*
|
||||
* Copyright (c) 2019-2020, ARM Limited. All rights reserved.
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-3-Clause
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include <common/debug.h>
|
||||
#include <common/fdt_wrappers.h>
|
||||
#include <drivers/io/io_storage.h>
|
||||
#include <lib/object_pool.h>
|
||||
#include <libfdt.h>
|
||||
#include <tools_share/firmware_image_package.h>
|
||||
|
||||
#include <plat/arm/common/arm_fconf_getter.h>
|
||||
#include <plat/arm/common/arm_fconf_io_storage.h>
|
||||
#include <platform_def.h>
|
||||
|
||||
const io_block_spec_t fip_block_spec = {
|
||||
.offset = PLAT_ARM_FIP_BASE,
|
||||
.length = PLAT_ARM_FIP_MAX_SIZE
|
||||
};
|
||||
|
||||
const io_uuid_spec_t arm_uuid_spec[MAX_NUMBER_IDS] = {
|
||||
[BL2_IMAGE_ID] = {UUID_TRUSTED_BOOT_FIRMWARE_BL2},
|
||||
[TB_FW_CONFIG_ID] = {UUID_TB_FW_CONFIG},
|
||||
#if TRUSTED_BOARD_BOOT
|
||||
[TRUSTED_BOOT_FW_CERT_ID] = {UUID_TRUSTED_BOOT_FW_CERT},
|
||||
#endif /* TRUSTED_BOARD_BOOT */
|
||||
};
|
||||
|
||||
/* By default, ARM platforms load images from the FIP */
|
||||
struct plat_io_policy policies[MAX_NUMBER_IDS] = {
|
||||
[FIP_IMAGE_ID] = {
|
||||
&memmap_dev_handle,
|
||||
(uintptr_t)&fip_block_spec,
|
||||
open_memmap
|
||||
},
|
||||
[BL2_IMAGE_ID] = {
|
||||
&fip_dev_handle,
|
||||
(uintptr_t)&arm_uuid_spec[BL2_IMAGE_ID],
|
||||
open_fip
|
||||
},
|
||||
[TB_FW_CONFIG_ID] = {
|
||||
&fip_dev_handle,
|
||||
(uintptr_t)&arm_uuid_spec[TB_FW_CONFIG_ID],
|
||||
open_fip
|
||||
},
|
||||
#if TRUSTED_BOARD_BOOT
|
||||
[TRUSTED_BOOT_FW_CERT_ID] = {
|
||||
&fip_dev_handle,
|
||||
(uintptr_t)&arm_uuid_spec[TRUSTED_BOOT_FW_CERT_ID],
|
||||
open_fip
|
||||
},
|
||||
#endif /* TRUSTED_BOARD_BOOT */
|
||||
};
|
||||
|
||||
#ifdef IMAGE_BL2
|
||||
|
||||
#if TRUSTED_BOARD_BOOT
|
||||
#define FCONF_ARM_IO_UUID_NUMBER 19
|
||||
#else
|
||||
#define FCONF_ARM_IO_UUID_NUMBER 10
|
||||
#endif
|
||||
|
||||
static io_uuid_spec_t fconf_arm_uuids[FCONF_ARM_IO_UUID_NUMBER];
|
||||
static OBJECT_POOL_ARRAY(fconf_arm_uuids_pool, fconf_arm_uuids);
|
||||
|
||||
struct policies_load_info {
|
||||
unsigned int image_id;
|
||||
const char *name;
|
||||
};
|
||||
|
||||
/* image id to property name table */
|
||||
static const struct policies_load_info load_info[FCONF_ARM_IO_UUID_NUMBER] = {
|
||||
{SCP_BL2_IMAGE_ID, "scp_bl2_uuid"},
|
||||
{BL31_IMAGE_ID, "bl31_uuid"},
|
||||
{BL32_IMAGE_ID, "bl32_uuid"},
|
||||
{BL32_EXTRA1_IMAGE_ID, "bl32_extra1_uuid"},
|
||||
{BL32_EXTRA2_IMAGE_ID, "bl32_extra2_uuid"},
|
||||
{BL33_IMAGE_ID, "bl33_uuid"},
|
||||
{HW_CONFIG_ID, "hw_cfg_uuid"},
|
||||
{SOC_FW_CONFIG_ID, "soc_fw_cfg_uuid"},
|
||||
{TOS_FW_CONFIG_ID, "tos_fw_cfg_uuid"},
|
||||
{NT_FW_CONFIG_ID, "nt_fw_cfg_uuid"},
|
||||
#if TRUSTED_BOARD_BOOT
|
||||
{TRUSTED_KEY_CERT_ID, "t_key_cert_uuid"},
|
||||
{SCP_FW_KEY_CERT_ID, "scp_fw_key_uuid"},
|
||||
{SOC_FW_KEY_CERT_ID, "soc_fw_key_uuid"},
|
||||
{TRUSTED_OS_FW_KEY_CERT_ID, "tos_fw_key_cert_uuid"},
|
||||
{NON_TRUSTED_FW_KEY_CERT_ID, "nt_fw_key_cert_uuid"},
|
||||
{SCP_FW_CONTENT_CERT_ID, "scp_fw_content_cert_uuid"},
|
||||
{SOC_FW_CONTENT_CERT_ID, "soc_fw_content_cert_uuid"},
|
||||
{TRUSTED_OS_FW_CONTENT_CERT_ID, "tos_fw_content_cert_uuid"},
|
||||
{NON_TRUSTED_FW_CONTENT_CERT_ID, "nt_fw_content_cert_uuid"},
|
||||
#endif /* TRUSTED_BOARD_BOOT */
|
||||
};
|
||||
|
||||
int fconf_populate_arm_io_policies(uintptr_t config)
|
||||
{
|
||||
int err, node;
|
||||
unsigned int i;
|
||||
|
||||
union uuid_helper_t uuid_helper;
|
||||
io_uuid_spec_t *uuid_ptr;
|
||||
|
||||
/* As libfdt uses void *, we can't avoid this cast */
|
||||
const void *dtb = (void *)config;
|
||||
|
||||
/* Assert the node offset point to "arm,io-fip-handle" compatible property */
|
||||
const char *compatible_str = "arm,io-fip-handle";
|
||||
node = fdt_node_offset_by_compatible(dtb, -1, compatible_str);
|
||||
if (node < 0) {
|
||||
ERROR("FCONF: Can't find %s compatible in dtb\n", compatible_str);
|
||||
return node;
|
||||
}
|
||||
|
||||
/* Locate the uuid cells and read the value for all the load info uuid */
|
||||
for (i = 0; i < FCONF_ARM_IO_UUID_NUMBER; i++) {
|
||||
uuid_ptr = pool_alloc(&fconf_arm_uuids_pool);
|
||||
err = fdtw_read_array(dtb, node, load_info[i].name, 4, &uuid_helper.word);
|
||||
if (err < 0) {
|
||||
WARN("FCONF: Read cell failed for %s\n", load_info[i].name);
|
||||
return err;
|
||||
}
|
||||
|
||||
VERBOSE("FCONF: arm-io_policies.%s cell found with value = 0x%x 0x%x 0x%x 0x%x\n",
|
||||
load_info[i].name,
|
||||
uuid_helper.word[0], uuid_helper.word[1],
|
||||
uuid_helper.word[2], uuid_helper.word[3]);
|
||||
|
||||
uuid_ptr->uuid = uuid_helper.uuid_struct;
|
||||
policies[load_info[i].image_id].image_spec = (uintptr_t)uuid_ptr;
|
||||
policies[load_info[i].image_id].dev_handle = &fip_dev_handle;
|
||||
policies[load_info[i].image_id].check = open_fip;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
FCONF_REGISTER_POPULATOR(arm_io, fconf_populate_arm_io_policies);
|
||||
|
||||
#endif /* IMAGE_BL2 */
|
Loading…
Add table
Reference in a new issue