187daf659SAkshay Belsare# 287daf659SAkshay Belsare# Copyright (c) 2025-2026, Advanced Micro Devices, Inc. All rights reserved. 387daf659SAkshay Belsare# 487daf659SAkshay Belsare# SPDX-License-Identifier: BSD-3-Clause 587daf659SAkshay Belsare# 687daf659SAkshay Belsare# Custom Package Integration for AMD Platforms 787daf659SAkshay Belsare# 887daf659SAkshay Belsare 987daf659SAkshay Belsare# Flag to track if custom package is included 1087daf659SAkshay BelsareCUSTOM_PKG_INCLUDED := 0 1187daf659SAkshay Belsare 1287daf659SAkshay Belsare# ============================================================================ 1387daf659SAkshay Belsare# Custom Package Integration (supports multiple packages) 1487daf659SAkshay Belsare# ============================================================================ 15*89aae9a1SAkshay Belsare# This framework: 16*89aae9a1SAkshay Belsare# 1. Includes each package's custom_pkg.mk for build rules and flags 17*89aae9a1SAkshay Belsare# 2. Discovers custom_pkg.ld.S files for linker script consolidation 18*89aae9a1SAkshay Belsare# 3. Prepares them for preprocessing into the final plat.ld.S 19*89aae9a1SAkshay Belsare# 20*89aae9a1SAkshay Belsare# Each package provides: 21*89aae9a1SAkshay Belsare# - custom_pkg.mk: Build configuration, source files, and package-specific macros 22*89aae9a1SAkshay Belsare# - custom_pkg.ld.S: Memory layout (MEMORY regions and SECTIONS) 23*89aae9a1SAkshay Belsare# ============================================================================ 2487daf659SAkshay Belsare 25*89aae9a1SAkshay Belsareifdef CUSTOM_PKG_PATH 26*89aae9a1SAkshay Belsare # Split CUSTOM_PKG_PATH by space, colon, or semicolon to support multiple paths 27*89aae9a1SAkshay Belsare _CUSTOM_PKG_PATHS := $(strip $(subst ;, ,$(subst :, ,$(CUSTOM_PKG_PATH)))) 28*89aae9a1SAkshay Belsare # Normalize to absolute paths to handle both relative and absolute inputs 29*89aae9a1SAkshay Belsare _CUSTOM_PKG_PATHS_ABS := $(foreach pkg_path,$(_CUSTOM_PKG_PATHS),$(abspath $(pkg_path))) 30*89aae9a1SAkshay Belsare 31*89aae9a1SAkshay Belsare # Include each package's custom_pkg.mk 32*89aae9a1SAkshay Belsare $(foreach pkg_path,$(_CUSTOM_PKG_PATHS_ABS), \ 3387daf659SAkshay Belsare $(eval PKG_PATH_CLEAN := $(strip $(pkg_path))) \ 3487daf659SAkshay Belsare $(eval PKG_MK := $(PKG_PATH_CLEAN)/custom_pkg.mk) \ 3587daf659SAkshay Belsare $(if $(wildcard $(PKG_MK)), \ 3687daf659SAkshay Belsare $(eval include $(PKG_MK)) \ 3787daf659SAkshay Belsare $(eval CUSTOM_PKG_INCLUDED := 1) \ 3887daf659SAkshay Belsare $(info Including custom package from: $(PKG_PATH_CLEAN)), \ 3987daf659SAkshay Belsare $(error CUSTOM_PKG_PATH contains $(PKG_PATH_CLEAN) but custom_pkg.mk not found) \ 4087daf659SAkshay Belsare ) \ 4187daf659SAkshay Belsare ) 42*89aae9a1SAkshay Belsare 43*89aae9a1SAkshay Belsare # Find all custom_pkg.ld.S files in package directories (absolute paths) 44*89aae9a1SAkshay Belsare CUSTOM_PKG_LD_SCRIPTS := $(wildcard $(addsuffix /custom_pkg.ld.S,$(_CUSTOM_PKG_PATHS_ABS))) 45*89aae9a1SAkshay Belsare 46*89aae9a1SAkshay Belsare # Auto-discover package linker script (prefer first hit) and set TF-A flag 47*89aae9a1SAkshay Belsare $(foreach pkg_path,$(_CUSTOM_PKG_PATHS_ABS), \ 48*89aae9a1SAkshay Belsare $(eval _PKG_LS := $(wildcard $(pkg_path)/plat.ld.S $(pkg_path)/inc/plat.ld.S)) \ 49*89aae9a1SAkshay Belsare $(if $(_PKG_LS), \ 50*89aae9a1SAkshay Belsare $(if $(PLAT_EXTRA_LD_SCRIPT_PATH),, \ 51*89aae9a1SAkshay Belsare $(eval PLAT_EXTRA_LD_SCRIPT_PATH := $(word 1,$(_PKG_LS))) \ 52*89aae9a1SAkshay Belsare $(info Auto-discovered linker script: $(PLAT_EXTRA_LD_SCRIPT_PATH)) \ 53*89aae9a1SAkshay Belsare ) \ 54*89aae9a1SAkshay Belsare ) \ 55*89aae9a1SAkshay Belsare ) 56*89aae9a1SAkshay Belsare 57*89aae9a1SAkshay Belsare # If a package linker script is present, export the TF-A define (value = 1) 58*89aae9a1SAkshay Belsare ifdef PLAT_EXTRA_LD_SCRIPT_PATH 59*89aae9a1SAkshay Belsare PLAT_EXTRA_LD_SCRIPT := 1 60*89aae9a1SAkshay Belsare $(eval $(call add_define_val,PLAT_EXTRA_LD_SCRIPT,1)) 61*89aae9a1SAkshay Belsare $(info Enabling PLAT_EXTRA_LD_SCRIPT=1 (script: $(PLAT_EXTRA_LD_SCRIPT_PATH))) 6287daf659SAkshay Belsare endif 6387daf659SAkshay Belsare 64*89aae9a1SAkshay Belsare ifneq ($(CUSTOM_PKG_LD_SCRIPTS),) 65*89aae9a1SAkshay Belsare $(info Custom Package Linker Scripts Found:) 66*89aae9a1SAkshay Belsare $(foreach _LS,$(CUSTOM_PKG_LD_SCRIPTS),$(info - $(_LS))) 67*89aae9a1SAkshay Belsare 68*89aae9a1SAkshay Belsare # Generate paths for preprocessed scripts (.ld.S -> .ld.pp) 69*89aae9a1SAkshay Belsare CUSTOM_PKG_LD_SCRIPTS_PP := $(patsubst %.ld.S,%.ld.pp,$(CUSTOM_PKG_LD_SCRIPTS)) 70*89aae9a1SAkshay Belsare 71*89aae9a1SAkshay Belsare # Collect include directories from all custom packages for linker script preprocessing 72*89aae9a1SAkshay Belsare CUSTOM_PKG_LD_INCLUDES := $(foreach pkg_path,$(_CUSTOM_PKG_PATHS_ABS), \ 73*89aae9a1SAkshay Belsare $(if $(wildcard $(pkg_path)/inc),-I$(pkg_path)/inc) \ 74*89aae9a1SAkshay Belsare $(if $(wildcard $(pkg_path)/include),-I$(pkg_path)/include)) 75*89aae9a1SAkshay Belsare 76*89aae9a1SAkshay Belsare # Make them available to linker script generation 77*89aae9a1SAkshay Belsare export CUSTOM_PKG_LD_SCRIPTS_PP 78*89aae9a1SAkshay Belsare export CUSTOM_PKG_LD_INCLUDES 79*89aae9a1SAkshay Belsare else 80*89aae9a1SAkshay Belsare $(info No custom_pkg.ld.S files found - using platform defaults) 81*89aae9a1SAkshay Belsare CUSTOM_PKG_LD_INCLUDES := 82*89aae9a1SAkshay Belsare endif 83*89aae9a1SAkshay Belsareendif 84*89aae9a1SAkshay Belsare 85*89aae9a1SAkshay Belsare# ============================================================================ 86*89aae9a1SAkshay Belsare# Note: Package-specific macros are defined in each package's custom_pkg.mk 87*89aae9a1SAkshay Belsare# and passed to preprocessor via ASFLAGS 88*89aae9a1SAkshay Belsare# ============================================================================ 89*89aae9a1SAkshay Belsare 90*89aae9a1SAkshay Belsare# ============================================================================ 91*89aae9a1SAkshay Belsare# Custom Package Linker Script Preprocessing 92*89aae9a1SAkshay Belsare# ============================================================================ 93*89aae9a1SAkshay Belsare# This handles preprocessing of custom package linker scripts 94*89aae9a1SAkshay Belsare# and generation of the final consolidated plat.ld.S 95*89aae9a1SAkshay Belsare# 96*89aae9a1SAkshay Belsare# Two-stage preprocessing using TF-A's standard C preprocessor: 97*89aae9a1SAkshay Belsare# Stage 1: Preprocess custom_pkg.ld.S files 98*89aae9a1SAkshay Belsare# Input: custom_pkg.ld.S (contains package-specific macros) 99*89aae9a1SAkshay Belsare# Process: $($(ARCH)-cpp) -E -P with ASFLAGS containing package macro definitions 100*89aae9a1SAkshay Belsare# Output: custom_pkg.ld.pp (macros expanded) 101*89aae9a1SAkshay Belsare# 102*89aae9a1SAkshay Belsare# Stage 2: Preprocess template with all preprocessed scripts included 103*89aae9a1SAkshay Belsare# Input: plat.ld.S.tpl (contains #include CUSTOM_PKG_LD_SCRIPTS_PP) 104*89aae9a1SAkshay Belsare# Process: $($(ARCH)-cpp) -E -P with all macro definitions 105*89aae9a1SAkshay Belsare# Output: build/versal2/release/bl31/plat.ld.S (final linker script) 106*89aae9a1SAkshay Belsare# ============================================================================ 107*89aae9a1SAkshay Belsare 108*89aae9a1SAkshay Belsare# Directories 109*89aae9a1SAkshay BelsareBUILD_DIR := $(shell pwd)/build/$(PLAT) 110*89aae9a1SAkshay BelsareBL31_BUILD_DIR := $(BUILD_DIR)/bl31 111*89aae9a1SAkshay Belsare 112*89aae9a1SAkshay Belsare# Linker script template and output 113*89aae9a1SAkshay BelsarePLAT_LD_TEMPLATE := plat/amd/versal2/plat.ld.S.tpl 114*89aae9a1SAkshay BelsarePLAT_LD_SCRIPT := $(BL31_BUILD_DIR)/plat.ld.S 115*89aae9a1SAkshay Belsare 116*89aae9a1SAkshay Belsare# Rule 1: Preprocess individual custom_pkg.ld.S files 117*89aae9a1SAkshay Belsare# Uses TF-A's standard architecture-specific C preprocessor 118*89aae9a1SAkshay Belsare# Includes custom package include directories for proper header resolution 119*89aae9a1SAkshay Belsare%.ld.pp: %.ld.S 120*89aae9a1SAkshay Belsare @echo " PP $<" 121*89aae9a1SAkshay Belsare $(Q)$($(ARCH)-cpp) -E -P $(CUSTOM_PKG_LD_INCLUDES) $(ASFLAGS) -o $@ $< 122*89aae9a1SAkshay Belsare 123*89aae9a1SAkshay Belsare# Rule 2: Generate final plat.ld.S from template + preprocessed scripts 124*89aae9a1SAkshay Belsare# Uses TF-A's standard architecture-specific C preprocessor 125*89aae9a1SAkshay Belsare# Includes custom package include directories for proper header resolution 126*89aae9a1SAkshay Belsare$(PLAT_LD_SCRIPT): $(PLAT_LD_TEMPLATE) $(CUSTOM_PKG_LD_SCRIPTS_PP) 127*89aae9a1SAkshay Belsare @echo " GEN $@" 128*89aae9a1SAkshay Belsare @mkdir -p $(BL31_BUILD_DIR) 129*89aae9a1SAkshay Belsare $(Q)$($(ARCH)-cpp) -E -P \ 130*89aae9a1SAkshay Belsare -DCUSTOM_PKG_LD_SCRIPTS_PP="$(CUSTOM_PKG_LD_SCRIPTS_PP)" \ 131*89aae9a1SAkshay Belsare $(CUSTOM_PKG_LD_INCLUDES) \ 132*89aae9a1SAkshay Belsare $(ASFLAGS) \ 133*89aae9a1SAkshay Belsare -o $@ \ 134*89aae9a1SAkshay Belsare $(PLAT_LD_TEMPLATE) 135*89aae9a1SAkshay Belsare 136*89aae9a1SAkshay Belsare# Ensure final linker script exists before linking BL31 137*89aae9a1SAkshay Belsarebl31: $(PLAT_LD_SCRIPT) 138*89aae9a1SAkshay Belsare 13987daf659SAkshay Belsare# ============================================================================ 14087daf659SAkshay Belsare# Build Summary 14187daf659SAkshay Belsare# ============================================================================ 14287daf659SAkshay Belsare$(info ============================================================) 14387daf659SAkshay Belsare$(info Custom Package Configuration:) 14487daf659SAkshay Belsare$(info Custom Package: $(if $(filter 1,$(CUSTOM_PKG_INCLUDED)),ENABLED,DISABLED)) 14587daf659SAkshay Belsare$(if $(filter 1,$(CUSTOM_PKG_INCLUDED)), \ 146*89aae9a1SAkshay Belsare $(foreach pkg_path,$(_CUSTOM_PKG_PATHS_ABS), \ 14787daf659SAkshay Belsare $(info - $(strip $(pkg_path))) \ 14887daf659SAkshay Belsare ) \ 14987daf659SAkshay Belsare) 15087daf659SAkshay Belsare$(info ============================================================) 151