[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 07/25] virtio: find version 1.0 virtio capabiliti
From: |
Gerd Hoffmann |
Subject: |
[Qemu-devel] [PATCH v3 07/25] virtio: find version 1.0 virtio capabilities |
Date: |
Wed, 1 Jul 2015 16:40:52 +0200 |
virtio 1.0 specifies the location of the various virtio regions
using pci capabilities. Look them up and store the results.
Signed-off-by: Gerd Hoffmann <address@hidden>
---
src/hw/virtio-pci.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++
src/hw/virtio-pci.h | 8 ++++++++
2 files changed, 64 insertions(+)
diff --git a/src/hw/virtio-pci.c b/src/hw/virtio-pci.c
index 9428d04..58f3d39 100644
--- a/src/hw/virtio-pci.c
+++ b/src/hw/virtio-pci.c
@@ -87,6 +87,62 @@ fail:
void vp_init_simple(struct vp_device *vp, struct pci_device *pci)
{
+ u8 cap = pci_find_capability(pci, PCI_CAP_ID_VNDR, 0);
+ struct vp_cap *vp_cap;
+ u32 addr, offset;
+ u8 type;
+
+ memset(vp, 0, sizeof(*vp));
+ while (cap != 0) {
+ type = pci_config_readb(pci->bdf, cap +
+ offsetof(struct virtio_pci_cap, cfg_type));
+ switch (type) {
+ case VIRTIO_PCI_CAP_COMMON_CFG:
+ vp_cap = &vp->common;
+ break;
+ case VIRTIO_PCI_CAP_NOTIFY_CFG:
+ vp_cap = &vp->notify;
+ break;
+ case VIRTIO_PCI_CAP_ISR_CFG:
+ vp_cap = &vp->isr;
+ break;
+ case VIRTIO_PCI_CAP_DEVICE_CFG:
+ vp_cap = &vp->device;
+ break;
+ default:
+ vp_cap = NULL;
+ break;
+ }
+ if (vp_cap && !vp_cap->cap) {
+ vp_cap->cap = cap;
+ vp_cap->bar = pci_config_readb(pci->bdf, cap +
+ offsetof(struct virtio_pci_cap,
bar));
+ offset = pci_config_readl(pci->bdf, cap +
+ offsetof(struct virtio_pci_cap, offset));
+ addr = pci_config_readl(pci->bdf, PCI_BASE_ADDRESS_0 + 4 *
vp_cap->bar);
+ if (addr & PCI_BASE_ADDRESS_SPACE_IO) {
+ vp_cap->is_io = 1;
+ addr &= PCI_BASE_ADDRESS_IO_MASK;
+ } else {
+ vp_cap->is_io = 0;
+ addr &= PCI_BASE_ADDRESS_MEM_MASK;
+ }
+ vp_cap->addr = addr + offset;
+ dprintf(3, "pci dev %x:%x virtio cap at 0x%x type %d "
+ "bar %d at 0x%08x off +0x%04x [%s]\n",
+ pci_bdf_to_bus(pci->bdf), pci_bdf_to_dev(pci->bdf),
+ vp_cap->cap, type, vp_cap->bar, addr, offset,
+ vp_cap->is_io ? "io" : "mmio");
+ }
+
+ cap = pci_find_capability(pci, PCI_CAP_ID_VNDR, cap);
+ }
+
+ if (vp->common.cap && vp->notify.cap && vp->isr.cap && vp->device.cap) {
+ dprintf(1, "pci dev %x:%x supports virtio 1.0\n",
+ pci_bdf_to_bus(pci->bdf), pci_bdf_to_dev(pci->bdf));
+ }
+
vp->ioaddr = pci_config_readl(pci->bdf, PCI_BASE_ADDRESS_0) &
PCI_BASE_ADDRESS_IO_MASK;
diff --git a/src/hw/virtio-pci.h b/src/hw/virtio-pci.h
index 42e2b7f..467c02f 100644
--- a/src/hw/virtio-pci.h
+++ b/src/hw/virtio-pci.h
@@ -115,8 +115,16 @@ typedef struct virtio_pci_isr {
/* --- driver structs ----------------------------------------------- */
+struct vp_cap {
+ u32 addr;
+ u8 cap;
+ u8 bar;
+ u8 is_io;
+};
+
struct vp_device {
unsigned int ioaddr;
+ struct vp_cap common, notify, isr, device;
};
static inline u32 vp_get_features(struct vp_device *vp)
--
1.8.3.1
- [Qemu-devel] [PATCH v3 10/25] virtio: make features 64bit, support version 1.0 features, (continued)
- [Qemu-devel] [PATCH v3 10/25] virtio: make features 64bit, support version 1.0 features, Gerd Hoffmann, 2015/07/01
- [Qemu-devel] [PATCH v3 03/25] virtio: add struct vp_device, Gerd Hoffmann, 2015/07/01
- [Qemu-devel] [PATCH v3 09/25] virtio: add read/write functions and macros, Gerd Hoffmann, 2015/07/01
- [Qemu-devel] [PATCH v3 05/25] virtio: add version 1.0 structs and #defines, Gerd Hoffmann, 2015/07/01
- [Qemu-devel] [PATCH v3 15/25] virtio: remove unused vp_del_vq, Gerd Hoffmann, 2015/07/01
- [Qemu-devel] [PATCH v3 19/25] virtio: use version 1.0 if available (flip the big switch), Gerd Hoffmann, 2015/07/01
- [Qemu-devel] [PATCH v3 12/25] virtio: add version 1.0 support to vp_get_isr, Gerd Hoffmann, 2015/07/01
- [Qemu-devel] [PATCH v3 11/25] virtio: add version 1.0 support to vp_{get, set}_status, Gerd Hoffmann, 2015/07/01
- [Qemu-devel] [PATCH v3 23/25] virtio-scsi: 32bit cleanup, Gerd Hoffmann, 2015/07/01
- [Qemu-devel] [PATCH v3 13/25] virtio: add version 1.0 support to vp_reset, Gerd Hoffmann, 2015/07/01
- [Qemu-devel] [PATCH v3 07/25] virtio: find version 1.0 virtio capabilities,
Gerd Hoffmann <=
- [Qemu-devel] [PATCH v3 21/25] virtio: legacy cleanup, Gerd Hoffmann, 2015/07/01
- [Qemu-devel] [PATCH v3 22/25] virtio-blk: 32bit cleanup, Gerd Hoffmann, 2015/07/01
- [Qemu-devel] [PATCH v3 24/25] virtio-ring: 32bit cleanup, Gerd Hoffmann, 2015/07/01
- [Qemu-devel] [PATCH v3 20/25] virtio: also probe version 1.0 pci ids, Gerd Hoffmann, 2015/07/01
- [Qemu-devel] [PATCH v3 17/25] virtio-scsi: fix initialization for version 1.0, Gerd Hoffmann, 2015/07/01
- [Qemu-devel] [PATCH v3 16/25] virtio: add version 1.0 support to vp_find_vq, Gerd Hoffmann, 2015/07/01
- [Qemu-devel] [PATCH v3 18/25] virtio-blk: fix initialization for version 1.0, Gerd Hoffmann, 2015/07/01
- [Qemu-devel] [PATCH v3 14/25] virtio: add version 1.0 support to vp_notify, Gerd Hoffmann, 2015/07/01
- [Qemu-devel] [PATCH v3 25/25] virtio-pci: use high memory for rings, Gerd Hoffmann, 2015/07/01
- Re: [Qemu-devel] [SeaBIOS] [PATCH v3 00/25] virtio: add version 1.0 support, move to 32bit, Kevin O'Connor, 2015/07/01