]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/PlatformDxe/Platform.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / OvmfPkg / PlatformDxe / Platform.c
index 126d8e73823b408e1980581b3ce5f3b9f4ad6c08..e58e75eb220318556f5c4e7dd88ee268c6827730 100644 (file)
@@ -5,13 +5,7 @@
   Copyright (C) 2014, Red Hat, Inc.\r
   Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>\r
 \r
-  This program and the accompanying materials are licensed and made available\r
-  under the terms and conditions of the BSD License which accompanies this\r
-  distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT\r
-  WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+  SPDX-License-Identifier: BSD-2-Clause-Patent\r
 **/\r
 \r
 #include <Library/BaseLib.h>\r
 //\r
 #pragma pack(1)\r
 typedef struct {\r
-  VENDOR_DEVICE_PATH       VendorDevicePath;\r
-  EFI_DEVICE_PATH_PROTOCOL End;\r
+  VENDOR_DEVICE_PATH          VendorDevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL    End;\r
 } PKG_DEVICE_PATH;\r
 #pragma pack()\r
 \r
-STATIC PKG_DEVICE_PATH mPkgDevicePath = {\r
+STATIC PKG_DEVICE_PATH  mPkgDevicePath = {\r
   {\r
     {\r
       HARDWARE_DEVICE_PATH,\r
       HW_VENDOR_DP,\r
       {\r
-        (UINT8) (sizeof (VENDOR_DEVICE_PATH)     ),\r
-        (UINT8) (sizeof (VENDOR_DEVICE_PATH) >> 8)\r
+        (UINT8)(sizeof (VENDOR_DEVICE_PATH)),\r
+        (UINT8)(sizeof (VENDOR_DEVICE_PATH) >> 8)\r
       }\r
     },\r
     EFI_CALLER_ID_GUID\r
@@ -71,8 +65,8 @@ STATIC PKG_DEVICE_PATH mPkgDevicePath = {
     END_DEVICE_PATH_TYPE,\r
     END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
     {\r
-      (UINT8) (END_DEVICE_PATH_LENGTH     ),\r
-      (UINT8) (END_DEVICE_PATH_LENGTH >> 8)\r
+      (UINT8)(END_DEVICE_PATH_LENGTH),\r
+      (UINT8)(END_DEVICE_PATH_LENGTH >> 8)\r
     }\r
   }\r
 };\r
@@ -81,12 +75,12 @@ STATIC PKG_DEVICE_PATH mPkgDevicePath = {
 // The configuration interface between the HII engine (form display etc) and\r
 // this driver.\r
 //\r
-STATIC EFI_HII_CONFIG_ACCESS_PROTOCOL mConfigAccess;\r
+STATIC EFI_HII_CONFIG_ACCESS_PROTOCOL  mConfigAccess;\r
 \r
 //\r
 // The handle representing our list of packages after installation.\r
 //\r
-STATIC EFI_HII_HANDLE mInstalledPackages;\r
+STATIC EFI_HII_HANDLE  mInstalledPackages;\r
 \r
 //\r
 // The arrays below constitute our HII package list. They are auto-generated by\r
@@ -99,32 +93,36 @@ STATIC EFI_HII_HANDLE mInstalledPackages;
 //   plus "Bin".\r
 //\r
 //\r
-extern UINT8 PlatformDxeStrings[];\r
-extern UINT8 PlatformFormsBin[];\r
+extern UINT8  PlatformDxeStrings[];\r
+extern UINT8  PlatformFormsBin[];\r
 \r
 //\r
 // We want to be notified about GOP installations until we find one GOP\r
 // interface that lets us populate the form.\r
 //\r
-STATIC EFI_EVENT mGopEvent;\r
+STATIC EFI_EVENT  mGopEvent;\r
 \r
 //\r
 // The registration record underneath this pointer allows us to iterate through\r
 // the GOP instances one by one.\r
 //\r
-STATIC VOID *mGopTracker;\r
+STATIC VOID  *mGopTracker;\r
+\r
+//\r
+// The driver image handle, used to obtain the device path for <ConfigHdr>.\r
+//\r
+STATIC EFI_HANDLE  mImageHandle;\r
 \r
 //\r
 // Cache the resolutions we get from the GOP.\r
 //\r
 typedef struct {\r
-  UINT32 X;\r
-  UINT32 Y;\r
+  UINT32    X;\r
+  UINT32    Y;\r
 } GOP_MODE;\r
 \r
-STATIC UINTN    mNumGopModes;\r
-STATIC GOP_MODE *mGopModes;\r
-\r
+STATIC UINTN     mNumGopModes;\r
+STATIC GOP_MODE  *mGopModes;\r
 \r
 /**\r
   Load the persistent platform configuration and translate it to binary form\r
@@ -142,63 +140,66 @@ STATIC
 EFI_STATUS\r
 EFIAPI\r
 PlatformConfigToFormState (\r
-  OUT MAIN_FORM_STATE *MainFormState\r
+  OUT MAIN_FORM_STATE  *MainFormState\r
   )\r
 {\r
-  EFI_STATUS      Status;\r
-  PLATFORM_CONFIG PlatformConfig;\r
-  UINT64          OptionalElements;\r
-  UINTN           ModeNumber;\r
+  EFI_STATUS       Status;\r
+  PLATFORM_CONFIG  PlatformConfig;\r
+  UINT64           OptionalElements;\r
+  UINTN            ModeNumber;\r
 \r
   ZeroMem (MainFormState, sizeof *MainFormState);\r
 \r
   Status = PlatformConfigLoad (&PlatformConfig, &OptionalElements);\r
   switch (Status) {\r
-  case EFI_SUCCESS:\r
-    if (OptionalElements & PLATFORM_CONFIG_F_GRAPHICS_RESOLUTION) {\r
-      //\r
-      // Format the preferred resolution as text.\r
-      //\r
-      UnicodeSPrintAsciiFormat (\r
-        (CHAR16 *) MainFormState->CurrentPreferredResolution,\r
-        sizeof MainFormState->CurrentPreferredResolution,\r
-        "%Ldx%Ld",\r
-        (INT64) PlatformConfig.HorizontalResolution,\r
-        (INT64) PlatformConfig.VerticalResolution);\r
-\r
-      //\r
-      // Try to locate it in the drop-down list too. This may not succeed, but\r
-      // that's fine.\r
-      //\r
-      for (ModeNumber = 0; ModeNumber < mNumGopModes; ++ModeNumber) {\r
-        if (mGopModes[ModeNumber].X == PlatformConfig.HorizontalResolution &&\r
-            mGopModes[ModeNumber].Y == PlatformConfig.VerticalResolution) {\r
-          MainFormState->NextPreferredResolution = (UINT32) ModeNumber;\r
-          break;\r
+    case EFI_SUCCESS:\r
+      if (OptionalElements & PLATFORM_CONFIG_F_GRAPHICS_RESOLUTION) {\r
+        //\r
+        // Format the preferred resolution as text.\r
+        //\r
+        UnicodeSPrintAsciiFormat (\r
+          (CHAR16 *)MainFormState->CurrentPreferredResolution,\r
+          sizeof MainFormState->CurrentPreferredResolution,\r
+          "%Ldx%Ld",\r
+          (INT64)PlatformConfig.HorizontalResolution,\r
+          (INT64)PlatformConfig.VerticalResolution\r
+          );\r
+\r
+        //\r
+        // Try to locate it in the drop-down list too. This may not succeed, but\r
+        // that's fine.\r
+        //\r
+        for (ModeNumber = 0; ModeNumber < mNumGopModes; ++ModeNumber) {\r
+          if ((mGopModes[ModeNumber].X == PlatformConfig.HorizontalResolution) &&\r
+              (mGopModes[ModeNumber].Y == PlatformConfig.VerticalResolution))\r
+          {\r
+            MainFormState->NextPreferredResolution = (UINT32)ModeNumber;\r
+            break;\r
+          }\r
         }\r
+\r
+        break;\r
       }\r
 \r
-      break;\r
-    }\r
     //\r
     // fall through otherwise\r
     //\r
 \r
-  case EFI_NOT_FOUND:\r
-    UnicodeSPrintAsciiFormat (\r
-      (CHAR16 *) MainFormState->CurrentPreferredResolution,\r
-      sizeof MainFormState->CurrentPreferredResolution,\r
-      "Unset");\r
-    break;\r
+    case EFI_NOT_FOUND:\r
+      UnicodeSPrintAsciiFormat (\r
+        (CHAR16 *)MainFormState->CurrentPreferredResolution,\r
+        sizeof MainFormState->CurrentPreferredResolution,\r
+        "Unset"\r
+        );\r
+      break;\r
 \r
-  default:\r
-    return Status;\r
+    default:\r
+      return Status;\r
   }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
 /**\r
   This function is called by the HII machinery when it fetches the form state.\r
 \r
@@ -229,35 +230,135 @@ ExtractConfig (
   IN CONST  EFI_STRING                      Request,\r
   OUT       EFI_STRING                      *Progress,\r
   OUT       EFI_STRING                      *Results\r
-)\r
+  )\r
 {\r
-  MAIN_FORM_STATE MainFormState;\r
-  EFI_STATUS      Status;\r
+  MAIN_FORM_STATE  MainFormState;\r
+  EFI_STATUS       Status;\r
+  EFI_STRING       ConfigRequestHdr;\r
+  EFI_STRING       ConfigRequest;\r
+  UINTN            Size;\r
+  BOOLEAN          AllocatedRequest;\r
 \r
-  DEBUG ((EFI_D_VERBOSE, "%a: Request=\"%s\"\n", __FUNCTION__, Request));\r
+  DEBUG ((DEBUG_VERBOSE, "%a: Request=\"%s\"\n", __FUNCTION__, Request));\r
+\r
+  if ((Progress == NULL) || (Results == NULL)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  ConfigRequestHdr = NULL;\r
+  ConfigRequest    = NULL;\r
+  Size             = 0;\r
+  AllocatedRequest = FALSE;\r
+\r
+  //\r
+  // Check if <ConfigHdr> matches the GUID and name\r
+  //\r
+  *Progress = Request;\r
+  if ((Request != NULL) &&\r
+      !HiiIsConfigHdrMatch (\r
+         Request,\r
+         &gOvmfPlatformConfigGuid,\r
+         mHiiFormName\r
+         )\r
+      )\r
+  {\r
+    return EFI_NOT_FOUND;\r
+  }\r
 \r
   Status = PlatformConfigToFormState (&MainFormState);\r
   if (EFI_ERROR (Status)) {\r
-    *Progress = Request;\r
     return Status;\r
   }\r
 \r
+  if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {\r
+    //\r
+    // Request has no <RequestElement>, so construct full request string.\r
+    // Allocate and fill a buffer large enough to hold <ConfigHdr>\r
+    // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a\r
+    // null terminator.\r
+    //\r
+    ConfigRequestHdr = HiiConstructConfigHdr (\r
+                         &gOvmfPlatformConfigGuid,\r
+                         mVariableName,\r
+                         mImageHandle\r
+                         );\r
+    if (ConfigRequestHdr == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+\r
+    Size             = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
+    ConfigRequest    = AllocateZeroPool (Size);\r
+    AllocatedRequest = TRUE;\r
+    if (ConfigRequest == NULL) {\r
+      FreePool (ConfigRequestHdr);\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+\r
+    UnicodeSPrint (\r
+      ConfigRequest,\r
+      Size,\r
+      L"%s&OFFSET=0&WIDTH=%016LX",\r
+      ConfigRequestHdr,\r
+      sizeof MainFormState\r
+      );\r
+    FreePool (ConfigRequestHdr);\r
+  } else {\r
+    ConfigRequest = Request;\r
+  }\r
+\r
   //\r
   // Answer the textual request keying off the binary form state.\r
   //\r
-  Status = gHiiConfigRouting->BlockToConfig (gHiiConfigRouting, Request,\r
-                                (VOID *) &MainFormState, sizeof MainFormState,\r
-                                Results, Progress);\r
+  Status = gHiiConfigRouting->BlockToConfig (\r
+                                gHiiConfigRouting,\r
+                                ConfigRequest,\r
+                                (VOID *)&MainFormState,\r
+                                sizeof MainFormState,\r
+                                Results,\r
+                                Progress\r
+                                );\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "%a: BlockToConfig(): %r, Progress=\"%s\"\n",\r
-      __FUNCTION__, Status, (Status == EFI_DEVICE_ERROR) ? NULL : *Progress));\r
+    DEBUG ((\r
+      DEBUG_ERROR,\r
+      "%a: BlockToConfig(): %r, Progress=\"%s\"\n",\r
+      __FUNCTION__,\r
+      Status,\r
+      (Status == EFI_DEVICE_ERROR) ? NULL : *Progress\r
+      ));\r
   } else {\r
-    DEBUG ((EFI_D_VERBOSE, "%a: Results=\"%s\"\n", __FUNCTION__, *Results));\r
+    DEBUG ((DEBUG_VERBOSE, "%a: Results=\"%s\"\n", __FUNCTION__, *Results));\r
   }\r
+\r
+  //\r
+  // If we used a newly allocated ConfigRequest, update Progress to point to\r
+  // original Request instead of ConfigRequest.\r
+  //\r
+  if (Request == NULL) {\r
+    *Progress = NULL;\r
+  } else if (StrStr (Request, L"OFFSET") == NULL) {\r
+    if (EFI_ERROR (Status)) {\r
+      //\r
+      // Since we constructed ConfigRequest, failure can only occur if there\r
+      // is not enough memory. In this case, we point Progress to the first\r
+      // character of Request.\r
+      //\r
+      *Progress = Request;\r
+    } else {\r
+      //\r
+      // In case of success, we point Progress to the null terminator of\r
+      // Request.\r
+      //\r
+      *Progress = Request + StrLen (Request);\r
+    }\r
+  }\r
+\r
+  if (AllocatedRequest) {\r
+    FreePool (ConfigRequest);\r
+  }\r
+\r
   return Status;\r
 }\r
 \r
-\r
 /**\r
   Interpret the binary form state and save it as persistent platform\r
   configuration.\r
@@ -271,12 +372,12 @@ STATIC
 EFI_STATUS\r
 EFIAPI\r
 FormStateToPlatformConfig (\r
-  IN CONST MAIN_FORM_STATE *MainFormState\r
+  IN CONST MAIN_FORM_STATE  *MainFormState\r
   )\r
 {\r
-  EFI_STATUS      Status;\r
-  PLATFORM_CONFIG PlatformConfig;\r
-  CONST GOP_MODE  *GopMode;\r
+  EFI_STATUS       Status;\r
+  PLATFORM_CONFIG  PlatformConfig;\r
+  CONST GOP_MODE   *GopMode;\r
 \r
   //\r
   // There's nothing to do with the textual CurrentPreferredResolution field.\r
@@ -285,6 +386,7 @@ FormStateToPlatformConfig (
   if (MainFormState->NextPreferredResolution >= mNumGopModes) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
+\r
   GopMode = mGopModes + MainFormState->NextPreferredResolution;\r
 \r
   ZeroMem (&PlatformConfig, sizeof PlatformConfig);\r
@@ -295,7 +397,6 @@ FormStateToPlatformConfig (
   return Status;\r
 }\r
 \r
-\r
 /**\r
   This function is called by the HII machinery when it wants the driver to\r
   interpret and persist the form state.\r
@@ -321,14 +422,37 @@ RouteConfig (
   IN CONST  EFI_HII_CONFIG_ACCESS_PROTOCOL  *This,\r
   IN CONST  EFI_STRING                      Configuration,\r
   OUT       EFI_STRING                      *Progress\r
-)\r
+  )\r
 {\r
-  MAIN_FORM_STATE MainFormState;\r
-  UINTN           BlockSize;\r
-  EFI_STATUS      Status;\r
+  MAIN_FORM_STATE  MainFormState;\r
+  UINTN            BlockSize;\r
+  EFI_STATUS       Status;\r
+\r
+  DEBUG ((\r
+    DEBUG_VERBOSE,\r
+    "%a: Configuration=\"%s\"\n",\r
+    __FUNCTION__,\r
+    Configuration\r
+    ));\r
+\r
+  if ((Progress == NULL) || (Configuration == NULL)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
 \r
-  DEBUG ((EFI_D_VERBOSE, "%a: Configuration=\"%s\"\n", __FUNCTION__,\r
-    Configuration));\r
+  //\r
+  // Check if <ConfigHdr> matches the GUID and name\r
+  //\r
+  *Progress = Configuration;\r
+  if ((Configuration != NULL) &&\r
+      !HiiIsConfigHdrMatch (\r
+         Configuration,\r
+         &gOvmfPlatformConfigGuid,\r
+         mHiiFormName\r
+         )\r
+      )\r
+  {\r
+    return EFI_NOT_FOUND;\r
+  }\r
 \r
   //\r
   // the "read" step in RMW\r
@@ -346,12 +470,21 @@ RouteConfig (
   // general we must pre-load the form state from the platform config.)\r
   //\r
   BlockSize = sizeof MainFormState;\r
-  Status = gHiiConfigRouting->ConfigToBlock (gHiiConfigRouting, Configuration,\r
-                                (VOID *) &MainFormState, &BlockSize, Progress);\r
+  Status    = gHiiConfigRouting->ConfigToBlock (\r
+                                   gHiiConfigRouting,\r
+                                   Configuration,\r
+                                   (VOID *)&MainFormState,\r
+                                   &BlockSize,\r
+                                   Progress\r
+                                   );\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "%a: ConfigToBlock(): %r, Progress=\"%s\"\n",\r
-      __FUNCTION__, Status,\r
-      (Status == EFI_BUFFER_TOO_SMALL) ? NULL : *Progress));\r
+    DEBUG ((\r
+      DEBUG_ERROR,\r
+      "%a: ConfigToBlock(): %r, Progress=\"%s\"\n",\r
+      __FUNCTION__,\r
+      Status,\r
+      (Status == EFI_BUFFER_TOO_SMALL) ? NULL : *Progress\r
+      ));\r
     return Status;\r
   }\r
 \r
@@ -362,46 +495,51 @@ RouteConfig (
   if (EFI_ERROR (Status)) {\r
     *Progress = Configuration;\r
   }\r
+\r
   return Status;\r
 }\r
 \r
-\r
 STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 Callback (\r
-  IN     CONST EFI_HII_CONFIG_ACCESS_PROTOCOL   *This,\r
-  IN     EFI_BROWSER_ACTION                     Action,\r
-  IN     EFI_QUESTION_ID                        QuestionId,\r
-  IN     UINT8                                  Type,\r
-  IN OUT EFI_IFR_TYPE_VALUE                     *Value,\r
-  OUT    EFI_BROWSER_ACTION_REQUEST             *ActionRequest\r
+  IN     CONST EFI_HII_CONFIG_ACCESS_PROTOCOL  *This,\r
+  IN     EFI_BROWSER_ACTION                    Action,\r
+  IN     EFI_QUESTION_ID                       QuestionId,\r
+  IN     UINT8                                 Type,\r
+  IN OUT EFI_IFR_TYPE_VALUE                    *Value,\r
+  OUT    EFI_BROWSER_ACTION_REQUEST            *ActionRequest\r
   )\r
 {\r
-  DEBUG ((EFI_D_VERBOSE, "%a: Action=0x%Lx QuestionId=%d Type=%d\n",\r
-    __FUNCTION__, (UINT64) Action, QuestionId, Type));\r
+  DEBUG ((\r
+    DEBUG_VERBOSE,\r
+    "%a: Action=0x%Lx QuestionId=%d Type=%d\n",\r
+    __FUNCTION__,\r
+    (UINT64)Action,\r
+    QuestionId,\r
+    Type\r
+    ));\r
 \r
   if (Action != EFI_BROWSER_ACTION_CHANGED) {\r
     return EFI_UNSUPPORTED;\r
   }\r
 \r
   switch (QuestionId) {\r
-  case QUESTION_SAVE_EXIT:\r
-    *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
-    break;\r
+    case QUESTION_SAVE_EXIT:\r
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
+      break;\r
 \r
-  case QUESTION_DISCARD_EXIT:\r
-    *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
-    break;\r
+    case QUESTION_DISCARD_EXIT:\r
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
+      break;\r
 \r
-  default:\r
-    break;\r
+    default:\r
+      break;\r
   }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
 /**\r
   Query and save all resolutions supported by the GOP.\r
 \r
@@ -423,17 +561,18 @@ STATIC
 EFI_STATUS\r
 EFIAPI\r
 QueryGopModes (\r
-  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop,\r
-  OUT UINTN                        *NumGopModes,\r
-  OUT GOP_MODE                     **GopModes\r
+  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL  *Gop,\r
+  OUT UINTN                         *NumGopModes,\r
+  OUT GOP_MODE                      **GopModes\r
   )\r
 {\r
-  EFI_STATUS Status;\r
-  UINT32     ModeNumber;\r
+  EFI_STATUS  Status;\r
+  UINT32      ModeNumber;\r
 \r
   if (Gop->Mode->MaxMode == 0) {\r
     return EFI_UNSUPPORTED;\r
   }\r
+\r
   *NumGopModes = Gop->Mode->MaxMode;\r
 \r
   *GopModes = AllocatePool (Gop->Mode->MaxMode * sizeof **GopModes);\r
@@ -442,8 +581,8 @@ QueryGopModes (
   }\r
 \r
   for (ModeNumber = 0; ModeNumber < Gop->Mode->MaxMode; ++ModeNumber) {\r
-    EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
-    UINTN                                SizeOfInfo;\r
+    EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  *Info;\r
+    UINTN                                 SizeOfInfo;\r
 \r
     Status = Gop->QueryMode (Gop, ModeNumber, &SizeOfInfo, &Info);\r
     if (EFI_ERROR (Status)) {\r
@@ -463,7 +602,6 @@ FreeGopModes:
   return Status;\r
 }\r
 \r
-\r
 /**\r
   Create a set of "one-of-many" (ie. "drop down list") option IFR opcodes,\r
   based on available GOP resolutions, to be placed under a "one-of-many" (ie.\r
@@ -492,15 +630,15 @@ STATIC
 EFI_STATUS\r
 EFIAPI\r
 CreateResolutionOptions (\r
-  IN  EFI_HII_HANDLE  *PackageList,\r
+  IN  EFI_HII_HANDLE  PackageList,\r
   OUT VOID            **OpCodeBuffer,\r
   IN  UINTN           NumGopModes,\r
   IN  GOP_MODE        *GopModes\r
   )\r
 {\r
-  EFI_STATUS Status;\r
-  VOID       *OutputBuffer;\r
-  UINTN      ModeNumber;\r
+  EFI_STATUS  Status;\r
+  VOID        *OutputBuffer;\r
+  UINTN       ModeNumber;\r
 \r
   OutputBuffer = HiiAllocateOpCodeHandle ();\r
   if (OutputBuffer == NULL) {\r
@@ -508,20 +646,35 @@ CreateResolutionOptions (
   }\r
 \r
   for (ModeNumber = 0; ModeNumber < NumGopModes; ++ModeNumber) {\r
-    CHAR16        Desc[MAXSIZE_RES_CUR];\r
-    EFI_STRING_ID NewString;\r
-    VOID          *OpCode;\r
-\r
-    UnicodeSPrintAsciiFormat (Desc, sizeof Desc, "%Ldx%Ld",\r
-      (INT64) GopModes[ModeNumber].X, (INT64) GopModes[ModeNumber].Y);\r
-    NewString = HiiSetString (PackageList, 0 /* new string */, Desc,\r
-                  NULL /* for all languages */);\r
+    CHAR16         Desc[MAXSIZE_RES_CUR];\r
+    EFI_STRING_ID  NewString;\r
+    VOID           *OpCode;\r
+\r
+    UnicodeSPrintAsciiFormat (\r
+      Desc,\r
+      sizeof Desc,\r
+      "%Ldx%Ld",\r
+      (INT64)GopModes[ModeNumber].X,\r
+      (INT64)GopModes[ModeNumber].Y\r
+      );\r
+    NewString = HiiSetString (\r
+                  PackageList,\r
+                  0 /* new string */,\r
+                  Desc,\r
+                  NULL /* for all languages */\r
+                  );\r
     if (NewString == 0) {\r
       Status = EFI_OUT_OF_RESOURCES;\r
       goto FreeOutputBuffer;\r
     }\r
-    OpCode = HiiCreateOneOfOptionOpCode (OutputBuffer, NewString,\r
-               0 /* Flags */, EFI_IFR_NUMERIC_SIZE_4, ModeNumber);\r
+\r
+    OpCode = HiiCreateOneOfOptionOpCode (\r
+               OutputBuffer,\r
+               NewString,\r
+               0 /* Flags */,\r
+               EFI_IFR_NUMERIC_SIZE_4,\r
+               ModeNumber\r
+               );\r
     if (OpCode == NULL) {\r
       Status = EFI_OUT_OF_RESOURCES;\r
       goto FreeOutputBuffer;\r
@@ -537,7 +690,6 @@ FreeOutputBuffer:
   return Status;\r
 }\r
 \r
-\r
 /**\r
   Populate the form identified by the (PackageList, FormSetGuid, FormId)\r
   triplet.\r
@@ -553,18 +705,18 @@ STATIC
 EFI_STATUS\r
 EFIAPI\r
 PopulateForm (\r
-  IN  EFI_HII_HANDLE  *PackageList,\r
+  IN  EFI_HII_HANDLE  PackageList,\r
   IN  EFI_GUID        *FormSetGuid,\r
   IN  EFI_FORM_ID     FormId,\r
   IN  UINTN           NumGopModes,\r
   IN  GOP_MODE        *GopModes\r
   )\r
 {\r
-  EFI_STATUS         Status;\r
-  VOID               *OpCodeBuffer;\r
-  VOID               *OpCode;\r
-  EFI_IFR_GUID_LABEL *Anchor;\r
-  VOID               *OpCodeBuffer2;\r
+  EFI_STATUS          Status;\r
+  VOID                *OpCodeBuffer;\r
+  VOID                *OpCode;\r
+  EFI_IFR_GUID_LABEL  *Anchor;\r
+  VOID                *OpCodeBuffer2;\r
 \r
   OpCodeBuffer2 = NULL;\r
 \r
@@ -580,12 +732,17 @@ PopulateForm (
   // 2. Create a label opcode (which is a Tiano extension) inside the buffer.\r
   // The label's number must match the "anchor" label in the form.\r
   //\r
-  OpCode = HiiCreateGuidOpCode (OpCodeBuffer, &gEfiIfrTianoGuid,\r
-             NULL /* optional copy origin */, sizeof *Anchor);\r
+  OpCode = HiiCreateGuidOpCode (\r
+             OpCodeBuffer,\r
+             &gEfiIfrTianoGuid,\r
+             NULL /* optional copy origin */,\r
+             sizeof *Anchor\r
+             );\r
   if (OpCode == NULL) {\r
     Status = EFI_OUT_OF_RESOURCES;\r
     goto FreeOpCodeBuffer;\r
   }\r
+\r
   Anchor               = OpCode;\r
   Anchor->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
   Anchor->Number       = LABEL_RES_NEXT;\r
@@ -596,8 +753,12 @@ PopulateForm (
   //\r
   // 3.1. Get a list of resolutions.\r
   //\r
-  Status = CreateResolutionOptions (PackageList, &OpCodeBuffer2,\r
-             NumGopModes, GopModes);\r
+  Status = CreateResolutionOptions (\r
+             PackageList,\r
+             &OpCodeBuffer2,\r
+             NumGopModes,\r
+             GopModes\r
+             );\r
   if (EFI_ERROR (Status)) {\r
     goto FreeOpCodeBuffer;\r
   }\r
@@ -611,8 +772,10 @@ PopulateForm (
              QUESTION_RES_NEXT,                   // ID of question,\r
              FORMSTATEID_MAIN_FORM,               // identifies form state\r
                                                   //   storage,\r
-             (UINT16) OFFSET_OF (MAIN_FORM_STATE, // value of question stored\r
-                        NextPreferredResolution), //   at this offset,\r
+             (UINT16)OFFSET_OF (\r
+                       MAIN_FORM_STATE,           // value of question stored\r
+                       NextPreferredResolution\r
+                       ),                         //   at this offset,\r
              STRING_TOKEN (STR_RES_NEXT),         // Prompt,\r
              STRING_TOKEN (STR_RES_NEXT_HELP),    // Help,\r
              0,                                   // QuestionFlags,\r
@@ -630,7 +793,10 @@ PopulateForm (
   //\r
   // 4. Update the form with the opcode buffer.\r
   //\r
-  Status = HiiUpdateForm (PackageList, FormSetGuid, FormId,\r
+  Status = HiiUpdateForm (\r
+             PackageList,\r
+             FormSetGuid,\r
+             FormId,\r
              OpCodeBuffer, // buffer with head anchor, and new contents to be\r
                            // inserted at it\r
              NULL          // buffer with tail anchor, for deleting old\r
@@ -646,7 +812,6 @@ FreeOpCodeBuffer:
   return Status;\r
 }\r
 \r
-\r
 /**\r
   Load and execute the platform configuration.\r
 \r
@@ -660,15 +825,19 @@ ExecutePlatformConfig (
   VOID\r
   )\r
 {\r
-  EFI_STATUS      Status;\r
-  PLATFORM_CONFIG PlatformConfig;\r
-  UINT64          OptionalElements;\r
-  RETURN_STATUS   PcdStatus;\r
+  EFI_STATUS       Status;\r
+  PLATFORM_CONFIG  PlatformConfig;\r
+  UINT64           OptionalElements;\r
+  RETURN_STATUS    PcdStatus;\r
 \r
   Status = PlatformConfigLoad (&PlatformConfig, &OptionalElements);\r
   if (EFI_ERROR (Status)) {\r
-    DEBUG (((Status == EFI_NOT_FOUND) ? EFI_D_VERBOSE : EFI_D_ERROR,\r
-      "%a: failed to load platform config: %r\n", __FUNCTION__, Status));\r
+    DEBUG ((\r
+      (Status == EFI_NOT_FOUND) ? DEBUG_VERBOSE : DEBUG_ERROR,\r
+      "%a: failed to load platform config: %r\n",\r
+      __FUNCTION__,\r
+      Status\r
+      ));\r
     return Status;\r
   }\r
 \r
@@ -676,19 +845,25 @@ ExecutePlatformConfig (
     //\r
     // Pass the preferred resolution to GraphicsConsoleDxe via dynamic PCDs.\r
     //\r
-    PcdStatus = PcdSet32S (PcdVideoHorizontalResolution,\r
-      PlatformConfig.HorizontalResolution);\r
+    PcdStatus = PcdSet32S (\r
+                  PcdVideoHorizontalResolution,\r
+                  PlatformConfig.HorizontalResolution\r
+                  );\r
+    ASSERT_RETURN_ERROR (PcdStatus);\r
+\r
+    PcdStatus = PcdSet32S (\r
+                  PcdVideoVerticalResolution,\r
+                  PlatformConfig.VerticalResolution\r
+                  );\r
     ASSERT_RETURN_ERROR (PcdStatus);\r
 \r
-    PcdStatus = PcdSet32S (PcdVideoVerticalResolution,\r
-      PlatformConfig.VerticalResolution);\r
+    PcdStatus = PcdSet8S (PcdVideoResolutionSource, 1);\r
     ASSERT_RETURN_ERROR (PcdStatus);\r
   }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
 /**\r
   Notification callback for GOP interface installation.\r
 \r
@@ -701,24 +876,27 @@ STATIC
 VOID\r
 EFIAPI\r
 GopInstalled (\r
-  IN EFI_EVENT Event,\r
-  IN VOID      *Context\r
+  IN EFI_EVENT  Event,\r
+  IN VOID       *Context\r
   )\r
 {\r
-  EFI_STATUS                   Status;\r
-  EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;\r
+  EFI_STATUS                    Status;\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL  *Gop;\r
 \r
   ASSERT (Event == mGopEvent);\r
 \r
   //\r
   // Check further GOPs.\r
   //\r
-  for (;;) {\r
+  for ( ; ;) {\r
     mNumGopModes = 0;\r
-    mGopModes = NULL;\r
+    mGopModes    = NULL;\r
 \r
-    Status = gBS->LocateProtocol (&gEfiGraphicsOutputProtocolGuid, mGopTracker,\r
-                    (VOID **) &Gop);\r
+    Status = gBS->LocateProtocol (\r
+                    &gEfiGraphicsOutputProtocolGuid,\r
+                    mGopTracker,\r
+                    (VOID **)&Gop\r
+                    );\r
     if (EFI_ERROR (Status)) {\r
       return;\r
     }\r
@@ -728,8 +906,13 @@ GopInstalled (
       continue;\r
     }\r
 \r
-    Status = PopulateForm (mInstalledPackages, &gOvmfPlatformConfigGuid,\r
-               FORMID_MAIN_FORM, mNumGopModes, mGopModes);\r
+    Status = PopulateForm (\r
+               mInstalledPackages,\r
+               &gOvmfPlatformConfigGuid,\r
+               FORMID_MAIN_FORM,\r
+               mNumGopModes,\r
+               mGopModes\r
+               );\r
     if (EFI_ERROR (Status)) {\r
       FreePool (mGopModes);\r
       continue;\r
@@ -744,11 +927,10 @@ GopInstalled (
   //\r
   Status = gBS->CloseEvent (mGopEvent);\r
   ASSERT_EFI_ERROR (Status);\r
-  mGopEvent = NULL;\r
+  mGopEvent   = NULL;\r
   mGopTracker = NULL;\r
 }\r
 \r
-\r
 /**\r
   Entry point for this driver.\r
 \r
@@ -767,7 +949,7 @@ PlatformInit (
   IN  EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
 {\r
-  EFI_STATUS Status;\r
+  EFI_STATUS  Status;\r
 \r
   ExecutePlatformConfig ();\r
 \r
@@ -778,14 +960,23 @@ PlatformInit (
   //\r
   // Declare ourselves suitable for HII communication.\r
   //\r
-  Status = gBS->InstallMultipleProtocolInterfaces (&ImageHandle,\r
-                  &gEfiDevicePathProtocolGuid,      &mPkgDevicePath,\r
-                  &gEfiHiiConfigAccessProtocolGuid, &mConfigAccess,\r
-                  NULL);\r
+  Status = gBS->InstallMultipleProtocolInterfaces (\r
+                  &ImageHandle,\r
+                  &gEfiDevicePathProtocolGuid,\r
+                  &mPkgDevicePath,\r
+                  &gEfiHiiConfigAccessProtocolGuid,\r
+                  &mConfigAccess,\r
+                  NULL\r
+                  );\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
 \r
+  //\r
+  // Save the driver image handle.\r
+  //\r
+  mImageHandle = ImageHandle;\r
+\r
   //\r
   // Publish the HII package list to HII Database.\r
   //\r
@@ -801,14 +992,22 @@ PlatformInit (
     goto UninstallProtocols;\r
   }\r
 \r
-  Status = gBS->CreateEvent (EVT_NOTIFY_SIGNAL, TPL_CALLBACK, &GopInstalled,\r
-                  NULL /* Context */, &mGopEvent);\r
+  Status = gBS->CreateEvent (\r
+                  EVT_NOTIFY_SIGNAL,\r
+                  TPL_CALLBACK,\r
+                  &GopInstalled,\r
+                  NULL /* Context */,\r
+                  &mGopEvent\r
+                  );\r
   if (EFI_ERROR (Status)) {\r
     goto RemovePackages;\r
   }\r
 \r
-  Status = gBS->RegisterProtocolNotify (&gEfiGraphicsOutputProtocolGuid,\r
-                  mGopEvent, &mGopTracker);\r
+  Status = gBS->RegisterProtocolNotify (\r
+                  &gEfiGraphicsOutputProtocolGuid,\r
+                  mGopEvent,\r
+                  &mGopTracker\r
+                  );\r
   if (EFI_ERROR (Status)) {\r
     goto CloseGopEvent;\r
   }\r
@@ -828,10 +1027,14 @@ RemovePackages:
   HiiRemovePackages (mInstalledPackages);\r
 \r
 UninstallProtocols:\r
-  gBS->UninstallMultipleProtocolInterfaces (ImageHandle,\r
-         &gEfiDevicePathProtocolGuid,      &mPkgDevicePath,\r
-         &gEfiHiiConfigAccessProtocolGuid, &mConfigAccess,\r
-         NULL);\r
+  gBS->UninstallMultipleProtocolInterfaces (\r
+         ImageHandle,\r
+         &gEfiDevicePathProtocolGuid,\r
+         &mPkgDevicePath,\r
+         &gEfiHiiConfigAccessProtocolGuid,\r
+         &mConfigAccess,\r
+         NULL\r
+         );\r
   return Status;\r
 }\r
 \r
@@ -867,9 +1070,13 @@ PlatformUnload (
   // Release resources allocated by the entry point.\r
   //\r
   HiiRemovePackages (mInstalledPackages);\r
-  gBS->UninstallMultipleProtocolInterfaces (ImageHandle,\r
-         &gEfiDevicePathProtocolGuid,      &mPkgDevicePath,\r
-         &gEfiHiiConfigAccessProtocolGuid, &mConfigAccess,\r
-         NULL);\r
+  gBS->UninstallMultipleProtocolInterfaces (\r
+         ImageHandle,\r
+         &gEfiDevicePathProtocolGuid,\r
+         &mPkgDevicePath,\r
+         &gEfiHiiConfigAccessProtocolGuid,\r
+         &mConfigAccess,\r
+         NULL\r
+         );\r
   return EFI_SUCCESS;\r
 }\r