]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Library/PlatformBdsLib/BdsPlatform.c
Add DXE_DRIVER to list of supported module types for BaseFileHandleLib.
[mirror_edk2.git] / OvmfPkg / Library / PlatformBdsLib / BdsPlatform.c
index 44fd0d7ed5dc874b623a7112507df4d783b9b65c..e44c8253581f894b447f5e2505bdd01b29e8999f 100644 (file)
@@ -32,6 +32,18 @@ InstallDevicePathCallback (
   VOID\r
   );\r
 \r
+STATIC\r
+VOID\r
+LoadVideoRom (\r
+  VOID\r
+  );\r
+\r
+STATIC\r
+EFI_STATUS\r
+PciRomLoadEfiDriversFromRomImage (\r
+  IN EFI_PHYSICAL_ADDRESS    Rom,\r
+  IN UINTN                   RomSize\r
+  );\r
 \r
 //\r
 // BDS Platform Functions\r
@@ -58,6 +70,7 @@ Returns:
 {\r
   DEBUG ((EFI_D_INFO, "PlatformBdsInit\n"));\r
   InstallDevicePathCallback ();\r
+  LoadVideoRom ();\r
 }\r
 \r
 \r
@@ -449,6 +462,14 @@ Returns:
       continue;\r
     }\r
 \r
+    Status = PciIo->Attributes (\r
+      PciIo,\r
+      EfiPciIoAttributeOperationEnable,\r
+      EFI_PCI_DEVICE_ENABLE,\r
+      NULL\r
+      );\r
+    ASSERT_EFI_ERROR (Status);\r
+\r
     if (!DetectVgaOnly) {\r
       //\r
       // Here we decide whether it is LPC Bridge\r
@@ -459,17 +480,11 @@ Returns:
            (Pci.Hdr.DeviceId == 0x7000)\r
           )\r
          ) {\r
-        Status = PciIo->Attributes (\r
-          PciIo,\r
-          EfiPciIoAttributeOperationEnable,\r
-          EFI_PCI_DEVICE_ENABLE,\r
-          NULL\r
-          );\r
         //\r
         // Add IsaKeyboard to ConIn,\r
         // add IsaSerial to ConOut, ConIn, ErrOut\r
         //\r
-        DEBUG ((EFI_D_INFO, "Find the LPC Bridge device\n"));\r
+        DEBUG ((EFI_D_INFO, "Found LPC Bridge device\n"));\r
         PrepareLpcBridgeDevicePath (HandleBuffer[Index]);\r
         continue;\r
       }\r
@@ -480,23 +495,12 @@ Returns:
         //\r
         // Add them to ConOut, ConIn, ErrOut.\r
         //\r
-        DEBUG ((EFI_D_INFO, "Find the 16550 SERIAL device\n"));\r
+        DEBUG ((EFI_D_INFO, "Found PCI 16550 SERIAL device\n"));\r
         PreparePciSerialDevicePath (HandleBuffer[Index]);\r
         continue;\r
       }\r
     }\r
 \r
-    if ((Pci.Hdr.VendorId == 0x8086) &&\r
-        (Pci.Hdr.DeviceId == 0x7010)\r
-       ) {\r
-      Status = PciIo->Attributes (\r
-        PciIo,\r
-        EfiPciIoAttributeOperationEnable,\r
-        EFI_PCI_DEVICE_ENABLE,\r
-        NULL\r
-        );\r
-     }\r
-\r
     //\r
     // Here we decide which VGA device to enable in PCI bus\r
     //\r
@@ -504,7 +508,7 @@ Returns:
       //\r
       // Add them to ConOut.\r
       //\r
-      DEBUG ((EFI_D_INFO, "Find the VGA device\n"));\r
+      DEBUG ((EFI_D_INFO, "Found PCI VGA device\n"));\r
       PreparePciVgaDevicePath (HandleBuffer[Index]);\r
       continue;\r
     }\r
@@ -738,7 +742,8 @@ Returns:
 VOID\r
 PlatformBdsDiagnostics (\r
   IN EXTENDMEM_COVERAGE_LEVEL    MemoryTestLevel,\r
-  IN BOOLEAN                     QuietBoot\r
+  IN BOOLEAN                     QuietBoot,\r
+  IN BASEM_MEMORY_TEST           BaseMemoryTest\r
   )\r
 /*++\r
 \r
@@ -753,6 +758,8 @@ Arguments:
 \r
   QuietBoot        - Indicate if need to enable the quiet boot\r
 \r
+  BaseMemoryTest   - A pointer to BaseMemoryTest()\r
+\r
 Returns:\r
 \r
   None.\r
@@ -774,7 +781,7 @@ Returns:
     //\r
     // Perform system diagnostic\r
     //\r
-    Status = BdsMemoryTest (MemoryTestLevel);\r
+    Status = BaseMemoryTest (MemoryTestLevel);\r
     if (EFI_ERROR (Status)) {\r
       DisableQuietBoot ();\r
     }\r
@@ -784,7 +791,7 @@ Returns:
   //\r
   // Perform system diagnostic\r
   //\r
-  Status = BdsMemoryTest (MemoryTestLevel);\r
+  Status = BaseMemoryTest (MemoryTestLevel);\r
 }\r
 \r
 \r
@@ -792,7 +799,9 @@ VOID
 EFIAPI\r
 PlatformBdsPolicyBehavior (\r
   IN OUT LIST_ENTRY                  *DriverOptionList,\r
-  IN OUT LIST_ENTRY                  *BootOptionList\r
+  IN OUT LIST_ENTRY                  *BootOptionList,\r
+  IN PROCESS_CAPSULES                ProcessCapsules,\r
+  IN BASEM_MEMORY_TEST               BaseMemoryTest\r
   )\r
 /*++\r
 \r
@@ -808,6 +817,10 @@ Arguments:
 \r
   BootOptionList   - The header of the boot option link list\r
 \r
+  ProcessCapsules  - A pointer to ProcessCapsules()\r
+\r
+  BaseMemoryTest   - A pointer to BaseMemoryTest()\r
+\r
 Returns:\r
 \r
   None.\r
@@ -873,7 +886,7 @@ Returns:
   //\r
   // Memory test and Logo show\r
   //\r
-  PlatformBdsDiagnostics (IGNORE, TRUE);\r
+  PlatformBdsDiagnostics (IGNORE, TRUE, BaseMemoryTest);\r
 \r
   //\r
   // Perform some platform specific connect sequence\r
@@ -1194,3 +1207,176 @@ LockKeyboards (
 {\r
     return EFI_UNSUPPORTED;\r
 }\r
+\r
+\r
+STATIC\r
+VOID\r
+LoadVideoRom (\r
+  VOID\r
+  )\r
+{\r
+  PCI_DATA_STRUCTURE            *Pcir;\r
+  UINTN                         RomSize;\r
+\r
+  //\r
+  // The virtual machines sometimes load the video rom image\r
+  // directly at the legacy video BIOS location of C000:0000,\r
+  // and do not implement the PCI expansion ROM feature.\r
+  //\r
+  Pcir = (PCI_DATA_STRUCTURE *) (UINTN) 0xc0000;\r
+  RomSize = Pcir->ImageLength * 512;\r
+  PciRomLoadEfiDriversFromRomImage (0xc0000, RomSize);\r
+}\r
+\r
+\r
+STATIC\r
+EFI_STATUS\r
+PciRomLoadEfiDriversFromRomImage (\r
+  IN EFI_PHYSICAL_ADDRESS    Rom,\r
+  IN UINTN                   RomSize\r
+  )\r
+{\r
+  CHAR16                        *FileName;\r
+  EFI_PCI_EXPANSION_ROM_HEADER  *EfiRomHeader;\r
+  PCI_DATA_STRUCTURE            *Pcir;\r
+  UINTN                         ImageIndex;\r
+  UINTN                         RomOffset;\r
+  UINT32                        ImageSize;\r
+  UINT16                        ImageOffset;\r
+  EFI_HANDLE                    ImageHandle;\r
+  EFI_STATUS                    Status;\r
+  EFI_STATUS                    retStatus;\r
+  EFI_DEVICE_PATH_PROTOCOL      *FilePath;\r
+  BOOLEAN                       SkipImage;\r
+  UINT32                        DestinationSize;\r
+  UINT32                        ScratchSize;\r
+  UINT8                         *Scratch;\r
+  VOID                          *ImageBuffer;\r
+  VOID                          *DecompressedImageBuffer;\r
+  UINT32                        ImageLength;\r
+  EFI_DECOMPRESS_PROTOCOL       *Decompress;\r
+\r
+  FileName = L"PciRomInMemory";\r
+\r
+  //FileName = L"PciRom Addr=0000000000000000";\r
+  //HexToString (&FileName[12], Rom, 16);\r
+\r
+  ImageIndex    = 0;\r
+  retStatus     = EFI_NOT_FOUND;\r
+  RomOffset  = (UINTN) Rom;\r
+\r
+  do {\r
+\r
+    EfiRomHeader = (EFI_PCI_EXPANSION_ROM_HEADER *) (UINTN) RomOffset;\r
+\r
+    if (EfiRomHeader->Signature != 0xaa55) {\r
+      return retStatus;\r
+    }\r
+\r
+    Pcir      = (PCI_DATA_STRUCTURE *) (UINTN) (RomOffset + EfiRomHeader->PcirOffset);\r
+    ImageSize = Pcir->ImageLength * 512;\r
+\r
+    if ((Pcir->CodeType == PCI_CODE_TYPE_EFI_IMAGE) &&\r
+        (EfiRomHeader->EfiSignature == EFI_PCI_EXPANSION_ROM_HEADER_EFISIGNATURE) ) {\r
+\r
+      if ((EfiRomHeader->EfiSubsystem == EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER) ||\r
+          (EfiRomHeader->EfiSubsystem == EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER) ) {\r
+\r
+        ImageOffset             = EfiRomHeader->EfiImageHeaderOffset;\r
+        ImageSize               = EfiRomHeader->InitializationSize * 512;\r
+\r
+        ImageBuffer             = (VOID *) (UINTN) (RomOffset + ImageOffset);\r
+        ImageLength             = ImageSize - ImageOffset;\r
+        DecompressedImageBuffer = NULL;\r
+\r
+        //\r
+        // decompress here if needed\r
+        //\r
+        SkipImage = FALSE;\r
+        if (EfiRomHeader->CompressionType > EFI_PCI_EXPANSION_ROM_HEADER_COMPRESSED) {\r
+          SkipImage = TRUE;\r
+        }\r
+\r
+        if (EfiRomHeader->CompressionType == EFI_PCI_EXPANSION_ROM_HEADER_COMPRESSED) {\r
+          Status = gBS->LocateProtocol (&gEfiDecompressProtocolGuid, NULL, (VOID **) &Decompress);\r
+          if (EFI_ERROR (Status)) {\r
+            SkipImage = TRUE;\r
+          } else {\r
+            SkipImage = TRUE;\r
+            Status = Decompress->GetInfo (\r
+                                  Decompress,\r
+                                  ImageBuffer,\r
+                                  ImageLength,\r
+                                  &DestinationSize,\r
+                                  &ScratchSize\r
+                                  );\r
+            if (!EFI_ERROR (Status)) {\r
+              DecompressedImageBuffer = NULL;\r
+              DecompressedImageBuffer = AllocatePool (DestinationSize);\r
+              if (DecompressedImageBuffer != NULL) {\r
+                Scratch = AllocatePool (ScratchSize);\r
+                if (Scratch != NULL) {\r
+                  Status = Decompress->Decompress (\r
+                                        Decompress,\r
+                                        ImageBuffer,\r
+                                        ImageLength,\r
+                                        DecompressedImageBuffer,\r
+                                        DestinationSize,\r
+                                        Scratch,\r
+                                        ScratchSize\r
+                                        );\r
+                  if (!EFI_ERROR (Status)) {\r
+                    ImageBuffer = DecompressedImageBuffer;\r
+                    ImageLength = DestinationSize;\r
+                    SkipImage   = FALSE;\r
+                  }\r
+\r
+                  gBS->FreePool (Scratch);\r
+                }\r
+              }\r
+            }\r
+          }\r
+        }\r
+\r
+        if (!SkipImage) {\r
+\r
+          //\r
+          // load image and start image\r
+          //\r
+\r
+          FilePath = FileDevicePath (NULL, FileName);\r
+\r
+          Status = gBS->LoadImage (\r
+                          FALSE,\r
+                          gImageHandle,\r
+                          FilePath,\r
+                          ImageBuffer,\r
+                          ImageLength,\r
+                          &ImageHandle\r
+                          );\r
+          if (!EFI_ERROR (Status)) {\r
+            Status = gBS->StartImage (ImageHandle, NULL, NULL);\r
+            if (!EFI_ERROR (Status)) {\r
+              retStatus = Status;\r
+            }\r
+          }\r
+          if (FilePath != NULL) {\r
+            gBS->FreePool (FilePath);\r
+          }\r
+        }\r
+\r
+        if (DecompressedImageBuffer != NULL) {\r
+          gBS->FreePool (DecompressedImageBuffer);\r
+        }\r
+\r
+      }\r
+    }\r
+\r
+    RomOffset = RomOffset + ImageSize;\r
+    ImageIndex++;\r
+  } while (((Pcir->Indicator & 0x80) == 0x00) && ((RomOffset - (UINTN) Rom) < RomSize));\r
+\r
+  return retStatus;\r
+}\r
+\r
+\r