Bin Meng | ddec5e9 | 2019-07-18 00:34:15 -0700 | [diff] [blame] | 1 | .. SPDX-License-Identifier: GPL-2.0+ |
| 2 | .. Copyright (C) 2017, Tuomas Tynkkynen <tuomas.tynkkynen@iki.fi> |
Tuomas Tynkkynen | a1c2178 | 2017-10-09 19:42:41 +0300 | [diff] [blame] | 3 | |
Bin Meng | ddec5e9 | 2019-07-18 00:34:15 -0700 | [diff] [blame] | 4 | QEMU ARM |
| 5 | ======== |
Tuomas Tynkkynen | a1c2178 | 2017-10-09 19:42:41 +0300 | [diff] [blame] | 6 | |
| 7 | QEMU for ARM supports a special 'virt' machine designed for emulation and |
| 8 | virtualization purposes. This document describes how to run U-Boot under it. |
Tuomas Tynkkynen | 87145cf | 2018-01-11 16:11:24 +0200 | [diff] [blame] | 9 | Both 32-bit ARM and AArch64 are supported. |
Tuomas Tynkkynen | a1c2178 | 2017-10-09 19:42:41 +0300 | [diff] [blame] | 10 | |
| 11 | The '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 Tynkkynen | 87145cf | 2018-01-11 16:11:24 +0200 | [diff] [blame] | 18 | - An ARMv7/ARMv8 architected timer |
Tuomas Tynkkynen | a1c2178 | 2017-10-09 19:42:41 +0300 | [diff] [blame] | 19 | - PSCI for rebooting the system |
| 20 | - A generic ECAM-based PCI host controller, discoverable via the DTB |
| 21 | |
| 22 | Additionally, a number of optional peripherals can be added to the PCI bus. |
| 23 | |
Simon Glass | eb28494 | 2021-12-16 20:59:09 -0700 | [diff] [blame] | 24 | See :doc:`../../develop/devicetree/dt_qemu` for information on how to see |
| 25 | the devicetree actually generated by QEMU. |
| 26 | |
Tuomas Tynkkynen | a1c2178 | 2017-10-09 19:42:41 +0300 | [diff] [blame] | 27 | Building U-Boot |
| 28 | --------------- |
Tuomas Tynkkynen | 87145cf | 2018-01-11 16:11:24 +0200 | [diff] [blame] | 29 | Set the CROSS_COMPILE environment variable as usual, and run: |
Tuomas Tynkkynen | a1c2178 | 2017-10-09 19:42:41 +0300 | [diff] [blame] | 30 | |
Bin Meng | ddec5e9 | 2019-07-18 00:34:15 -0700 | [diff] [blame] | 31 | - For ARM:: |
| 32 | |
Tuomas Tynkkynen | a1c2178 | 2017-10-09 19:42:41 +0300 | [diff] [blame] | 33 | make qemu_arm_defconfig |
| 34 | make |
| 35 | |
Bin Meng | ddec5e9 | 2019-07-18 00:34:15 -0700 | [diff] [blame] | 36 | - For AArch64:: |
| 37 | |
Tuomas Tynkkynen | 87145cf | 2018-01-11 16:11:24 +0200 | [diff] [blame] | 38 | make qemu_arm64_defconfig |
| 39 | make |
| 40 | |
Tuomas Tynkkynen | a1c2178 | 2017-10-09 19:42:41 +0300 | [diff] [blame] | 41 | Running U-Boot |
| 42 | -------------- |
| 43 | The minimal QEMU command line to get U-Boot up and running is: |
| 44 | |
Bin Meng | ddec5e9 | 2019-07-18 00:34:15 -0700 | [diff] [blame] | 45 | - For ARM:: |
| 46 | |
Simon Glass | f188b75 | 2021-12-16 20:59:08 -0700 | [diff] [blame] | 47 | qemu-system-arm -machine virt -nographic -bios u-boot.bin |
Tuomas Tynkkynen | a1c2178 | 2017-10-09 19:42:41 +0300 | [diff] [blame] | 48 | |
Bin Meng | ddec5e9 | 2019-07-18 00:34:15 -0700 | [diff] [blame] | 49 | - For AArch64:: |
| 50 | |
Simon Glass | f188b75 | 2021-12-16 20:59:08 -0700 | [diff] [blame] | 51 | qemu-system-aarch64 -machine virt -nographic -cpu cortex-a57 -bios u-boot.bin |
Tuomas Tynkkynen | 87145cf | 2018-01-11 16:11:24 +0200 | [diff] [blame] | 52 | |
Tuomas Tynkkynen | 9cd7ac9 | 2018-05-14 18:47:52 +0300 | [diff] [blame] | 53 | Note that for some odd reason qemu-system-aarch64 needs to be explicitly |
Simon Glass | f188b75 | 2021-12-16 20:59:08 -0700 | [diff] [blame] | 54 | told to use a 64-bit CPU or it will boot in 32-bit mode. The -nographic argument |
| 55 | ensures that output appears on the terminal. Use Ctrl-A X to quit. |
Tuomas Tynkkynen | a1c2178 | 2017-10-09 19:42:41 +0300 | [diff] [blame] | 56 | |
Michal Simek | 50fa118 | 2023-05-17 09:17:16 +0200 | [diff] [blame] | 57 | Additional persistent U-Boot environment support can be added as follows: |
Bin Meng | ddec5e9 | 2019-07-18 00:34:15 -0700 | [diff] [blame] | 58 | |
| 59 | - Create envstore.img using qemu-img:: |
| 60 | |
Sumit Garg | 9b614ea | 2018-11-26 16:50:17 +0530 | [diff] [blame] | 61 | qemu-img create -f raw envstore.img 64M |
Bin Meng | ddec5e9 | 2019-07-18 00:34:15 -0700 | [diff] [blame] | 62 | |
| 63 | - Add a pflash drive parameter to the command line:: |
| 64 | |
Sumit Garg | 9b614ea | 2018-11-26 16:50:17 +0530 | [diff] [blame] | 65 | -drive if=pflash,format=raw,index=1,file=envstore.img |
| 66 | |
Tuomas Tynkkynen | a1c2178 | 2017-10-09 19:42:41 +0300 | [diff] [blame] | 67 | Additional peripherals that have been tested to work in both U-Boot and Linux |
| 68 | can be enabled with the following command line parameters: |
| 69 | |
Bin Meng | ddec5e9 | 2019-07-18 00:34:15 -0700 | [diff] [blame] | 70 | - To add a Serial ATA disk via an Intel ICH9 AHCI controller, pass e.g.:: |
| 71 | |
Heinrich Schuchardt | 06c0965 | 2021-11-28 11:50:58 +0100 | [diff] [blame] | 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 |
Bin Meng | ddec5e9 | 2019-07-18 00:34:15 -0700 | [diff] [blame] | 74 | |
| 75 | - To add an Intel E1000 network adapter, pass e.g.:: |
| 76 | |
Tuomas Tynkkynen | a1c2178 | 2017-10-09 19:42:41 +0300 | [diff] [blame] | 77 | -netdev user,id=net0 -device e1000,netdev=net0 |
Bin Meng | ddec5e9 | 2019-07-18 00:34:15 -0700 | [diff] [blame] | 78 | |
| 79 | - To add an EHCI-compliant USB host controller, pass e.g.:: |
| 80 | |
Tuomas Tynkkynen | a1c2178 | 2017-10-09 19:42:41 +0300 | [diff] [blame] | 81 | -device usb-ehci,id=ehci |
Bin Meng | ddec5e9 | 2019-07-18 00:34:15 -0700 | [diff] [blame] | 82 | |
Heinrich Schuchardt | 06c0965 | 2021-11-28 11:50:58 +0100 | [diff] [blame] | 83 | - To add an NVMe disk, pass e.g.:: |
Bin Meng | ddec5e9 | 2019-07-18 00:34:15 -0700 | [diff] [blame] | 84 | |
Tuomas Tynkkynen | a1c2178 | 2017-10-09 19:42:41 +0300 | [diff] [blame] | 85 | -drive if=none,file=disk.img,id=mydisk -device nvme,drive=mydisk,serial=foo |
| 86 | |
Heinrich Schuchardt | 06c0965 | 2021-11-28 11:50:58 +0100 | [diff] [blame] | 87 | - To add a random number generator, pass e.g.:: |
| 88 | |
| 89 | -device virtio-rng-pci |
| 90 | |
Tuomas Tynkkynen | a1c2178 | 2017-10-09 19:42:41 +0300 | [diff] [blame] | 91 | These have been tested in QEMU 2.9.0 but should work in at least 2.5.0 as well. |
Heinrich Schuchardt | d4a7fc1 | 2020-09-16 00:17:55 +0200 | [diff] [blame] | 92 | |
Ilias Apalodimas | bcc9bca | 2021-11-09 09:02:21 +0200 | [diff] [blame] | 93 | Enabling TPMv2 support |
| 94 | ---------------------- |
| 95 | |
| 96 | To emulate a TPM the swtpm package may be used. It can be built from the |
| 97 | following repositories: |
| 98 | |
| 99 | https://github.com/stefanberger/swtpm.git |
| 100 | |
| 101 | Swtpm provides a socket for the TPM emulation which can be consumed by QEMU. |
| 102 | |
| 103 | In 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 | |
| 108 | In 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 | |
| 114 | Enable the TPM on U-Boot's command line with:: |
| 115 | |
| 116 | tpm2 startup TPM2_SU_CLEAR |
| 117 | |
Heinrich Schuchardt | d4a7fc1 | 2020-09-16 00:17:55 +0200 | [diff] [blame] | 118 | Debug UART |
| 119 | ---------- |
| 120 | |
| 121 | The 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 |