From e555787b66dfa2a1e3b9145a5c55763850ae66dc Mon Sep 17 00:00:00 2001 From: Manish V Badarkhe Date: Sun, 21 Jun 2020 05:41:11 +0100 Subject: [PATCH] doc: Update BL1 and BL2 boot flow Updated the document for BL1 and BL2 boot flow to capture below changes made in FCONF 1. Loading of fw_config and tb_fw_config images by BL1. 2. Population of fw_config and tb_fw_config by BL2. Signed-off-by: Manish V Badarkhe Change-Id: Ifea5c61d520ff1de834c279ce1759b53448303ba --- docs/components/fconf/index.rst | 11 ++-- .../plantuml/fconf_bl1_load_config.puml | 52 ++++++++++++++----- .../diagrams/plantuml/fconf_bl2_populate.puml | 12 ++++- 3 files changed, 56 insertions(+), 19 deletions(-) diff --git a/docs/components/fconf/index.rst b/docs/components/fconf/index.rst index 0da56ec3b..902063356 100644 --- a/docs/components/fconf/index.rst +++ b/docs/components/fconf/index.rst @@ -49,8 +49,10 @@ Hence each ``populate()`` function must be registered with a specific configuration properties which is usually a device tree file. Example: + - FW_CONFIG: properties related to base address, maximum size and image id + of other DTBs etc. - TB_FW: properties related to trusted firmware such as IO policies, - base address of other DTBs, mbedtls heap info etc. + mbedtls heap info etc. - HW_CONFIG: properties related to hardware configuration of the SoC such as topology, GIC controller, PSCI hooks, CPU ID etc. @@ -88,9 +90,10 @@ explain how the properties are described for a specific backend. Refer to the Loading the property device tree ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The ``fconf_load_config()`` must be called to load the device tree containing -the properties' values. This must be done after the io layer is initialized, as -the |DTB| is stored on an external device (FIP). +The ``fconf_load_config(image_id)`` must be called to load fw_config and +tb_fw_config devices tree containing the properties' values. This must be done +after the io layer is initialized, as the |DTB| is stored on an external +device (FIP). .. uml:: ../../resources/diagrams/plantuml/fconf_bl1_load_config.puml diff --git a/docs/resources/diagrams/plantuml/fconf_bl1_load_config.puml b/docs/resources/diagrams/plantuml/fconf_bl1_load_config.puml index e613eefd0..e513ed4c3 100644 --- a/docs/resources/diagrams/plantuml/fconf_bl1_load_config.puml +++ b/docs/resources/diagrams/plantuml/fconf_bl1_load_config.puml @@ -13,6 +13,7 @@ end box box "platform common code" participant plat_bl1_common + participant fconf_dyn_cfg_getter participant fconf end box @@ -20,12 +21,17 @@ bl1_main -> fvp_bl1_setup : bl1_platform_setup() fvp_bl1_setup -> arm_bl1_setup : arm_bl1_platform_setup() arm_bl1_setup -> arm_io_storage : plat_arm_io_setup() note over arm_io_storage : register and setup fip -arm_bl1_setup -> fconf : fconf_load_config() +arm_bl1_setup -> fconf : set_fw_config_info(fw_config_base, max_size) +note over fconf + set fw_config information + (address, size, image_id) + in global dtb_infos array. +end note activate fconf - note over fconf - create and populate an - image_desc_t for FW_CONFIG - end note + arm_bl1_setup -> fconf : fconf_load_config(FW_CONFIG_ID) + fconf -> fconf : FCONF_GET_PROPERTY(dyn_cfg, dtb, FW_CONFIG_ID) + fconf -> fconf_dyn_cfg_getter: dyn_cfg_dtb_info_getter(FW_CONFIG_ID) + fconf_dyn_cfg_getter -> fconf: fw_config_info fconf -> bl_common : load_auth_image(FW_CONFIG_ID, &image_info) activate bl_common note over bl_common @@ -33,18 +39,38 @@ activate fconf with info from plat_io_policy end note bl_common -> arm_io_storage - arm_io_storage -> fconf: FCONF_GET_PROPERTY(arm, arm_io_policies, tb_fw_cfg) - note over fconf: use staticaly defined policies in bl1 + arm_io_storage -> fconf: FCONF_GET_PROPERTY(arm, arm_io_policies, FW_CONFIG_ID) + note over fconf: use statically defined policies in bl1 + fconf <- bl_common : image_info + deactivate bl_common + note over fconf : get fw_config_dtb from image_info + arm_bl1_setup -> fconf: FCONF_GET_PROPERTY(dyn_cfg, dtb, FW_CONFIG_ID) + fconf -> fconf_dyn_cfg_getter: dyn_cfg_dtb_info_getter(FW_CONFIG_ID) + fconf_dyn_cfg_getter -> arm_bl1_setup: fw_config_info + arm_bl1_setup -> fconf_dyn_cfg_getter: populate_dtb_registry(uintptr_t dtb) + arm_bl1_setup -> fconf: fconf_load_config(TB_FW_CONFIG_ID) + fconf -> fconf : FCONF_GET_PROPERTY(dyn_cfg, dtb, TB_FW_CONFIG_ID) + fconf -> fconf_dyn_cfg_getter: dyn_cfg_dtb_info_getter(TB_FW_CONFIG_ID) + fconf_dyn_cfg_getter -> fconf: tb_fw_config_info + fconf -> bl_common : load_auth_image(TB_FW_CONFIG_ID, &image_info) + activate bl_common + note over bl_common + load and auth image from fip + with info from plat_io_policy + end note + bl_common -> arm_io_storage + arm_io_storage -> fconf: FCONF_GET_PROPERTY(arm, arm_io_policies, TB_FW_CONFIG_ID) + note over fconf: use statically defined policies in bl1 fconf <- bl_common : image_info deactivate bl_common note over fconf : get tb_fw_config_dtb from image_info - fconf -> plat_bl1_common : bl1_plat_get_image_desc(BL2_IMAGE_ID) - fconf <- plat_bl1_common : BL2_IMAGE_DESC - note over fconf - set ep_info.args.arg0 of BL2_IMAGE_DESC - to FW_CONFIG base address + fconf -> arm_bl1_setup + arm_bl1_setup -> plat_bl1_common : bl1_plat_get_image_desc(BL2_IMAGE_ID) + arm_bl1_setup <- plat_bl1_common : BL2_IMAGE_DESC + note over arm_bl1_setup + set ep_info.args.arg0 of BL2_IMAGE_DESC + to FW_CONFIG base address end note -arm_bl1_setup <- fconf deactivate fconf == load & auth, prepare and jump to BL2 == diff --git a/docs/resources/diagrams/plantuml/fconf_bl2_populate.puml b/docs/resources/diagrams/plantuml/fconf_bl2_populate.puml index 881f25343..c536ee090 100644 --- a/docs/resources/diagrams/plantuml/fconf_bl2_populate.puml +++ b/docs/resources/diagrams/plantuml/fconf_bl2_populate.puml @@ -8,6 +8,7 @@ end box box "platform common code" participant fconf participant fconf_tbbr_getter +participant fconf_dyn_cfg_getter end box box "arm platform code" #LightBlue @@ -25,10 +26,17 @@ note over arm_bl2_setup end note arm_bl2_setup -> arm_bl2_setup : arm_bl2_early_platform_setup(\n\t fw_config, mem_layout) activate arm_bl2_setup - arm_bl2_setup -> fconf: fconf_polulate("TB_FW", fw_config) + arm_bl2_setup -> fconf: fconf_populate("FW_CONFIG", fw_config) activate fconf + fconf -> fconf_dyn_cfg_getter: populate_dtb_registry(uintptr_t dtb) + note over fconf_dyn_cfg_getter: read dtb_registry properties from dtb + fconf_dyn_cfg_getter -> arm_bl2_setup + arm_bl2_setup -> fconf: FCONF_GET_PROPERTY(dyn_cfg, dtb, TB_FW_CONFIG_ID) + fconf -> fconf_dyn_cfg_getter: dyn_cfg_dtb_info_getter(TB_FW_CONFIG_ID) + fconf_dyn_cfg_getter -> arm_bl2_setup: tb_fw_config_info + arm_bl2_setup -> fconf: fconf_populate("TB_FW_CONFIG", tb_fw_config) fconf -> fconf_tbbr_getter: fconf_populate_tbbr_dyn_config(uintptr_t dtb) - note over fconf_tbbr_getter: read tbbr propeties from dtb + note over fconf_tbbr_getter: read tbbr properties from dtb fconf -> arm_fconf_io: fconf_populate_arm_io_policies(uintptr_t dtb) note over arm_fconf_io: read arm io propeties from dtb deactivate fconf