int arm_dyn_get_hwconfig_info(void *dtb, int node,
uint64_t *hw_config_addr, uint32_t *hw_config_size);
int arm_dyn_tb_fw_cfg_init(void *dtb, int *node);
+int arm_dyn_get_disable_auth(void *dtb, int node, uint32_t *disable_auth);
#endif /* __ARM_DYN_CFG_HELPERS_H__ */
compatible = "arm,tb_fw";
hw_config_addr = <0x0 0x82000000>;
hw_config_max_size = <0x01000000>;
+ /* Disable authentication for development */
+ disable_auth = <0x0>;
};
};
include plat/arm/board/common/board_common.mk
include plat/arm/common/arm_common.mk
+
+# FVP being a development platform, enable capability to disable Authentication
+# dynamically if TRUSTED_BOARD_BOOT and LOAD_IMAGE_V2 is set.
+ifeq (${TRUSTED_BOARD_BOOT}, 1)
+ ifeq (${LOAD_IMAGE_V2}, 1)
+ DYN_DISABLE_AUTH := 1
+ endif
+endif
}
/*
- * Perform ARM standard platform setup.
+ * Perform BL2 preload setup. Currently we initialise the dynamic
+ * configuration here.
*/
-void arm_bl2_platform_setup(void)
+void bl2_plat_preload_setup(void)
{
#if LOAD_IMAGE_V2
arm_bl2_dyn_cfg_init();
#endif
+}
+/*
+ * Perform ARM standard platform setup.
+ */
+void arm_bl2_platform_setup(void)
+{
/* Initialize the secure environment */
plat_arm_security_setup();
drivers/io/io_memmap.c \
drivers/io/io_storage.c \
plat/arm/common/arm_bl1_setup.c \
- plat/arm/common/arm_dyn_cfg.c \
plat/arm/common/arm_err.c \
plat/arm/common/arm_io_storage.c
ifdef EL3_PAYLOAD_BASE
# Add `libfdt` and Arm common helpers required for Dynamic Config
include lib/libfdt/libfdt.mk
-BL2_SOURCES += plat/arm/common/arm_dyn_cfg.c \
+
+DYN_CFG_SOURCES += plat/arm/common/arm_dyn_cfg.c \
plat/arm/common/arm_dyn_cfg_helpers.c \
common/fdt_wrappers.c \
${LIBFDT_SRCS}
+BL1_SOURCES += ${DYN_CFG_SOURCES}
+BL2_SOURCES += ${DYN_CFG_SOURCES}
+
ifeq (${BL2_AT_EL3},1)
BL2_SOURCES += plat/arm/common/arm_bl2_el3_setup.c
endif
INFO("BL1: TB_FW_CONFIG loaded at address = %p\n",
(void *) config_base);
+
+#if TRUSTED_BOARD_BOOT && defined(DYN_DISABLE_AUTH)
+ int tb_fw_node;
+ uint32_t disable_auth = 0;
+
+ err = arm_dyn_tb_fw_cfg_init((void *)config_base, &tb_fw_node);
+ if (err < 0) {
+ WARN("Invalid TB_FW_CONFIG loaded\n");
+ return;
+ }
+
+ err = arm_dyn_get_disable_auth((void *)config_base, tb_fw_node, &disable_auth);
+ if (err < 0)
+ return;
+
+ if (disable_auth == 1)
+ dyn_disable_auth();
+#endif
}
/*
/* Remove the IMAGE_ATTRIB_SKIP_LOADING attribute from HW_CONFIG node */
hw_cfg_mem_params->image_info.h.attr &= ~IMAGE_ATTRIB_SKIP_LOADING;
+
+#if TRUSTED_BOARD_BOOT && defined(DYN_DISABLE_AUTH)
+ uint32_t disable_auth = 0;
+
+ err = arm_dyn_get_disable_auth((void *)tb_fw_cfg_dtb, tb_fw_node,
+ &disable_auth);
+ if (err < 0)
+ return;
+
+ if (disable_auth == 1)
+ dyn_disable_auth();
+#endif
}
#endif /* LOAD_IMAGE_V2 */
return 0;
}
+/*******************************************************************************
+ * Helper to read the `disable_auth` property in config DTB. This function
+ * expects the following properties to be present in the config DTB.
+ * name : disable_auth size : 1 cell
+ *
+ * Arguments:
+ * void *dtb - pointer to the TB_FW_CONFIG in memory
+ * int node - The node offset to appropriate node in the
+ * DTB.
+ * uint64_t *disable_auth - The value of `disable_auth` property on
+ * successful read. Must be 0 or 1.
+ *
+ * Returns 0 on success and -1 on error.
+ ******************************************************************************/
+int arm_dyn_get_disable_auth(void *dtb, int node, uint32_t *disable_auth)
+{
+ int err;
+
+ assert(dtb != NULL);
+ assert(disable_auth != NULL);
+
+ /* Check if the pointer to DT is correct */
+ assert(fdt_check_header(dtb) == 0);
+
+ /* Assert the node offset point to "arm,tb_fw" compatible property */
+ assert(node == fdt_node_offset_by_compatible(dtb, -1, "arm,tb_fw"));
+
+ /* Locate the disable_auth cell and read the value */
+ err = fdtw_read_cells(dtb, node, "disable_auth", 1, disable_auth);
+ if (err < 0) {
+ WARN("Read cell failed for `disable_auth`\n");
+ return -1;
+ }
+
+ /* Check if the value is boolean */
+ if (*disable_auth != 0 && *disable_auth != 1) {
+ WARN("Invalid value for `disable_auth` cell %d\n", *disable_auth);
+ return -1;
+ }
+
+ VERBOSE("Dyn cfg: `disable_auth` cell found with value = %d\n",
+ *disable_auth);
+ return 0;
+}
+
/*******************************************************************************
* Validate the tb_fw_config is a valid DTB file and returns the node offset
* to "arm,tb_fw" property.