xref: /qemu/include/hw/mem/pc-dimm.h (revision db1015e92e04835c9eb50c29625fe566d1202dbd)
1 /*
2  * PC DIMM device
3  *
4  * Copyright ProfitBricks GmbH 2012
5  * Copyright (C) 2013-2014 Red Hat Inc
6  *
7  * Authors:
8  *  Vasilis Liaskovitis <vasilis.liaskovitis@profitbricks.com>
9  *  Igor Mammedov <imammedo@redhat.com>
10  *
11  * This work is licensed under the terms of the GNU GPL, version 2 or later.
12  * See the COPYING file in the top-level directory.
13  *
14  */
15 
16 #ifndef QEMU_PC_DIMM_H
17 #define QEMU_PC_DIMM_H
18 
19 #include "exec/memory.h"
20 #include "hw/qdev-core.h"
21 #include "qom/object.h"
22 
23 #define TYPE_PC_DIMM "pc-dimm"
24 typedef struct PCDIMMDevice PCDIMMDevice;
25 typedef struct PCDIMMDeviceClass PCDIMMDeviceClass;
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  * PCDIMMDevice:
43  * @addr: starting guest physical address, where @PCDIMMDevice is mapped.
44  *         Default value: 0, means that address is auto-allocated.
45  * @node: numa node to which @PCDIMMDevice is attached.
46  * @slot: slot number into which @PCDIMMDevice is plugged in.
47  *        Default value: -1, means that slot is auto-allocated.
48  * @hostmem: host memory backend providing memory for @PCDIMMDevice
49  */
50 struct PCDIMMDevice {
51     /* private */
52     DeviceState parent_obj;
53 
54     /* public */
55     uint64_t addr;
56     uint32_t node;
57     int32_t slot;
58     HostMemoryBackend *hostmem;
59 };
60 
61 /**
62  * PCDIMMDeviceClass:
63  * @realize: called after common dimm is realized so that the dimm based
64  * devices get the chance to do specified operations.
65  * @get_vmstate_memory_region: returns #MemoryRegion which indicates the
66  * memory of @dimm should be kept during live migration. Will not fail
67  * after the device was realized.
68  */
69 struct PCDIMMDeviceClass {
70     /* private */
71     DeviceClass parent_class;
72 
73     /* public */
74     void (*realize)(PCDIMMDevice *dimm, Error **errp);
75     MemoryRegion *(*get_vmstate_memory_region)(PCDIMMDevice *dimm,
76                                                Error **errp);
77 };
78 
79 void pc_dimm_pre_plug(PCDIMMDevice *dimm, MachineState *machine,
80                       const uint64_t *legacy_align, Error **errp);
81 void pc_dimm_plug(PCDIMMDevice *dimm, MachineState *machine, Error **errp);
82 void pc_dimm_unplug(PCDIMMDevice *dimm, MachineState *machine);
83 #endif
84