xqemu/hw
Laszlo Ersek d10dda2d60 hw/pci-bridge: disable SHPC in PXB
OVMF downloads the ACPI linker/loader script from QEMU when the edk2 PCI
Bus driver globally signals the firmware that PCI enumeration and resource
allocation have completed. At this point QEMU regenerates the ACPI payload
in an fw_cfg read callback, and this is when the PXB's _CRS gets
populated.

Unfortunately, when this happens, the PCI_COMMAND_MEMORY bit is clear in
the root bus's command register, *unlike* under SeaBIOS. The consequences
unfold as follows:

- When build_crs() fetches dev->io_regions[i].addr, it is all-bits-one,
  because pci_update_mappings() --> pci_bar_address() calculated it as
  PCI_BAR_UNMAPPED, due to the PCI_COMMAND_MEMORY bit being clear.

- Consequently, the SHPC MMIO BAR (bar 0) of the bridge is not added to
  the _CRS, *despite* having been programmed in PCI config space.

- Similarly, the SHPC MMIO BAR of the PXB is not removed from the main
  root bus's DWordMemory descriptor.

- Guest OSes (Linux and Windows alike) notice the pre-programmed SHPC BAR
  within the PXB's config space, and notice that it conflicts with the
  main root bus's memory resource descriptors. Linux reports

  pci 0000:04:00.0: BAR 0: can't assign mem (size 0x100)
  pci 0000:04:00.0: BAR 0: trying firmware assignment [mem
                           0x88200000-0x882000ff 64bit]
  pci 0000:04:00.0: BAR 0: [mem 0x88200000-0x882000ff 64bit] conflicts
                           with PCI Bus 0000:00 [mem
                           0x88200000-0xfebfffff]

  While Windows Server 2012 R2 reports

    https://technet.microsoft.com/en-us/library/cc732199%28v=ws.10%29.aspx

    This device cannot find enough free resources that it can use. If you
    want to use this device, you will need to disable one of the other
    devices on this system. (Code 12)

This issue was apparently encountered earlier, see the "hack" in:

  https://lists.nongnu.org/archive/html/qemu-devel/2015-01/msg02983.html

and the current hole-punching logic in build_crs() and build_ssdt() is
probably supposed to remedy exactly that problem -- however, for OVMF they
don't work, because at the end of the PCI enumeration and resource
allocation, which cues the ACPI linker/loader client, the command register
is clear.

The "shpc" property of "pci-bridge", introduced in the previous patches,
allows us to disable the standard hotplug controller cleanly, eliminating
the SHPC bar and the conflict.

Cc: Michael S. Tsirkin <mst@redhat.com>
Cc: Marcel Apfelbaum <marcel@redhat.com>
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
2015-06-23 22:57:49 +02:00
..
9pfs virtio-9p-device: move qdev properties into virtio-9p-device.c 2015-06-10 18:15:34 +02:00
acpi migration: Use normal VMStateDescriptions for Subsections 2015-06-12 06:53:57 +02:00
alpha hw/alpha/typhoon.c: Fix misusing qemu_allocate_irqs for single irq 2015-06-03 14:21:24 +03:00
arm arm: xlnx-zynqmp: Add 2xCortexR5 CPUs 2015-06-19 14:17:45 +01:00
audio gus: clean up MemoryRegionPortio 2015-04-27 18:24:18 +02:00
block migration: Use normal VMStateDescriptions for Subsections 2015-06-12 06:53:57 +02:00
bt bt-sdp: fix broken uuids power-of-2 calculation 2015-04-28 15:36:08 +02:00
char migration: Use normal VMStateDescriptions for Subsections 2015-06-12 06:53:57 +02:00
core qdev: fix OVERFLOW_BEFORE_WIDEN 2015-06-23 08:14:13 +02:00
cpu icc_bus: fix typo ICC_BRIGDE -> ICC_BRIDGE 2014-11-03 19:51:56 +03:00
cris cris: memory: Replace memory_region_init_ram with memory_region_allocate_system_memory 2015-04-11 20:03:57 +10:00
display virtio-gpu: pci support bits and virtio-vga. 2015-06-16 10:35:43 +01:00
dma dma/rc4030: convert to QOM 2015-06-11 10:13:29 +01:00
gpio pl061: fix wrong calculation of GPIOMIS register 2015-06-02 14:56:25 +01:00
i2c ACPI: split CONFIG_ACPI into 4 pieces 2015-05-29 11:28:59 +01:00
i386 pc: cleanup and convert TMP ACPI device description to AML API 2015-06-23 17:08:21 +02:00
ide migration: Use normal VMStateDescriptions for Subsections 2015-06-12 06:53:57 +02:00
input migration: Use normal VMStateDescriptions for Subsections 2015-06-12 06:53:57 +02:00
intc arm_gic: gic_update should always update all cores 2015-06-15 18:06:07 +01:00
ipack pci: Trivial device model conversions to realize 2015-02-26 12:42:16 +01:00
isa virtio-gpu: pci support bits and virtio-vga. 2015-06-16 10:35:43 +01:00
lm32 hw/lm32/milkymist.c: Fix misusing qemu_allocate_irqs for single irq 2015-06-03 14:21:24 +03:00
m68k m68k: implement more ColdFire 5208 interrupt controller functionality 2015-06-22 14:43:25 +01:00
mem pc-dimm: don't assert if pc-dimm alignment != hotpluggable mem range size 2015-06-04 11:20:34 +02:00
microblaze s3adsp1800: Remove the hardcoded values from the reset 2015-06-21 17:20:16 +10:00
mips net/dp8393x: add PROM to store MAC address 2015-06-11 10:13:30 +01:00
misc virtio, pci fixes, enhancements 2015-06-19 11:30:57 +01:00
moxie memory: add parameter errp to memory_region_init_ram 2014-09-09 13:41:43 +02:00
net virtio, pci fixes, enhancements 2015-06-19 11:30:57 +01:00
nvram fw_cfg: prohibit insertion of duplicate fw_cfg file names 2015-06-10 08:00:37 +02:00
openrisc hw/core/loader: implement address translation in uimage loader 2014-11-03 00:59:10 +03:00
pci virtio-vga: add '-vga virtio' support 2015-06-12 10:13:23 +02:00
pci-bridge hw/pci-bridge: disable SHPC in PXB 2015-06-23 22:57:49 +02:00
pci-host migration: Use normal VMStateDescriptions for Subsections 2015-06-12 06:53:57 +02:00
pcmcia hmp: Remove "info pcmcia" 2014-10-24 12:19:11 +01:00
ppc fw_cfg: fix FW_CFG_BOOT_DEVICE update on ppc and sparc 2015-06-10 08:00:37 +02:00
s390x s390x: Switch to s390-ccw machine as default 2015-06-17 12:40:52 +02:00
scsi virtio, pci fixes, enhancements 2015-06-19 11:30:57 +01:00
sd hw/sd/pxa2xx_mmci: Stop using old_mmio in MemoryRegionOps 2015-06-15 18:06:09 +01:00
sh4 sh4/r2d: convert to new MMIO accessor style 2015-06-12 12:02:48 +02:00
sparc fw_cfg: fix FW_CFG_BOOT_DEVICE update on ppc and sparc 2015-06-10 08:00:37 +02:00
sparc64 fw_cfg: fix FW_CFG_BOOT_DEVICE update on ppc and sparc 2015-06-10 08:00:37 +02:00
ssi omap: Fix warnings from Sparse 2015-03-19 11:11:55 +03:00
timer mc146818rtc: Reset the periodic timer on load 2015-06-19 12:27:14 +02:00
tpm TPM2 ACPI table support 2015-06-01 14:18:54 +02:00
tricore target-tricore: check return value before using it 2014-11-02 10:04:34 +03:00
unicore32 hw/unicore32/puv3.c: Fix misusing qemu_allocate_irqs for single irq 2015-06-03 14:21:24 +03:00
usb migration: Use normal VMStateDescriptions for Subsections 2015-06-12 06:53:57 +02:00
vfio vfio: fix build error on CentOS 5.7 2015-06-18 10:35:59 +01:00
virtio vhost: correctly pass error to caller in vhost_dev_enable_notifiers() 2015-06-23 17:08:21 +02:00
watchdog watchdog: Add new Virtual Watchdog action INJECT-NMI 2015-06-11 17:45:50 +02:00
xen xen_backend: Remove unused error handling of qemu_set_fd_handler 2015-06-12 13:26:21 +01:00
xenpv hw: Convert from BlockDriverState to BlockBackend, mostly 2014-10-20 14:02:25 +02:00
xtensa xtensa: Remove superfluous '\n' around error_report() 2015-03-10 08:15:33 +03:00
Makefile.objs vfio: move hw/misc/vfio.c to hw/vfio/pci.c Move vfio.h into include/hw/vfio 2014-12-19 15:24:06 -07:00