summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Guittot <vincent.guittot@linaro.org>2021-11-18 17:00:48 +0100
committerVincent Guittot <vincent.guittot@linaro.org>2022-06-24 14:55:40 +0200
commit374bc2c0259550c07e49f183837951d0781bcfa6 (patch)
treea9aee142f2994016b6aa38652f14fb5ceaebd954
parent40f6b79cbb6fda678017336a7945ed4bbf698f65 (diff)
vhost-user-scmi: add inter vm sram
Signed-off-by: Vincent Guittot <vincent.guittot@linaro.org>
-rw-r--r--hw/arm/virt.c47
-rw-r--r--include/hw/arm/virt.h1
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,
};