1.. SPDX-License-Identifier: GPL-2.0+
2.. Copyright (C) 2017, Tuomas Tynkkynen <tuomas.tynkkynen@iki.fi>
3
4QEMU ARM
5========
6
7QEMU for ARM supports a special 'virt' machine designed for emulation and
8virtualization purposes. This document describes how to run U-Boot under it.
9Both 32-bit ARM and AArch64 are supported.
10
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
18    - An ARMv7/ARMv8 architected timer
19    - 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
24See :doc:`../../develop/devicetree/dt_qemu` for information on how to see
25the devicetree actually generated by QEMU.
26
27Building U-Boot
28---------------
29Set the CROSS_COMPILE environment variable as usual, and run:
30
31- For ARM::
32
33    make qemu_arm_defconfig
34    make
35
36- For AArch64::
37
38    make qemu_arm64_defconfig
39    make
40
41Running U-Boot
42--------------
43The minimal QEMU command line to get U-Boot up and running is:
44
45- For ARM::
46
47    qemu-system-arm -machine virt -nographic -bios u-boot.bin
48
49- For AArch64::
50
51    qemu-system-aarch64 -machine virt -nographic -cpu cortex-a57 -bios u-boot.bin
52
53Note that for some odd reason qemu-system-aarch64 needs to be explicitly
54told 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.
56
57Additional persistent U-boot environment support can be added as follows:
58
59- Create envstore.img using qemu-img::
60
61    qemu-img create -f raw envstore.img 64M
62
63- Add a pflash drive parameter to the command line::
64
65    -drive if=pflash,format=raw,index=1,file=envstore.img
66
67Additional peripherals that have been tested to work in both U-Boot and Linux
68can be enabled with the following command line parameters:
69
70- To add a Serial ATA disk via an Intel ICH9 AHCI controller, pass e.g.::
71
72    -drive if=none,file=disk.img,format=raw,id=mydisk \
73    -device ich9-ahci,id=ahci -device ide-drive,drive=mydisk,bus=ahci.0
74
75- To add an Intel E1000 network adapter, pass e.g.::
76
77    -netdev user,id=net0 -device e1000,netdev=net0
78
79- To add an EHCI-compliant USB host controller, pass e.g.::
80
81    -device usb-ehci,id=ehci
82
83- To add an NVMe disk, pass e.g.::
84
85    -drive if=none,file=disk.img,id=mydisk -device nvme,drive=mydisk,serial=foo
86
87- To add a random number generator, pass e.g.::
88
89    -device virtio-rng-pci
90
91These have been tested in QEMU 2.9.0 but should work in at least 2.5.0 as well.
92
93Enabling 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
118Debug 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
127