From 39872b4742c0f3868a9a4b1b16e2be66f0e754a5 Mon Sep 17 00:00:00 2001 From: Jakub Luzny Date: Wed, 12 Aug 2020 12:57:57 +0200 Subject: [PATCH] meta-agl-jailhouse: Add support for RPi4 with 2G/4G/8G of memory The Jailhouse configuration files had to be modified to append the additional memory regions present on the higher mem variants of the RPi4. To avoid the use of mem= kernel parameter to fix the memory that can be used by the root cell, a device tree overlay with reserved-memory nodes is used instead. To avoid conflict with the GPU memory, the memory region used for Jailhouse and the non-root cells was moved from 0x30000000 to 0x20000000. Bug-AGL: SPEC-3507 Signed-off-by: Jakub Luzny Change-Id: Iabd67504c3df0349dd62e45f12d1019de14328f1 --- meta-agl-jailhouse/README.md | 3 +- .../recipes-bsp/bootfiles/rpi-config_git.bbappend | 4 + ...toverlays-Add-jailhouse-memory-DT-overlay.patch | 87 +++++++ .../linux/linux-raspberrypi_%.bbappend | 2 - .../linux/linux-raspberrypi_5.4%.bbappend | 5 + ...64-Add-support-for-RPi4-with-more-than-1G.patch | 290 +++++++++++++++++++++ .../recipes-extended/jailhouse/jailhouse_git.bb | 6 +- templates/feature/agl-jailhouse/50_local.conf.inc | 2 + 8 files changed, 394 insertions(+), 5 deletions(-) create mode 100644 meta-agl-jailhouse/dynamic-layers/raspberrypi/recipes-kernel/linux/linux-raspberrypi/0001-dt-dtoverlays-Add-jailhouse-memory-DT-overlay.patch delete mode 100644 meta-agl-jailhouse/dynamic-layers/raspberrypi/recipes-kernel/linux/linux-raspberrypi_%.bbappend create mode 100644 meta-agl-jailhouse/recipes-extended/jailhouse/jailhouse/0001-configs-arm64-Add-support-for-RPi4-with-more-than-1G.patch diff --git a/meta-agl-jailhouse/README.md b/meta-agl-jailhouse/README.md index fb0a3d42..c4a32bfd 100644 --- a/meta-agl-jailhouse/README.md +++ b/meta-agl-jailhouse/README.md @@ -33,8 +33,7 @@ This layer depends on: ## Supported targets * Raspberry Pi 4 - * Currently only the 1 GB RAM variant. The other ones will work too, - but will be limited to 1 GB of memory. + * All (1G-8G) memory variants. But note that there is 256M reserved for Jailhouse and 256MiB for GPU in AGL, so the smaller variants are not recommended. * QEMU x86-64 * Work in progress. Requires KVM. Nested virtualization must be enabled on the host. Currently, the right configuration of QEMU and Jailhouse to work out-of-box is being worked on. diff --git a/meta-agl-jailhouse/dynamic-layers/raspberrypi/recipes-bsp/bootfiles/rpi-config_git.bbappend b/meta-agl-jailhouse/dynamic-layers/raspberrypi/recipes-bsp/bootfiles/rpi-config_git.bbappend index 178c982a..687980cf 100644 --- a/meta-agl-jailhouse/dynamic-layers/raspberrypi/recipes-bsp/bootfiles/rpi-config_git.bbappend +++ b/meta-agl-jailhouse/dynamic-layers/raspberrypi/recipes-bsp/bootfiles/rpi-config_git.bbappend @@ -21,6 +21,10 @@ do_deploy_append_raspberrypi4() { echo "# Enable CAN (Waveshare RS485 CAN HAT)" >> ${DEPLOYDIR}/bcm2835-bootfiles/config.txt echo "dtoverlay=mcp2515-can0,oscillator=8000000,interrupt=25,spimaxfrequency=1000000" >> ${DEPLOYDIR}/bcm2835-bootfiles/config.txt + # memory reserved for Jailhouse + echo "dtoverlay=jailhouse-memory" >> ${DEPLOYDIR}/bcm2835-bootfiles/config.txt + echo "dtoverlay=jailhouse-memory,start=0xe0000000,size=0x200000" >> ${DEPLOYDIR}/bcm2835-bootfiles/config.txt + } diff --git a/meta-agl-jailhouse/dynamic-layers/raspberrypi/recipes-kernel/linux/linux-raspberrypi/0001-dt-dtoverlays-Add-jailhouse-memory-DT-overlay.patch b/meta-agl-jailhouse/dynamic-layers/raspberrypi/recipes-kernel/linux/linux-raspberrypi/0001-dt-dtoverlays-Add-jailhouse-memory-DT-overlay.patch new file mode 100644 index 00000000..1b6373cc --- /dev/null +++ b/meta-agl-jailhouse/dynamic-layers/raspberrypi/recipes-kernel/linux/linux-raspberrypi/0001-dt-dtoverlays-Add-jailhouse-memory-DT-overlay.patch @@ -0,0 +1,87 @@ +From c6319fb59e0cd5b6d3d4e3401abd9c2057059a74 Mon Sep 17 00:00:00 2001 +From: Jakub Luzny +Date: Tue, 11 Aug 2020 10:40:18 +0200 +Subject: [PATCH] dt/dtoverlays: Add jailhouse-memory DT overlay + +It is meant to reserve memory that can be used by the Jailhouse partitioning +hypervisor. More regions can be reserved. + +Upstream-Status: Inappropriate [Jailhouse specific] + +Signed-off-by: Jakub Luzny +--- + arch/arm/boot/dts/overlays/Makefile | 1 + + arch/arm/boot/dts/overlays/README | 7 +++++ + .../boot/dts/overlays/jailhouse-memory-overlay.dts | 30 ++++++++++++++++++++++ + 3 files changed, 38 insertions(+) + create mode 100644 arch/arm/boot/dts/overlays/jailhouse-memory-overlay.dts + +diff --git a/arch/arm/boot/dts/overlays/Makefile b/arch/arm/boot/dts/overlays/Makefile +index fa6db6eed3e2..38c61c67606d 100644 +--- a/arch/arm/boot/dts/overlays/Makefile ++++ b/arch/arm/boot/dts/overlays/Makefile +@@ -92,6 +92,7 @@ dtbo-$(CONFIG_ARCH_BCM2835) += \ + iqaudio-dacplus.dtbo \ + iqaudio-digi-wm8804-audio.dtbo \ + irs1125.dtbo \ ++ jailhouse-memory.dtbo \ + jedec-spi-nor.dtbo \ + justboom-both.dtbo \ + justboom-dac.dtbo \ +diff --git a/arch/arm/boot/dts/overlays/README b/arch/arm/boot/dts/overlays/README +index 69892d01faae..4a62f204b4f9 100644 +--- a/arch/arm/boot/dts/overlays/README ++++ b/arch/arm/boot/dts/overlays/README +@@ -1528,6 +1528,13 @@ Load: dtoverlay=irs1125 + Params: + + ++Name: jailhouse-memory ++Info: Reserves memory for use by the Jailhouse hypervisor ++Load: dtoverlay=jailhouse-memory,= ++Params: start Start of the reserved memory area (default 0x20000000) ++ size Size of the reserved memory area (default 0x10000000) ++ ++ + Name: jedec-spi-nor + Info: Adds support for JEDEC-compliant SPI NOR flash devices. (Note: The + "jedec,spi-nor" kernel driver was formerly known as "m25p80".) +diff --git a/arch/arm/boot/dts/overlays/jailhouse-memory-overlay.dts b/arch/arm/boot/dts/overlays/jailhouse-memory-overlay.dts +new file mode 100644 +index 000000000000..26c3ce6b9e3d +--- /dev/null ++++ b/arch/arm/boot/dts/overlays/jailhouse-memory-overlay.dts +@@ -0,0 +1,30 @@ ++// Reserves memory for use by the Jailhouse hypervisor ++/dts-v1/; ++/plugin/; ++ ++/ { ++ compatible = "brcm,bcm2835"; ++ ++ fragment@0 { ++ target-path = "/"; ++ __overlay__ { ++ ++ reserved-memory { ++ #address-cells = <2>; ++ #size-cells = <1>; ++ ++ ranges; ++ ++ jailhouse_memory: jailhouse@20000000 { ++ reg = <0x0 0x20000000 0x10000000>; ++ no-map; ++ }; ++ }; ++ }; ++ }; ++ ++ __overrides__ { ++ start = <&jailhouse_memory>,"reg#0"; ++ size = <&jailhouse_memory>,"reg:8"; ++ }; ++}; +-- +2.11.0 + diff --git a/meta-agl-jailhouse/dynamic-layers/raspberrypi/recipes-kernel/linux/linux-raspberrypi_%.bbappend b/meta-agl-jailhouse/dynamic-layers/raspberrypi/recipes-kernel/linux/linux-raspberrypi_%.bbappend deleted file mode 100644 index 0616c06e..00000000 --- a/meta-agl-jailhouse/dynamic-layers/raspberrypi/recipes-kernel/linux/linux-raspberrypi_%.bbappend +++ /dev/null @@ -1,2 +0,0 @@ -# required for Jailhouse to work with the supplied cell confiugrations -CMDLINE_append = " mem=768M" \ No newline at end of file diff --git a/meta-agl-jailhouse/dynamic-layers/raspberrypi/recipes-kernel/linux/linux-raspberrypi_5.4%.bbappend b/meta-agl-jailhouse/dynamic-layers/raspberrypi/recipes-kernel/linux/linux-raspberrypi_5.4%.bbappend index 7e37d21b..1456fdc8 100644 --- a/meta-agl-jailhouse/dynamic-layers/raspberrypi/recipes-kernel/linux/linux-raspberrypi_5.4%.bbappend +++ b/meta-agl-jailhouse/dynamic-layers/raspberrypi/recipes-kernel/linux/linux-raspberrypi_5.4%.bbappend @@ -1,3 +1,8 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + +SRC_URI += "file://0001-dt-dtoverlays-Add-jailhouse-memory-DT-overlay.patch" + + LINUX_VERSION = "5.4.51" SRCREV = "2c8ec3bb4403a7c76c22ec6d3d5fc4b2a366024e" diff --git a/meta-agl-jailhouse/recipes-extended/jailhouse/jailhouse/0001-configs-arm64-Add-support-for-RPi4-with-more-than-1G.patch b/meta-agl-jailhouse/recipes-extended/jailhouse/jailhouse/0001-configs-arm64-Add-support-for-RPi4-with-more-than-1G.patch new file mode 100644 index 00000000..21d5f2f1 --- /dev/null +++ b/meta-agl-jailhouse/recipes-extended/jailhouse/jailhouse/0001-configs-arm64-Add-support-for-RPi4-with-more-than-1G.patch @@ -0,0 +1,290 @@ +From 4f86ca866119669a75f02ea10fa502f051f8240c Mon Sep 17 00:00:00 2001 +From: Jakub Luzny +Date: Tue, 11 Aug 2020 11:45:02 +0200 +Subject: [PATCH] configs: arm64: Add support for RPi4 with more than 1G of + memory + +Add the required memory regions to support 2G, 4G and 8G RAM variants +of the Raspberry Pi 4. Tested on all the bigger variants, not on 1G, as I don't +have one on hand and it's not available anymore. + +Also moved the memory used by Jailhouse for the hypervisor and cells from +0x30000000 to 0x20000000 to avoid conflict with GPU memory. That is fine for +gpu_mem setting of up to 256. The memory is supposed to be reserved using +reserved-memory node in the device tree. To support variants with >2G RAM, +another region for PCI MMIO space has to be also reserved. + +Upstream-Status: Submitted [jailhouse-dev@googlegroups.com] + +Signed-off-by: Jakub Luzny +--- + configs/arm64/rpi4-inmate-demo.c | 22 ++++++------ + configs/arm64/rpi4-linux-demo.c | 28 +++++++-------- + configs/arm64/rpi4.c | 62 +++++++++++++++++++++++--------- + 3 files changed, 71 insertions(+), 41 deletions(-) + +diff --git a/configs/arm64/rpi4-inmate-demo.c b/configs/arm64/rpi4-inmate-demo.c +index 62442e7c..09dfc1f0 100644 +--- a/configs/arm64/rpi4-inmate-demo.c ++++ b/configs/arm64/rpi4-inmate-demo.c +@@ -51,34 +51,34 @@ struct { + .mem_regions = { + /* IVSHMEM shared memory regions (demo) */ + { +- .phys_start = 0x3faf0000, +- .virt_start = 0x3faf0000, ++ .phys_start = 0x2faf0000, ++ .virt_start = 0x2faf0000, + .size = 0x1000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_ROOTSHARED, + }, + { +- .phys_start = 0x3faf1000, +- .virt_start = 0x3faf1000, ++ .phys_start = 0x2faf1000, ++ .virt_start = 0x2faf1000, + .size = 0x9000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | + JAILHOUSE_MEM_ROOTSHARED, + }, + { +- .phys_start = 0x3fafa000, +- .virt_start = 0x3fafa000, ++ .phys_start = 0x2fafa000, ++ .virt_start = 0x2fafa000, + .size = 0x2000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_ROOTSHARED, + }, + { +- .phys_start = 0x3fafc000, +- .virt_start = 0x3fafc000, ++ .phys_start = 0x2fafc000, ++ .virt_start = 0x2fafc000, + .size = 0x2000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | + JAILHOUSE_MEM_ROOTSHARED, + }, + { +- .phys_start = 0x3fafe000, +- .virt_start = 0x3fafe000, ++ .phys_start = 0x2fafe000, ++ .virt_start = 0x2fafe000, + .size = 0x2000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_ROOTSHARED, + }, +@@ -91,7 +91,7 @@ struct { + JAILHOUSE_MEM_IO_32 | JAILHOUSE_MEM_ROOTSHARED, + }, + /* RAM */ { +- .phys_start = 0x3fa00000, ++ .phys_start = 0x2fa00000, + .virt_start = 0, + .size = 0x00010000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | +diff --git a/configs/arm64/rpi4-linux-demo.c b/configs/arm64/rpi4-linux-demo.c +index 9e7fad26..cf36fa22 100644 +--- a/configs/arm64/rpi4-linux-demo.c ++++ b/configs/arm64/rpi4-linux-demo.c +@@ -52,39 +52,39 @@ struct { + .mem_regions = { + /* IVSHMEM shared memory regions (demo) */ + { +- .phys_start = 0x3faf0000, +- .virt_start = 0x3faf0000, ++ .phys_start = 0x2faf0000, ++ .virt_start = 0x2faf0000, + .size = 0x1000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_ROOTSHARED, + }, + { +- .phys_start = 0x3faf1000, +- .virt_start = 0x3faf1000, ++ .phys_start = 0x2faf1000, ++ .virt_start = 0x2faf1000, + .size = 0x9000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | + JAILHOUSE_MEM_ROOTSHARED, + }, + { +- .phys_start = 0x3fafa000, +- .virt_start = 0x3fafa000, ++ .phys_start = 0x2fafa000, ++ .virt_start = 0x2fafa000, + .size = 0x2000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_ROOTSHARED, + }, + { +- .phys_start = 0x3fafc000, +- .virt_start = 0x3fafc000, ++ .phys_start = 0x2fafc000, ++ .virt_start = 0x2fafc000, + .size = 0x2000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_ROOTSHARED, + }, + { +- .phys_start = 0x3fafe000, +- .virt_start = 0x3fafe000, ++ .phys_start = 0x2fafe000, ++ .virt_start = 0x2fafe000, + .size = 0x2000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | + JAILHOUSE_MEM_ROOTSHARED, + }, + /* IVSHMEM shared memory region */ +- JAILHOUSE_SHMEM_NET_REGIONS(0x3fb00000, 1), ++ JAILHOUSE_SHMEM_NET_REGIONS(0x2fb00000, 1), + /* UART */ { + .phys_start = 0xfe215040, + .virt_start = 0xfe215040, +@@ -94,15 +94,15 @@ struct { + JAILHOUSE_MEM_IO_32 | JAILHOUSE_MEM_ROOTSHARED, + }, + /* RAM */ { +- .phys_start = 0x3f900000, ++ .phys_start = 0x2f900000, + .virt_start = 0, + .size = 0x10000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | + JAILHOUSE_MEM_EXECUTE | JAILHOUSE_MEM_LOADABLE, + }, + /* RAM */ { +- .phys_start = 0x30000000, +- .virt_start = 0x30000000, ++ .phys_start = 0x20000000, ++ .virt_start = 0x20000000, + .size = 0x8000000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | + JAILHOUSE_MEM_EXECUTE | JAILHOUSE_MEM_DMA | +diff --git a/configs/arm64/rpi4.c b/configs/arm64/rpi4.c +index 92463184..c25bd8d2 100644 +--- a/configs/arm64/rpi4.c ++++ b/configs/arm64/rpi4.c +@@ -1,7 +1,7 @@ + /* + * Jailhouse, a Linux-based partitioning hypervisor + * +- * Test configuration for Raspberry Pi 4 (32-bit, quad-core Cortex-A72, 1GB RAM) ++ * Test configuration for Raspberry Pi 4 (32-bit, quad-core Cortex-A72, 1GB, 2GB, 4GB or 8GB RAM) + * + * Copyright (c) Siemens AG, 2020 + * +@@ -10,6 +10,9 @@ + * + * This work is licensed under the terms of the GNU GPL, version 2. See + * the COPYING file in the top-level directory. ++ * ++ * Reservation via device tree: reg = <0x0 0x20000000 0x10000000>; ++ * reg = <0x0 0xe0000000 0x200000>; + */ + + #include +@@ -18,7 +21,7 @@ + struct { + struct jailhouse_system header; + __u64 cpus[1]; +- struct jailhouse_memory mem_regions[12]; ++ struct jailhouse_memory mem_regions[15]; + struct jailhouse_irqchip irqchips[2]; + struct jailhouse_pci_device pci_devices[2]; + } __attribute__((packed)) config = { +@@ -27,7 +30,7 @@ struct { + .revision = JAILHOUSE_CONFIG_REVISION, + .flags = JAILHOUSE_SYS_VIRTUAL_DEBUG_CONSOLE, + .hypervisor_memory = { +- .phys_start = 0x3fc00000, ++ .phys_start = 0x2fc00000, + .size = 0x00400000, + }, + .debug_console = { +@@ -70,37 +73,37 @@ struct { + .mem_regions = { + /* IVSHMEM shared memory regions for 00:00.0 (demo) */ + { +- .phys_start = 0x3faf0000, +- .virt_start = 0x3faf0000, ++ .phys_start = 0x2faf0000, ++ .virt_start = 0x2faf0000, + .size = 0x1000, + .flags = JAILHOUSE_MEM_READ, + }, + { +- .phys_start = 0x3faf1000, +- .virt_start = 0x3faf1000, ++ .phys_start = 0x2faf1000, ++ .virt_start = 0x2faf1000, + .size = 0x9000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE, + }, + { +- .phys_start = 0x3fafa000, +- .virt_start = 0x3fafa000, ++ .phys_start = 0x2fafa000, ++ .virt_start = 0x2fafa000, + .size = 0x2000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE, + }, + { +- .phys_start = 0x3fafc000, +- .virt_start = 0x3fafc000, ++ .phys_start = 0x2fafc000, ++ .virt_start = 0x2fafc000, + .size = 0x2000, + .flags = JAILHOUSE_MEM_READ, + }, + { +- .phys_start = 0x3fafe000, +- .virt_start = 0x3fafe000, ++ .phys_start = 0x2fafe000, ++ .virt_start = 0x2fafe000, + .size = 0x2000, + .flags = JAILHOUSE_MEM_READ, + }, + /* IVSHMEM shared memory regions for 00:01.0 (networking) */ +- JAILHOUSE_SHMEM_NET_REGIONS(0x3fb00000, 0), ++ JAILHOUSE_SHMEM_NET_REGIONS(0x2fb00000, 0), + /* MMIO 1 (permissive) */ { + .phys_start = 0xfd500000, + .virt_start = 0xfd500000, +@@ -115,10 +118,37 @@ struct { + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | + JAILHOUSE_MEM_IO, + }, +- /* RAM */ { ++ /* RAM (0M-~762M) */ { + .phys_start = 0x0, + .virt_start = 0x0, +- .size = 0x3fa10000, ++ .size = 0x2fa10000, ++ .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | ++ JAILHOUSE_MEM_EXECUTE, ++ }, ++ ++ /* ~6M reserved for the hypervisor and the shared memory regions */ ++ ++ /* RAM (768M-3584M) */ { ++ .phys_start = 0x30000000, ++ .virt_start = 0x30000000, ++ .size = 0xb0000000, ++ .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | ++ JAILHOUSE_MEM_EXECUTE, ++ }, ++ ++ /* 2M reserved for PCI MMIO space */ ++ ++ /* RAM (3586M-4032M) */ { ++ .phys_start = 0xe0200000, ++ .virt_start = 0xe0200000, ++ .size = 0x1be00000, ++ .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | ++ JAILHOUSE_MEM_EXECUTE, ++ }, ++ /* RAM (4096M-8192M) */ { ++ .phys_start = 0x100000000, ++ .virt_start = 0x100000000, ++ .size = 0x100000000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | + JAILHOUSE_MEM_EXECUTE, + }, +-- +2.27.0 + diff --git a/meta-agl-jailhouse/recipes-extended/jailhouse/jailhouse_git.bb b/meta-agl-jailhouse/recipes-extended/jailhouse/jailhouse_git.bb index c17e5f48..2fbd68e3 100644 --- a/meta-agl-jailhouse/recipes-extended/jailhouse/jailhouse_git.bb +++ b/meta-agl-jailhouse/recipes-extended/jailhouse/jailhouse_git.bb @@ -13,7 +13,11 @@ LIC_FILES_CHKSUM = " \ SRCREV = "4ce7658dddfd5a1682a379d5ac46657e93fe1ff0" PV = "0.12+git${SRCPV}" -SRC_URI = "git://github.com/siemens/jailhouse" +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" + +SRC_URI = "git://github.com/siemens/jailhouse \ + file://0001-configs-arm64-Add-support-for-RPi4-with-more-than-1G.patch \ + " DEPENDS = "virtual/kernel dtc-native python3-mako-native make-native" diff --git a/templates/feature/agl-jailhouse/50_local.conf.inc b/templates/feature/agl-jailhouse/50_local.conf.inc index 89e25216..7c5b3292 100644 --- a/templates/feature/agl-jailhouse/50_local.conf.inc +++ b/templates/feature/agl-jailhouse/50_local.conf.inc @@ -1,3 +1,5 @@ #### JAILHOUSE IMAGE_INSTALL_append = " jailhouse jailhouse-demos" PREFERRED_VERSION_linux-raspberrypi = "5.4%" + +RPI_KERNEL_DEVICETREE_OVERLAYS_append = " overlays/jailhouse-memory.dtbo" -- 2.16.6