uboot: zynqmp: Support loading a PMU config
authorBrandon Maier <brandon.maier@rockwellcollins.com>
Fri, 26 Jun 2020 15:59:56 +0000 (10:59 -0500)
committerYann E. MORIN <yann.morin.1998@free.fr>
Sat, 27 Jun 2020 17:23:18 +0000 (19:23 +0200)
Before now, U-Boot SPL could only load the Platform Management Unit
(PMU) by patching the board-specific pm_cfg_obj.c file into the generic
PMU firmware, but that then requires generating a new PMU firmware for
every board configuration. To fix that, Luca Ceresoli added support to
U-Boot to load the pm_cfg_obj[1].

Like the PMU firmware, we need a way to pass the PMU cfg to U-Boot
during build. U-Boot only accepts the binary format of the cfg, so we
must convert the source file with the tool provided with U-Boot.

[1] https://lucaceresoli.net/zynqmp-uboot-spl-pmufw-cfg-load/

Signed-off-by: Brandon Maier <brandon.maier@rockwellcollins.com>
Signed-off-by: Yann E. MORIN <yann.morin.1998@free.fr>
boot/uboot/Config.in
boot/uboot/uboot.mk

index 8cce9b1bae34b2b6f430f585cd115162120c50e9..73031601008146d88a71a2d008f6bbe1d69498ba 100644 (file)
@@ -458,6 +458,28 @@ config BR2_TARGET_UBOOT_ZYNQMP_PMUFW
 
          This feature requires U-Boot >= 2018.07.
 
+config BR2_TARGET_UBOOT_ZYNQMP_PM_CFG
+       string "PMU configuration location"
+       depends on BR2_TARGET_UBOOT_BUILD_SYSTEM_KCONFIG
+       help
+         Location of a PMU configuration file.
+
+         If not empty, Buildroot will convert the PMU configuration
+         file into a loadable blob and pass it to U-Boot. The blob gets
+         embedded into the U-Boot SPL and is used to configure the PMU
+         during board initialization.
+
+         Unlike the PMU firmware, the PMU configuration file is unique
+         to each board configuration. A PMU configuration file can be
+         generated by building your Xilinx SDK BSP. It can be found in
+         the BSP source, for example at
+           ./psu_cortexa53_0/libsrc/xilpm_v2_4/src/pm_cfg_obj.c
+
+         Leave this option empty if your PMU firmware has a hard-coded
+         configuration object or you are loading it by any other means.
+
+         This feature requires U-Boot >= v2019.10.
+
 config BR2_TARGET_UBOOT_ZYNQMP_PSU_INIT_FILE
        string "Custom psu_init_gpl file"
        depends on BR2_TARGET_UBOOT_BUILD_SYSTEM_KCONFIG
index 71689207e31eb10b93dbbffb7a46780988b8d9a9..8a09969de1da3d30a28a615a80e74e0027327f53 100644 (file)
@@ -360,6 +360,22 @@ define UBOOT_ZYNQMP_KCONFIG_PMUFW
        $(call KCONFIG_SET_OPT,CONFIG_PMUFW_INIT_FILE,"$(UBOOT_ZYNQMP_PMUFW_PATH)")
 endef
 
+UBOOT_ZYNQMP_PM_CFG = $(call qstrip,$(BR2_TARGET_UBOOT_ZYNQMP_PM_CFG))
+ifneq ($(UBOOT_ZYNQMP_PM_CFG),)
+UBOOT_ZYNQMP_PM_CFG_BIN = $(UBOOT_DIR)/pm_cfg_obj.bin
+define UBOOT_ZYNQMP_KCONFIG_PM_CFG
+       $(call KCONFIG_SET_OPT,CONFIG_ZYNQMP_SPL_PM_CFG_OBJ_FILE,"$(UBOOT_ZYNQMP_PM_CFG_BIN)", \
+               $(@D)/.config)
+endef
+
+define UBOOT_ZYNQMP_PM_CFG_CONVERT
+       $(UBOOT_DIR)/tools/zynqmp_pm_cfg_obj_convert.py \
+               "$(UBOOT_ZYNQMP_PM_CFG)" \
+               "$(UBOOT_ZYNQMP_PM_CFG_BIN)"
+endef
+UBOOT_PRE_BUILD_HOOKS += UBOOT_ZYNQMP_PM_CFG_CONVERT
+endif
+
 UBOOT_ZYNQMP_PSU_INIT = $(call qstrip,$(BR2_TARGET_UBOOT_ZYNQMP_PSU_INIT_FILE))
 UBOOT_ZYNQMP_PSU_INIT_PATH = $(shell readlink -f $(UBOOT_ZYNQMP_PSU_INIT))
 
@@ -422,6 +438,7 @@ endif
 
 define UBOOT_KCONFIG_FIXUP_CMDS
        $(UBOOT_ZYNQMP_KCONFIG_PMUFW)
+       $(UBOOT_ZYNQMP_KCONFIG_PM_CFG)
        $(UBOOT_ZYNQMP_KCONFIG_PSU_INIT)
 endef