18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * virtio_pmem.h: virtio pmem Driver
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Discovers persistent memory range information
68c2ecf20Sopenharmony_ci * from host and provides a virtio based flushing
78c2ecf20Sopenharmony_ci * interface.
88c2ecf20Sopenharmony_ci **/
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#ifndef _LINUX_VIRTIO_PMEM_H
118c2ecf20Sopenharmony_ci#define _LINUX_VIRTIO_PMEM_H
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#include <linux/module.h>
148c2ecf20Sopenharmony_ci#include <uapi/linux/virtio_pmem.h>
158c2ecf20Sopenharmony_ci#include <linux/libnvdimm.h>
168c2ecf20Sopenharmony_ci#include <linux/spinlock.h>
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_cistruct virtio_pmem_request {
198c2ecf20Sopenharmony_ci	struct virtio_pmem_req req;
208c2ecf20Sopenharmony_ci	struct virtio_pmem_resp resp;
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_ci	/* Wait queue to process deferred work after ack from host */
238c2ecf20Sopenharmony_ci	wait_queue_head_t host_acked;
248c2ecf20Sopenharmony_ci	bool done;
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci	/* Wait queue to process deferred work after virt queue buffer avail */
278c2ecf20Sopenharmony_ci	wait_queue_head_t wq_buf;
288c2ecf20Sopenharmony_ci	bool wq_buf_avail;
298c2ecf20Sopenharmony_ci	struct list_head list;
308c2ecf20Sopenharmony_ci};
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_cistruct virtio_pmem {
338c2ecf20Sopenharmony_ci	struct virtio_device *vdev;
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci	/* Virtio pmem request queue */
368c2ecf20Sopenharmony_ci	struct virtqueue *req_vq;
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci	/* nvdimm bus registers virtio pmem device */
398c2ecf20Sopenharmony_ci	struct nvdimm_bus *nvdimm_bus;
408c2ecf20Sopenharmony_ci	struct nvdimm_bus_descriptor nd_desc;
418c2ecf20Sopenharmony_ci
428c2ecf20Sopenharmony_ci	/* List to store deferred work if virtqueue is full */
438c2ecf20Sopenharmony_ci	struct list_head req_list;
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	/* Synchronize virtqueue data */
468c2ecf20Sopenharmony_ci	spinlock_t pmem_lock;
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci	/* Memory region information */
498c2ecf20Sopenharmony_ci	__u64 start;
508c2ecf20Sopenharmony_ci	__u64 size;
518c2ecf20Sopenharmony_ci};
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_civoid virtio_pmem_host_ack(struct virtqueue *vq);
548c2ecf20Sopenharmony_ciint async_pmem_flush(struct nd_region *nd_region, struct bio *bio);
558c2ecf20Sopenharmony_ci#endif
56