vp_vdpa
struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
int irq = vp_vdpa->vring[idx].irq;
static void vp_vdpa_free_irq(struct vp_vdpa *vp_vdpa)
struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
for (i = 0; i < vp_vdpa->queues; i++) {
if (vp_vdpa->vring[i].irq != VIRTIO_MSI_NO_VECTOR) {
devm_free_irq(&pdev->dev, vp_vdpa->vring[i].irq,
&vp_vdpa->vring[i]);
vp_vdpa->vring[i].irq = VIRTIO_MSI_NO_VECTOR;
if (vp_vdpa->config_irq != VIRTIO_MSI_NO_VECTOR) {
devm_free_irq(&pdev->dev, vp_vdpa->config_irq, vp_vdpa);
vp_vdpa->config_irq = VIRTIO_MSI_NO_VECTOR;
if (vp_vdpa->vectors) {
vp_vdpa->vectors = 0;
struct vp_vdpa *vp_vdpa = arg;
if (vp_vdpa->config_cb.callback)
return vp_vdpa->config_cb.callback(vp_vdpa->config_cb.private);
static int vp_vdpa_request_irq(struct vp_vdpa *vp_vdpa)
struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
int queues = vp_vdpa->queues;
if (vp_vdpa->vring[i].cb.callback)
vp_vdpa->vectors = vectors;
if (!vp_vdpa->vring[i].cb.callback)
snprintf(vp_vdpa->vring[i].msix_name, VP_VDPA_NAME_SIZE,
0, vp_vdpa->vring[i].msix_name,
&vp_vdpa->vring[i]);
vp_vdpa->vring[i].irq = irq;
snprintf(vp_vdpa->msix_name, VP_VDPA_NAME_SIZE, "vp-vdpa[%s]-config\n",
vp_vdpa->msix_name, vp_vdpa);
vp_vdpa->config_irq = irq;
vp_vdpa_free_irq(vp_vdpa);
struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
if (vp_vdpa_request_irq(vp_vdpa)) {
struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
vp_vdpa_free_irq(vp_vdpa);
struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
vp_vdpa->vring[qid].cb = *cb;
struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
vp_iowrite16(qid, vp_vdpa->vring[qid].notify);
struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
vp_iowrite32(data, vp_vdpa->vring[qid].notify);
struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
vp_vdpa->config_cb = *cb;
struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
struct virtio_pci_modern_device *mdev = vp_vdpa_to_mdev(vp_vdpa);
notify.addr = vp_vdpa->vring[qid].notify_pa;
struct vp_vdpa *vp_vdpa;
struct vp_vdpa *vp_vdpa = NULL;
vp_vdpa = vdpa_alloc_device(struct vp_vdpa, vdpa,
if (IS_ERR(vp_vdpa)) {
return PTR_ERR(vp_vdpa);
static struct vp_vdpa *vdpa_to_vp(struct vdpa_device *vdpa)
vp_vdpa_mgtdev->vp_vdpa = vp_vdpa;
vp_vdpa->vdpa.vmap.dma_dev = &pdev->dev;
vp_vdpa->queues = vp_modern_get_num_queues(mdev);
vp_vdpa->mdev = mdev;
return container_of(vdpa, struct vp_vdpa, vdpa);
vp_vdpa->device_features = device_features;
vp_vdpa->vring = devm_kcalloc(&pdev->dev, vp_vdpa->queues,
sizeof(*vp_vdpa->vring),
if (!vp_vdpa->vring) {
for (i = 0; i < vp_vdpa->queues; i++) {
vp_vdpa->vring[i].irq = VIRTIO_MSI_NO_VECTOR;
vp_vdpa->vring[i].notify =
&vp_vdpa->vring[i].notify_pa);
if (!vp_vdpa->vring[i].notify) {
vp_vdpa->config_irq = VIRTIO_MSI_NO_VECTOR;
vp_vdpa->vdpa.mdev = &vp_vdpa_mgtdev->mgtdev;
ret = _vdpa_register_device(&vp_vdpa->vdpa, vp_vdpa->queues);
put_device(&vp_vdpa->vdpa.dev);
struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
struct vp_vdpa *vp_vdpa = vp_vdpa_mgtdev->vp_vdpa;
_vdpa_unregister_device(&vp_vdpa->vdpa);
vp_vdpa_mgtdev->vp_vdpa = NULL;
return vp_vdpa->mdev;
static struct virtio_pci_modern_device *vp_vdpa_to_mdev(struct vp_vdpa *vp_vdpa)
return vp_vdpa->mdev;
struct vp_vdpa *vp_vdpa = vdpa_to_vp(vdpa);
return vp_vdpa->device_features;