mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-03-10 00:11:47 +01:00
Ratified on Apr. 2024, the original RISC-V "A" extension is now split
into two separate extensions, "Zaamo" for atomic operations and "Zalrsc"
for load-reserved/store-conditional instructions.
For now, we've already seen real-world designs implement the Zalrsc
extension only[2]. As U-Boot mainly runs with only one HART, we could
easily support these designs by not using AMO instructions in the
hard-written assembly if necessary, for which this patch introduces two
new Kconfig options to indicate the availability of "Zaamo" and "Zalrsc".
Note that even with this patch, "A" extension is specified in the ISA
string passed to the compiler as long as one of "Zaamo" or "Zalrsc" is
available, since they're only recognized with a quite recent version of
GCC/Clang. The compiler usually doesn't automatically generate atomic
instructions unless the source explicitly instructs it to do so, thus
this should be safe.
Link: d94c64c63e # [1]
Link: https://lore.kernel.org/u-boot/20250729162035.209849-9-uros.stajic@htecgroup.com/ # [2]
Signed-off-by: Yao Zi <ziyao@disroot.org>
Reviewed-by: Leo Yu-Chi Liang <ycliang@andestech.com>
68 lines
1.8 KiB
Makefile
68 lines
1.8 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0+
|
|
#
|
|
# Copyright (C) 2017 Andes Technology Corporation.
|
|
# Rick Chen, Andes Technology Corporation <rick@andestech.com>
|
|
|
|
ifeq ($(CONFIG_ARCH_RV64I),y)
|
|
ARCH_BASE = rv64im
|
|
ABI_BASE = lp64
|
|
endif
|
|
ifeq ($(CONFIG_ARCH_RV32I),y)
|
|
ARCH_BASE = rv32im
|
|
ABI_BASE = ilp32
|
|
endif
|
|
# GCC starts to recognize "Zaamo" and "Zalrsc" from version 15, which is quite
|
|
# recent. We don't bother checking the exact compiler version, but pass "A"
|
|
# extension for -march as long as one of "Zaamo" or "Zalrsc" is available.
|
|
ifeq ($(findstring y,$(CONFIG_RISCV_ISA_A) \
|
|
$(CONFIG_RISCV_ISA_ZAAMO) \
|
|
$(CONFIG_RISCV_ISA_ZALRSC)),y)
|
|
ARCH_A = a
|
|
endif
|
|
ifeq ($(CONFIG_RISCV_ISA_F),y)
|
|
ARCH_F = f
|
|
endif
|
|
ifeq ($(CONFIG_RISCV_ISA_D),y)
|
|
ARCH_D = d
|
|
ABI_D = d
|
|
endif
|
|
ifeq ($(CONFIG_RISCV_ISA_C),y)
|
|
ARCH_C = c
|
|
endif
|
|
ifeq ($(CONFIG_RISCV_ISA_ZBB),y)
|
|
ARCH_ZBB = _zbb
|
|
endif
|
|
ifeq ($(CONFIG_CMODEL_MEDLOW),y)
|
|
CMODEL = medlow
|
|
endif
|
|
ifeq ($(CONFIG_CMODEL_MEDANY),y)
|
|
CMODEL = medany
|
|
endif
|
|
|
|
|
|
RISCV_MARCH = $(ARCH_BASE)$(ARCH_A)$(ARCH_F)$(ARCH_D)$(ARCH_C)$(ARCH_ZBB)
|
|
ABI = $(ABI_BASE)$(ABI_D)
|
|
|
|
# Newer binutils versions default to ISA spec version 20191213 which moves some
|
|
# instructions from the I extension to the Zicsr and Zifencei extensions.
|
|
toolchain-need-zicsr-zifencei := $(call cc-option-yn, -mabi=$(ABI) -march=$(RISCV_MARCH)_zicsr_zifencei)
|
|
ifeq ($(toolchain-need-zicsr-zifencei),y)
|
|
RISCV_MARCH := $(RISCV_MARCH)_zicsr_zifencei
|
|
endif
|
|
|
|
ARCH_FLAGS = -march=$(RISCV_MARCH) -mabi=$(ABI) \
|
|
-mcmodel=$(CMODEL)
|
|
|
|
ifeq ($(CONFIG_$(PHASE_)FRAMEPOINTER),y)
|
|
ARCH_FLAGS += -fno-omit-frame-pointer
|
|
endif
|
|
|
|
PLATFORM_CPPFLAGS += $(ARCH_FLAGS)
|
|
CFLAGS_EFI += $(ARCH_FLAGS)
|
|
|
|
head-y := arch/riscv/cpu/start.o
|
|
|
|
libs-y += arch/riscv/cpu/
|
|
libs-y += arch/riscv/cpu/$(CPU)/
|
|
libs-y += arch/riscv/lib/
|