arm-trusted-firmware/docs/components/fconf.rst

3.0 KiB

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> </head>

Firmware Configuration Framework

This document provides an overview of the |FCONF| framework.

Introduction

The Firmware CONfiguration Framework (|FCONF|) is an abstraction layer for platform specific data, allowing a "property" to be queried and a value retrieved without the requesting entity knowing what backing store is being used to hold the data.

It is used to bridge new and old ways of providing platform-specific data. Today, information like the Chain of Trust is held within several, nested platform-defined tables. In the future, it may be provided as part of a device blob, along with the rest of the information about images to load. Introducing this abstraction layer will make migration easier and will preserve functionality for platforms that cannot / don't want to use device tree.

Accessing properties

Properties defined in the |FCONF| are grouped around namespaces and sub-namespaces: a.b.property. Examples namespace can be:

  • (|TBBR|) Chain of Trust data: tbbr.cot.trusted_boot_fw_cert
  • (|TBBR|) dynamic configuration info: tbbr.dyn_config.disable_auth
  • Arm io policies: arm.io_policies.bl2_image

Properties can be accessed with the FCONF_GET_PROPERTY(a,b,property) macro.

Defining properties

Properties composing the |FCONF| have to be stored in C structures. If another backing store is wanted to be used, the platform has to provide a populate() function to fill the corresponding C structure.

The populate() function must be registered to the |FCONF| framework with the FCONF_REGISTER_POPULATOR() macro. This ensures that the function would be called inside the generic fconf_populate() function during initialization.

int fconf_populate_tbbr_dyn_config(uintptr_t config)
{
    /* read dtb and fill tbbr_dyn_config struct */
}

FCONF_REGISTER_POPULATOR(fconf_populate_tbbr_dyn_config);

Then, a wrapper has to be provided to match the FCONF_GET_PROPERTY() macro:

/* generic getter */
#define FCONF_GET_PROPERTY(a,b,property)    a##__##b##_getter(property)

/* my specific getter */
#define tbbr__dyn_config_getter(id) tbbr_dyn_config.id

This second level wrapper can be used to remap the FCONF_GET_PROPERTY() to anything appropriate: structure, array, function, etc..

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).

System Message: ERROR/3 (<stdin>, line 75)

Unknown directive type "uml".

.. uml:: ../resources/diagrams/plantuml/fconf_bl1_load_config.puml

Populating the properties

Once a valid device tree is available, the fconf_populate(config) function can be used to fill the C data structure with the data from the config |DTB|. This function will call all the populate() callbacks which have been registered with FCONF_REGISTER_POPULATOR().

System Message: ERROR/3 (<stdin>, line 85)

Unknown directive type "uml".

.. uml:: ../resources/diagrams/plantuml/fconf_bl2_populate.puml

Docutils System Messages

System Message: ERROR/3 (<stdin>, line 4); backlink

Undefined substitution referenced: "FCONF".

System Message: ERROR/3 (<stdin>, line 9); backlink

Undefined substitution referenced: "FCONF".

System Message: ERROR/3 (<stdin>, line 24); backlink

Undefined substitution referenced: "FCONF".

System Message: ERROR/3 (<stdin>, line 28); backlink

Undefined substitution referenced: "TBBR".

System Message: ERROR/3 (<stdin>, line 29); backlink

Undefined substitution referenced: "TBBR".

System Message: ERROR/3 (<stdin>, line 37); backlink

Undefined substitution referenced: "FCONF".

System Message: ERROR/3 (<stdin>, line 41); backlink

Undefined substitution referenced: "FCONF".

System Message: ERROR/3 (<stdin>, line 71); backlink

Undefined substitution referenced: "DTB".

System Message: ERROR/3 (<stdin>, line 80); backlink

Undefined substitution referenced: "DTB".
</html>