Sync in patch for EDK 945
authorqwang12 <qwang12@de2fecce-e211-0410-80a6-f3fac2684e05>
Thu, 6 Mar 2008 10:53:58 +0000 (10:53 +0000)
committerqwang12 <qwang12@de2fecce-e211-0410-80a6-f3fac2684e05>
Thu, 6 Mar 2008 10:53:58 +0000 (10:53 +0000)
Add console mode setting in UI.

User can select console mode (e.g. 80x25, 100x31) in UI; and boot with user-defined mode.

git-svn-id: https://edk2.tianocore.org/svn/edk2/trunk@4797 de2fecce-e211-0410-80a6-f3fac2684e05

edk2/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c
edk2/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.h
edk2/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterDxe.inf
edk2/MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitterGraphics.c

index abf3595..5053251 100644 (file)
@@ -683,6 +683,12 @@ ConSplitterTextOutConstructor (
   //\r
   ConOutPrivate->TextOut.Mode = &ConOutPrivate->TextOutMode;\r
 \r
+  //\r
+  // When new console device is added, the new mode will be set later,\r
+  // so put current mode back to init state.\r
+  //  \r
+  ConOutPrivate->TextOutMode.Mode = 0xFF;\r
+\r
   Status = ConSplitterGrowBuffer (\r
             sizeof (TEXT_OUT_AND_GOP_DATA),\r
             &ConOutPrivate->TextOutListCount,\r
@@ -1258,6 +1264,13 @@ Returns:
   if (EFI_ERROR (Status)) {\r
     UgaDraw = NULL;\r
   }\r
+\r
+  //\r
+  // When new console device is added, the new mode will be set later,\r
+  // so put current mode back to init state.\r
+  //\r
+  mConOut.TextOutMode.Mode = 0xFF;\r
+  \r
   //\r
   // If both ConOut and StdErr incorporate the same Text Out device,\r
   // their MaxMode and QueryData should be the intersection of both.\r
@@ -1319,6 +1332,13 @@ Returns:
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
+  \r
+  //\r
+  // When new console device is added, the new mode will be set later,\r
+  // so put current mode back to init state.\r
+  //\r
+  mStdErr.TextOutMode.Mode = 0xFF;\r
+  \r
   //\r
   // If both ConOut and StdErr incorporate the same Text Out device,\r
   // their MaxMode and QueryData should be the intersection of both.\r
@@ -2761,6 +2781,112 @@ Done:
   return Status;\r
 }\r
 \r
+VOID\r
+ConsplitterSetConsoleOutMode (\r
+  IN  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This routine will get the current console mode information (column, row)\r
+  from ConsoleOutMode variable and set it; if the variable does not exist,\r
+  set to user defined console mode.\r
+\r
+Arguments:\r
+\r
+  None\r
+\r
+Returns:\r
+\r
+  None\r
+\r
+--*/  \r
+{\r
+  UINTN                         Col;\r
+  UINTN                         Row;\r
+  UINTN                         Mode;\r
+  UINTN                         PreferMode;\r
+  UINTN                         BaseMode;\r
+  UINTN                         ModeInfoSize;\r
+  UINTN                         MaxMode;\r
+  EFI_STATUS                    Status;\r
+  CONSOLE_OUT_MODE              *ModeInfo;\r
+  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *TextOut;\r
+  \r
+  PreferMode   = 0xFF;\r
+  BaseMode     = 0xFF;\r
+  TextOut      = &Private->TextOut;\r
+  MaxMode      = (UINTN) (TextOut->Mode->MaxMode);\r
+  ModeInfoSize = sizeof (CONSOLE_OUT_MODE);\r
+\r
+  ModeInfo = AllocateZeroPool (sizeof(CONSOLE_OUT_MODE));\r
+  ASSERT(ModeInfo != NULL);\r
+\r
+  Status = gRT->GetVariable (\r
+                   VarConOutMode,\r
+                   &gEfiGenericPlatformVariableGuid,\r
+                   NULL,\r
+                   &ModeInfoSize,\r
+                   ModeInfo\r
+                   );\r
+\r
+  //\r
+  // Set to the default mode 80 x 25 required by EFI/UEFI spec; \r
+  // user can also define other valid default console mode here.\r
+  //            \r
+  if (EFI_ERROR(Status)) {\r
+    ModeInfo->Column = 80;\r
+    ModeInfo->Row    = 25;\r
+    Status = gRT->SetVariable (\r
+                    VarConOutMode,\r
+                    &gEfiGenericPlatformVariableGuid,\r
+                    EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
+                    sizeof (CONSOLE_OUT_MODE),\r
+                    ModeInfo\r
+                    );    \r
+  }\r
+  \r
+  for (Mode = 0; Mode < MaxMode; Mode++) {\r
+    Status = TextOut->QueryMode (TextOut, Mode, &Col, &Row);\r
+    if (!EFI_ERROR(Status)) {\r
+      if (Col == ModeInfo->Column && Row == ModeInfo->Row) {\r
+        PreferMode = Mode;\r
+      }\r
+      if (Col == 80 && Row == 25) {\r
+        BaseMode = Mode;\r
+      }\r
+    }\r
+  }\r
+  \r
+  Status = TextOut->SetMode (TextOut, PreferMode);\r
+  \r
+  //\r
+  // if current mode setting is failed, default 80x25 mode will be set.\r
+  //\r
+  if (EFI_ERROR(Status)) {\r
+    Status = TextOut->SetMode (TextOut, BaseMode);\r
+    ASSERT(!EFI_ERROR(Status));\r
+    \r
+    ModeInfo->Column = 80;\r
+    ModeInfo->Row    = 25;\r
+    \r
+    //\r
+    // Update ConOutMode variable\r
+    //\r
+    Status = gRT->SetVariable (\r
+                    VarConOutMode,\r
+                    &gEfiGenericPlatformVariableGuid,\r
+                    EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
+                    sizeof (CONSOLE_OUT_MODE),\r
+                    ModeInfo\r
+                    );     \r
+  }\r
+\r
+  gBS->FreePool (ModeInfo);\r
+}\r
+\r
+\r
 EFI_STATUS\r
 ConSplitterTextOutAddDevice (\r
   IN  TEXT_OUT_SPLITTER_PRIVATE_DATA     *Private,\r
@@ -2916,6 +3042,12 @@ Returns:
     Private->TextOut.SetMode (&Private->TextOut, 0);\r
   }\r
 \r
+  //\r
+  // After adding new console device, all existing console devices should be \r
+  // synced to the current shared mode.\r
+  //\r
+  ConsplitterSetConsoleOutMode (Private);\r
+\r
   return Status;\r
 }\r
 \r
index 9fcbab3..757aed8 100644 (file)
@@ -20,6 +20,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Guid/PrimaryConsoleOutDevice.h>\r
 #include <Protocol/GraphicsOutput.h>\r
 #include <Guid/PrimaryConsoleInDevice.h>\r
+#include <Guid/GenericPlatformVariable.h>\r
 #include <Protocol/SimplePointer.h>\r
 #include <Protocol/AbsolutePointer.h>\r
 #include <Protocol/SimpleTextOut.h>\r
@@ -38,6 +39,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/BaseMemoryLib.h>\r
 #include <Library/MemoryAllocationLib.h>\r
 #include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/UefiRuntimeServicesTableLib.h>\r
+\r
 \r
 //\r
 // Driver Binding Externs\r
@@ -73,6 +76,13 @@ extern EFI_GUID                     gSimpleTextInExNotifyGuid;
 #define CONSOLE_SPLITTER_MODES_ALLOC_UNIT     32\r
 #define MAX_STD_IN_PASSWORD                   80\r
 \r
+#define VarConOutMode L"ConOutMode"\r
+\r
+typedef struct {\r
+  UINTN   Column;\r
+  UINTN   Row;\r
+} CONSOLE_OUT_MODE;\r
+\r
 typedef struct {\r
   UINTN Columns;\r
   UINTN Rows;\r
index 8201f2c..3f627b8 100644 (file)
@@ -52,6 +52,7 @@
 \r
 [LibraryClasses]\r
   UefiBootServicesTableLib\r
+  UefiRuntimeServicesTableLib\r
   MemoryAllocationLib\r
   BaseMemoryLib\r
   BaseLib\r
@@ -68,6 +69,7 @@
   gEfiPrimaryConsoleInDeviceGuid                # ALWAYS_PRODUCED\r
   gEfiPrimaryStandardErrorDeviceGuid            # ALWAYS_PRODUCED\r
   gSimpleTextInExNotifyGuid                     # ALWAYS_PRODUCED\r
+  gEfiGenericPlatformVariableGuid               # ALWAYS_CONSUMED\r
 \r
 [Protocols]\r
   gEfiConsoleControlProtocolGuid                # PROTOCOL ALWAYS_PRODUCED\r
index 2c66a44..77c076f 100644 (file)
@@ -1373,7 +1373,7 @@ DevNullTextOutSetMode (
     return EFI_UNSUPPORTED;\r
   }\r
 \r
-  if (Private->DevNullColumns != Column || Private->DevNullRows != Row) {\r
+  if (Private->TextOutMode.Mode != (INT32) ModeNumber) {\r
 \r
     Private->TextOutMode.Mode = (INT32) ModeNumber;\r
     Private->DevNullColumns   = Column;\r