xref: /openbmc/linux/drivers/vfio/pci/pds/vfio_dev.c (revision 63f77a7161a2df9924eea9be3b6c63be10151252)
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