-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
vfio/pds: Initial support for pds VFIO driver
This is the initial framework for the new pds-vfio-pci device driver. This does the very basics of registering the PDS PCI device and configuring it as a VFIO PCI device. With this change, the VF device can be bound to the pds-vfio-pci driver on the host and presented to the VM as an ethernet VF. Signed-off-by: Brett Creeley <brett.creeley@amd.com> Signed-off-by: Shannon Nelson <shannon.nelson@amd.com> Reviewed-by: Simon Horman <horms@kernel.org> Reviewed-by: Kevin Tian <kevin.tian@intel.com> Reviewed-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Link: https://lore.kernel.org/r/20230807205755.29579-3-brett.creeley@amd.com Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
- Loading branch information
Brett Creeley
authored and
Alex Williamson
committed
Aug 16, 2023
1 parent
9a4087f
commit 38fe397
Showing
5 changed files
with
172 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
# SPDX-License-Identifier: GPL-2.0 | ||
# Copyright (c) 2023 Advanced Micro Devices, Inc. | ||
|
||
obj-$(CONFIG_PDS_VFIO_PCI) += pds-vfio-pci.o | ||
|
||
pds-vfio-pci-y := \ | ||
pci_drv.o \ | ||
vfio_dev.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* Copyright(c) 2023 Advanced Micro Devices, Inc. */ | ||
|
||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt | ||
|
||
#include <linux/module.h> | ||
#include <linux/pci.h> | ||
#include <linux/types.h> | ||
#include <linux/vfio.h> | ||
|
||
#include <linux/pds/pds_core_if.h> | ||
|
||
#include "vfio_dev.h" | ||
|
||
#define PDS_VFIO_DRV_DESCRIPTION "AMD/Pensando VFIO Device Driver" | ||
#define PCI_VENDOR_ID_PENSANDO 0x1dd8 | ||
|
||
static int pds_vfio_pci_probe(struct pci_dev *pdev, | ||
const struct pci_device_id *id) | ||
{ | ||
struct pds_vfio_pci_device *pds_vfio; | ||
int err; | ||
|
||
pds_vfio = vfio_alloc_device(pds_vfio_pci_device, vfio_coredev.vdev, | ||
&pdev->dev, pds_vfio_ops_info()); | ||
if (IS_ERR(pds_vfio)) | ||
return PTR_ERR(pds_vfio); | ||
|
||
dev_set_drvdata(&pdev->dev, &pds_vfio->vfio_coredev); | ||
|
||
err = vfio_pci_core_register_device(&pds_vfio->vfio_coredev); | ||
if (err) | ||
goto out_put_vdev; | ||
|
||
return 0; | ||
|
||
out_put_vdev: | ||
vfio_put_device(&pds_vfio->vfio_coredev.vdev); | ||
return err; | ||
} | ||
|
||
static void pds_vfio_pci_remove(struct pci_dev *pdev) | ||
{ | ||
struct pds_vfio_pci_device *pds_vfio = pds_vfio_pci_drvdata(pdev); | ||
|
||
vfio_pci_core_unregister_device(&pds_vfio->vfio_coredev); | ||
vfio_put_device(&pds_vfio->vfio_coredev.vdev); | ||
} | ||
|
||
static const struct pci_device_id pds_vfio_pci_table[] = { | ||
{ PCI_DRIVER_OVERRIDE_DEVICE_VFIO(PCI_VENDOR_ID_PENSANDO, 0x1003) }, /* Ethernet VF */ | ||
{ 0, } | ||
}; | ||
MODULE_DEVICE_TABLE(pci, pds_vfio_pci_table); | ||
|
||
static struct pci_driver pds_vfio_pci_driver = { | ||
.name = KBUILD_MODNAME, | ||
.id_table = pds_vfio_pci_table, | ||
.probe = pds_vfio_pci_probe, | ||
.remove = pds_vfio_pci_remove, | ||
.driver_managed_dma = true, | ||
}; | ||
|
||
module_pci_driver(pds_vfio_pci_driver); | ||
|
||
MODULE_DESCRIPTION(PDS_VFIO_DRV_DESCRIPTION); | ||
MODULE_AUTHOR("Brett Creeley <brett.creeley@amd.com>"); | ||
MODULE_LICENSE("GPL"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
/* Copyright(c) 2023 Advanced Micro Devices, Inc. */ | ||
|
||
#include <linux/vfio.h> | ||
#include <linux/vfio_pci_core.h> | ||
|
||
#include "vfio_dev.h" | ||
|
||
struct pds_vfio_pci_device *pds_vfio_pci_drvdata(struct pci_dev *pdev) | ||
{ | ||
struct vfio_pci_core_device *core_device = dev_get_drvdata(&pdev->dev); | ||
|
||
return container_of(core_device, struct pds_vfio_pci_device, | ||
vfio_coredev); | ||
} | ||
|
||
static int pds_vfio_init_device(struct vfio_device *vdev) | ||
{ | ||
struct pds_vfio_pci_device *pds_vfio = | ||
container_of(vdev, struct pds_vfio_pci_device, | ||
vfio_coredev.vdev); | ||
struct pci_dev *pdev = to_pci_dev(vdev->dev); | ||
int err, vf_id; | ||
|
||
vf_id = pci_iov_vf_id(pdev); | ||
if (vf_id < 0) | ||
return vf_id; | ||
|
||
err = vfio_pci_core_init_dev(vdev); | ||
if (err) | ||
return err; | ||
|
||
pds_vfio->vf_id = vf_id; | ||
|
||
return 0; | ||
} | ||
|
||
static int pds_vfio_open_device(struct vfio_device *vdev) | ||
{ | ||
struct pds_vfio_pci_device *pds_vfio = | ||
container_of(vdev, struct pds_vfio_pci_device, | ||
vfio_coredev.vdev); | ||
int err; | ||
|
||
err = vfio_pci_core_enable(&pds_vfio->vfio_coredev); | ||
if (err) | ||
return err; | ||
|
||
vfio_pci_core_finish_enable(&pds_vfio->vfio_coredev); | ||
|
||
return 0; | ||
} | ||
|
||
static const struct vfio_device_ops pds_vfio_ops = { | ||
.name = "pds-vfio", | ||
.init = pds_vfio_init_device, | ||
.release = vfio_pci_core_release_dev, | ||
.open_device = pds_vfio_open_device, | ||
.close_device = vfio_pci_core_close_device, | ||
.ioctl = vfio_pci_core_ioctl, | ||
.device_feature = vfio_pci_core_ioctl_feature, | ||
.read = vfio_pci_core_read, | ||
.write = vfio_pci_core_write, | ||
.mmap = vfio_pci_core_mmap, | ||
.request = vfio_pci_core_request, | ||
.match = vfio_pci_core_match, | ||
.bind_iommufd = vfio_iommufd_physical_bind, | ||
.unbind_iommufd = vfio_iommufd_physical_unbind, | ||
.attach_ioas = vfio_iommufd_physical_attach_ioas, | ||
}; | ||
|
||
const struct vfio_device_ops *pds_vfio_ops_info(void) | ||
{ | ||
return &pds_vfio_ops; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
/* Copyright(c) 2023 Advanced Micro Devices, Inc. */ | ||
|
||
#ifndef _VFIO_DEV_H_ | ||
#define _VFIO_DEV_H_ | ||
|
||
#include <linux/pci.h> | ||
#include <linux/vfio_pci_core.h> | ||
|
||
struct pds_vfio_pci_device { | ||
struct vfio_pci_core_device vfio_coredev; | ||
|
||
int vf_id; | ||
}; | ||
|
||
const struct vfio_device_ops *pds_vfio_ops_info(void); | ||
struct pds_vfio_pci_device *pds_vfio_pci_drvdata(struct pci_dev *pdev); | ||
|
||
#endif /* _VFIO_DEV_H_ */ |