Index: head/sys/dev/virtio/balloon/virtio_balloon.c =================================================================== --- head/sys/dev/virtio/balloon/virtio_balloon.c +++ head/sys/dev/virtio/balloon/virtio_balloon.c @@ -158,16 +158,14 @@ MODULE_VERSION(virtio_balloon, 1); MODULE_DEPEND(virtio_balloon, virtio, 1, 1, 1); +VIRTIO_SIMPLE_PNPTABLE(virtio_balloon, VIRTIO_ID_BALLOON, + "VirtIO Balloon Adapter"); +VIRTIO_SIMPLE_PNPINFO(virtio_pci, virtio_balloon); + static int vtballoon_probe(device_t dev) { - - if (virtio_get_device_type(dev) != VIRTIO_ID_BALLOON) - return (ENXIO); - - device_set_desc(dev, "VirtIO Balloon Adapter"); - - return (BUS_PROBE_DEFAULT); + return (VIRTIO_SIMPLE_PROBE(dev, virtio_balloon)); } static int Index: head/sys/dev/virtio/block/virtio_blk.c =================================================================== --- head/sys/dev/virtio/block/virtio_blk.c +++ head/sys/dev/virtio/block/virtio_blk.c @@ -261,6 +261,10 @@ MODULE_VERSION(virtio_blk, 1); MODULE_DEPEND(virtio_blk, virtio, 1, 1, 1); +VIRTIO_SIMPLE_PNPTABLE(virtio_blk, VIRTIO_ID_BLOCK, "VirtIO Block Adapter"); +VIRTIO_SIMPLE_PNPINFO(virtio_mmio, virtio_blk); +VIRTIO_SIMPLE_PNPINFO(virtio_pci, virtio_blk); + static int vtblk_modevent(module_t mod, int type, void *unused) { @@ -285,13 +289,7 @@ static int vtblk_probe(device_t dev) { - - if (virtio_get_device_type(dev) != VIRTIO_ID_BLOCK) - return (ENXIO); - - device_set_desc(dev, "VirtIO Block Adapter"); - - return (BUS_PROBE_DEFAULT); + return (VIRTIO_SIMPLE_PROBE(dev, virtio_blk)); } static int Index: head/sys/dev/virtio/console/virtio_console.c =================================================================== --- head/sys/dev/virtio/console/virtio_console.c +++ head/sys/dev/virtio/console/virtio_console.c @@ -261,6 +261,10 @@ MODULE_VERSION(virtio_console, 1); MODULE_DEPEND(virtio_console, virtio, 1, 1, 1); +VIRTIO_SIMPLE_PNPTABLE(virtio_console, VIRTIO_ID_CONSOLE, + "VirtIO Console Adapter"); +VIRTIO_SIMPLE_PNPINFO(virtio_pci, virtio_console); + static int vtcon_modevent(module_t mod, int type, void *unused) { @@ -305,13 +309,7 @@ static int vtcon_probe(device_t dev) { - - if (virtio_get_device_type(dev) != VIRTIO_ID_CONSOLE) - return (ENXIO); - - device_set_desc(dev, "VirtIO Console Adapter"); - - return (BUS_PROBE_DEFAULT); + return (VIRTIO_SIMPLE_PROBE(dev, virtio_console)); } static int Index: head/sys/dev/virtio/network/if_vtnet.c =================================================================== --- head/sys/dev/virtio/network/if_vtnet.c +++ head/sys/dev/virtio/network/if_vtnet.c @@ -325,6 +325,10 @@ MODULE_DEPEND(vtnet, netmap, 1, 1, 1); #endif /* DEV_NETMAP */ +VIRTIO_SIMPLE_PNPTABLE(vtnet, VIRTIO_ID_NETWORK, "VirtIO Networking Adapter"); +VIRTIO_SIMPLE_PNPINFO(virtio_mmio, vtnet); +VIRTIO_SIMPLE_PNPINFO(virtio_pci, vtnet); + static int vtnet_modevent(module_t mod, int type, void *unused) { @@ -361,13 +365,7 @@ static int vtnet_probe(device_t dev) { - - if (virtio_get_device_type(dev) != VIRTIO_ID_NETWORK) - return (ENXIO); - - device_set_desc(dev, "VirtIO Networking Adapter"); - - return (BUS_PROBE_DEFAULT); + return (VIRTIO_SIMPLE_PROBE(dev, vtnet)); } static int Index: head/sys/dev/virtio/random/virtio_random.c =================================================================== --- head/sys/dev/virtio/random/virtio_random.c +++ head/sys/dev/virtio/random/virtio_random.c @@ -102,6 +102,10 @@ MODULE_DEPEND(virtio_random, virtio, 1, 1, 1); MODULE_DEPEND(virtio_random, random_device, 1, 1, 1); +VIRTIO_SIMPLE_PNPTABLE(virtio_random, VIRTIO_ID_ENTROPY, + "VirtIO Entropy Adapter"); +VIRTIO_SIMPLE_PNPINFO(virtio_pci, virtio_random); + static int vtrnd_modevent(module_t mod, int type, void *unused) { @@ -125,13 +129,7 @@ static int vtrnd_probe(device_t dev) { - - if (virtio_get_device_type(dev) != VIRTIO_ID_ENTROPY) - return (ENXIO); - - device_set_desc(dev, "VirtIO Entropy Adapter"); - - return (BUS_PROBE_DEFAULT); + return (VIRTIO_SIMPLE_PROBE(dev, virtio_random)); } static int Index: head/sys/dev/virtio/scsi/virtio_scsi.c =================================================================== --- head/sys/dev/virtio/scsi/virtio_scsi.c +++ head/sys/dev/virtio/scsi/virtio_scsi.c @@ -233,6 +233,9 @@ MODULE_DEPEND(virtio_scsi, virtio, 1, 1, 1); MODULE_DEPEND(virtio_scsi, cam, 1, 1, 1); +VIRTIO_SIMPLE_PNPTABLE(virtio_scsi, VIRTIO_ID_SCSI, "VirtIO SCSI Adapter"); +VIRTIO_SIMPLE_PNPINFO(virtio_pci, virtio_scsi); + static int vtscsi_modevent(module_t mod, int type, void *unused) { @@ -256,13 +259,7 @@ static int vtscsi_probe(device_t dev) { - - if (virtio_get_device_type(dev) != VIRTIO_ID_SCSI) - return (ENXIO); - - device_set_desc(dev, "VirtIO SCSI Adapter"); - - return (BUS_PROBE_DEFAULT); + return (VIRTIO_SIMPLE_PROBE(dev, virtio_scsi)); } static int Index: head/sys/dev/virtio/virtio.h =================================================================== --- head/sys/dev/virtio/virtio.h +++ head/sys/dev/virtio/virtio.h @@ -63,6 +63,21 @@ const char *vfd_str; }; +struct virtio_pnp_match { + uint32_t device_type; + const char *description; +}; +#define VIRTIO_SIMPLE_PNPTABLE(driver, devtype, desc) \ + static const struct virtio_pnp_match driver ## _match = { \ + .device_type = devtype, \ + .description = desc, \ + } +#define VIRTIO_SIMPLE_PNPINFO(bus, driver) \ + MODULE_PNP_INFO("U32:device_type;D:#", bus, driver, \ + &driver ## _match, 1) +#define VIRTIO_SIMPLE_PROBE(dev, driver) \ + (virtio_simple_probe(dev, &driver ## _match)) + const char *virtio_device_name(uint16_t devid); void virtio_describe(device_t dev, const char *msg, uint64_t features, struct virtio_feature_desc *feature_desc); @@ -145,5 +160,15 @@ VIRTIO_WRITE_IVAR(feature_desc, VIRTIO_IVAR_FEATURE_DESC); #undef VIRTIO_WRITE_IVAR + +static inline int +virtio_simple_probe(device_t dev, const struct virtio_pnp_match *match) +{ + + if (virtio_get_device_type(dev) != match->device_type) + return (ENXIO); + device_set_desc(dev, match->description); + return (BUS_PROBE_DEFAULT); +} #endif /* _VIRTIO_H_ */