mirror of
https://git.FreeBSD.org/src.git
synced 2024-10-18 02:19:39 +00:00
virtio(4): Add PNP match metadata for virtio devices
Register MODULE_PNP_INFO for virtio devices using the newbus PNP information provided by the previous commit. Matching can be quite simple; existing probe routines only matched on bus (implicit) and device_type. The same matching criteria are retained exactly, but is now also available to devmatch(8). Reviewed by: bryanv, markj; imp (earlier version) Differential Revision: https://reviews.freebsd.org/D20407
This commit is contained in:
parent
dfca0a8b3d
commit
0f6040f03e
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=348599
@ -158,16 +158,14 @@ DRIVER_MODULE(virtio_balloon, virtio_pci, vtballoon_driver,
|
||||
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
|
||||
|
@ -261,6 +261,10 @@ DRIVER_MODULE(virtio_blk, virtio_pci, vtblk_driver, vtblk_devclass,
|
||||
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 @@ vtblk_modevent(module_t mod, int type, void *unused)
|
||||
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
|
||||
|
@ -261,6 +261,10 @@ DRIVER_MODULE(virtio_console, virtio_pci, vtcon_driver, vtcon_devclass,
|
||||
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 @@ vtcon_drain_all(void)
|
||||
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
|
||||
|
@ -325,6 +325,10 @@ MODULE_DEPEND(vtnet, virtio, 1, 1, 1);
|
||||
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 @@ vtnet_modevent(module_t mod, int type, void *unused)
|
||||
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
|
||||
|
@ -102,6 +102,10 @@ MODULE_VERSION(virtio_random, 1);
|
||||
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 @@ vtrnd_modevent(module_t mod, int type, void *unused)
|
||||
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
|
||||
|
@ -233,6 +233,9 @@ MODULE_VERSION(virtio_scsi, 1);
|
||||
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 @@ vtscsi_modevent(module_t mod, int type, void *unused)
|
||||
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
|
||||
|
@ -63,6 +63,21 @@ struct virtio_feature_desc {
|
||||
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);
|
||||
@ -146,4 +161,14 @@ 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_ */
|
||||
|
Loading…
Reference in New Issue
Block a user