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