Merge pull request #1104 from nmenon/dtb_build-v2
authordavidcunado-arm <david.cunado@arm.com>
Thu, 14 Dec 2017 22:11:06 +0000 (22:11 +0000)
committerGitHub <noreply@github.com>
Thu, 14 Dec 2017 22:11:06 +0000 (22:11 +0000)
Makefile: Add ability to build dtb (v2)

Makefile
make_helpers/build_macros.mk

index c0fddcf64eeed194527745b68a7bae12f63c9613..51e622efeb9102a965280558b6a308f4a058a404 100644 (file)
--- 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 (${ARM_ARCH_MAJOR},7)
 target32-directive     =       -target arm-none-eabi
@@ -163,6 +164,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
 ################################################################################
@@ -451,6 +454,10 @@ include bl31/bl31.mk
 endif
 endif
 
+ifdef FDT_SOURCES
+NEED_FDT := yes
+endif
+
 ################################################################################
 # Build options checks
 ################################################################################
@@ -551,7 +558,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
@@ -604,6 +611,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")
@@ -731,6 +745,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 ""
index 7531f6d8066388edd0e25d471bf3193dc74bd634..e1bfbbe70599879f60c03766563d0357e6b87f9e 100644 (file)
@@ -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