xref: /qemu/include/hw/mem/pc-dimm.h (revision 9f318f8f)
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"
2110b7e74bSVasilis Liaskovitis #include "hw/qdev.h"
2210b7e74bSVasilis Liaskovitis 
2310b7e74bSVasilis Liaskovitis #define TYPE_PC_DIMM "pc-dimm"
2410b7e74bSVasilis Liaskovitis #define PC_DIMM(obj) \
2510b7e74bSVasilis Liaskovitis     OBJECT_CHECK(PCDIMMDevice, (obj), TYPE_PC_DIMM)
2610b7e74bSVasilis Liaskovitis #define PC_DIMM_CLASS(oc) \
2710b7e74bSVasilis Liaskovitis     OBJECT_CLASS_CHECK(PCDIMMDeviceClass, (oc), TYPE_PC_DIMM)
2810b7e74bSVasilis Liaskovitis #define PC_DIMM_GET_CLASS(obj) \
2910b7e74bSVasilis Liaskovitis     OBJECT_GET_CLASS(PCDIMMDeviceClass, (obj), TYPE_PC_DIMM)
3010b7e74bSVasilis Liaskovitis 
3110b7e74bSVasilis Liaskovitis #define PC_DIMM_ADDR_PROP "addr"
3210b7e74bSVasilis Liaskovitis #define PC_DIMM_SLOT_PROP "slot"
3310b7e74bSVasilis Liaskovitis #define PC_DIMM_NODE_PROP "node"
3410b7e74bSVasilis Liaskovitis #define PC_DIMM_SIZE_PROP "size"
3510b7e74bSVasilis Liaskovitis #define PC_DIMM_MEMDEV_PROP "memdev"
3610b7e74bSVasilis Liaskovitis 
3710b7e74bSVasilis Liaskovitis #define PC_DIMM_UNASSIGNED_SLOT -1
3810b7e74bSVasilis Liaskovitis 
3910b7e74bSVasilis Liaskovitis /**
4010b7e74bSVasilis Liaskovitis  * PCDIMMDevice:
4110b7e74bSVasilis Liaskovitis  * @addr: starting guest physical address, where @PCDIMMDevice is mapped.
4210b7e74bSVasilis Liaskovitis  *         Default value: 0, means that address is auto-allocated.
4310b7e74bSVasilis Liaskovitis  * @node: numa node to which @PCDIMMDevice is attached.
4410b7e74bSVasilis Liaskovitis  * @slot: slot number into which @PCDIMMDevice is plugged in.
4510b7e74bSVasilis Liaskovitis  *        Default value: -1, means that slot is auto-allocated.
4610b7e74bSVasilis Liaskovitis  * @hostmem: host memory backend providing memory for @PCDIMMDevice
4710b7e74bSVasilis Liaskovitis  */
4810b7e74bSVasilis Liaskovitis typedef struct PCDIMMDevice {
4910b7e74bSVasilis Liaskovitis     /* private */
5010b7e74bSVasilis Liaskovitis     DeviceState parent_obj;
5110b7e74bSVasilis Liaskovitis 
5210b7e74bSVasilis Liaskovitis     /* public */
5310b7e74bSVasilis Liaskovitis     uint64_t addr;
5410b7e74bSVasilis Liaskovitis     uint32_t node;
5510b7e74bSVasilis Liaskovitis     int32_t slot;
5610b7e74bSVasilis Liaskovitis     HostMemoryBackend *hostmem;
5710b7e74bSVasilis Liaskovitis } PCDIMMDevice;
5810b7e74bSVasilis Liaskovitis 
5910b7e74bSVasilis Liaskovitis /**
6010b7e74bSVasilis Liaskovitis  * PCDIMMDeviceClass:
61*9f318f8fSXiao Guangrong  * @realize: called after common dimm is realized so that the dimm based
62*9f318f8fSXiao Guangrong  * devices get the chance to do specified operations.
633c3e88a8SXiao Guangrong  * @get_memory_region: returns #MemoryRegion associated with @dimm which
643c3e88a8SXiao Guangrong  * is directly mapped into the physical address space of guest
6510b7e74bSVasilis Liaskovitis  */
6610b7e74bSVasilis Liaskovitis typedef struct PCDIMMDeviceClass {
6710b7e74bSVasilis Liaskovitis     /* private */
6810b7e74bSVasilis Liaskovitis     DeviceClass parent_class;
6910b7e74bSVasilis Liaskovitis 
7010b7e74bSVasilis Liaskovitis     /* public */
71*9f318f8fSXiao Guangrong     void (*realize)(PCDIMMDevice *dimm, Error **errp);
7210b7e74bSVasilis Liaskovitis     MemoryRegion *(*get_memory_region)(PCDIMMDevice *dimm);
7310b7e74bSVasilis Liaskovitis } PCDIMMDeviceClass;
7410b7e74bSVasilis Liaskovitis 
75a7d69ff1SBharata B Rao /**
76a7d69ff1SBharata B Rao  * MemoryHotplugState:
7707fcd59dSCao jin  * @base: address in guest physical address space where hotplug memory
78a7d69ff1SBharata B Rao  * address space begins.
79a7d69ff1SBharata B Rao  * @mr: hotplug memory address space container
80a7d69ff1SBharata B Rao  */
81a7d69ff1SBharata B Rao typedef struct MemoryHotplugState {
82adcb4ee6SDavid Gibson     hwaddr base;
83a7d69ff1SBharata B Rao     MemoryRegion mr;
84a7d69ff1SBharata B Rao } MemoryHotplugState;
85a7d69ff1SBharata B Rao 
860b312571SIgor Mammedov uint64_t pc_dimm_get_free_addr(uint64_t address_space_start,
870b312571SIgor Mammedov                                uint64_t address_space_size,
88d6a9b0b8SMichael S. Tsirkin                                uint64_t *hint, uint64_t align, uint64_t size,
89d6a9b0b8SMichael S. Tsirkin                                Error **errp);
900cd03d89SIgor Mammedov 
910cd03d89SIgor Mammedov int pc_dimm_get_free_slot(const int *hint, int max_slots, Error **errp);
926f2e2730SIgor Mammedov 
936f2e2730SIgor Mammedov int qmp_pc_dimm_device_list(Object *obj, void *opaque);
9437153450SBharata B Rao uint64_t pc_existing_dimms_capacity(Error **errp);
9543bbb49eSBharata B Rao void pc_dimm_memory_plug(DeviceState *dev, MemoryHotplugState *hpms,
96d6a9b0b8SMichael S. Tsirkin                          MemoryRegion *mr, uint64_t align, Error **errp);
9743bbb49eSBharata B Rao void pc_dimm_memory_unplug(DeviceState *dev, MemoryHotplugState *hpms,
9843bbb49eSBharata B Rao                            MemoryRegion *mr);
9910b7e74bSVasilis Liaskovitis #endif
100