1ed5d0019SJagannathan Raman /*
2ed5d0019SJagannathan Raman * Memory manager for remote device
3ed5d0019SJagannathan Raman *
4ed5d0019SJagannathan Raman * Copyright © 2018, 2021 Oracle and/or its affiliates.
5ed5d0019SJagannathan Raman *
6ed5d0019SJagannathan Raman * This work is licensed under the terms of the GNU GPL, version 2 or later.
7ed5d0019SJagannathan Raman * See the COPYING file in the top-level directory.
8ed5d0019SJagannathan Raman *
9ed5d0019SJagannathan Raman */
10ed5d0019SJagannathan Raman
11ed5d0019SJagannathan Raman #include "qemu/osdep.h"
12ed5d0019SJagannathan Raman
13ed5d0019SJagannathan Raman #include "hw/remote/memory.h"
14ed5d0019SJagannathan Raman #include "exec/ram_addr.h"
15ed5d0019SJagannathan Raman #include "qapi/error.h"
16ed5d0019SJagannathan Raman
remote_sysmem_reset(void)17ed5d0019SJagannathan Raman static void remote_sysmem_reset(void)
18ed5d0019SJagannathan Raman {
19ed5d0019SJagannathan Raman MemoryRegion *sysmem, *subregion, *next;
20ed5d0019SJagannathan Raman
21ed5d0019SJagannathan Raman sysmem = get_system_memory();
22ed5d0019SJagannathan Raman
23ed5d0019SJagannathan Raman QTAILQ_FOREACH_SAFE(subregion, &sysmem->subregions, subregions_link, next) {
24ed5d0019SJagannathan Raman if (subregion->ram) {
25ed5d0019SJagannathan Raman memory_region_del_subregion(sysmem, subregion);
26ed5d0019SJagannathan Raman object_unparent(OBJECT(subregion));
27ed5d0019SJagannathan Raman }
28ed5d0019SJagannathan Raman }
29ed5d0019SJagannathan Raman }
30ed5d0019SJagannathan Raman
remote_sysmem_reconfig(MPQemuMsg * msg,Error ** errp)31ed5d0019SJagannathan Raman void remote_sysmem_reconfig(MPQemuMsg *msg, Error **errp)
32ed5d0019SJagannathan Raman {
33ed5d0019SJagannathan Raman ERRP_GUARD();
34ed5d0019SJagannathan Raman SyncSysmemMsg *sysmem_info = &msg->data.sync_sysmem;
35ed5d0019SJagannathan Raman MemoryRegion *sysmem, *subregion;
36ed5d0019SJagannathan Raman static unsigned int suffix;
37ed5d0019SJagannathan Raman int region;
38ed5d0019SJagannathan Raman
39ed5d0019SJagannathan Raman sysmem = get_system_memory();
40ed5d0019SJagannathan Raman
41ed5d0019SJagannathan Raman remote_sysmem_reset();
42ed5d0019SJagannathan Raman
43d9022680SZenghui Yu for (region = 0; region < msg->num_fds; region++, suffix++) {
44d9022680SZenghui Yu g_autofree char *name = g_strdup_printf("remote-mem-%u", suffix);
45ed5d0019SJagannathan Raman subregion = g_new(MemoryRegion, 1);
46ed5d0019SJagannathan Raman memory_region_init_ram_from_fd(subregion, NULL,
47ed5d0019SJagannathan Raman name, sysmem_info->sizes[region],
48*f4a3fda4SYang Zhong RAM_SHARED, msg->fds[region],
49ed5d0019SJagannathan Raman sysmem_info->offsets[region],
50ed5d0019SJagannathan Raman errp);
51ed5d0019SJagannathan Raman
52ed5d0019SJagannathan Raman if (*errp) {
53ed5d0019SJagannathan Raman g_free(subregion);
54ed5d0019SJagannathan Raman remote_sysmem_reset();
55ed5d0019SJagannathan Raman return;
56ed5d0019SJagannathan Raman }
57ed5d0019SJagannathan Raman
58ed5d0019SJagannathan Raman memory_region_add_subregion(sysmem, sysmem_info->gpas[region],
59ed5d0019SJagannathan Raman subregion);
60ed5d0019SJagannathan Raman
61ed5d0019SJagannathan Raman }
62ed5d0019SJagannathan Raman }
63