cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

vp_vdpa.c (16321B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * vDPA bridge driver for modern virtio-pci device
      4 *
      5 * Copyright (c) 2020, Red Hat Inc. All rights reserved.
      6 * Author: Jason Wang <jasowang@redhat.com>
      7 *
      8 * Based on virtio_pci_modern.c.
      9 */
     10
     11#include <linux/interrupt.h>
     12#include <linux/module.h>
     13#include <linux/pci.h>
     14#include <linux/vdpa.h>
     15#include <linux/virtio.h>
     16#include <linux/virtio_config.h>
     17#include <linux/virtio_ring.h>
     18#include <linux/virtio_pci.h>
     19#include <linux/virtio_pci_modern.h>
     20
     21#define VP_VDPA_QUEUE_MAX 256
     22#define VP_VDPA_DRIVER_NAME "vp_vdpa"
     23#define VP_VDPA_NAME_SIZE 256
     24
     25struct vp_vring {
     26	void __iomem *notify;
     27	char msix_name[VP_VDPA_NAME_SIZE];
     28	struct vdpa_callback cb;
     29	resource_size_t notify_pa;
     30	int irq;
     31};
     32
     33struct vp_vdpa {
     34	struct vdpa_device vdpa;
     35	struct virtio_pci_modern_device *mdev;
     36	struct vp_vring *vring;
     37	struct vdpa_callback config_cb;
     38	char msix_name[VP_VDPA_NAME_SIZE];
     39	int config_irq;
     40	int queues;
     41	int vectors;
     42};
     43
     44struct vp_vdpa_mgmtdev {
     45	struct vdpa_mgmt_dev mgtdev;
     46	struct virtio_pci_modern_device *mdev;
     47	struct vp_vdpa *vp_vdpa;
     48};
     49
     50static struct vp_vdpa *vdpa_to_vp(struct vdpa_device *vdpa)
     51{
     52	return container_of(vdpa, struct vp_vdpa, vdpa);
     53}
     54
     55static struct virtio_pci_modern_device *vdpa_to_mdev(struct vdpa_device *vdpa)
     56{
     57	struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
     58
     59	return vp_vdpa->mdev;
     60}
     61
     62static struct virtio_pci_modern_device *vp_vdpa_to_mdev(struct vp_vdpa *vp_vdpa)
     63{
     64	return vp_vdpa->mdev;
     65}
     66
     67static u64 vp_vdpa_get_device_features(struct vdpa_device *vdpa)
     68{
     69	struct virtio_pci_modern_device *mdev = vdpa_to_mdev(vdpa);
     70
     71	return vp_modern_get_features(mdev);
     72}
     73
     74static int vp_vdpa_set_driver_features(struct vdpa_device *vdpa, u64 features)
     75{
     76	struct virtio_pci_modern_device *mdev = vdpa_to_mdev(vdpa);
     77
     78	vp_modern_set_features(mdev, features);
     79
     80	return 0;
     81}
     82
     83static u64 vp_vdpa_get_driver_features(struct vdpa_device *vdpa)
     84{
     85	struct virtio_pci_modern_device *mdev = vdpa_to_mdev(vdpa);
     86
     87	return vp_modern_get_driver_features(mdev);
     88}
     89
     90static u8 vp_vdpa_get_status(struct vdpa_device *vdpa)
     91{
     92	struct virtio_pci_modern_device *mdev = vdpa_to_mdev(vdpa);
     93
     94	return vp_modern_get_status(mdev);
     95}
     96
     97static int vp_vdpa_get_vq_irq(struct vdpa_device *vdpa, u16 idx)
     98{
     99	struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
    100	int irq = vp_vdpa->vring[idx].irq;
    101
    102	if (irq == VIRTIO_MSI_NO_VECTOR)
    103		return -EINVAL;
    104
    105	return irq;
    106}
    107
    108static void vp_vdpa_free_irq(struct vp_vdpa *vp_vdpa)
    109{
    110	struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
    111	struct pci_dev *pdev = mdev->pci_dev;
    112	int i;
    113
    114	for (i = 0; i < vp_vdpa->queues; i++) {
    115		if (vp_vdpa->vring[i].irq != VIRTIO_MSI_NO_VECTOR) {
    116			vp_modern_queue_vector(mdev, i, VIRTIO_MSI_NO_VECTOR);
    117			devm_free_irq(&pdev->dev, vp_vdpa->vring[i].irq,
    118				      &vp_vdpa->vring[i]);
    119			vp_vdpa->vring[i].irq = VIRTIO_MSI_NO_VECTOR;
    120		}
    121	}
    122
    123	if (vp_vdpa->config_irq != VIRTIO_MSI_NO_VECTOR) {
    124		vp_modern_config_vector(mdev, VIRTIO_MSI_NO_VECTOR);
    125		devm_free_irq(&pdev->dev, vp_vdpa->config_irq, vp_vdpa);
    126		vp_vdpa->config_irq = VIRTIO_MSI_NO_VECTOR;
    127	}
    128
    129	if (vp_vdpa->vectors) {
    130		pci_free_irq_vectors(pdev);
    131		vp_vdpa->vectors = 0;
    132	}
    133}
    134
    135static irqreturn_t vp_vdpa_vq_handler(int irq, void *arg)
    136{
    137	struct vp_vring *vring = arg;
    138
    139	if (vring->cb.callback)
    140		return vring->cb.callback(vring->cb.private);
    141
    142	return IRQ_HANDLED;
    143}
    144
    145static irqreturn_t vp_vdpa_config_handler(int irq, void *arg)
    146{
    147	struct vp_vdpa *vp_vdpa = arg;
    148
    149	if (vp_vdpa->config_cb.callback)
    150		return vp_vdpa->config_cb.callback(vp_vdpa->config_cb.private);
    151
    152	return IRQ_HANDLED;
    153}
    154
    155static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
    156{
    157	struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
    158	struct pci_dev *pdev = mdev->pci_dev;
    159	int i, ret, irq;
    160	int queues = vp_vdpa->queues;
    161	int vectors = queues + 1;
    162
    163	ret = pci_alloc_irq_vectors(pdev, vectors, vectors, PCI_IRQ_MSIX);
    164	if (ret != vectors) {
    165		dev_err(&pdev->dev,
    166			"vp_vdpa: fail to allocate irq vectors want %d but %d\n",
    167			vectors, ret);
    168		return ret;
    169	}
    170
    171	vp_vdpa->vectors = vectors;
    172
    173	for (i = 0; i < queues; i++) {
    174		snprintf(vp_vdpa->vring[i].msix_name, VP_VDPA_NAME_SIZE,
    175			"vp-vdpa[%s]-%d\n", pci_name(pdev), i);
    176		irq = pci_irq_vector(pdev, i);
    177		ret = devm_request_irq(&pdev->dev, irq,
    178				       vp_vdpa_vq_handler,
    179				       0, vp_vdpa->vring[i].msix_name,
    180				       &vp_vdpa->vring[i]);
    181		if (ret) {
    182			dev_err(&pdev->dev,
    183				"vp_vdpa: fail to request irq for vq %d\n", i);
    184			goto err;
    185		}
    186		vp_modern_queue_vector(mdev, i, i);
    187		vp_vdpa->vring[i].irq = irq;
    188	}
    189
    190	snprintf(vp_vdpa->msix_name, VP_VDPA_NAME_SIZE, "vp-vdpa[%s]-config\n",
    191		 pci_name(pdev));
    192	irq = pci_irq_vector(pdev, queues);
    193	ret = devm_request_irq(&pdev->dev, irq,	vp_vdpa_config_handler, 0,
    194			       vp_vdpa->msix_name, vp_vdpa);
    195	if (ret) {
    196		dev_err(&pdev->dev,
    197			"vp_vdpa: fail to request irq for vq %d\n", i);
    198			goto err;
    199	}
    200	vp_modern_config_vector(mdev, queues);
    201	vp_vdpa->config_irq = irq;
    202
    203	return 0;
    204err:
    205	vp_vdpa_free_irq(vp_vdpa);
    206	return ret;
    207}
    208
    209static void vp_vdpa_set_status(struct vdpa_device *vdpa, u8 status)
    210{
    211	struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
    212	struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
    213	u8 s = vp_vdpa_get_status(vdpa);
    214
    215	if (status & VIRTIO_CONFIG_S_DRIVER_OK &&
    216	    !(s & VIRTIO_CONFIG_S_DRIVER_OK)) {
    217		vp_vdpa_request_irq(vp_vdpa);
    218	}
    219
    220	vp_modern_set_status(mdev, status);
    221}
    222
    223static int vp_vdpa_reset(struct vdpa_device *vdpa)
    224{
    225	struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
    226	struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
    227	u8 s = vp_vdpa_get_status(vdpa);
    228
    229	vp_modern_set_status(mdev, 0);
    230
    231	if (s & VIRTIO_CONFIG_S_DRIVER_OK)
    232		vp_vdpa_free_irq(vp_vdpa);
    233
    234	return 0;
    235}
    236
    237static u16 vp_vdpa_get_vq_num_max(struct vdpa_device *vdpa)
    238{
    239	return VP_VDPA_QUEUE_MAX;
    240}
    241
    242static int vp_vdpa_get_vq_state(struct vdpa_device *vdpa, u16 qid,
    243				struct vdpa_vq_state *state)
    244{
    245	/* Note that this is not supported by virtio specification, so
    246	 * we return -EOPNOTSUPP here. This means we can't support live
    247	 * migration, vhost device start/stop.
    248	 */
    249	return -EOPNOTSUPP;
    250}
    251
    252static int vp_vdpa_set_vq_state_split(struct vdpa_device *vdpa,
    253				      const struct vdpa_vq_state *state)
    254{
    255	const struct vdpa_vq_state_split *split = &state->split;
    256
    257	if (split->avail_index == 0)
    258		return 0;
    259
    260	return -EOPNOTSUPP;
    261}
    262
    263static int vp_vdpa_set_vq_state_packed(struct vdpa_device *vdpa,
    264				       const struct vdpa_vq_state *state)
    265{
    266	const struct vdpa_vq_state_packed *packed = &state->packed;
    267
    268	if (packed->last_avail_counter == 1 &&
    269	    packed->last_avail_idx == 0 &&
    270	    packed->last_used_counter == 1 &&
    271	    packed->last_used_idx == 0)
    272		return 0;
    273
    274	return -EOPNOTSUPP;
    275}
    276
    277static int vp_vdpa_set_vq_state(struct vdpa_device *vdpa, u16 qid,
    278				const struct vdpa_vq_state *state)
    279{
    280	struct virtio_pci_modern_device *mdev = vdpa_to_mdev(vdpa);
    281
    282	/* Note that this is not supported by virtio specification.
    283	 * But if the state is by chance equal to the device initial
    284	 * state, we can let it go.
    285	 */
    286	if ((vp_modern_get_status(mdev) & VIRTIO_CONFIG_S_FEATURES_OK) &&
    287	    !vp_modern_get_queue_enable(mdev, qid)) {
    288		if (vp_modern_get_driver_features(mdev) &
    289		    BIT_ULL(VIRTIO_F_RING_PACKED))
    290			return vp_vdpa_set_vq_state_packed(vdpa, state);
    291		else
    292			return vp_vdpa_set_vq_state_split(vdpa,	state);
    293	}
    294
    295	return -EOPNOTSUPP;
    296}
    297
    298static void vp_vdpa_set_vq_cb(struct vdpa_device *vdpa, u16 qid,
    299			      struct vdpa_callback *cb)
    300{
    301	struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
    302
    303	vp_vdpa->vring[qid].cb = *cb;
    304}
    305
    306static void vp_vdpa_set_vq_ready(struct vdpa_device *vdpa,
    307				 u16 qid, bool ready)
    308{
    309	struct virtio_pci_modern_device *mdev = vdpa_to_mdev(vdpa);
    310
    311	vp_modern_set_queue_enable(mdev, qid, ready);
    312}
    313
    314static bool vp_vdpa_get_vq_ready(struct vdpa_device *vdpa, u16 qid)
    315{
    316	struct virtio_pci_modern_device *mdev = vdpa_to_mdev(vdpa);
    317
    318	return vp_modern_get_queue_enable(mdev, qid);
    319}
    320
    321static void vp_vdpa_set_vq_num(struct vdpa_device *vdpa, u16 qid,
    322			       u32 num)
    323{
    324	struct virtio_pci_modern_device *mdev = vdpa_to_mdev(vdpa);
    325
    326	vp_modern_set_queue_size(mdev, qid, num);
    327}
    328
    329static int vp_vdpa_set_vq_address(struct vdpa_device *vdpa, u16 qid,
    330				  u64 desc_area, u64 driver_area,
    331				  u64 device_area)
    332{
    333	struct virtio_pci_modern_device *mdev = vdpa_to_mdev(vdpa);
    334
    335	vp_modern_queue_address(mdev, qid, desc_area,
    336				driver_area, device_area);
    337
    338	return 0;
    339}
    340
    341static void vp_vdpa_kick_vq(struct vdpa_device *vdpa, u16 qid)
    342{
    343	struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
    344
    345	vp_iowrite16(qid, vp_vdpa->vring[qid].notify);
    346}
    347
    348static u32 vp_vdpa_get_generation(struct vdpa_device *vdpa)
    349{
    350	struct virtio_pci_modern_device *mdev = vdpa_to_mdev(vdpa);
    351
    352	return vp_modern_generation(mdev);
    353}
    354
    355static u32 vp_vdpa_get_device_id(struct vdpa_device *vdpa)
    356{
    357	struct virtio_pci_modern_device *mdev = vdpa_to_mdev(vdpa);
    358
    359	return mdev->id.device;
    360}
    361
    362static u32 vp_vdpa_get_vendor_id(struct vdpa_device *vdpa)
    363{
    364	struct virtio_pci_modern_device *mdev = vdpa_to_mdev(vdpa);
    365
    366	return mdev->id.vendor;
    367}
    368
    369static u32 vp_vdpa_get_vq_align(struct vdpa_device *vdpa)
    370{
    371	return PAGE_SIZE;
    372}
    373
    374static size_t vp_vdpa_get_config_size(struct vdpa_device *vdpa)
    375{
    376	struct virtio_pci_modern_device *mdev = vdpa_to_mdev(vdpa);
    377
    378	return mdev->device_len;
    379}
    380
    381static void vp_vdpa_get_config(struct vdpa_device *vdpa,
    382			       unsigned int offset,
    383			       void *buf, unsigned int len)
    384{
    385	struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
    386	struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
    387	u8 old, new;
    388	u8 *p;
    389	int i;
    390
    391	do {
    392		old = vp_ioread8(&mdev->common->config_generation);
    393		p = buf;
    394		for (i = 0; i < len; i++)
    395			*p++ = vp_ioread8(mdev->device + offset + i);
    396
    397		new = vp_ioread8(&mdev->common->config_generation);
    398	} while (old != new);
    399}
    400
    401static void vp_vdpa_set_config(struct vdpa_device *vdpa,
    402			       unsigned int offset, const void *buf,
    403			       unsigned int len)
    404{
    405	struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
    406	struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
    407	const u8 *p = buf;
    408	int i;
    409
    410	for (i = 0; i < len; i++)
    411		vp_iowrite8(*p++, mdev->device + offset + i);
    412}
    413
    414static void vp_vdpa_set_config_cb(struct vdpa_device *vdpa,
    415				  struct vdpa_callback *cb)
    416{
    417	struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
    418
    419	vp_vdpa->config_cb = *cb;
    420}
    421
    422static struct vdpa_notification_area
    423vp_vdpa_get_vq_notification(struct vdpa_device *vdpa, u16 qid)
    424{
    425	struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
    426	struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
    427	struct vdpa_notification_area notify;
    428
    429	notify.addr = vp_vdpa->vring[qid].notify_pa;
    430	notify.size = mdev->notify_offset_multiplier;
    431
    432	return notify;
    433}
    434
    435static const struct vdpa_config_ops vp_vdpa_ops = {
    436	.get_device_features = vp_vdpa_get_device_features,
    437	.set_driver_features = vp_vdpa_set_driver_features,
    438	.get_driver_features = vp_vdpa_get_driver_features,
    439	.get_status	= vp_vdpa_get_status,
    440	.set_status	= vp_vdpa_set_status,
    441	.reset		= vp_vdpa_reset,
    442	.get_vq_num_max	= vp_vdpa_get_vq_num_max,
    443	.get_vq_state	= vp_vdpa_get_vq_state,
    444	.get_vq_notification = vp_vdpa_get_vq_notification,
    445	.set_vq_state	= vp_vdpa_set_vq_state,
    446	.set_vq_cb	= vp_vdpa_set_vq_cb,
    447	.set_vq_ready	= vp_vdpa_set_vq_ready,
    448	.get_vq_ready	= vp_vdpa_get_vq_ready,
    449	.set_vq_num	= vp_vdpa_set_vq_num,
    450	.set_vq_address	= vp_vdpa_set_vq_address,
    451	.kick_vq	= vp_vdpa_kick_vq,
    452	.get_generation	= vp_vdpa_get_generation,
    453	.get_device_id	= vp_vdpa_get_device_id,
    454	.get_vendor_id	= vp_vdpa_get_vendor_id,
    455	.get_vq_align	= vp_vdpa_get_vq_align,
    456	.get_config_size = vp_vdpa_get_config_size,
    457	.get_config	= vp_vdpa_get_config,
    458	.set_config	= vp_vdpa_set_config,
    459	.set_config_cb  = vp_vdpa_set_config_cb,
    460	.get_vq_irq	= vp_vdpa_get_vq_irq,
    461};
    462
    463static void vp_vdpa_free_irq_vectors(void *data)
    464{
    465	pci_free_irq_vectors(data);
    466}
    467
    468static int vp_vdpa_dev_add(struct vdpa_mgmt_dev *v_mdev, const char *name,
    469			   const struct vdpa_dev_set_config *add_config)
    470{
    471	struct vp_vdpa_mgmtdev *vp_vdpa_mgtdev =
    472		container_of(v_mdev, struct vp_vdpa_mgmtdev, mgtdev);
    473
    474	struct virtio_pci_modern_device *mdev = vp_vdpa_mgtdev->mdev;
    475	struct pci_dev *pdev = mdev->pci_dev;
    476	struct device *dev = &pdev->dev;
    477	struct vp_vdpa *vp_vdpa = NULL;
    478	int ret, i;
    479
    480	vp_vdpa = vdpa_alloc_device(struct vp_vdpa, vdpa,
    481				    dev, &vp_vdpa_ops, 1, 1, name, false);
    482
    483	if (IS_ERR(vp_vdpa)) {
    484		dev_err(dev, "vp_vdpa: Failed to allocate vDPA structure\n");
    485		return PTR_ERR(vp_vdpa);
    486	}
    487
    488	vp_vdpa_mgtdev->vp_vdpa = vp_vdpa;
    489
    490	vp_vdpa->vdpa.dma_dev = &pdev->dev;
    491	vp_vdpa->queues = vp_modern_get_num_queues(mdev);
    492	vp_vdpa->mdev = mdev;
    493
    494	ret = devm_add_action_or_reset(dev, vp_vdpa_free_irq_vectors, pdev);
    495	if (ret) {
    496		dev_err(&pdev->dev,
    497			"Failed for adding devres for freeing irq vectors\n");
    498		goto err;
    499	}
    500
    501	vp_vdpa->vring = devm_kcalloc(&pdev->dev, vp_vdpa->queues,
    502				      sizeof(*vp_vdpa->vring),
    503				      GFP_KERNEL);
    504	if (!vp_vdpa->vring) {
    505		ret = -ENOMEM;
    506		dev_err(&pdev->dev, "Fail to allocate virtqueues\n");
    507		goto err;
    508	}
    509
    510	for (i = 0; i < vp_vdpa->queues; i++) {
    511		vp_vdpa->vring[i].irq = VIRTIO_MSI_NO_VECTOR;
    512		vp_vdpa->vring[i].notify =
    513			vp_modern_map_vq_notify(mdev, i,
    514						&vp_vdpa->vring[i].notify_pa);
    515		if (!vp_vdpa->vring[i].notify) {
    516			ret = -EINVAL;
    517			dev_warn(&pdev->dev, "Fail to map vq notify %d\n", i);
    518			goto err;
    519		}
    520	}
    521	vp_vdpa->config_irq = VIRTIO_MSI_NO_VECTOR;
    522
    523	vp_vdpa->vdpa.mdev = &vp_vdpa_mgtdev->mgtdev;
    524	ret = _vdpa_register_device(&vp_vdpa->vdpa, vp_vdpa->queues);
    525	if (ret) {
    526		dev_err(&pdev->dev, "Failed to register to vdpa bus\n");
    527		goto err;
    528	}
    529
    530	return 0;
    531
    532err:
    533	put_device(&vp_vdpa->vdpa.dev);
    534	return ret;
    535}
    536
    537static void vp_vdpa_dev_del(struct vdpa_mgmt_dev *v_mdev,
    538			    struct vdpa_device *dev)
    539{
    540	struct vp_vdpa_mgmtdev *vp_vdpa_mgtdev =
    541		container_of(v_mdev, struct vp_vdpa_mgmtdev, mgtdev);
    542
    543	struct vp_vdpa *vp_vdpa = vp_vdpa_mgtdev->vp_vdpa;
    544
    545	_vdpa_unregister_device(&vp_vdpa->vdpa);
    546	vp_vdpa_mgtdev->vp_vdpa = NULL;
    547}
    548
    549static const struct vdpa_mgmtdev_ops vp_vdpa_mdev_ops = {
    550	.dev_add = vp_vdpa_dev_add,
    551	.dev_del = vp_vdpa_dev_del,
    552};
    553
    554static int vp_vdpa_probe(struct pci_dev *pdev, const struct pci_device_id *id)
    555{
    556	struct vp_vdpa_mgmtdev *vp_vdpa_mgtdev = NULL;
    557	struct vdpa_mgmt_dev *mgtdev;
    558	struct device *dev = &pdev->dev;
    559	struct virtio_pci_modern_device *mdev = NULL;
    560	struct virtio_device_id *mdev_id = NULL;
    561	int err;
    562
    563	vp_vdpa_mgtdev = kzalloc(sizeof(*vp_vdpa_mgtdev), GFP_KERNEL);
    564	if (!vp_vdpa_mgtdev)
    565		return -ENOMEM;
    566
    567	mgtdev = &vp_vdpa_mgtdev->mgtdev;
    568	mgtdev->ops = &vp_vdpa_mdev_ops;
    569	mgtdev->device = dev;
    570
    571	mdev = kzalloc(sizeof(struct virtio_pci_modern_device), GFP_KERNEL);
    572	if (!mdev) {
    573		err = -ENOMEM;
    574		goto mdev_err;
    575	}
    576
    577	mdev_id = kzalloc(sizeof(struct virtio_device_id), GFP_KERNEL);
    578	if (!mdev_id) {
    579		err = -ENOMEM;
    580		goto mdev_id_err;
    581	}
    582
    583	vp_vdpa_mgtdev->mdev = mdev;
    584	mdev->pci_dev = pdev;
    585
    586	err = pcim_enable_device(pdev);
    587	if (err) {
    588		goto probe_err;
    589	}
    590
    591	err = vp_modern_probe(mdev);
    592	if (err) {
    593		dev_err(&pdev->dev, "Failed to probe modern PCI device\n");
    594		goto probe_err;
    595	}
    596
    597	mdev_id->device = mdev->id.device;
    598	mdev_id->vendor = mdev->id.vendor;
    599	mgtdev->id_table = mdev_id;
    600	mgtdev->max_supported_vqs = vp_modern_get_num_queues(mdev);
    601	mgtdev->supported_features = vp_modern_get_features(mdev);
    602	pci_set_master(pdev);
    603	pci_set_drvdata(pdev, vp_vdpa_mgtdev);
    604
    605	err = vdpa_mgmtdev_register(mgtdev);
    606	if (err) {
    607		dev_err(&pdev->dev, "Failed to register vdpa mgmtdev device\n");
    608		goto register_err;
    609	}
    610
    611	return 0;
    612
    613register_err:
    614	vp_modern_remove(vp_vdpa_mgtdev->mdev);
    615probe_err:
    616	kfree(mdev_id);
    617mdev_id_err:
    618	kfree(mdev);
    619mdev_err:
    620	kfree(vp_vdpa_mgtdev);
    621	return err;
    622}
    623
    624static void vp_vdpa_remove(struct pci_dev *pdev)
    625{
    626	struct vp_vdpa_mgmtdev *vp_vdpa_mgtdev = pci_get_drvdata(pdev);
    627	struct virtio_pci_modern_device *mdev = NULL;
    628
    629	mdev = vp_vdpa_mgtdev->mdev;
    630	vp_modern_remove(mdev);
    631	vdpa_mgmtdev_unregister(&vp_vdpa_mgtdev->mgtdev);
    632	kfree(&vp_vdpa_mgtdev->mgtdev.id_table);
    633	kfree(mdev);
    634	kfree(vp_vdpa_mgtdev);
    635}
    636
    637static struct pci_driver vp_vdpa_driver = {
    638	.name		= "vp-vdpa",
    639	.id_table	= NULL, /* only dynamic ids */
    640	.probe		= vp_vdpa_probe,
    641	.remove		= vp_vdpa_remove,
    642};
    643
    644module_pci_driver(vp_vdpa_driver);
    645
    646MODULE_AUTHOR("Jason Wang <jasowang@redhat.com>");
    647MODULE_DESCRIPTION("vp-vdpa");
    648MODULE_LICENSE("GPL");
    649MODULE_VERSION("1");