16e84200cSPankaj Gupta /* SPDX-License-Identifier: GPL-2.0 */ 26e84200cSPankaj Gupta /* 36e84200cSPankaj Gupta * virtio_pmem.h: virtio pmem Driver 46e84200cSPankaj Gupta * 56e84200cSPankaj Gupta * Discovers persistent memory range information 66e84200cSPankaj Gupta * from host and provides a virtio based flushing 76e84200cSPankaj Gupta * interface. 86e84200cSPankaj Gupta **/ 96e84200cSPankaj Gupta 106e84200cSPankaj Gupta #ifndef _LINUX_VIRTIO_PMEM_H 116e84200cSPankaj Gupta #define _LINUX_VIRTIO_PMEM_H 126e84200cSPankaj Gupta 136e84200cSPankaj Gupta #include <linux/module.h> 146e84200cSPankaj Gupta #include <uapi/linux/virtio_pmem.h> 156e84200cSPankaj Gupta #include <linux/libnvdimm.h> 166e84200cSPankaj Gupta #include <linux/spinlock.h> 176e84200cSPankaj Gupta 186e84200cSPankaj Gupta struct virtio_pmem_request { 196e84200cSPankaj Gupta struct virtio_pmem_req req; 206e84200cSPankaj Gupta struct virtio_pmem_resp resp; 216e84200cSPankaj Gupta 226e84200cSPankaj Gupta /* Wait queue to process deferred work after ack from host */ 236e84200cSPankaj Gupta wait_queue_head_t host_acked; 246e84200cSPankaj Gupta bool done; 256e84200cSPankaj Gupta 266e84200cSPankaj Gupta /* Wait queue to process deferred work after virt queue buffer avail */ 276e84200cSPankaj Gupta wait_queue_head_t wq_buf; 286e84200cSPankaj Gupta bool wq_buf_avail; 296e84200cSPankaj Gupta struct list_head list; 306e84200cSPankaj Gupta }; 316e84200cSPankaj Gupta 326e84200cSPankaj Gupta struct virtio_pmem { 336e84200cSPankaj Gupta struct virtio_device *vdev; 346e84200cSPankaj Gupta 356e84200cSPankaj Gupta /* Virtio pmem request queue */ 366e84200cSPankaj Gupta struct virtqueue *req_vq; 376e84200cSPankaj Gupta 386e84200cSPankaj Gupta /* nvdimm bus registers virtio pmem device */ 396e84200cSPankaj Gupta struct nvdimm_bus *nvdimm_bus; 406e84200cSPankaj Gupta struct nvdimm_bus_descriptor nd_desc; 416e84200cSPankaj Gupta 426e84200cSPankaj Gupta /* List to store deferred work if virtqueue is full */ 436e84200cSPankaj Gupta struct list_head req_list; 446e84200cSPankaj Gupta 456e84200cSPankaj Gupta /* Synchronize virtqueue data */ 466e84200cSPankaj Gupta spinlock_t pmem_lock; 476e84200cSPankaj Gupta 486e84200cSPankaj Gupta /* Memory region information */ 496e84200cSPankaj Gupta __u64 start; 506e84200cSPankaj Gupta __u64 size; 516e84200cSPankaj Gupta }; 526e84200cSPankaj Gupta 536e84200cSPankaj Gupta void virtio_pmem_host_ack(struct virtqueue *vq); 546e84200cSPankaj Gupta int async_pmem_flush(struct nd_region *nd_region, struct bio *bio); 556e84200cSPankaj Gupta #endif 56