blob: 67d095ccc82d522ca5c395dc738e9043a9e3fa47 [file] [log] [blame]
# Google platform image creation for Bruno platform
#
#
# WARNING WARNING WARNING
#
# Because of how buildroot handles fs generation macros, it EATS DOUBLE
# QUOTES. Use only single quotes in all shell commands in this file, or
# you'll get very weird, hard-to-find errors.
ROOTFS_GINSTALL_DEPENDENCIES = host-mtd
ifeq ($(BR2_TARGET_ROOTFS_RECOVERYFS),y)
ROOTFS_GINSTALL_DEPENDENCIES += rootfs-recoveryfs
endif
INITRAMFS_IMAGE=initramfs.cpio.gz
INITRAMFS_COMPRESS_COMMAND='gzip -c'
ifeq ($(BR2_PACKAGE_SIMPLERAMFS),y)
ROOTFS_GINSTALL_DEPENDENCIES += simpleramfs
ifeq ($(BR2_PACKAGE_SIMPLERAMFS_XZ),y)
INITRAMFS_IMAGE=initramfs.cpio.xz
INITRAMFS_COMPRESS_COMMAND='xz -c --check=crc32 --lzma2=dict=1MiB'
endif
endif
ifeq ($(BR2_TARGET_ROOTFS_INITRAMFS),y)
ROOTFS_GINSTALL_DEPENDENCIES += rootfs-initramfs
endif
ifeq ($(BR2_TARGET_ROOTFS_SQUASHFS),y)
ROOTFS_GINSTALL_DEPENDENCIES += rootfs-squashfs host-dmverity host-google_signing
endif
ROOTFS_GINSTALL_VERSION = $(shell cat $(BINARIES_DIR)/version)
ROOTFS_GINSTALL_PLATFORMS = $(shell echo $(BR2_TARGET_GENERIC_PLATFORMS_SUPPORTED) | sed 's/[, ][, ]*/, /g' | tr a-z A-Z)
PLAT_NAME=$(call qstrip,$(BR2_TARGET_GENERIC_PLATFORM_NAME))
#
# Broadcom/CFE - GFHD100 (thin bruno), GFMS100 (fat bruno), GFHD200 (camaro)
#
ifneq ($(findstring $(PLAT_NAME),gfibertv gftv200),)
# Config strings have quotes around them for some reason, which causes
# trouble. This trick removes them.
BRUNO_CFE_DIR = $(call qstrip,$(BR2_TARGET_ROOTFS_GINSTALL_LOADER_DIR))
ifeq ($(BR2_PACKAGE_GOOGLE_PROD),y)
# Always install the prod bootloader when building prod images
_BRUNO_LOADER = cfe_signed_release
# Don't set the type to prod if building an unsigned image
ifeq ($(BR2_PACKAGE_GOOGLE_UNSIGNED),y)
ROOTFS_GINSTALL_TYPE=prod_unsigned
else
ROOTFS_GINSTALL_TYPE=prod
endif
else ifeq ($(BR2_PACKAGE_GOOGLE_OPENBOX),y)
_BRUNO_LOADER = cfe_signed_openbox
ROOTFS_GINSTALL_TYPE=openbox
else
_BRUNO_LOADER = cfe_signed_unlocked
ROOTFS_GINSTALL_TYPE=unlocked
endif
# These will be blank if the given files don't exist (eg. if you don't have
# access to the right repositories) and then we'll just leave them out of
# the build. The resulting image will not contain a bootloader, which is
# ok; we'll just leave the existing bootloader in place.
BRUNO_LOADER := $(wildcard $(BRUNO_CFE_DIR)/$(_BRUNO_LOADER).bin)
BRUNO_LOADER_SIG := $(wildcard $(BRUNO_CFE_DIR)/$(_BRUNO_LOADER).sig)
ifneq ($(BRUNO_LOADER),)
# We intentionally changed the filenames from v2 to v3 to prevent really
# harmful installs due to accidental half-compatibility.
BRUNO_LOADERS_V2 := loader.bin loader.sig
BRUNO_LOADERS_V3_V4 := loader.img loader.sig
endif
ROOTFS_GINSTALL_KERNEL_FILE=vmlinuz
BRUNO_SIGNING=y
endif # gfibertv gftv200
#
# Broadcom/Bolt - GFHD254 (Lockdown)
#
ifneq ($(findstring $(PLAT_NAME),gftv254),)
BOLT_DIR = $(call qstrip,$(BR2_TARGET_ROOTFS_GINSTALL_LOADER_DIR))
ifeq ($(BR2_PACKAGE_GOOGLE_PROD),y)
_BRUNO_LOADER = bolt_signed_release
ifeq ($(BR2_PACKAGE_GOOGLE_UNSIGNED),y)
ROOTFS_GINSTALL_TYPE=prod_unsigned
else
ROOTFS_GINSTALL_TYPE=prod
endif
else ifeq ($(BR2_PACKAGE_GOOGLE_OPENBOX),y)
_BRUNO_LOADER = bolt_signed_openbox
ROOTFS_GINSTALL_TYPE=openbox
else
_BRUNO_LOADER = bolt_signed_unlocked
ROOTFS_GINSTALL_TYPE=unlocked
endif
# These will be blank if the given files don't exist (eg. if you don't have
# access to the right repositories) and then we'll just leave them out of
# the build. The resulting image will not contain a bootloader, which is
# ok; we'll just leave the existing bootloader in place.
BRUNO_LOADER := $(wildcard $(BOLT_DIR)/$(_BRUNO_LOADER).bin)
BRUNO_LOADER_SIG := $(wildcard $(BOLT_DIR)/$(_BRUNO_LOADER).sig)
ifneq ($(BRUNO_LOADER),)
# We intentionally changed the filenames from v2 to v3 to prevent really
# harmful installs due to accidental half-compatibility.
BRUNO_LOADERS_V3_V4 := loader.img loader.sig
endif
ROOTFS_GINSTALL_KERNEL_FILE=zImage_signed
BRUNOv2_SIGNING=y
endif # gftv254
#
# Mindspeed/Barebox - GFRG200/210/250, GFSC100, GJCB100
#
ifneq ($(findstring $(PLAT_NAME),gfrg200 gfsc100 gjcb100),)
ifeq ($(BR2_PACKAGE_GOOGLE_KEY_SUFFIX),"")
# Config strings have quotes around them for some reason, which causes
# trouble. This trick removes them.
LOADER_DIR = $(call qstrip,$(BR2_TARGET_ROOTFS_GINSTALL_LOADER_DIR))
else
LOADER_DIR = $(call qstrip,$(BR2_TARGET_ROOTFS_GINSTALL_LOADER_DIR)/$(BR2_PACKAGE_GOOGLE_KEY_SUFFIX))
endif
ifeq ($(BR2_PACKAGE_GOOGLE_PROD),y)
_BAREBOX = barebox_signed_release
ifeq ($(BR2_PACKAGE_GOOGLE_UNSIGNED),y)
ROOTFS_GINSTALL_TYPE=prod_unsigned
else
ROOTFS_GINSTALL_TYPE=prod
endif
else
_BAREBOX = barebox_signed_unlocked
ROOTFS_GINSTALL_TYPE=unlocked
endif
_ULOADER = uloader_signed_release
# These will be blank if the given files don't exist (eg. if you don't have
# access to the right repositories) and then we'll just leave them out of
# the build. The resulting image will not contain a bootloader, which is
# ok; we'll just leave the existing bootloader in place.
BAREBOX := $(wildcard $(LOADER_DIR)/$(_BAREBOX).bin)
BAREBOX_SIG := $(wildcard $(LOADER_DIR)/$(_BAREBOX).sig)
# Don't include a uloader, until ginstall is smart enough to not downgrade the
# uloader if a newer one is in the flash.
ifeq (true,false)
ULOADER := $(wildcard $(LOADER_DIR)/$(_ULOADER).bin)
ULOADER_SIG := $(wildcard $(LOADER_DIR)/$(_ULOADER).sig)
endif
ifneq ($(BAREBOX),)
BRUNO_LOADERS_V3_V4 := $(BRUNO_LOADERS_V3_V4) loader.img loader.sig
endif
ifneq ($(ULOADER),)
BRUNO_LOADERS_V3_V4 := $(BRUNO_LOADERS_V3_V4) uloader.img uloader.sig
endif
ROOTFS_GINSTALL_KERNEL_FILE=uImage
OPTIMUS_SIGNING=y
BUILD_UIMAGE=y
MKIMAGE_KERNEL_LOAD_ADDRESS = 0x04008000
MKIMAGE_KERNEL_ENTRY_POINT = 0x04008000
MKIMAGE_DATA_FILE=zImage:$(INITRAMFS_IMAGE)
MKIMAGE_IMAGE_TYPE=multi
MKIMAGE_COMPRESSION_TYPE=none
MKIMAGE_EXTRA_FLAGS=
endif # gfrg200 gfsc100 gjcb100
#
# Arc/uboot - Frenzy, Skids, Prowl
#
ifneq ($(findstring $(PLAT_NAME),gfex250 gffrenzy gfrg240),)
# Include a u-boot image if it exists.
ifeq ($(PLAT_NAME),gfrg240)
LOADER_DIR = $(call qstrip,$(BR2_TARGET_ROOTFS_GINSTALL_LOADER_DIR))
ifeq ($(BR2_PACKAGE_GOOGLE_PROD),y)
_BRUNO_LOADER = u-boot-prod
ROOTFS_GINSTALL_TYPE=prod
else ifeq ($(BR2_PACKAGE_GOOGLE_OPENBOX),y)
_BRUNO_LOADER = u-boot-openbox
ROOTFS_GINSTALL_TYPE=openbox
else
_BRUNO_LOADER = u-boot-dev
ROOTFS_GINSTALL_TYPE=unlocked
endif
BRUNO_LOADER := $(wildcard $(LOADER_DIR)/$(_BRUNO_LOADER).bin)
BRUNO_LOADER_SIG := $(wildcard $(LOADER_DIR)/$(_BRUNO_LOADER).sig)
ifneq ($(BRUNO_LOADER),)
BRUNO_LOADERS_V3_V4 := loader.img loader.sig
endif
endif # gfrg240
# lzma compressed uImage is already available from the kernel build
ROOTFS_GINSTALL_KERNEL_FILE=uImage
endif # gfex250 gffrenzy gfrg240
#
# Armada/uboot - GFCH100 (chimera)
#
ifneq ($(findstring $(PLAT_NAME),gfch100),)
LOADER_DIR = $(call qstrip,$(BR2_TARGET_ROOTFS_GINSTALL_LOADER_DIR))
ifeq ($(BR2_PACKAGE_GOOGLE_PROD),y)
_BRUNO_LOADER = u-boot-spi-prod
ifeq ($(BR2_PACKAGE_GOOGLE_UNSIGNED),y)
ROOTFS_GINSTALL_TYPE=prod_unsigned
else
ROOTFS_GINSTALL_TYPE=prod
endif
else ifeq ($(BR2_PACKAGE_GOOGLE_OPENBOX),y)
_BRUNO_LOADER = u-boot-spi-openbox
ROOTFS_GINSTALL_TYPE=openbox
else
_BRUNO_LOADER = u-boot-spi-dev
ROOTFS_GINSTALL_TYPE=unlocked
endif
BRUNO_LOADER := $(wildcard $(LOADER_DIR)/$(_BRUNO_LOADER).bin)
BRUNO_LOADER_SIG := $(wildcard $(LOADER_DIR)/$(_BRUNO_LOADER).sig)
ifneq ($(BRUNO_LOADER),)
BRUNO_LOADERS_V3_V4 := loader.img loader.sig
endif
ROOTFS_GINSTALL_KERNEL_FILE = uImage
OPTIMUS_SIGNING=y
BUILD_UIMAGE=y
MKIMAGE_KERNEL_LOAD_ADDRESS = 0x04008000
MKIMAGE_KERNEL_ENTRY_POINT = 0x04008000
MKIMAGE_DATA_FILE=zImage:$(INITRAMFS_IMAGE):gfch100.dtb
MKIMAGE_IMAGE_TYPE=multi
MKIMAGE_COMPRESSION_TYPE=none
MKIMAGE_EXTRA_FLAGS=
endif # gfch100
#
# sanity check
#
ifeq ($(BR2_TARGET_ROOTFS_GINSTALL_V3)$(BR2_TARGET_ROOTFS_GINSTALL_V4),y)
ifndef ROOTFS_GINSTALL_KERNEL_FILE
$(error ROOTFS_GINSTALL_KERNEL_FILE is not defined for platform '$(PLAT_NAME)')
endif
endif
ifeq ($(BR2_TARGET_ROOTFS_SQUASHFS),y)
ROOTFS_GINSTALL_FILESYSTEM_FILE := rootfs.img
endif
# v3 and v4 image formats contain a manifest file, which describes the image
# and supported platforms.
#
# Note: need to use $(value XYZ) for XYZ variables that change during
# the build process (eg. because they read a file), since variable
# substitutions in this macro happen at macro define time, not
# runtime, unlike other make variables.
ifeq ($(BR2_TARGET_ROOTFS_GINSTALL_V4),y)
ROOTFS_GINSTALL_MANIFEST=MANIFEST
ROOTFS_GINSTALL_INSTALLER_VERSION=4
else
ROOTFS_GINSTALL_MANIFEST=manifest
ROOTFS_GINSTALL_INSTALLER_VERSION=3
endif
define ROOTFS_GINSTALL_CMD_V3_V4
set -e; \
rm -f $(BINARIES_DIR)/$(ROOTFS_GINSTALL_MANIFEST) && \
echo 'installer_version: $(ROOTFS_GINSTALL_INSTALLER_VERSION)' >>$(BINARIES_DIR)/$(ROOTFS_GINSTALL_MANIFEST) && \
if [ '$(BR2_TARGET_ROOTFS_GINSTALL_V4)' = 'y' ]; then \
echo 'minimum_version: $(BR2_TARGET_ROOTFS_GINSTALL_MINIMUM_VERSION)' >>$(BINARIES_DIR)/$(ROOTFS_GINSTALL_MANIFEST); \
fi && \
echo 'image_type: $(ROOTFS_GINSTALL_TYPE)' >>$(BINARIES_DIR)/$(ROOTFS_GINSTALL_MANIFEST) && \
echo 'version: $(value ROOTFS_GINSTALL_VERSION)' >>$(BINARIES_DIR)/$(ROOTFS_GINSTALL_MANIFEST) && \
echo 'platforms: [ $(ROOTFS_GINSTALL_PLATFORMS) ]' >>$(BINARIES_DIR)/$(ROOTFS_GINSTALL_MANIFEST) && \
if [ -e '$(BAREBOX)' ]; then \
cp $(BAREBOX) $(BINARIES_DIR)/loader.img && \
cp $(BAREBOX_SIG) $(BINARIES_DIR)/loader.sig; \
fi && \
if [ -e '$(ULOADER)' ]; then \
cp $(ULOADER) $(BINARIES_DIR)/uloader.img && \
cp $(ULOADER_SIG) $(BINARIES_DIR)/uloader.sig; \
fi && \
if [ -e '$(BRUNO_LOADER)' ]; then \
cp -f $(BRUNO_LOADER) $(BINARIES_DIR)/loader.img && \
cp -f $(BRUNO_LOADER_SIG) $(BINARIES_DIR)/loader.sig; \
fi && \
if [ '$(BRUNO_SIGNING)' = 'y' ]; then \
gzip -c <$(BINARIES_DIR)/vmlinux \
>$(BINARIES_DIR)/vmlinuz_unsigned && \
chmod 0644 $(BINARIES_DIR)/vmlinuz_unsigned && \
cp $(BINARIES_DIR)/vmlinuz_unsigned $(BINARIES_DIR)/vmlinuz && \
( \
export LD_PRELOAD=; $(call HOST_GOOGLE_SIGNING_SIGN); \
); \
fi && \
cd $(BINARIES_DIR) && \
if [ '$(BR2_TARGET_ROOTFS_SQUASHFS)' = 'y' ]; then \
ln -f rootfs.squashfs rootfs.img && \
if [ '$(BR2_TARGET_ROOTFS_RECOVERYFS)' != 'y' ]; then \
$(shell echo $(INITRAMFS_COMPRESS_COMMAND)) <simpleramfs.cpio >$(INITRAMFS_IMAGE); \
else \
$(shell echo $(INITRAMFS_COMPRESS_COMMAND)) <recoveryfs.cpio >$(INITRAMFS_IMAGE); \
fi; \
fi && \
if [ '$(BUILD_UIMAGE)' = 'y' ]; then \
$(HOST_DIR)/usr/bin/mkimage \
-A $(BR2_ARCH) -O linux -T $(MKIMAGE_IMAGE_TYPE) -C $(MKIMAGE_COMPRESSION_TYPE) \
-a $(MKIMAGE_KERNEL_LOAD_ADDRESS) -e $(MKIMAGE_KERNEL_ENTRY_POINT) -n Linux \
-d $(MKIMAGE_DATA_FILE) \
$(MKIMAGE_EXTRA_FLAGS) \
uImage && \
chmod a+r uImage && \
( \
if [ '$(OPTIMUS_SIGNING)' = 'y' ]; then \
if [ '$(BR2_TARGET_ROOTFS_RECOVERYFS)' = 'y' ]; then \
if [ '$(BR2_HAVE_EXTRA_CLEANUP)' != 'y' ]; then \
echo 'Signing recovery kernel with recovery private key'; \
export LD_PRELOAD=; $(call HOST_GOOGLE_SIGNING_OPTIMUS_RECOVERY_SIGN,uImage); \
else \
echo 'Signing emergency kernel with Optimus private key'; \
export LD_PRELOAD=; $(call HOST_GOOGLE_SIGNING_OPTIMUS_KERNEL_SIGN,uImage); \
fi \
else \
echo 'Signing kernel with Optimus private key' && \
export LD_PRELOAD=; $(call HOST_GOOGLE_SIGNING_OPTIMUS_KERNEL_SIGN,uImage); \
fi \
fi \
); \
fi && \
if [ '$(BRUNOv2_SIGNING)' = 'y' ]; then \
cp $(BINARIES_DIR)/zImage $(BINARIES_DIR)/zImage_unsigned && \
( \
export LD_PRELOAD=; $(call HOST_BRUNOv2_SIGNING_SIGN,\
$(BINARIES_DIR)/zImage,\
$(BINARIES_DIR)/$(ROOTFS_GINSTALL_KERNEL_FILE)); \
); \
fi && \
ln -f $(ROOTFS_GINSTALL_KERNEL_FILE) kernel.img && \
( \
if [ -n '$(ROOTFS_GINSTALL_FILESYSTEM_FILE)' ]; then \
echo -n 'rootfs.img-sha1: ' && sha1sum rootfs.img | cut -c1-40; \
fi; \
echo -n 'kernel.img-sha1: ' && sha1sum kernel.img | cut -c1-40 && \
if [ -n '$(BRUNO_LOADER)' ]; then \
echo -n 'loader.img-sha1: ' && sha1sum loader.img | cut -c1-40 && \
echo -n 'loader.sig-sha1: ' && sha1sum loader.sig | cut -c1-40; \
fi ) >>$(ROOTFS_GINSTALL_MANIFEST) && \
tar -cf '$(value ROOTFS_GINSTALL_VERSION).gi' \
$(ROOTFS_GINSTALL_MANIFEST) \
$(BRUNO_LOADERS_V3_V4) \
kernel.img \
$(ROOTFS_GINSTALL_FILESYSTEM_FILE) && \
ln -sf '$(value ROOTFS_GINSTALL_VERSION).gi' latest.gi;
endef
# v2 image format was used at launch of GFiber TV devices.
# it contains only a version file, and no provision for
# specifying platform compatibility
define ROOTFS_GINSTALL_CMD_V2
set -e; \
if [ '$(BR2_LINUX_KERNEL_VMLINUX)' = 'y' ]; then \
gzip -c <$(BINARIES_DIR)/vmlinux \
>$(BINARIES_DIR)/vmlinuz_unsigned && \
chmod 0644 $(BINARIES_DIR)/vmlinuz_unsigned && \
if [ -e '$(BRUNO_LOADER)' ]; then \
cp -f $(BRUNO_LOADER) $(BINARIES_DIR)/loader.bin && \
cp -f $(BRUNO_LOADER_SIG) $(BINARIES_DIR)/loader.sig; \
fi && \
cp $(BINARIES_DIR)/vmlinuz_unsigned $(BINARIES_DIR)/vmlinuz && \
( \
export LD_PRELOAD=; $(call HOST_GOOGLE_SIGNING_SIGN); \
); \
fi && \
cd $(BINARIES_DIR) && \
$(shell echo $(INITRAMFS_COMPRESS_COMMAND)) <simpleramfs.cpio >$(INITRAMFS_IMAGE) && \
tar -cf $(value ROOTFS_GINSTALL_VERSION).gi \
version \
$(BRUNO_LOADERS_V2) \
vmlinuz \
rootfs.squashfs && \
ln -sf '$(value ROOTFS_GINSTALL_VERSION).gi' latest.gi
endef
ifeq ($(BR2_TARGET_ROOTFS_GINSTALL_V3)$(BR2_TARGET_ROOTFS_GINSTALL_V4),y)
ROOTFS_GINSTALL_CMD=$(ROOTFS_GINSTALL_CMD_V3_V4)
else
ROOTFS_GINSTALL_CMD=$(ROOTFS_GINSTALL_CMD_V2)
endif
$(eval $(call ROOTFS_TARGET,ginstall))