| ## SPDX-License-Identifier: GPL-2.0-only |
| |
| ################################################################################ |
| ## RISC-V specific options |
| ################################################################################ |
| ifeq ($(CONFIG_ARCH_RISCV),y) |
| |
| ifeq ($(CONFIG_ARCH_RAMSTAGE_RISCV),y) |
| check-ramstage-overlap-regions += stack |
| endif |
| |
| riscv_flags = -I$(src)/arch/riscv/ |
| |
| ifeq ($(CONFIG_ARCH_RISCV_RV64),y) |
| _rv_flags += -D__riscv -D__riscv_xlen=64 -D__riscv_flen=64 |
| else |
| ifeq ($(CONFIG_ARCH_RISCV_RV32),y) |
| _rv_flags += -D__riscv -D__riscv_xlen=32 -D__riscv_flen=32 |
| else |
| $(error "You need to select ARCH_RISCV_RV64 or ARCH_RISCV_RV32") |
| endif |
| endif |
| |
| # Needed for -print-libgcc-file-name which gets confused about all those arch |
| # suffixes in ARCH_SUFFIX_riscv. |
| simple_riscv_flags = $(riscv_flags) |
| |
| ifeq ($(CONFIG_COMPILER_GCC),y) |
| MARCH_SUFFIX=$(ARCH_SUFFIX_riscv) |
| else |
| MARCH_SUFFIX= |
| endif |
| |
| ifeq ($(CCC_ANALYZER_OUTPUT_FORMAT),) |
| riscv_flags += -march=$(CONFIG_RISCV_ARCH)$(MARCH_SUFFIX) -mabi=$(CONFIG_RISCV_ABI) -mcmodel=$(CONFIG_RISCV_CODEMODEL) |
| simple_riscv_flags += -march=$(CONFIG_RISCV_ARCH) -mabi=$(CONFIG_RISCV_ABI) -mcmodel=$(CONFIG_RISCV_CODEMODEL) |
| else |
| riscv_flags += $(_rv_flags) |
| simple_riscv_flags += $(_rv_flags) |
| endif |
| |
| riscv_asm_flags = -march=$(CONFIG_RISCV_ARCH)$(MARCH_SUFFIX) -mabi=$(CONFIG_RISCV_ABI) |
| |
| COMPILER_RT_bootblock = $(shell $(GCC_bootblock) $(simple_riscv_flags) -print-libgcc-file-name) |
| |
| COMPILER_RT_romstage = $(shell $(GCC_romstage) $(simple_riscv_flags) -print-libgcc-file-name) |
| |
| COMPILER_RT_ramstage = $(shell $(GCC_ramstage) $(simple_riscv_flags) -print-libgcc-file-name) |
| |
| ## All stages |
| |
| all-y += trap_util.S |
| all-y += trap_handler.c |
| all-y += fp_asm.S |
| all-y += misaligned.c |
| all-y += sbi.c |
| all-y += mcall.c |
| all-y += virtual_memory.c |
| all-y += boot.c |
| all-y += smp.c |
| all-y += misc.c |
| all-$(CONFIG_ARCH_RISCV_PMP) += pmp.c |
| all-y += \ |
| $(top)/src/lib/memchr.c \ |
| $(top)/src/lib/memcmp.c \ |
| $(top)/src/lib/memcpy.c \ |
| $(top)/src/lib/memmove.c \ |
| $(top)/src/lib/memset.c |
| all-$(CONFIG_RISCV_USE_ARCH_TIMER) += arch_timer.c |
| |
| |
| ################################################################################ |
| ## bootblock |
| ################################################################################ |
| ifeq ($(CONFIG_ARCH_BOOTBLOCK_RISCV),y) |
| |
| bootblock-y = bootblock.S |
| |
| $(objcbfs)/bootblock.debug: $$(bootblock-objs) |
| @printf " LINK $(subst $(obj)/,,$(@))\n" |
| $(LD_bootblock) $(LDFLAGS_bootblock) -o $@ -L$(obj) \ |
| -T $(call src-to-obj,bootblock,$(CONFIG_MEMLAYOUT_LD_FILE)) --whole-archive --start-group $(filter-out %.ld,$(bootblock-objs)) \ |
| $(LIBGCC_FILE_NAME_bootblock) --end-group $(COMPILER_RT_bootblock) |
| |
| bootblock-c-ccopts += $(riscv_flags) |
| bootblock-S-ccopts += $(riscv_asm_flags) |
| |
| ifeq ($(CONFIG_ARCH_RISCV_RV32),y) |
| LDFLAGS_bootblock += -m elf32lriscv |
| endif #CONFIG_ARCH_RISCV_RV32 |
| |
| endif #CONFIG_ARCH_BOOTBLOCK_RISCV |
| |
| ################################################################################ |
| ## romstage |
| ################################################################################ |
| ifeq ($(CONFIG_ARCH_ROMSTAGE_RISCV),y) |
| |
| romstage-$(CONFIG_SEPARATE_ROMSTAGE) += romstage.S |
| romstage-y += ramdetect.c |
| |
| # Build the romstage |
| |
| $(objcbfs)/romstage.debug: $$(romstage-objs) |
| @printf " LINK $(subst $(obj)/,,$(@))\n" |
| $(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) |
| |
| romstage-c-ccopts += $(riscv_flags) |
| romstage-S-ccopts += $(riscv_asm_flags) |
| |
| ifeq ($(CONFIG_ARCH_RISCV_RV32),y) |
| LDFLAGS_romstage += -m elf32lriscv |
| endif #CONFIG_ARCH_RISCV_RV32 |
| |
| endif #CONFIG_ARCH_ROMSTAGE_RISCV |
| |
| ################################################################################ |
| ## ramstage |
| ################################################################################ |
| ifeq ($(CONFIG_ARCH_RAMSTAGE_RISCV),y) |
| |
| ramstage-y = |
| ramstage-y += ramstage.S |
| ramstage-y += ramdetect.c |
| ramstage-y += tables.c |
| ramstage-y += payload.c |
| ramstage-y += fit_payload.c |
| |
| $(eval $(call create_class_compiler,rmodules,riscv)) |
| |
| ramstage-srcs += src/mainboard/$(MAINBOARDDIR)/mainboard.c |
| |
| # Build the ramstage |
| |
| $(objcbfs)/ramstage.debug: $$(ramstage-objs) |
| @printf " CC $(subst $(obj)/,,$(@))\n" |
| $(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) |
| |
| ramstage-c-ccopts += $(riscv_flags) |
| ramstage-S-ccopts += $(riscv_asm_flags) |
| |
| ifeq ($(CONFIG_ARCH_RISCV_RV32),y) |
| LDFLAGS_ramstage += -m elf32lriscv |
| endif #CONFIG_ARCH_RISCV_RV32 |
| |
| endif #CONFIG_ARCH_RAMSTAGE_RISCV |
| |
| ifeq ($(CONFIG_RISCV_OPENSBI),y) |
| |
| OPENSBI_SOURCE := $(top)/3rdparty/opensbi |
| OPENSBI_BUILD := $(abspath $(obj)/3rdparty/opensbi) |
| OPENSBI_TARGET := $(OPENSBI_BUILD)/platform/$(CONFIG_OPENSBI_PLATFORM)/firmware/fw_dynamic.elf |
| OPENSBI := $(obj)/opensbi.elf |
| |
| # TODO: Building with clang has troubles finding the proper linker. |
| # Always use GCC for now. |
| $(OPENSBI_TARGET): $(obj)/config.h | $(OPENSBI_SOURCE) |
| printf " MAKE $(subst $(obj)/,,$(@))\n" |
| mkdir -p $(OPENSBI_BUILD) |
| $(MAKE) \ |
| -C "$(OPENSBI_SOURCE)" \ |
| CC="$(GCC_ramstage) -fno-builtin" \ |
| LD="$(LD_ramstage)" \ |
| OBJCOPY="$(OBJCOPY_ramstage)" \ |
| AR="$(AR_ramstage)" \ |
| PLATFORM=$(CONFIG_OPENSBI_PLATFORM) \ |
| O="$(OPENSBI_BUILD)" \ |
| FW_JUMP=n \ |
| FW_DYNAMIC=y \ |
| FW_PAYLOAD=n \ |
| FW_TEXT_START=$(CONFIG_OPENSBI_TEXT_START) |
| |
| $(OPENSBI): $(OPENSBI_TARGET) |
| cp $< $@ |
| |
| OPENSBI_CBFS := $(CONFIG_CBFS_PREFIX)/opensbi |
| $(OPENSBI_CBFS)-file := $(OPENSBI) |
| $(OPENSBI_CBFS)-type := payload |
| $(OPENSBI_CBFS)-compression := $(CBFS_COMPRESS_FLAG) |
| cbfs-files-y += $(OPENSBI_CBFS) |
| |
| check-ramstage-overlap-files += $(OPENSBI_CBFS) |
| |
| CPPFLAGS_common += -I$(OPENSBI_SOURCE)/include |
| ramstage-y += opensbi.c |
| |
| endif #CONFIG_RISCV_OPENSBI |
| |
| endif #CONFIG_ARCH_RISCV |