From 03b397a828299eba573f7a46dd74410b45f50ee1 Mon Sep 17 00:00:00 2001 From: Nishanth Menon Date: Fri, 14 Oct 2016 01:13:57 +0000 Subject: [PATCH] Makefile: Add ability to build dtb This is a revamp of the original approach in: https://github.com/ARM-software/arm-trusted-firmware/pull/747 Current build system has no means to automatically generate dtbs from dts, instead, stores the dtbs in the fdts/ folder. While this makes perfect sense for many reference platforms, this becomes a minor breakage in development flow for newer platforms. However, this can be solved by providing a rule for the dtbs while building the ATF binaries by purely describing which dts sources we need. For example, with this change, we will now be able to describe the dtbs we need for the platform in the corresponding platform.mk file: FDT_SOURCES += fdts/abc.dts This should be able to generate the abc.dtb appropriately. Since device trees are specification of hardware, we don't tie the rule to any specific BL, instead a generic rule is introduced. Further, this approach allows us to generate appropriate dtbs which may be need to be regenerated when a common dtsi gets updated, by just restricting changes to the dtsi alone, instead of synchronizing all the dtbs as well. If dtc is not available in default paths, but is available in an alternate location, it can be chosen by overriding the DTC variable such as 'make DTC=~/dtc/dtc ....` NOTE: dtbs are built only with the explicit make dtbs command. The rule is only available if the platform defines a FDT_SOURCES variable. Signed-off-by: Benjamin Fair Signed-off-by: Nishanth Menon --- Makefile | 17 ++++++++++++- make_helpers/build_macros.mk | 46 ++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index a7d3a8789..b8f2eb51e 100644 --- a/Makefile +++ b/Makefile @@ -125,6 +125,7 @@ OC := ${CROSS_COMPILE}objcopy OD := ${CROSS_COMPILE}objdump NM := ${CROSS_COMPILE}nm PP := ${CROSS_COMPILE}gcc -E +DTC ?= dtc ifeq ($(notdir $(CC)),armclang) TF_CFLAGS_aarch32 = -target arm-arm-none-eabi -march=armv8-a @@ -155,6 +156,8 @@ TF_LDFLAGS += --fatal-warnings -O1 TF_LDFLAGS += --gc-sections TF_LDFLAGS += $(TF_LDFLAGS_$(ARCH)) +DTC_FLAGS += -I dts -O dtb + ################################################################################ # Common sources and include directories ################################################################################ @@ -431,6 +434,10 @@ endif endif endif +ifdef FDT_SOURCES +NEED_FDT := yes +endif + ################################################################################ # Build options checks ################################################################################ @@ -524,7 +531,7 @@ endif # Build targets ################################################################################ -.PHONY: all msg_start clean realclean distclean cscope locate-checkpatch checkcodebase checkpatch fiptool fip fwu_fip certtool +.PHONY: all msg_start clean realclean distclean cscope locate-checkpatch checkcodebase checkpatch fiptool fip fwu_fip certtool dtbs .SUFFIXES: all: msg_start @@ -577,6 +584,13 @@ $(if ${BL2U}, ,$(eval $(call MAKE_BL,2u))) $(eval $(call FWU_FIP_ADD_PAYLOAD,${BL2U_PATH},--ap-fwu-cfg)) endif +# Expand build macros for the different images +ifeq (${NEED_FDT},yes) +$(eval $(call MAKE_DTBS,$(BUILD_PLAT)/fdts,$(FDT_SOURCES))) +$(eval $(call MAKE_FDT)) +dtbs: $(DTBS) +endif + locate-checkpatch: ifndef CHECKPATCH $(error "Please set CHECKPATCH to point to the Linux checkpatch.pl file, eg: CHECKPATCH=../linux/scripts/checkpatch.pl") @@ -704,6 +718,7 @@ help: @echo " distclean Remove all build artifacts for all platforms" @echo " certtool Build the Certificate generation tool" @echo " fiptool Build the Firmware Image Package (FIP) creation tool" + @echo " dtbs Build the Flattened device tree (if required for the platform)" @echo "" @echo "Note: most build targets require PLAT to be set to a specific platform." @echo "" diff --git a/make_helpers/build_macros.mk b/make_helpers/build_macros.mk index e59a64b42..fd8eb05ff 100644 --- a/make_helpers/build_macros.mk +++ b/make_helpers/build_macros.mk @@ -336,3 +336,49 @@ $(eval $(call MAKE_TOOL_ARGS,$(1),$(BIN),$(2))) endef +define SOURCES_TO_DTBS + $(notdir $(patsubst %.dts,%.dtb,$(filter %.dts,$(1)))) +endef + +# MAKE_FDT macro defines the targets and options to build each FDT binary +# Arguments: (none) +define MAKE_FDT + $(eval DTB_BUILD_DIR := ${BUILD_PLAT}/fdts) + $(eval DTBS := $(addprefix $(DTB_BUILD_DIR)/,$(call SOURCES_TO_DTBS,$(FDT_SOURCES)))) + $(eval TEMP_DTB_DIRS := $(sort $(dir ${DTBS}))) + # The $(dir ) function leaves a trailing / on the directory names + # Rip off the / to match directory names with make rule targets. + $(eval DTB_DIRS := $(patsubst %/,%,$(TEMP_DTB_DIRS))) + +$(eval $(foreach objd,${DTB_DIRS},$(call MAKE_PREREQ_DIR,${objd},${BUILD_DIR}))) + +fdt_dirs: ${DTB_DIRS} + +endef + +# MAKE_DTB generate the Flattened device tree binary (device tree binary) +# $(1) = output directory +# $(2) = input dts +define MAKE_DTB + +$(eval DOBJ := $(1)/$(patsubst %.dts,%.dtb,$(notdir $(2)))) +$(eval DEP := $(patsubst %.dtb,%.d,$(DOBJ))) + +$(DOBJ): $(2) | fdt_dirs + @echo " DTC $$<" + $$(Q)$$(DTC) $$(DTC_FLAGS) -d $(DEP) -o $$@ $$< + +-include $(DEP) + +endef + +# MAKE_DTBS builds flattened device tree sources +# $(1) = output directory +# $(2) = list of flattened device tree source files +define MAKE_DTBS + $(eval DOBJS := $(filter %.dts,$(2))) + $(eval REMAIN := $(filter-out %.dts,$(2))) + $(eval $(foreach obj,$(DOBJS),$(call MAKE_DTB,$(1),$(obj)))) + + $(and $(REMAIN),$(error Unexpected s present: $(REMAIN))) +endef