svn commit: r348598 - in head/sys/dev/virtio: . mmio pci
Conrad Meyer
cem at FreeBSD.org
Tue Jun 4 02:35:01 UTC 2019
Author: cem
Date: Tue Jun 4 02:34:59 2019
New Revision: 348598
URL: https://svnweb.freebsd.org/changeset/base/348598
Log:
virtio(4): Expose PNP metadata through newbus
Expose the same fields and widths from both vtio buses, even though they
don't quite line up; several virtio drivers can attach to both buses,
and sharing a PNP info table for both seems more convenient.
In practice, I doubt any virtio driver really needs to match on anything
other than bus and device_type (eliminating the unused entries for
vtmmio), and also in practice device_type is << 2^16 (so far, values
range from 1 to 20). So it might be fine to only expose a 16-bit
device_type for PNP purposes. On the other hand, I don't see much harm
in overkill here.
Reviewed by: bryanv, markj (earlier version)
Differential Revision: https://reviews.freebsd.org/D20406
Modified:
head/sys/dev/virtio/mmio/virtio_mmio.c
head/sys/dev/virtio/pci/virtio_pci.c
head/sys/dev/virtio/virtio.c
head/sys/dev/virtio/virtio.h
Modified: head/sys/dev/virtio/mmio/virtio_mmio.c
==============================================================================
--- head/sys/dev/virtio/mmio/virtio_mmio.c Tue Jun 4 01:00:30 2019 (r348597)
+++ head/sys/dev/virtio/mmio/virtio_mmio.c Tue Jun 4 02:34:59 2019 (r348598)
@@ -145,6 +145,7 @@ static device_method_t vtmmio_methods[] = {
/* Bus interface. */
DEVMETHOD(bus_driver_added, vtmmio_driver_added),
DEVMETHOD(bus_child_detached, vtmmio_child_detached),
+ DEVMETHOD(bus_child_pnpinfo_str, virtio_child_pnpinfo_str),
DEVMETHOD(bus_read_ivar, vtmmio_read_ivar),
DEVMETHOD(bus_write_ivar, vtmmio_write_ivar),
@@ -331,6 +332,14 @@ vtmmio_read_ivar(device_t dev, device_t child, int ind
break;
case VIRTIO_IVAR_VENDOR:
*result = vtmmio_read_config_4(sc, VIRTIO_MMIO_VENDOR_ID);
+ break;
+ case VIRTIO_IVAR_SUBVENDOR:
+ case VIRTIO_IVAR_DEVICE:
+ /*
+ * Dummy value for fields not present in this bus. Used by
+ * bus-agnostic virtio_child_pnpinfo_str.
+ */
+ *result = 0;
break;
default:
return (ENOENT);
Modified: head/sys/dev/virtio/pci/virtio_pci.c
==============================================================================
--- head/sys/dev/virtio/pci/virtio_pci.c Tue Jun 4 01:00:30 2019 (r348597)
+++ head/sys/dev/virtio/pci/virtio_pci.c Tue Jun 4 02:34:59 2019 (r348598)
@@ -200,6 +200,7 @@ static device_method_t vtpci_methods[] = {
/* Bus interface. */
DEVMETHOD(bus_driver_added, vtpci_driver_added),
DEVMETHOD(bus_child_detached, vtpci_child_detached),
+ DEVMETHOD(bus_child_pnpinfo_str, virtio_child_pnpinfo_str),
DEVMETHOD(bus_read_ivar, vtpci_read_ivar),
DEVMETHOD(bus_write_ivar, vtpci_write_ivar),
Modified: head/sys/dev/virtio/virtio.c
==============================================================================
--- head/sys/dev/virtio/virtio.c Tue Jun 4 01:00:30 2019 (r348597)
+++ head/sys/dev/virtio/virtio.c Tue Jun 4 02:34:59 2019 (r348598)
@@ -263,6 +263,30 @@ virtio_write_device_config(device_t dev, bus_size_t of
offset, dst, len);
}
+int
+virtio_child_pnpinfo_str(device_t busdev __unused, device_t child, char *buf,
+ size_t buflen)
+{
+
+ /*
+ * All of these PCI fields will be only 16 bits, but on the vtmmio bus
+ * the corresponding fields (only "vendor" and "device_type") are 32
+ * bits. Many virtio drivers can attach below either bus.
+ * Gratuitously expand these two fields to 32-bits to allow sharing PNP
+ * match table data between the mostly-similar buses.
+ *
+ * Subdevice and device_type are redundant in both buses, so I don't
+ * see a lot of PNP utility in exposing the same value under a
+ * different name.
+ */
+ snprintf(buf, buflen, "vendor=0x%08x device=0x%04x subvendor=0x%04x "
+ "device_type=0x%08x", (unsigned)virtio_get_vendor(child),
+ (unsigned)virtio_get_device(child),
+ (unsigned)virtio_get_subvendor(child),
+ (unsigned)virtio_get_device_type(child));
+ return (0);
+}
+
static int
virtio_modevent(module_t mod, int type, void *unused)
{
Modified: head/sys/dev/virtio/virtio.h
==============================================================================
--- head/sys/dev/virtio/virtio.h Tue Jun 4 01:00:30 2019 (r348597)
+++ head/sys/dev/virtio/virtio.h Tue Jun 4 02:34:59 2019 (r348598)
@@ -81,6 +81,8 @@ void virtio_stop(device_t dev);
int virtio_config_generation(device_t dev);
int virtio_reinit(device_t dev, uint64_t features);
void virtio_reinit_complete(device_t dev);
+int virtio_child_pnpinfo_str(device_t busdev, device_t child, char *buf,
+ size_t buflen);
/*
* Read/write a variable amount from the device specific (ie, network)
More information about the svn-src-all
mailing list