xref: /rk3399_ARM-atf/make_helpers/constraints.mk (revision 0e3e8829f6e159c6ea538ffc5b70c157ad00f5b9)
1#
2# Copyright (c) 2025-2026, Arm Limited. All rights reserved.
3#
4# SPDX-License-Identifier: BSD-3-Clause
5#
6
7ifneq ($(AARCH32_INSTRUCTION_SET),$(filter $(AARCH32_INSTRUCTION_SET),A32 T32))
8         $(error Error: Unknown AArch32 instruction set ${AARCH32_INSTRUCTION_SET})
9endif
10
11# Check for ENABLE_RME that is replaced by ENABLE_FEAT_RME
12ifeq (${ENABLE_RME},1)
13        $(warning "ENABLE_RME will be deprecated. Use ENABLE_FEAT_RME=1 and ENABLE_RMM=1 instead.")
14endif
15
16# Make sure ENABLE_FEAT_RME configuration is valid
17ifneq (${ENABLE_FEAT_RME},0)
18	ifneq (${SEPARATE_CODE_AND_RODATA},1)
19                $(error ENABLE_FEAT_RME requires SEPARATE_CODE_AND_RODATA)
20	endif
21
22	ifneq (${ARCH},aarch64)
23                $(error ENABLE_FEAT_RME requires AArch64)
24	endif
25
26	ifeq ($(RESET_TO_BL2),0)
27		ifeq ($(ENABLE_FEAT_RME),2)
28                        $(warning ENABLE_FEAT_RME=2 forces BL2 to run at EL3 even if FEAT_RME is not present at runtime)
29		endif
30	endif
31
32	ifeq ($(SPMC_AT_EL3),1)
33                $(error SPMC_AT_EL3 and ENABLE_FEAT_RME cannot both be enabled.)
34	endif
35
36	ifneq (${SPD}, none)
37		ifneq (${SPD}, spmd)
38                        $(error ENABLE_FEAT_RME is incompatible with SPD=${SPD}. Use SPD=spmd)
39		endif
40	endif
41
42	ifeq ($(SPM_MM),1)
43                $(error SPM_MM and ENABLE_FEAT_RME cannot both be enabled.)
44	endif
45
46        $(warning "FEAT_RME is an experimental feature")
47else
48	ifeq (${ENABLE_FEAT_RME_GDI},1)
49                $(error ENABLE_FEAT_RME_GDI requires ENABLE_FEAT_RME)
50	endif
51endif
52
53# Make sure RMM configuration is valid
54ifeq (${ENABLE_RMM},1)
55	ifneq (${ENABLE_FEAT_RME},1)
56                $(error ENABLE_RMM requires ENABLE_FEAT_RME=1)
57	endif
58
59        $(warning "RMM is an experimental feature")
60endif
61
62ifeq (${CTX_INCLUDE_EL2_REGS}, 1)
63	ifeq (${SPD},none)
64		ifeq (${ENABLE_RMM},0)
65                        $(error CTX_INCLUDE_EL2_REGS is available only when SPD \
66                        or RMM is enabled)
67		endif
68	endif
69endif
70
71################################################################################
72# Verify RMM, FEAT_SCTLR2 and FEAT_TCR2 are enabled if FEAT_MEC is enabled.
73################################################################################
74
75ifneq (${ENABLE_FEAT_MEC},0)
76    ifeq (${ENABLE_RMM},0)
77        $(error RMM must be enabled when FEAT_MEC is enabled.)
78    endif
79    ifeq (${ENABLE_FEAT_TCR2},0)
80        $(error FEAT_TCR2 must be enabled when FEAT_MEC is enabled.)
81    endif
82    ifeq (${ENABLE_FEAT_SCTLR2},0)
83        $(error FEAT_SCTLR2 must be enabled when FEAT_MEC is enabled.)
84    endif
85endif
86
87# Handle all invalid build configurations with SPMD usage.
88ifeq (${ENABLE_SPMD_LP}, 1)
89ifneq (${SPD},spmd)
90        $(error Error: ENABLE_SPMD_LP requires SPD=spmd.)
91endif
92
93ifeq ($(SPMC_AT_EL3),1)
94        $(error SPMC at EL3 not supported when enabling SPMD Logical partitions.)
95endif
96endif
97
98ifeq (${SUPPORT_SP_LIVE_ACTIVATION}, 1)
99ifeq (${LFA_SUPPORT}, 0)
100        $(error Error: SUPPORT_SP_LIVE_ACTIVATION requires LFA_SUPPORT=1)
101endif #(LFA_SUPPORT)
102ifeq (${ENABLE_SPMD_LP}, 0)
103        $(error Error: SUPPORT_SP_LIVE_ACTIVATION requires ENABLE_SPMD_LP=1)
104endif #(ENABLE_SPMD_LP)
105ifeq (${SPMD_SPM_AT_SEL2},0)
106        $(error Error: SUPPORT_SP_LIVE_ACTIVATION requires SPMD_SPM_AT_SEL2=1)
107endif #(SPMD_SPM_AT_SEL2)
108        $(warning SUPPORT_SP_LIVE_ACTIVATION is an experimental feature)
109endif #(SUPPORT_SP_LIVE_ACTIVATION)
110
111ifneq (${SPD},none)
112ifeq (${ARCH},aarch32)
113        $(error "Error: SPD is incompatible with AArch32.")
114endif
115ifdef EL3_PAYLOAD_BASE
116        $(warning "SPD and EL3_PAYLOAD_BASE are incompatible build options.")
117        $(warning "The SPD and its BL32 companion will be present but ignored.")
118endif
119ifeq (${SPD},spmd)
120ifeq ($(SPMD_SPM_AT_SEL2),1)
121        ifeq ($(SPMC_AT_EL3),1)
122                $(error SPM cannot be enabled in both S-EL2 and EL3.)
123        endif
124        ifeq ($(CTX_INCLUDE_SVE_REGS),1)
125                $(error SVE context management not needed with Hafnium SPMC.)
126        endif
127endif
128
129ifeq ($(SPMC_AT_EL3_SEL0_SP),1)
130        ifneq ($(SPMC_AT_EL3),1)
131                $(error SEL0 SP cannot be enabled without SPMC at EL3)
132        endif
133endif
134endif #(SPD=spmd)
135endif #(SPD!=none)
136
137# USE_DEBUGFS experimental feature recommended only in debug builds
138ifeq (${USE_DEBUGFS},1)
139        ifeq (${DEBUG},1)
140                $(warning DEBUGFS experimental feature is enabled.)
141        else
142                $(warning DEBUGFS experimental, recommended in DEBUG builds ONLY)
143        endif
144endif #(USE_DEBUGFS)
145
146# USE_SPINLOCK_CAS requires AArch64 build
147ifeq (${USE_SPINLOCK_CAS},1)
148        ifneq (${ARCH},aarch64)
149               $(error USE_SPINLOCK_CAS requires AArch64)
150        endif
151endif #(USE_SPINLOCK_CAS)
152
153ifdef EL3_PAYLOAD_BASE
154	ifdef PRELOADED_BL33_BASE
155                $(warning "PRELOADED_BL33_BASE and EL3_PAYLOAD_BASE are \
156                incompatible build options. EL3_PAYLOAD_BASE has priority.")
157	endif
158	ifneq (${GENERATE_COT},0)
159                $(error "GENERATE_COT and EL3_PAYLOAD_BASE are incompatible \
160                build options.")
161	endif
162	ifneq (${TRUSTED_BOARD_BOOT},0)
163                $(error "TRUSTED_BOARD_BOOT and EL3_PAYLOAD_BASE are \
164                incompatible \ build options.")
165	endif
166endif #(EL3_PAYLOAD_BASE)
167
168ifeq (${NEED_BL33},yes)
169	ifdef EL3_PAYLOAD_BASE
170                $(warning "BL33 image is not needed when option \
171                BL33_PAYLOAD_BASE is used and won't be added to the FIP file.")
172	endif
173	ifdef PRELOADED_BL33_BASE
174                $(warning "BL33 image is not needed when option \
175                PRELOADED_BL33_BASE is used and won't be added to the FIP file.")
176	endif
177endif #(NEED_BL33)
178
179# When building for systems with hardware-assisted coherency, there's no need to
180# use USE_COHERENT_MEM. Require that USE_COHERENT_MEM must be set to 0 too.
181ifeq ($(HW_ASSISTED_COHERENCY)-$(USE_COHERENT_MEM),1-1)
182        $(error USE_COHERENT_MEM cannot be enabled with HW_ASSISTED_COHERENCY)
183endif
184
185#For now, BL2_IN_XIP_MEM is only supported when RESET_TO_BL2 is 1.
186ifeq ($(RESET_TO_BL2)-$(BL2_IN_XIP_MEM),0-1)
187        $(error "BL2_IN_XIP_MEM is only supported when RESET_TO_BL2 is enabled")
188endif
189
190# RAS_EXTENSION is deprecated, provide alternate build options
191ifeq ($(RAS_EXTENSION),1)
192        $(error "RAS_EXTENSION is now deprecated, please use ENABLE_FEAT_RAS \
193        and HANDLE_EA_EL3_FIRST_NS instead")
194endif
195
196ifeq ($(ENABLE_FEAT_RAS),0)
197        ifneq ($(FAULT_INJECTION_SUPPORT),0)
198                $(error For FAULT_INJECTION_SUPPORT, ENABLE_FEAT_RAS must not be 0)
199        endif
200        ifneq ($(RAS_TRAP_NS_ERR_REC_ACCESS),0)
201                $(error For RAS_TRAP_NS_ERR_REC_ACCESS, ENABLE_FEAT_RAS must not be 0)
202        endif
203endif #(ENABLE_FEAT_RAS)
204
205# DYN_DISABLE_AUTH can be set only when TRUSTED_BOARD_BOOT=1
206ifeq ($(DYN_DISABLE_AUTH), 1)
207	ifeq (${TRUSTED_BOARD_BOOT}, 0)
208                $(error "TRUSTED_BOARD_BOOT must be enabled for DYN_DISABLE_AUTH \
209                to be set.")
210	endif
211endif #(DYN_DISABLE_AUTH)
212
213# SDEI_IN_FCONF is only supported when SDEI_SUPPORT is enabled.
214ifeq ($(SDEI_SUPPORT)-$(SDEI_IN_FCONF),0-1)
215        $(error "SDEI_IN_FCONF is only supported when SDEI_SUPPORT is enabled")
216endif
217
218# If pointer authentication is used in the firmware, make sure that all the
219# registers associated to it are also saved and restored.
220# Not doing it would leak the value of the keys used by EL3 to EL1 and S-EL1.
221ifneq ($(ENABLE_PAUTH),0)
222	ifeq ($(CTX_INCLUDE_PAUTH_REGS),0)
223                $(error Pointer Authentication requires CTX_INCLUDE_PAUTH_REGS to be enabled)
224	endif
225endif #(ENABLE_PAUTH)
226
227ifneq ($(CTX_INCLUDE_PAUTH_REGS),0)
228	ifneq (${ARCH},aarch64)
229                $(error CTX_INCLUDE_PAUTH_REGS requires AArch64)
230	endif
231endif #(CTX_INCLUDE_PAUTH_REGS)
232
233# Check ENABLE_FEAT_PAUTH_LR
234ifneq (${ENABLE_FEAT_PAUTH_LR},0)
235
236# Make sure PAUTH is enabled
237ifeq (${ENABLE_PAUTH},0)
238        $(error Error: PAUTH_LR cannot be used without PAUTH (see BRANCH_PROTECTION))
239endif
240
241# Make sure SCTLR2 is enabled
242ifeq (${ENABLE_FEAT_SCTLR2},0)
243        $(error Error: PAUTH_LR cannot be used without ENABLE_FEAT_SCTLR2)
244endif
245
246ifneq (${ENABLE_FEAT_HACDBS},0)
247	ifeq (${ENABLE_FEAT_HDBSS},0)
248                $(error ENABLE_FEAT_HACDBS requires ENABLE_FEAT_HDBSS)
249	endif
250endif
251
252# FEAT_PAUTH_LR is only supported in aarch64 state
253ifneq (${ARCH},aarch64)
254        $(error ENABLE_FEAT_PAUTH_LR requires AArch64)
255endif
256
257endif # ${ENABLE_FEAT_PAUTH_LR}
258
259ifeq ($(FEATURE_DETECTION),1)
260        $(info FEATURE_DETECTION is an experimental feature)
261endif #(FEATURE_DETECTION)
262
263ifeq ($(FIRME_SUPPORT),1)
264        $(info FIRME_SUPPORT is an experimental feature)
265endif #(FIRME_SUPPORT)
266
267ifneq ($(ENABLE_SME2_FOR_NS), 0)
268	ifeq (${ENABLE_SME_FOR_NS}, 0)
269                $(warning "ENABLE_SME2_FOR_NS requires ENABLE_SME_FOR_NS also \
270                to be set")
271                $(warning "Forced ENABLE_SME_FOR_NS=1")
272                override ENABLE_SME_FOR_NS	:= 1
273	endif
274endif #(ENABLE_SME2_FOR_NS)
275
276ifeq (${ARM_XLAT_TABLES_LIB_V1}, 1)
277	ifeq (${ALLOW_RO_XLAT_TABLES}, 1)
278                $(error "ALLOW_RO_XLAT_TABLES requires translation tables \
279                library v2")
280	endif
281
282        ifneq (${ENABLE_FEAT_RME},0)
283                $(error "ENABLE_FEAT_RME requires version 2 of the Translation \
284                         Tables Library")
285        endif
286endif #(ARM_XLAT_TABLES_LIB_V1)
287
288ifneq (${DECRYPTION_SUPPORT},none)
289	ifeq (${TRUSTED_BOARD_BOOT}, 0)
290                $(error TRUSTED_BOARD_BOOT must be enabled for DECRYPTION_SUPPORT \
291                to be set)
292	endif
293endif #(DECRYPTION_SUPPORT)
294
295# Ensure that no Aarch64-only features are enabled in Aarch32 build
296ifeq (${ARCH},aarch32)
297        ifneq (${ENABLE_LTO},0)
298                $(error "ENABLE_LTO is not supported with ARCH=aarch32")
299        endif
300        ifneq (${EL3_EXCEPTION_HANDLING},0)
301                $(error "EL3_EXCEPTION_HANDLING is not supported outside BL31")
302        endif
303
304        ifeq (${CRASH_REPORTING},1)
305                $(error "CRASH_REPORTING is not supported with ARCH=aarch32")
306        endif
307
308	# SME/SVE only supported on AArch64
309	ifneq (${ENABLE_SME_FOR_NS},0)
310                $(error "ENABLE_SME_FOR_NS cannot be used with ARCH=aarch32")
311	endif
312
313	ifneq (${ENABLE_SVE_FOR_NS},0)
314                $(error "ENABLE_SVE_FOR_NS cannot be used with ARCH=aarch32")
315	endif
316
317	ifneq (${ENABLE_SPE_FOR_NS},0)
318                $(error "ENABLE_SPE_FOR_NS cannot be used with ARCH=aarch32")
319	endif
320
321	# BRBE is not supported in AArch32
322	ifneq (${ENABLE_BRBE_FOR_NS},0)
323                $(error "ENABLE_BRBE_FOR_NS cannot be used with ARCH=aarch32")
324	endif
325
326	# FEAT_RNG_TRAP is not supported in AArch32
327	ifneq (${ENABLE_FEAT_RNG_TRAP},0)
328                $(error "ENABLE_FEAT_RNG_TRAP cannot be used with ARCH=aarch32")
329	endif
330
331	ifneq (${ENABLE_FEAT_FPMR},0)
332                $(error "ENABLE_FEAT_FPMR cannot be used with ARCH=aarch32")
333	endif
334
335	ifeq (${ARCH_FEATURE_AVAILABILITY},1)
336                $(error "ARCH_FEATURE_AVAILABILITY cannot be used with ARCH=aarch32")
337	endif
338	# FEAT_MOPS is only supported on AArch64
339	ifneq (${ENABLE_FEAT_MOPS},0)
340                $(error "ENABLE_FEAT_MOPS cannot be used with ARCH=aarch32")
341	endif
342	ifneq (${ENABLE_FEAT_GCIE},0)
343                $(error "ENABLE_FEAT_GCIE cannot be used with ARCH=aarch32")
344	endif
345	ifneq (${ENABLE_FEAT_CPA2},0)
346                $(error "ENABLE_FEAT_CPA2 cannot be used with ARCH=aarch32")
347	endif
348        ifneq (${USE_SPINLOCK_CAS},0)
349                $(error "USE_SPINLOCK_CAS is not supported with ARCH=aarch32")
350        endif
351	ifneq (${PLATFORM_NODE_COUNT},1)
352                $(error "NUMA AWARE PER CPU is not supported with ARCH=aarch32")
353	endif
354        ifeq (${ENABLE_FEAT_CRYPTO},1)
355                $(error "ENABLE_FEAT_CRYPTO cannot be used with ARCH=aarch32")
356        endif
357        ifeq (${ENABLE_FEAT_CRYPTO_SHA3},1)
358                $(error "ENABLE_FEAT_CRYPTO_SHA3 cannot be used with ARCH=aarch32")
359        endif
360	ifneq (${ENABLE_FEAT_MPAM},0)
361                $(error "ENABLE_FEAT_MPAM cannot be used with ARCH=aarch32")
362	endif
363	ifneq (${ENABLE_FEAT_UINJ},0)
364		$(error "ENABLE_FEAT_UINJ cannot be used with ARCH=aarch32")
365	endif
366	ifneq (${ENABLE_FEAT_STEP2},0)
367                $(error "ENABLE_FEAT_STEP2 cannot be used with ARCH=aarch32")
368	endif
369	ifneq (${ENABLE_FEAT_HDBSS},0)
370                $(error "ENABLE_FEAT_HDBSS cannot be used with ARCH=aarch32")
371	endif
372	ifneq (${ENABLE_FEAT_HACDBS},0)
373                $(error "ENABLE_FEAT_HACDBS cannot be used with ARCH=aarch32")
374	endif
375endif #(ARCH=aarch32)
376
377ifneq (${ENABLE_FEAT_FPMR},0)
378	ifeq (${ENABLE_FEAT_FGT},0)
379                $(error "ENABLE_FEAT_FPMR requires ENABLE_FEAT_FGT")
380	endif
381	ifeq (${ENABLE_FEAT_HCX},0)
382                $(error "ENABLE_FEAT_FPMR requires ENABLE_FEAT_HCX")
383	endif
384endif #(ENABLE_FEAT_FPMR)
385
386ifneq (${ENABLE_FEAT_CPA2},0)
387	ifeq (${ENABLE_FEAT_SCTLR2},0)
388                $(error "Error: ENABLE_FEAT_CPA2 cannot be used without ENABLE_FEAT_SCTLR2")
389	endif
390endif #${ENABLE_FEAT_CPA2}
391
392ifneq (${ENABLE_SME_FOR_NS},0)
393	ifeq (${ENABLE_SVE_FOR_NS},0)
394                $(error "ENABLE_SME_FOR_NS requires ENABLE_SVE_FOR_NS")
395	endif
396endif #(ENABLE_SME_FOR_NS)
397
398# Secure SME/SVE requires the non-secure component as well
399ifeq (${ENABLE_SME_FOR_SWD},1)
400	ifeq (${ENABLE_SME_FOR_NS},0)
401                $(error "ENABLE_SME_FOR_SWD requires ENABLE_SME_FOR_NS")
402	endif
403	ifeq (${ENABLE_SVE_FOR_SWD},0)
404                $(error "ENABLE_SME_FOR_SWD requires ENABLE_SVE_FOR_SWD")
405	endif
406endif #(ENABLE_SME_FOR_SWD)
407
408# Enabling SVE for SWD requires enabling SVE for NWD due to ENABLE_FEAT
409# mechanism.
410ifeq (${ENABLE_SVE_FOR_SWD},1)
411    ifeq (${ENABLE_SVE_FOR_NS},0)
412        $(error "ENABLE_SVE_FOR_SWD requires ENABLE_SVE_FOR_NS")
413    endif
414endif
415
416# Enabling FEAT_MOPS requires access to hcrx_el2 registers which is
417# available only when FEAT_HCX is enabled.
418ifneq (${ENABLE_FEAT_MOPS},0)
419    ifeq (${ENABLE_FEAT_HCX},0)
420        $(error "ENABLE_FEAT_MOPS requires ENABLE_FEAT_HCX")
421    endif
422endif
423
424# Enabling SVE for both the worlds typically requires the context
425# management of SVE registers. The only exception being SPMC at S-EL2.
426ifeq (${ENABLE_SVE_FOR_SWD}, 1)
427    ifneq (${ENABLE_SVE_FOR_NS}, 0)
428        ifeq (${CTX_INCLUDE_SVE_REGS}-$(SPMD_SPM_AT_SEL2),0-0)
429            $(warning "ENABLE_SVE_FOR_SWD and ENABLE_SVE_FOR_NS together require CTX_INCLUDE_SVE_REGS")
430        endif
431    endif
432endif
433
434# Enabling SHA3 requires regular Crypto extension to be enabled
435ifeq (${ENABLE_FEAT_CRYPTO_SHA3}, 1)
436    ifeq (${ENABLE_FEAT_CRYPTO}, 0)
437        $(error "ENABLE_FEAT_CRYPTO_SHA3 requires ENABLE_FEAT_CRYPTO")
438    endif
439endif
440
441ifeq (${ENABLE_FEAT_CRYPTO_SHA3}, 2)
442    $(warning "ENABLE_FEAT_CRYPTO_SHA3 does not have any effect when set to 2")
443endif
444
445ifeq (${ENABLE_FEAT_CRYPTO}, 2)
446    $(warning "ENABLE_FEAT_CRYPTO does not have any effect when set to 2")
447endif
448
449# Enabling SVE in either world while enabling CTX_INCLUDE_FPREGS requires
450# CTX_INCLUDE_SVE_REGS to be enabled due to architectural dependency between FP
451# and SVE registers.
452ifeq (${CTX_INCLUDE_FPREGS}, 1)
453    ifneq (${ENABLE_SVE_FOR_NS},0)
454        ifeq (${CTX_INCLUDE_SVE_REGS},0)
455            # Warning instead of error due to CI dependency on this
456            $(warning "CTX_INCLUDE_FPREGS and ENABLE_SVE_FOR_NS together require CTX_INCLUDE_SVE_REGS")
457            $(warning "Forced ENABLE_SVE_FOR_NS=0")
458            override ENABLE_SVE_FOR_NS	:= 0
459        endif
460    endif
461endif #(CTX_INCLUDE_FPREGS)
462
463# SVE context management is only required if secure world has access to SVE/FP
464# functionality.
465# Enabling CTX_INCLUDE_SVE_REGS requires CTX_INCLUDE_FPREGS to be enabled due
466# to architectural dependency between FP and SVE registers.
467ifeq (${CTX_INCLUDE_SVE_REGS},1)
468    ifeq (${ENABLE_SVE_FOR_SWD},0)
469        $(error "CTX_INCLUDE_SVE_REGS requires ENABLE_SVE_FOR_SWD to also be enabled")
470    endif
471    ifeq (${CTX_INCLUDE_FPREGS},0)
472        $(error "CTX_INCLUDE_SVE_REGS requires CTX_INCLUDE_FPREGS to also be enabled")
473    endif #(CTX_INCLUDE_FPREGS)
474endif #(CTX_INCLUDE_SVE_REGS)
475
476# SME cannot be used with CTX_INCLUDE_FPREGS since SPM does its own context
477# management including FPU registers.
478ifeq (${CTX_INCLUDE_FPREGS},1)
479    ifneq (${ENABLE_SME_FOR_NS},0)
480        $(error "ENABLE_SME_FOR_NS cannot be used with CTX_INCLUDE_FPREGS")
481    endif
482endif #(CTX_INCLUDE_FPREGS)
483
484ifeq ($(DRTM_SUPPORT),1)
485        $(info DRTM_SUPPORT is an experimental feature)
486endif
487
488ifeq (${HOB_LIST},1)
489        $(warning HOB_LIST is an experimental feature)
490endif
491
492ifeq (${TRANSFER_LIST},1)
493        $(info TRANSFER_LIST is an experimental feature)
494endif
495
496ifeq ($(PSA_CRYPTO),1)
497        $(info PSA_CRYPTO is an experimental feature)
498endif
499
500ifeq ($(DICE_PROTECTION_ENVIRONMENT),1)
501        $(info DICE_PROTECTION_ENVIRONMENT is an experimental feature)
502endif
503
504ifeq (${LFA_SUPPORT},1)
505        $(warning LFA_SUPPORT is an experimental feature)
506endif #(LFA_SUPPORT)
507
508ifneq (${ENABLE_FEAT_MPAM_PE_BW_CTRL},0)
509        ifeq (${ENABLE_FEAT_MPAM},0)
510                $(error "ENABLE_FEAT_MPAM_PW_BW_CTRL requires ENABLE_FEAT_MPAM")
511        endif
512endif #(ENABLE_FEAT_MPAM_PE_BW_CTRL)
513
514ifneq (${DYNAMIC_WORKAROUND_CVE_2018_3639},0)
515        ifeq (${WORKAROUND_CVE_2018_3639},0)
516                $(error Error: WORKAROUND_CVE_2018_3639 must be 1 if DYNAMIC_WORKAROUND_CVE_2018_3639 is 1)
517        endif
518endif
519
520ifneq ($(ENABLE_FEAT_MORELLO),0)
521        ifneq ($($(ARCH)-cc-id),llvm-clang)
522                $(error ENABLE_FEAT_MORELLO requires Clang toolchain)
523        endif
524        $(warning Morello capability is an experimental feature)
525endif
526
527# Handle all deprecated build options.
528ifeq (${ERROR_DEPRECATED}, 1)
529    ifneq (${NS_TIMER_SWITCH},0)
530        $(error "NS_TIMER_SWITCH breaks Linux preemption model, hence deprecated")
531    endif
532    ifneq (${SPM_MM},0)
533        $(error "SPM_MM build option is deprecated")
534    endif
535endif
536
537ifneq (${ENABLE_FEAT_IDTE3},0)
538        $(info FEAT_IDTE3 is an experimental feature)
539endif #(ENABLE_FEAT_IDTE3)
540