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" 14*4705a71dSRichard Henderson #include "system/ram_addr.h" 15ed5d0019SJagannathan Raman #include "qapi/error.h" 16ed5d0019SJagannathan Raman 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 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], 48f4a3fda4SYang 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