summaryrefslogtreecommitdiffstats
path: root/meta/conf/machine/include/riscv/arch-riscv.inc
diff options
context:
space:
mode:
authorMark Hatle <mark.hatle@amd.com>2025-06-17 18:39:38 -0500
committerRichard Purdie <richard.purdie@linuxfoundation.org>2025-06-20 09:52:28 +0100
commit3c5c4cfa6bf4aa88bcd69e2688fdceea6a655165 (patch)
tree06abd25119dcff90922795d0cc7f9c2a31e7af30 /meta/conf/machine/include/riscv/arch-riscv.inc
parent63fb85ec3709ae6899ad82ae4cc6ce00e11e0018 (diff)
downloadpoky-3c5c4cfa6bf4aa88bcd69e2688fdceea6a655165.tar.gz
riscv tunes: ISA Implementation of RISC-V tune features
This implements the following base ISAs: * rv32i, rv64i * rv32e, rv64i The following ABIs: * ilp32, ilp32e, ilp32f, ilp32d * lp64, lp64e, lp64f, lp64d The following ISA extension are also implemented: * M - Integer Multiplication and Division Extension * A - Atomic Memory Extension * F - Single-Precision Floating-Point Extension * D - Double-Precision Floating-Point Extension * C - Compressed Extension * B - Bit Manipulation Extension (implies Zba, Zbb, Zbs) * V - Vector Operations Extension * Zicsr - Control and Status Register Access Extension * Zifencei - Instruction-Fetch Fence Extension * Zba - Address bit manipulation extension * Zbb - Basic bit manipulation extension * Zbc - Carry-less multiplication extension * Zbs - Single-bit manipulation extension * Zicbom - Cache-block management extension The existing processors tunes are preserved: * riscv64 (rv64gc) * riscv32 (rv32gc) * riscv64nf (rv64imac_zicsr_zifencei) * riscv32nf (rv32imac_zicsr_zifencei) * riscv64nc (rv64imafd_zicsr_zifencei) Previously defined feature 'big-endian' has been removed as it was not used. (From OE-Core rev: bcaf298a146dfd10e4c8f44223ea083bc4baf45c) Signed-off-by: Mark Hatle <mark.hatle@amd.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/conf/machine/include/riscv/arch-riscv.inc')
-rw-r--r--meta/conf/machine/include/riscv/arch-riscv.inc138
1 files changed, 132 insertions, 6 deletions
diff --git a/meta/conf/machine/include/riscv/arch-riscv.inc b/meta/conf/machine/include/riscv/arch-riscv.inc
index b34064e78f..99bed8fde5 100644
--- a/meta/conf/machine/include/riscv/arch-riscv.inc
+++ b/meta/conf/machine/include/riscv/arch-riscv.inc
@@ -1,14 +1,140 @@
1# RISCV Architecture definition 1# RISCV Architecture definition
2 2
3DEFAULTTUNE ?= "riscv64" 3# Based on the RISC-V Instruction Set Manual Volume I: Unprivileged ISA from May 2025
4# As well as the RISC-V options for using GCC (as of June 2025)
4 5
5TUNE_ARCH = "${TUNE_ARCH:tune-${DEFAULTTUNE}}" 6# Note: the following should be implemented in the order that GCC expects
6TUNE_PKGARCH = "${TUNE_PKGARCH:tune-${DEFAULTTUNE}}" 7# -march= values to be defined in.
7TUNE_CCARGS:append = "${@bb.utils.contains('TUNE_FEATURES', 'riscv64nf', ' -mabi=lp64', ' ', d)}"
8TUNE_CCARGS:append = "${@bb.utils.contains('TUNE_FEATURES', 'riscv32nf', ' -mabi=ilp32', ' ', d)}"
9 8
10TUNE_CCARGS:append = "${@bb.utils.contains('TUNE_FEATURES', 'riscv64nc', ' -march=rv64imafd', ' ', d)}" 9# Base ISA
10# All supported march strings must start with rv32 or rv64
11TUNEVALID[rv] = "RISC-V"
12TUNE_RISCV_ARCH = "${@bb.utils.contains("TUNE_FEATURES", "rv", "riscv", "", d)}"
13TUNE_RISCV_MARCH = "${@bb.utils.contains("TUNE_FEATURES", "rv", "rv", "", d)}"
14TUNE_RISCV_ABI = ""
11 15
16# There are two primary ABIs, ilp32 and lp64
17# There are variants of both, that appears to be based on extensions above
18# For example:
19# rv32i uses ilp32, rv32e uses ilp32e, rv32f uses ilp32f
20# rv64i uses lp64, rv64if uses lp64f, rv64id uses lp64d
21TUNEVALID[32] = "ISA XLEN - 32-bit"
22TUNECONFLICTS[32] = "64"
23TUNE_RISCV_ARCH .= "${@bb.utils.contains("TUNE_FEATURES", "32", "32", "", d)}"
24TUNE_RISCV_MARCH .= "${@bb.utils.contains("TUNE_FEATURES", "32", "32", "", d)}"
25TUNE_RISCV_ABI .= "${@bb.utils.contains("TUNE_FEATURES", "32", "ilp32", "", d)}"
26
27TUNEVALID[64] = "ISA XLEN - 64-bit"
28TUNECONFLICTS[64] = "32"
29TUNE_RISCV_MARCH .= "${@bb.utils.contains("TUNE_FEATURES", "64", "64", "", d)}"
30TUNE_RISCV_ARCH .= "${@bb.utils.contains("TUNE_FEATURES", "64", "64", "", d)}"
31TUNE_RISCV_ABI .= "${@bb.utils.contains("TUNE_FEATURES", "64", "lp64", "", d)}"
32
33# The package arch starts with the canonical arch, but adds some extensions to make
34# package compatibility clear
35TUNE_RISCV_PKGARCH = "${TUNE_RISCV_ARCH}"
36
37# i, e, or g are defined by gcc, but 'g' refers to 'i' + extensions 'MAFD Zicsr Zifencei'
38# So 'g' will not be defined here as it is an abbreviation of the expanded version
39TUNEVALID[e] = "Reduced register base integer extension"
40TUNECONFLICTS[e] = "i"
41TUNE_RISCV_MARCH .= "${@bb.utils.contains("TUNE_FEATURES", "e", "e", "", d)}"
42TUNE_RISCV_ABI .= "${@bb.utils.contains("TUNE_FEATURES", "e", "e", "", d)}"
43TUNE_RISCV_PKGARCH .= "${@bb.utils.contains("TUNE_FEATURES", "e", "e", "", d)}"
44
45TUNEVALID[i] = "Base integer extension"
46TUNECONFLICTS[i] = "e"
47TUNE_RISCV_MARCH .= "${@bb.utils.contains("TUNE_FEATURES", "i", "i", "", d)}"
48TUNE_RISCV_PKGARCH .= "${@bb.utils.contains("TUNE_FEATURES", "i", "i", "", d)}"
49
50# Extensions
51TUNEVALID[m] = "Integer multiplication and division extension"
52TUNE_RISCV_MARCH .= "${@bb.utils.contains("TUNE_FEATURES", "m", "m", "", d)}"
53TUNE_RISCV_PKGARCH .= "${@bb.utils.contains("TUNE_FEATURES", "m", "m", "", d)}"
54
55TUNEVALID[a] = "Atomic extension"
56TUNE_RISCV_MARCH .= "${@bb.utils.contains("TUNE_FEATURES", "a", "a", "", d)}"
57TUNE_RISCV_PKGARCH .= "${@bb.utils.contains("TUNE_FEATURES", "a", "a", "", d)}"
58
59TUNEVALID[f] = "Single-precision floating-point extension"
60TUNE_RISCV_MARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "f d", "f", "", d)}"
61TUNE_RISCV_PKGARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "f d", "f", "", d)}"
62
63TUNEVALID[d] = "Double-precision floating-point extension"
64TUNE_RISCV_MARCH .= "${@bb.utils.contains("TUNE_FEATURES", "d", "d", "", d)}"
65TUNE_RISCV_PKGARCH .= "${@bb.utils.contains("TUNE_FEATURES", "d", "d", "", d)}"
66
67# Only f OR d, but just one
68TUNE_RISCV_ABI .= "${@bb.utils.contains("TUNE_FEATURES", "d", "d", bb.utils.contains("TUNE_FEATURES", "f", "f", "", d), d)}"
69
70TUNEVALID[c] = "Compressed extension"
71TUNE_RISCV_MARCH .= "${@bb.utils.contains("TUNE_FEATURES", "c", "c", "", d)}"
72TUNE_RISCV_PKGARCH .= "${@bb.utils.contains("TUNE_FEATURES", "c", "c", "", d)}"
73
74TUNEVALID[b] = "Bit Manipulation extension"
75# Handled below via zba, zbb, zbs
76# This matches current Linux kernel behavior
77#TUNE_RISCV_MARCH .= "${@bb.utils.contains("TUNE_FEATURES", "b", "b", "", d)}"
78#TUNE_RISCV_PKGARCH .= "${@bb.utils.contains("TUNE_FEATURES", "b", "b", "", d)}"
79
80TUNEVALID[v] = "Vector operations extension"
81TUNE_RISCV_MARCH .= "${@bb.utils.contains("TUNE_FEATURES", "v", "v", "", d)}"
82TUNE_RISCV_PKGARCH .= "${@bb.utils.contains("TUNE_FEATURES", "v", "v", "", d)}"
83
84# Now the special Z extensions
85TUNEVALID[zicbom] = "Cache-block management extension"
86TUNE_RISCV_MARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "zicbom", "_zicbom", "", d)}"
87TUNE_RISCV_PKGARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "zicbom", "_zicbom", "", d)}"
88
89TUNEVALID[zicsr] = "Control and status register access extension"
90TUNE_RISCV_MARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "zicsr f d", "_zicsr", "", d)}"
91# If zicsr (or zifencei) is in the path, OpenSBI fails to use the extensions, do to (Makefile):
92# # Check whether the assembler and the compiler support the Zicsr and Zifencei extensions
93# CC_SUPPORT_ZICSR_ZIFENCEI := $(shell $(CC) $(CLANG_TARGET) $(RELAX_FLAG) -nostdlib -march=rv$(OPENSBI_CC_XLEN)imafd_zicsr_zifencei -x c /dev/null -o /dev/null 2>&1 | grep -e "zicsr" -e "zifencei" > /dev/null && echo n || echo y)
94# this will match on the path containing zicsr or zifencei when an error is reported, which
95# will always happens in this check.
96#
97# Yocto Project Bugzilla 15897
98#
99#TUNE_RISCV_PKGARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "zicsr f d", "_zicsr", "", d)}"
100
101TUNEVALID[zifencei] = "Instruction-fetch fence extension"
102TUNE_RISCV_MARCH .= "${@bb.utils.contains("TUNE_FEATURES", "zifencei", "_zifencei", "", d)}"
103# See above Bug 15897
104#TUNE_RISCV_PKGARCH .= "${@bb.utils.contains("TUNE_FEATURES", "zifencei", "_zifencei", "", d)}"
105
106TUNEVALID[zba] = "Address bit manipulation extension"
107TUNE_RISCV_MARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "b zba", "_zba", "", d)}"
108TUNE_RISCV_PKGARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "b zba", "_zba", "", d)}"
109
110TUNEVALID[zbb] = "Basic bit manipulation extension"
111TUNE_RISCV_MARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "b zbb", "_zbb", "", d)}"
112TUNE_RISCV_PKGARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "b zbb", "_zbb", "", d)}"
113
114TUNEVALID[zbc] = "Carry-less multiplication extension"
115TUNE_RISCV_MARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "zbc", "_zbc", "", d)}"
116TUNE_RISCV_PKGARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "zbc", "_zbc", "", d)}"
117
118TUNEVALID[zbs] = "Single-bit manipulation extension"
119TUNE_RISCV_MARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "b zbs", "_zbs", "", d)}"
120TUNE_RISCV_PKGARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "b zbs", "_zbs", "", d)}"
121
122# Construct TUNE_CCARGS
123# This should result in a CCARG similar to:
124# -march=rv32imac -mabi=ilp32
125TUNE_CCARGS = "${@ '-march=${TUNE_RISCV_MARCH} -mabi=${TUNE_RISCV_ABI}' if not d.getVar('TUNE_CCARGS:tune-${DEFAULTTUNE}') else 'TUNE_CCARGS:tune-${DEFAULTTUNE}'}"
126
127# Construct TUNE_ARCH
128# This should result in an arch string similar to:
129# riscv32
130TUNE_ARCH = "${TUNE_RISCV_ARCH}"
131
132# Construct TUNE_PKGARCH
133# This should result in a package are like:
134# riscv32imac
135TUNE_PKGARCH = "${TUNE_RISCV_PKGARCH}"
136
137# Misc settings
12# Fix: ld: unrecognized option '--hash-style=sysv' 138# Fix: ld: unrecognized option '--hash-style=sysv'
13LINKER_HASH_STYLE:libc-newlib = "" 139LINKER_HASH_STYLE:libc-newlib = ""
14LINKER_HASH_STYLE:libc-picolibc = "" 140LINKER_HASH_STYLE:libc-picolibc = ""