]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
kvm, pci: fill up virtio device configuration header
authorAsias He <asias.hejun@gmail.com>
Sat, 7 Aug 2010 06:47:25 +0000 (14:47 +0800)
committerPekka Enberg <penberg@cs.helsinki.fi>
Sun, 8 Aug 2010 15:02:51 +0000 (18:02 +0300)
IO     base address register must be aligned at  4 bytes.
Memory base address register must be aligned at 16 bytes.
We should not shift io port or memory address in base address register.
See PCI_System_Architecture_FourthEdition Page 427.

We need more io space for virtio device, qemu-kvm uses 64 byes,
so io space reserved for bios is not enough.

See drivers/virtio/virtio_pci.c
static struct virtio_config_ops virtio_pci_config_ops = {
        .get            = vp_get,
        .set            = vp_set,
        .get_status     = vp_get_status,
        .set_status     = vp_set_status,
        .reset          = vp_reset,
        .find_vqs       = vp_find_vqs,
        .del_vqs        = vp_del_vqs,
        .get_features   = vp_get_features,
        .finalize_features = vp_finalize_features,
};

---------------------------------------------------------------------
guest_using_virtio_blk $ lspci -xxx
00:04.0 SCSI storage controller: Qumranet, Inc. Virtio block device
00: f4 1a 01 10 03 00 10 00 00 00 00 01 00 00 00 00
10: 01 c2 00 00 00 00 03 f2 00 00 00 00 00 00 00 00
20: 00 00 00 00 00 00 00 00 00 00 00 00 f4 1a 02 00
30: 00 00 00 00 40 00 00 00 00 00 00 00 0b 01 00 00
40: 11 00 01 80 01 00 00 00 01 08 00 00 00 00 00 00
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
---------------------------------------------------------------------
guest_using_virtio_blk $  cat /proc/iomem
f2030000-f2030fff : 0000:00:04.0
  f2030000-f2030fff : virtio-pci
---------------------------------------------------------------------
guest_using_virtio_blk $ cat /proc/ioports
c200-c23f : 0000:00:04.0
  c200-c23f : virtio-pci
---------------------------------------------------------------------

$ ./kvm bzImage #virtio enabled guest kernel
Logs:
[    0.548000] virtio-pci 0000:00:01.0: enabling device (0000 -> 0001)
[    0.549000] asias:drivers/virtio/virtio.c:virtio_dev_probe
[    0.549000] asias:drivers/virtio/virtio_pci.c:vp_get_features
  Info: virtio_io
[    0.549000] asias:drivers/block/virtio_blk.c:virtblk_probe
[    0.549000] virtio_blk: probe of virtio0 failed with error -16

Signed-off-by: Asias He <asias.hejun@gmail.com>
Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi>
tools/kvm/include/kvm/ioport.h
tools/kvm/pci.c

index 42438500a1eea60858f3f1134f0a2eb6bee6ca59..75678c0974a53c00e872d04253e660ab7038a054 100644 (file)
@@ -6,7 +6,7 @@
 
 /* some ports we reserve for own use */
 #define IOPORT_DBG     0xe0
-#define IOPORT_VIRTIO  0xea
+#define IOPORT_VIRTIO  0xc200
 
 struct kvm;
 
index 13414940f280f8189b6bc36182441e30f7a0270c..39db138a7c31f0496ffe4a80d8c2011f1e4859b5 100644 (file)
@@ -34,15 +34,20 @@ static bool pci_config_data_out(struct kvm *self, uint16_t port, void *data, int
        return true;
 }
 
-#define PCI_VENDOR_ID_REDHAT_QUMRANET  0x1af4
-#define PCI_DEVICE_ID_VIRTIO_BLK       0x1001
+#define PCI_VENDOR_ID_REDHAT_QUMRANET          0x1af4
+#define PCI_DEVICE_ID_VIRTIO_BLK               0x1001
+#define PCI_SUBSYSTEM_VENDOR_ID_REDHAT_QUMRANET        0x1af4
+#define PCI_SUBSYSTEM_ID_VIRTIO_BLK            0x0002
 
 static struct pci_device_header virtio_device = {
        .vendor_id              = PCI_VENDOR_ID_REDHAT_QUMRANET,
        .device_id              = PCI_DEVICE_ID_VIRTIO_BLK,
        .header_type            = PCI_HEADER_TYPE_NORMAL,
-       /* .class                       = (0x01 << 16) | (0x01 << 8) | ((1<<7) |         * (1<<1)), */
-       .bar[0]                 = (IOPORT_VIRTIO << 4) | PCI_BASE_ADDRESS_SPACE_IO,
+       .revision_id            = 0,
+       .class                  = 0x010000,
+       .subsys_vendor_id       = PCI_SUBSYSTEM_VENDOR_ID_REDHAT_QUMRANET,
+       .subsys_id              = PCI_SUBSYSTEM_ID_VIRTIO_BLK,
+       .bar[0]                 = IOPORT_VIRTIO | PCI_BASE_ADDRESS_SPACE_IO,
 };
 
 static bool pci_device_matches(uint8_t bus_number, uint8_t device_number, uint8_t function_number)