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 DEFAULT_PC_DIMMSIZE (1024*1024*1024)
24
25#define TYPE_PC_DIMM "pc-dimm"
26#define PC_DIMM(obj) \
27 OBJECT_CHECK(PCDIMMDevice, (obj), TYPE_PC_DIMM)
28#define PC_DIMM_CLASS(oc) \
29 OBJECT_CLASS_CHECK(PCDIMMDeviceClass, (oc), TYPE_PC_DIMM)
30#define PC_DIMM_GET_CLASS(obj) \
31 OBJECT_GET_CLASS(PCDIMMDeviceClass, (obj), TYPE_PC_DIMM)
32
33#define PC_DIMM_ADDR_PROP "addr"
34#define PC_DIMM_SLOT_PROP "slot"
35#define PC_DIMM_NODE_PROP "node"
36#define PC_DIMM_SIZE_PROP "size"
37#define PC_DIMM_MEMDEV_PROP "memdev"
38
39#define PC_DIMM_UNASSIGNED_SLOT -1
40
41
42
43
44
45
46
47
48
49
50typedef struct PCDIMMDevice {
51
52 DeviceState parent_obj;
53
54
55 uint64_t addr;
56 uint32_t node;
57 int32_t slot;
58 HostMemoryBackend *hostmem;
59} PCDIMMDevice;
60
61
62
63
64
65typedef struct PCDIMMDeviceClass {
66
67 DeviceClass parent_class;
68
69
70 MemoryRegion *(*get_memory_region)(PCDIMMDevice *dimm);
71} PCDIMMDeviceClass;
72
73
74
75
76
77
78
79typedef struct MemoryHotplugState {
80 hwaddr base;
81 MemoryRegion mr;
82} MemoryHotplugState;
83
84uint64_t pc_dimm_get_free_addr(uint64_t address_space_start,
85 uint64_t address_space_size,
86 uint64_t *hint, uint64_t align, uint64_t size,
87 Error **errp);
88
89int pc_dimm_get_free_slot(const int *hint, int max_slots, Error **errp);
90
91int qmp_pc_dimm_device_list(Object *obj, void *opaque);
92uint64_t pc_existing_dimms_capacity(Error **errp);
93void pc_dimm_memory_plug(DeviceState *dev, MemoryHotplugState *hpms,
94 MemoryRegion *mr, uint64_t align, Error **errp);
95void pc_dimm_memory_unplug(DeviceState *dev, MemoryHotplugState *hpms,
96 MemoryRegion *mr);
97#endif
98