]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/QemuVideoDxe/VbeShim.c
OvmfPkg/QemuVideoDxe/VbeShim: handle PAM1 register on Q35 correctly
[mirror_edk2.git] / OvmfPkg / QemuVideoDxe / VbeShim.c
index 6a569f62744938d2e38f6ae9239ce4a2a0058267..e45a08e8873f15cdf366b0b4a537e6b579460392 100644 (file)
@@ -25,6 +25,7 @@
 #include <Library/DebugLib.h>\r
 #include <Library/PciLib.h>\r
 #include <Library/PrintLib.h>\r
+#include <OvmfPlatforms.h>\r
 \r
 #include "Qemu.h"\r
 #include "VbeShim.h"\r
@@ -63,7 +64,8 @@ InstallVbeShim (
   EFI_PHYSICAL_ADDRESS Segment0, SegmentC, SegmentF;\r
   UINTN                Segment0Pages;\r
   IVT_ENTRY            *Int0x10;\r
-  EFI_STATUS           Status;\r
+  EFI_STATUS           Segment0AllocationStatus;\r
+  UINT16               HostBridgeDevId;\r
   UINTN                Pam1Address;\r
   UINT8                Pam1;\r
   UINTN                SegmentCPages;\r
@@ -87,10 +89,14 @@ InstallVbeShim (
   //\r
   Segment0Pages = 1;\r
   Int0x10       = (IVT_ENTRY *)(UINTN)Segment0 + 0x10;\r
-  Status = gBS->AllocatePages (AllocateAddress, EfiBootServicesCode,\r
-                  Segment0Pages, &Segment0);\r
-\r
-  if (EFI_ERROR (Status)) {\r
+  Segment0AllocationStatus = gBS->AllocatePages (\r
+                                    AllocateAddress,\r
+                                    EfiBootServicesCode,\r
+                                    Segment0Pages,\r
+                                    &Segment0\r
+                                    );\r
+\r
+  if (EFI_ERROR (Segment0AllocationStatus)) {\r
     EFI_PHYSICAL_ADDRESS Handler;\r
 \r
     //\r
@@ -100,7 +106,7 @@ InstallVbeShim (
     //\r
     Handler = (Int0x10->Segment << 4) + Int0x10->Offset;\r
     if (Handler >= SegmentC && Handler < SegmentF) {\r
-      DEBUG ((EFI_D_VERBOSE, "%a: Video BIOS handler found at %04x:%04x\n",\r
+      DEBUG ((EFI_D_INFO, "%a: Video BIOS handler found at %04x:%04x\n",\r
         __FUNCTION__, Int0x10->Segment, Int0x10->Offset));\r
       return;\r
     }\r
@@ -109,8 +115,12 @@ InstallVbeShim (
     // Otherwise we'll overwrite the Int10h vector, even though we may not own\r
     // the page at zero.\r
     //\r
-    DEBUG ((EFI_D_VERBOSE, "%a: failed to allocate page at zero: %r\n",\r
-      __FUNCTION__, Status));\r
+    DEBUG ((\r
+      DEBUG_INFO,\r
+      "%a: failed to allocate page at zero: %r\n",\r
+      __FUNCTION__,\r
+      Segment0AllocationStatus\r
+      ));\r
   } else {\r
     //\r
     // We managed to allocate the page at zero. SVN r14218 guarantees that it\r
@@ -123,7 +133,30 @@ InstallVbeShim (
   //\r
   // Put the shim in place first.\r
   //\r
-  Pam1Address = PCI_LIB_ADDRESS (0, 0, 0, 0x5A);\r
+  // Start by determining the address of the PAM1 register.\r
+  //\r
+  HostBridgeDevId = PcdGet16 (PcdOvmfHostBridgePciDevId);\r
+  switch (HostBridgeDevId) {\r
+  case INTEL_82441_DEVICE_ID:\r
+    Pam1Address = PMC_REGISTER_PIIX4 (PIIX4_PAM1);\r
+    break;\r
+  case INTEL_Q35_MCH_DEVICE_ID:\r
+    Pam1Address = DRAMC_REGISTER_Q35 (MCH_PAM1);\r
+    break;\r
+  default:\r
+    DEBUG ((\r
+      DEBUG_ERROR,\r
+      "%a: unknown host bridge device ID: 0x%04x\n",\r
+      __FUNCTION__,\r
+      HostBridgeDevId\r
+      ));\r
+    ASSERT (FALSE);\r
+\r
+    if (!EFI_ERROR (Segment0AllocationStatus)) {\r
+      gBS->FreePages (Segment0, Segment0Pages);\r
+    }\r
+    return;\r
+  }\r
   //\r
   // low nibble covers 0xC0000 to 0xC3FFF\r
   // high nibble covers 0xC4000 to 0xC7FFF\r