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 #include "qemu-common.h" 13ed5d0019SJagannathan Raman 14ed5d0019SJagannathan Raman #include "hw/remote/memory.h" 15ed5d0019SJagannathan Raman #include "exec/ram_addr.h" 16ed5d0019SJagannathan Raman #include "qapi/error.h" 17ed5d0019SJagannathan Raman 18ed5d0019SJagannathan Raman static void remote_sysmem_reset(void) 19ed5d0019SJagannathan Raman { 20ed5d0019SJagannathan Raman MemoryRegion *sysmem, *subregion, *next; 21ed5d0019SJagannathan Raman 22ed5d0019SJagannathan Raman sysmem = get_system_memory(); 23ed5d0019SJagannathan Raman 24ed5d0019SJagannathan Raman QTAILQ_FOREACH_SAFE(subregion, &sysmem->subregions, subregions_link, next) { 25ed5d0019SJagannathan Raman if (subregion->ram) { 26ed5d0019SJagannathan Raman memory_region_del_subregion(sysmem, subregion); 27ed5d0019SJagannathan Raman object_unparent(OBJECT(subregion)); 28ed5d0019SJagannathan Raman } 29ed5d0019SJagannathan Raman } 30ed5d0019SJagannathan Raman } 31ed5d0019SJagannathan Raman 32ed5d0019SJagannathan Raman void remote_sysmem_reconfig(MPQemuMsg *msg, Error **errp) 33ed5d0019SJagannathan Raman { 34ed5d0019SJagannathan Raman ERRP_GUARD(); 35ed5d0019SJagannathan Raman SyncSysmemMsg *sysmem_info = &msg->data.sync_sysmem; 36ed5d0019SJagannathan Raman MemoryRegion *sysmem, *subregion; 37ed5d0019SJagannathan Raman static unsigned int suffix; 38ed5d0019SJagannathan Raman int region; 39ed5d0019SJagannathan Raman 40ed5d0019SJagannathan Raman sysmem = get_system_memory(); 41ed5d0019SJagannathan Raman 42ed5d0019SJagannathan Raman remote_sysmem_reset(); 43ed5d0019SJagannathan Raman 44*d9022680SZenghui Yu for (region = 0; region < msg->num_fds; region++, suffix++) { 45*d9022680SZenghui Yu g_autofree char *name = g_strdup_printf("remote-mem-%u", suffix); 46ed5d0019SJagannathan Raman subregion = g_new(MemoryRegion, 1); 47ed5d0019SJagannathan Raman memory_region_init_ram_from_fd(subregion, NULL, 48ed5d0019SJagannathan Raman name, sysmem_info->sizes[region], 49ed5d0019SJagannathan Raman true, msg->fds[region], 50ed5d0019SJagannathan Raman sysmem_info->offsets[region], 51ed5d0019SJagannathan Raman errp); 52ed5d0019SJagannathan Raman 53ed5d0019SJagannathan Raman if (*errp) { 54ed5d0019SJagannathan Raman g_free(subregion); 55ed5d0019SJagannathan Raman remote_sysmem_reset(); 56ed5d0019SJagannathan Raman return; 57ed5d0019SJagannathan Raman } 58ed5d0019SJagannathan Raman 59ed5d0019SJagannathan Raman memory_region_add_subregion(sysmem, sysmem_info->gpas[region], 60ed5d0019SJagannathan Raman subregion); 61ed5d0019SJagannathan Raman 62ed5d0019SJagannathan Raman } 63ed5d0019SJagannathan Raman } 64