From 042806431fafef0ce60ede76c66747e2ebe5d222 Mon Sep 17 00:00:00 2001 From: Anmol Date: Sat, 21 Aug 2021 00:39:46 +0200 Subject: [PATCH] meta-agl-jailhouse: Add support for virtio over IVSHMEM block This patch adds the support for the virtio over IVSHMEM block for AGL with Jailhouse. Current state of the Patchset: - Add PCI devices from (00:0c.0 - 00:0f.0), for various virtio devices(virtio-ivshmem-{block, console, NET, custom}), primarily for virtio-blk. - Add Common memory regions for virtio-blk in the Root-Cell and Non-Root-Linux-Cell configurations. - Add Documentation `meta-agl-jailhouse.md` for usage and Instructions. - Add `virtio-ivshmem-block` and `virtio-ivshmem-console` recipes for ott Kernel modules. v2 (Anmol): Update `agl-linux-x86-demo.c` and `qemu-agl.c` for PCI macros and small descriptions for IVSHMEM PCI devices. V3 (Anmol): - [RFC] Add packagegroup for the virtio-ivshmem-{block, console} applications. - Update the `meta-agl-jailhouse.md` for architecture specific information. v4 (Anmol): Update recipe files according to the new syntax(3.4-honister). v5 (Anmol): - Update recipe files for virtio-ivshmem binaries. - Update `50_local.conf.inc` for `packagegroup-agl-jailhouse`. v5 (Anmol): Update syntax for `50_local.conf.inc`. Signed-off-by: Anmol Change-Id: I1bed4c6f1d3d9b0792a18544ad18edca85a5f4f7 --- .../jailhouse/files/agl-linux-x86-demo.c | 98 ++++++++-- .../recipes-extended/jailhouse/files/qemu-agl.c | 197 ++++++++++++++++++++- .../jailhouse/virtio-ivshmem-block.bb | 54 ++++++ .../jailhouse/virtio-ivshmem-console.bb | 54 ++++++ 4 files changed, 376 insertions(+), 27 deletions(-) create mode 100644 meta-agl-jailhouse/recipes-extended/jailhouse/virtio-ivshmem-block.bb create mode 100644 meta-agl-jailhouse/recipes-extended/jailhouse/virtio-ivshmem-console.bb (limited to 'meta-agl-jailhouse/recipes-extended') diff --git a/meta-agl-jailhouse/recipes-extended/jailhouse/files/agl-linux-x86-demo.c b/meta-agl-jailhouse/recipes-extended/jailhouse/files/agl-linux-x86-demo.c index 4aa8db44..37fcf54c 100644 --- a/meta-agl-jailhouse/recipes-extended/jailhouse/files/agl-linux-x86-demo.c +++ b/meta-agl-jailhouse/recipes-extended/jailhouse/files/agl-linux-x86-demo.c @@ -12,6 +12,52 @@ * the COPYING file in the top-level directory. */ +/* For extending the virtio-blk over IVSHMEM. */ +#define USE_VIRTIO_BLK + +/* + * Placeholder for extending virtio-device + * + * #define USE_VIRTIO_NET + * #define USE_VIRTIO_CON + * #define USE_VIRTIO_DEMO + */ + +#ifdef USE_VIRTIO_BLK +# define BLK_MEM 4 +# define BLK_PCI 1 +#else +# define BLK_MEM 0 +# define BLK_PCI 0 +#endif + +#ifdef USE_IVSHMEM_DEMO +# define DEMO_MEM 5 +# define DEMO_PCI 1 +#else +# define DEMO_MEM 0 +# define DEMO_PCI 0 +#endif + +#ifdef USE_IVSHMEM_NET +# define NET_MEM 4 +# define NET_PCI 1 +#else +# define NET_MEM 0 +# define NET_PCI 0 +#endif + +#ifdef USE_VIRTIO_CON +# define CON_MEM 4 +# define CON_PCI 1 +#else +# define CON_MEM 0 +# define CON_PCI 0 +#endif + +#define COMM_MEM_REGIONS (BLK_MEM + CON_MEM + NET_MEM + DEMO_MEM) +#define COMM_PCI_REGIONS (BLK_PCI + CON_PCI + NET_PCI + DEMO_PCI) + #include #include @@ -19,17 +65,17 @@ struct { struct jailhouse_cell_desc cell; __u64 cpus[1]; #ifdef CONFIG_QEMU_E1000E_ASSIGNMENT - struct jailhouse_memory mem_regions[24]; + struct jailhouse_memory mem_regions[7 + COMM_MEM_REGIONS]; #else - struct jailhouse_memory mem_regions[20]; + struct jailhouse_memory mem_regions[3 + COMM_MEM_REGIONS]; #endif struct jailhouse_cache cache_regions[1]; struct jailhouse_irqchip irqchips[1]; struct jailhouse_pio pio_regions[2]; #ifdef CONFIG_QEMU_E1000E_ASSIGNMENT - struct jailhouse_pci_device pci_devices[5]; + struct jailhouse_pci_device pci_devices[1 + COMM_PCI_REGIONS]; #else - struct jailhouse_pci_device pci_devices[4]; + struct jailhouse_pci_device pci_devices[COMM_PCI_REGIONS]; #endif struct jailhouse_pci_capability pci_caps[6]; } __attribute__((packed)) config = { @@ -54,24 +100,26 @@ struct { }, .mem_regions = { - - /* IVSHMEM shared memory region (virtio-blk front) */ +#if defined USE_VIRTIO_BLK + /* IVSHMEM shared memory region (virtio-blk front-end) */ { - .phys_start = 0x22000000, - .virt_start = 0x22000000, + .phys_start = 0x26e00000, + .virt_start = 0x26e00000, .size = 0x1000, .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_ROOTSHARED, }, { - .phys_start = 0x22001000, - .virt_start = 0x22001000, + .phys_start = 0x26e01000, + .virt_start = 0x26e01000, .size = 0xdf000, .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | JAILHOUSE_MEM_ROOTSHARED, }, { 0 }, { 0 }, - /* IVSHMEM shared memory region (virtio-con front) */ +#endif +#if defined USE_IVSHMEM_CON + /* IVSHMEM shared memory region (virtio-con front-end) */ { .phys_start = 0x220e0000, .virt_start = 0x220e0000, @@ -87,7 +135,8 @@ struct { }, { 0 }, { 0 }, - +#endif +#if defined USE_IVSHMEM_DEMO /* IVSHMEM shared memory regions (demo) */ { .phys_start = 0x220f0000, @@ -121,8 +170,11 @@ struct { .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | JAILHOUSE_MEM_ROOTSHARED, }, +#endif +#if defined USE_IVSHMEM_NET /* IVSHMEM shared memory regions (networking) */ JAILHOUSE_SHMEM_NET_REGIONS(0x22100000, 1), +#endif /* low RAM */ { .phys_start = 0x22600000, .virt_start = 0, @@ -202,7 +254,8 @@ struct { }, .pci_devices = { - { +#if defined USE_VIRTIO_BLK + { /* IVSHMEM (virtio-blk front-end) */ .type = JAILHOUSE_PCI_TYPE_IVSHMEM, .domain = 0x0, .bdf = 0x0c << 3, @@ -214,40 +267,47 @@ struct { .shmem_protocol = JAILHOUSE_SHMEM_PROTO_VIRTIO_FRONT + VIRTIO_DEV_BLOCK, }, - { +#endif +#if defined USE_IVSHMEM_CON + { /* IVSHMEM (virtio-con front-end) */ .type = JAILHOUSE_PCI_TYPE_IVSHMEM, .domain = 0x0, .bdf = 0x0d << 3, .bar_mask = JAILHOUSE_IVSHMEM_BAR_MASK_MSIX, .num_msix_vectors = 3, - .shmem_regions_start = 4, + .shmem_regions_start = BLK_MEM, /* 0 + BLK_MEM */ .shmem_dev_id = 1, .shmem_peers = 2, .shmem_protocol = JAILHOUSE_SHMEM_PROTO_VIRTIO_FRONT + VIRTIO_DEV_CONSOLE, }, - { +#endif +#if defined USE_IVSHMEM_DEMO + { /* IVSHMEM (demo) */ .type = JAILHOUSE_PCI_TYPE_IVSHMEM, .domain = 0x0, .bdf = 0x0e << 3, .bar_mask = JAILHOUSE_IVSHMEM_BAR_MASK_MSIX, .num_msix_vectors = 16, - .shmem_regions_start = 8, + .shmem_regions_start = BLK_MEM + CON_MEM, .shmem_dev_id = 2, .shmem_peers = 3, .shmem_protocol = JAILHOUSE_SHMEM_PROTO_UNDEFINED, }, - { +#endif +#if defined USE_IVSHMEM_NET + { /* IVSHMEM (networking) */ .type = JAILHOUSE_PCI_TYPE_IVSHMEM, .domain = 0x0, .bdf = 0x0f << 3, .bar_mask = JAILHOUSE_IVSHMEM_BAR_MASK_MSIX, .num_msix_vectors = 2, - .shmem_regions_start = 13, + .shmem_regions_start = BLK_MEM + CON_MEM + DEMO_MEM, .shmem_dev_id = 1, .shmem_peers = 2, .shmem_protocol = JAILHOUSE_SHMEM_PROTO_VETH, }, +#endif #ifdef CONFIG_QEMU_E1000E_ASSIGNMENT { /* e1000e */ .type = JAILHOUSE_PCI_TYPE_DEVICE, diff --git a/meta-agl-jailhouse/recipes-extended/jailhouse/files/qemu-agl.c b/meta-agl-jailhouse/recipes-extended/jailhouse/files/qemu-agl.c index d134e971..265b4997 100644 --- a/meta-agl-jailhouse/recipes-extended/jailhouse/files/qemu-agl.c +++ b/meta-agl-jailhouse/recipes-extended/jailhouse/files/qemu-agl.c @@ -39,16 +39,65 @@ * "memmap=0x5200000$0x22000000" */ +/* For extending virtio-blk over IVSHMEM. */ +#define USE_VIRTIO_BLK + +/* + * Placeholder for extending virtio-device + * + * #define USE_VIRTIO_NET + * #define USE_VIRTIO_CON + * #define USE_VIRTIO_DEMO + * + */ + +#ifdef USE_VIRTIO_BLK +# define BLK_MEM 4 +# define BLK_PCI 1 +#else +# define BLK_MEM 0 +# define BLK_PCI 0 +#endif + +#ifdef USE_IVSHMEM_DEMO +# define DEMO_MEM 5 +# define DEMO_PCI 1 +#else +# define DEMO_MEM 0 +# define DEMO_PCI 0 +#endif + +#ifdef USE_IVSHMEM_NET +# define NET_MEM 4 +# define NET_PCI 1 +#else +# define NET_MEM 0 +# define NET_PCI 0 +#endif + +#ifdef USE_VIRTIO_CON +# define CON_MEM 4 +# define CON_PCI 1 +#else +# define CON_MEM 0 +# define CON_PCI 0 +#endif + + +#define COMM_MEM_REGIONS (BLK_MEM + DEMO_MEM + NET_MEM + CON_MEM) +#define COMM_PCI_REGIONS (BLK_PCI + DEMO_PCI + NET_PCI + CON_PCI) + + #include #include struct { struct jailhouse_system header; __u64 cpus[1]; - struct jailhouse_memory mem_regions[17]; + struct jailhouse_memory mem_regions[17 + COMM_MEM_REGIONS]; struct jailhouse_irqchip irqchips[1]; - struct jailhouse_pio pio_regions[14]; - struct jailhouse_pci_device pci_devices[13]; + struct jailhouse_pio pio_regions[15]; + struct jailhouse_pci_device pci_devices[13 + COMM_PCI_REGIONS]; struct jailhouse_pci_capability pci_caps[14]; } __attribute__((packed)) config = { .header = { @@ -96,6 +145,81 @@ struct { }, .mem_regions = { + +#if defined USE_VIRTIO_BLK + /* IVSHMEM shared memory region (virtio-blk back-end) */ + { + .phys_start = 0x26e00000, + .virt_start = 0x26e00000, + .size = 0x1000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_ROOTSHARED, + }, + { + .phys_start = 0x26e01000, + .virt_start = 0x26e01000, + .size = 0xdf000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE, + }, + { 0 }, + { 0 }, +#endif +#if defined(USE_VIRTIO_CON) + /* IVSHMEM shared memory region (virtio-con back-end) */ + { + .phys_start = 0x220e0000, + .virt_start = 0x220e0000, + .size = 0x1000, + .flags = JAILHOUSE_MEM_READ, + }, + { + .phys_start = 0x220e1000, + .virt_start = 0x220e1000, + .size = 0xf000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE, + }, + { 0 }, + { 0 }, +#endif +#if defined USE_IVSHMEM_DMEO + /* IVSHMEM shared memory regions (demo) */ + { + .phys_start = 0x220f0000, + .virt_start = 0x220f0000, + .size = 0x1000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_ROOTSHARED, + }, + { + .phys_start = 0x220f1000, + .virt_start = 0x220f1000, + .size = 0x9000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | + JAILHOUSE_MEM_ROOTSHARED, + }, + { + .phys_start = 0x220fa000, + .virt_start = 0x220fa000, + .size = 0x2000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_ROOTSHARED, + }, + { + .phys_start = 0x220fc000, + .virt_start = 0x220fc000, + .size = 0x2000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_ROOTSHARED, + }, + { + .phys_start = 0x220fe000, + .virt_start = 0x220fe000, + .size = 0x2000, + .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | + JAILHOUSE_MEM_ROOTSHARED, + }, +#endif +#if defined(USE_IVSHMEM_NET) + /* IVSHMEM shared memory regions (networking) */ + JAILHOUSE_SHMEM_NET_REGIONS(0x22100000, 0), +#endif + /* MemRegion: 00000000-0009fbff : System RAM */ { .phys_start = 0x0, @@ -126,11 +250,11 @@ struct { .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | JAILHOUSE_MEM_EXECUTE | JAILHOUSE_MEM_DMA, }, - /* MemRegion: 27200000-7ffd7fff : System RAM */ + /* MemRegion: 27200000-3ffd7fff : System RAM */ { .phys_start = 0x27200000, .virt_start = 0x27200000, - .size = 0x58dd8000, + .size = 0x18dd8000, .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | JAILHOUSE_MEM_EXECUTE | JAILHOUSE_MEM_DMA, }, @@ -258,10 +382,9 @@ struct { PIO_RANGE(0x2f8, 0x8), /* Port I/O: 03c0-03df : vga+ */ PIO_RANGE(0x3c0, 0x20), - /* Port I/O: 03e8-03ef : serial */ - /* PIO_RANGE(0x3e8, 0x8), */ /* Port I/O: 03f8-03ff : serial */ PIO_RANGE(0x3f8, 0x8), + PIO_RANGE(0x3e8, 0x8), /* Port I/O: 0510-051b : QEMU0002:00 */ /* PIO_RANGE(0x510, 0xc), */ /* Port I/O: 0600-0603 : ACPI PM1a_EVT_BLK */ @@ -538,6 +661,64 @@ struct { .msix_region_size = 0x0, .msix_address = 0x0, }, +#if defined USE_VIRTIO_BLK + { /* IVSHMEM (virtio-blk back-end) */ + .type = JAILHOUSE_PCI_TYPE_IVSHMEM, + .iommu = 1, + .domain = 0x0, + .bdf = 0x0c << 3, + .bar_mask = JAILHOUSE_IVSHMEM_BAR_MASK_MSIX, + .num_msix_vectors = 2, + .shmem_regions_start = 0, + .shmem_dev_id = 0, + .shmem_peers = 2, + .shmem_protocol = JAILHOUSE_SHMEM_PROTO_VIRTIO_BACK + + VIRTIO_DEV_BLOCK, + }, +#endif +#if defined USE_VIRTIO_CON + { /* IVSHMEM (virtio-con back-end) */ + .type = JAILHOUSE_PCI_TYPE_IVSHMEM, + .iommu = 1, + .domain = 0x0, + .bdf = 0x0d << 3, + .bar_mask = JAILHOUSE_IVSHMEM_BAR_MASK_MSIX, + .num_msix_vectors = 3, + .shmem_regions_start = BLK_MEM, /* 0 + BLK_MEM */ + .shmem_dev_id = 0, + .shmem_peers = 2, + .shmem_protocol = JAILHOUSE_SHMEM_PROTO_VIRTIO_BACK + + VIRTIO_DEV_CONSOLE, + }, +#endif +#if defined USE_IVSHMEM_DEMO + { /* IVSHMEM (demo) */ + .type = JAILHOUSE_PCI_TYPE_IVSHMEM, + .iommu = 1, + .domain = 0x0, + .bdf = 0x0e << 3, + .bar_mask = JAILHOUSE_IVSHMEM_BAR_MASK_MSIX, + .num_msix_vectors = 16, + .shmem_regions_start = BLK_MEM + CON_MEM, + .shmem_dev_id = 0, + .shmem_peers = 3, + .shmem_protocol = JAILHOUSE_SHMEM_PROTO_UNDEFINED, + }, +#endif +#if defined USE_VIRTIO_NET + { /* IVSHMEM (Networking) */ + .type = JAILHOUSE_PCI_TYPE_IVSHMEM, + .iommu = 1, + .domain = 0x0, + .bdf = 0x0f << 3, + .bar_mask = JAILHOUSE_IVSHMEM_BAR_MASK_MSIX, + .num_msix_vectors = 2, + .shmem_regions_start = BLK_MEM + CON_MEM + DEMO_MEM, + .shmem_dev_id = 0, + .shmem_peers = 2, + .shmem_protocol = JAILHOUSE_SHMEM_PROTO_VETH, + }, +#endif }, .pci_caps = { @@ -632,4 +813,4 @@ struct { .flags = 0, }, }, -}; +}; \ No newline at end of file diff --git a/meta-agl-jailhouse/recipes-extended/jailhouse/virtio-ivshmem-block.bb b/meta-agl-jailhouse/recipes-extended/jailhouse/virtio-ivshmem-block.bb new file mode 100644 index 00000000..4ee6c98a --- /dev/null +++ b/meta-agl-jailhouse/recipes-extended/jailhouse/virtio-ivshmem-block.bb @@ -0,0 +1,54 @@ +SUMMARY = "virtio-ivshmem-block built out of the kernel tree" +DESCRIPTION = "virtio-ivshmem-block built out of the kernel tree." +HOMEPAGE = "https://kernel.org" + +LICENSE = "GPLv2" + +PR = "r1" + +DEPENDS = " \ + virtual/${MLPREFIX}libc \ + ${MLPREFIX}elfutils \ + ${MLPREFIX}binutils \ + bison-native flex-native xz \ +" + +do_configure[depends] += "virtual/kernel:do_shared_workdir" + +PROVIDES = "virtual/virtio-ivshmem-block" + +inherit linux-kernel-base kernel-arch + +#kernel 3.1+ supports WERROR to disable warnings as errors +export WERROR = "0" + +do_populate_lic[depends] += "virtual/kernel:do_shared_workdir" + +inherit kernelsrc + + +#PACKAGE_ARCH = "${MACHINE_ARCH}" + +S = "${WORKDIR}" + +RDEPENDS:${PN}-dev = "" + +EXTRA_OEMAKE = " CC="${CC} ${CFLAGS} ${LDFLAGS}" CPP="${CPP}"" + +do_configure() { + echo "configure" +} + +do_compile() { + + oe_runmake CC="${CC} -I${STAGING_DIR_TARGET}/usr/include/ " LD="${LD}" AR="${AR}" \ + -C ${STAGING_KERNEL_DIR}/tools/virtio/ O=${S} virtio-ivshmem-block + +} + +do_install(){ + + install -d ${D}${bindir}/ + install -m 0755 ${STAGING_KERNEL_DIR}/tools/virtio/virtio-ivshmem-block ${D}${bindir} + +} \ No newline at end of file diff --git a/meta-agl-jailhouse/recipes-extended/jailhouse/virtio-ivshmem-console.bb b/meta-agl-jailhouse/recipes-extended/jailhouse/virtio-ivshmem-console.bb new file mode 100644 index 00000000..3d046f14 --- /dev/null +++ b/meta-agl-jailhouse/recipes-extended/jailhouse/virtio-ivshmem-console.bb @@ -0,0 +1,54 @@ +SUMMARY = "virtio-ivshmem-console built out of the kernel tree" +DESCRIPTION = "virtio-ivshmem-console built out of the kernel tree." +HOMEPAGE = "https://kernel.org" + +LICENSE = "GPLv2" + +PR = "r1" + +DEPENDS = " \ + virtual/${MLPREFIX}libc \ + ${MLPREFIX}elfutils \ + ${MLPREFIX}binutils \ + bison-native flex-native xz \ +" + +do_configure[depends] += "virtual/kernel:do_shared_workdir" + +PROVIDES = "virtual/virtio-ivshmem-console" + +inherit linux-kernel-base kernel-arch + +#kernel 3.1+ supports WERROR to disable warnings as errors +export WERROR = "0" + +do_populate_lic[depends] += "virtual/kernel:do_shared_workdir" + +inherit kernelsrc + + +#PACKAGE_ARCH = "${MACHINE_ARCH}" + +S = "${WORKDIR}" + +RDEPENDS:${PN}-dev = "" + +EXTRA_OEMAKE = " CC="${CC} ${CFLAGS} ${LDFLAGS}" CPP="${CPP}"" + +do_configure() { + echo "configure" +} + +do_compile() { + + oe_runmake CC="${CC} -I${STAGING_DIR_TARGET}/usr/include/ " LD="${LD}" AR="${AR}" \ + -C ${STAGING_KERNEL_DIR}/tools/virtio/ O=${S} virtio-ivshmem-console + +} + +do_install(){ + + install -d ${D}${bindir}/ + install -m 0755 ${STAGING_KERNEL_DIR}/tools/virtio/virtio-ivshmem-console ${D}${bindir} + +} \ No newline at end of file -- cgit 1.2.3-korg