blob: b42d924cc66aab50833aae9e1260d123f879017e [file] [log] [blame]
Bin Mengddec5e92019-07-18 00:34:15 -07001.. SPDX-License-Identifier: GPL-2.0+
2.. Copyright (C) 2017, Tuomas Tynkkynen <tuomas.tynkkynen@iki.fi>
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +03003
Bin Mengddec5e92019-07-18 00:34:15 -07004QEMU ARM
5========
Tuomas Tynkkynena1c21782017-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 Tynkkynen87145cf2018-01-11 16:11:24 +02009Both 32-bit ARM and AArch64 are supported.
Tuomas Tynkkynena1c21782017-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 Tynkkynen87145cf2018-01-11 16:11:24 +020018 - An ARMv7/ARMv8 architected timer
Tuomas Tynkkynena1c21782017-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 Glasseb284942021-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 Tynkkynena1c21782017-10-09 19:42:41 +030027Building U-Boot
28---------------
Tuomas Tynkkynen87145cf2018-01-11 16:11:24 +020029Set the CROSS_COMPILE environment variable as usual, and run:
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030030
Bin Mengddec5e92019-07-18 00:34:15 -070031- For ARM::
32
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030033 make qemu_arm_defconfig
34 make
35
Bin Mengddec5e92019-07-18 00:34:15 -070036- For AArch64::
37
Tuomas Tynkkynen87145cf2018-01-11 16:11:24 +020038 make qemu_arm64_defconfig
39 make
40
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030041Running U-Boot
42--------------
43The minimal QEMU command line to get U-Boot up and running is:
44
Bin Mengddec5e92019-07-18 00:34:15 -070045- For ARM::
46
Simon Glassf188b752021-12-16 20:59:08 -070047 qemu-system-arm -machine virt -nographic -bios u-boot.bin
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030048
Bin Mengddec5e92019-07-18 00:34:15 -070049- For AArch64::
50
Simon Glassf188b752021-12-16 20:59:08 -070051 qemu-system-aarch64 -machine virt -nographic -cpu cortex-a57 -bios u-boot.bin
Tuomas Tynkkynen87145cf2018-01-11 16:11:24 +020052
Tuomas Tynkkynen9cd7ac92018-05-14 18:47:52 +030053Note that for some odd reason qemu-system-aarch64 needs to be explicitly
Simon Glassf188b752021-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 Tynkkynena1c21782017-10-09 19:42:41 +030056
Michal Simek50fa1182023-05-17 09:17:16 +020057Additional persistent U-Boot environment support can be added as follows:
Bin Mengddec5e92019-07-18 00:34:15 -070058
59- Create envstore.img using qemu-img::
60
Sumit Garg9b614ea2018-11-26 16:50:17 +053061 qemu-img create -f raw envstore.img 64M
Bin Mengddec5e92019-07-18 00:34:15 -070062
63- Add a pflash drive parameter to the command line::
64
Sumit Garg9b614ea2018-11-26 16:50:17 +053065 -drive if=pflash,format=raw,index=1,file=envstore.img
66
Tuomas Tynkkynena1c21782017-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
Bin Mengddec5e92019-07-18 00:34:15 -070070- To add a Serial ATA disk via an Intel ICH9 AHCI controller, pass e.g.::
71
Heinrich Schuchardt06c09652021-11-28 11:50:58 +010072 -drive if=none,file=disk.img,format=raw,id=mydisk \
73 -device ich9-ahci,id=ahci -device ide-drive,drive=mydisk,bus=ahci.0
Bin Mengddec5e92019-07-18 00:34:15 -070074
75- To add an Intel E1000 network adapter, pass e.g.::
76
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030077 -netdev user,id=net0 -device e1000,netdev=net0
Bin Mengddec5e92019-07-18 00:34:15 -070078
79- To add an EHCI-compliant USB host controller, pass e.g.::
80
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030081 -device usb-ehci,id=ehci
Bin Mengddec5e92019-07-18 00:34:15 -070082
Heinrich Schuchardt06c09652021-11-28 11:50:58 +010083- To add an NVMe disk, pass e.g.::
Bin Mengddec5e92019-07-18 00:34:15 -070084
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030085 -drive if=none,file=disk.img,id=mydisk -device nvme,drive=mydisk,serial=foo
86
Heinrich Schuchardt06c09652021-11-28 11:50:58 +010087- To add a random number generator, pass e.g.::
88
89 -device virtio-rng-pci
90
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030091These have been tested in QEMU 2.9.0 but should work in at least 2.5.0 as well.
Heinrich Schuchardtd4a7fc12020-09-16 00:17:55 +020092
Ilias Apalodimasbcc9bca2021-11-09 09:02:21 +020093Enabling TPMv2 support
94----------------------
95
96To emulate a TPM the swtpm package may be used. It can be built from the
97following repositories:
98
99 https://github.com/stefanberger/swtpm.git
100
101Swtpm provides a socket for the TPM emulation which can be consumed by QEMU.
102
103In a first console invoke swtpm with::
104
105 swtpm socket --tpmstate dir=/tmp/mytpm1 \
106 --ctrl type=unixio,path=/tmp/mytpm1/swtpm-sock --log level=20
107
108In a second console invoke qemu-system-aarch64 with::
109
110 -chardev socket,id=chrtpm,path=/tmp/mytpm1/swtpm-sock \
111 -tpmdev emulator,id=tpm0,chardev=chrtpm \
112 -device tpm-tis-device,tpmdev=tpm0
113
114Enable the TPM on U-Boot's command line with::
115
116 tpm2 startup TPM2_SU_CLEAR
117
Heinrich Schuchardtd4a7fc12020-09-16 00:17:55 +0200118Debug UART
119----------
120
121The debug UART on the ARM virt board uses these settings::
122
123 CONFIG_DEBUG_UART=y
124 CONFIG_DEBUG_UART_PL010=y
125 CONFIG_DEBUG_UART_BASE=0x9000000
126 CONFIG_DEBUG_UART_CLOCK=0