diff options
| author | Mark Hatle <mark.hatle@amd.com> | 2025-06-17 18:39:38 -0500 |
|---|---|---|
| committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2025-06-20 09:52:28 +0100 |
| commit | 3c5c4cfa6bf4aa88bcd69e2688fdceea6a655165 (patch) | |
| tree | 06abd25119dcff90922795d0cc7f9c2a31e7af30 /meta/conf/machine/include/riscv/arch-riscv.inc | |
| parent | 63fb85ec3709ae6899ad82ae4cc6ce00e11e0018 (diff) | |
| download | poky-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.inc | 138 |
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 | ||
| 3 | DEFAULTTUNE ?= "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 | ||
| 5 | TUNE_ARCH = "${TUNE_ARCH:tune-${DEFAULTTUNE}}" | 6 | # Note: the following should be implemented in the order that GCC expects |
| 6 | TUNE_PKGARCH = "${TUNE_PKGARCH:tune-${DEFAULTTUNE}}" | 7 | # -march= values to be defined in. |
| 7 | TUNE_CCARGS:append = "${@bb.utils.contains('TUNE_FEATURES', 'riscv64nf', ' -mabi=lp64', ' ', d)}" | ||
| 8 | TUNE_CCARGS:append = "${@bb.utils.contains('TUNE_FEATURES', 'riscv32nf', ' -mabi=ilp32', ' ', d)}" | ||
| 9 | 8 | ||
| 10 | TUNE_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 | ||
| 11 | TUNEVALID[rv] = "RISC-V" | ||
| 12 | TUNE_RISCV_ARCH = "${@bb.utils.contains("TUNE_FEATURES", "rv", "riscv", "", d)}" | ||
| 13 | TUNE_RISCV_MARCH = "${@bb.utils.contains("TUNE_FEATURES", "rv", "rv", "", d)}" | ||
| 14 | TUNE_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 | ||
| 21 | TUNEVALID[32] = "ISA XLEN - 32-bit" | ||
| 22 | TUNECONFLICTS[32] = "64" | ||
| 23 | TUNE_RISCV_ARCH .= "${@bb.utils.contains("TUNE_FEATURES", "32", "32", "", d)}" | ||
| 24 | TUNE_RISCV_MARCH .= "${@bb.utils.contains("TUNE_FEATURES", "32", "32", "", d)}" | ||
| 25 | TUNE_RISCV_ABI .= "${@bb.utils.contains("TUNE_FEATURES", "32", "ilp32", "", d)}" | ||
| 26 | |||
| 27 | TUNEVALID[64] = "ISA XLEN - 64-bit" | ||
| 28 | TUNECONFLICTS[64] = "32" | ||
| 29 | TUNE_RISCV_MARCH .= "${@bb.utils.contains("TUNE_FEATURES", "64", "64", "", d)}" | ||
| 30 | TUNE_RISCV_ARCH .= "${@bb.utils.contains("TUNE_FEATURES", "64", "64", "", d)}" | ||
| 31 | TUNE_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 | ||
| 35 | TUNE_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 | ||
| 39 | TUNEVALID[e] = "Reduced register base integer extension" | ||
| 40 | TUNECONFLICTS[e] = "i" | ||
| 41 | TUNE_RISCV_MARCH .= "${@bb.utils.contains("TUNE_FEATURES", "e", "e", "", d)}" | ||
| 42 | TUNE_RISCV_ABI .= "${@bb.utils.contains("TUNE_FEATURES", "e", "e", "", d)}" | ||
| 43 | TUNE_RISCV_PKGARCH .= "${@bb.utils.contains("TUNE_FEATURES", "e", "e", "", d)}" | ||
| 44 | |||
| 45 | TUNEVALID[i] = "Base integer extension" | ||
| 46 | TUNECONFLICTS[i] = "e" | ||
| 47 | TUNE_RISCV_MARCH .= "${@bb.utils.contains("TUNE_FEATURES", "i", "i", "", d)}" | ||
| 48 | TUNE_RISCV_PKGARCH .= "${@bb.utils.contains("TUNE_FEATURES", "i", "i", "", d)}" | ||
| 49 | |||
| 50 | # Extensions | ||
| 51 | TUNEVALID[m] = "Integer multiplication and division extension" | ||
| 52 | TUNE_RISCV_MARCH .= "${@bb.utils.contains("TUNE_FEATURES", "m", "m", "", d)}" | ||
| 53 | TUNE_RISCV_PKGARCH .= "${@bb.utils.contains("TUNE_FEATURES", "m", "m", "", d)}" | ||
| 54 | |||
| 55 | TUNEVALID[a] = "Atomic extension" | ||
| 56 | TUNE_RISCV_MARCH .= "${@bb.utils.contains("TUNE_FEATURES", "a", "a", "", d)}" | ||
| 57 | TUNE_RISCV_PKGARCH .= "${@bb.utils.contains("TUNE_FEATURES", "a", "a", "", d)}" | ||
| 58 | |||
| 59 | TUNEVALID[f] = "Single-precision floating-point extension" | ||
| 60 | TUNE_RISCV_MARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "f d", "f", "", d)}" | ||
| 61 | TUNE_RISCV_PKGARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "f d", "f", "", d)}" | ||
| 62 | |||
| 63 | TUNEVALID[d] = "Double-precision floating-point extension" | ||
| 64 | TUNE_RISCV_MARCH .= "${@bb.utils.contains("TUNE_FEATURES", "d", "d", "", d)}" | ||
| 65 | TUNE_RISCV_PKGARCH .= "${@bb.utils.contains("TUNE_FEATURES", "d", "d", "", d)}" | ||
| 66 | |||
| 67 | # Only f OR d, but just one | ||
| 68 | TUNE_RISCV_ABI .= "${@bb.utils.contains("TUNE_FEATURES", "d", "d", bb.utils.contains("TUNE_FEATURES", "f", "f", "", d), d)}" | ||
| 69 | |||
| 70 | TUNEVALID[c] = "Compressed extension" | ||
| 71 | TUNE_RISCV_MARCH .= "${@bb.utils.contains("TUNE_FEATURES", "c", "c", "", d)}" | ||
| 72 | TUNE_RISCV_PKGARCH .= "${@bb.utils.contains("TUNE_FEATURES", "c", "c", "", d)}" | ||
| 73 | |||
| 74 | TUNEVALID[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 | |||
| 80 | TUNEVALID[v] = "Vector operations extension" | ||
| 81 | TUNE_RISCV_MARCH .= "${@bb.utils.contains("TUNE_FEATURES", "v", "v", "", d)}" | ||
| 82 | TUNE_RISCV_PKGARCH .= "${@bb.utils.contains("TUNE_FEATURES", "v", "v", "", d)}" | ||
| 83 | |||
| 84 | # Now the special Z extensions | ||
| 85 | TUNEVALID[zicbom] = "Cache-block management extension" | ||
| 86 | TUNE_RISCV_MARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "zicbom", "_zicbom", "", d)}" | ||
| 87 | TUNE_RISCV_PKGARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "zicbom", "_zicbom", "", d)}" | ||
| 88 | |||
| 89 | TUNEVALID[zicsr] = "Control and status register access extension" | ||
| 90 | TUNE_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 | |||
| 101 | TUNEVALID[zifencei] = "Instruction-fetch fence extension" | ||
| 102 | TUNE_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 | |||
| 106 | TUNEVALID[zba] = "Address bit manipulation extension" | ||
| 107 | TUNE_RISCV_MARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "b zba", "_zba", "", d)}" | ||
| 108 | TUNE_RISCV_PKGARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "b zba", "_zba", "", d)}" | ||
| 109 | |||
| 110 | TUNEVALID[zbb] = "Basic bit manipulation extension" | ||
| 111 | TUNE_RISCV_MARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "b zbb", "_zbb", "", d)}" | ||
| 112 | TUNE_RISCV_PKGARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "b zbb", "_zbb", "", d)}" | ||
| 113 | |||
| 114 | TUNEVALID[zbc] = "Carry-less multiplication extension" | ||
| 115 | TUNE_RISCV_MARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "zbc", "_zbc", "", d)}" | ||
| 116 | TUNE_RISCV_PKGARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "zbc", "_zbc", "", d)}" | ||
| 117 | |||
| 118 | TUNEVALID[zbs] = "Single-bit manipulation extension" | ||
| 119 | TUNE_RISCV_MARCH .= "${@bb.utils.contains_any("TUNE_FEATURES", "b zbs", "_zbs", "", d)}" | ||
| 120 | TUNE_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 | ||
| 125 | TUNE_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 | ||
| 130 | TUNE_ARCH = "${TUNE_RISCV_ARCH}" | ||
| 131 | |||
| 132 | # Construct TUNE_PKGARCH | ||
| 133 | # This should result in a package are like: | ||
| 134 | # riscv32imac | ||
| 135 | TUNE_PKGARCH = "${TUNE_RISCV_PKGARCH}" | ||
| 136 | |||
| 137 | # Misc settings | ||
| 12 | # Fix: ld: unrecognized option '--hash-style=sysv' | 138 | # Fix: ld: unrecognized option '--hash-style=sysv' |
| 13 | LINKER_HASH_STYLE:libc-newlib = "" | 139 | LINKER_HASH_STYLE:libc-newlib = "" |
| 14 | LINKER_HASH_STYLE:libc-picolibc = "" | 140 | LINKER_HASH_STYLE:libc-picolibc = "" |
