xref: /qemu/include/hw/mem/pc-dimm.h (revision a27bd6c7)
110b7e74bSVasilis Liaskovitis /*
210b7e74bSVasilis Liaskovitis  * PC DIMM device
310b7e74bSVasilis Liaskovitis  *
410b7e74bSVasilis Liaskovitis  * Copyright ProfitBricks GmbH 2012
510b7e74bSVasilis Liaskovitis  * Copyright (C) 2013-2014 Red Hat Inc
610b7e74bSVasilis Liaskovitis  *
710b7e74bSVasilis Liaskovitis  * Authors:
810b7e74bSVasilis Liaskovitis  *  Vasilis Liaskovitis <vasilis.liaskovitis@profitbricks.com>
910b7e74bSVasilis Liaskovitis  *  Igor Mammedov <imammedo@redhat.com>
1010b7e74bSVasilis Liaskovitis  *
1110b7e74bSVasilis Liaskovitis  * This work is licensed under the terms of the GNU GPL, version 2 or later.
1210b7e74bSVasilis Liaskovitis  * See the COPYING file in the top-level directory.
1310b7e74bSVasilis Liaskovitis  *
1410b7e74bSVasilis Liaskovitis  */
1510b7e74bSVasilis Liaskovitis 
1610b7e74bSVasilis Liaskovitis #ifndef QEMU_PC_DIMM_H
1710b7e74bSVasilis Liaskovitis #define QEMU_PC_DIMM_H
1810b7e74bSVasilis Liaskovitis 
1910b7e74bSVasilis Liaskovitis #include "exec/memory.h"
2010b7e74bSVasilis Liaskovitis #include "sysemu/hostmem.h"
21*a27bd6c7SMarkus Armbruster #include "hw/qdev-core.h"
22b0c14ec4SDavid Hildenbrand #include "hw/boards.h"
2310b7e74bSVasilis Liaskovitis 
2410b7e74bSVasilis Liaskovitis #define TYPE_PC_DIMM "pc-dimm"
2510b7e74bSVasilis Liaskovitis #define PC_DIMM(obj) \
2610b7e74bSVasilis Liaskovitis     OBJECT_CHECK(PCDIMMDevice, (obj), TYPE_PC_DIMM)
2710b7e74bSVasilis Liaskovitis #define PC_DIMM_CLASS(oc) \
2810b7e74bSVasilis Liaskovitis     OBJECT_CLASS_CHECK(PCDIMMDeviceClass, (oc), TYPE_PC_DIMM)
2910b7e74bSVasilis Liaskovitis #define PC_DIMM_GET_CLASS(obj) \
3010b7e74bSVasilis Liaskovitis     OBJECT_GET_CLASS(PCDIMMDeviceClass, (obj), TYPE_PC_DIMM)
3110b7e74bSVasilis Liaskovitis 
3210b7e74bSVasilis Liaskovitis #define PC_DIMM_ADDR_PROP "addr"
3310b7e74bSVasilis Liaskovitis #define PC_DIMM_SLOT_PROP "slot"
3410b7e74bSVasilis Liaskovitis #define PC_DIMM_NODE_PROP "node"
3510b7e74bSVasilis Liaskovitis #define PC_DIMM_SIZE_PROP "size"
3610b7e74bSVasilis Liaskovitis #define PC_DIMM_MEMDEV_PROP "memdev"
3710b7e74bSVasilis Liaskovitis 
3810b7e74bSVasilis Liaskovitis #define PC_DIMM_UNASSIGNED_SLOT -1
3910b7e74bSVasilis Liaskovitis 
4010b7e74bSVasilis Liaskovitis /**
4110b7e74bSVasilis Liaskovitis  * PCDIMMDevice:
4210b7e74bSVasilis Liaskovitis  * @addr: starting guest physical address, where @PCDIMMDevice is mapped.
4310b7e74bSVasilis Liaskovitis  *         Default value: 0, means that address is auto-allocated.
4410b7e74bSVasilis Liaskovitis  * @node: numa node to which @PCDIMMDevice is attached.
4510b7e74bSVasilis Liaskovitis  * @slot: slot number into which @PCDIMMDevice is plugged in.
4610b7e74bSVasilis Liaskovitis  *        Default value: -1, means that slot is auto-allocated.
4710b7e74bSVasilis Liaskovitis  * @hostmem: host memory backend providing memory for @PCDIMMDevice
4810b7e74bSVasilis Liaskovitis  */
4910b7e74bSVasilis Liaskovitis typedef struct PCDIMMDevice {
5010b7e74bSVasilis Liaskovitis     /* private */
5110b7e74bSVasilis Liaskovitis     DeviceState parent_obj;
5210b7e74bSVasilis Liaskovitis 
5310b7e74bSVasilis Liaskovitis     /* public */
5410b7e74bSVasilis Liaskovitis     uint64_t addr;
5510b7e74bSVasilis Liaskovitis     uint32_t node;
5610b7e74bSVasilis Liaskovitis     int32_t slot;
5710b7e74bSVasilis Liaskovitis     HostMemoryBackend *hostmem;
5810b7e74bSVasilis Liaskovitis } PCDIMMDevice;
5910b7e74bSVasilis Liaskovitis 
6010b7e74bSVasilis Liaskovitis /**
6110b7e74bSVasilis Liaskovitis  * PCDIMMDeviceClass:
629f318f8fSXiao Guangrong  * @realize: called after common dimm is realized so that the dimm based
639f318f8fSXiao Guangrong  * devices get the chance to do specified operations.
648df1426eSXiao Guangrong  * @get_vmstate_memory_region: returns #MemoryRegion which indicates the
65f0b7bca6SDavid Hildenbrand  * memory of @dimm should be kept during live migration. Will not fail
66f0b7bca6SDavid Hildenbrand  * after the device was realized.
6710b7e74bSVasilis Liaskovitis  */
6810b7e74bSVasilis Liaskovitis typedef struct PCDIMMDeviceClass {
6910b7e74bSVasilis Liaskovitis     /* private */
7010b7e74bSVasilis Liaskovitis     DeviceClass parent_class;
7110b7e74bSVasilis Liaskovitis 
7210b7e74bSVasilis Liaskovitis     /* public */
739f318f8fSXiao Guangrong     void (*realize)(PCDIMMDevice *dimm, Error **errp);
74a57d1911SDavid Hildenbrand     MemoryRegion *(*get_vmstate_memory_region)(PCDIMMDevice *dimm,
75a57d1911SDavid Hildenbrand                                                Error **errp);
7610b7e74bSVasilis Liaskovitis } PCDIMMDeviceClass;
7710b7e74bSVasilis Liaskovitis 
78fd3416f5SDavid Hildenbrand void pc_dimm_pre_plug(PCDIMMDevice *dimm, MachineState *machine,
79b0e62443SDavid Hildenbrand                       const uint64_t *legacy_align, Error **errp);
80fd3416f5SDavid Hildenbrand void pc_dimm_plug(PCDIMMDevice *dimm, MachineState *machine, Error **errp);
81fd3416f5SDavid Hildenbrand void pc_dimm_unplug(PCDIMMDevice *dimm, MachineState *machine);
8210b7e74bSVasilis Liaskovitis #endif
83