All the virtio pci device is set to class code 0x010000, this is wrong.
This patch sets the correct class code and makes lspci report correct
class type. For example, the net device:
Before:
$ lspci
00:03.0 SCSI storage controller: Red Hat, Inc Virtio network device
After:
$ lspci
00:03.0 Ethernet controller: Red Hat, Inc Virtio network device
Acked-by: Sasha Levin <levinsasha928@gmail.com>
Signed-off-by: Asias He <asias.hejun@gmail.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
#define PCI_SUBSYSTEM_ID_VESA 0x0004
#define PCI_SUBSYSTEM_ID_PCI_SHMEM 0x0001
+#define PCI_CLASS_BLK 0x018000
+#define PCI_CLASS_NET 0x020000
+#define PCI_CLASS_CONSOLE 0x078000
+/*
+ * 0xFF Device does not fit in any defined classes
+ */
+#define PCI_CLASS_RNG 0xff0000
+#define PCI_CLASS_BLN 0xff0000
+#define PCI_CLASS_P9 0xff0000
+
#endif /* VIRTIO_PCI_DEV_H_ */
};
int virtio_pci__init(struct kvm *kvm, struct virtio_pci *vpci, void *dev,
- int device_id, int subsys_id);
+ int device_id, int subsys_id, int class);
int virtio_pci__signal_vq(struct kvm *kvm, struct virtio_pci *vpci, u32 vq);
int virtio_pci__signal_config(struct kvm *kvm, struct virtio_pci *vpci);
struct p9_dev *p9dev;
list_for_each_entry(p9dev, &devs, list) {
- virtio_pci__init(kvm, &p9dev->vpci, p9dev, PCI_DEVICE_ID_VIRTIO_P9, VIRTIO_ID_9P);
+ virtio_pci__init(kvm, &p9dev->vpci, p9dev, PCI_DEVICE_ID_VIRTIO_P9, VIRTIO_ID_9P, PCI_CLASS_P9);
p9dev->vpci.ops = (struct virtio_pci_ops) {
.set_config = set_config,
.get_config = get_config,
bdev.stat_waitfd = eventfd(0, 0);
memset(&bdev.config, 0, sizeof(struct virtio_balloon_config));
- virtio_pci__init(kvm, &bdev.vpci, &bdev, PCI_DEVICE_ID_VIRTIO_BLN, VIRTIO_ID_BALLOON);
+ virtio_pci__init(kvm, &bdev.vpci, &bdev, PCI_DEVICE_ID_VIRTIO_BLN, VIRTIO_ID_BALLOON, PCI_CLASS_BLN);
bdev.vpci.ops = (struct virtio_pci_ops) {
.set_config = set_config,
.get_config = get_config,
},
};
- virtio_pci__init(kvm, &bdev->vpci, bdev, PCI_DEVICE_ID_VIRTIO_BLK, VIRTIO_ID_BLOCK);
+ virtio_pci__init(kvm, &bdev->vpci, bdev, PCI_DEVICE_ID_VIRTIO_BLK, VIRTIO_ID_BLOCK, PCI_CLASS_BLK);
bdev->vpci.ops = (struct virtio_pci_ops) {
.set_config = set_config,
.get_config = get_config,
void virtio_console__init(struct kvm *kvm)
{
- virtio_pci__init(kvm, &cdev.vpci, &cdev, PCI_DEVICE_ID_VIRTIO_CONSOLE, VIRTIO_ID_CONSOLE);
+ virtio_pci__init(kvm, &cdev.vpci, &cdev, PCI_DEVICE_ID_VIRTIO_CONSOLE, VIRTIO_ID_CONSOLE, PCI_CLASS_CONSOLE);
cdev.vpci.ops = (struct virtio_pci_ops) {
.set_config = set_config,
.get_config = get_config,
ndev->ops = &uip_ops;
}
- virtio_pci__init(kvm, &ndev->vpci, ndev, PCI_DEVICE_ID_VIRTIO_NET, VIRTIO_ID_NET);
+ virtio_pci__init(kvm, &ndev->vpci, ndev, PCI_DEVICE_ID_VIRTIO_NET, VIRTIO_ID_NET, PCI_CLASS_NET);
ndev->vpci.ops = (struct virtio_pci_ops) {
.set_config = set_config,
.get_config = get_config,
}
int virtio_pci__init(struct kvm *kvm, struct virtio_pci *vpci, void *dev,
- int device_id, int subsys_id)
+ int device_id, int subsys_id, int class)
{
u8 pin, line, ndev;
.device_id = device_id,
.header_type = PCI_HEADER_TYPE_NORMAL,
.revision_id = 0,
- .class = 0x010000,
+ .class = class,
.subsys_vendor_id = PCI_SUBSYSTEM_VENDOR_ID_REDHAT_QUMRANET,
.subsys_id = subsys_id,
.bar[0] = vpci->base_addr | PCI_BASE_ADDRESS_SPACE_IO,
if (rdev->fd < 0)
die("Failed initializing RNG");
- virtio_pci__init(kvm, &rdev->vpci, rdev, PCI_DEVICE_ID_VIRTIO_RNG, VIRTIO_ID_RNG);
+ virtio_pci__init(kvm, &rdev->vpci, rdev, PCI_DEVICE_ID_VIRTIO_RNG, VIRTIO_ID_RNG, PCI_CLASS_RNG);
rdev->vpci.ops = (struct virtio_pci_ops) {
.set_config = set_config,
.get_config = get_config,