blob: 23abe0964d2f4b40bf3d255b24d94e404368f97e [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
24Building U-Boot
25---------------
Tuomas Tynkkynen87145cf2018-01-11 16:11:24 +020026Set the CROSS_COMPILE environment variable as usual, and run:
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030027
Bin Mengddec5e92019-07-18 00:34:15 -070028- For ARM::
29
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030030 make qemu_arm_defconfig
31 make
32
Bin Mengddec5e92019-07-18 00:34:15 -070033- For AArch64::
34
Tuomas Tynkkynen87145cf2018-01-11 16:11:24 +020035 make qemu_arm64_defconfig
36 make
37
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030038Running U-Boot
39--------------
40The minimal QEMU command line to get U-Boot up and running is:
41
Bin Mengddec5e92019-07-18 00:34:15 -070042- For ARM::
43
Simon Glassf188b752021-12-16 20:59:08 -070044 qemu-system-arm -machine virt -nographic -bios u-boot.bin
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030045
Bin Mengddec5e92019-07-18 00:34:15 -070046- For AArch64::
47
Simon Glassf188b752021-12-16 20:59:08 -070048 qemu-system-aarch64 -machine virt -nographic -cpu cortex-a57 -bios u-boot.bin
Tuomas Tynkkynen87145cf2018-01-11 16:11:24 +020049
Tuomas Tynkkynen9cd7ac92018-05-14 18:47:52 +030050Note that for some odd reason qemu-system-aarch64 needs to be explicitly
Simon Glassf188b752021-12-16 20:59:08 -070051told to use a 64-bit CPU or it will boot in 32-bit mode. The -nographic argument
52ensures that output appears on the terminal. Use Ctrl-A X to quit.
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030053
Sumit Garg9b614ea2018-11-26 16:50:17 +053054Additional persistent U-boot environment support can be added as follows:
Bin Mengddec5e92019-07-18 00:34:15 -070055
56- Create envstore.img using qemu-img::
57
Sumit Garg9b614ea2018-11-26 16:50:17 +053058 qemu-img create -f raw envstore.img 64M
Bin Mengddec5e92019-07-18 00:34:15 -070059
60- Add a pflash drive parameter to the command line::
61
Sumit Garg9b614ea2018-11-26 16:50:17 +053062 -drive if=pflash,format=raw,index=1,file=envstore.img
63
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030064Additional peripherals that have been tested to work in both U-Boot and Linux
65can be enabled with the following command line parameters:
66
Bin Mengddec5e92019-07-18 00:34:15 -070067- To add a Serial ATA disk via an Intel ICH9 AHCI controller, pass e.g.::
68
Heinrich Schuchardt06c09652021-11-28 11:50:58 +010069 -drive if=none,file=disk.img,format=raw,id=mydisk \
70 -device ich9-ahci,id=ahci -device ide-drive,drive=mydisk,bus=ahci.0
Bin Mengddec5e92019-07-18 00:34:15 -070071
72- To add an Intel E1000 network adapter, pass e.g.::
73
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030074 -netdev user,id=net0 -device e1000,netdev=net0
Bin Mengddec5e92019-07-18 00:34:15 -070075
76- To add an EHCI-compliant USB host controller, pass e.g.::
77
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030078 -device usb-ehci,id=ehci
Bin Mengddec5e92019-07-18 00:34:15 -070079
Heinrich Schuchardt06c09652021-11-28 11:50:58 +010080- To add an NVMe disk, pass e.g.::
Bin Mengddec5e92019-07-18 00:34:15 -070081
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030082 -drive if=none,file=disk.img,id=mydisk -device nvme,drive=mydisk,serial=foo
83
Heinrich Schuchardt06c09652021-11-28 11:50:58 +010084- To add a random number generator, pass e.g.::
85
86 -device virtio-rng-pci
87
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030088These 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 +020089
Ilias Apalodimasbcc9bca2021-11-09 09:02:21 +020090Enabling TPMv2 support
91----------------------
92
93To emulate a TPM the swtpm package may be used. It can be built from the
94following repositories:
95
96 https://github.com/stefanberger/swtpm.git
97
98Swtpm provides a socket for the TPM emulation which can be consumed by QEMU.
99
100In a first console invoke swtpm with::
101
102 swtpm socket --tpmstate dir=/tmp/mytpm1 \
103 --ctrl type=unixio,path=/tmp/mytpm1/swtpm-sock --log level=20
104
105In a second console invoke qemu-system-aarch64 with::
106
107 -chardev socket,id=chrtpm,path=/tmp/mytpm1/swtpm-sock \
108 -tpmdev emulator,id=tpm0,chardev=chrtpm \
109 -device tpm-tis-device,tpmdev=tpm0
110
111Enable the TPM on U-Boot's command line with::
112
113 tpm2 startup TPM2_SU_CLEAR
114
Heinrich Schuchardtd4a7fc12020-09-16 00:17:55 +0200115Debug UART
116----------
117
118The debug UART on the ARM virt board uses these settings::
119
120 CONFIG_DEBUG_UART=y
121 CONFIG_DEBUG_UART_PL010=y
122 CONFIG_DEBUG_UART_BASE=0x9000000
123 CONFIG_DEBUG_UART_CLOCK=0