xref: /openbmc/linux/drivers/nvdimm/virtio_pmem.h (revision 6e84200c)
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