From 500d40d877617653d347fb6308144973d4297ab9 Mon Sep 17 00:00:00 2001 From: Leon Chen Date: Thu, 24 Mar 2022 10:55:08 +0800 Subject: [PATCH] feat(plat/mediatek/build_helpers): introduce mtk makefile In order to modularize software libraries and platform drivers, we create makefile helpers to treat a folder as a basic compile unit. Each module has a build rule (rules.mk) to describe driver and software library source codes to be built in. Signed-off-by: Leon Chen Change-Id: Ib2113b259dc97937b7295b265509025b43b14077 --- .../build_helpers/conditional_eval_options.mk | 51 +++++++ .../build_helpers/mtk_build_helpers.mk | 139 ++++++++++++++++++ .../mtk_build_helpers_epilogue.mk | 30 ++++ plat/mediatek/build_helpers/options.mk | 17 +++ 4 files changed, 237 insertions(+) create mode 100644 plat/mediatek/build_helpers/conditional_eval_options.mk create mode 100644 plat/mediatek/build_helpers/mtk_build_helpers.mk create mode 100644 plat/mediatek/build_helpers/mtk_build_helpers_epilogue.mk create mode 100644 plat/mediatek/build_helpers/options.mk diff --git a/plat/mediatek/build_helpers/conditional_eval_options.mk b/plat/mediatek/build_helpers/conditional_eval_options.mk new file mode 100644 index 000000000..6bb3b4ed5 --- /dev/null +++ b/plat/mediatek/build_helpers/conditional_eval_options.mk @@ -0,0 +1,51 @@ +# +# Copyright (c) 2022, MediaTek Inc. All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +# + +# Conditional makefile variable assignment + +# Options depend on BUILD_TYPE variable +ifeq ($(BUILD_TYPE),release) +MTK_DEBUGSYS_LOCK := 1 +MTK_GET_PERM_DIS := 1 +ERRATA_KLEIN_2218950 := 0 +ERRATA_KLEIN_2184257 := 0 +ERRATA_KLEIN_BOOKER := 0 +ERRATA_MTH_BOOKER := 0 +ERRATA_MTHELP_BOOKER := 0 +CRASH_REPORTING := 1 +CONFIG_MTK_BL31_RAMDUMP := 0 +endif + +ifeq ($(BUILD_TYPE),debug) +MTK_PTP3_PROC_DEBUG := 1 +MTK_SRAMRC_DEBUG := 1 +MTK_IOMMU_DEBUG := 1 +MTK_DCM_DEBUG := 1 +MTK_EMI_MPU_DEBUG := 1 +endif + +ifeq (${SPD},none) +SPD_NONE:=1 +$(eval $(call add_define,SPD_NONE)) +endif + +# TEE OS config +ifeq ($(SPD), tbase) +CONFIG_TBASE := y +endif + +# MICROTRUST OS config +ifeq ($(SPD), teeid) +CONFIG_MICROTRUST_TEEI := y +endif + +ifeq (${CONFIG_ARCH_ARM_V8_2},y) +ARCH_VERSION := armv8_2 +endif + +ifeq (${CONFIG_ARCH_ARM_V9},y) +ARCH_VERSION := armv9 +endif diff --git a/plat/mediatek/build_helpers/mtk_build_helpers.mk b/plat/mediatek/build_helpers/mtk_build_helpers.mk new file mode 100644 index 000000000..47d96faed --- /dev/null +++ b/plat/mediatek/build_helpers/mtk_build_helpers.mk @@ -0,0 +1,139 @@ +# +# Copyright (c) 2022, MediaTek Inc. All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +# + +# Get local directory path +define GET_LOCAL_DIR +$(patsubst %/,%,$(dir $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))) +endef + +# Clear module source variable +define CLEAR_LOCAL_SRCS +$(eval $(1) :=) +endef + +define EXPAND_SUB_MAKEFILE +include $(S) +endef + +# Expand sub rules.mk +define INCLUDE_MAKEFILE +$(eval MODULES_SUB_MAKEFILE := $(patsubst %,%/rules.mk,$(1))) +$(foreach S,$(MODULES_SUB_MAKEFILE),$(eval $(EXPAND_SUB_MAKEFILE))) +endef + +# Determine option variable is defined or not then define it +define add_defined_option +ifdef $(1) +ifeq ($(findstring $(value $(1)), $(uppercase_table)),) +DEFINES += -D$(1)$(if $(value $(1)),=$(value $(1)),) +else +ifeq ($(strip $(value $(1))),y) +DEFINES += -D$(1)$(if $(value $(1)),=1,) +endif +endif +endif +endef + +define EXPAND_RULES_MAKEFILE +LOCAL_SRCS-y := +MODULE := +SUB_RULES-y := +include $(S) +endef + +# INCLUDE_MODULES macro expand included modules rules.mk +# Arguments: +# $(1) = MODULES variables +define INCLUDE_MODULES +$(eval MODULES_TEMP := $(1)) +$(eval MODULES_MAKEFILE := $(patsubst %,%/rules.mk,$(MODULES_TEMP))) +$(foreach S,$(MODULES_MAKEFILE),$(eval $(EXPAND_RULES_MAKEFILE))) +endef + +# MAKE_LOCALS expand module source file variable to BL${BL}_SOURCES +# Arguments: +# $(1) = source file +# $(2) = BL stage (1, 2, 2u, 31, 32) +define MAKE_LOCALS +$(eval $(call uppercase,$(2))_SOURCES += $(1)) +endef + +# MAKE_LINKERFILE change linker script source file name to +# target linker script +# $(1) = linker script source file +# $(2) = BL stage +define MAKE_LINKERFILE +$(eval EXTRA_GENERATED_LINKER_SCRIPT += $(BUILD_PLAT)/$(2)/$(patsubst %.ld.S,%.ld,$(notdir $(1)))) +endef + +# MAKE_LINKERFILE_ITER call MAKE_LINKERFILE iteratively +# $(1) = linker script source file +# $(2) = BL stage +define MAKE_LINKERFILE_ITER +$(eval $(foreach link_src,$(1),$(call MAKE_LINKERFILE,$(link_src),$(2)))) +endef + +# MAKE_LD_ITER generate the linker scripts using the C preprocessor iteratively +# $(1) = output linker script +# $(2) = input template +# $(3) = BL stage (1, 2, 2u, 31, 32) +define MAKE_LD_ITER +$(eval index_list=$(shell seq $(words $(1)))) +$(eval $(foreach i, $(index_list), \ +$(call MAKE_LD,$(word $(i), $(1)), $(word $(i), $(2)),$(3)))) +endef + +# MAKE_MODULE reference MAKE_OBJS. +# Create module folder under out/bl$(BL)/$(module) +# Arguments: +# $(1) = module name +# $(2) = source file +# $(3) = BL stage +define MAKE_MODULE + $(eval MODULE := $(strip $(1))) + $(eval BUILD_DIR := ${BUILD_PLAT}/${3}) + $(eval SOURCES := $(2)) + $(eval OBJS_TEMP := $(addprefix $(BUILD_DIR)/$(MODULE)/,$(call SOURCES_TO_OBJS,$(SOURCES)))) + $(eval MODULE_OBJS += $(OBJS_TEMP)) + # We use sort only to get a list of unique object directory names. + # ordering is not relevant but sort removes duplicates. + $(eval TEMP_OBJ_DIRS := $(sort $(dir ${OBJS_TEMP} ${LINKERFILE}))) + # The $(dir ) function leaves a trailing / on the directory names + # Rip off the / to match directory names with make rule targets. + $(eval OBJ_DIRS := $(patsubst %/,%,$(TEMP_OBJ_DIRS))) + +$(eval $(foreach objd,${OBJ_DIRS},$(call MAKE_PREREQ_DIR,${objd},${BUILD_DIR}))) +${3}_dirs: | ${OBJ_DIRS} + +$(eval $(call MAKE_OBJS,$(BUILD_DIR)/$(MODULE),$(SOURCES),${3})) + +libraries: $(OBJS_TEMP) +endef + +# Include MTK configuration files + +# MTK makefile variables +MTK_PLAT := plat/mediatek +MTK_PLAT_SOC := ${MTK_PLAT}/${MTK_SOC} +MTK_COMMON_CFG := $(MTK_PLAT)/common/common_config.mk +MTK_PLAT_CFG := $(MTK_PLAT_SOC)/plat_config.mk +MTK_PROJECT_CFG := $(MTK_PLAT)/project/$(PLAT)/project_config.mk +MTK_OPTIONS := $(MTK_PLAT)/build_helpers/options.mk +MTK_COND_EVAL := $(MTK_PLAT)/build_helpers/conditional_eval_options.mk + +# Indicate which BL should be built in command line +ifeq (${NEED_BL31},yes) +MTK_BL := bl31 +endif +ifeq (${NEED_BL32},yes) +MTK_BL := bl32 +endif +# Include common, platform, board level config +include $(MTK_COMMON_CFG) +include $(MTK_PLAT_CFG) +-include $(MTK_PROJECT_CFG) +include $(MTK_COND_EVAL) +include $(MTK_OPTIONS) diff --git a/plat/mediatek/build_helpers/mtk_build_helpers_epilogue.mk b/plat/mediatek/build_helpers/mtk_build_helpers_epilogue.mk new file mode 100644 index 000000000..22a546c6e --- /dev/null +++ b/plat/mediatek/build_helpers/mtk_build_helpers_epilogue.mk @@ -0,0 +1,30 @@ +# +# Copyright (c) 2022, MediaTek Inc. All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +# + +# Expand include modules +$(eval $(call INCLUDE_MODULES,$(MODULES-y))) + +# Make next section align to page size +ifneq ($(MTK_EXTRA_LINKERFILE),) +$(eval $(call MAKE_LINKERFILE_ITER,$(MTK_LINKERFILE_SOURCE),bl31)) + +# EXTRA_GENERATED_LINKER_SCRIPT is a global variable of derived linker +# script list(from MTK_LINKERFILE_SOURCE) after MAKE_LINKERFILE_ITER +# function call +EXTRA_LINKERFILE += ${EXTRA_GENERATED_LINKER_SCRIPT} + +# Expand derived linker script as build target +$(eval $(call MAKE_LD_ITER, $(EXTRA_GENERATED_LINKER_SCRIPT),$(MTK_LINKERFILE_SOURCE),bl31)) + +# mtk_align.ld MUST BE THE LAST LINKER SCRIPT! +EXTRA_LINKERFILE += ${MTK_PLAT}/include/mtk_align.ld + +# bl31.ld should depend on EXTRA_LINKERFILE +$(eval ${BUILD_PLAT}/bl31/bl31.ld: ${EXTRA_LINKERFILE}) +EXTRA_LINKERFILE := $(addprefix -T,$(EXTRA_LINKERFILE)) +else +EXTRA_LINKERFILE := +endif diff --git a/plat/mediatek/build_helpers/options.mk b/plat/mediatek/build_helpers/options.mk new file mode 100644 index 000000000..394a605ee --- /dev/null +++ b/plat/mediatek/build_helpers/options.mk @@ -0,0 +1,17 @@ +# +# Copyright (c) 2022, MediaTek Inc. All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause +# + +# call add_defined_option to evaluate MTK defined value +$(eval $(call add_defined_option,MTK_SIP_KERNEL_BOOT_ENABLE)) +$(eval $(call add_defined_option,PLAT_EXTRA_LD_SCRIPT)) +$(eval $(call add_defined_option,MTK_EXTRA_LINKERFILE)) +$(eval $(call add_defined_option,MTK_BL31_AS_BL2)) +$(eval $(call add_defined_option,MTK_BL33_IS_64BIT)) +$(eval $(call add_defined_option,PLAT_XLAT_TABLES_DYNAMIC)) +$(eval $(call add_defined_option,MTK_ADAPTED)) +$(eval $(call add_defined_option,MTK_SOC)) +$(eval $(call add_defined_option,UART_CLOCK)) +$(eval $(call add_defined_option,UART_BAUDRATE))