xref: /openbmc/linux/drivers/vfio/pci/pds/vfio_dev.c (revision 38fe3975b4c2c5eeefb543e09f9620da18b0d069)
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 pds_vfio_pci_device *pds_vfio_pci_drvdata(struct pci_dev *pdev)
10 {
11 	struct vfio_pci_core_device *core_device = dev_get_drvdata(&pdev->dev);
12 
13 	return container_of(core_device, struct pds_vfio_pci_device,
14 			    vfio_coredev);
15 }
16 
17 static int pds_vfio_init_device(struct vfio_device *vdev)
18 {
19 	struct pds_vfio_pci_device *pds_vfio =
20 		container_of(vdev, struct pds_vfio_pci_device,
21 			     vfio_coredev.vdev);
22 	struct pci_dev *pdev = to_pci_dev(vdev->dev);
23 	int err, vf_id;
24 
25 	vf_id = pci_iov_vf_id(pdev);
26 	if (vf_id < 0)
27 		return vf_id;
28 
29 	err = vfio_pci_core_init_dev(vdev);
30 	if (err)
31 		return err;
32 
33 	pds_vfio->vf_id = vf_id;
34 
35 	return 0;
36 }
37 
38 static int pds_vfio_open_device(struct vfio_device *vdev)
39 {
40 	struct pds_vfio_pci_device *pds_vfio =
41 		container_of(vdev, struct pds_vfio_pci_device,
42 			     vfio_coredev.vdev);
43 	int err;
44 
45 	err = vfio_pci_core_enable(&pds_vfio->vfio_coredev);
46 	if (err)
47 		return err;
48 
49 	vfio_pci_core_finish_enable(&pds_vfio->vfio_coredev);
50 
51 	return 0;
52 }
53 
54 static const struct vfio_device_ops pds_vfio_ops = {
55 	.name = "pds-vfio",
56 	.init = pds_vfio_init_device,
57 	.release = vfio_pci_core_release_dev,
58 	.open_device = pds_vfio_open_device,
59 	.close_device = vfio_pci_core_close_device,
60 	.ioctl = vfio_pci_core_ioctl,
61 	.device_feature = vfio_pci_core_ioctl_feature,
62 	.read = vfio_pci_core_read,
63 	.write = vfio_pci_core_write,
64 	.mmap = vfio_pci_core_mmap,
65 	.request = vfio_pci_core_request,
66 	.match = vfio_pci_core_match,
67 	.bind_iommufd = vfio_iommufd_physical_bind,
68 	.unbind_iommufd = vfio_iommufd_physical_unbind,
69 	.attach_ioas = vfio_iommufd_physical_attach_ioas,
70 };
71 
72 const struct vfio_device_ops *pds_vfio_ops_info(void)
73 {
74 	return &pds_vfio_ops;
75 }
76