1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#ifndef QEMU_PC_DIMM_H
17#define QEMU_PC_DIMM_H
18
19#include "exec/memory.h"
20#include "sysemu/hostmem.h"
21#include "hw/qdev.h"
22
23#define TYPE_PC_DIMM "pc-dimm"
24#define PC_DIMM(obj) \
25 OBJECT_CHECK(PCDIMMDevice, (obj), TYPE_PC_DIMM)
26#define PC_DIMM_CLASS(oc) \
27 OBJECT_CLASS_CHECK(PCDIMMDeviceClass, (oc), TYPE_PC_DIMM)
28#define PC_DIMM_GET_CLASS(obj) \
29 OBJECT_GET_CLASS(PCDIMMDeviceClass, (obj), TYPE_PC_DIMM)
30
31#define PC_DIMM_ADDR_PROP "addr"
32#define PC_DIMM_SLOT_PROP "slot"
33#define PC_DIMM_NODE_PROP "node"
34#define PC_DIMM_SIZE_PROP "size"
35#define PC_DIMM_MEMDEV_PROP "memdev"
36
37#define PC_DIMM_UNASSIGNED_SLOT -1
38
39
40
41
42
43
44
45
46
47
48typedef struct PCDIMMDevice {
49
50 DeviceState parent_obj;
51
52
53 uint64_t addr;
54 uint32_t node;
55 int32_t slot;
56 HostMemoryBackend *hostmem;
57} PCDIMMDevice;
58
59
60
61
62
63
64
65
66
67
68typedef struct PCDIMMDeviceClass {
69
70 DeviceClass parent_class;
71
72
73 void (*realize)(PCDIMMDevice *dimm, Error **errp);
74 MemoryRegion *(*get_memory_region)(PCDIMMDevice *dimm, Error **errp);
75 MemoryRegion *(*get_vmstate_memory_region)(PCDIMMDevice *dimm);
76} PCDIMMDeviceClass;
77
78
79
80
81
82
83
84typedef struct MemoryHotplugState {
85 hwaddr base;
86 MemoryRegion mr;
87} MemoryHotplugState;
88
89uint64_t pc_dimm_get_free_addr(uint64_t address_space_start,
90 uint64_t address_space_size,
91 uint64_t *hint, uint64_t align, uint64_t size,
92 Error **errp);
93
94int pc_dimm_get_free_slot(const int *hint, int max_slots, Error **errp);
95
96int qmp_pc_dimm_device_list(Object *obj, void *opaque);
97uint64_t pc_existing_dimms_capacity(Error **errp);
98uint64_t get_plugged_memory_size(void);
99void pc_dimm_memory_plug(DeviceState *dev, MemoryHotplugState *hpms,
100 MemoryRegion *mr, uint64_t align, Error **errp);
101void pc_dimm_memory_unplug(DeviceState *dev, MemoryHotplugState *hpms,
102 MemoryRegion *mr);
103#endif
104