xref: /aosp_15_r20/external/coreboot/src/arch/riscv/Makefile.mk (revision b9411a12aaaa7e1e6a6fb7c5e057f44ee179a49c)
1## SPDX-License-Identifier: GPL-2.0-only
2
3################################################################################
4## RISC-V specific options
5################################################################################
6ifeq ($(CONFIG_ARCH_RISCV),y)
7
8ifeq ($(CONFIG_ARCH_RAMSTAGE_RISCV),y)
9check-ramstage-overlap-regions += stack
10endif
11
12riscv_flags = -I$(src)/arch/riscv/
13
14ifeq ($(CONFIG_ARCH_RISCV_RV64),y)
15_rv_flags += -D__riscv -D__riscv_xlen=64 -D__riscv_flen=64
16else
17ifeq ($(CONFIG_ARCH_RISCV_RV32),y)
18_rv_flags += -D__riscv -D__riscv_xlen=32 -D__riscv_flen=32
19else
20$(error "You need to select ARCH_RISCV_RV64 or ARCH_RISCV_RV32")
21endif
22endif
23
24# Needed for -print-libgcc-file-name which gets confused about all those arch
25# suffixes in ARCH_SUFFIX_riscv.
26simple_riscv_flags = $(riscv_flags)
27
28ifeq ($(CONFIG_COMPILER_GCC),y)
29MARCH_SUFFIX=$(ARCH_SUFFIX_riscv)
30else
31MARCH_SUFFIX=
32endif
33
34ifeq ($(CCC_ANALYZER_OUTPUT_FORMAT),)
35riscv_flags += -march=$(CONFIG_RISCV_ARCH)$(MARCH_SUFFIX) -mabi=$(CONFIG_RISCV_ABI) -mcmodel=$(CONFIG_RISCV_CODEMODEL)
36simple_riscv_flags += -march=$(CONFIG_RISCV_ARCH) -mabi=$(CONFIG_RISCV_ABI) -mcmodel=$(CONFIG_RISCV_CODEMODEL)
37else
38riscv_flags += $(_rv_flags)
39simple_riscv_flags += $(_rv_flags)
40endif
41
42riscv_asm_flags = -march=$(CONFIG_RISCV_ARCH)$(MARCH_SUFFIX) -mabi=$(CONFIG_RISCV_ABI)
43
44COMPILER_RT_bootblock = $(shell $(GCC_bootblock) $(simple_riscv_flags) -print-libgcc-file-name)
45
46COMPILER_RT_romstage  = $(shell  $(GCC_romstage) $(simple_riscv_flags) -print-libgcc-file-name)
47
48COMPILER_RT_ramstage  = $(shell  $(GCC_ramstage) $(simple_riscv_flags) -print-libgcc-file-name)
49
50## All stages
51
52all-y += trap_util.S
53all-y += trap_handler.c
54all-y += fp_asm.S
55all-y += sbi.c
56all-y += mcall.c
57all-y += virtual_memory.c
58all-y += boot.c
59all-y += smp.c
60all-y += misc.c
61all-$(CONFIG_ARCH_RISCV_PMP) += pmp.c
62all-y += \
63	$(top)/src/lib/memchr.c \
64	$(top)/src/lib/memcmp.c \
65	$(top)/src/lib/memcpy.c \
66	$(top)/src/lib/memmove.c \
67	$(top)/src/lib/memset.c
68all-$(CONFIG_RISCV_USE_ARCH_TIMER) += arch_timer.c
69
70
71################################################################################
72## bootblock
73################################################################################
74ifeq ($(CONFIG_ARCH_BOOTBLOCK_RISCV),y)
75
76bootblock-y = bootblock.S
77
78$(objcbfs)/bootblock.debug: $$(bootblock-objs)
79	@printf "    LINK       $(subst $(obj)/,,$(@))\n"
80	$(LD_bootblock) $(LDFLAGS_bootblock) -o $@ -L$(obj) \
81		-T $(call src-to-obj,bootblock,$(CONFIG_MEMLAYOUT_LD_FILE)) --whole-archive --start-group $(filter-out %.ld,$(bootblock-objs)) \
82		$(LIBGCC_FILE_NAME_bootblock) --end-group $(COMPILER_RT_bootblock)
83
84bootblock-c-ccopts += $(riscv_flags)
85bootblock-S-ccopts += $(riscv_asm_flags)
86
87ifeq ($(CONFIG_ARCH_RISCV_RV32),y)
88LDFLAGS_bootblock += -m elf32lriscv
89endif #CONFIG_ARCH_RISCV_RV32
90
91endif #CONFIG_ARCH_BOOTBLOCK_RISCV
92
93################################################################################
94## romstage
95################################################################################
96ifeq ($(CONFIG_ARCH_ROMSTAGE_RISCV),y)
97
98romstage-$(CONFIG_SEPARATE_ROMSTAGE) += romstage.S
99romstage-y += ramdetect.c
100
101# Build the romstage
102
103$(objcbfs)/romstage.debug: $$(romstage-objs)
104	@printf "    LINK       $(subst $(obj)/,,$(@))\n"
105	$(LD_romstage) $(LDFLAGS_romstage) -o $@ -L$(obj) -T $(call src-to-obj,romstage,$(CONFIG_MEMLAYOUT_LD_FILE)) --whole-archive --start-group $(filter-out %.ld,$(romstage-objs)) --end-group $(COMPILER_RT_romstage)
106
107romstage-c-ccopts += $(riscv_flags)
108romstage-S-ccopts += $(riscv_asm_flags)
109
110ifeq ($(CONFIG_ARCH_RISCV_RV32),y)
111LDFLAGS_romstage += -m elf32lriscv
112endif #CONFIG_ARCH_RISCV_RV32
113
114endif #CONFIG_ARCH_ROMSTAGE_RISCV
115
116################################################################################
117## ramstage
118################################################################################
119ifeq ($(CONFIG_ARCH_RAMSTAGE_RISCV),y)
120
121ramstage-y =
122ramstage-y += ramstage.S
123ramstage-y += ramdetect.c
124ramstage-y += tables.c
125ramstage-y += payload.c
126ramstage-y += fit_payload.c
127
128$(eval $(call create_class_compiler,rmodules,riscv))
129
130ramstage-srcs += src/mainboard/$(MAINBOARDDIR)/mainboard.c
131
132# Build the ramstage
133
134$(objcbfs)/ramstage.debug: $$(ramstage-objs)
135	@printf "    CC         $(subst $(obj)/,,$(@))\n"
136	$(LD_ramstage) $(LDFLAGS_ramstage) -o $@ -L$(obj) -T $(call src-to-obj,ramstage,$(CONFIG_MEMLAYOUT_LD_FILE)) --whole-archive --start-group $(filter-out %.ld,$(ramstage-objs)) --end-group $(COMPILER_RT_ramstage)
137
138ramstage-c-ccopts += $(riscv_flags)
139ramstage-S-ccopts += $(riscv_asm_flags)
140
141ifeq ($(CONFIG_ARCH_RISCV_RV32),y)
142LDFLAGS_ramstage += -m elf32lriscv
143endif #CONFIG_ARCH_RISCV_RV32
144
145endif #CONFIG_ARCH_RAMSTAGE_RISCV
146
147ifeq ($(CONFIG_RISCV_OPENSBI),y)
148
149OPENSBI_SOURCE := $(top)/3rdparty/opensbi
150OPENSBI_BUILD  := $(abspath $(obj)/3rdparty/opensbi)
151OPENSBI_TARGET := $(OPENSBI_BUILD)/platform/$(CONFIG_OPENSBI_PLATFORM)/firmware/fw_dynamic.elf
152OPENSBI := $(obj)/opensbi.elf
153
154# TODO: Building with clang has troubles finding the proper linker.
155# Always use GCC for now.
156$(OPENSBI_TARGET): $(obj)/config.h | $(OPENSBI_SOURCE)
157	printf "    MAKE       $(subst $(obj)/,,$(@))\n"
158	mkdir -p $(OPENSBI_BUILD)
159	$(MAKE) \
160		-C "$(OPENSBI_SOURCE)" \
161		CC="$(GCC_ramstage) -fno-builtin" \
162		LD="$(LD_ramstage)" \
163		OBJCOPY="$(OBJCOPY_ramstage)" \
164		AR="$(AR_ramstage)" \
165		PLATFORM=$(CONFIG_OPENSBI_PLATFORM) \
166		O="$(OPENSBI_BUILD)" \
167		FW_JUMP=n \
168		FW_DYNAMIC=y \
169		FW_PAYLOAD=n \
170		FW_TEXT_START=$(CONFIG_OPENSBI_TEXT_START)
171
172$(OPENSBI): $(OPENSBI_TARGET)
173	cp $< $@
174
175OPENSBI_CBFS := $(CONFIG_CBFS_PREFIX)/opensbi
176$(OPENSBI_CBFS)-file := $(OPENSBI)
177$(OPENSBI_CBFS)-type := payload
178$(OPENSBI_CBFS)-compression := $(CBFS_COMPRESS_FLAG)
179cbfs-files-y += $(OPENSBI_CBFS)
180
181check-ramstage-overlap-files += $(OPENSBI_CBFS)
182
183CPPFLAGS_common += -I$(OPENSBI_SOURCE)/include
184ramstage-y += opensbi.c
185
186endif #CONFIG_RISCV_OPENSBI
187
188endif #CONFIG_ARCH_RISCV
189