引流关键词: 中断、同步异常、异步异常、irq、fiq、BL1,BL2,BL3,BL31,BL32,BL33,AP_BL1,AP_BL2,AP_BL3,AP_BL31,AP_BL32,AP_BL33,SCP_BL1,SCP_BL2,BL0,BL30, optee、ATF、TF-A、Trustzone、optee3.14、MMU、VMSA、cache、TLB、arm、armv8、armv9、TEE、安全、内存管理、页表…
快速链接:
.
👉👉👉 个人博客笔记导读目录(全部) 👈👈👈
[专栏目录]-ATF/FF-A/specification学习
6.固件配置框架
本文档提供了FCONF框架的概述。
6.1。介绍
固件配置框架 ( FCONF ) 是平台特定数据的抽象层,允许查询“属性”并检索值,而请求实体不知道使用什么后备存储来保存数据。
它用于连接提供特定平台数据的新旧方式。今天,像信任链这样的信息保存在几个嵌套的平台定义表中。将来,它可能会作为设备 blob 的一部分提供,以及有关要加载的图像的其余信息。引入此抽象层将使迁移更容易,并将保留不能/不想使用设备树的平台的功能。
6.2. 访问属性
FCONF中定义的属性围绕命名空间和子命名空间进行分组:abproperty。示例命名空间可以是:
-
( TBBR ) 信任链数据:tbbr.cot.trusted_boot_fw_cert
-
( TBBR ) 动态配置信息:tbbr.dyn_config.disable_auth
-
Arm io 策略:arm.io_policies.bl2_image
-
GICv3 属性:hw_config.gicv3_config.gicr_base
可以使用FCONF_GET_PROPERTY(a,b,property)宏访问属性。
6.3. 定义属性
构成FCONF的属性必须存储在 C 结构中。如果属性来自不同的后端源,例如设备树,则平台必须提供一个populate()函数,该函数本质上捕获属性并将它们存储到相应的基于FCONF的 C 结构中。
这样的populate()功能通常是特定于平台的,并且与特定的后端源相关联。例如,从 HW_CONFIG 设备树中捕获平台硬件拓扑的填充器函数。因此,每个populate()函数都必须使用特定的 config_type标识符进行注册。它广泛地表示配置属性的逻辑分组,通常是设备树文件。
例子:
-
FW_CONFIG:其他 DTB 的基地址、最大尺寸和图像 id 等相关的属性。
-
TB_FW:与可信固件相关的属性,例如 IO 策略、mbedtls 堆信息等。
-
HW_CONFIG:与 SoC 硬件配置相关的属性,例如拓扑、GIC 控制器、PSCI 挂钩、CPU ID 等。
因此,populate()必须使用宏将回调注册到 ( FCONF ) 框架FCONF_REGISTER_POPULATOR()。这确保了该函数将fconf_populate()在初始化期间在通用函数内部被调用。
int fconf_populate_topology(uintptr_t config)
{
/* read hw config dtb and fill soc_topology struct */
}
FCONF_REGISTER_POPULATOR(HW_CONFIG, topology, fconf_populate_topology);
然后,必须提供一个包装器来匹配FCONF_GET_PROPERTY()宏:
/* generic getter */
#define FCONF_GET_PROPERTY(a,b,property) a##__##b##_getter(property)
/* my specific getter */
#define hw_config__topology_getter(prop) soc_topology.prop
这个二级包装器可用于将 重新映射FCONF_GET_PROPERTY()到任何适当的位置:结构、数组、函数等。
为确保对属性的良好解释,本文档必须解释如何为特定后端描述属性。有关更多信息和示例,请参阅 属性绑定信息部分。
6.4. 加载属性设备树
fconf_load_config(image_id)必须调用以加载包含属性值的 fw_config 和 tb_fw_config 设备树。这必须在 io 层初始化后完成,因为DTB存储在外部设备 (FIP) 上。
6.5。填充属性
一旦有效的设备树可用,该fconf_populate(config)函数可用于使用来自配置DTB的数据填充 C 数据结构。此函数将调用所有populate()已注册的回调,FCONF_REGISTER_POPULATOR()如上所述。
6.6. 命名空间指南
如上所述,属性是围绕命名空间和子命名空间进行逻辑分组的。添加新属性/命名空间时应考虑以下概念。该框架区分了两种类型的属性:
-
公共代码中使用的属性。
-
在平台特定代码中使用的属性。
第一类适用于作为固件一部分并跨多个平台共享的属性。它们应该可以全局访问并在lib/fconf目录中定义。必须选择命名空间以反映抽象的特征/数据。
例子:
-
TBBR相关属性:tbbr.cot.bl2_id
-
动态配置信息:dyn_cfg.dtb_info.hw_config_id
第二类应该代表框架内定义的大多数属性:平台特定属性。它们必须只能在平台 API 中访问,并且只能在平台范围内定义。命名空间必须包含定义的属性所属的平台名称。
例子:
- Arm io 框架:arm.io_policies.bl31_id