14874793dSLouis MayencourtFirmware Configuration Framework 24874793dSLouis Mayencourt================================ 34874793dSLouis Mayencourt 44874793dSLouis MayencourtThis document provides an overview of the |FCONF| framework. 54874793dSLouis Mayencourt 64874793dSLouis MayencourtIntroduction 74874793dSLouis Mayencourt~~~~~~~~~~~~ 84874793dSLouis Mayencourt 94874793dSLouis MayencourtThe Firmware CONfiguration Framework (|FCONF|) is an abstraction layer for 104874793dSLouis Mayencourtplatform specific data, allowing a "property" to be queried and a value 114874793dSLouis Mayencourtretrieved without the requesting entity knowing what backing store is being used 124874793dSLouis Mayencourtto hold the data. 134874793dSLouis Mayencourt 144874793dSLouis MayencourtIt is used to bridge new and old ways of providing platform-specific data. 154874793dSLouis MayencourtToday, information like the Chain of Trust is held within several, nested 164874793dSLouis Mayencourtplatform-defined tables. In the future, it may be provided as part of a device 174874793dSLouis Mayencourtblob, along with the rest of the information about images to load. 184874793dSLouis MayencourtIntroducing this abstraction layer will make migration easier and will preserve 194874793dSLouis Mayencourtfunctionality for platforms that cannot / don't want to use device tree. 204874793dSLouis Mayencourt 214874793dSLouis MayencourtAccessing properties 224874793dSLouis Mayencourt~~~~~~~~~~~~~~~~~~~~ 234874793dSLouis Mayencourt 244874793dSLouis MayencourtProperties defined in the |FCONF| are grouped around namespaces and 254874793dSLouis Mayencourtsub-namespaces: a.b.property. 264874793dSLouis MayencourtExamples namespace can be: 274874793dSLouis Mayencourt 284874793dSLouis Mayencourt- (|TBBR|) Chain of Trust data: tbbr.cot.trusted_boot_fw_cert 294874793dSLouis Mayencourt- (|TBBR|) dynamic configuration info: tbbr.dyn_config.disable_auth 304874793dSLouis Mayencourt- Arm io policies: arm.io_policies.bl2_image 314874793dSLouis Mayencourt- GICv3 properties: hw_config.gicv3_config.gicr_base 324874793dSLouis Mayencourt 334874793dSLouis MayencourtProperties can be accessed with the ``FCONF_GET_PROPERTY(a,b,property)`` macro. 344874793dSLouis Mayencourt 354874793dSLouis MayencourtDefining properties 364874793dSLouis Mayencourt~~~~~~~~~~~~~~~~~~~ 374874793dSLouis Mayencourt 384874793dSLouis MayencourtProperties composing the |FCONF| have to be stored in C structures. If 394874793dSLouis Mayencourtproperties originate from a different backend source such as a device tree, 404874793dSLouis Mayencourtthen the platform has to provide a ``populate()`` function which essentially 414874793dSLouis Mayencourtcaptures the property and stores them into a corresponding |FCONF| based C 424874793dSLouis Mayencourtstructure. 434874793dSLouis Mayencourt 444874793dSLouis MayencourtSuch a ``populate()`` function is usually platform specific and is associated 454874793dSLouis Mayencourtwith a specific backend source. For example, a populator function which 464874793dSLouis Mayencourtcaptures the hardware topology of the platform from the HW_CONFIG device tree. 474874793dSLouis MayencourtHence each ``populate()`` function must be registered with a specific 484874793dSLouis Mayencourt``config_type`` identifier. It broadly represents a logical grouping of 494874793dSLouis Mayencourtconfiguration properties which is usually a device tree file. 504874793dSLouis Mayencourt 514874793dSLouis MayencourtExample: 52e555787bSManish V Badarkhe - FW_CONFIG: properties related to base address, maximum size and image id 53e555787bSManish V Badarkhe of other DTBs etc. 544874793dSLouis Mayencourt - TB_FW: properties related to trusted firmware such as IO policies, 55e555787bSManish V Badarkhe mbedtls heap info etc. 564874793dSLouis Mayencourt - HW_CONFIG: properties related to hardware configuration of the SoC 574874793dSLouis Mayencourt such as topology, GIC controller, PSCI hooks, CPU ID etc. 584874793dSLouis Mayencourt 594874793dSLouis MayencourtHence the ``populate()`` callback must be registered to the (|FCONF|) framework 604874793dSLouis Mayencourtwith the ``FCONF_REGISTER_POPULATOR()`` macro. This ensures that the function 614874793dSLouis Mayencourtwould be called inside the generic ``fconf_populate()`` function during 624874793dSLouis Mayencourtinitialization. 634874793dSLouis Mayencourt 644874793dSLouis Mayencourt:: 654874793dSLouis Mayencourt 664874793dSLouis Mayencourt int fconf_populate_topology(uintptr_t config) 674874793dSLouis Mayencourt { 684874793dSLouis Mayencourt /* read hw config dtb and fill soc_topology struct */ 694874793dSLouis Mayencourt } 704874793dSLouis Mayencourt 714874793dSLouis Mayencourt FCONF_REGISTER_POPULATOR(HW_CONFIG, topology, fconf_populate_topology); 724874793dSLouis Mayencourt 734874793dSLouis MayencourtThen, a wrapper has to be provided to match the ``FCONF_GET_PROPERTY()`` macro: 744874793dSLouis Mayencourt 754874793dSLouis Mayencourt:: 764874793dSLouis Mayencourt 774874793dSLouis Mayencourt /* generic getter */ 784874793dSLouis Mayencourt #define FCONF_GET_PROPERTY(a,b,property) a##__##b##_getter(property) 794874793dSLouis Mayencourt 804874793dSLouis Mayencourt /* my specific getter */ 814874793dSLouis Mayencourt #define hw_config__topology_getter(prop) soc_topology.prop 824874793dSLouis Mayencourt 834874793dSLouis MayencourtThis second level wrapper can be used to remap the ``FCONF_GET_PROPERTY()`` to 844874793dSLouis Mayencourtanything appropriate: structure, array, function, etc.. 854874793dSLouis Mayencourt 864874793dSLouis MayencourtTo ensure a good interpretation of the properties, this documentation must 874874793dSLouis Mayencourtexplain how the properties are described for a specific backend. Refer to the 884874793dSLouis Mayencourt:ref:`binding-document` section for more information and example. 894874793dSLouis Mayencourt 904874793dSLouis MayencourtLoading the property device tree 914874793dSLouis Mayencourt~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 924874793dSLouis Mayencourt 93e555787bSManish V BadarkheThe ``fconf_load_config(image_id)`` must be called to load fw_config and 94e555787bSManish V Badarkhetb_fw_config devices tree containing the properties' values. This must be done 95e555787bSManish V Badarkheafter the io layer is initialized, as the |DTB| is stored on an external 96e555787bSManish V Badarkhedevice (FIP). 974874793dSLouis Mayencourt 984874793dSLouis Mayencourt.. uml:: ../../resources/diagrams/plantuml/fconf_bl1_load_config.puml 994874793dSLouis Mayencourt 1004874793dSLouis MayencourtPopulating the properties 1014874793dSLouis Mayencourt~~~~~~~~~~~~~~~~~~~~~~~~~ 1024874793dSLouis Mayencourt 1034874793dSLouis MayencourtOnce a valid device tree is available, the ``fconf_populate(config)`` function 1044874793dSLouis Mayencourtcan be used to fill the C data structure with the data from the config |DTB|. 1054874793dSLouis MayencourtThis function will call all the ``populate()`` callbacks which have been 1064874793dSLouis Mayencourtregistered with ``FCONF_REGISTER_POPULATOR()`` as described above. 1074874793dSLouis Mayencourt 1084874793dSLouis Mayencourt.. uml:: ../../resources/diagrams/plantuml/fconf_bl2_populate.puml 1094874793dSLouis Mayencourt 1104874793dSLouis MayencourtNamespace guidance 1114874793dSLouis Mayencourt~~~~~~~~~~~~~~~~~~ 1124874793dSLouis Mayencourt 1134874793dSLouis MayencourtAs mentioned above, properties are logically grouped around namespaces and 1144874793dSLouis Mayencourtsub-namespaces. The following concepts should be considered when adding new 1154874793dSLouis Mayencourtproperties/namespaces. 1164874793dSLouis MayencourtThe framework differentiates two types of properties: 1174874793dSLouis Mayencourt 1184874793dSLouis Mayencourt - Properties used inside common code. 1194874793dSLouis Mayencourt - Properties used inside platform specific code. 1204874793dSLouis Mayencourt 1214874793dSLouis MayencourtThe first category applies to properties being part of the firmware and shared 1224874793dSLouis Mayencourtacross multiple platforms. They should be globally accessible and defined 1234874793dSLouis Mayencourtinside the ``lib/fconf`` directory. The namespace must be chosen to reflect the 1244874793dSLouis Mayencourtfeature/data abstracted. 1254874793dSLouis Mayencourt 1264874793dSLouis MayencourtExample: 1274874793dSLouis Mayencourt - |TBBR| related properties: tbbr.cot.bl2_id 1284874793dSLouis Mayencourt - Dynamic configuration information: dyn_cfg.dtb_info.hw_config_id 1294874793dSLouis Mayencourt 1304874793dSLouis MayencourtThe second category should represent the majority of the properties defined 1314874793dSLouis Mayencourtwithin the framework: Platform specific properties. They must be accessed only 1324874793dSLouis Mayencourtwithin the platform API and are defined only inside the platform scope. The 1334874793dSLouis Mayencourtnamespace must contain the platform name under which the properties defined 1344874793dSLouis Mayencourtbelong. 1354874793dSLouis Mayencourt 1364874793dSLouis MayencourtExample: 1374874793dSLouis Mayencourt - Arm io framework: arm.io_policies.bl31_id 1384874793dSLouis Mayencourt 1394874793dSLouis Mayencourt.. _binding-document: 1404874793dSLouis Mayencourt 1414874793dSLouis MayencourtProperties binding information 1424874793dSLouis Mayencourt~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1434874793dSLouis Mayencourt 1444874793dSLouis Mayencourt.. toctree:: 1454874793dSLouis Mayencourt :maxdepth: 1 1464874793dSLouis Mayencourt 1474874793dSLouis Mayencourt fconf_properties 148*75093b72SHarrison Mutai tb_fw_bindings 149