From: Shannon Nelson <shannon.nelson@amd.com>
To: <jasowang@redhat.com>, <mst@redhat.com>,
<virtualization@lists.linux-foundation.org>,
<shannon.nelson@amd.com>, <brett.creeley@amd.com>,
<netdev@vger.kernel.org>
Cc: <drivers@pensando.io>
Subject: [PATCH v4 virtio 01/10] virtio: allow caller to override device id and DMA mask
Date: Tue, 25 Apr 2023 14:25:53 -0700 [thread overview]
Message-ID: <20230425212602.1157-2-shannon.nelson@amd.com> (raw)
In-Reply-To: <20230425212602.1157-1-shannon.nelson@amd.com>
To add a bit of flexibility with various virtio based devices, allow
the caller to specify a different device id and DMA mask. This adds
fields to struct virtio_pci_modern_device to specify an override device
id check and a DMA mask.
int (*device_id_check)(struct pci_dev *pdev);
If defined by the driver, this function will be called to check
that the PCI device is the vendor's expected device, and will
return the found device id to be stored in mdev->id.device.
This allows vendors with alternative vendor device ids to use
this library on their own device BAR.
u64 dma_mask;
If defined by the driver, this mask will be used in a call to
dma_set_mask_and_coherent() instead of the traditional
DMA_BIT_MASK(64). This allows limiting the DMA space on
vendor devices with address limitations.
Signed-off-by: Shannon Nelson <shannon.nelson@amd.com>
---
drivers/virtio/virtio_pci_modern_dev.c | 37 +++++++++++++++++---------
include/linux/virtio_pci_modern.h | 6 +++++
2 files changed, 31 insertions(+), 12 deletions(-)
diff --git a/drivers/virtio/virtio_pci_modern_dev.c b/drivers/virtio/virtio_pci_modern_dev.c
index 869cb46bef96..1f2db76e8f91 100644
--- a/drivers/virtio/virtio_pci_modern_dev.c
+++ b/drivers/virtio/virtio_pci_modern_dev.c
@@ -218,21 +218,29 @@ int vp_modern_probe(struct virtio_pci_modern_device *mdev)
int err, common, isr, notify, device;
u32 notify_length;
u32 notify_offset;
+ int devid;
check_offsets();
- /* We only own devices >= 0x1000 and <= 0x107f: leave the rest. */
- if (pci_dev->device < 0x1000 || pci_dev->device > 0x107f)
- return -ENODEV;
-
- if (pci_dev->device < 0x1040) {
- /* Transitional devices: use the PCI subsystem device id as
- * virtio device id, same as legacy driver always did.
- */
- mdev->id.device = pci_dev->subsystem_device;
+ if (mdev->device_id_check) {
+ devid = mdev->device_id_check(pci_dev);
+ if (devid < 0)
+ return devid;
+ mdev->id.device = devid;
} else {
- /* Modern devices: simply use PCI device id, but start from 0x1040. */
- mdev->id.device = pci_dev->device - 0x1040;
+ /* We only own devices >= 0x1000 and <= 0x107f: leave the rest. */
+ if (pci_dev->device < 0x1000 || pci_dev->device > 0x107f)
+ return -ENODEV;
+
+ if (pci_dev->device < 0x1040) {
+ /* Transitional devices: use the PCI subsystem device id as
+ * virtio device id, same as legacy driver always did.
+ */
+ mdev->id.device = pci_dev->subsystem_device;
+ } else {
+ /* Modern devices: simply use PCI device id, but start from 0x1040. */
+ mdev->id.device = pci_dev->device - 0x1040;
+ }
}
mdev->id.vendor = pci_dev->subsystem_vendor;
@@ -260,7 +268,12 @@ int vp_modern_probe(struct virtio_pci_modern_device *mdev)
return -EINVAL;
}
- err = dma_set_mask_and_coherent(&pci_dev->dev, DMA_BIT_MASK(64));
+ if (mdev->dma_mask)
+ err = dma_set_mask_and_coherent(&pci_dev->dev,
+ mdev->dma_mask);
+ else
+ err = dma_set_mask_and_coherent(&pci_dev->dev,
+ DMA_BIT_MASK(64));
if (err)
err = dma_set_mask_and_coherent(&pci_dev->dev,
DMA_BIT_MASK(32));
diff --git a/include/linux/virtio_pci_modern.h b/include/linux/virtio_pci_modern.h
index c4eeb79b0139..067ac1d789bc 100644
--- a/include/linux/virtio_pci_modern.h
+++ b/include/linux/virtio_pci_modern.h
@@ -38,6 +38,12 @@ struct virtio_pci_modern_device {
int modern_bars;
struct virtio_device_id id;
+
+ /* optional check for vendor virtio device, returns dev_id or -ERRNO */
+ int (*device_id_check)(struct pci_dev *pdev);
+
+ /* optional mask for devices with limited DMA space */
+ u64 dma_mask;
};
/*
--
2.17.1
next prev parent reply other threads:[~2023-04-25 21:26 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-25 21:25 [PATCH v4 virtio 00/10] pds_vdpa driver Shannon Nelson
2023-04-25 21:25 ` Shannon Nelson [this message]
2023-04-26 2:09 ` [PATCH v4 virtio 01/10] virtio: allow caller to override device id and DMA mask Xuan Zhuo
2023-04-26 2:41 ` Shannon Nelson
2023-05-01 14:44 ` Simon Horman
2023-05-03 14:21 ` Shannon Nelson
2023-04-25 21:25 ` [PATCH v4 virtio 02/10] pds_vdpa: Add new vDPA driver for AMD/Pensando DSC Shannon Nelson
2023-05-01 15:08 ` Simon Horman
2023-04-25 21:25 ` [PATCH v4 virtio 03/10] pds_vdpa: move enum from common to adminq header Shannon Nelson
2023-05-01 14:57 ` Simon Horman
2023-05-01 15:11 ` Simon Horman
2023-04-25 21:25 ` [PATCH v4 virtio 04/10] pds_vdpa: new adminq entries Shannon Nelson
2023-05-01 14:58 ` Simon Horman
2023-04-25 21:25 ` [PATCH v4 virtio 05/10] pds_vdpa: get vdpa management info Shannon Nelson
2023-05-01 15:07 ` Simon Horman
2023-04-25 21:25 ` [PATCH v4 virtio 06/10] pds_vdpa: virtio bar setup for vdpa Shannon Nelson
2023-05-01 15:07 ` Simon Horman
2023-04-25 21:25 ` [PATCH v4 virtio 07/10] pds_vdpa: add vdpa config client commands Shannon Nelson
2023-05-01 15:08 ` Simon Horman
2023-04-25 21:26 ` [PATCH v4 virtio 08/10] pds_vdpa: add support for vdpa and vdpamgmt interfaces Shannon Nelson
2023-05-01 15:09 ` Simon Horman
2023-04-25 21:26 ` [PATCH v4 virtio 09/10] pds_vdpa: subscribe to the pds_core events Shannon Nelson
2023-05-01 15:08 ` Simon Horman
2023-04-25 21:26 ` [PATCH v4 virtio 10/10] pds_vdpa: pds_vdps.rst and Kconfig Shannon Nelson
2023-05-01 15:09 ` Simon Horman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230425212602.1157-2-shannon.nelson@amd.com \
--to=shannon.nelson@amd.com \
--cc=brett.creeley@amd.com \
--cc=drivers@pensando.io \
--cc=jasowang@redhat.com \
--cc=mst@redhat.com \
--cc=netdev@vger.kernel.org \
--cc=virtualization@lists.linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).