xref: /rk3399_ARM-atf/docs/components/fconf/index.rst (revision 2e0354f58834219c65b1d44447b8510f3983a5ba)
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