From 374bc2c0259550c07e49f183837951d0781bcfa6 Mon Sep 17 00:00:00 2001 From: Vincent Guittot Date: Thu, 18 Nov 2021 17:00:48 +0100 Subject: vhost-user-scmi: add inter vm sram Signed-off-by: Vincent Guittot --- hw/arm/virt.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ include/hw/arm/virt.h | 1 + 2 files changed, 48 insertions(+) diff --git a/hw/arm/virt.c b/hw/arm/virt.c index d2e5ecd234..52f64645bb 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -154,6 +154,7 @@ static const MemMapEntry base_memmap[] = { [VIRT_NVDIMM_ACPI] = { 0x09090000, NVDIMM_ACPI_IO_LEN}, [VIRT_PVTIME] = { 0x090a0000, 0x00010000 }, [VIRT_SECURE_GPIO] = { 0x090b0000, 0x00001000 }, + [VIRT_SRAM] = { 0x090c0000, 0x00001000 }, [VIRT_MMIO] = { 0x0a000000, 0x00000200 }, /* ...repeating for a total of NUM_VIRTIO_TRANSPORTS, each of that size */ [VIRT_PLATFORM_BUS] = { 0x0c000000, 0x02000000 }, @@ -861,6 +862,50 @@ static void create_uart(const VirtMachineState *vms, int uart, g_free(nodename); } +static void create_inter_vm_sram(VirtMachineState *vms, + MemoryRegion *mem) +{ + MemoryRegion *sram; + char *nodename; + const char regionname[] = "virt_sram"; + hwaddr base = vms->memmap[VIRT_SRAM].base; + hwaddr size = vms->memmap[VIRT_SRAM].size; + MachineState *ms = MACHINE(vms); + Object *backend; + ram_addr_t backend_size; + HostMemoryBackend *HostBackend; + + backend = object_resolve_path_type(regionname, TYPE_MEMORY_BACKEND, NULL); + if (!backend) { + /* No memory-backend-file has been added for the region */ + warn_report("Memory backend for '%s' not found", regionname); + sram = g_new(MemoryRegion, 1); + memory_region_init_ram(sram, NULL, regionname, size, &error_fatal); + } else { + backend_size = object_property_get_uint(backend, "size", &error_abort); + if (backend_size != size) + warn_report("Size specified by %s: %ld should match size of " + "explicitly specified 'memory-backend' property %ld", regionname, size, backend_size); + + /* Get memory region of the Hostbackend */ + HostBackend = MEMORY_BACKEND(backend); + sram = host_memory_backend_get_memory(HostBackend); + host_memory_backend_set_mapped(HostBackend, true); + } + + memory_region_add_subregion(mem, base, sram); + + /* Add device in DT*/ + nodename = g_strdup_printf("/vmram@%" PRIx64, base); + qemu_fdt_add_subnode(ms->fdt, nodename); + qemu_fdt_setprop_string(ms->fdt, nodename, "device_type", "memory"); + qemu_fdt_setprop_sized_cells(ms->fdt, nodename, "reg", 2, base, 2, size); + qemu_fdt_setprop_string(ms->fdt, nodename, "status", "okay"); + + g_free(nodename); +} + + static void create_rtc(const VirtMachineState *vms) { char *nodename; @@ -2196,6 +2241,8 @@ static void machvirt_init(MachineState *machine) vms->highmem_ecam &= (!firmware_loaded || aarch64); + create_inter_vm_sram(vms, sysmem); + create_rtc(vms); create_pcie(vms); diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h index 7e76ee2619..c2757bae18 100644 --- a/include/hw/arm/virt.h +++ b/include/hw/arm/virt.h @@ -86,6 +86,7 @@ enum { VIRT_ACPI_GED, VIRT_NVDIMM_ACPI, VIRT_PVTIME, + VIRT_SRAM, VIRT_LOWMEMMAP_LAST, }; -- cgit v1.2.3