# Be silent per default, but 'make V=1' will show all compiler calls.
ifneq ($(V),1)
Q = @
NULL = 2>&1 > /dev/null
endif

ifneq ($(DEVELOPER_LOCAL_BUILD), true)
# KINIBI TA CONFIG for RBS/PBS BUILD
ifeq ($(TZ_PLATFORM), KINIBI)
TASDK_DIR_SRC = $(TLSDK_DIR_SRC)
TA_UUID = ffffffff00000000000000000000003e
HW_CRYPTO = MOBICORE
COMMON_LIB_ARCH_DIR = Mobicore
MODE = Release
SIGNING_OPTION = '-s 3 -n 1 -i 3 -m 2 -f 8 -sh 1048576 -mh 2097152'
TRUSTLET_SIGN_CONF = $(SIGNING_OPTION)
SIGNING_TYPE =
TBASE_API_LEVEL = 5
KNOX_EXTENSION = y
ROOT_OF_TRUST_API = y
ifeq ($(KM_TARGET_SOC), $(filter exynos7885, $(KM_TARGET_SOC)))
	KM_TARGET_SOC = exynos7885
	SCRYPTO_VER = 2_2
	SIGNING_MODEL = EXYNOS7885_MOBICORE
	SIGNING_RUNTYPE = gd_mobicore400_trustlet
endif
ifeq ($(KM_TARGET_SOC), $(filter exynos9810%, $(KM_TARGET_SOC)))
	KM_TARGET_SOC_BASE = exynos9810
	MC_TA_RP = y
	SIGNING_MODEL = EXYNOS9810_MOBICORE
	ifeq ($(TARGET_PRODUCT), $(filter haechiy19eea haechiy19xx haechiy19kx haechiy19dx haechiy19ktt, $(TARGET_PRODUCT)))
		KM_TARGET_SOC = exynos9810
		SCRYPTO_VER = 2_2
		SIGNING_RUNTYPE = gd_mobicore400_trustlet
	else
		KM_TARGET_SOC = exynos9810_K500
		SCRYPTO_VER = 2_5
		SIGNING_RUNTYPE = gd_mobicore500_trustlet
		MOBICORE_TZ_V5 = y
	endif
endif
ifeq ($(KM_TARGET_SOC), $(filter MT6768, $(KM_TARGET_SOC)))
	KM_TARGET_SOC = MT6768
	SCRYPTO_VER = 2_5
	SIGNING_MODEL = MT6768_MOBICORE
	SIGNING_RUNTYPE = gd_mobicore410_trustlet
	USE_MTK = y
endif
# TEEGRIS TA CONFIG for RBS/PBS BUILD
else ifeq ($(TZ_PLATFORM), TEEGRIS)
ifneq ($(CONFIG_SUPPORT_64ONLY), y)
	CONFIG_TA_ARCH = 32
endif
include $(KM_TEEGRIS_CONFIG)
TEEGRIS_SDK_ROOT = $(CONFIG_SW_TOOLCHAIN_ROOT)
TA_UUID = 00000000-0000-0000-0000-4b45594d5354
HW_CRYPTO = TEEGRIS
COMMON_LIB_ARCH_DIR = TEEgris
KNOX_EXTENSION=y
ROOT_OF_TRUST_API=y
ifeq ($(KM_SUPPORT_PROCA), TRUE)
	ifeq ($(KM_TARGET_SOC), $(filter tg_exynos2100 tg_exynos9830 tg_exynos990 tg_exynos9830 tg_exynos990 tg_exynos9820 tg_exynos9825, $(KM_TARGET_SOC)))
		SUPPORT_PROCA=y
	endif
endif
ifeq ($(KM_TARGET_SOC), $(filter tg_MT6739, $(KM_TARGET_SOC)))
	KM_TARGET_SOC = tg_MT6739
	SCRYPTO_VER=2_5
	TEEGRIS_TZ_VER=4
	USE_MTK=y
	USE_TEEGRIS_ROT_API=y
endif
ifeq ($(KM_TARGET_SOC), $(filter tg_MT6765, $(KM_TARGET_SOC)))
	KM_TARGET_SOC = tg_MT6765
	SCRYPTO_VER=2_6
	TEEGRIS_TZ_VER=42
	USE_MTK=y
	ifneq ($(TARGET_PRODUCT), $(filter a12%, $(TARGET_PRODUCT)))
		#NOTE: a12% uses ICCC API to get ROT, otherwise uses TEEGRIS ROT API and not support SAK
		USE_TEEGRIS_ROT_API=y
	endif
endif
ifeq ($(KM_TARGET_SOC), $(filter tg_MT6769T, $(KM_TARGET_SOC)))
	KM_TARGET_SOC = tg_MT6769T
	SCRYPTO_VER=2_6
	TEEGRIS_TZ_VER=42
	USE_MTK=y
endif
ifeq ($(KM_TARGET_SOC), $(filter tg_MT6833, $(KM_TARGET_SOC)))
	KM_TARGET_SOC = tg_MT6833
	SCRYPTO_VER=2_6
	TEEGRIS_TZ_VER=42
	USE_MTK=y
	ifneq ($(TARGET_PRODUCT), $(filter f42xskt a22xlgt a22ex% a13x%, $(TARGET_PRODUCT)))
		#NOTE: [JDM] f42xskt/a22xlgt uses ICCC API to get ROT and supports SAK for S Pay, otherwise uses TEEGRIS ROT API and not support SAK
		#NOTE: [INHOUSE] a22ex% a13x% uses ICCC API to get ROT 
		USE_TEEGRIS_ROT_API=y
	endif
endif
ifeq ($(KM_TARGET_SOC), $(filter tg_MT6853, $(KM_TARGET_SOC)))
	KM_TARGET_SOC = tg_MT6853
	SCRYPTO_VER=2_6
	TEEGRIS_TZ_VER=42
	USE_MTK=y
endif
ifeq ($(KM_TARGET_SOC), $(filter tg_MT8768T, $(KM_TARGET_SOC)))
	KM_TARGET_SOC = tg_MT8768T
	SCRYPTO_VER=2_6
	TEEGRIS_TZ_VER=42
	USE_MTK=y
	GRDM_LIB = $(TEEGRIS_TA_BUILD_ROOT)/standalone/SEM/lib/teegris/mt8768t/nxpV4/grdm.lib
endif
ifeq ($(KM_TARGET_SOC), $(filter tg_exynos3830 tg_exynos850, $(KM_TARGET_SOC)))
	KM_TARGET_SOC = tg_exynos3830
	SCRYPTO_VER=2_5
	TEEGRIS_TZ_VER=4
endif
ifeq ($(KM_TARGET_SOC), $(filter tg_exynos7885% tg_exynos7884% tg_exynos7904 tg_exynos7905, $(KM_TARGET_SOC)))
	KM_TARGET_SOC_BASE = tg_exynos7885
ifeq ($(TARGET_PRODUCT), $(filter a10eudcm a10eukdi, $(TARGET_PRODUCT)))
	KM_TARGET_SOC = tg_exynos7885_T410
	SCRYPTO_VER=2_5
	TEEGRIS_TZ_VER=4
else
ifeq ($(TARGET_PRODUCT), $(filter a30sx% a30sd% a30su%, $(TARGET_PRODUCT)))
	KM_TARGET_SOC = tg_exynos7885_80M
else ifeq ($(TARGET_PRODUCT), $(filter gta4s%, $(TARGET_PRODUCT)))
	KM_TARGET_SOC = tg_exynos7885_28M
else ifeq ($(TARGET_PRODUCT), $(filter a10kx a10ser a10dd a10ekx, $(TARGET_PRODUCT)))
	KM_TARGET_SOC = tg_exynos7885_30M
else
	KM_TARGET_SOC = tg_exynos7885
endif # End of 'ifeq ($(TARGET_PRODUCT), $(filter a30sx% a30sd% a30su%, $(TARGET_PRODUCT)))'
	SCRYPTO_VER=2_4
	TEEGRIS_TZ_VER=3
endif # End of 'ifeq ($(TARGET_PRODUCT), $(filter a10eudcm a10eukdi, $(TARGET_PRODUCT)))'
endif
ifeq ($(KM_TARGET_SOC), $(filter tg_exynos9110, $(KM_TARGET_SOC)))
	KM_TARGET_SOC = tg_exynos9110
	SCRYPTO_VER=2_6
	TEEGRIS_TZ_VER=42
	ROOT_OF_TRUST_API=n
endif
ifeq ($(KM_TARGET_SOC), $(filter tg_exynos9610 tg_exynos9611, $(KM_TARGET_SOC)))
	KM_TARGET_SOC = tg_exynos9610
	SCRYPTO_VER=2_4
	TEEGRIS_TZ_VER=3
endif
ifeq ($(KM_TARGET_SOC), $(filter tg_exynos9630 tg_exynos980, $(KM_TARGET_SOC)))
	KM_TARGET_SOC = tg_exynos9630
	SCRYPTO_VER=2_5
	TEEGRIS_TZ_VER=4
endif
ifeq ($(KM_TARGET_SOC), $(filter tg_exynos9810, $(KM_TARGET_SOC)))
	KM_TARGET_SOC = tg_exynos9810
	SCRYPTO_VER=2_5
	TEEGRIS_TZ_VER=4
endif
ifeq ($(KM_TARGET_SOC), $(filter tg_exynos9820 tg_exynos9825, $(KM_TARGET_SOC)))
	KM_TARGET_SOC = tg_exynos9820
	SCRYPTO_VER=2_4
	TEEGRIS_TZ_VER=3
	SUPPORT_SPU=y
endif
ifeq ($(KM_TARGET_SOC), $(filter tg_exynos9830 tg_exynos990, $(KM_TARGET_SOC)))
	KM_TARGET_SOC = tg_exynos9830
	SCRYPTO_VER=2_5
	TEEGRIS_TZ_VER=4
	SUPPORT_SPU=y
	SUPPORT_SPU_STRONGBOX=y
endif
ifeq ($(KM_TARGET_SOC), $(filter tg_exynos2100, $(KM_TARGET_SOC)))
	KM_TARGET_SOC = tg_exynos2100
	SCRYPTO_VER=2_6
	TEEGRIS_TZ_VER=42
	SUPPORT_SPU=y
	SUPPORT_SPU_STRONGBOX=y
endif
ifeq ($(KM_TARGET_SOC), $(filter tg_s5e5515, $(KM_TARGET_SOC)))
	KM_TARGET_SOC = tg_s5e5515
	SCRYPTO_VER=2_6
	TEEGRIS_TZ_VER=42
endif
endif # End of 'ifeq ($(TZ_PLATFORM), KINIBI)'
TARGET_DIR = $(KM_TARGET_SOC)
endif # End of 'ifneq ($(DEVELOPER_LOCAL_BUILD), true)'

OUT_PATH=$(KMSRK_ROOT_PATH)/released_TA/$(TARGET_DIR)
KM_COMMON_LIB_PATH=$(KMSRK_ROOT_PATH)/../common
ifeq (TZ.BF.4.0,$(findstring TZ.BF.4.0,$(QSEE_TZ_VER)))
QSEE_SECMSM_DIR=core
else
QSEE_SECMSM_DIR=ssg
endif

#-------------------------------------------------------------------------------
# Defines
#-------------------------------------------------------------------------------

DEF = OPENSSL_FIPS

DEF += $(KM_TARGET_SOC)
DEF += $(KM_TARGET_SOC_BASE)

ifeq ($(DEBUG), y)
DEF += ENABLE_DBG_STRINGS=1
DEF += TL_DEBUG
DEF += DEBUG
endif

ifeq ($(MEMLEAK_DBG), y)
DEF += MEMLEAK_DBG
endif

ifeq ($(ROOT_OF_TRUST_API), y)
DEF += ROOT_OF_TRUST_API
endif

ifeq ($(USE_GATEKEEPER), y)
DEF += USE_GATEKEEPER
DEF += GOOGLE_THROTTLE_TIMEOUT
endif

ifeq ($(TEST_MODE), y)
DEF += TEST_MODE
endif

ifeq ($(SELF_TEST), y)
DEF += SELF_TEST
endif

ifeq ($(DS5_V6), y)
DEF += DS5_V6
endif

ifeq ($(KNOX_EXTENSION),y)
DEF += KNOX_EXTENSION
endif

ifeq ($(SUPPORT_SPU_STRONGBOX),y)
DEF += SUPPORT_SPU_STRONGBOX
endif

ifeq ($(SUPPORT_SPU),y)
DEF += USE_SPU
DEF += SPU_PROVISION
endif

ifeq ($(USE_GRDM),y)
	ifeq ($(DEVELOPER_LOCAL_BUILD), true)
		GRDM_LIB = $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/GRDM/$(KM_TARGET_SOC)/grdm.lib
	endif
	DEF += USE_GRDM
endif

ifeq ($(SCRYPTO_VER), 2)
DEF += SCRYPTO_VER=20
else
DEF += SCRYPTO_VER=$(shell echo $(SCRYPTO_VER) | sed 's/_//')
endif

KM_VERSION_H = $(KM_ROOT_PATH)/common/km_version.h
KM_VERSION = $(shell cat $(KM_VERSION_H) | grep 'MDFPP_KEYMASTER_VERSION' | sed 's/.*"\([0-9]\)\.\([0-9]\)\.\([0-9]\+\)"/\1.\2\3/g')
DEF += KM_VERSION=\"$(KM_VERSION)\"

ifeq ($(HW_CRYPTO), MOBICORE)
DEF += MOBICORE
DEF += USE_MOBICORE
ifneq ($(USE_MTK),y)
DEF += FCDRV=1
endif
ifeq ($(MOBICORE_TZ_V5), y)
DEF += MOBICORE_TZ_V5
endif
ARCH_DIR = mc
endif

ifeq ($(USE_MTK),y)
DEF += USE_MTK
endif

ifeq ($(HW_CRYPTO), QUALCOMM)
DEF += USE_QUALCOMM
DEF += $(QSEE_CHIPSET)
ARCH_DIR = qc

ifeq (TZ.BF.4.0,$(findstring TZ.BF.4.0,$(QSEE_TZ_VER)))
DEF += QSEE_TZ_VER=4
else ifeq (TZ.XF.5,$(findstring TZ.XF.5,$(QSEE_TZ_VER)))
DEF += QSEE_TZ_VER=5
endif

ifeq ($(ROOT_OF_TRUST_API), y)
ifeq ($(USE_GRDM),y)
	ifeq ($(QSEE_CHIPSET),sm6115)
		DEF += USE_DEFAULT_ROT_KEY
	endif
else
	ifeq ($(QSEE_CHIPSET), $(filter sm8150 sm7150 sm7125 sm6150 sdm710, $(QSEE_CHIPSET)))
		# iccc legacy version
		DEF += CONFIG_QSEE
		DEF += TZ_ICCC_APP=1
		DEF += ICCC_FEATURE
	endif
endif # End of 'ifneq ($(USE_GRDM),y)'

ifeq ($(QSEE_CHIPSET), sm6150)
DEF += SM6150_CHIPSET
else ifeq ($(QSEE_CHIPSET), sm7150)
DEF += SM7150_CHIPSET
endif # End of 'ifeq ($(QSEE_CHIPSET), sm6150)'
endif # End of 'ifeq ($(ROOT_OF_TRUST_API), y)'

endif # End of 'ifeq ($(HW_CRYPTO), QUALCOMM)'

ifeq ($(HW_CRYPTO), TEEGRIS)
DEF += USE_TEEGRIS
DEF += TEEGRIS_TZ_VER=$(TEEGRIS_TZ_VER)
ARCH_DIR = tg
endif

ifeq ($(KM_TARGET_SOC), $(filter tg_exynos2100, $(KM_TARGET_SOC)))
DEF += CONFIG_SSP_SNVM_DATA_3KB
USE_HWVAULT=y
DEF += USE_HWVAULT
endif

#-------------------------------------------------------------------------------
# Compiler Flags
#-------------------------------------------------------------------------------

CFLAGS =
ifneq ($(HW_CRYPTO),TEEGRIS)
ifneq ($(DS5_V6), y)
CFLAGS += --diag_suppress=1297
CFLAGS += --diag_suppress=193
CFLAGS += --diag_suppress=171
CFLAGS += --diag_suppress=285
CFLAGS += --diag_suppress=295
CFLAGS += --diag_suppress=1301
CFLAGS += --diag_suppress=2530
CFLAGS += --diag_suppress=66 #Error:  #66-D: enumeration value is out of "int" range
ifeq ($(SCRYPTO_VER), 2_5)
CFLAGS += --diag_suppress=191 #Error: #191-D: type qualifier is meaningless on cast type from scrypto v2.5 stack.h
endif
ifneq ($(DEBUG), y)
CFLAGS += --protect_stack --protect_stack_all
CFLAGS += --diag_error=warning
endif
endif
endif

#-------------------------------------------------------------------------------
# Include Dirs
#-------------------------------------------------------------------------------

INC =  $(KM_ROOT_PATH)/swd/src/trusted_app
INC += $(KM_ROOT_PATH)/swd/src/unit_tests
INC += $(KM_ROOT_PATH)/nwd/common
INC += $(KM_ROOT_PATH)/swd/common
INC += $(KM_ROOT_PATH)/common
INC += $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)
INC += $(KM_ROOT_PATH)/nwd/src_helper/common
INC += $(KM_ROOT_PATH)/common/scl/include

INC += $(TZ_SCRYPTO_HEADER_PATH)
INC += $(KM_ROOT_PATH)/swd/common/scrypto_$(SCRYPTO_VER)

ifeq ($(USE_GRDM),y)
INC += $(KM_COMMON_LIB_PATH)/include/GRDM/swd
endif

ifeq ($(HW_CRYPTO), QUALCOMM)
	INC += $(QSEE_ROOT_PATH)/core/api/services
	INC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/api/securemsm/trustzone/qsee
	INC += $(QSEE_ROOT_PATH)/apps/securemsm/trustzone/qsapps/keymaster/lib
	INC += $(QSEE_ROOT_PATH)/apps/securemsm/trustzone/qsapps/keymaster/km4/inc

	ifeq ($(ROOT_OF_TRUST_API), y)
		ifeq ($(USE_GRDM),y)
			INC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/tz_icccgrd_common/inc
			INC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/trustzone/qsapps/icccgrd/inc
		else ifeq ($(QSEE_CHIPSET), $(filter sm8150 sm7150 sm7125 sm6150 sdm710, $(QSEE_CHIPSET)))
			# legacy version
			INC += $(QSEE_ROOT_PATH)/core/api/kernel/libstd/stringl
			INC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/secrsa/shared/src
			INC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/secmath/shared/inc
			INC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/uclib/usr/legacy/secrsa/shared/src
			INC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/uclib/usr/legacy/secrsa/shared/inc
			INC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/uclib/usr/legacy/secmath/shared/inc
			INC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/tz_common/public
			INC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/tz_iccc_common/public
			INC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/tz_platform/public/tl
			INC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/tz_platform/vendor/QSEE/tl
		else ifeq ($(QSEE_CHIPSET), $(filter sm8250 sm7250 sm7225, $(QSEE_CHIPSET)))
			# iccc v4
			INC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/tz_iccc_common/public
		else
			# iccc v4 using TA branch(since R OS)
			INC += $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/iccc/public
		endif

		INC += $(QSEE_ROOT_PATH)/core/api/boot/qfprom
		ifeq ($(QSEE_CHIPSET), sdm710)
			INC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/trustzone/qsapps/bksecapp/inc/sdm670
		else ifeq ($(QSEE_CHIPSET), $(filter sm6150 sm7150, $(QSEE_CHIPSET)))
			INC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/trustzone/qsapps/bksecapp/inc/$(QSEE_CHIPSET)
		else ifeq ($(QSEE_CHIPSET), $(filter sm7125, $(QSEE_CHIPSET)))
			INC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/trustzone/qsapps/bksecapp/inc/$(BUILD_CHIPSET_ID)
		else
			INC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/trustzone/qsapps/bksecapp/inc
		endif #End of "ifeq ($(QSEE_CHIPSET), sdm710)"
	endif #End of "ifeq ($(ROOT_OF_TRUST_API), y)"
endif #End of "ifeq ($(HW_CRYPTO), QUALCOMM)"

ifeq ($(USE_GATEKEEPER), y)
INC += $(GK_ROOT_PATH)/swd/src
INC += $(GK_ROOT_PATH)/common
endif

#-------------------------------------------------------------------------------
# Source Files
#-------------------------------------------------------------------------------

SRC =  $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)/tz_main.c
SRC += $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)/tz_key.c
SRC += $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)/tz_crypto.c
SRC += $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)/tz_time.c
SRC += $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)/tz_oem.c

SRC += $(KM_ROOT_PATH)/common/parse.c
SRC += $(KM_ROOT_PATH)/common/shared_mem.c
SRC += $(KM_ROOT_PATH)/common/shared_mem_asn1.c
SRC += $(KM_ROOT_PATH)/common/scl/memory.c
SRC += $(KM_ROOT_PATH)/common/scl/string.c
SRC += $(KM_ROOT_PATH)/common/swd_printable.c
SRC += $(KM_ROOT_PATH)/common/provision_tools.c
SRC += $(KM_ROOT_PATH)/common/attest_rec.c
SRC += $(KM_ROOT_PATH)/swd/common/swd_log.c
SRC += $(KM_ROOT_PATH)/swd/common/swd_stack_protection.c
SRC += $(KM_ROOT_PATH)/swd/common/tz_bootloader.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_crypto.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_engine.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_service.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_verify_input.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_key_properties.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_key_generate.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_kek.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_integrity.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_blob.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_processing.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_symm.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_asymm.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_get_supported.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_encrypt_key.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_auth.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_operation.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_key_id.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_configure.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_key_attest.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_provision.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_root_of_trust.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_ecies.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_keybox_parser.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_secure_object.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_key_impexp.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_shared_hmac.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_auth_nwd.c
ifeq ($(SELF_TEST),y)
SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_ecies.c
SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_auth.c
SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_main.c
SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_verification_token.c
SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_engine.c
SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_provision.c
SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_asn1.c
SRC += $(KM_ROOT_PATH)/swd/src/unit_tests/swd_test_export_key.c
endif
ifeq ($(KNOX_EXTENSION),y)
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_knox_extension.c
endif

ifeq ($(USE_GRDM),y)
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_grdm_init.c
endif

ifeq ($(HW_CRYPTO), TEEGRIS)
CFLAGS += -Wno-pointer-to-int-cast
SRC += $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)/cm_api.c
endif

ifeq ($(HW_CRYPTO), QUALCOMM)
	SRC += $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)/tz_storage.c
	SRC += $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)/tz_secure_memset.c

	ifeq ($(ROOT_OF_TRUST_API), y)
		ifeq ($(USE_GRDM),y)
			SRC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/tz_icccgrd_common/src/tz_iccc_grdm_api.c
			# check em fuse to get dev device status
			SRC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/trustzone/qsapps/bksecapp/src/bksecapp_em_fuse.c
		else ifeq ($(QSEE_CHIPSET), $(filter sm8150 sm7150 sm7125 sm6150 sdm710, $(QSEE_CHIPSET)))
			# legacy version
			SRC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/trustzone/qsapps/tz_iccc/src/tz_iccc_main.c
			SRC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/trustzone/qsapps/tz_iccc/src/../../../../tz_common/tl/get_filename_tl.c
			SRC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/trustzone/qsapps/tz_iccc/src/../../../../tz_common/tl/process_msr.c
			SRC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/trustzone/qsapps/tz_iccc/src/../../../../tz_common/tl/buffer_utils.c
			SRC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/trustzone/qsapps/tz_iccc/src/../../../../tz_common/tl/init_tl.c
			SRC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/trustzone/qsapps/tz_iccc/src/../../../../tz_iccc_common/tl/tz_iccc_common_tl.c
			SRC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/trustzone/qsapps/tz_iccc/src/../../../../tz_platform/vendor/QSEE/tl/QSEE_TZ_Vendor.c
			SRC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/trustzone/qsapps/bksecapp/src/app_em_fuse.c

			# check em fuse to get dev device status
			SRC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/trustzone/qsapps/bksecapp/src/app_em_fuse.c
		else ifeq ($(QSEE_CHIPSET), $(filter sm8250 sm7250 sm7225, $(QSEE_CHIPSET)))
			# iccc v4
			SRC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/trustzone/qsapps/tz_iccc/src/../../../../tz_iccc_common/tl/tz_iccc_common_tl.c

			# check em fuse to get dev device status
			SRC += $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/trustzone/qsapps/bksecapp/src/bksecapp_em_fuse.c
		else
			# iccc v4 using TA branch(since R OS)
			SRC += $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/iccc/src/tz_iccc_common_tl.c
		endif
	endif #End of 'ifeq ($(ROOT_OF_TRUST_API), y)'
endif #End of 'ifeq ($(HW_CRYPTO), QUALCOMM)'

ifeq ($(USE_GATEKEEPER), y)
SRC += $(GK_ROOT_PATH)/swd/src/tz_ta_gatekeeper_process.c
SRC += $(GK_ROOT_PATH)/swd/src/tz_ta_gatekeeper_service.c
SRC += $(GK_ROOT_PATH)/swd/src/tz_ta_gatekeeper_key_function.c
endif

ifeq ($(SUPPORT_SPU_STRONGBOX), y)
SRC += $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)/tz_strongbox.c
SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_secnvm_support.c
SRC += $(KM_ROOT_PATH)/swd/src/arch/$(ARCH_DIR)/spu_crypto.c
endif

SCRYPTO_LIB_A = $(TZ_SCRYPTO_LIB32)

ifeq ($(SUPPORT_PROCA), y)
ifeq ($(HW_CRYPTO), TEEGRIS)
PROCA_LIB_A = $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/PROCA/$(COMMON_LIB_ARCH_DIR)_v$(TEEGRIS_TZ_VER)/pa_tz_api.a
else
PROCA_LIB_A = $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/PROCA/pa_tz_api.a
endif
DEF += SUPPORT_PROCA
endif

SRC += $(KM_ROOT_PATH)/swd/src/trusted_app/swd_hwvault.c

#linking with dynamic library
ifdef SIGNCLIENT_JAR
SIGN_TOOL = $(SIGNCLIENT_JAR)
else
ifeq ($(USE_SS_TA_SIGN), y)
SIGN_TOOL = $(KMSRK_ROOT_PATH)/build/LocalTASigner.jar
else
SIGN_TOOL = $(KMSRK_ROOT_PATH)/build/signclient.jar
endif
endif

#-------------------------------------------------------------------------------
# MOBICORE Settings
#-------------------------------------------------------------------------------

ifeq ($(HW_CRYPTO), MOBICORE)

OUTPUT_NAME = skeymast
SECDRV ?= standalone
TRUSTLET_MEMTYPE = 2 # 2: ERAM
TRUSTLET_NO_OF_THREADS = 1 # min =1; max =8
TRUSTLET_SERVICE_TYPE = 3 # 1: driver; 2: service provider trustlet; 3: system trustlet
TRUSTLET_INSTANCES = 2 # we have more the one client: keystore and ODE
TRUSTLET_FLAGS = 0

USE_SIGNING_SERVER = false

TA_ROLLBACK_PROTECTED = Y
TA_INTERFACE_VERSION = $(KM_VERSION)

HEAP_SIZE_INIT = 1048576
HEAP_SIZE_MAX = 2097152

STD_LIBS = --debug
TRUSTLET_DIR = $(KM_ROOT_PATH)/swd/src/trusted_app

HW_FLOATING_POINT = Y

ARMCC_COMPILATION_FLAGS = $(DEF:%=-D%)
ARMCC_COMPILATION_FLAGS += $(CFLAGS)

CUSTOMER_DRIVER_LIBS = $(SCRYPTO_LIB_A)
ifeq ($(USE_MTK),y)
CUSTOMER_DRIVER_LIBS += $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/secdrv/$(KM_TARGET_SOC)/DrAtfGetOemFlag.lib
else
CUSTOMER_DRIVER_LIBS += $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/secdrv/$(KM_TARGET_SOC)/secdrv_keyman.lib
CUSTOMER_DRIVER_LIBS += $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/secdrv/$(KM_TARGET_SOC)/fcdrv.lib
endif

ifeq ($(ROOT_OF_TRUST_API), y)
CUSTOMER_DRIVER_LIBS += $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/iccc/$(KM_TARGET_SOC)/icccOperations.ol
CUSTOMER_DRIVER_LIBS += $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/iccc/$(KM_TARGET_SOC)/tl_tz_iccc_init.ol
INC += $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/iccc/include
endif

SRC_C = $(SRC)
INCLUDE_DIRS = $(INC)

ELF = $(KM_ROOT_PATH)/swd/Out/Bin/$(MODE)/skeymast.axf
BIN = $(ELF)
UNSIGN = $(OUT_PATH)/skeymast.axf
SIGN = $(OUT_PATH)/$(TA_UUID).tlbin
SIGN_FAC = $(OUT_PATH)/$(TA_UUID)_fac.tlbin

ifneq ($(DEVELOPER_LOCAL_BUILD), true)
SIGN_TOOL = $(TASDK_DIR_SRC)/Bin/MobiConvert/signclient.jar
endif

endif # MOBICORE

#-------------------------------------------------------------------------------
# QUALCOMM Settings
#-------------------------------------------------------------------------------

ifeq ($(HW_CRYPTO), QUALCOMM)

ifeq (TZ.XF.5,$(findstring TZ.XF.5,$(QSEE_TZ_VER)))
	ifeq ($(QSEE_CHIPSET), $(filter sm6150 sm7150 sm7250, $(QSEE_CHIPSET)))
		QSEE_BUILD_CONF_XML = ./bin/${BINARY_ID}/build_config_deploy.xml/build_config_deploy.xml
	else
		QSEE_BUILD_CONF_XML = build_config_deploy.xml
	endif
endif
ifeq ($(USE_QTEE_SDK), y)
QSEE_APP = $(QSEE_ROOT_PATH)/apps/securemsm/trustzone/qsapps/skeymast
QSEE_BSP = $(QSEE_ROOT_PATH)/apps/bsp/trustzone/qsapps/skeymast
else
QSEE_APP = $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/securemsm/trustzone/qsapps/skeymast
QSEE_BSP = $(QSEE_ROOT_PATH)/$(QSEE_SECMSM_DIR)/bsp/trustzone/qsapps/skeymast
endif
QSEE_DIR = $(QSEE_APP)/src

ifeq ($(QSEE_CHIPSET), sdm710)
QSEE_BUILD_CHIPSET = sdm670
else
QSEE_BUILD_CHIPSET = $(QSEE_CHIPSET)
endif

SRC_LIST = $(SRC)
INC_LIST = $(INC:%=-I%)
DEF_LIST = $(DEF:%=-D%)

ELF = $(QSEE_BSP)/build/$(BINARY_ID)/skeymast.elf
BIN = $(QSEE_ROOT_PATH)/build/ms/bin/$(BINARY_ID)/unsigned/skeymast.mbn
SIGNED_BIN = $(QSEE_ROOT_PATH)/build/ms/bin/$(BINARY_ID)/signed/skeymast.mbn #Signed by QC
UNSIGN = $(OUT_PATH)/skeymast.mbn
SIGN = $(OUT_PATH)/signed_skeymast.mbn #Signed by Samsung

endif

#-------------------------------------------------------------------------------
# TEEGRIS Settings
#-------------------------------------------------------------------------------

ifeq ($(HW_CRYPTO), TEEGRIS)

ifeq ($(CONFIG_SUPPORT_64ONLY), y)
	TEEGRIS_TZ_ARCH = 64
	TEEGRIS_TOOLCHAIN_PREFIX = $(TEEGRIS_SDK_ROOT)/toolchains/aarch64-secureos-gnueabi-gcc_6_3-linux-x86/bin/aarch64-secureos-gnueabi-
else
	TEEGRIS_TOOLCHAIN_PREFIX = $(TEEGRIS_SDK_ROOT)/toolchains/arm-secureos-gnueabi-gcc_6_3-linux-x86/bin/arm-secureos-gnueabi-
endif

CC = $(TEEGRIS_TOOLCHAIN_PREFIX)gcc
LD = $(CC)
STRIP = $(TEEGRIS_TOOLCHAIN_PREFIX)strip

ifeq ($(TEEGRIS_TZ_VER), 3)
	LDFLAGS = -O2 --sysroot=$(TEEGRIS_SDK_ROOT)/platforms/TEEGRIS-3.0/swd/arch-arm
	CFLAGS += -O2 --sysroot=$(TEEGRIS_SDK_ROOT)/platforms/TEEGRIS-3.0/swd/arch-arm
	INC += $(TEEGRIS_SDK_ROOT)/platforms/TEEGRIS-3.0/swd/arch-arm/usr/include
	LDFLAGS += -L $(TEEGRIS_SDK_ROOT)/platforms/TEEGRIS-3.0/swd/arch-arm/usr/lib -lpthread
else ifeq ($(TEEGRIS_TZ_VER), 4)
	LDFLAGS = -O2 --sysroot=$(TEEGRIS_SDK_ROOT)/platforms/TEEGRIS-4.1/swd/arch-arm$(TEEGRIS_TZ_ARCH)
	CFLAGS += -O2 --sysroot=$(TEEGRIS_SDK_ROOT)/platforms/TEEGRIS-4.1/swd/arch-arm$(TEEGRIS_TZ_ARCH)
	INC += $(TEEGRIS_SDK_ROOT)/platforms/TEEGRIS-4.1/swd/arch-arm$(TEEGRIS_TZ_ARCH)/usr/include
	LDFLAGS += -L $(TEEGRIS_SDK_ROOT)/platforms/TEEGRIS-4.1/swd/arch-arm$(TEEGRIS_TZ_ARCH)/usr/lib -lpthread
else ifeq ($(TEEGRIS_TZ_VER), 42)
	LDFLAGS = -O2 --sysroot=$(TEEGRIS_SDK_ROOT)/platforms/TEEGRIS-4.2/swd/arch-arm$(TEEGRIS_TZ_ARCH)
	CFLAGS += -O2 --sysroot=$(TEEGRIS_SDK_ROOT)/platforms/TEEGRIS-4.2/swd/arch-arm$(TEEGRIS_TZ_ARCH)
	INC += $(TEEGRIS_SDK_ROOT)/platforms/TEEGRIS-4.2/swd/arch-arm$(TEEGRIS_TZ_ARCH)/usr/include
	LDFLAGS += -L $(TEEGRIS_SDK_ROOT)/platforms/TEEGRIS-4.2/swd/arch-arm$(TEEGRIS_TZ_ARCH)/usr/lib -lpthread
endif

CFLAGS += -Wall -Werror -Wextra -fPIE -pie
CFLAGS += -fstack-protector -fstack-protector-all -fvisibility=hidden

# Apply Full RELRO from TEEGRIS v4
ifneq ($(TEEGRIS_TZ_VER), $(filter 2 3, $(TEEGRIS_TZ_VER)))
	LDFLAGS += -Wl,-z,relro,-z,now
endif

# in keymaster_mdfpp/common/scl/include/scl/memory.h
# to avoid build error: nonnull argument 'dest' compared to NULL [-Werror=nonnull-compare]
CFLAGS += -Wno-nonnull-compare

# Add configs defined in teegris's config.mk
CFLAGS += $(CONFIG_CFLAGS_SW)
LDFLAGS += $(CONFIG_LDFLAGS_SW)

# Scrypto
LDFLAGS += -lscrypto

# ICCC
ICCC_LIBS =
ifeq ($(ROOT_OF_TRUST_API), y)
	ifeq ($(USE_TEEGRIS_ROT_API), y)
		DEF += USE_TEEGRIS_ROT_API
	else ifeq ($(USE_GRDM),y)
		ICCC_LIBS += $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/iccc/GRDM/$(KM_TARGET_SOC)/icccOperations_grdm.ol
		INC += $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/iccc/GRDM/include
	else 
		ifeq ($(KM_TARGET_SOC), $(filter tg_exynos7885 tg_exynos7885_28M tg_exynos7885_30M tg_exynos7885_80M tg_exynos9820 tg_exynos9610, $(KM_TARGET_SOC)))
			ICCC_LIBS += $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/iccc/$(KM_TARGET_SOC)/icccOperations.ol
			ICCC_LIBS += $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/iccc/$(KM_TARGET_SOC)/tl_tz_iccc_init.ol
		else
			DEF += ICCC_v4
			ICCC_LIBS += $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/iccc/$(KM_TARGET_SOC)/icccOperations.ol
		endif
		INC += $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/iccc/include
	endif
endif #End of 'ifeq ($(ROOT_OF_TRUST_API), y)'

ifeq ($(USE_HWVAULT), y)
SRC += $(KM_ROOT_PATH)/../../../hwvault/export/src/HwVaultHal_api.c
INC += $(KM_ROOT_PATH)/../../../hwvault/export/include
endif

UNSIGN = $(OUT_PATH)/$(TA_UUID).unsigned
SIGN = $(OUT_PATH)/$(TA_UUID)

OBJS = $(SRC:.c=.o)

endif

#-------------------------------------------------------------------------------
# Common Rules
#-------------------------------------------------------------------------------

build: $(OUT_PATH)
	@printf "BUILD\n"
	$(Q)$(MAKE) prepare
	$(Q)$(MAKE) all
	$(Q)$(MAKE) complete

$(OUT_PATH):
	$(Q)mkdir -p $(OUT_PATH)

build_fips2: $(TA_AXF)
	@printf "FIPS2\n"
	$(Q)IMPRINT=$(TZ_SCRYPTO_TOOLS_IMPRINT) $(TZ_SCRYPTO_TOOLS_PATH)/run_fips_tools.sh $(TA_AXF)

#-------------------------------------------------------------------------------
# MOBICORE Rules
#-------------------------------------------------------------------------------

ifeq ($(HW_CRYPTO), MOBICORE)

include $(TASDK_DIR_SRC)/trustlet.mk # rules "all:" and "clean:" implemented here

prepare:
	@printf "PREPARE\n"
ifeq ($(DS5_V6), y)
	$(Q)ln -fs $(ARM_RVCT_PATH)/bin/armclang $(KMSRK_ROOT_PATH)/build/armcc/armclang
	$(Q)ln -fs $(ARM_RVCT_PATH)/bin/armlink $(KMSRK_ROOT_PATH)/build/armcc/armlink
endif

complete: $(TA_AXF)
	@printf "COMPLETE\n"
	$(Q)$(MAKE) build_fips2
	$(Q)cp -fv $(TA_AXF) $(UNSIGN) $(NULL)
	@printf "CLEAN obj files\n"
	$(Q)rm -fv $(SRC:.c=.o) $(NULL)
ifneq ($(DEVELOPER_LOCAL_BUILD), true)
	$(Q)$(MAKE) sign
ifeq ($(TARGET_TA), skeymaster)
	@printf "Copy $(SIGN) $(KINIBI_TA_OUTPUT_PATH)\n"
	$(Q)cp $(SIGN) $(KINIBI_TA_OUTPUT_PATH)
ifeq ($(MC_TA_RP), y)
	@printf "Copy $(SIGN_FAC) $(KINIBI_TA_OUTPUT_PATH)\n"
	$(Q)cp $(SIGN_FAC) $(KINIBI_TA_OUTPUT_PATH)
endif
endif
endif

sign: $(UNSIGN)
	@printf "SIGN\n"
	$(Q)java -jar $(SIGN_TOOL) -model $(SIGNING_MODEL) -runtype $(SIGNING_RUNTYPE) -input $(UNSIGN) -output $(SIGN) -conf_str "$(SIGNING_OPTION)"
ifeq ($(MC_TA_RP), y)
	$(Q)java -jar $(SIGN_TOOL) -model $(SIGNING_MODEL) -runtype $(SIGNING_RUNTYPE) -input $(UNSIGN) -output $(SIGN_FAC) -conf_str "$(SIGNING_OPTION)"
endif

distclean:
	@printf "DISTCLEAN\n"
	$(Q)$(MAKE) clean $(NULL)
	$(Q)rm -fv $(BIN) $(SIGN) $(SIGN_FAC) $(UNSIGN) $(NULL)

endif

#-------------------------------------------------------------------------------
# QUALCOMM Rules
#-------------------------------------------------------------------------------

ifeq ($(HW_CRYPTO), QUALCOMM)

all:
	@printf "ALL\n"

ifeq ($(USE_QTEE_SDK), y)
	$(Q)_SRC_LIST="$(SRC)" _DEF_LIST="$(DEF_LIST)" _INC_LIST="$(INC_LIST)" _SCRYPTO_LIB=$(SCRYPTO_LIB_A) _PROCA_LIB=$(PROCA_LIB_A) python $(SCONS) -c -C $(QSEE_ROOT_PATH)/apps/securemsm/trustzone/qsapps/skeymast/src skeymast CHIPSET=$(BUILD_CHIPSET_ID) qtee_sdk_version=1.1
	$(Q)_SRC_LIST="$(SRC)" _DEF_LIST="$(DEF_LIST)" _INC_LIST="$(INC_LIST)" _SCRYPTO_LIB=$(SCRYPTO_LIB_A) _PROCA_LIB=$(PROCA_LIB_A) python $(SCONS) -C $(QSEE_ROOT_PATH)/apps/securemsm/trustzone/qsapps/skeymast/src skeymast CHIPSET=$(BUILD_CHIPSET_ID) qtee_sdk_version=1.1
else ifeq (TZ.XF.5,$(findstring TZ.XF.5,$(QSEE_TZ_VER)))
ifeq ($(QSEE_CHIPSET), $(filter sdm710 sm6150 sm7150 sm8150 sm8250, $(QSEE_CHIPSET)))
	$(Q)_SRC_LIST="$(SRC)" _DEF_LIST="$(DEF_LIST)" _INC_LIST="$(INC_LIST)" _SCRYPTO_LIB=$(SCRYPTO_LIB_A) _PROCA_LIB=$(PROCA_LIB_A) _GRDM_LIB=$(GRDM_LIB) python $(QSEE_ROOT_PATH)/build/ms/build_all.py -b $(QSEE_TZ_VER) CHIPSET=$(QSEE_BUILD_CHIPSET) --cnb --config=$(QSEE_BUILD_CONF_XML) --cbt skeymast
else
	$(Q)_SRC_LIST="$(SRC)" _DEF_LIST="$(DEF_LIST)" _INC_LIST="$(INC_LIST)" _SCRYPTO_LIB=$(SCRYPTO_LIB_A) _PROCA_LIB=$(PROCA_LIB_A) _GRDM_LIB=$(GRDM_LIB) python $(QSEE_ROOT_PATH)/build/ms/build_all.py -b $(QSEE_TZ_VER) CHIPSET=$(BUILD_CHIPSET_ID) --cnb --config=$(QSEE_BUILD_CONF_XML) --cbt skeymast
endif
else ifeq ($(QSEE_TZ_VER), $(filter TZ.BF.4.0.6 TZ.BF.4.0.7, $(QSEE_TZ_VER)))
	$(Q)_SRC_LIST="$(SRC)" _DEF_LIST="$(DEF_LIST)" _INC_LIST="$(INC_LIST)" _SCRYPTO_LIB=$(SCRYPTO_LIB_A) python $(QSEE_ROOT_PATH)/build/ms/build_all.py -b TZ.BF.4.0 CHIPSET=$(QSEE_BUILD_CHIPSET) --cnb --cbt skeymast
else
	$(Q)_SRC_LIST="$(SRC)" _DEF_LIST="$(DEF_LIST)" _INC_LIST="$(INC_LIST)" _SCRYPTO_LIB=$(SCRYPTO_LIB_A) $(QSEE_ROOT_PATH)/build/ms/build.sh CHIPSET=$(QSEE_BUILD_CHIPSET) skeymast -c
	$(Q)_SRC_LIST="$(SRC)" _DEF_LIST="$(DEF_LIST)" _INC_LIST="$(INC_LIST)" _SCRYPTO_LIB=$(SCRYPTO_LIB_A) $(QSEE_ROOT_PATH)/build/ms/build.sh CHIPSET=$(QSEE_BUILD_CHIPSET) skeymast
endif

prepare:
	@printf "PREPARE\n"
	$(Q)mkdir -p $(QSEE_DIR)
	$(Q)mkdir -p $(QSEE_BSP)/build
ifeq ($(USE_QTEE_SDK), y)
	$(Q)ln -fs $(KM_ROOT_PATH)/swd/makefiles/qc/$(QSEE_CHIPSET)/SConscript $(QSEE_DIR)/SConscript
	$(Q)ln -fs $(KM_ROOT_PATH)/swd/makefiles/qc/$(QSEE_CHIPSET)/SConstruct $(QSEE_DIR)/SConstruct
else ifeq ($(QSEE_CHIPSET), sdm710)
	$(Q)ln -fs $(KM_ROOT_PATH)/../../v4.0/keymaster_mdfpp/swd/makefiles/qc/bsp/SConscript $(QSEE_BSP)/build/SConscript
	$(Q)ln -fs $(KM_ROOT_PATH)/swd/makefiles/qc/$(QSEE_CHIPSET)/SConscript $(QSEE_DIR)/SConscript_v4
else ifeq ($(QSEE_CHIPSET), $(filter sm6150 sm7150, $(QSEE_CHIPSET)))
	$(Q)ln -fs $(KM_ROOT_PATH)/swd/makefiles/qc/sm6150/SConscript $(QSEE_DIR)/SConscript
else
	$(Q)ln -fs $(KM_ROOT_PATH)/swd/makefiles/qc/$(QSEE_CHIPSET)/SConscript $(QSEE_DIR)/SConscript
endif
ifneq ($(QSEE_CHIPSET), $(filter sm8250 sm7250 sm7225 sm7125 sm6115 sm8150 sm7150 sm6150 sdm710, $(QSEE_CHIPSET)))
	$(Q)cp -fv $(KM_COMMON_LIB_PATH)/lib/$(COMMON_LIB_ARCH_DIR)/iccc/idl/*.idl $(QSEE_DIR)/../
endif

complete: $(BIN)
	@printf "COMPLETE\n"
	$(Q)cp -fv $(BIN) $(UNSIGN) $(NULL)

sign: $(UNSIGN)
ifneq ($(SIGNING_MODEL), n)
	@printf "SIGN\n"
	$(Q)java -jar $(SIGN_TOOL) -model $(SIGNING_MODEL) -runtype $(SIGNING_RUNTYPE) -input $(UNSIGN) -output $(SIGN)
endif
	$(Q)$(MAKE) split

ifneq ($(SIGNING_MODEL), n)
split: $(SIGN)
	@printf "SPLIT\n"
	$(Q)$(KMSRK_ROOT_PATH)/build/pil_splitter.py $(SIGN) $(OUT_PATH)/skeymast
else
split: $(SIGNED_BIN)
	@printf "SPLIT\n"
	$(Q)$(KMSRK_ROOT_PATH)/build/pil_splitter.py $(SIGNED_BIN) $(OUT_PATH)/skeymast
endif

clean:
	@printf "CLEAN\n"
	$(Q)rm -rfv $(QSEE_ROOT_PATH)/build/ms/build-log* $(QSEE_ROOT_PATH)/build/ms/LOGFILE* $(QSEE_ROOT_PATH)/scons_dep_tree_* $(QSEE_APP) $(QSEE_BSP) $(NULL)
	$(Q)rm -fv $(QSEE_ROOT_PATH)/build/ms/bin/PIL_IMAGES/SPLITBINS_$(BINARY_ID)/skeymast.* $(NULL)
	$(Q)rm -fv $(SRC:.c=.o) $(NULL)

distclean:
	@printf "DISTCLEAN\n"
	$(Q)$(MAKE) clean $(NULL)
	$(Q)rm -fv $(BIN) $(SIGN) $(UNSIGN) $(NULL)
	$(Q)rm -fv $(OUT_PATH)/skeymast.* $(NULL)

endif

#-------------------------------------------------------------------------------
# TEEgris Rules
#-------------------------------------------------------------------------------

ifeq ($(HW_CRYPTO), TEEGRIS)

prepare: distclean
	@printf "  PREPARE done\n"
	@printf '  DEF: $(DEF)\n'
	@printf '  CFLAGS: $(CFLAGS)\n'
	@printf '  LDFLAGS: $(LDFLAGS)\n'

all: $(UNSIGN)
	@printf "  ALL done\n"

$(UNSIGN): $(OBJS)
	@printf "  LD      $(TA_UUID)\n"
	$(Q)$(CC) $(LDFLAGS) $(OBJS) $(SCRYPTO_LIB_A) $(ICCC_LIBS) $(PROCA_LIB_A) $(GRDM_LIB) -o $(UNSIGN)

%.o: %.c
	@printf "  CC      $(*).c\n"
	$(Q)$(CC) $(CFLAGS) $(DEF:%=-D%) $(INC:%=-I%) -o $(*).o -c $(*).c

sign:
	@printf "  \n"

$(SIGN): $(UNSIGN)
	$(STRIP) $(UNSIGN)
	@printf "  STRIP done\n"
ifeq ($(DEVELOPER_LOCAL_BUILD), true)
ifeq ($(USE_SS_TA_SIGN), y)
	$(Q)java -jar $(SIGN_TOOL) -model $(SIGNING_MODEL) -runtype $(SIGNING_RUNTYPE) -input $(UNSIGN) -output $(SIGN) -addinfo $(MODEL_KEY_NAME)
else
	$(Q)java -jar $(SIGN_TOOL) -model $(SIGNING_MODEL) -runtype $(SIGNING_RUNTYPE) -input $(UNSIGN) -output $(SIGN)
endif
else
	@$(signing_command)
	@printf "  Copy $(SIGN) $(TEEGRIS_TA_DIST_PATH)\n"
	$(Q)cp $(SIGN) $(TEEGRIS_TA_DIST_PATH)
endif
	@printf "  SIGN done\n"

complete: $(UNSIGN) $(SIGN)
	@printf "  BUILD/STRIP/SIGN COMPLETE\n"

clean:
	$(Q)rm -rfv $(OBJS) $(NULL)
	$(Q)rm -rfv $(UNSIGN) $(NULL)
	$(Q)rm -rfv $(SIGN) $(NULL)
	@printf "  CLEAN done\n"

distclean:
	$(Q)$(MAKE) clean $(NULL)
	@printf "  DISTCLEAN done\n"

endif
