Makefile: Allow for builds for multiple SoCs
authorAndreas Dannenberg <>
Fri, 7 Jun 2019 19:21:08 +0000 (14:21 -0500)
committerAndreas Dannenberg <>
Mon, 10 Jun 2019 16:42:03 +0000 (11:42 -0500)
Allow for multiple SoCs to be built and object file names per SoC.

Signed-off-by: Nishanth Menon <>
Signed-off-by: Andreas Dannenberg <>
Reviewed-by: Suman Anna <>
soc/am65x/evm/board-cfg.c [moved from board-cfg.c with 100% similarity]
soc/am65x/evm/pm-cfg.c [moved from pm-cfg.c with 100% similarity]
soc/am65x/evm/rm-cfg.c [moved from rm-cfg.c with 100% similarity]
soc/am65x/evm/sec-cfg.c [moved from sec-cfg.c with 100% similarity]
soc/am65x/evm/sysfw_img_cfg.h [moved from include/soc/am65x/sysfw_img_cfg.h with 100% similarity]

index 2c247622e24d152192abf90d228a7fa572cba448..f0e94639653fddc677aa95aa376199b49488842c 100644 (file)
@@ -2,3 +2,4 @@
index dbb5013b70647aac64aed0badf330b51901889c1..a91daadd77256c554b017bbb29a6c964bc176f7e 100644 (file)
--- a/Makefile
+++ b/Makefile
 SOC ?= am65x
+CONFIG ?= evm
+O ?= out
+BIN_DIR ?= .
+srcroot = $(BUILD_SRC)
+soc_srcroot = $(srcroot)/soc/${SOC}/${CONFIG}
+objroot = $(O)
+soc_objroot = $(objroot)/soc/${SOC}/${CONFIG}
+binroot = $(BIN_DIR)
 # The HS SYSFW will only work on HS hardware when signed with valid
 # keys, warn HS users if the SECDEV environment variable is not set
@@ -72,29 +84,42 @@ CROSS_COMPILE ?= arm-linux-gnueabihf-
 CFLAGS ?= \
        -fno-builtin \
        -Wall \
-       -Iinclude/soc/${SOC}/ \
+       -Iinclude/soc/${SOC} \
+       -Isoc/${SOC}/${CONFIG} \
-BINS ?= \
-       sysfw.bin \
-       board-cfg.bin \
-       pm-cfg.bin \
-       rm-cfg.bin \
-       sec-cfg.bin
-ITB ?= sysfw.itb
-ITS ?= $(basename $(ITB)).its
+       board-cfg.c \
+       pm-cfg.c \
+       rm-cfg.c \
+       sec-cfg.c
+SOC_BINS += $(SOURCES:%.c=$(soc_objroot)/%.bin)
+SOC_BIN_NAMES += $(SOURCES:%.c=%.bin)
+ITB ?= $(binroot)/sysfw-$(SOC)-$(CONFIG).itb
+ITS ?= $(soc_objroot)/$(basename $(notdir $(ITB))).its
+vpath %.itb $(soc_objroot)
+vpath %.bin $(soc_objroot)
+vpath %.o $(soc_objroot)
+vpath %.c $(soc_srcroot)
 MKIMAGE ?= mkimage
-.PHONY: all
-all: $(ITB)
+.PHONY: all _objtree_build
-%.o: %.c
-       $(CROSS_COMPILE)gcc $(CFLAGS) -c -o $@ $<
+all: _objtree_build $(ITB)
-%.bin: %.o
-       $(CROSS_COMPILE)objcopy -S -O binary $< $@
+       @mkdir -p $(objroot) $(soc_objroot) $(binroot)
        @echo "Downloading SYSFW release image..."
@@ -116,10 +141,10 @@ $(SYSFW_HS_CERTS_PATH): $(SYSFW_HS_INNER_CERT_PATH)
        @echo "Signing the SYSFW inner certificate with $(KEY) key...";
        ./ -d -c m3 -b $< -o $@ -l 0x40000 -k $(KEY);
+$(soc_objroot)/sysfw.bin: $(SYSFW_HS_CERTS_PATH) $(SYSFW_HS_PATH) sysfw_version
        cat $^ > $@
-sysfw.bin: $(SYSFW_PATH) sysfw_version
+$(soc_objroot)/sysfw.bin: $(SYSFW_PATH) sysfw_version
        @if [ -n "$(KEY)" ]; then \
                echo "Signing the SYSFW release image with $(KEY) key..."; \
                ./ -c m3 -b $< -o $@ -l 0x40000 -k $(KEY); \
@@ -129,22 +154,33 @@ sysfw.bin: $(SYSFW_PATH) sysfw_version
-$(ITS): $(BINS)
-       ./ $(BINS) > $@
+$(ITS): soc_objs $(SOC_BINS)
+       ./ $(SOC_BIN_NAMES) > $@
-$(ITB): $(ITS) $(BINS)
+$(ITB): $(ITS)
        $(MKIMAGE) -f $< -r $@
+soc_objs: $(SOC_OBJS)
+$(soc_objroot)/%.o: %.c
+       $(CROSS_COMPILE)gcc $(CFLAGS) -c -o $@ $<
+%.bin: %.o
+       $(CROSS_COMPILE)objcopy -S -O binary $< $@
 .PHONY: sysfw_version
 sysfw_version: $(SYSFW_PATH)
        @echo "SYSFW Version:" `strings $(SYSFW_PATH) | grep -o 'v20[0-9][0-9]\.[0-9][0-9].*(.*'`
 .PHONY: clean
-       -rm -f $(BINS)
+       -rm -f $(SOC_BINS) $(SOC_OBJS)
        -rm -f $(ITB)
        -rm -f $(ITS)
        -rm -f $(SYSFW_HS_CERTS_PATH)
+       -rm -rf $(objroot)
 .PHONY: mrproper
 mrproper: clean
index 2c0d3141af5611746f743931830d194d2a38a00a..9d45cb5b844b39e65031ad3f3530d9d100d4b36b 100644 (file)
--- a/
+++ b/
@@ -1,5 +1,5 @@
-System Firmware (SYSFW) and Configuration Image Generator for AM65x
+System Firmware (SYSFW) and Configuration Image Generator TI K3 Family SoCs
@@ -16,13 +16,22 @@ case. The domain-specific configuration artifacts to be tailored are:
 * *rm-cfg.c* contains the resource management / allocation related configuration
 * *sec-cfg.c* contains the security configuration
+These files exist under {srcroot}/soc/{soc}/{configuration}/ folders, Where:
+* srcroot - Is the root folder of source code
+* soc - Is one of the supported SoCs. Example: am65x
+* configuration - This is one of the supported configurations for various
+  resource division desired. Example: evm
+NOTE: The definitions for the same are available under
+{srcroot}/include/soc/{soc} folder
 The build process consumes a raw (unsigned) SYSFW binary image as released by
 the SYSFW development team and signs it by adding an X.509 certificate using a
 random key.
 The signed SYSFW image as well as the configuration artifacts will then all get
-build into an ITB blob (FIT image) named **sysfw.itb** ready for consumption by
-U-Boot SPL.
+build into an ITB blob (FIT image) named **sysfw-{soc}-{configuration}.itb**
+ready for consumption by U-Boot SPL.
 Building SYSFW Image and Configuration Data
@@ -44,9 +53,10 @@ this project, otherwise a version specified in the Makefile via Git commit hash
 will be downloaded from the TI SYSFW release URL (see download location below).
 The default SYSFW image consumed by the build process is called
-**ti-sci-firmware-am65x-gp.bin** however this may be overwritten and customized
+**ti-sci-firmware-{soc}-gp.bin** however this may be overwritten and customized
 using the **SYSFW_PATH** make variable. The build process will fail if the
-image can't be downloaded or no such file is provided.
+image can't be downloaded to {srcroot} or no such file has gotten populated into
+that folder by other means.
 Further note by default the SYSFW image for use with general purpose (GP) devices
 (as opposed to high security devices) is signed with the TI degenerate key to
@@ -59,10 +69,20 @@ setting by passing in **KEY=""** a random key will get generated and used during
 the build process.
 In order to download the SYSFW release image (if needed) and build the final
-**sysfw.itb** for consumption by U-Boot simply perform a make...
+**sysfw-{soc}-{configuration}.itb** for consumption by U-Boot SPL simply by
+perform a make.
     $ make
+Note that in case of filesystem-based boot such as booting from SD card
+**sysfw-{soc}-{configuration}.itb** needs to be manually renamed to
+**syswfw.itb** before populating it to the (SD card) boot media as this is the
+file name U-Boot SPL will be trying to load early during the boot process. This
+renaming step is not necessary for RAW boot modes such as eMMC (in RAW mode),
+(x)SPI, and others.
+    $ mv sysfw-{soc}-{configuration}.itb syswfw.itb
 To extract and show the release version of the SYSFW image being used...
     $ make sysfw_version
@@ -76,6 +96,17 @@ To also remove the SYSFW image do this...
     $ make mrproper
+The following flags further modify the build steps:
+* SOC - Choose one of the supported SoCs (see folder name under {srcroot}/soc).
+  Defaults to am65x
+* CONFIG - Choose of various configurations supported (see folder name under
+  {srcroot}/soc/{soc}). Defaults to evm
+* O - Choose where the intermediate build files need to be located
+* BIN_DIR - Choose where the final output sysfw-{soc}-{configuration}.itb needs
+  to be generated to.
+* KEY - Choose key to use for the signing system firmware image
 Building SYSFW Image for High-Security(HS) devices
 The process for building and image suitable for use with HS devices is similar
@@ -90,13 +121,14 @@ the TI Secure Development Tools package.
 There are two images downloaded and consumed by the build process.
-    * ti-sci-firmware-am65x-hs-enc.bin: Encrypted HS SYSFW image
-    * ti-sci-firmware-am65x-hs-cert.bin: Inner-certificate for HS SYSFW image
+    * ti-sci-firmware-{soc}-hs-enc.bin: Encrypted HS SYSFW image
+    * ti-sci-firmware-{soc}-hs-cert.bin: Inner-certificate for HS SYSFW image
 The inner-certificate is signed by the key provided by the **TI_SECURE_DEV_PKG**
 path producing an outer-certificate. These images are then appended to produce
-the final **sysfw.bin** which is bundled with the configuration data exactly as
-the non-HS version above.
+the final **sysfw-{soc}-{configuration}.bin** which is bundled with the
+configuration data exactly as the non-HS version above.
 Important Notes
similarity index 100%
rename from board-cfg.c
rename to soc/am65x/evm/board-cfg.c
similarity index 100%
rename from pm-cfg.c
rename to soc/am65x/evm/pm-cfg.c
similarity index 100%
rename from rm-cfg.c
rename to soc/am65x/evm/rm-cfg.c
similarity index 100%
rename from sec-cfg.c
rename to soc/am65x/evm/sec-cfg.c