[Concept,17/17] ulib: scripts: Add RISC-V support to build-qemu

Message ID 20260216013511.4079770-18-sjg@u-boot.org
State New
Headers
Series ulib: Add multi-arch demo and EFI app support |

Commit Message

Simon Glass Feb. 16, 2026, 1:35 a.m. UTC
  From: Simon Glass <simon.glass@canonical.com>

The build-qemu script accepts --arch riscv via build_helper's argument
parser but raises ValueError since no riscv block exists.

Add RISC-V support with:
- Board names qemu-riscv64/qemu-riscv32 (and _spl variants)
- QEMU binary selection (qemu-system-riscv64/riscv32)
- Machine type 'virt' with TCG acceleration
- Tianocore firmware path (RISCV_VIRT_CODE.fd)
- virtio-gpu-pci display setup (shared with arm, since the virt
  machine has no native VGA)

Co-developed-by: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
---

 scripts/build-qemu | 23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)
  

Patch

diff --git a/scripts/build-qemu b/scripts/build-qemu
index 4f77eb88167..5c69457647e 100755
--- a/scripts/build-qemu
+++ b/scripts/build-qemu
@@ -9,7 +9,7 @@  It assumes that
   board config
 - your OS images are in ${imagedir}/{distroname}/
 
-So far the script supports only ARM and x86
+So far the script supports ARM, RISC-V and x86
 """
 
 import argparse
@@ -122,6 +122,8 @@  class BuildQemu:
         elif args.use_tianocore:
             if args.arch == 'arm':
                 bios_override = Path(self.tiano, 'OVMF-pure-efi.aarch64.fd.64m')
+            elif args.arch == 'riscv':
+                bios_override = Path(self.tiano, 'RISCV_VIRT_CODE.fd')
             else:
                 bios_override = Path(self.tiano, 'OVMF-pure-efi.x64.fd')
             if not bios_override.exists():
@@ -156,6 +158,23 @@  class BuildQemu:
                     self.board = 'qemu_arm64'
                 self.helper.qemu = 'qemu-system-aarch64'
                 self.qemu_extra.extend(['-cpu', 'cortex-a57'])
+        elif args.arch == 'riscv':
+            if args.xpl:
+                self.board = 'qemu-riscv64_spl'
+                default_bios = 'u-boot.bin'
+            else:
+                self.board = 'qemu-riscv64'
+                default_bios = 'u-boot.bin'
+            self.helper.qemu = 'qemu-system-riscv64'
+            self.qemu_extra.extend(['-machine', 'virt'])
+            if not args.kvm:
+                self.qemu_extra.extend(['-accel', 'tcg'])
+            if self.helper.bitness == 32:
+                if args.xpl:
+                    self.board = 'qemu-riscv32_spl'
+                else:
+                    self.board = 'qemu-riscv32'
+                self.helper.qemu = 'qemu-system-riscv32'
         elif args.arch == 'x86':
             self.board = 'qemu-x86'
             default_bios = 'u-boot.rom'
@@ -291,7 +310,7 @@  class BuildQemu:
         # SCT usually runs headlessly
         if self.args.serial_only or self.args.sct_seq:
             qemu_cmd.extend(['-display', 'none'])
-        elif self.args.arch == 'arm':
+        elif self.args.arch in ('arm', 'riscv'):
             qemu_cmd.extend(['-device', 'virtio-gpu-pci'])
             qemu_cmd.extend(['-device', 'qemu-xhci', '-device', 'usb-kbd',
                              '-device', 'usb-tablet', '-device', 'usb-mouse'])