blob: 78bcc3ee44c040f0d59aa7f5642c92927e55450d [file] [log] [blame]
Bin Mengc586ff02019-07-18 00:34:15 -07001.. SPDX-License-Identifier: GPL-2.0+
2.. Copyright (C) 2017, Tuomas Tynkkynen <tuomas.tynkkynen@iki.fi>
Tuomas Tynkkynend5587fa2017-10-09 19:42:41 +03003
Bin Mengc586ff02019-07-18 00:34:15 -07004QEMU ARM
5========
Tuomas Tynkkynend5587fa2017-10-09 19:42:41 +03006
7QEMU for ARM supports a special 'virt' machine designed for emulation and
8virtualization purposes. This document describes how to run U-Boot under it.
Tuomas Tynkkynene7ba41c2018-01-11 16:11:24 +02009Both 32-bit ARM and AArch64 are supported.
Tuomas Tynkkynend5587fa2017-10-09 19:42:41 +030010
11The 'virt' platform provides the following as the basic functionality:
12
13 - A freely configurable amount of CPU cores
14 - U-Boot loaded and executing in the emulated flash at address 0x0
15 - A generated device tree blob placed at the start of RAM
16 - A freely configurable amount of RAM, described by the DTB
17 - A PL011 serial port, discoverable via the DTB
Tuomas Tynkkynene7ba41c2018-01-11 16:11:24 +020018 - An ARMv7/ARMv8 architected timer
Tuomas Tynkkynend5587fa2017-10-09 19:42:41 +030019 - PSCI for rebooting the system
20 - A generic ECAM-based PCI host controller, discoverable via the DTB
21
22Additionally, a number of optional peripherals can be added to the PCI bus.
23
Simon Glassc3c16142021-12-16 20:59:09 -070024See :doc:`../../develop/devicetree/dt_qemu` for information on how to see
25the devicetree actually generated by QEMU.
26
Tuomas Tynkkynend5587fa2017-10-09 19:42:41 +030027Building U-Boot
28---------------
Tuomas Tynkkynene7ba41c2018-01-11 16:11:24 +020029Set the CROSS_COMPILE environment variable as usual, and run:
Tuomas Tynkkynend5587fa2017-10-09 19:42:41 +030030
Bin Mengc586ff02019-07-18 00:34:15 -070031- For ARM::
32
Tuomas Tynkkynend5587fa2017-10-09 19:42:41 +030033 make qemu_arm_defconfig
34 make
35
Bin Mengc586ff02019-07-18 00:34:15 -070036- For AArch64::
37
Tuomas Tynkkynene7ba41c2018-01-11 16:11:24 +020038 make qemu_arm64_defconfig
39 make
40
Tuomas Tynkkynend5587fa2017-10-09 19:42:41 +030041Running U-Boot
42--------------
43The minimal QEMU command line to get U-Boot up and running is:
44
Bin Mengc586ff02019-07-18 00:34:15 -070045- For ARM::
46
Simon Glass6d7636c2021-12-16 20:59:08 -070047 qemu-system-arm -machine virt -nographic -bios u-boot.bin
Tuomas Tynkkynend5587fa2017-10-09 19:42:41 +030048
Bin Mengc586ff02019-07-18 00:34:15 -070049- For AArch64::
50
Simon Glass6d7636c2021-12-16 20:59:08 -070051 qemu-system-aarch64 -machine virt -nographic -cpu cortex-a57 -bios u-boot.bin
Tuomas Tynkkynene7ba41c2018-01-11 16:11:24 +020052
Tuomas Tynkkynen9792be72018-05-14 18:47:52 +030053Note that for some odd reason qemu-system-aarch64 needs to be explicitly
Simon Glass6d7636c2021-12-16 20:59:08 -070054told to use a 64-bit CPU or it will boot in 32-bit mode. The -nographic argument
55ensures that output appears on the terminal. Use Ctrl-A X to quit.
Tuomas Tynkkynend5587fa2017-10-09 19:42:41 +030056
Michal Simek1be82af2023-05-17 09:17:16 +020057Additional persistent U-Boot environment support can be added as follows:
Bin Mengc586ff02019-07-18 00:34:15 -070058
59- Create envstore.img using qemu-img::
60
Sumit Garg03fb0952018-11-26 16:50:17 +053061 qemu-img create -f raw envstore.img 64M
Bin Mengc586ff02019-07-18 00:34:15 -070062
63- Add a pflash drive parameter to the command line::
64
Sumit Garg03fb0952018-11-26 16:50:17 +053065 -drive if=pflash,format=raw,index=1,file=envstore.img
66
Tuomas Tynkkynend5587fa2017-10-09 19:42:41 +030067Additional peripherals that have been tested to work in both U-Boot and Linux
68can be enabled with the following command line parameters:
69
Alper Nebi Yasak4d6641d2023-08-14 20:39:41 +030070- To add a video console, remove "-nographic" and add e.g.::
71
72 -serial stdio -device VGA
73
Bin Mengc586ff02019-07-18 00:34:15 -070074- To add a Serial ATA disk via an Intel ICH9 AHCI controller, pass e.g.::
75
Heinrich Schuchardt9d246532021-11-28 11:50:58 +010076 -drive if=none,file=disk.img,format=raw,id=mydisk \
77 -device ich9-ahci,id=ahci -device ide-drive,drive=mydisk,bus=ahci.0
Bin Mengc586ff02019-07-18 00:34:15 -070078
79- To add an Intel E1000 network adapter, pass e.g.::
80
Tuomas Tynkkynend5587fa2017-10-09 19:42:41 +030081 -netdev user,id=net0 -device e1000,netdev=net0
Bin Mengc586ff02019-07-18 00:34:15 -070082
83- To add an EHCI-compliant USB host controller, pass e.g.::
84
Tuomas Tynkkynend5587fa2017-10-09 19:42:41 +030085 -device usb-ehci,id=ehci
Bin Mengc586ff02019-07-18 00:34:15 -070086
Alper Nebi Yasak05e2fa72023-08-14 20:39:43 +030087- To add a USB keyboard attached to an emulated xHCI controller, pass e.g.::
88
89 -device qemu-xhci,id=xhci -device usb-kbd,bus=xhci.0
90
Heinrich Schuchardt9d246532021-11-28 11:50:58 +010091- To add an NVMe disk, pass e.g.::
Bin Mengc586ff02019-07-18 00:34:15 -070092
Tuomas Tynkkynend5587fa2017-10-09 19:42:41 +030093 -drive if=none,file=disk.img,id=mydisk -device nvme,drive=mydisk,serial=foo
94
Heinrich Schuchardt9d246532021-11-28 11:50:58 +010095- To add a random number generator, pass e.g.::
96
97 -device virtio-rng-pci
98
Tuomas Tynkkynend5587fa2017-10-09 19:42:41 +030099These have been tested in QEMU 2.9.0 but should work in at least 2.5.0 as well.
Heinrich Schuchardtc6963fb82020-09-16 00:17:55 +0200100
Alper Nebi Yasak8def2692023-08-14 20:39:44 +0300101Booting distros
102---------------
103
104It is possible to install and boot a standard Linux distribution using
105qemu_arm64 by setting up a root disk::
106
107 qemu-img create root.img 20G
108
109then using the installer to install. For example, with Debian 12::
110
111 qemu-system-aarch64 \
112 -machine virt -cpu cortex-a53 -m 4G -smp 4 \
113 -bios u-boot.bin \
114 -serial stdio -device VGA \
115 -nic user,model=virtio-net-pci \
116 -device virtio-rng-pci \
117 -device qemu-xhci,id=xhci \
118 -device usb-kbd -device usb-tablet \
119 -drive if=virtio,file=debian-12.0.0-arm64-netinst.iso,format=raw,readonly=on,media=cdrom \
120 -drive if=virtio,file=root.img,format=raw,media=disk
121
122The output will be something like this::
123
124 U-Boot 2023.10-rc2-00075-gbe8fbe718e35 (Aug 11 2023 - 08:38:49 +0000)
125
126 DRAM: 4 GiB
127 Core: 51 devices, 14 uclasses, devicetree: board
128 Flash: 64 MiB
129 Loading Environment from Flash... *** Warning - bad CRC, using default environment
130
131 In: serial,usbkbd
132 Out: serial,vidconsole
133 Err: serial,vidconsole
134 Bus xhci_pci: Register 8001040 NbrPorts 8
135 Starting the controller
136 USB XHCI 1.00
137 scanning bus xhci_pci for devices... 3 USB Device(s) found
138 Net: eth0: virtio-net#32
139 Hit any key to stop autoboot: 0
140 Scanning for bootflows in all bootdevs
141 Seq Method State Uclass Part Name Filename
142 --- ----------- ------ -------- ---- ------------------------ ----------------
143 Scanning global bootmeth 'efi_mgr':
144 Scanning bootdev 'fw-cfg@9020000.bootdev':
145 fatal: no kernel available
146 scanning bus for devices...
147 Scanning bootdev 'virtio-blk#34.bootdev':
148 0 efi ready virtio 2 virtio-blk#34.bootdev.par efi/boot/bootaa64.efi
149 ** Booting bootflow 'virtio-blk#34.bootdev.part_2' with efi
150 Using prior-stage device tree
151 Failed to load EFI variables
152 Error: writing contents
153 ** Unable to write file ubootefi.var **
154 Failed to persist EFI variables
155 Missing TPMv2 device for EFI_TCG_PROTOCOL
156 Booting /efi\boot\bootaa64.efi
157 Error: writing contents
158 ** Unable to write file ubootefi.var **
159 Failed to persist EFI variables
160 Welcome to GRUB!
161
162Standard boot looks through various available devices and finds the virtio
163disks, then boots from the first one. After a second or so the grub menu appears
164and you can work through the installer flow normally.
165
166After the installation, you can boot into the installed system by running QEMU
167again without the drive argument corresponding to the installer CD image.
168
Ilias Apalodimasbe2868f2021-11-09 09:02:21 +0200169Enabling TPMv2 support
170----------------------
171
172To emulate a TPM the swtpm package may be used. It can be built from the
173following repositories:
174
175 https://github.com/stefanberger/swtpm.git
176
177Swtpm provides a socket for the TPM emulation which can be consumed by QEMU.
178
179In a first console invoke swtpm with::
180
181 swtpm socket --tpmstate dir=/tmp/mytpm1 \
182 --ctrl type=unixio,path=/tmp/mytpm1/swtpm-sock --log level=20
183
184In a second console invoke qemu-system-aarch64 with::
185
186 -chardev socket,id=chrtpm,path=/tmp/mytpm1/swtpm-sock \
187 -tpmdev emulator,id=tpm0,chardev=chrtpm \
188 -device tpm-tis-device,tpmdev=tpm0
189
190Enable the TPM on U-Boot's command line with::
191
192 tpm2 startup TPM2_SU_CLEAR
193
Heinrich Schuchardtc6963fb82020-09-16 00:17:55 +0200194Debug UART
195----------
196
197The debug UART on the ARM virt board uses these settings::
198
199 CONFIG_DEBUG_UART=y
200 CONFIG_DEBUG_UART_PL010=y
201 CONFIG_DEBUG_UART_BASE=0x9000000
202 CONFIG_DEBUG_UART_CLOCK=0