diff options
author | Vincent Guittot <vincent.guittot@linaro.org> | 2021-11-18 17:00:48 +0100 |
---|---|---|
committer | Vincent Guittot <vincent.guittot@linaro.org> | 2022-06-24 14:55:40 +0200 |
commit | 374bc2c0259550c07e49f183837951d0781bcfa6 (patch) | |
tree | a9aee142f2994016b6aa38652f14fb5ceaebd954 | |
parent | 40f6b79cbb6fda678017336a7945ed4bbf698f65 (diff) |
vhost-user-scmi: add inter vm sram
Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
-rw-r--r-- | hw/arm/virt.c | 47 | ||||
-rw-r--r-- | include/hw/arm/virt.h | 1 |
2 files changed, 48 insertions, 0 deletions
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, }; |