Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

vm_minimal: add zcu102 support #46

Merged
merged 1 commit into from
Jan 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ Currently the supported platforms include:
* TX1
* TX2
* QEMU ARM virt machine
* ZCU102
* x86
* x86_64 (coming)

Expand All @@ -29,7 +30,8 @@ cd build
../init-build.sh -DCAMKES_VM_APP=vm_minimal -DPLATFORM=tk1
ninja
```
*Note: To buid for another platform you can substitute the value of the `-DPLATFORM` variable e.g. (exynos5422, tx1, tx2, qemu-arm-virt)*
*Note: To buid for another platform you can substitute the value of the `-DPLATFORM` variable
e.g. (exynos5422, tx1, tx2, qemu-arm-virt, zcu102)*
*Note: If building for x86 you don't need to specify the `-DPLATFORM` variable*

### For Arm
Expand Down Expand Up @@ -98,12 +100,13 @@ See the below feature matrix for the various features the CAmkES ARM VMM impleme
| TK1 | 32-bit | Unsupported | Unsupported | Unsupported | Unsupported | Unsupported | Unsupported | SMP configurations are unsupported due to: * No TK1 kernel SMP support * No virtual power device interface to manage VCPU's at runtime (e.g. core startup) Virtio PCI, Console, Net, Cross VM connector support & Multi-VM are untested |
| TX1 | 64-bit | Supported | Unsupported | Unsupported | Unsupported | Unsupported | Unsupported | Virtio PCI, Console, Net, Cross VM connector support & Multi-VM are untested |
| TX2 | 64-bit | Supported | Supported | Supported | Supported | Supported | Unsupported | Cross VM connector support is untested |
| ZCU102 | 64-bit | Supported | Supported | Supported | Supported | Supported | Unsupported | Cross VM connector support is untested |
| QEMU Virt | 64-bit | Supported | Unsupported | Supported | Supported | Supported | Supported | Multi-VM support depends on porting the TimeServer to QEMU (See https://github.com/sel4/global-components/tree/master/components/TimeServer) |


## Arm Platform Configuration Notes

### Exynos5422, TX1, TX2, QEMU ARM Virt configuration
### Exynos5422, TX1, TX2, ZCU102, QEMU ARM Virt configuration
We provide a pre-built Linux image and Buildroot image for our guest VM's. See the images in the `camkes-vm-images` repository @ https://github.com/sel4/camkes-vm-images
When compiling an application for these platforms, the images are sourced from the platforms subdirectory in the `camkes-vm-images` repo.
Feel free also to compile your own Linux and Rootfs images, see the README's in each platform subdirectory (within `camkes-vm-images`) for information about our
Expand Down
40 changes: 33 additions & 7 deletions apps/Arm/vm_minimal/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ project(camkes-arm-tk1-vm C)

include(${CAMKES_ARM_VM_HELPERS_PATH})

set(cpp_includes "${CAMKES_VM_DIR}/components/VM_Arm")

# Create our CPP Flags based on ARM VM config variables
if("${KernelARMPlatform}" STREQUAL "tk1")
set(cpp_flags "-DKERNELARMPLATFORM_TK1")
Expand Down Expand Up @@ -128,6 +130,36 @@ elseif("${KernelARMPlatform}" STREQUAL "odroidc2")
output_dtb_location
)
AddToFileServer("linux-dtb" "${output_dtb_location}" DEPENDS dtb_gen_target)

elseif("${KernelARMPlatform}" STREQUAL "zcu102")

if("${VmZynqmpPetalinuxVersion}" STREQUAL "")
message(
FATAL_ERROR
"VmZynqmpPetalinuxVersion is not set. Please set to include proper VM artifacts"
)
endif()

AddToFileServer("linux" "${CAMKES_VM_IMAGES_DIR}/zynqmp/${VmZynqmpPetalinuxVersion}/linux")
axel-h marked this conversation as resolved.
Show resolved Hide resolved
AddToFileServer(
"linux-initrd"
"${CAMKES_VM_IMAGES_DIR}/zynqmp/${VmZynqmpPetalinuxVersion}/rootfs-minimal.cpio.gz"
)

set(dts_file "${CAMKES_VM_IMAGES_DIR}/zynqmp/${VmZynqmpPetalinuxVersion}/linux.dts")

add_custom_command(
OUTPUT linux/linux-dtb
COMMAND bash -c "which dtc && dtc -q -I dts -O dtb ${dts_file} > linux/linux-dtb"
VERBATIM
DEPENDS ${dts_file}
)

# Create custom target for setting the dtb
add_custom_target(set_dtb DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/linux/linux-dtb")
AddToFileServer("linux-dtb" "${CMAKE_CURRENT_BINARY_DIR}/linux/linux-dtb" DEPENDS set_dtb)

list(APPEND cpp_includes "${CAMKES_VM_DIR}/components/VM_Arm/plat_include/zynqmp")
endif()

AddCamkesCPPFlag(cpp_flags CONFIG_VARS VmEmmc2NoDMA VmVUSB Tk1DeviceFwd Tk1Insecure)
Expand All @@ -137,10 +169,4 @@ DefineCAmkESVMFileServer()
CAmkESAddImportPath(${KernelARMPlatform})

# Declare root server
DeclareCAmkESRootserver(
vm_minimal.camkes
CPP_FLAGS
${cpp_flags}
CPP_INCLUDES
${CAMKES_VM_DIR}/components/VM_Arm
)
DeclareCAmkESRootserver(vm_minimal.camkes CPP_FLAGS ${cpp_flags} CPP_INCLUDES ${cpp_includes})
7 changes: 6 additions & 1 deletion apps/Arm/vm_minimal/settings.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# SPDX-License-Identifier: BSD-2-Clause
#

set(supported "tk1;tx1;tx2;exynos5422;qemu-arm-virt;odroidc2")
set(supported "tk1;tx1;tx2;exynos5422;qemu-arm-virt;odroidc2;zcu102")
if(NOT "${PLATFORM}" IN_LIST supported)
message(FATAL_ERROR "PLATFORM: ${PLATFORM} not supported.
Supported: ${supported}")
Expand Down Expand Up @@ -36,3 +36,8 @@ if(${PLATFORM} STREQUAL "qemu-arm-virt")
set(KernelArmCPU cortex-a53 CACHE STRING "" FORCE)
set(VmInitRdFile ON CACHE BOOL "" FORCE)
endif()
if(${PLATFORM} STREQUAL "zcu102")
set(AARCH64 ON CACHE BOOL "" FORCE)
set(KernelAllowSMCCalls ON CACHE BOOL "" FORCE)
set(VmZynqmpPetalinuxVersion 2021_1 CACHE STRING "" FORCE)
endif()
134 changes: 134 additions & 0 deletions apps/Arm/vm_minimal/zcu102/devices.camkes
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
/*
* Copyright 2023, DornerWorks
*
* SPDX-License-Identifier: BSD-2-Clause
*/

#include <plat/smc.h>
#include <configurations/vm.h>

#define VM_INITRD_MAX_SIZE 0x1900000 //25 MB
#define VM_RAM_BASE 0x10000000
#define VM_RAM_SIZE 0x10000000
#define VM_ENTRY_ADDR 0x10080000
#define VM_RAM_OFFSET 0
#define VM_DTB_ADDR 0x12000000
#define VM_INITRD_ADDR 0x13000000

assembly {
composition {}
configuration {

vm0.vm_address_config = {
"ram_base" : VAR_STRINGIZE(VM_RAM_BASE),
"ram_paddr_base" : VAR_STRINGIZE(VM_RAM_BASE),
"ram_size" : VAR_STRINGIZE(VM_RAM_SIZE),
"dtb_addr" : VAR_STRINGIZE(VM_DTB_ADDR),
"initrd_addr" : VAR_STRINGIZE(VM_INITRD_ADDR),
"kernel_entry_addr" : VAR_STRINGIZE(VM_ENTRY_ADDR),
};
vm0.num_vcpus = 4;

/* Extra untyped pool to allow for 256MB of RAM */
vm0.simple_untyped28_pool = 1;

vm0.vm_image_config = {
"kernel_name" : "linux",
"initrd_name" : "linux-initrd",
"dtb_base_name" : "linux-dtb",
"kernel_bootcmdline" : "console=ttyPS0,115200 root=/dev/ram rw earlycon clk_ignore_unused",
"kernel_stdout" : "serial0:115200n8",
"generate_dtb" : true,
"provide_dtb" : false,
"map_one_to_one" : false,
"provide_initrd": true,
"clean_cache" : false,
};

vm0.dtb = dtb([{"path": "/amba/serial@ff000000"} ]);

vm0.untyped_mmios = ["0xf9060000:12"]; // Interrupt Controller Virtual CPU interface (Virtual Machine view)

vm0.plat_keep_devices = [
"/__symbols__",
"/aliases",
"/aux_ref_clk",
"/axi/interrupt-controller@f9010000",
"/dcc",
"/dp_aclk",
"/edac",
"/fclk0",
"/fclk1",
"/fclk2",
"/fclk3",
"/fpga-full",
"/gt_crx_ref_clk",
"/ina226-u15",
"/ina226-u16",
"/ina226-u65",
"/ina226-u74",
"/ina226-u75",
"/ina226-u76",
"/ina226-u77",
"/ina226-u78",
"/ina226-u79",
"/ina226-u80",
"/ina226-u81",
"/ina226-u84",
"/ina226-u85",
"/ina226-u86",
"/ina226-u87",
"/ina226-u88",
"/ina226-u92",
"/ina226-u93",
"/pmu",
"/psci",
"/pss_alt_ref_clk",
"/pss_ref_clk",
"/ref48M",
"/refhdmi",
"/timer",
"/video_clk",
"/axi/serial@ff000000",
];

vm0.plat_keep_devices_and_subtree = [
"/firmware",
"/gpio-keys",
"/leds",
"/zynqmp_ipi",
];

vm0.allow_smc = true;
vm0.allowed_smc_functions = [
SMC_PM_GET_API_VERSION,
SMC_PM_REQUEST_NODE,
SMC_PM_RELEASE_NODE,
SMC_PM_SET_REQUIREMENT,
SMC_PM_INIT_FINALIZE,
SMC_PM_FPGA_GET_STATUS,
SMC_PM_RESET_ASSERT,
SMC_PM_RESET_GET_STATUS,
SMC_PM_MMIO_WRITE,
SMC_PM_MMIO_READ,
SMC_PM_GET_CHIPID,
SMC_PM_PINCTRL_REQUEST,
SMC_PM_PINCTRL_RELEASE,
SMC_PM_PINCTRL_SET_FUNCTION,
SMC_PM_PINCTRL_CONFIG_PARAM_GET,
SMC_PM_PINCTRL_CONFIG_PARAM_SET,
SMC_PM_IOCTL,
SMC_PM_QUERY_DATA,
SMC_PM_CLOCK_ENABLE,
SMC_PM_CLOCK_DISABLE,
SMC_PM_CLOCK_GETSTATE,
SMC_PM_CLOCK_SETDIVIDER,
SMC_PM_CLOCK_GETDIVIDER,
SMC_PM_CLOCK_GETPARENT,
SMC_PM_GET_TRUSTZONE_VERSION,
SMC_IPI_MAILBOX_OPEN,
SMC_IPI_MAILBOX_RELEASE,
SMC_IPI_MAILBOX_ENABLE_IRQ
];
}
}