xref: /openbmc/qemu/hw/remote/memory.c (revision 1be5a765c08cee3a9587c8a8d3fc2ea247b13f9c)
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