265 lines
11 KiB
Markdown
265 lines
11 KiB
Markdown
Armv8-R AArch64 AEM FVP Support in meta-arm-bsp
|
||
===============================================
|
||
|
||
Overview
|
||
--------
|
||
|
||
Fixed Virtual Platforms (FVP) are complete simulations of an Arm system,
|
||
including processor, memory and peripherals. These are set out in a
|
||
"programmer's view", which gives you a comprehensive model on which to build
|
||
and test your software.
|
||
|
||
The Armv8-R AEM FVP is a free of charge Armv8-R Fixed Virtual Platform. It
|
||
supports the latest Armv8-R feature set.
|
||
|
||
This BSP implements a reference stack for the AArch64 support in the R-class
|
||
first announced with the Cortex-R82 processor:
|
||
https://developer.arm.com/ip-products/processors/cortex-r/cortex-r82
|
||
|
||
Fast Models Fixed Virtual Platforms (FVP) Reference Guide:
|
||
https://developer.arm.com/docs/100966/latest
|
||
|
||
|
||
BSP Support
|
||
-----------
|
||
|
||
The fvp-baser-aemv8r64 Yocto MACHINE supports the following BSP components,
|
||
where either a standard or Real-Time Linux kernel (PREEMPT\_RT) can be built
|
||
and run:
|
||
|
||
- FVP_Base_AEMv8R: v11.20.15
|
||
- boot-wrapper-aarch64: provides PSCI support
|
||
- U-Boot: v2022.07 - provides UEFI services
|
||
- Linux kernel: linux-yocto-5.15
|
||
- Linux kernel with PREEMPT\_RT support: linux-yocto-rt-5.15
|
||
|
||
Note that the Real-Time Linux kernel (PREEMPT\_RT) does not use the real-time
|
||
architectural extensions of the Armv8-R feature set.
|
||
|
||
High-Level Architecture
|
||
-----------------------
|
||
|
||
The diagram below shows the current boot flow:
|
||
|
||
+---------------------------------------------------------------+
|
||
| Linux kernel |
|
||
+---------------------------------------------------------------+
|
||
/|\ /|\
|
||
| |
|
||
| UEFI services |
|
||
| PSCI services |
|
||
\|/ |
|
||
+----------------+ | S-EL1
|
||
----| U-Boot |------------------------------|-----------
|
||
+----------------+ | S-EL2
|
||
/|\ |
|
||
| |
|
||
| |
|
||
| |
|
||
+--------------------------------------------------\|/----------+
|
||
| +----------------+ +----------------+ |
|
||
| boot-wrapper-aarch64 | Device tree | | PSCI handler | |
|
||
| +----------------+ +----------------+ |
|
||
+---------------------------------------------------------------+
|
||
|
||
|
||
The firmware binary (generated as `linux-system.axf`) includes
|
||
boot-wrapper-aarch64, the flattened device tree and U-Boot. U-Boot is configured
|
||
to automatically detect a virtio block device and boot the UEFI payload at the
|
||
path `/efi/boot/bootaa64.efi`. Using the standard build, the first partition
|
||
contains a Grub image at this path, which boots the Linux kernel at `/Image` on
|
||
the same partition. The second partition of the image contains the Linux root
|
||
file system.
|
||
|
||
There is no EL3 or non-secure world in the Armv8-R AArch64 architecture, so the
|
||
reset vector starts boot-wrapper-aarch64 at S-EL2. Boot-wrapper-aarch64 is
|
||
compiled with the `--enable-keep-el` flag, which causes it to boot U-Boot at
|
||
S-EL2 too. U-Boot is compiled with the `CONFIG_ARMV8_SWITCH_TO_EL1` flag, which
|
||
causes it to switch to S-EL1 before booting Linux.
|
||
|
||
The bundled device tree is passed to U-Boot via register x0. U-Boot passes the
|
||
same device tree to Linux via the UEFI system table.
|
||
|
||
Power state management is provided by PSCI services in boot-wrapper-aarch64.
|
||
Linux accesses the PSCI handler via HVC calls to S-EL2. U-Boot has been patched
|
||
to prevent it from overriding the exception vector at S-EL2. The PSCI handler
|
||
memory region is added to a `/memreserve/` node in the device tree.
|
||
|
||
Please note that the final firmware architecture for the fvp-baser-aemv8r64 is
|
||
not yet stabilized. The patches in this layer are provided for development and
|
||
evaluation purposes only, and should not be used in production firmware.
|
||
|
||
Quick start: Howto Build and Run
|
||
--------------------------------
|
||
|
||
### Host environment setup
|
||
The following instructions have been tested on hosts running Ubuntu 18.04 and
|
||
Ubuntu 20.04.
|
||
Install the required packages for the build host:
|
||
https://docs.yoctoproject.org/singleindex.html#required-packages-for-the-build-host
|
||
|
||
Kas is a setup tool for bitbake based projects. The minimal supported version
|
||
is 3.0, install it like so:
|
||
|
||
pip3 install --user --upgrade kas
|
||
|
||
For more details on kas, see https://kas.readthedocs.io/.
|
||
|
||
To build the images for the fvp-baser-aemv8r64 machine, you also need to accept
|
||
the EULA at
|
||
https://developer.arm.com/downloads/-/arm-ecosystem-fvps/eula
|
||
by setting the following environment variable:
|
||
|
||
ARM_FVP_EULA_ACCEPT="True"
|
||
|
||
**Note:** The host machine should have at least 50 GBytes of free disk space
|
||
for the next steps to work correctly.
|
||
|
||
### Fetch sources
|
||
To fetch and build the ongoing development of the software stack follow the
|
||
instructions on this document.
|
||
|
||
To fetch and build the version 1 (single core) find instructions at https://community.arm.com/developer/tools-software/oss-platforms/w/docs/633/release-1-single-core
|
||
|
||
To fetch and build the version 2 (linux smp) find instructions at https://community.arm.com/developer/tools-software/oss-platforms/w/docs/634/release-2---smp
|
||
|
||
Fetch the meta-arm repository into a build directory:
|
||
|
||
mkdir -p ~/fvp-baser-aemv8r64-build
|
||
cd ~/fvp-baser-aemv8r64-build
|
||
git clone https://git.yoctoproject.org/git/meta-arm
|
||
|
||
|
||
### Build
|
||
Building with the standard Linux kernel:
|
||
|
||
cd ~/fvp-baser-aemv8r64-build
|
||
export ARM_FVP_EULA_ACCEPT="True"
|
||
kas build meta-arm/kas/fvp-baser-aemv8r64-bsp.yml
|
||
|
||
Building with the Real-Time Linux kernel (PREEMPT\_RT):
|
||
|
||
cd ~/fvp-baser-aemv8r64-build
|
||
export ARM_FVP_EULA_ACCEPT="True"
|
||
kas build meta-arm/kas/fvp-baser-aemv8r64-rt-bsp.yml
|
||
|
||
### Run
|
||
To run an image after the build is done with the standard Linux kernel:
|
||
|
||
kas shell --keep-config-unchanged \
|
||
meta-arm/kas/fvp-baser-aemv8r64-bsp.yml \
|
||
--command "../layers/meta-arm/scripts/runfvp \
|
||
--console "
|
||
|
||
To run an image after the build is done with the Real-Time Linux kernel
|
||
(PREEMPT\_RT):
|
||
|
||
kas shell --keep-config-unchanged \
|
||
meta-arm/kas/fvp-baser-aemv8r64-rt-bsp.yml \
|
||
--command "../layers/meta-arm/scripts/runfvp \
|
||
--console "
|
||
|
||
**Note:** The terminal console login is `root` without password.
|
||
|
||
To finish the fvp emulation, you need to close the telnet session:
|
||
|
||
- Escape to telnet console with ``ctrl+]``.
|
||
- Run ``quit`` to close the session.
|
||
|
||
### Networking
|
||
The FVP is configured by default to use "user-mode networking", which simulates
|
||
an IP router and DHCP server to avoid additional host dependencies and
|
||
networking configuration. Outbound connections work automatically, e.g. by
|
||
running:
|
||
|
||
wget www.arm.com
|
||
|
||
Inbound connections require an explicit port mapping from the host. By default,
|
||
port 8022 on the host is mapped to port 22 on the FVP, so that the following
|
||
command will connect to an ssh server running on the FVP:
|
||
|
||
ssh root@localhost -p 8022
|
||
|
||
Note that user-mode networking does not support ICMP, so `ping` will not work.
|
||
For more information about user-mode networking, please see
|
||
https://developer.arm.com/documentation/100964/1117/Introduction-to-Fast-Models/User-mode-networking?lang=en
|
||
|
||
### File sharing between host and fvp
|
||
It is possible to share a directory between the host machine and the fvp using
|
||
the virtio P9 device component included in the kernel. To do so, create a
|
||
directory to be mounted from the host machine:
|
||
|
||
mkdir /path/to/host-mount-dir
|
||
|
||
Then, add the following parameter containing the path to the directory when
|
||
launching the model:
|
||
|
||
--parameter 'bp.virtiop9device.root_path=/path/to/host-mount-dir'
|
||
|
||
e.g. for the standard Linux kernel:
|
||
|
||
kas shell --keep-config-unchanged \
|
||
meta-arm/kas/fvp-baser-aemv8r64-bsp.yml \
|
||
--command "../layers/meta-arm/scripts/runfvp \
|
||
--console -- --parameter \
|
||
'bp.virtiop9device.root_path=/path/to/host-mount-dir'"
|
||
|
||
Once you are logged into the fvp, the host directory can be mounted in a
|
||
directory on the model using the following command:
|
||
|
||
mount -t 9p -o trans=virtio,version=9p2000.L FM /path/to/fvp-mount-dir
|
||
|
||
Devices supported in the kernel
|
||
-------------------------------
|
||
|
||
- serial
|
||
- virtio 9p
|
||
- virtio disk
|
||
- virtio network
|
||
- virtio rng
|
||
- watchdog
|
||
- rtc
|
||
|
||
Known Issues and Limitations
|
||
----------------------------
|
||
|
||
- Only PSCI CPU\_ON and CPU\_OFF functions are supported
|
||
- Linux kernel does not support booting from secure EL2 on Armv8-R AArch64
|
||
- Linux KVM does not support Armv8-R AArch64
|
||
- Device DMA memory cache-coherence issue: the FVP `cache_state_modelled`
|
||
parameter will affect the cache coherence behavior of peripherals’ DMA. When
|
||
users set `cache_state_modelled=1`, they also have to set
|
||
`cci400.force_on_from_start=1` to force the FVP to enable snooping on upstream
|
||
ports.
|
||
|
||
Change Log
|
||
----------
|
||
- Enabled the ability for U-Boot to apply device tree overlays
|
||
- Fixed bug in U-Boot that caused changes to the `memory` node in the device
|
||
tree to be ignored.
|
||
- Added boot-wrapper-aarch64 support for booting SMP payloads at S-EL2.
|
||
- Enabled testimage support by default.
|
||
- Added virtio\_rng to improve random number generation.
|
||
- Added U-Boot v2022.01 for UEFI support.
|
||
- Updated Linux kernel version from 5.14 to 5.15 for both standard and
|
||
Real-Time (PREEMPT\_RT) builds.
|
||
- Updated boot-wrapper-aarch64 revision and added support for booting U-Boot.
|
||
- Included boot-wrapper-aarch64 PSCI services in `/memreserve/` region.
|
||
- Fixed the counter frequency initialization in boot-wrapper-aarch64.
|
||
- Configured the FVP to use the default RAM size of 4 Gb
|
||
- Fixed PL011 and SP805 register sizes in the device tree.
|
||
- Added virtio\_net User Networking mode by default and removed instructions
|
||
about tap networking setup.
|
||
- Updated Linux kernel version from 5.10 to 5.14 for both standard and
|
||
Real-Time (PREEMPT\_RT) builds.
|
||
- Enabled SMP support via boot-wrapper-aarch64 providing the PSCI CPU\_ON and
|
||
CPU\_OFF functions.
|
||
- Introduced Armv8-R64 compiler flags.
|
||
- Added Linux PREEMPT\_RT support via linux-yocto-rt-5.10.
|
||
- Added support for file sharing with the host machine using Virtio P9.
|
||
- Added support for runfvp.
|
||
- Added performance event support (PMU) in the Linux device tree.
|
||
- Introduced the fvp-baser-aemv8r64 machine and its BSP composed of
|
||
boot-wrapper-aarch64 and linux-yocto-5.10 supporting serial, virtio disk,
|
||
virtio network, watchdog and rtc.
|