xref: /rk3399_ARM-atf/plat/amd/common/custom_pkg.mk (revision 733d0e7f8354860f4fbcaec097d72c9a525680bd)
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