Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (C) 2018-2020 Intel Corporation.
   4 * Copyright (C) 2020 Red Hat, Inc.
   5 *
   6 * Author: Tiwei Bie <tiwei.bie@intel.com>
   7 *         Jason Wang <jasowang@redhat.com>
   8 *
   9 * Thanks Michael S. Tsirkin for the valuable comments and
  10 * suggestions.  And thanks to Cunming Liang and Zhihong Wang for all
  11 * their supports.
  12 */
  13
  14#include <linux/kernel.h>
  15#include <linux/module.h>
  16#include <linux/cdev.h>
  17#include <linux/device.h>
  18#include <linux/mm.h>
  19#include <linux/slab.h>
  20#include <linux/iommu.h>
  21#include <linux/uuid.h>
  22#include <linux/vdpa.h>
  23#include <linux/nospec.h>
  24#include <linux/vhost.h>
  25
  26#include "vhost.h"
  27
  28enum {
  29	VHOST_VDPA_BACKEND_FEATURES =
  30	(1ULL << VHOST_BACKEND_F_IOTLB_MSG_V2) |
  31	(1ULL << VHOST_BACKEND_F_IOTLB_BATCH) |
  32	(1ULL << VHOST_BACKEND_F_IOTLB_ASID),
  33};
  34
  35#define VHOST_VDPA_DEV_MAX (1U << MINORBITS)
  36
  37#define VHOST_VDPA_IOTLB_BUCKETS 16
  38
  39struct vhost_vdpa_as {
  40	struct hlist_node hash_link;
  41	struct vhost_iotlb iotlb;
  42	u32 id;
  43};
  44
  45struct vhost_vdpa {
  46	struct vhost_dev vdev;
  47	struct iommu_domain *domain;
  48	struct vhost_virtqueue *vqs;
  49	struct completion completion;
  50	struct vdpa_device *vdpa;
  51	struct hlist_head as[VHOST_VDPA_IOTLB_BUCKETS];
  52	struct device dev;
  53	struct cdev cdev;
  54	atomic_t opened;
  55	u32 nvqs;
  56	int virtio_id;
  57	int minor;
  58	struct eventfd_ctx *config_ctx;
  59	int in_batch;
  60	struct vdpa_iova_range range;
  61	u32 batch_asid;
  62};
  63
  64static DEFINE_IDA(vhost_vdpa_ida);
  65
  66static dev_t vhost_vdpa_major;
  67
  68static void vhost_vdpa_iotlb_unmap(struct vhost_vdpa *v,
  69				   struct vhost_iotlb *iotlb, u64 start,
  70				   u64 last, u32 asid);
  71
  72static inline u32 iotlb_to_asid(struct vhost_iotlb *iotlb)
  73{
  74	struct vhost_vdpa_as *as = container_of(iotlb, struct
  75						vhost_vdpa_as, iotlb);
  76	return as->id;
  77}
  78
  79static struct vhost_vdpa_as *asid_to_as(struct vhost_vdpa *v, u32 asid)
  80{
  81	struct hlist_head *head = &v->as[asid % VHOST_VDPA_IOTLB_BUCKETS];
  82	struct vhost_vdpa_as *as;
  83
  84	hlist_for_each_entry(as, head, hash_link)
  85		if (as->id == asid)
  86			return as;
  87
  88	return NULL;
  89}
  90
  91static struct vhost_iotlb *asid_to_iotlb(struct vhost_vdpa *v, u32 asid)
  92{
  93	struct vhost_vdpa_as *as = asid_to_as(v, asid);
  94
  95	if (!as)
  96		return NULL;
  97
  98	return &as->iotlb;
  99}
 100
 101static struct vhost_vdpa_as *vhost_vdpa_alloc_as(struct vhost_vdpa *v, u32 asid)
 102{
 103	struct hlist_head *head = &v->as[asid % VHOST_VDPA_IOTLB_BUCKETS];
 104	struct vhost_vdpa_as *as;
 105
 106	if (asid_to_as(v, asid))
 107		return NULL;
 108
 109	if (asid >= v->vdpa->nas)
 110		return NULL;
 111
 112	as = kmalloc(sizeof(*as), GFP_KERNEL);
 113	if (!as)
 114		return NULL;
 115
 116	vhost_iotlb_init(&as->iotlb, 0, 0);
 117	as->id = asid;
 118	hlist_add_head(&as->hash_link, head);
 119
 120	return as;
 121}
 122
 123static struct vhost_vdpa_as *vhost_vdpa_find_alloc_as(struct vhost_vdpa *v,
 124						      u32 asid)
 125{
 126	struct vhost_vdpa_as *as = asid_to_as(v, asid);
 127
 128	if (as)
 129		return as;
 130
 131	return vhost_vdpa_alloc_as(v, asid);
 132}
 133
 134static int vhost_vdpa_remove_as(struct vhost_vdpa *v, u32 asid)
 135{
 136	struct vhost_vdpa_as *as = asid_to_as(v, asid);
 137
 138	if (!as)
 139		return -EINVAL;
 140
 141	hlist_del(&as->hash_link);
 142	vhost_vdpa_iotlb_unmap(v, &as->iotlb, 0ULL, 0ULL - 1, asid);
 143	kfree(as);
 144
 145	return 0;
 146}
 147
 148static void handle_vq_kick(struct vhost_work *work)
 149{
 150	struct vhost_virtqueue *vq = container_of(work, struct vhost_virtqueue,
 151						  poll.work);
 152	struct vhost_vdpa *v = container_of(vq->dev, struct vhost_vdpa, vdev);
 153	const struct vdpa_config_ops *ops = v->vdpa->config;
 154
 155	ops->kick_vq(v->vdpa, vq - v->vqs);
 156}
 157
 158static irqreturn_t vhost_vdpa_virtqueue_cb(void *private)
 159{
 160	struct vhost_virtqueue *vq = private;
 161	struct eventfd_ctx *call_ctx = vq->call_ctx.ctx;
 162
 163	if (call_ctx)
 164		eventfd_signal(call_ctx, 1);
 165
 166	return IRQ_HANDLED;
 167}
 168
 169static irqreturn_t vhost_vdpa_config_cb(void *private)
 170{
 171	struct vhost_vdpa *v = private;
 172	struct eventfd_ctx *config_ctx = v->config_ctx;
 173
 174	if (config_ctx)
 175		eventfd_signal(config_ctx, 1);
 176
 177	return IRQ_HANDLED;
 178}
 179
 180static void vhost_vdpa_setup_vq_irq(struct vhost_vdpa *v, u16 qid)
 181{
 182	struct vhost_virtqueue *vq = &v->vqs[qid];
 183	const struct vdpa_config_ops *ops = v->vdpa->config;
 184	struct vdpa_device *vdpa = v->vdpa;
 185	int ret, irq;
 186
 187	if (!ops->get_vq_irq)
 188		return;
 189
 190	irq = ops->get_vq_irq(vdpa, qid);
 191	if (irq < 0)
 192		return;
 193
 194	irq_bypass_unregister_producer(&vq->call_ctx.producer);
 195	if (!vq->call_ctx.ctx)
 196		return;
 197
 198	vq->call_ctx.producer.token = vq->call_ctx.ctx;
 199	vq->call_ctx.producer.irq = irq;
 200	ret = irq_bypass_register_producer(&vq->call_ctx.producer);
 201	if (unlikely(ret))
 202		dev_info(&v->dev, "vq %u, irq bypass producer (token %p) registration fails, ret =  %d\n",
 203			 qid, vq->call_ctx.producer.token, ret);
 204}
 205
 206static void vhost_vdpa_unsetup_vq_irq(struct vhost_vdpa *v, u16 qid)
 207{
 208	struct vhost_virtqueue *vq = &v->vqs[qid];
 209
 210	irq_bypass_unregister_producer(&vq->call_ctx.producer);
 211}
 212
 213static int vhost_vdpa_reset(struct vhost_vdpa *v)
 214{
 215	struct vdpa_device *vdpa = v->vdpa;
 216
 217	v->in_batch = 0;
 218
 219	return vdpa_reset(vdpa);
 220}
 221
 222static long vhost_vdpa_get_device_id(struct vhost_vdpa *v, u8 __user *argp)
 223{
 224	struct vdpa_device *vdpa = v->vdpa;
 225	const struct vdpa_config_ops *ops = vdpa->config;
 226	u32 device_id;
 227
 228	device_id = ops->get_device_id(vdpa);
 229
 230	if (copy_to_user(argp, &device_id, sizeof(device_id)))
 231		return -EFAULT;
 232
 233	return 0;
 234}
 235
 236static long vhost_vdpa_get_status(struct vhost_vdpa *v, u8 __user *statusp)
 237{
 238	struct vdpa_device *vdpa = v->vdpa;
 239	const struct vdpa_config_ops *ops = vdpa->config;
 240	u8 status;
 241
 242	status = ops->get_status(vdpa);
 243
 244	if (copy_to_user(statusp, &status, sizeof(status)))
 245		return -EFAULT;
 246
 247	return 0;
 248}
 249
 250static long vhost_vdpa_set_status(struct vhost_vdpa *v, u8 __user *statusp)
 251{
 252	struct vdpa_device *vdpa = v->vdpa;
 253	const struct vdpa_config_ops *ops = vdpa->config;
 254	u8 status, status_old;
 255	u32 nvqs = v->nvqs;
 256	int ret;
 257	u16 i;
 258
 259	if (copy_from_user(&status, statusp, sizeof(status)))
 260		return -EFAULT;
 261
 262	status_old = ops->get_status(vdpa);
 263
 264	/*
 265	 * Userspace shouldn't remove status bits unless reset the
 266	 * status to 0.
 267	 */
 268	if (status != 0 && (status_old & ~status) != 0)
 269		return -EINVAL;
 270
 271	if ((status_old & VIRTIO_CONFIG_S_DRIVER_OK) && !(status & VIRTIO_CONFIG_S_DRIVER_OK))
 272		for (i = 0; i < nvqs; i++)
 273			vhost_vdpa_unsetup_vq_irq(v, i);
 274
 275	if (status == 0) {
 276		ret = vdpa_reset(vdpa);
 277		if (ret)
 278			return ret;
 279	} else
 280		vdpa_set_status(vdpa, status);
 281
 282	if ((status & VIRTIO_CONFIG_S_DRIVER_OK) && !(status_old & VIRTIO_CONFIG_S_DRIVER_OK))
 283		for (i = 0; i < nvqs; i++)
 284			vhost_vdpa_setup_vq_irq(v, i);
 285
 286	return 0;
 287}
 288
 289static int vhost_vdpa_config_validate(struct vhost_vdpa *v,
 290				      struct vhost_vdpa_config *c)
 291{
 292	struct vdpa_device *vdpa = v->vdpa;
 293	size_t size = vdpa->config->get_config_size(vdpa);
 294
 295	if (c->len == 0 || c->off > size)
 296		return -EINVAL;
 297
 298	if (c->len > size - c->off)
 299		return -E2BIG;
 300
 301	return 0;
 302}
 303
 304static long vhost_vdpa_get_config(struct vhost_vdpa *v,
 305				  struct vhost_vdpa_config __user *c)
 306{
 307	struct vdpa_device *vdpa = v->vdpa;
 308	struct vhost_vdpa_config config;
 309	unsigned long size = offsetof(struct vhost_vdpa_config, buf);
 310	u8 *buf;
 311
 312	if (copy_from_user(&config, c, size))
 313		return -EFAULT;
 314	if (vhost_vdpa_config_validate(v, &config))
 315		return -EINVAL;
 316	buf = kvzalloc(config.len, GFP_KERNEL);
 317	if (!buf)
 318		return -ENOMEM;
 319
 320	vdpa_get_config(vdpa, config.off, buf, config.len);
 321
 322	if (copy_to_user(c->buf, buf, config.len)) {
 323		kvfree(buf);
 324		return -EFAULT;
 325	}
 326
 327	kvfree(buf);
 328	return 0;
 329}
 330
 331static long vhost_vdpa_set_config(struct vhost_vdpa *v,
 332				  struct vhost_vdpa_config __user *c)
 333{
 334	struct vdpa_device *vdpa = v->vdpa;
 335	struct vhost_vdpa_config config;
 336	unsigned long size = offsetof(struct vhost_vdpa_config, buf);
 337	u8 *buf;
 338
 339	if (copy_from_user(&config, c, size))
 340		return -EFAULT;
 341	if (vhost_vdpa_config_validate(v, &config))
 342		return -EINVAL;
 343
 344	buf = vmemdup_user(c->buf, config.len);
 345	if (IS_ERR(buf))
 346		return PTR_ERR(buf);
 347
 348	vdpa_set_config(vdpa, config.off, buf, config.len);
 349
 350	kvfree(buf);
 351	return 0;
 352}
 353
 354static bool vhost_vdpa_can_suspend(const struct vhost_vdpa *v)
 355{
 356	struct vdpa_device *vdpa = v->vdpa;
 357	const struct vdpa_config_ops *ops = vdpa->config;
 358
 359	return ops->suspend;
 360}
 361
 362static long vhost_vdpa_get_features(struct vhost_vdpa *v, u64 __user *featurep)
 363{
 364	struct vdpa_device *vdpa = v->vdpa;
 365	const struct vdpa_config_ops *ops = vdpa->config;
 366	u64 features;
 367
 368	features = ops->get_device_features(vdpa);
 369
 370	if (copy_to_user(featurep, &features, sizeof(features)))
 371		return -EFAULT;
 372
 373	return 0;
 374}
 375
 376static long vhost_vdpa_set_features(struct vhost_vdpa *v, u64 __user *featurep)
 377{
 378	struct vdpa_device *vdpa = v->vdpa;
 379	const struct vdpa_config_ops *ops = vdpa->config;
 380	u64 features;
 381
 382	/*
 383	 * It's not allowed to change the features after they have
 384	 * been negotiated.
 385	 */
 386	if (ops->get_status(vdpa) & VIRTIO_CONFIG_S_FEATURES_OK)
 387		return -EBUSY;
 388
 389	if (copy_from_user(&features, featurep, sizeof(features)))
 390		return -EFAULT;
 391
 392	if (vdpa_set_features(vdpa, features))
 393		return -EINVAL;
 394
 395	return 0;
 396}
 397
 398static long vhost_vdpa_get_vring_num(struct vhost_vdpa *v, u16 __user *argp)
 399{
 400	struct vdpa_device *vdpa = v->vdpa;
 401	const struct vdpa_config_ops *ops = vdpa->config;
 402	u16 num;
 403
 404	num = ops->get_vq_num_max(vdpa);
 405
 406	if (copy_to_user(argp, &num, sizeof(num)))
 407		return -EFAULT;
 408
 409	return 0;
 410}
 411
 412static void vhost_vdpa_config_put(struct vhost_vdpa *v)
 413{
 414	if (v->config_ctx) {
 415		eventfd_ctx_put(v->config_ctx);
 416		v->config_ctx = NULL;
 417	}
 418}
 419
 420static long vhost_vdpa_set_config_call(struct vhost_vdpa *v, u32 __user *argp)
 421{
 422	struct vdpa_callback cb;
 423	int fd;
 424	struct eventfd_ctx *ctx;
 425
 426	cb.callback = vhost_vdpa_config_cb;
 427	cb.private = v;
 428	if (copy_from_user(&fd, argp, sizeof(fd)))
 429		return  -EFAULT;
 430
 431	ctx = fd == VHOST_FILE_UNBIND ? NULL : eventfd_ctx_fdget(fd);
 432	swap(ctx, v->config_ctx);
 433
 434	if (!IS_ERR_OR_NULL(ctx))
 435		eventfd_ctx_put(ctx);
 436
 437	if (IS_ERR(v->config_ctx)) {
 438		long ret = PTR_ERR(v->config_ctx);
 439
 440		v->config_ctx = NULL;
 441		return ret;
 442	}
 443
 444	v->vdpa->config->set_config_cb(v->vdpa, &cb);
 445
 446	return 0;
 447}
 448
 449static long vhost_vdpa_get_iova_range(struct vhost_vdpa *v, u32 __user *argp)
 450{
 451	struct vhost_vdpa_iova_range range = {
 452		.first = v->range.first,
 453		.last = v->range.last,
 454	};
 455
 456	if (copy_to_user(argp, &range, sizeof(range)))
 457		return -EFAULT;
 458	return 0;
 459}
 460
 461static long vhost_vdpa_get_config_size(struct vhost_vdpa *v, u32 __user *argp)
 462{
 463	struct vdpa_device *vdpa = v->vdpa;
 464	const struct vdpa_config_ops *ops = vdpa->config;
 465	u32 size;
 466
 467	size = ops->get_config_size(vdpa);
 468
 469	if (copy_to_user(argp, &size, sizeof(size)))
 470		return -EFAULT;
 471
 472	return 0;
 473}
 474
 475static long vhost_vdpa_get_vqs_count(struct vhost_vdpa *v, u32 __user *argp)
 476{
 477	struct vdpa_device *vdpa = v->vdpa;
 478
 479	if (copy_to_user(argp, &vdpa->nvqs, sizeof(vdpa->nvqs)))
 480		return -EFAULT;
 481
 482	return 0;
 483}
 484
 485/* After a successful return of ioctl the device must not process more
 486 * virtqueue descriptors. The device can answer to read or writes of config
 487 * fields as if it were not suspended. In particular, writing to "queue_enable"
 488 * with a value of 1 will not make the device start processing buffers.
 489 */
 490static long vhost_vdpa_suspend(struct vhost_vdpa *v)
 491{
 492	struct vdpa_device *vdpa = v->vdpa;
 493	const struct vdpa_config_ops *ops = vdpa->config;
 494
 495	if (!ops->suspend)
 496		return -EOPNOTSUPP;
 497
 498	return ops->suspend(vdpa);
 499}
 500
 501static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v, unsigned int cmd,
 502				   void __user *argp)
 503{
 504	struct vdpa_device *vdpa = v->vdpa;
 505	const struct vdpa_config_ops *ops = vdpa->config;
 506	struct vdpa_vq_state vq_state;
 507	struct vdpa_callback cb;
 508	struct vhost_virtqueue *vq;
 509	struct vhost_vring_state s;
 510	u32 idx;
 511	long r;
 512
 513	r = get_user(idx, (u32 __user *)argp);
 514	if (r < 0)
 515		return r;
 516
 517	if (idx >= v->nvqs)
 518		return -ENOBUFS;
 519
 520	idx = array_index_nospec(idx, v->nvqs);
 521	vq = &v->vqs[idx];
 522
 523	switch (cmd) {
 524	case VHOST_VDPA_SET_VRING_ENABLE:
 525		if (copy_from_user(&s, argp, sizeof(s)))
 526			return -EFAULT;
 527		ops->set_vq_ready(vdpa, idx, s.num);
 528		return 0;
 529	case VHOST_VDPA_GET_VRING_GROUP:
 530		if (!ops->get_vq_group)
 531			return -EOPNOTSUPP;
 532		s.index = idx;
 533		s.num = ops->get_vq_group(vdpa, idx);
 534		if (s.num >= vdpa->ngroups)
 535			return -EIO;
 536		else if (copy_to_user(argp, &s, sizeof(s)))
 537			return -EFAULT;
 538		return 0;
 539	case VHOST_VDPA_SET_GROUP_ASID:
 540		if (copy_from_user(&s, argp, sizeof(s)))
 541			return -EFAULT;
 542		if (s.num >= vdpa->nas)
 543			return -EINVAL;
 544		if (!ops->set_group_asid)
 545			return -EOPNOTSUPP;
 546		return ops->set_group_asid(vdpa, idx, s.num);
 547	case VHOST_GET_VRING_BASE:
 548		r = ops->get_vq_state(v->vdpa, idx, &vq_state);
 549		if (r)
 550			return r;
 551
 552		vq->last_avail_idx = vq_state.split.avail_index;
 553		break;
 554	}
 555
 556	r = vhost_vring_ioctl(&v->vdev, cmd, argp);
 557	if (r)
 558		return r;
 559
 560	switch (cmd) {
 561	case VHOST_SET_VRING_ADDR:
 562		if (ops->set_vq_address(vdpa, idx,
 563					(u64)(uintptr_t)vq->desc,
 564					(u64)(uintptr_t)vq->avail,
 565					(u64)(uintptr_t)vq->used))
 566			r = -EINVAL;
 567		break;
 568
 569	case VHOST_SET_VRING_BASE:
 570		vq_state.split.avail_index = vq->last_avail_idx;
 571		if (ops->set_vq_state(vdpa, idx, &vq_state))
 572			r = -EINVAL;
 573		break;
 574
 575	case VHOST_SET_VRING_CALL:
 576		if (vq->call_ctx.ctx) {
 577			cb.callback = vhost_vdpa_virtqueue_cb;
 578			cb.private = vq;
 579		} else {
 580			cb.callback = NULL;
 581			cb.private = NULL;
 582		}
 583		ops->set_vq_cb(vdpa, idx, &cb);
 584		vhost_vdpa_setup_vq_irq(v, idx);
 585		break;
 586
 587	case VHOST_SET_VRING_NUM:
 588		ops->set_vq_num(vdpa, idx, vq->num);
 589		break;
 590	}
 591
 592	return r;
 593}
 594
 595static long vhost_vdpa_unlocked_ioctl(struct file *filep,
 596				      unsigned int cmd, unsigned long arg)
 597{
 598	struct vhost_vdpa *v = filep->private_data;
 599	struct vhost_dev *d = &v->vdev;
 600	void __user *argp = (void __user *)arg;
 601	u64 __user *featurep = argp;
 602	u64 features;
 603	long r = 0;
 604
 605	if (cmd == VHOST_SET_BACKEND_FEATURES) {
 606		if (copy_from_user(&features, featurep, sizeof(features)))
 607			return -EFAULT;
 608		if (features & ~(VHOST_VDPA_BACKEND_FEATURES |
 609				 BIT_ULL(VHOST_BACKEND_F_SUSPEND)))
 610			return -EOPNOTSUPP;
 611		if ((features & BIT_ULL(VHOST_BACKEND_F_SUSPEND)) &&
 612		     !vhost_vdpa_can_suspend(v))
 613			return -EOPNOTSUPP;
 614		vhost_set_backend_features(&v->vdev, features);
 615		return 0;
 616	}
 617
 618	mutex_lock(&d->mutex);
 619
 620	switch (cmd) {
 621	case VHOST_VDPA_GET_DEVICE_ID:
 622		r = vhost_vdpa_get_device_id(v, argp);
 623		break;
 624	case VHOST_VDPA_GET_STATUS:
 625		r = vhost_vdpa_get_status(v, argp);
 626		break;
 627	case VHOST_VDPA_SET_STATUS:
 628		r = vhost_vdpa_set_status(v, argp);
 629		break;
 630	case VHOST_VDPA_GET_CONFIG:
 631		r = vhost_vdpa_get_config(v, argp);
 632		break;
 633	case VHOST_VDPA_SET_CONFIG:
 634		r = vhost_vdpa_set_config(v, argp);
 635		break;
 636	case VHOST_GET_FEATURES:
 637		r = vhost_vdpa_get_features(v, argp);
 638		break;
 639	case VHOST_SET_FEATURES:
 640		r = vhost_vdpa_set_features(v, argp);
 641		break;
 642	case VHOST_VDPA_GET_VRING_NUM:
 643		r = vhost_vdpa_get_vring_num(v, argp);
 644		break;
 645	case VHOST_VDPA_GET_GROUP_NUM:
 646		if (copy_to_user(argp, &v->vdpa->ngroups,
 647				 sizeof(v->vdpa->ngroups)))
 648			r = -EFAULT;
 649		break;
 650	case VHOST_VDPA_GET_AS_NUM:
 651		if (copy_to_user(argp, &v->vdpa->nas, sizeof(v->vdpa->nas)))
 652			r = -EFAULT;
 653		break;
 654	case VHOST_SET_LOG_BASE:
 655	case VHOST_SET_LOG_FD:
 656		r = -ENOIOCTLCMD;
 657		break;
 658	case VHOST_VDPA_SET_CONFIG_CALL:
 659		r = vhost_vdpa_set_config_call(v, argp);
 660		break;
 661	case VHOST_GET_BACKEND_FEATURES:
 662		features = VHOST_VDPA_BACKEND_FEATURES;
 663		if (vhost_vdpa_can_suspend(v))
 664			features |= BIT_ULL(VHOST_BACKEND_F_SUSPEND);
 665		if (copy_to_user(featurep, &features, sizeof(features)))
 666			r = -EFAULT;
 667		break;
 668	case VHOST_VDPA_GET_IOVA_RANGE:
 669		r = vhost_vdpa_get_iova_range(v, argp);
 670		break;
 671	case VHOST_VDPA_GET_CONFIG_SIZE:
 672		r = vhost_vdpa_get_config_size(v, argp);
 673		break;
 674	case VHOST_VDPA_GET_VQS_COUNT:
 675		r = vhost_vdpa_get_vqs_count(v, argp);
 676		break;
 677	case VHOST_VDPA_SUSPEND:
 678		r = vhost_vdpa_suspend(v);
 679		break;
 680	default:
 681		r = vhost_dev_ioctl(&v->vdev, cmd, argp);
 682		if (r == -ENOIOCTLCMD)
 683			r = vhost_vdpa_vring_ioctl(v, cmd, argp);
 684		break;
 685	}
 686
 687	mutex_unlock(&d->mutex);
 688	return r;
 689}
 690static void vhost_vdpa_general_unmap(struct vhost_vdpa *v,
 691				     struct vhost_iotlb_map *map, u32 asid)
 692{
 693	struct vdpa_device *vdpa = v->vdpa;
 694	const struct vdpa_config_ops *ops = vdpa->config;
 695	if (ops->dma_map) {
 696		ops->dma_unmap(vdpa, asid, map->start, map->size);
 697	} else if (ops->set_map == NULL) {
 698		iommu_unmap(v->domain, map->start, map->size);
 699	}
 700}
 701
 702static void vhost_vdpa_pa_unmap(struct vhost_vdpa *v, struct vhost_iotlb *iotlb,
 703				u64 start, u64 last, u32 asid)
 704{
 705	struct vhost_dev *dev = &v->vdev;
 706	struct vhost_iotlb_map *map;
 707	struct page *page;
 708	unsigned long pfn, pinned;
 709
 710	while ((map = vhost_iotlb_itree_first(iotlb, start, last)) != NULL) {
 711		pinned = PFN_DOWN(map->size);
 712		for (pfn = PFN_DOWN(map->addr);
 713		     pinned > 0; pfn++, pinned--) {
 714			page = pfn_to_page(pfn);
 715			if (map->perm & VHOST_ACCESS_WO)
 716				set_page_dirty_lock(page);
 717			unpin_user_page(page);
 718		}
 719		atomic64_sub(PFN_DOWN(map->size), &dev->mm->pinned_vm);
 720		vhost_vdpa_general_unmap(v, map, asid);
 721		vhost_iotlb_map_free(iotlb, map);
 722	}
 723}
 724
 725static void vhost_vdpa_va_unmap(struct vhost_vdpa *v, struct vhost_iotlb *iotlb,
 726				u64 start, u64 last, u32 asid)
 727{
 728	struct vhost_iotlb_map *map;
 729	struct vdpa_map_file *map_file;
 730
 731	while ((map = vhost_iotlb_itree_first(iotlb, start, last)) != NULL) {
 732		map_file = (struct vdpa_map_file *)map->opaque;
 733		fput(map_file->file);
 734		kfree(map_file);
 735		vhost_vdpa_general_unmap(v, map, asid);
 736		vhost_iotlb_map_free(iotlb, map);
 737	}
 738}
 739
 740static void vhost_vdpa_iotlb_unmap(struct vhost_vdpa *v,
 741				   struct vhost_iotlb *iotlb, u64 start,
 742				   u64 last, u32 asid)
 743{
 744	struct vdpa_device *vdpa = v->vdpa;
 745
 746	if (vdpa->use_va)
 747		return vhost_vdpa_va_unmap(v, iotlb, start, last, asid);
 748
 749	return vhost_vdpa_pa_unmap(v, iotlb, start, last, asid);
 750}
 751
 752static int perm_to_iommu_flags(u32 perm)
 753{
 754	int flags = 0;
 755
 756	switch (perm) {
 757	case VHOST_ACCESS_WO:
 758		flags |= IOMMU_WRITE;
 759		break;
 760	case VHOST_ACCESS_RO:
 761		flags |= IOMMU_READ;
 762		break;
 763	case VHOST_ACCESS_RW:
 764		flags |= (IOMMU_WRITE | IOMMU_READ);
 765		break;
 766	default:
 767		WARN(1, "invalidate vhost IOTLB permission\n");
 768		break;
 769	}
 770
 771	return flags | IOMMU_CACHE;
 772}
 773
 774static int vhost_vdpa_map(struct vhost_vdpa *v, struct vhost_iotlb *iotlb,
 775			  u64 iova, u64 size, u64 pa, u32 perm, void *opaque)
 776{
 777	struct vhost_dev *dev = &v->vdev;
 778	struct vdpa_device *vdpa = v->vdpa;
 779	const struct vdpa_config_ops *ops = vdpa->config;
 780	u32 asid = iotlb_to_asid(iotlb);
 781	int r = 0;
 782
 783	r = vhost_iotlb_add_range_ctx(iotlb, iova, iova + size - 1,
 784				      pa, perm, opaque);
 785	if (r)
 786		return r;
 787
 788	if (ops->dma_map) {
 789		r = ops->dma_map(vdpa, asid, iova, size, pa, perm, opaque);
 790	} else if (ops->set_map) {
 791		if (!v->in_batch)
 792			r = ops->set_map(vdpa, asid, iotlb);
 793	} else {
 794		r = iommu_map(v->domain, iova, pa, size,
 795			      perm_to_iommu_flags(perm));
 796	}
 797	if (r) {
 798		vhost_iotlb_del_range(iotlb, iova, iova + size - 1);
 799		return r;
 800	}
 801
 802	if (!vdpa->use_va)
 803		atomic64_add(PFN_DOWN(size), &dev->mm->pinned_vm);
 804
 805	return 0;
 806}
 807
 808static void vhost_vdpa_unmap(struct vhost_vdpa *v,
 809			     struct vhost_iotlb *iotlb,
 810			     u64 iova, u64 size)
 811{
 812	struct vdpa_device *vdpa = v->vdpa;
 813	const struct vdpa_config_ops *ops = vdpa->config;
 814	u32 asid = iotlb_to_asid(iotlb);
 815
 816	vhost_vdpa_iotlb_unmap(v, iotlb, iova, iova + size - 1, asid);
 817
 818	if (ops->set_map) {
 819		if (!v->in_batch)
 820			ops->set_map(vdpa, asid, iotlb);
 821	}
 822	/* If we are in the middle of batch processing, delay the free
 823	 * of AS until BATCH_END.
 824	 */
 825	if (!v->in_batch && !iotlb->nmaps)
 826		vhost_vdpa_remove_as(v, asid);
 827}
 828
 829static int vhost_vdpa_va_map(struct vhost_vdpa *v,
 830			     struct vhost_iotlb *iotlb,
 831			     u64 iova, u64 size, u64 uaddr, u32 perm)
 832{
 833	struct vhost_dev *dev = &v->vdev;
 834	u64 offset, map_size, map_iova = iova;
 835	struct vdpa_map_file *map_file;
 836	struct vm_area_struct *vma;
 837	int ret = 0;
 838
 839	mmap_read_lock(dev->mm);
 840
 841	while (size) {
 842		vma = find_vma(dev->mm, uaddr);
 843		if (!vma) {
 844			ret = -EINVAL;
 845			break;
 846		}
 847		map_size = min(size, vma->vm_end - uaddr);
 848		if (!(vma->vm_file && (vma->vm_flags & VM_SHARED) &&
 849			!(vma->vm_flags & (VM_IO | VM_PFNMAP))))
 850			goto next;
 851
 852		map_file = kzalloc(sizeof(*map_file), GFP_KERNEL);
 853		if (!map_file) {
 854			ret = -ENOMEM;
 855			break;
 856		}
 857		offset = (vma->vm_pgoff << PAGE_SHIFT) + uaddr - vma->vm_start;
 858		map_file->offset = offset;
 859		map_file->file = get_file(vma->vm_file);
 860		ret = vhost_vdpa_map(v, iotlb, map_iova, map_size, uaddr,
 861				     perm, map_file);
 862		if (ret) {
 863			fput(map_file->file);
 864			kfree(map_file);
 865			break;
 866		}
 867next:
 868		size -= map_size;
 869		uaddr += map_size;
 870		map_iova += map_size;
 871	}
 872	if (ret)
 873		vhost_vdpa_unmap(v, iotlb, iova, map_iova - iova);
 874
 875	mmap_read_unlock(dev->mm);
 876
 877	return ret;
 878}
 879
 880static int vhost_vdpa_pa_map(struct vhost_vdpa *v,
 881			     struct vhost_iotlb *iotlb,
 882			     u64 iova, u64 size, u64 uaddr, u32 perm)
 883{
 884	struct vhost_dev *dev = &v->vdev;
 885	struct page **page_list;
 886	unsigned long list_size = PAGE_SIZE / sizeof(struct page *);
 887	unsigned int gup_flags = FOLL_LONGTERM;
 888	unsigned long npages, cur_base, map_pfn, last_pfn = 0;
 889	unsigned long lock_limit, sz2pin, nchunks, i;
 890	u64 start = iova;
 891	long pinned;
 892	int ret = 0;
 893
 894	/* Limit the use of memory for bookkeeping */
 895	page_list = (struct page **) __get_free_page(GFP_KERNEL);
 896	if (!page_list)
 897		return -ENOMEM;
 898
 899	if (perm & VHOST_ACCESS_WO)
 900		gup_flags |= FOLL_WRITE;
 901
 902	npages = PFN_UP(size + (iova & ~PAGE_MASK));
 903	if (!npages) {
 904		ret = -EINVAL;
 905		goto free;
 906	}
 907
 908	mmap_read_lock(dev->mm);
 909
 910	lock_limit = PFN_DOWN(rlimit(RLIMIT_MEMLOCK));
 911	if (npages + atomic64_read(&dev->mm->pinned_vm) > lock_limit) {
 912		ret = -ENOMEM;
 913		goto unlock;
 914	}
 915
 916	cur_base = uaddr & PAGE_MASK;
 917	iova &= PAGE_MASK;
 918	nchunks = 0;
 919
 920	while (npages) {
 921		sz2pin = min_t(unsigned long, npages, list_size);
 922		pinned = pin_user_pages(cur_base, sz2pin,
 923					gup_flags, page_list, NULL);
 924		if (sz2pin != pinned) {
 925			if (pinned < 0) {
 926				ret = pinned;
 927			} else {
 928				unpin_user_pages(page_list, pinned);
 929				ret = -ENOMEM;
 930			}
 931			goto out;
 932		}
 933		nchunks++;
 934
 935		if (!last_pfn)
 936			map_pfn = page_to_pfn(page_list[0]);
 937
 938		for (i = 0; i < pinned; i++) {
 939			unsigned long this_pfn = page_to_pfn(page_list[i]);
 940			u64 csize;
 941
 942			if (last_pfn && (this_pfn != last_pfn + 1)) {
 943				/* Pin a contiguous chunk of memory */
 944				csize = PFN_PHYS(last_pfn - map_pfn + 1);
 945				ret = vhost_vdpa_map(v, iotlb, iova, csize,
 946						     PFN_PHYS(map_pfn),
 947						     perm, NULL);
 948				if (ret) {
 949					/*
 950					 * Unpin the pages that are left unmapped
 951					 * from this point on in the current
 952					 * page_list. The remaining outstanding
 953					 * ones which may stride across several
 954					 * chunks will be covered in the common
 955					 * error path subsequently.
 956					 */
 957					unpin_user_pages(&page_list[i],
 958							 pinned - i);
 959					goto out;
 960				}
 961
 962				map_pfn = this_pfn;
 963				iova += csize;
 964				nchunks = 0;
 965			}
 966
 967			last_pfn = this_pfn;
 968		}
 969
 970		cur_base += PFN_PHYS(pinned);
 971		npages -= pinned;
 972	}
 973
 974	/* Pin the rest chunk */
 975	ret = vhost_vdpa_map(v, iotlb, iova, PFN_PHYS(last_pfn - map_pfn + 1),
 976			     PFN_PHYS(map_pfn), perm, NULL);
 977out:
 978	if (ret) {
 979		if (nchunks) {
 980			unsigned long pfn;
 981
 982			/*
 983			 * Unpin the outstanding pages which are yet to be
 984			 * mapped but haven't due to vdpa_map() or
 985			 * pin_user_pages() failure.
 986			 *
 987			 * Mapped pages are accounted in vdpa_map(), hence
 988			 * the corresponding unpinning will be handled by
 989			 * vdpa_unmap().
 990			 */
 991			WARN_ON(!last_pfn);
 992			for (pfn = map_pfn; pfn <= last_pfn; pfn++)
 993				unpin_user_page(pfn_to_page(pfn));
 994		}
 995		vhost_vdpa_unmap(v, iotlb, start, size);
 996	}
 997unlock:
 998	mmap_read_unlock(dev->mm);
 999free:
1000	free_page((unsigned long)page_list);
1001	return ret;
1002
1003}
1004
1005static int vhost_vdpa_process_iotlb_update(struct vhost_vdpa *v,
1006					   struct vhost_iotlb *iotlb,
1007					   struct vhost_iotlb_msg *msg)
1008{
1009	struct vdpa_device *vdpa = v->vdpa;
1010
1011	if (msg->iova < v->range.first || !msg->size ||
1012	    msg->iova > U64_MAX - msg->size + 1 ||
1013	    msg->iova + msg->size - 1 > v->range.last)
1014		return -EINVAL;
1015
1016	if (vhost_iotlb_itree_first(iotlb, msg->iova,
1017				    msg->iova + msg->size - 1))
1018		return -EEXIST;
1019
1020	if (vdpa->use_va)
1021		return vhost_vdpa_va_map(v, iotlb, msg->iova, msg->size,
1022					 msg->uaddr, msg->perm);
1023
1024	return vhost_vdpa_pa_map(v, iotlb, msg->iova, msg->size, msg->uaddr,
1025				 msg->perm);
1026}
1027
1028static int vhost_vdpa_process_iotlb_msg(struct vhost_dev *dev, u32 asid,
1029					struct vhost_iotlb_msg *msg)
1030{
1031	struct vhost_vdpa *v = container_of(dev, struct vhost_vdpa, vdev);
1032	struct vdpa_device *vdpa = v->vdpa;
1033	const struct vdpa_config_ops *ops = vdpa->config;
1034	struct vhost_iotlb *iotlb = NULL;
1035	struct vhost_vdpa_as *as = NULL;
1036	int r = 0;
1037
1038	mutex_lock(&dev->mutex);
1039
1040	r = vhost_dev_check_owner(dev);
1041	if (r)
1042		goto unlock;
1043
1044	if (msg->type == VHOST_IOTLB_UPDATE ||
1045	    msg->type == VHOST_IOTLB_BATCH_BEGIN) {
1046		as = vhost_vdpa_find_alloc_as(v, asid);
1047		if (!as) {
1048			dev_err(&v->dev, "can't find and alloc asid %d\n",
1049				asid);
1050			r = -EINVAL;
1051			goto unlock;
1052		}
1053		iotlb = &as->iotlb;
1054	} else
1055		iotlb = asid_to_iotlb(v, asid);
1056
1057	if ((v->in_batch && v->batch_asid != asid) || !iotlb) {
1058		if (v->in_batch && v->batch_asid != asid) {
1059			dev_info(&v->dev, "batch id %d asid %d\n",
1060				 v->batch_asid, asid);
1061		}
1062		if (!iotlb)
1063			dev_err(&v->dev, "no iotlb for asid %d\n", asid);
1064		r = -EINVAL;
1065		goto unlock;
1066	}
1067
1068	switch (msg->type) {
1069	case VHOST_IOTLB_UPDATE:
1070		r = vhost_vdpa_process_iotlb_update(v, iotlb, msg);
1071		break;
1072	case VHOST_IOTLB_INVALIDATE:
1073		vhost_vdpa_unmap(v, iotlb, msg->iova, msg->size);
1074		break;
1075	case VHOST_IOTLB_BATCH_BEGIN:
1076		v->batch_asid = asid;
1077		v->in_batch = true;
1078		break;
1079	case VHOST_IOTLB_BATCH_END:
1080		if (v->in_batch && ops->set_map)
1081			ops->set_map(vdpa, asid, iotlb);
1082		v->in_batch = false;
1083		if (!iotlb->nmaps)
1084			vhost_vdpa_remove_as(v, asid);
1085		break;
1086	default:
1087		r = -EINVAL;
1088		break;
1089	}
1090unlock:
1091	mutex_unlock(&dev->mutex);
1092
1093	return r;
1094}
1095
1096static ssize_t vhost_vdpa_chr_write_iter(struct kiocb *iocb,
1097					 struct iov_iter *from)
1098{
1099	struct file *file = iocb->ki_filp;
1100	struct vhost_vdpa *v = file->private_data;
1101	struct vhost_dev *dev = &v->vdev;
1102
1103	return vhost_chr_write_iter(dev, from);
1104}
1105
1106static int vhost_vdpa_alloc_domain(struct vhost_vdpa *v)
1107{
1108	struct vdpa_device *vdpa = v->vdpa;
1109	const struct vdpa_config_ops *ops = vdpa->config;
1110	struct device *dma_dev = vdpa_get_dma_dev(vdpa);
1111	struct bus_type *bus;
1112	int ret;
1113
1114	/* Device want to do DMA by itself */
1115	if (ops->set_map || ops->dma_map)
1116		return 0;
1117
1118	bus = dma_dev->bus;
1119	if (!bus)
1120		return -EFAULT;
1121
1122	if (!device_iommu_capable(dma_dev, IOMMU_CAP_CACHE_COHERENCY))
1123		return -ENOTSUPP;
1124
1125	v->domain = iommu_domain_alloc(bus);
1126	if (!v->domain)
1127		return -EIO;
1128
1129	ret = iommu_attach_device(v->domain, dma_dev);
1130	if (ret)
1131		goto err_attach;
1132
1133	return 0;
1134
1135err_attach:
1136	iommu_domain_free(v->domain);
1137	return ret;
1138}
1139
1140static void vhost_vdpa_free_domain(struct vhost_vdpa *v)
1141{
1142	struct vdpa_device *vdpa = v->vdpa;
1143	struct device *dma_dev = vdpa_get_dma_dev(vdpa);
1144
1145	if (v->domain) {
1146		iommu_detach_device(v->domain, dma_dev);
1147		iommu_domain_free(v->domain);
1148	}
1149
1150	v->domain = NULL;
1151}
1152
1153static void vhost_vdpa_set_iova_range(struct vhost_vdpa *v)
1154{
1155	struct vdpa_iova_range *range = &v->range;
1156	struct vdpa_device *vdpa = v->vdpa;
1157	const struct vdpa_config_ops *ops = vdpa->config;
1158
1159	if (ops->get_iova_range) {
1160		*range = ops->get_iova_range(vdpa);
1161	} else if (v->domain && v->domain->geometry.force_aperture) {
1162		range->first = v->domain->geometry.aperture_start;
1163		range->last = v->domain->geometry.aperture_end;
1164	} else {
1165		range->first = 0;
1166		range->last = ULLONG_MAX;
1167	}
1168}
1169
1170static void vhost_vdpa_cleanup(struct vhost_vdpa *v)
1171{
1172	struct vhost_vdpa_as *as;
1173	u32 asid;
1174
1175	for (asid = 0; asid < v->vdpa->nas; asid++) {
1176		as = asid_to_as(v, asid);
1177		if (as)
1178			vhost_vdpa_remove_as(v, asid);
1179	}
1180
1181	vhost_dev_cleanup(&v->vdev);
1182	kfree(v->vdev.vqs);
1183}
1184
1185static int vhost_vdpa_open(struct inode *inode, struct file *filep)
1186{
1187	struct vhost_vdpa *v;
1188	struct vhost_dev *dev;
1189	struct vhost_virtqueue **vqs;
1190	int r, opened;
1191	u32 i, nvqs;
1192
1193	v = container_of(inode->i_cdev, struct vhost_vdpa, cdev);
1194
1195	opened = atomic_cmpxchg(&v->opened, 0, 1);
1196	if (opened)
1197		return -EBUSY;
1198
1199	nvqs = v->nvqs;
1200	r = vhost_vdpa_reset(v);
1201	if (r)
1202		goto err;
1203
1204	vqs = kmalloc_array(nvqs, sizeof(*vqs), GFP_KERNEL);
1205	if (!vqs) {
1206		r = -ENOMEM;
1207		goto err;
1208	}
1209
1210	dev = &v->vdev;
1211	for (i = 0; i < nvqs; i++) {
1212		vqs[i] = &v->vqs[i];
1213		vqs[i]->handle_kick = handle_vq_kick;
1214	}
1215	vhost_dev_init(dev, vqs, nvqs, 0, 0, 0, false,
1216		       vhost_vdpa_process_iotlb_msg);
1217
1218	r = vhost_vdpa_alloc_domain(v);
1219	if (r)
1220		goto err_alloc_domain;
1221
1222	vhost_vdpa_set_iova_range(v);
1223
1224	filep->private_data = v;
1225
1226	return 0;
1227
1228err_alloc_domain:
1229	vhost_vdpa_cleanup(v);
1230err:
1231	atomic_dec(&v->opened);
1232	return r;
1233}
1234
1235static void vhost_vdpa_clean_irq(struct vhost_vdpa *v)
1236{
1237	u32 i;
1238
1239	for (i = 0; i < v->nvqs; i++)
1240		vhost_vdpa_unsetup_vq_irq(v, i);
1241}
1242
1243static int vhost_vdpa_release(struct inode *inode, struct file *filep)
1244{
1245	struct vhost_vdpa *v = filep->private_data;
1246	struct vhost_dev *d = &v->vdev;
1247
1248	mutex_lock(&d->mutex);
1249	filep->private_data = NULL;
1250	vhost_vdpa_clean_irq(v);
1251	vhost_vdpa_reset(v);
1252	vhost_dev_stop(&v->vdev);
1253	vhost_vdpa_free_domain(v);
1254	vhost_vdpa_config_put(v);
1255	vhost_vdpa_cleanup(v);
1256	mutex_unlock(&d->mutex);
1257
1258	atomic_dec(&v->opened);
1259	complete(&v->completion);
1260
1261	return 0;
1262}
1263
1264#ifdef CONFIG_MMU
1265static vm_fault_t vhost_vdpa_fault(struct vm_fault *vmf)
1266{
1267	struct vhost_vdpa *v = vmf->vma->vm_file->private_data;
1268	struct vdpa_device *vdpa = v->vdpa;
1269	const struct vdpa_config_ops *ops = vdpa->config;
1270	struct vdpa_notification_area notify;
1271	struct vm_area_struct *vma = vmf->vma;
1272	u16 index = vma->vm_pgoff;
1273
1274	notify = ops->get_vq_notification(vdpa, index);
1275
1276	vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
1277	if (remap_pfn_range(vma, vmf->address & PAGE_MASK,
1278			    PFN_DOWN(notify.addr), PAGE_SIZE,
1279			    vma->vm_page_prot))
1280		return VM_FAULT_SIGBUS;
1281
1282	return VM_FAULT_NOPAGE;
1283}
1284
1285static const struct vm_operations_struct vhost_vdpa_vm_ops = {
1286	.fault = vhost_vdpa_fault,
1287};
1288
1289static int vhost_vdpa_mmap(struct file *file, struct vm_area_struct *vma)
1290{
1291	struct vhost_vdpa *v = vma->vm_file->private_data;
1292	struct vdpa_device *vdpa = v->vdpa;
1293	const struct vdpa_config_ops *ops = vdpa->config;
1294	struct vdpa_notification_area notify;
1295	unsigned long index = vma->vm_pgoff;
1296
1297	if (vma->vm_end - vma->vm_start != PAGE_SIZE)
1298		return -EINVAL;
1299	if ((vma->vm_flags & VM_SHARED) == 0)
1300		return -EINVAL;
1301	if (vma->vm_flags & VM_READ)
1302		return -EINVAL;
1303	if (index > 65535)
1304		return -EINVAL;
1305	if (!ops->get_vq_notification)
1306		return -ENOTSUPP;
1307
1308	/* To be safe and easily modelled by userspace, We only
1309	 * support the doorbell which sits on the page boundary and
1310	 * does not share the page with other registers.
1311	 */
1312	notify = ops->get_vq_notification(vdpa, index);
1313	if (notify.addr & (PAGE_SIZE - 1))
1314		return -EINVAL;
1315	if (vma->vm_end - vma->vm_start != notify.size)
1316		return -ENOTSUPP;
1317
1318	vma->vm_flags |= VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP;
1319	vma->vm_ops = &vhost_vdpa_vm_ops;
1320	return 0;
1321}
1322#endif /* CONFIG_MMU */
1323
1324static const struct file_operations vhost_vdpa_fops = {
1325	.owner		= THIS_MODULE,
1326	.open		= vhost_vdpa_open,
1327	.release	= vhost_vdpa_release,
1328	.write_iter	= vhost_vdpa_chr_write_iter,
1329	.unlocked_ioctl	= vhost_vdpa_unlocked_ioctl,
1330#ifdef CONFIG_MMU
1331	.mmap		= vhost_vdpa_mmap,
1332#endif /* CONFIG_MMU */
1333	.compat_ioctl	= compat_ptr_ioctl,
1334};
1335
1336static void vhost_vdpa_release_dev(struct device *device)
1337{
1338	struct vhost_vdpa *v =
1339	       container_of(device, struct vhost_vdpa, dev);
1340
1341	ida_simple_remove(&vhost_vdpa_ida, v->minor);
1342	kfree(v->vqs);
1343	kfree(v);
1344}
1345
1346static int vhost_vdpa_probe(struct vdpa_device *vdpa)
1347{
1348	const struct vdpa_config_ops *ops = vdpa->config;
1349	struct vhost_vdpa *v;
1350	int minor;
1351	int i, r;
1352
1353	/* We can't support platform IOMMU device with more than 1
1354	 * group or as
1355	 */
1356	if (!ops->set_map && !ops->dma_map &&
1357	    (vdpa->ngroups > 1 || vdpa->nas > 1))
1358		return -EOPNOTSUPP;
1359
1360	v = kzalloc(sizeof(*v), GFP_KERNEL | __GFP_RETRY_MAYFAIL);
1361	if (!v)
1362		return -ENOMEM;
1363
1364	minor = ida_simple_get(&vhost_vdpa_ida, 0,
1365			       VHOST_VDPA_DEV_MAX, GFP_KERNEL);
1366	if (minor < 0) {
1367		kfree(v);
1368		return minor;
1369	}
1370
1371	atomic_set(&v->opened, 0);
1372	v->minor = minor;
1373	v->vdpa = vdpa;
1374	v->nvqs = vdpa->nvqs;
1375	v->virtio_id = ops->get_device_id(vdpa);
1376
1377	device_initialize(&v->dev);
1378	v->dev.release = vhost_vdpa_release_dev;
1379	v->dev.parent = &vdpa->dev;
1380	v->dev.devt = MKDEV(MAJOR(vhost_vdpa_major), minor);
1381	v->vqs = kmalloc_array(v->nvqs, sizeof(struct vhost_virtqueue),
1382			       GFP_KERNEL);
1383	if (!v->vqs) {
1384		r = -ENOMEM;
1385		goto err;
1386	}
1387
1388	r = dev_set_name(&v->dev, "vhost-vdpa-%u", minor);
1389	if (r)
1390		goto err;
1391
1392	cdev_init(&v->cdev, &vhost_vdpa_fops);
1393	v->cdev.owner = THIS_MODULE;
1394
1395	r = cdev_device_add(&v->cdev, &v->dev);
1396	if (r)
1397		goto err;
1398
1399	init_completion(&v->completion);
1400	vdpa_set_drvdata(vdpa, v);
1401
1402	for (i = 0; i < VHOST_VDPA_IOTLB_BUCKETS; i++)
1403		INIT_HLIST_HEAD(&v->as[i]);
1404
1405	return 0;
1406
1407err:
1408	put_device(&v->dev);
1409	ida_simple_remove(&vhost_vdpa_ida, v->minor);
1410	return r;
1411}
1412
1413static void vhost_vdpa_remove(struct vdpa_device *vdpa)
1414{
1415	struct vhost_vdpa *v = vdpa_get_drvdata(vdpa);
1416	int opened;
1417
1418	cdev_device_del(&v->cdev, &v->dev);
1419
1420	do {
1421		opened = atomic_cmpxchg(&v->opened, 0, 1);
1422		if (!opened)
1423			break;
1424		wait_for_completion(&v->completion);
1425	} while (1);
1426
1427	put_device(&v->dev);
1428}
1429
1430static struct vdpa_driver vhost_vdpa_driver = {
1431	.driver = {
1432		.name	= "vhost_vdpa",
1433	},
1434	.probe	= vhost_vdpa_probe,
1435	.remove	= vhost_vdpa_remove,
1436};
1437
1438static int __init vhost_vdpa_init(void)
1439{
1440	int r;
1441
1442	r = alloc_chrdev_region(&vhost_vdpa_major, 0, VHOST_VDPA_DEV_MAX,
1443				"vhost-vdpa");
1444	if (r)
1445		goto err_alloc_chrdev;
1446
1447	r = vdpa_register_driver(&vhost_vdpa_driver);
1448	if (r)
1449		goto err_vdpa_register_driver;
1450
1451	return 0;
1452
1453err_vdpa_register_driver:
1454	unregister_chrdev_region(vhost_vdpa_major, VHOST_VDPA_DEV_MAX);
1455err_alloc_chrdev:
1456	return r;
1457}
1458module_init(vhost_vdpa_init);
1459
1460static void __exit vhost_vdpa_exit(void)
1461{
1462	vdpa_unregister_driver(&vhost_vdpa_driver);
1463	unregister_chrdev_region(vhost_vdpa_major, VHOST_VDPA_DEV_MAX);
1464}
1465module_exit(vhost_vdpa_exit);
1466
1467MODULE_VERSION("0.0.1");
1468MODULE_LICENSE("GPL v2");
1469MODULE_AUTHOR("Intel Corporation");
1470MODULE_DESCRIPTION("vDPA-based vhost backend for virtio");