From: "Michael S. Tsirkin" <mst@redhat.com>
To: Gerd Hoffmann <kraxel@redhat.com>
Cc: seabios@seabios.org, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v2 07/22] virtio: find version 1.0 virtio capabilities
Date: Wed, 1 Jul 2015 13:43:20 +0200 [thread overview]
Message-ID: <20150701133437-mutt-send-email-mst@redhat.com> (raw)
In-Reply-To: <1435653553-7728-8-git-send-email-kraxel@redhat.com>
On Tue, Jun 30, 2015 at 10:38:58AM +0200, Gerd Hoffmann wrote:
> 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 <kraxel@redhat.com>
> ---
> src/hw/virtio-pci.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> src/hw/virtio-pci.h | 8 ++++++++
> 2 files changed, 63 insertions(+)
>
> diff --git a/src/hw/virtio-pci.c b/src/hw/virtio-pci.c
> index 4971021..0acf65f 100644
> --- a/src/hw/virtio-pci.c
> +++ b/src/hw/virtio-pci.c
> @@ -88,6 +88,61 @@ fail:
> struct vp_device *vp_init_simple(struct pci_device *pci)
> {
> struct vp_device *vp = malloc_high(sizeof(*vp));
> + 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 = 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;
Hmm this seems to violate this rule in the spec:
The driver SHOULD use the first instance of each virtio structure type
they can support.
"can support" here means that bios was able to allocate
it during enumeration.
For example there could be both IO and memory, in this order
you need to check that IO/memory got enabled (in theory,
also that they are within parent bridge's windows - used
by some guests, but
seabios doesn't disable memmory/io in this strange way).
> diff --git a/src/hw/virtio-pci.h b/src/hw/virtio-pci.h
> index bc2eb05..0f57ca8 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
next prev parent reply other threads:[~2015-07-01 11:43 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-30 8:38 [Qemu-devel] [PATCH v2 00/22] virtio: add version 1.0 support Gerd Hoffmann
2015-06-30 8:38 ` [Qemu-devel] [PATCH v2 01/22] pci: allow to loop over capabilities Gerd Hoffmann
2015-06-30 8:38 ` [Qemu-devel] [PATCH v2 02/22] virtio: run drivers in 32bit mode Gerd Hoffmann
2015-06-30 14:36 ` [Qemu-devel] [SeaBIOS] " Kevin O'Connor
2015-07-01 7:27 ` Gerd Hoffmann
2015-07-01 8:08 ` [Qemu-devel] " Michael S. Tsirkin
2015-07-01 12:30 ` Gerd Hoffmann
2015-07-01 13:50 ` Michael S. Tsirkin
2015-07-01 13:59 ` Michael S. Tsirkin
2015-07-01 14:03 ` Gerd Hoffmann
2015-07-01 14:13 ` [Qemu-devel] [SeaBIOS] " Kevin O'Connor
2015-06-30 8:38 ` [Qemu-devel] [PATCH v2 03/22] virtio: add struct vp_device Gerd Hoffmann
2015-06-30 14:33 ` [Qemu-devel] [SeaBIOS] " Kevin O'Connor
2015-07-01 7:34 ` Gerd Hoffmann
2015-06-30 8:38 ` [Qemu-devel] [PATCH v2 04/22] virtio: pass struct pci_device to vp_init_simple Gerd Hoffmann
2015-06-30 8:38 ` [Qemu-devel] [PATCH v2 05/22] virtio: add version 1.0 structs and #defines Gerd Hoffmann
2015-06-30 8:38 ` [Qemu-devel] [PATCH v2 06/22] virtio: add version 0.9.5 struct Gerd Hoffmann
2015-06-30 8:38 ` [Qemu-devel] [PATCH v2 07/22] virtio: find version 1.0 virtio capabilities Gerd Hoffmann
2015-07-01 11:43 ` Michael S. Tsirkin [this message]
2015-07-01 12:24 ` Gerd Hoffmann
2015-07-01 12:28 ` Michael S. Tsirkin
2015-07-01 12:49 ` Gerd Hoffmann
2015-07-01 13:49 ` Michael S. Tsirkin
2015-06-30 8:38 ` [Qemu-devel] [PATCH v2 08/22] virtio: create vp_cap struct for legacy bar Gerd Hoffmann
2015-06-30 8:39 ` [Qemu-devel] [PATCH v2 09/22] virtio: add version 0.9.5 struct [fixup] Gerd Hoffmann
2015-06-30 8:39 ` [Qemu-devel] [PATCH v2 10/22] virtio: add read/write functions and macros Gerd Hoffmann
2015-06-30 8:39 ` [Qemu-devel] [PATCH v2 11/22] virtio: make features 64bit, support version 1.0 features Gerd Hoffmann
2015-06-30 8:39 ` [Qemu-devel] [PATCH v2 12/22] virtio: add version 1.0 support to vp_{get, set}_status Gerd Hoffmann
2015-06-30 8:39 ` [Qemu-devel] [PATCH v2 13/22] virtio: add version 1.0 support to vp_get_isr Gerd Hoffmann
2015-06-30 8:39 ` [Qemu-devel] [PATCH v2 14/22] virtio: add version 1.0 support to vp_reset Gerd Hoffmann
2015-06-30 8:39 ` [Qemu-devel] [PATCH v2 15/22] virtio: add version 1.0 support to vp_notify Gerd Hoffmann
2015-06-30 8:39 ` [Qemu-devel] [PATCH v2 16/22] virtio: remove unused vp_del_vq Gerd Hoffmann
2015-06-30 8:39 ` [Qemu-devel] [PATCH v2 17/22] virtio: add version 1.0 support to vp_find_vq Gerd Hoffmann
2015-06-30 8:39 ` [Qemu-devel] [PATCH v2 18/22] virtio-scsi: fix initialization for version 1.0 Gerd Hoffmann
2015-06-30 8:39 ` [Qemu-devel] [PATCH v2 19/22] virtio-blk: " Gerd Hoffmann
2015-06-30 8:39 ` [Qemu-devel] [PATCH v2 20/22] virtio: use version 1.0 if available (flip the big switch) Gerd Hoffmann
2015-06-30 8:39 ` [Qemu-devel] [PATCH v2 21/22] virtio: also probe version 1.0 pci ids Gerd Hoffmann
2015-06-30 8:39 ` [Qemu-devel] [PATCH v2 22/22] virtio: legacy cleanup Gerd Hoffmann
2015-07-01 11:48 ` [Qemu-devel] [PATCH v2 00/22] virtio: add version 1.0 support Michael S. Tsirkin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150701133437-mutt-send-email-mst@redhat.com \
--to=mst@redhat.com \
--cc=kraxel@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=seabios@seabios.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).