]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OptionRomPkg/CirrusLogic5430Dxe/CirrusLogic5430.c
Use the Controller handle to open the protocol, rather than the
[mirror_edk2.git] / OptionRomPkg / CirrusLogic5430Dxe / CirrusLogic5430.c
index eb5ce3b6fcea847d312025dfa8cf9845fab92ba0..2f0eb5a813918d57505e6a971548cb942039c103 100644 (file)
@@ -106,6 +106,7 @@ CIRRUS_LOGIC_5430_VIDEO_MODES  CirrusLogic5430VideoModes[] = {
   { 1024, 768, 8, 60, Crtc_1024_768_256_60, Seq_1024_768_256_60, 0xef }\r
 };\r
 \r
+\r
 /**\r
   CirrusLogic5430ControllerDriverSupported\r
 \r
@@ -211,7 +212,11 @@ CirrusLogic5430ControllerDriverStart (
 {\r
   EFI_STATUS                      Status;\r
   CIRRUS_LOGIC_5430_PRIVATE_DATA  *Private;\r
+  BOOLEAN                         PciAttributesSaved;\r
+  EFI_DEVICE_PATH_PROTOCOL        *ParentDevicePath;\r
+  ACPI_ADR_DEVICE_PATH            AcpiDeviceNode;\r
 \r
+  PciAttributesSaved = FALSE;\r
   //\r
   // Allocate Private context data for UGA Draw inteface.\r
   //\r
@@ -225,17 +230,17 @@ CirrusLogic5430ControllerDriverStart (
   // Set up context record\r
   //\r
   Private->Signature  = CIRRUS_LOGIC_5430_PRIVATE_DATA_SIGNATURE;\r
-  Private->Handle     = Controller;\r
+  Private->Handle     = NULL;\r
 \r
   //\r
   // Open PCI I/O Protocol\r
   //\r
   Status = gBS->OpenProtocol (\r
-                  Private->Handle,\r
+                  Controller,\r
                   &gEfiPciIoProtocolGuid,\r
                   (VOID **) &Private->PciIo,\r
                   This->DriverBindingHandle,\r
-                  Private->Handle,\r
+                  Controller,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
                   );\r
   if (EFI_ERROR (Status)) {\r
@@ -255,6 +260,7 @@ CirrusLogic5430ControllerDriverStart (
   if (EFI_ERROR (Status)) {\r
     goto Error;\r
   }\r
+  PciAttributesSaved = TRUE;\r
 \r
   Status = Private->PciIo->Attributes (\r
                             Private->PciIo,\r
@@ -266,52 +272,98 @@ CirrusLogic5430ControllerDriverStart (
     goto Error;\r
   }\r
 \r
+  //\r
+  // Get ParentDevicePath\r
+  //\r
+  Status = gBS->HandleProtocol (\r
+                  Controller,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  (VOID **) &ParentDevicePath\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    goto Error;\r
+  }\r
+\r
+  if (FeaturePcdGet (PcdSupportGop)) {\r
+    //\r
+    // Set Gop Device Path\r
+    //\r
+    if (RemainingDevicePath == NULL) {\r
+      ZeroMem (&AcpiDeviceNode, sizeof (ACPI_ADR_DEVICE_PATH));\r
+      AcpiDeviceNode.Header.Type = ACPI_DEVICE_PATH;\r
+      AcpiDeviceNode.Header.SubType = ACPI_ADR_DP;\r
+      AcpiDeviceNode.ADR = ACPI_DISPLAY_ADR (1, 0, 0, 1, 0, ACPI_ADR_DISPLAY_TYPE_VGA, 0, 0);\r
+      SetDevicePathNodeLength (&AcpiDeviceNode.Header, sizeof (ACPI_ADR_DEVICE_PATH));\r
+\r
+      Private->GopDevicePath = AppendDevicePathNode (\r
+                                          ParentDevicePath,\r
+                                          (EFI_DEVICE_PATH_PROTOCOL *) &AcpiDeviceNode\r
+                                          );\r
+    } else {\r
+      Private->GopDevicePath = AppendDevicePathNode (ParentDevicePath, RemainingDevicePath);\r
+    }\r
+\r
+    //\r
+    // Creat child handle and device path protocol firstly\r
+    //\r
+    Private->Handle = NULL;\r
+    Status = gBS->InstallMultipleProtocolInterfaces (\r
+                    &Private->Handle,\r
+                    &gEfiDevicePathProtocolGuid,\r
+                    Private->GopDevicePath,\r
+                    NULL\r
+                    );\r
+  }\r
+\r
+  //\r
+  // Construct video mode buffer\r
+  //\r
+  Status = CirrusLogic5430VideoModeSetup (Private);\r
+  if (EFI_ERROR (Status)) {\r
+    goto Error;\r
+  }\r
+\r
   if (FeaturePcdGet (PcdSupportUga)) {\r
     //\r
     // Start the UGA Draw software stack.\r
     //\r
     Status = CirrusLogic5430UgaDrawConstructor (Private);\r
     ASSERT_EFI_ERROR (Status);\r
-    if (FeaturePcdGet (PcdSupportGop)) {\r
-      Status = CirrusLogic5430GraphicsOutputConstructor (Private);\r
-      ASSERT_EFI_ERROR (Status);\r
 \r
-      Status = gBS->InstallMultipleProtocolInterfaces (\r
-                      &Private->Handle,\r
-                      &gEfiUgaDrawProtocolGuid,\r
-                      &Private->UgaDraw,\r
-                      &gEfiGraphicsOutputProtocolGuid,\r
-                      &Private->GraphicsOutput,\r
-                      NULL\r
-                      );\r
-    } else {\r
-      Status = gBS->InstallMultipleProtocolInterfaces (\r
-                      &Private->Handle,\r
-                      &gEfiUgaDrawProtocolGuid,\r
-                      &Private->UgaDraw,\r
-                      NULL\r
-                      );\r
+    Private->UgaDevicePath = ParentDevicePath;\r
+    Status = gBS->InstallMultipleProtocolInterfaces (\r
+                    &Controller,\r
+                    &gEfiUgaDrawProtocolGuid,\r
+                    &Private->UgaDraw,\r
+                    &gEfiDevicePathProtocolGuid,\r
+                    Private->UgaDevicePath,\r
+                    NULL\r
+                    );\r
 \r
-    }\r
-  } else {\r
-    if (FeaturePcdGet (PcdSupportGop)) {\r
-      Status = CirrusLogic5430GraphicsOutputConstructor (Private);\r
-      ASSERT_EFI_ERROR (Status);\r
+  } else if (FeaturePcdGet (PcdSupportGop)) {\r
+    //\r
+    // Start the GOP software stack.\r
+    //\r
+    Status = CirrusLogic5430GraphicsOutputConstructor (Private);\r
+    ASSERT_EFI_ERROR (Status);\r
 \r
-      Status = gBS->InstallMultipleProtocolInterfaces (\r
-                      &Private->Handle,\r
-                      &gEfiGraphicsOutputProtocolGuid,\r
-                      &Private->GraphicsOutput,\r
-                      NULL\r
-                      );\r
+    Status = gBS->InstallMultipleProtocolInterfaces (\r
+                    &Private->Handle,\r
+                    &gEfiGraphicsOutputProtocolGuid,\r
+                    &Private->GraphicsOutput,\r
+                    &gEfiEdidDiscoveredProtocolGuid,\r
+                    &Private->EdidDiscovered,\r
+                    &gEfiEdidActiveProtocolGuid,\r
+                    &Private->EdidActive,\r
+                    NULL\r
+                    );\r
 \r
-    } else {\r
-      //\r
-      // This driver must support eithor GOP or UGA or both.\r
-      //\r
-      ASSERT (FALSE);\r
-      Status = EFI_UNSUPPORTED;\r
-    }\r
+  } else {\r
+    //\r
+    // This driver must support eithor GOP or UGA or both.\r
+    //\r
+    ASSERT (FALSE);\r
+    Status = EFI_UNSUPPORTED;\r
   }\r
 \r
 \r
@@ -319,16 +371,17 @@ Error:
   if (EFI_ERROR (Status)) {\r
     if (Private) {\r
       if (Private->PciIo) {\r
-        //\r
-        // Restore original PCI attributes\r
-        //\r
-        Private->PciIo->Attributes (\r
-                        Private->PciIo,\r
-                        EfiPciIoAttributeOperationSet,\r
-                        Private->OriginalPciAttributes,\r
-                        NULL\r
-                        );\r
-\r
+        if (PciAttributesSaved == TRUE) {\r
+          //\r
+          // Restore original PCI attributes\r
+          //\r
+          Private->PciIo->Attributes (\r
+                          Private->PciIo,\r
+                          EfiPciIoAttributeOperationSet,\r
+                          Private->OriginalPciAttributes,\r
+                          NULL\r
+                          );\r
+        }\r
         //\r
         // Close the PCI I/O Protocol\r
         //\r
@@ -665,7 +718,6 @@ SetDefaultPalette (
   TODO: add return values\r
 \r
 **/\r
-STATIC\r
 VOID\r
 ClearScreen (\r
   CIRRUS_LOGIC_5430_PRIVATE_DATA  *Private\r