qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v4 00/11] Fix versatile_pci
@ 2013-04-06 15:44 Peter Maydell
  2013-04-06 15:44 ` [Qemu-devel] [PATCH v4 01/11] versatile_pci: Fix hardcoded tabs Peter Maydell
                   ` (11 more replies)
  0 siblings, 12 replies; 19+ messages in thread
From: Peter Maydell @ 2013-04-06 15:44 UTC (permalink / raw)
  To: qemu-devel
  Cc: Arnd Bergmann, Michael S. Tsirkin, patches, Will Deacon,
	Paul Brook, Andreas Färber

This patch series fixes a number of serious bugs in our emulation of
the PCI controller found on VersatilePB and the early Realview boards:
 * our interrupt mapping was totally wrong
 * we weren't implementing the PCI memory windows
 * the I/O window wasn't mapped on VersatilePB
 * realview mapped things at the wrong addresses
 * we didn't implement the controller's registers at all
It also updates to some reasonable approximation to QOM best practice,
including subclassing pci_host rather than doing everything by hand.

I haven't implemented support for the SMAP registers (which control
how the controller converts accesses made by bus-mastering PCI
devices into system addresses). For the moment we rely on the fact
that Linux always maps things 1:1. (It wouldn't be too hard to add
SMAP support but it requires changing QEMU's pci code to allow a
controller to pass in a MemoryRegion* for DMA to use instead of
the system address space, so I prefer to leave that for another series.)

Patchset tested on both versatilepb and realview, using a set of
Linux kernel patches written by Arnd Bergmann:
http://lists.infradead.org/pipermail/linux-arm-kernel/2010-October/029040.html
which were in turn tested against real PB926 and PB1176 hardware.

This version of the patchset avoids breaking legacy Linux guests
by automatically detecting those broken kernels and switching back
to the old mapping. This works by looking at the values the kernel
writes to the PCI_INTERRUPT_LINE register in the config space, which
is effectively the interrupt number the kernel expects the device
to be using. If this doesn't match reality we use the broken mapping.
(Thanks to Michael S. Tsirkin for this suggestion.)

If the kernel ever writes something different to the old kernel
then QEMU will assume it is dealing with a working kernel and
will stop looking for broken values. This allows a new kernel to
put any values it likes in PCI_INTERRUPT_LINE, provided its init
code does an initial write of something other than 27 to let QEMU
know it can cope with the correct irq mapping.

Changes v3->v4:
 * rebase following recent pci changes
 * patch 7 minor tweaks as per mst review:
    added VPB_PCI prefix to enum names, drop specified values
    drop unnecessary casts of void*
Changes v2->v3:
 * patch 7: make broken guest autodetect a one-time thing rather than
   reversible, to allow more flexibility in how new kernels choose
   to use the PCI_INTERRUPT_LINE registers
Changes v1->v2:
 * autodetect broken guests rather than using user-set property
 * use pci_swizzle_map_fn
 * new patch: drop unnecessary vpb_pci_config_addr() function

Peter Maydell (11):
  versatile_pci: Fix hardcoded tabs
  versatile_pci: Expose PCI I/O region on Versatile PB
  versatile_pci: Update to realize and instance init functions
  versatile_pci: Change to subclassing TYPE_PCI_HOST_BRIDGE
  versatile_pci: Use separate PCI I/O space rather than system I/O space
  versatile_pci: Put the host bridge PCI device at slot 29
  versatile_pci: Implement the correct PCI IRQ mapping
  versatile_pci: Implement the PCI controller's control registers
  arm/realview: Fix mapping of PCI regions
  versatile_pci: Expose PCI memory space to system
  hw/versatile_pci: Drop unnecessary vpb_pci_config_addr()

 hw/arm/realview.c    |   22 +--
 hw/arm/versatilepb.c |   11 +-
 hw/versatile_pci.c   |  399 ++++++++++++++++++++++++++++++++++++++++++++------
 3 files changed, 371 insertions(+), 61 deletions(-)

-- 
1.7.9.5

^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2013-07-08  7:46 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-06 15:44 [Qemu-devel] [PATCH v4 00/11] Fix versatile_pci Peter Maydell
2013-04-06 15:44 ` [Qemu-devel] [PATCH v4 01/11] versatile_pci: Fix hardcoded tabs Peter Maydell
2013-04-06 15:44 ` [Qemu-devel] [PATCH v4 02/11] versatile_pci: Expose PCI I/O region on Versatile PB Peter Maydell
2013-04-06 15:44 ` [Qemu-devel] [PATCH v4 03/11] versatile_pci: Update to realize and instance init functions Peter Maydell
2013-04-06 15:44 ` [Qemu-devel] [PATCH v4 04/11] versatile_pci: Change to subclassing TYPE_PCI_HOST_BRIDGE Peter Maydell
2013-04-06 15:44 ` [Qemu-devel] [PATCH v4 05/11] versatile_pci: Use separate PCI I/O space rather than system I/O space Peter Maydell
2013-04-06 15:44 ` [Qemu-devel] [PATCH v4 06/11] versatile_pci: Put the host bridge PCI device at slot 29 Peter Maydell
2013-04-06 15:44 ` [Qemu-devel] [PATCH v4 07/11] versatile_pci: Implement the correct PCI IRQ mapping Peter Maydell
2013-04-06 15:44 ` [Qemu-devel] [PATCH v4 08/11] versatile_pci: Implement the PCI controller's control registers Peter Maydell
2013-04-06 15:44 ` [Qemu-devel] [PATCH v4 09/11] arm/realview: Fix mapping of PCI regions Peter Maydell
2013-04-06 15:44 ` [Qemu-devel] [PATCH v4 10/11] versatile_pci: Expose PCI memory space to system Peter Maydell
2013-04-06 15:44 ` [Qemu-devel] [PATCH v4 11/11] hw/versatile_pci: Drop unnecessary vpb_pci_config_addr() Peter Maydell
2013-04-08 17:37 ` [Qemu-devel] [PATCH v4 00/11] Fix versatile_pci Rob Landley
2013-04-08 20:16   ` Peter Maydell
2013-06-28  7:01     ` Rob Landley
2013-06-29 11:03       ` Peter Maydell
2013-07-08  6:43         ` Rob Landley
2013-07-08  7:46           ` Peter Maydell
2013-07-05 11:26       ` Peter Maydell

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).