1# 2# Copyright (c) 2015-2018, Google, Inc. All rights reserved 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15# 16 17# 18# This makefile containts rules for building ATF image for Trusty. 19# It is expected that it will be included by the project that requres ATF 20# support and the caller will configure the following variables: 21# 22# ATF_ROOT - Root of arm-trusted-firmware project 23# ATF_BUILD_BASE - location that will be used to store temp files and 24# build results. 25# ATF_PLAT - ATF platform to build 26# ATF_DEBUG - ATF debug level 27# ATF_WITH_TRUSTY_GENERIC_SERVICES - Add Trusty generic services 28# ATF_TOOLCHAIN_PREFIX - AArch64 toolchain to use for building ATF 29# 30# The following variable is returned to the caller: 31# ATF_OUT_DIR - Directory containing ATF images 32# ATF_BUILD_BASE - location that will be used to store temp files and 33# build results. 34# 35# 36 37# set location of resulting ATF image 38ifneq ($(ATF_DEBUG), 0) 39ATF_OUT_DIR := $(ATF_BUILD_BASE)/$(ATF_PLAT)/debug 40else 41ATF_OUT_DIR:=$(ATF_BUILD_BASE)/$(ATF_PLAT)/release 42endif 43ATF_BIN := $(ATF_OUT_DIR)/bl31.bin 44 45ATF_WITH_TRUSTY_GENERIC_SERVICES ?= false 46 47ifeq (true,$(call TOBOOL,$(HAFNIUM))) 48HAFNIUM_PROJECT_DIR := \ 49 $(TRUSTY_TOP)/trusty/device/arm/generic-arm64/project/hafnium 50 51# We need to copy sp_layout.json and trusty.dts to the same directory as lk.bin 52# because TF-A parses sp_layout.json and reads the other files from the same 53# directory. 54LK_BIN_DIR := $(dir $(LK_BIN)) 55HAFNIUM_SP_LAYOUT_FILES := \ 56 $(LK_BIN_DIR)/sp_layout.json \ 57 $(LK_BIN_DIR)/trusty.dts \ 58 59$(HAFNIUM_SP_LAYOUT_FILES): $(LK_BIN_DIR)/%: $(HAFNIUM_PROJECT_DIR)/% 60 @$(MKDIR) 61 @cp $< $@ 62 63# Add explicit dependencies for the layout files 64# because the TF-A build system needs them 65$(ATF_BIN): $(HAFNIUM_SP_LAYOUT_FILES) 66 67ATF_MAKE_ARGS := SPD=spmd 68ATF_MAKE_ARGS += SPMD_SPM_AT_SEL2=1 69ATF_MAKE_ARGS += SP_LAYOUT_FILE=$(LK_BIN_DIR)/sp_layout.json 70ATF_MAKE_ARGS += QEMU_TOS_FW_CONFIG_DTS=$(HAFNIUM_PROJECT_DIR)/tos_fw_config.dts 71ATF_MAKE_ARGS += QEMU_TB_FW_CONFIG_DTS=$(HAFNIUM_PROJECT_DIR)/tb_fw_config.dts 72 73# Symlink the Hafnium DTBs to where qemu will look for them. 74HAFNIUM_DTBS := tb_fw_config.dtb tos_fw_config.dtb 75HAFNIUM_DTBS_SRCS := $(addprefix $(ATF_OUT_DIR)/fdts/, $(HAFNIUM_DTBS)) 76$(HAFNIUM_DTBS_SRCS): $(ATF_BIN) 77 78HAFNIUM_DTBS_OUT := $(addprefix $(ATF_OUT_DIR)/, $(HAFNIUM_DTBS)) 79$(HAFNIUM_DTBS_OUT): $(ATF_OUT_DIR)/%.dtb: $(ATF_OUT_DIR)/fdts/%.dtb 80 $(NOECHO)ln -rsf $< $@ 81 82EXTRA_BUILDDEPS += $(HAFNIUM_DTBS_OUT) 83EXTRA_ATF_SYMLINKS += $(addprefix $(ATF_OUT_DIR)/, $(HAFNIUM_DTBS)) 84ATF_EXTRA_BINS += $(addprefix $(ATF_OUT_DIR)/fdts/, $(HAFNIUM_DTBS)) 85 86else ifeq ($(SPMC_EL), 3) 87EL3SPMC_TOS_FW_CONFIG_DTS := \ 88 $(TRUSTY_TOP)/trusty/device/arm/generic-arm64/project/el3spmc/tos_fw_config.dts 89 90EL3SPMC_TOS_FW_CONFIG_DTB_SRC := $(ATF_OUT_DIR)/fdts/tos_fw_config.dtb 91$(EL3SPMC_TOS_FW_CONFIG_DTB_SRC): $(ATF_BIN) 92 93EL3SPMC_TOS_FW_CONFIG_DTB_OUT := $(ATF_OUT_DIR)/tos_fw_config.dtb 94$(EL3SPMC_TOS_FW_CONFIG_DTB_OUT): $(EL3SPMC_TOS_FW_CONFIG_DTB_SRC) 95 $(NOECHO)ln -rsf $< $@ 96 97EXTRA_BUILDDEPS += $(EL3SPMC_TOS_FW_CONFIG_DTB_OUT) 98EXTRA_ATF_SYMLINKS += $(ATF_OUT_DIR)/tos_fw_config.dtb 99ATF_EXTRA_BINS += $(ATF_OUT_DIR)/fdts/tos_fw_config.dtb 100 101ATF_MAKE_ARGS := SPD=spmd 102ATF_MAKE_ARGS += SPMC_AT_EL3=1 103ATF_MAKE_ARGS += SPMD_SPM_AT_SEL2=0 104ATF_MAKE_ARGS += QEMU_TOS_FW_CONFIG_DTS=$(EL3SPMC_TOS_FW_CONFIG_DTS) 105# The el3_spmc build system needs something in BL32, otherwise it 106# builds the TSP as the BL32 payload. The variable is not used for anything, 107# so it can be a placeholder. 108ATF_MAKE_ARGS += BL32=/dev/null 109else 110ATF_MAKE_ARGS := SPD=trusty 111ATF_MAKE_ARGS += SPMD_SPM_AT_SEL2=0 112endif 113ATF_MAKE_ARGS += CC=$(CLANG_BINDIR)/clang 114ATF_MAKE_ARGS += DTC=$(TRUSTY_TOP)/prebuilts/misc/linux-x86/dtc/dtc 115ATF_MAKE_ARGS += PYTHON=$(PY3) 116ATF_MAKE_ARGS += CROSS_COMPILE=$(ATF_TOOLCHAIN_PREFIX) 117ATF_MAKE_ARGS += PLAT=$(ATF_PLAT) 118ATF_MAKE_ARGS += DEBUG=$(ATF_DEBUG) 119ATF_MAKE_ARGS += BUILD_BASE=$(ATF_BUILD_BASE) 120ATF_MAKE_ARGS += QEMU_USE_GIC_DRIVER=QEMU_GICV$(GIC_VERSION) 121ATF_MAKE_ARGS += CTX_INCLUDE_FPREGS=1 122# On aarch32, we skip EL2, see 27d8e1e75a2f45d7c23 123ifeq (true,$(call TOBOOL,$(KERNEL_32BIT))) 124ATF_MAKE_ARGS += INIT_UNUSED_NS_EL2=1 125endif 126 127ifeq (true,$(call TOBOOL,$(ATF_WITH_TRUSTY_GENERIC_SERVICES))) 128ATF_MAKE_ARGS += TRUSTY_SPD_WITH_GENERIC_SERVICES=1 129endif 130 131$(ATF_BIN): ATF_ROOT:=$(ATF_ROOT) 132$(ATF_BIN): ATF_MAKE_ARGS:=$(ATF_MAKE_ARGS) 133$(ATF_BIN): .PHONY 134 $(MAKE) -C $(ATF_ROOT) $(ATF_MAKE_ARGS) all sp 135 136# Add ATF_BIN to the list of project dependencies 137EXTRA_BUILDDEPS += $(ATF_BIN) 138 139ATF_ROOT:= 140ATF_PLAT:= 141ATF_DEBUG:= 142ATF_WITH_TRUSTY_GENERIC_SERVICES:= 143ATF_TOOLCHAIN_PREFIX:= 144ATF_BIN:= 145ATF_MAKE_ARGS:= 146EL3SPMC_TOS_FW_CONFIG_DTS:= 147EL3SPMC_TOS_FW_CONFIG_DTB_SRC:= 148EL3SPMC_TOS_FW_CONFIG_DTB_OUT:= 149LK_BIN_DIR := 150HAFNIUM_DTBS := 151HAFNIUM_DTBS_SRCS := 152HAFNIUM_DTBS_OUT := 153HAFNIUM_PROJECT_DIR := 154HAFNIUM_SP_LAYOUT_FILES := 155