782f37251c39eef57cfee2923fd5f7a2b00ec57d
[platform/kernel/u-boot.git] / doc / board / emulation / qemu-riscv.rst
1 .. SPDX-License-Identifier: GPL-2.0+
2 .. Copyright (C) 2018, Bin Meng <bmeng.cn@gmail.com>
3
4 QEMU RISC-V
5 ===========
6
7 QEMU for RISC-V supports a special 'virt' machine and 'spike' machine designed
8 for emulation and virtualization purposes. This document describes how to run
9 U-Boot under it. Both 32-bit and 64-bit targets are supported, running in
10 either machine or supervisor mode.
11
12 The QEMU virt machine models a generic RISC-V virtual machine with support for
13 the VirtIO standard networking and block storage devices. It has CLINT, PLIC,
14 16550A UART devices in addition to VirtIO and it also uses device-tree to pass
15 configuration information to guest software. It implements the latest RISC-V
16 privileged architecture.
17
18 See :doc:`../../develop/devicetree/dt_qemu` for information on how to see
19 the devicetree actually generated by QEMU.
20
21 The QEMU spike machine models a minimalistic RISC-V virtual machine with
22 only CLINT and HTIF devices. It also uses device-tree to pass configuration
23 information to guest software and implements the latest RISC-V privileged
24 architecture.
25
26 Building U-Boot
27 ---------------
28 Set the CROSS_COMPILE environment variable as usual, and run:
29
30 - For 32-bit RISC-V::
31
32     make qemu-riscv32_defconfig
33     make
34
35 - For 64-bit RISC-V::
36
37     make qemu-riscv64_defconfig
38     make
39
40 This will compile U-Boot for machine mode. To build supervisor mode binaries,
41 use the configurations qemu-riscv32_smode_defconfig and
42 qemu-riscv64_smode_defconfig instead. Note that U-Boot running in supervisor
43 mode requires a supervisor binary interface (SBI), such as RISC-V OpenSBI.
44
45 Running U-Boot
46 --------------
47 The minimal QEMU command line to get U-Boot up and running is:
48
49 - For 32-bit RISC-V virt machine::
50
51     qemu-system-riscv32 -nographic -machine virt -bios u-boot.bin
52
53 - For 64-bit RISC-V virt machine::
54
55     qemu-system-riscv64 -nographic -machine virt -bios u-boot.bin
56
57 - For 64-bit RISC-V spike machine::
58
59     qemu-system-riscv64 -nographic -machine spike -bios u-boot.bin
60
61 The commands above create targets with 128MiB memory by default.
62 A freely configurable amount of RAM can be created via the '-m'
63 parameter. For example, '-m 2G' creates 2GiB memory for the target,
64 and the memory node in the embedded DTB created by QEMU reflects
65 the new setting.
66
67 For instructions on how to run U-Boot in supervisor mode on QEMU
68 with OpenSBI, see the documentation available with OpenSBI:
69 https://github.com/riscv/opensbi/blob/master/docs/platform/qemu_virt.md
70 https://github.com/riscv/opensbi/blob/master/docs/platform/spike.md
71
72 These have been tested in QEMU 5.0.0.
73
74 Running U-Boot SPL
75 ------------------
76 In the default SPL configuration, U-Boot SPL starts in machine mode. U-Boot
77 proper and OpenSBI (FW_DYNAMIC firmware) are bundled as FIT image and made
78 available to U-Boot SPL. Both are then loaded by U-Boot SPL and the location
79 of U-Boot proper is passed to OpenSBI. After initialization, U-Boot proper is
80 started in supervisor mode by OpenSBI.
81
82 OpenSBI must be compiled before compiling U-Boot. Version 0.4 and higher is
83 supported by U-Boot. Clone the OpenSBI repository and run the following command.
84
85 .. code-block:: console
86
87     git clone https://github.com/riscv/opensbi.git
88     cd opensbi
89     make PLATFORM=generic
90
91 See the OpenSBI documentation for full details:
92 https://github.com/riscv/opensbi/blob/master/docs/platform/qemu_virt.md
93 https://github.com/riscv/opensbi/blob/master/docs/platform/spike.md
94
95 To make the FW_DYNAMIC binary (build/platform/generic/firmware/fw_dynamic.bin)
96 available to U-Boot, either copy it into the U-Boot root directory or specify
97 its location with the OPENSBI environment variable. Afterwards, compile U-Boot
98 with the following commands.
99
100 - For 32-bit RISC-V::
101
102     make qemu-riscv32_spl_defconfig
103     make
104
105 - For 64-bit RISC-V::
106
107     make qemu-riscv64_spl_defconfig
108     make
109
110 The minimal QEMU commands to run U-Boot SPL in both 32-bit and 64-bit
111 configurations are:
112
113 - For 32-bit RISC-V virt machine::
114
115     qemu-system-riscv32 -nographic -machine virt -bios spl/u-boot-spl.bin \
116     -device loader,file=u-boot.itb,addr=0x80200000
117
118 - For 64-bit RISC-V virt machine::
119
120     qemu-system-riscv64 -nographic -machine virt -bios spl/u-boot-spl.bin \
121     -device loader,file=u-boot.itb,addr=0x80200000
122
123 - For 64-bit RISC-V spike machine::
124
125     qemu-system-riscv64 -nographic -machine spike -bios spl/u-boot-spl.bin \
126     -device loader,file=u-boot.itb,addr=0x80200000
127
128 An attached disk can be emulated in RISC-V virt machine by adding::
129
130     -device ich9-ahci,id=ahci \
131     -drive if=none,file=riscv64.img,format=raw,id=mydisk \
132     -device ide-hd,drive=mydisk,bus=ahci.0
133
134 You will have to run 'scsi scan' to use it.
135
136 Debug UART
137 ----------
138
139 The following settings provide a debug UART for the virt machine::
140
141     CONFIG_DEBUG_UART=y
142     CONFIG_DEBUG_UART_NS16550=y
143     CONFIG_DEBUG_UART_BASE=0x10000000
144     CONFIG_DEBUG_UART_CLOCK=3686400