]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg: AcpiPlatformDxe: Don't enable unsupported PCI attributes
authorVolker Rümelin <vr_qemu@t-online.de>
Mon, 18 Apr 2016 19:51:30 +0000 (21:51 +0200)
committerLaszlo Ersek <lersek@redhat.com>
Tue, 19 Apr 2016 11:18:34 +0000 (13:18 +0200)
Current code in PciEnableDecoding tries to unconditionally enable
EFI_PCI_IO_ATTRIBUTE_IO and EFI_PCI_IO_ATTRIBUTE_MEMORY even if they
are unsupported attributes. This fails on devices which don't
support both attributes.

This patch masks out unsupported attributes.

Information to reproduce the bug.

Host lspci -s 0000:04:00.0 -vnn:
04:00.0 USB controller [0c03]: Renesas Technology Corp. uPD720201 USB
3.0 Host Controller [1912:0014] (rev 03) (prog-if 30 [XHCI])
Flags: fast devsel, IRQ 19
Memory at ef900000 (64-bit, non-prefetchable) [size=8K]
Capabilities: [50] Power Management version 3
Capabilities: [70] MSI: Enable- Count=1/8 Maskable- 64bit+
Capabilities: [90] MSI-X: Enable- Count=8 Masked-
Capabilities: [a0] Express Endpoint, MSI 00
Capabilities: [100] Advanced Error Reporting
Capabilities: [150] Latency Tolerance Reporting
Kernel driver in use: pci-stub
Kernel modules: xhci_pci

libvirt xml:
    <hostdev mode='subsystem' type='pci' managed='yes'>
      <driver name='vfio'/>
      <source>
        <address domain='0x0000' bus='0x04' slot='0x00' function='0'/>
      </source>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x11'
       function='0'/>
    </hostdev>

OVMF debug log with additional DEBUG statement:
OnRootBridgesConnected: root bridges have been connected, installing
ACPI tables
Select Item: 0x19
EnablePciDecoding: GetLocation: D=0000:00:00.0
    OrigAttr=0000000000004000 SuppAttr=000000000000E700
EnablePciDecoding: GetLocation: D=0000:00:10.0
    OrigAttr=0000000000004000 SuppAttr=000000000000E700
EnablePciDecoding: GetLocation: D=0000:00:11.0
    OrigAttr=0000000000004000 SuppAttr=000000000000E600
EnablePciDecoding: EfiPciIoAttributeOperationEnable: Unsupported
Select Item: 0x28
Select Item: 0x19
Select Item: 0x2A
Select Item: 0x19
Select Item: 0x27
InstallQemuFwCfgTables: installed 6 tables

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Volker Rümelin <vr_qemu@t-online.de>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Tested-by: Laszlo Ersek <lersek@redhat.com>
OvmfPkg/AcpiPlatformDxe/PciDecoding.c

index 3b9b12ccc8a621abd7945ca1bf1e39cc5ac876e9..d63b57e701358143e153039118837f51db121e57 100644 (file)
@@ -89,6 +89,7 @@ EnablePciDecoding (
 \r
   for (Idx = 0; Idx < NoHandles; ++Idx) {\r
     EFI_PCI_IO_PROTOCOL *PciIo;\r
+    UINT64              Attributes;\r
 \r
     //\r
     // Look up PciIo on the handle and stash it\r
@@ -109,12 +110,23 @@ EnablePciDecoding (
       goto RestoreAttributes;\r
     }\r
 \r
+    //\r
+    // Retrieve supported attributes\r
+    //\r
+    Status = PciIo->Attributes (PciIo, EfiPciIoAttributeOperationSupported, 0,\r
+                      &Attributes);\r
+    if (EFI_ERROR (Status)) {\r
+      DEBUG ((EFI_D_WARN, "%a: EfiPciIoAttributeOperationSupported: %r\n",\r
+        __FUNCTION__, Status));\r
+      goto RestoreAttributes;\r
+    }\r
+\r
     //\r
     // Enable IO and MMIO decoding\r
     //\r
+    Attributes &= EFI_PCI_IO_ATTRIBUTE_IO | EFI_PCI_IO_ATTRIBUTE_MEMORY;\r
     Status = PciIo->Attributes (PciIo, EfiPciIoAttributeOperationEnable,\r
-                      EFI_PCI_IO_ATTRIBUTE_IO | EFI_PCI_IO_ATTRIBUTE_MEMORY,\r
-                      NULL);\r
+                      Attributes, NULL);\r
     if (EFI_ERROR (Status)) {\r
       DEBUG ((EFI_D_WARN, "%a: EfiPciIoAttributeOperationEnable: %r\n",\r
         __FUNCTION__, Status));\r