1 /* 2 * Memory Device Interface 3 * 4 * Copyright (c) 2018 Red Hat, Inc. 5 * 6 * Authors: 7 * David Hildenbrand <david@redhat.com> 8 * 9 * This work is licensed under the terms of the GNU GPL, version 2 or later. 10 * See the COPYING file in the top-level directory. 11 */ 12 13 #ifndef MEMORY_DEVICE_H 14 #define MEMORY_DEVICE_H 15 16 #include "hw/qdev-core.h" 17 #include "qapi/qapi-types-misc.h" 18 #include "qom/object.h" 19 20 #define TYPE_MEMORY_DEVICE "memory-device" 21 22 #define MEMORY_DEVICE_CLASS(klass) \ 23 OBJECT_CLASS_CHECK(MemoryDeviceClass, (klass), TYPE_MEMORY_DEVICE) 24 #define MEMORY_DEVICE_GET_CLASS(obj) \ 25 OBJECT_GET_CLASS(MemoryDeviceClass, (obj), TYPE_MEMORY_DEVICE) 26 #define MEMORY_DEVICE(obj) \ 27 INTERFACE_CHECK(MemoryDeviceState, (obj), TYPE_MEMORY_DEVICE) 28 29 typedef struct MemoryDeviceState MemoryDeviceState; 30 31 /** 32 * MemoryDeviceClass: 33 * 34 * All memory devices need to implement TYPE_MEMORY_DEVICE as an interface. 35 * 36 * A memory device is a device that owns a memory region which is 37 * mapped into guest physical address space at a certain address. The 38 * address in guest physical memory can either be specified explicitly 39 * or get assigned automatically. 40 * 41 * Conceptually, memory devices only span one memory region. If multiple 42 * successive memory regions are used, a covering memory region has to 43 * be provided. Scattered memory regions are not supported for single 44 * devices. 45 */ 46 typedef struct MemoryDeviceClass { 47 /* private */ 48 InterfaceClass parent_class; 49 50 /* 51 * Return the address of the memory device in guest physical memory. 52 * 53 * Called when (un)plugging a memory device or when iterating over 54 * all memory devices mapped into guest physical address space. 55 * 56 * If "0" is returned, no address has been specified by the user and 57 * no address has been assigned to this memory device yet. 58 */ 59 uint64_t (*get_addr)(const MemoryDeviceState *md); 60 61 /* 62 * Set the address of the memory device in guest physical memory. 63 * 64 * Called when plugging the memory device to configure the determined 65 * address in guest physical memory. 66 */ 67 void (*set_addr)(MemoryDeviceState *md, uint64_t addr, Error **errp); 68 69 /* 70 * Return the amount of memory provided by the memory device currently 71 * usable ("plugged") by the VM. 72 * 73 * Called when calculating the total amount of ram available to the 74 * VM (e.g. to report memory stats to the user). 75 * 76 * This is helpful for devices that dynamically manage the amount of 77 * memory accessible by the guest via the reserved memory region. For 78 * most devices, this corresponds to the size of the memory region. 79 */ 80 uint64_t (*get_plugged_size)(const MemoryDeviceState *md, Error **errp); 81 82 /* 83 * Return the memory region of the memory device. 84 * 85 * Called when (un)plugging the memory device, to (un)map the 86 * memory region in guest physical memory, but also to detect the 87 * required alignment during address assignment or when the size of the 88 * memory region is required. 89 */ 90 MemoryRegion *(*get_memory_region)(MemoryDeviceState *md, Error **errp); 91 92 /* 93 * Translate the memory device into #MemoryDeviceInfo. 94 */ 95 void (*fill_device_info)(const MemoryDeviceState *md, 96 MemoryDeviceInfo *info); 97 } MemoryDeviceClass; 98 99 MemoryDeviceInfoList *qmp_memory_device_list(void); 100 uint64_t get_plugged_memory_size(void); 101 void memory_device_pre_plug(MemoryDeviceState *md, MachineState *ms, 102 const uint64_t *legacy_align, Error **errp); 103 void memory_device_plug(MemoryDeviceState *md, MachineState *ms); 104 void memory_device_unplug(MemoryDeviceState *md, MachineState *ms); 105 uint64_t memory_device_get_region_size(const MemoryDeviceState *md, 106 Error **errp); 107 108 #endif 109