1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright(c) 2023 Advanced Micro Devices, Inc. */ 3 4 #include <linux/vfio.h> 5 #include <linux/vfio_pci_core.h> 6 7 #include "vfio_dev.h" 8 9 struct pci_dev *pds_vfio_to_pci_dev(struct pds_vfio_pci_device *pds_vfio) 10 { 11 return pds_vfio->vfio_coredev.pdev; 12 } 13 14 struct pds_vfio_pci_device *pds_vfio_pci_drvdata(struct pci_dev *pdev) 15 { 16 struct vfio_pci_core_device *core_device = dev_get_drvdata(&pdev->dev); 17 18 return container_of(core_device, struct pds_vfio_pci_device, 19 vfio_coredev); 20 } 21 22 static int pds_vfio_init_device(struct vfio_device *vdev) 23 { 24 struct pds_vfio_pci_device *pds_vfio = 25 container_of(vdev, struct pds_vfio_pci_device, 26 vfio_coredev.vdev); 27 struct pci_dev *pdev = to_pci_dev(vdev->dev); 28 int err, vf_id, pci_id; 29 30 vf_id = pci_iov_vf_id(pdev); 31 if (vf_id < 0) 32 return vf_id; 33 34 err = vfio_pci_core_init_dev(vdev); 35 if (err) 36 return err; 37 38 pds_vfio->vf_id = vf_id; 39 40 pci_id = PCI_DEVID(pdev->bus->number, pdev->devfn); 41 dev_dbg(&pdev->dev, 42 "%s: PF %#04x VF %#04x vf_id %d domain %d pds_vfio %p\n", 43 __func__, pci_dev_id(pdev->physfn), pci_id, vf_id, 44 pci_domain_nr(pdev->bus), pds_vfio); 45 46 return 0; 47 } 48 49 static int pds_vfio_open_device(struct vfio_device *vdev) 50 { 51 struct pds_vfio_pci_device *pds_vfio = 52 container_of(vdev, struct pds_vfio_pci_device, 53 vfio_coredev.vdev); 54 int err; 55 56 err = vfio_pci_core_enable(&pds_vfio->vfio_coredev); 57 if (err) 58 return err; 59 60 vfio_pci_core_finish_enable(&pds_vfio->vfio_coredev); 61 62 return 0; 63 } 64 65 static const struct vfio_device_ops pds_vfio_ops = { 66 .name = "pds-vfio", 67 .init = pds_vfio_init_device, 68 .release = vfio_pci_core_release_dev, 69 .open_device = pds_vfio_open_device, 70 .close_device = vfio_pci_core_close_device, 71 .ioctl = vfio_pci_core_ioctl, 72 .device_feature = vfio_pci_core_ioctl_feature, 73 .read = vfio_pci_core_read, 74 .write = vfio_pci_core_write, 75 .mmap = vfio_pci_core_mmap, 76 .request = vfio_pci_core_request, 77 .match = vfio_pci_core_match, 78 .bind_iommufd = vfio_iommufd_physical_bind, 79 .unbind_iommufd = vfio_iommufd_physical_unbind, 80 .attach_ioas = vfio_iommufd_physical_attach_ioas, 81 }; 82 83 const struct vfio_device_ops *pds_vfio_ops_info(void) 84 { 85 return &pds_vfio_ops; 86 } 87