[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] OVMF broken under Xen (in PCI initialisation)



Hi,

Following the switch to MdeModulePkg/Bus/Pci/PciHostBridgeDxe, the pci root
bridge does not finish to initialize and breaks under Xen.

There are several issue probably due to the use of
PcdPciDisableBusEnumeration=TRUE.

First one:
ASSERT MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c(99): 
Bridge->Mem.Limit < 0x0000000100000000ULL

This patch would fix the first assert:
diff --git a/OvmfPkg/PlatformPei/Xen.c b/OvmfPkg/PlatformPei/Xen.c
index 7fa9019..15ec7a7 100644
--- a/OvmfPkg/PlatformPei/Xen.c
+++ b/OvmfPkg/PlatformPei/Xen.c
@@ -227,5 +227,11 @@ InitializeXen (

   PcdSetBool (PcdPciDisableBusEnumeration, TRUE);

+  // Values from hvmloader
+#define PCI_MEM_END         0xFC000000
+#define HVM_BELOW_4G_MMIO_START 0xF0000000
+  PcdSet64 (PcdPciMmio32Base, HVM_BELOW_4G_MMIO_START);
+  PcdSet64 (PcdPciMmio32Size, PCI_MEM_END - HVM_BELOW_4G_MMIO_START);
+
   return EFI_SUCCESS;
 }


But that not enough, next assert is:
ASSERT MdeModulePkg/Bus/Pci/PciBusDxe/PciDeviceSupport.c(807): RootBridge != 
((void *) 0)

I have worked around this one with the following patch. That would
correspond to how the former implementation in OvmfPkg was initializing the
struct. Maybe a better way would be to fill ResAllocated under Xen,
somehow. Under Xen, the ResAllocNode status is not allocated, so no
Descriptor are created.

diff --git a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c 
b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c
index cda9b49..eda92b6 100644
--- a/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c
+++ b/MdeModulePkg/Bus/Pci/PciHostBridgeDxe/PciRootBridgeIo.c
@@ -1509,15 +1509,13 @@ RootBridgeIoConfiguration (

     ResAllocNode = &RootBridge->ResAllocNode[Index];

-    if (ResAllocNode->Status != ResAllocated) {
-      continue;
-    }
-
     Descriptor->Desc = ACPI_ADDRESS_SPACE_DESCRIPTOR;
     Descriptor->Len  = sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) - 3;
+    if (ResAllocNode->Status != ResAllocated) {
     Descriptor->AddrRangeMin  = ResAllocNode->Base;
     Descriptor->AddrRangeMax  = ResAllocNode->Base + ResAllocNode->Length - 1;
     Descriptor->AddrLen       = ResAllocNode->Length;
+    }
     switch (ResAllocNode->Type) {


That leads to one last assert:
> QemuVideo: Cirrus 5446 detected
> InstallProtocolInterface: 09576E91-6D3F-11D2-8E39-00A0C969723B 7B9EF598
> Adding Mode 0 as Cirrus Internal Mode 0: 640x480, 32-bit, 60 Hz
> Adding Mode 1 as Cirrus Internal Mode 1: 800x600, 32-bit, 60 Hz
> Adding Mode 2 as Cirrus Internal Mode 2: 1024x768, 24-bit, 60 Hz
> PixelBlueGreenRedReserved8BitPerColor
> ASSERT 
> /local/home/sheep/work/ovmf/MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c(1789): 
> ((BOOLEAN)(0==1))
For this one, I've workaround by reverting patch 7b0a1ea
(MdeModuelPkg/PciBus: Return AddrTranslationOffset in GetBarAttributes).
That issue was introduce while still using the USE_OLD_PCI_HOST.

Any idee or pointer on how to fix those issues ?

Thanks,

-- 
Anthony PERARD

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.