[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH V8 RESEND 4/8] pci.c: Add pci_check_bar_overlap
From: |
Michael S. Tsirkin |
Subject: |
Re: [Qemu-devel] [PATCH V8 RESEND 4/8] pci.c: Add pci_check_bar_overlap |
Date: |
Mon, 19 Mar 2012 15:15:30 +0200 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
On Fri, Mar 16, 2012 at 04:54:18PM +0000, Anthony PERARD wrote:
> From: Yuji Shimada <address@hidden>
>
> This function helps Xen PCI Passthrough device to check for overlap.
>
> Signed-off-by: Yuji Shimada <address@hidden>
> Signed-off-by: Anthony PERARD <address@hidden>
It seems that what's called for here really is
using the new memory region infrastructure.
That handles overlap etc nicely.
That said, I don't mind, but would prefer to
keep this mess outside the pci core. See below.
> ---
> hw/pci.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
> hw/pci.h | 5 +++++
> 2 files changed, 55 insertions(+), 0 deletions(-)
>
> diff --git a/hw/pci.c b/hw/pci.c
> index 38e1de5..f950b4e 100644
> --- a/hw/pci.c
> +++ b/hw/pci.c
> @@ -1992,6 +1992,56 @@ MemoryRegion *pci_address_space_io(PCIDevice *dev)
> return dev->bus->address_space_io;
> }
>
> +/* This function
Comment blocks start with /* */
> checks if an io_region overlap an io_region from another
overlaps
> + * device. The io_region to check is provide with (addr, size and type)
provided
> + * A callback can be provide and will be called for every region that is
provided
> + * overlapped.
> + * The return value indicate if the region is overlappsed */
indicates
> +bool pci_check_bar_overlap(PCIDevice *device,
> + pcibus_t addr, pcibus_t size, uint8_t type,
> + void (*c)(void *o, const PCIDevice *d, int index),
> + void *opaque)
IMO this is inlikely to be needed by anyone except Xen.
How about a generic pci_foreach_device and let Xen
implement the hacks internally.
> +{
> + PCIBus *bus = device->bus;
> + int i, j;
> + bool rc = false;
> +
> + for (i = 0; i < ARRAY_SIZE(bus->devices); i++) {
> + PCIDevice *d = bus->devices[i];
> + if (!d) {
> + continue;
> + }
> +
> + if (d->devfn == device->devfn) {
> + continue;
> + }
> +
> + /* xxx: This ignores bridges. */
> + for (j = 0; j < PCI_NUM_REGIONS; j++) {
> + PCIIORegion *r = &d->io_regions[j];
> +
> + if (!r->size) {
> + continue;
> + }
> + if ((type & PCI_BASE_ADDRESS_SPACE_IO)
> + != (r->type & PCI_BASE_ADDRESS_SPACE_IO)) {
> + continue;
> + }
> +
> + if (ranges_overlap(addr, size, r->addr, r->size)) {
> + if (c) {
> + c(opaque, d, j);
> + rc = true;
> + } else {
> + return true;
> + }
> + }
> + }
> + }
> +
> + return rc;
> +}
> +
> static void pci_device_class_init(ObjectClass *klass, void *data)
> {
> DeviceClass *k = DEVICE_CLASS(klass);
> diff --git a/hw/pci.h b/hw/pci.h
> index 4f19fdb..cbd04e1 100644
> --- a/hw/pci.h
> +++ b/hw/pci.h
> @@ -628,4 +628,9 @@ extern const VMStateDescription vmstate_pci_device;
> .offset = vmstate_offset_pointer(_state, _field, PCIDevice), \
> }
>
> +bool pci_check_bar_overlap(PCIDevice *dev,
> + pcibus_t addr, pcibus_t size, uint8_t type,
> + void (*c)(void *o, const PCIDevice *d, int index),
> + void *opaque);
> +
> #endif
> --
> Anthony PERARD
- [Qemu-devel] [PATCH V8 RESEND 0/8] Xen PCI Passthrough, Anthony PERARD, 2012/03/16
- [Qemu-devel] [PATCH V8 RESEND 1/8] pci_ids: Add INTEL_82599_VF id., Anthony PERARD, 2012/03/16
- [Qemu-devel] [PATCH V8 RESEND 4/8] pci.c: Add pci_check_bar_overlap, Anthony PERARD, 2012/03/16
- [Qemu-devel] [PATCH V8 RESEND 7/8] Introduce apic-msidef.h, Anthony PERARD, 2012/03/16
- [Qemu-devel] [PATCH V8 RESEND 3/8] Introduce HostPCIDevice to access a pci device on the host., Anthony PERARD, 2012/03/16
- [Qemu-devel] [PATCH V8 RESEND 8/8] Introduce Xen PCI Passthrough, MSI (3/3), Anthony PERARD, 2012/03/16
- [Qemu-devel] [PATCH V8 RESEND 2/8] configure: Introduce --enable-xen-pci-passthrough., Anthony PERARD, 2012/03/16
- [Qemu-devel] [PATCH V8 RESEND 5/8] Introduce Xen PCI Passthrough, qdevice (1/3), Anthony PERARD, 2012/03/16