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