blob: 7c24e29410046f5a5d366553d46bab1202269c78 [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
Tuomas Tynkkynen9cd7ac92018-05-14 18:47:52 +030044 qemu-system-arm -machine virt -bios u-boot.bin
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030045
Bin Mengddec5e92019-07-18 00:34:15 -070046- For AArch64::
47
Tuomas Tynkkynen9cd7ac92018-05-14 18:47:52 +030048 qemu-system-aarch64 -machine virt -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
Tuomas Tynkkynen87145cf2018-01-11 16:11:24 +020051told to use a 64-bit CPU or it will boot in 32-bit mode.
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030052
Sumit Garg9b614ea2018-11-26 16:50:17 +053053Additional persistent U-boot environment support can be added as follows:
Bin Mengddec5e92019-07-18 00:34:15 -070054
55- Create envstore.img using qemu-img::
56
Sumit Garg9b614ea2018-11-26 16:50:17 +053057 qemu-img create -f raw envstore.img 64M
Bin Mengddec5e92019-07-18 00:34:15 -070058
59- Add a pflash drive parameter to the command line::
60
Sumit Garg9b614ea2018-11-26 16:50:17 +053061 -drive if=pflash,format=raw,index=1,file=envstore.img
62
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030063Additional peripherals that have been tested to work in both U-Boot and Linux
64can be enabled with the following command line parameters:
65
Bin Mengddec5e92019-07-18 00:34:15 -070066- To add a Serial ATA disk via an Intel ICH9 AHCI controller, pass e.g.::
67
Heinrich Schuchardt06c09652021-11-28 11:50:58 +010068 -drive if=none,file=disk.img,format=raw,id=mydisk \
69 -device ich9-ahci,id=ahci -device ide-drive,drive=mydisk,bus=ahci.0
Bin Mengddec5e92019-07-18 00:34:15 -070070
71- To add an Intel E1000 network adapter, pass e.g.::
72
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030073 -netdev user,id=net0 -device e1000,netdev=net0
Bin Mengddec5e92019-07-18 00:34:15 -070074
75- To add an EHCI-compliant USB host controller, pass e.g.::
76
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030077 -device usb-ehci,id=ehci
Bin Mengddec5e92019-07-18 00:34:15 -070078
Heinrich Schuchardt06c09652021-11-28 11:50:58 +010079- To add an NVMe disk, pass e.g.::
Bin Mengddec5e92019-07-18 00:34:15 -070080
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030081 -drive if=none,file=disk.img,id=mydisk -device nvme,drive=mydisk,serial=foo
82
Heinrich Schuchardt06c09652021-11-28 11:50:58 +010083- To add a random number generator, pass e.g.::
84
85 -device virtio-rng-pci
86
Tuomas Tynkkynena1c21782017-10-09 19:42:41 +030087These 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 +020088
Ilias Apalodimasbcc9bca2021-11-09 09:02:21 +020089Enabling TPMv2 support
90----------------------
91
92To emulate a TPM the swtpm package may be used. It can be built from the
93following repositories:
94
95 https://github.com/stefanberger/swtpm.git
96
97Swtpm provides a socket for the TPM emulation which can be consumed by QEMU.
98
99In a first console invoke swtpm with::
100
101 swtpm socket --tpmstate dir=/tmp/mytpm1 \
102 --ctrl type=unixio,path=/tmp/mytpm1/swtpm-sock --log level=20
103
104In a second console invoke qemu-system-aarch64 with::
105
106 -chardev socket,id=chrtpm,path=/tmp/mytpm1/swtpm-sock \
107 -tpmdev emulator,id=tpm0,chardev=chrtpm \
108 -device tpm-tis-device,tpmdev=tpm0
109
110Enable the TPM on U-Boot's command line with::
111
112 tpm2 startup TPM2_SU_CLEAR
113
Heinrich Schuchardtd4a7fc12020-09-16 00:17:55 +0200114Debug UART
115----------
116
117The debug UART on the ARM virt board uses these settings::
118
119 CONFIG_DEBUG_UART=y
120 CONFIG_DEBUG_UART_PL010=y
121 CONFIG_DEBUG_UART_BASE=0x9000000
122 CONFIG_DEBUG_UART_CLOCK=0