]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Updated GraphicsConsole and Terminal driver text mode initialization routine for...
authorli-elvin <li-elvin@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 25 Nov 2011 08:35:00 +0000 (08:35 +0000)
committerli-elvin <li-elvin@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 25 Nov 2011 08:35:00 +0000 (08:35 +0000)
Signed-off-by: li-elvin
Reviewed-by: hhtian
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@12787 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.c
MdeModulePkg/Universal/Console/GraphicsConsoleDxe/GraphicsConsole.h
MdeModulePkg/Universal/Console/TerminalDxe/Terminal.c
MdeModulePkg/Universal/Console/TerminalDxe/Terminal.h
MdeModulePkg/Universal/Console/TerminalDxe/TerminalConOut.c

index 553a8146346076d50480e5e9bd351664c64242bd..44282b1f9f78517d44fbedcb2f6c1b548096b86c 100644 (file)
@@ -41,16 +41,20 @@ GRAPHICS_CONSOLE_DEV    mGraphicsConsoleDevTemplate = {
     0,\r
     TRUE\r
   },\r
-  {\r
-    { 80, 25, 0, 0, 0, 0, 0 },  // Mode 0\r
-    { 80, 50, 0, 0, 0, 0, 0 },  // Mode 1\r
-    { 100,31, 0, 0, 0, 0, 0 },  // Mode 2\r
-    {  0,  0, 0, 0, 0, 0, 0 },  // Mode 3\r
-    {  0,  0, 0, 0, 0, 0, 0 }   // Mode 4\r
-  },\r
+  (GRAPHICS_CONSOLE_MODE_DATA *) NULL,\r
   (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) NULL\r
 };\r
 \r
+GRAPHICS_CONSOLE_MODE_DATA mGraphicsConsoleModeData[] = {\r
+  {100, 31},\r
+  //\r
+  // New modes can be added here.\r
+  // The last 2 entries are specific for PcdConOutRow x PcdConOutColumn and full screen mode.\r
+  //\r
+  {0, 0},\r
+  {0, 0}\r
+};\r
+\r
 EFI_HII_DATABASE_PROTOCOL   *mHiiDatabase;\r
 EFI_HII_FONT_PROTOCOL       *mHiiFont;\r
 EFI_HII_HANDLE              mHiiHandle;\r
@@ -210,6 +214,159 @@ Error:
   return Status;\r
 }\r
 \r
+/**\r
+  Initialize all the text modes which the graphics console supports.\r
+\r
+  It returns information for available text modes that the graphics can support.\r
+\r
+  @param[in]  HorizontalResolution     The size of video screen in pixels in the X dimension.\r
+  @param[in]  VerticalResolution       The size of video screen in pixels in the Y dimension.\r
+  @param[in]  GopModeNumber            The graphics mode number which graphis console is based on.\r
+  @param[out] TextModeCount            The total number of text modes that graphics console supports.\r
+  @param[out] TextModeData             The buffer to the text modes column and row information.\r
+                                       Caller is responsible to free it when it's non-NULL.\r
+\r
+  @retval EFI_SUCCESS                  The supporting mode information is returned.\r
+  @retval EFI_INVALID_PARAMETER        The parameters are invalid.\r
+\r
+**/\r
+EFI_STATUS\r
+InitializeGraphicsConsoleTextMode (\r
+  IN UINT32                        HorizontalResolution,\r
+  IN UINT32                        VerticalResolution,\r
+  IN UINT32                        GopModeNumber,\r
+  OUT UINTN                        *TextModeCount,\r
+  OUT GRAPHICS_CONSOLE_MODE_DATA   **TextModeData\r
+  )\r
+{\r
+  UINTN                       Index;\r
+  UINTN                       Count;\r
+  GRAPHICS_CONSOLE_MODE_DATA  *ModeBuffer;\r
+  GRAPHICS_CONSOLE_MODE_DATA  *NewModeBuffer;\r
+  UINTN                       ValidCount;\r
+  UINTN                       ValidIndex;\r
+  UINTN                       MaxColumns;\r
+  UINTN                       MaxRows;  \r
+  \r
+  if ((TextModeCount == NULL) || (TextModeData == NULL)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  //\r
+  // Add PcdConOutColumn and PcdConOutRow to the last second entry.\r
+  //\r
+  Count = sizeof (mGraphicsConsoleModeData) / sizeof (GRAPHICS_CONSOLE_MODE_DATA);\r
+  mGraphicsConsoleModeData[Count - 2].Columns = (UINTN) PcdGet32 (PcdConOutColumn);\r
+  mGraphicsConsoleModeData[Count - 2].Rows    = (UINTN) PcdGet32 (PcdConOutRow);\r
+\r
+  //\r
+  // Compute the maximum number of text Rows and Columns that this current graphics mode can support.\r
+  // To make graphics console work well, MaxColumns and MaxRows should not be zero.\r
+  //\r
+  MaxColumns = HorizontalResolution / EFI_GLYPH_WIDTH;\r
+  MaxRows    = VerticalResolution / EFI_GLYPH_HEIGHT;\r
+\r
+  //\r
+  // Add full screen mode to the last entry.\r
+  //\r
+  mGraphicsConsoleModeData[Count - 1].Columns = MaxColumns;\r
+  mGraphicsConsoleModeData[Count - 1].Rows    = MaxRows;\r
+\r
+  //\r
+  // Get defined mode buffer pointer.\r
+  //\r
+  ModeBuffer = mGraphicsConsoleModeData;\r
+\r
+  //\r
+  // Here we make sure that the final mode exposed does not include the duplicated modes,\r
+  // and does not include the invalid modes which exceed the max column and row.\r
+  // Reserve 2 modes for 80x25, 80x50 of graphics console.\r
+  //\r
+  NewModeBuffer = AllocateZeroPool (sizeof (GRAPHICS_CONSOLE_MODE_DATA) * (Count + 2));\r
+  ASSERT (NewModeBuffer != NULL);\r
+\r
+  //\r
+  // Mode 0 and mode 1 is for 80x25, 80x50 according to UEFI spec.\r
+  //\r
+  ValidCount = 0;  \r
+\r
+  if ((MaxColumns >= 80) && (MaxRows >= 25)) {\r
+    //\r
+    // 80x25 can be supported.\r
+    //\r
+    NewModeBuffer[ValidCount].Columns = 80;\r
+    NewModeBuffer[ValidCount].Rows    = 25;\r
+  } else {\r
+    //\r
+    // 80x25 cannot be supported, set PCD defined mode.\r
+    //\r
+    NewModeBuffer[ValidCount].Columns = (UINTN) PcdGet32 (PcdConOutColumn);\r
+    NewModeBuffer[ValidCount].Rows    = (UINTN) PcdGet32 (PcdConOutRow);\r
+  }  \r
+  NewModeBuffer[ValidCount].GopWidth      = HorizontalResolution;\r
+  NewModeBuffer[ValidCount].GopHeight     = VerticalResolution;\r
+  NewModeBuffer[ValidCount].GopModeNumber = GopModeNumber;\r
+  NewModeBuffer[ValidCount].DeltaX        = (HorizontalResolution - (NewModeBuffer[ValidCount].Columns * EFI_GLYPH_WIDTH)) >> 1;\r
+  NewModeBuffer[ValidCount].DeltaY        = (VerticalResolution - (NewModeBuffer[ValidCount].Rows * EFI_GLYPH_HEIGHT)) >> 1;      \r
+  ValidCount++;\r
+\r
+  if ((MaxColumns >= 80) && (MaxRows >= 50)) {\r
+    NewModeBuffer[ValidCount].Columns = 80;\r
+    NewModeBuffer[ValidCount].Rows    = 50;\r
+    NewModeBuffer[ValidCount].DeltaX  = (HorizontalResolution - (80 * EFI_GLYPH_WIDTH)) >> 1;\r
+    NewModeBuffer[ValidCount].DeltaY  = (VerticalResolution - (50 * EFI_GLYPH_HEIGHT)) >> 1;    \r
+  }\r
+  NewModeBuffer[ValidCount].GopWidth      = HorizontalResolution;\r
+  NewModeBuffer[ValidCount].GopHeight     = VerticalResolution;\r
+  NewModeBuffer[ValidCount].GopModeNumber = GopModeNumber;\r
+  ValidCount++;\r
+  \r
+  //\r
+  // Start from mode 2 to put the valid mode other than 80x25 and 80x50 in the output mode buffer.\r
+  //\r
+  for (Index = 0; Index < Count; Index++) {\r
+    if ((ModeBuffer[Index].Columns == 0) || (ModeBuffer[Index].Rows == 0) ||\r
+        (ModeBuffer[Index].Columns > MaxColumns) || (ModeBuffer[Index].Rows > MaxRows)) {\r
+      //\r
+      // Skip the pre-defined mode which is invalid or exceeds the max column and row.\r
+      //\r
+      continue;\r
+    }\r
+    for (ValidIndex = 0; ValidIndex < ValidCount; ValidIndex++) {\r
+      if ((ModeBuffer[Index].Columns == NewModeBuffer[ValidIndex].Columns) &&\r
+          (ModeBuffer[Index].Rows == NewModeBuffer[ValidIndex].Rows)) {\r
+        //\r
+        // Skip the duplicated mode.\r
+        //\r
+        break;\r
+      }\r
+    }\r
+    if (ValidIndex == ValidCount) {\r
+      NewModeBuffer[ValidCount].Columns       = ModeBuffer[Index].Columns;\r
+      NewModeBuffer[ValidCount].Rows          = ModeBuffer[Index].Rows;\r
+      NewModeBuffer[ValidCount].GopWidth      = HorizontalResolution;\r
+      NewModeBuffer[ValidCount].GopHeight     = VerticalResolution;\r
+      NewModeBuffer[ValidCount].GopModeNumber = GopModeNumber;\r
+      NewModeBuffer[ValidCount].DeltaX        = (HorizontalResolution - (NewModeBuffer[ValidCount].Columns * EFI_GLYPH_WIDTH)) >> 1;\r
+      NewModeBuffer[ValidCount].DeltaY        = (VerticalResolution - (NewModeBuffer[ValidCount].Rows * EFI_GLYPH_HEIGHT)) >> 1;\r
+      ValidCount++;\r
+    }\r
+  }\r
\r
+  DEBUG_CODE (\r
+    for (Index = 0; Index < ValidCount; Index++) {\r
+      DEBUG ((EFI_D_INFO, "Graphics - Mode %d, Column = %d, Row = %d\n", \r
+                           Index, NewModeBuffer[Index].Columns, NewModeBuffer[Index].Rows));  \r
+    }\r
+  );\r
+  \r
+  //\r
+  // Return valid mode count and mode information buffer.\r
+  //\r
+  *TextModeCount = ValidCount;\r
+  *TextModeData  = NewModeBuffer;\r
+  return EFI_SUCCESS;\r
+}\r
 \r
 /**\r
   Start this driver on Controller by opening Graphics Output protocol or\r
@@ -241,14 +398,10 @@ GraphicsConsoleControllerDriverStart (
   UINT32                               RefreshRate;\r
   UINT32                               ModeIndex;\r
   UINTN                                MaxMode;\r
-  UINTN                                MaxColumns;\r
-  UINTN                                MaxRows;\r
   UINT32                               ModeNumber;\r
   EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE    *Mode;\r
-  GRAPHICS_CONSOLE_MODE_DATA           *ModeData;\r
   UINTN                                SizeOfInfo;  \r
   EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
-  BOOLEAN                              TextModeFound;\r
   \r
   ModeNumber = 0;\r
 \r
@@ -399,80 +552,17 @@ GraphicsConsoleControllerDriverStart (
   }\r
 \r
   //\r
-  // Include the existing pre-defined 80x25, 80x50 and 100x31 \r
-  // in mGraphicsConsoleDevTemplate.\r
-  //\r
-  MaxMode = 3;\r
-\r
-  //\r
-  // Compute the maximum number of text Rows and Columns that this current graphics mode can support\r
-  //\r
-  MaxColumns = HorizontalResolution / EFI_GLYPH_WIDTH;\r
-  MaxRows    = VerticalResolution / EFI_GLYPH_HEIGHT;\r
-\r
-  //\r
-  // Add Mode #3 that uses the entire display for user-defined mode\r
-  //\r
-  Private->ModeData[MaxMode].Columns = MaxColumns;\r
-  Private->ModeData[MaxMode].Rows    = MaxRows;\r
-  MaxMode++;\r
-\r
-  //\r
-  // Add Mode #4 that uses the PCD values\r
-  //\r
-  Private->ModeData[MaxMode].Columns = (UINTN) PcdGet32 (PcdConOutColumn);\r
-  Private->ModeData[MaxMode].Rows    = (UINTN) PcdGet32 (PcdConOutRow);  \r
-  if ((Private->ModeData[MaxMode].Columns != 0) && (Private->ModeData[MaxMode].Rows != 0)) {\r
-    MaxMode++;\r
-  }\r
-\r
-  //\r
-  // Here we make sure that mode 0 is valid\r
+  // Initialize the mode which GraphicsConsole supports.\r
   //\r
-  if (MaxColumns < Private->ModeData[0].Columns ||\r
-      MaxRows < Private->ModeData[0].Rows) {\r
-    //\r
-    // 80x25 cannot be supported.\r
-    //\r
-    if ((Private->ModeData[4].Columns != 0) && (Private->ModeData[4].Rows != 0)) {\r
-    //\r
-    // Fallback to using the Mode 4 for mode 0 if PcdConOutColumn and PcdConOutRow\r
-    // are not 0. If the PCDs are also too large, then mode 0\r
-    // will be shrunk to fit as needed. If the PCDs are all 0,\r
-    // then mode 0 will be the entire display.\r
-    //\r
-      Private->ModeData[0].Columns = MIN (Private->ModeData[4].Columns, MaxColumns);\r
-      Private->ModeData[0].Rows    = MIN (Private->ModeData[4].Rows, MaxRows);\r
-    } else {\r
-      Private->ModeData[0].Columns = MaxColumns;\r
-      Private->ModeData[0].Rows    = MaxRows;\r
-    }\r
-  }\r
-  \r
-  TextModeFound = FALSE;\r
-  for (ModeIndex = 0; ModeIndex < GRAPHICS_MAX_MODE; ModeIndex++) {\r
-    ModeData = &Private->ModeData[ModeIndex];\r
-    ModeData->GopWidth      = HorizontalResolution;\r
-    ModeData->GopHeight     = VerticalResolution;\r
-    ModeData->GopModeNumber = ModeNumber;\r
-    if ((ModeData->Columns != 0) && (ModeData->Rows != 0) &&\r
-        (MaxColumns >= ModeData->Columns) && (MaxRows >= ModeData->Rows)) {\r
-      ModeData->DeltaX        = (HorizontalResolution - (ModeData->Columns * EFI_GLYPH_WIDTH)) >> 1;\r
-      ModeData->DeltaY        = (VerticalResolution - (ModeData->Rows * EFI_GLYPH_HEIGHT)) >> 1;\r
-      TextModeFound = TRUE;\r
-    } else {\r
-      ModeData->Columns       = 0;\r
-      ModeData->Rows          = 0;\r
-      ModeData->DeltaX        = 0;\r
-      ModeData->DeltaY        = 0;\r
-    }\r
-  }\r
+  Status = InitializeGraphicsConsoleTextMode (\r
+             HorizontalResolution,\r
+             VerticalResolution,\r
+             ModeNumber,\r
+             &MaxMode,\r
+             &Private->ModeData\r
+             );\r
 \r
-  //\r
-  // See if the resolution was too small to support any text modes\r
-  //\r
-  if (!TextModeFound) {\r
-    Status = EFI_UNSUPPORTED;\r
+  if (EFI_ERROR (Status)) {\r
     goto Error;\r
   }\r
 \r
@@ -528,6 +618,10 @@ Error:
       FreePool (Private->LineBuffer);\r
     }\r
 \r
+    if (Private->ModeData != NULL) {\r
+      FreePool (Private->ModeData);\r
+    }\r
+\r
     //\r
     // Free private data\r
     //\r
@@ -612,6 +706,10 @@ GraphicsConsoleControllerDriverStop (
       FreePool (Private->LineBuffer);\r
     }\r
 \r
+    if (Private->ModeData != NULL) {\r
+      FreePool (Private->ModeData);\r
+    }\r
+\r
     //\r
     // Free our instance data\r
     //\r
@@ -1162,7 +1260,7 @@ GraphicsConsoleConOutQueryMode (
   *Columns  = Private->ModeData[ModeNumber].Columns;\r
   *Rows     = Private->ModeData[ModeNumber].Rows;\r
 \r
-  if (*Columns <= 0 && *Rows <= 0) {\r
+  if (*Columns <= 0 || *Rows <= 0) {\r
     Status = EFI_UNSUPPORTED;\r
     goto Done;\r
 \r
index 338b7aad29cde3eeef56c04b71925f475884c28a..0db6f04c11f948c7d4a13b659dc620070a51b470 100644 (file)
@@ -63,15 +63,13 @@ typedef struct {
   UINT32  GopModeNumber;\r
 } GRAPHICS_CONSOLE_MODE_DATA;\r
 \r
-#define GRAPHICS_MAX_MODE 5\r
-\r
 typedef struct {\r
   UINTN                            Signature;\r
   EFI_GRAPHICS_OUTPUT_PROTOCOL     *GraphicsOutput;\r
   EFI_UGA_DRAW_PROTOCOL            *UgaDraw;\r
   EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  SimpleTextOutput;\r
   EFI_SIMPLE_TEXT_OUTPUT_MODE      SimpleTextOutputMode;\r
-  GRAPHICS_CONSOLE_MODE_DATA       ModeData[GRAPHICS_MAX_MODE];\r
+  GRAPHICS_CONSOLE_MODE_DATA       *ModeData;\r
   EFI_GRAPHICS_OUTPUT_BLT_PIXEL    *LineBuffer;\r
 } GRAPHICS_CONSOLE_DEV;\r
 \r
index 9574390eb0908b76f37800315ac5b55b1f76cf8a..0934f16301fea1f2e5be46a3c449be2f7e705d6a 100644 (file)
@@ -68,6 +68,7 @@ TERMINAL_DEV  mTerminalDevTemplate = {
     0,                                           // CursorRow\r
     TRUE                                         // CursorVisible\r
   },\r
+  NULL, // TerminalConsoleModeData\r
   0,  // SerialInTimeOut\r
 \r
   NULL, // RawFifo\r
@@ -94,6 +95,15 @@ TERMINAL_DEV  mTerminalDevTemplate = {
   }\r
 };\r
 \r
+TERMINAL_CONSOLE_MODE_DATA mTerminalConsoleModeData[] = {\r
+  {100, 31},\r
+  //\r
+  // New modes can be added here.\r
+  // The last entry is specific for PcdConOutRow x PcdConOutColumn.\r
+  //\r
+  {0, 0}\r
+};\r
+\r
 /**\r
   Test to see if this driver supports Controller.\r
 \r
@@ -398,6 +408,109 @@ TerminalFreeNotifyList (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Initialize all the text modes which the terminal console supports.\r
+\r
+  It returns information for available text modes that the terminal can support.\r
+\r
+  @param[out] TextModeCount      The total number of text modes that terminal console supports.\r
+  @param[out] TextModeData       The buffer to the text modes column and row information.\r
+                                 Caller is responsible to free it when it's non-NULL.\r
+\r
+  @retval EFI_SUCCESS            The supporting mode information is returned.\r
+  @retval EFI_INVALID_PARAMETER  The parameters are invalid.\r
+\r
+**/\r
+EFI_STATUS\r
+InitializeTerminalConsoleTextMode (\r
+  OUT UINTN                         *TextModeCount,\r
+  OUT TERMINAL_CONSOLE_MODE_DATA    **TextModeData\r
+  )\r
+{\r
+  UINTN                       Index;\r
+  UINTN                       Count;\r
+  TERMINAL_CONSOLE_MODE_DATA  *ModeBuffer;\r
+  TERMINAL_CONSOLE_MODE_DATA  *NewModeBuffer;\r
+  UINTN                       ValidCount;\r
+  UINTN                       ValidIndex;\r
+  \r
+  if ((TextModeCount == NULL) || (TextModeData == NULL)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  \r
+  //\r
+  // Assign the last entry as PcdConOutColumn and PcdConOutRow defined.\r
+  //\r
+  Count = sizeof (mTerminalConsoleModeData) / sizeof (TERMINAL_CONSOLE_MODE_DATA);\r
+  mTerminalConsoleModeData[Count - 1].Columns = (UINTN) PcdGet32 (PcdConOutColumn);\r
+  mTerminalConsoleModeData[Count - 1].Rows    = (UINTN) PcdGet32 (PcdConOutRow);;\r
+  \r
+  //\r
+  // Get defined mode buffer pointer.\r
+  //\r
+  ModeBuffer = mTerminalConsoleModeData;\r
+    \r
+  //\r
+  // Here we make sure that the final mode exposed does not include the duplicated modes,\r
+  // and does not include the invalid modes which exceed the max column and row.\r
+  // Reserve 2 modes for 80x25, 80x50 of terminal console.\r
+  //\r
+  NewModeBuffer = AllocateZeroPool (sizeof (TERMINAL_CONSOLE_MODE_DATA) * (Count + 2));\r
+  ASSERT (NewModeBuffer != NULL);\r
+\r
+  //\r
+  // Mode 0 and mode 1 is for 80x25, 80x50 according to UEFI spec.\r
+  //\r
+  ValidCount = 0;  \r
+\r
+  NewModeBuffer[ValidCount].Columns = 80;\r
+  NewModeBuffer[ValidCount].Rows    = 25;\r
+  ValidCount++;\r
+\r
+  NewModeBuffer[ValidCount].Columns = 80;\r
+  NewModeBuffer[ValidCount].Rows    = 50;\r
+  ValidCount++;\r
+  \r
+  //\r
+  // Start from mode 2 to put the valid mode other than 80x25 and 80x50 in the output mode buffer.\r
+  //\r
+  for (Index = 0; Index < Count; Index++) {\r
+    if ((ModeBuffer[Index].Columns == 0) || (ModeBuffer[Index].Rows == 0)) {\r
+      //\r
+      // Skip the pre-defined mode which is invalid.\r
+      //\r
+      continue;\r
+    }\r
+    for (ValidIndex = 0; ValidIndex < ValidCount; ValidIndex++) {\r
+      if ((ModeBuffer[Index].Columns == NewModeBuffer[ValidIndex].Columns) &&\r
+          (ModeBuffer[Index].Rows == NewModeBuffer[ValidIndex].Rows)) {\r
+        //\r
+        // Skip the duplicated mode.\r
+        //\r
+        break;\r
+      }\r
+    }\r
+    if (ValidIndex == ValidCount) {\r
+      NewModeBuffer[ValidCount].Columns = ModeBuffer[Index].Columns;\r
+      NewModeBuffer[ValidCount].Rows    = ModeBuffer[Index].Rows;\r
+      ValidCount++;\r
+    }\r
+  }\r
\r
+  DEBUG_CODE (\r
+    for (Index = 0; Index < ValidCount; Index++) {\r
+      DEBUG ((EFI_D_INFO, "Terminal - Mode %d, Column = %d, Row = %d\n", \r
+                           Index, NewModeBuffer[Index].Columns, NewModeBuffer[Index].Rows));  \r
+    }\r
+  );\r
+  \r
+  //\r
+  // Return valid mode count and mode information buffer.\r
+  //\r
+  *TextModeCount = ValidCount;\r
+  *TextModeData  = NewModeBuffer;\r
+  return EFI_SUCCESS;\r
+}\r
 \r
 /**\r
   Start this driver on Controller by opening a Serial IO protocol,\r
@@ -444,6 +557,7 @@ TerminalDriverBindingStart (
   BOOLEAN                             SimTxtInInstalled;\r
   BOOLEAN                             SimTxtOutInstalled;\r
   BOOLEAN                             FirstEnter;\r
+  UINTN                               ModeCount;\r
 \r
   TerminalDevice     = NULL;\r
   DefaultNode        = NULL;\r
@@ -724,8 +838,13 @@ TerminalDriverBindingStart (
                          sizeof (mTerminalDevTemplate.SimpleTextOutput)\r
                          );\r
     SimpleTextOutput->Mode = &TerminalDevice->SimpleTextOutputMode;\r
-\r
-    TerminalDevice->SimpleTextOutputMode.MaxMode = TERMINAL_MAX_MODE;\r
+    \r
+    Status = InitializeTerminalConsoleTextMode (&ModeCount, &TerminalDevice->TerminalConsoleModeData);\r
+    if (EFI_ERROR (Status)) {\r
+      goto ReportError;\r
+    }\r
+    TerminalDevice->SimpleTextOutputMode.MaxMode = (INT32) ModeCount;\r
+    \r
     //\r
     // For terminal devices, cursor is always visible\r
     //\r
@@ -1102,6 +1221,10 @@ Error:
         FreePool (TerminalDevice->DevicePath);\r
       }\r
 \r
+      if (TerminalDevice->TerminalConsoleModeData != NULL) {\r
+        FreePool (TerminalDevice->TerminalConsoleModeData);\r
+      }\r
+\r
       FreePool (TerminalDevice);\r
     }\r
   }\r
@@ -1273,6 +1396,9 @@ TerminalDriverBindingStop (
         gBS->CloseEvent (TerminalDevice->SimpleInputEx.WaitForKeyEx);\r
         TerminalFreeNotifyList (&TerminalDevice->NotifyList);\r
         FreePool (TerminalDevice->DevicePath);\r
+        if (TerminalDevice->TerminalConsoleModeData != NULL) {\r
+          FreePool (TerminalDevice->TerminalConsoleModeData);\r
+        }\r
         FreePool (TerminalDevice);\r
       }\r
     }\r
index fe4ce90bbb2472fb2d28ed4b104d139b38d64393..9387998e01d6428b00addec8c033b96d43c09616 100644 (file)
@@ -61,6 +61,11 @@ typedef struct {
   EFI_INPUT_KEY Data[FIFO_MAX_NUMBER + 1];\r
 } EFI_KEY_FIFO;\r
 \r
+typedef struct {\r
+  UINTN   Columns;\r
+  UINTN   Rows;\r
+} TERMINAL_CONSOLE_MODE_DATA;\r
+\r
 #define KEYBOARD_TIMER_INTERVAL         200000  // 0.02s\r
 \r
 #define TERMINAL_DEV_SIGNATURE  SIGNATURE_32 ('t', 'm', 'n', 'l')\r
@@ -83,6 +88,7 @@ typedef struct {
   EFI_SIMPLE_TEXT_INPUT_PROTOCOL      SimpleInput;\r
   EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL     SimpleTextOutput;\r
   EFI_SIMPLE_TEXT_OUTPUT_MODE         SimpleTextOutputMode;\r
+  TERMINAL_CONSOLE_MODE_DATA          *TerminalConsoleModeData;\r
   UINTN                               SerialInTimeOut;\r
   RAW_DATA_FIFO                       *RawFiFo;\r
   UNICODE_FIFO                        *UnicodeFiFo;\r
@@ -137,21 +143,6 @@ typedef union {
 #define CCAP                      0x43\r
 #define DCAP                      0x44\r
 \r
-#define MODE0_COLUMN_COUNT        80\r
-#define MODE0_ROW_COUNT           25\r
-\r
-#define MODE1_COLUMN_COUNT        80\r
-#define MODE1_ROW_COUNT           50\r
-\r
-#define MODE2_COLUMN_COUNT        100\r
-#define MODE2_ROW_COUNT           31\r
-\r
-//\r
-// MODE3 is defined by PcdConOutColumn & PcdConOutRow\r
-//\r
-\r
-#define TERMINAL_MAX_MODE 4\r
-\r
 #define BACKSPACE                 8\r
 #define ESC                       27\r
 #define CSI                       0x9B\r
index 8f2675228ff7f3350c4c5681ed2cff4bff764723..affb3ae8e1d5a324d4a12b16bb083c4162a70905 100644 (file)
@@ -205,7 +205,7 @@ TerminalConOutOutputString (
   //\r
   Mode = This->Mode;\r
 \r
-  if (Mode->Mode >= TERMINAL_MAX_MODE) {\r
+  if (Mode->Mode >= Mode->MaxMode) {\r
     return EFI_UNSUPPORTED;\r
   }\r
 \r
@@ -392,8 +392,6 @@ TerminalConOutTestString (
 \r
   It returns information for an available text mode\r
   that the terminal supports.\r
-  In this driver, we support text mode 80x25 (mode 0),\r
-  80x50 (mode 1), 100x31 (mode 2).\r
 \r
   @param This        Indicates the calling context.\r
   @param ModeNumber  The mode number to return information on.\r
@@ -402,7 +400,6 @@ TerminalConOutTestString (
 \r
   @retval EFI_SUCCESS       The requested mode information is returned.\r
   @retval EFI_UNSUPPORTED   The mode number is not valid.\r
-  @retval EFI_DEVICE_ERROR\r
 \r
 **/\r
 EFI_STATUS\r
@@ -414,35 +411,20 @@ TerminalConOutQueryMode (
   OUT UINTN                            *Rows\r
   )\r
 {\r
-  if (This->Mode->MaxMode > TERMINAL_MAX_MODE) {\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
+  TERMINAL_DEV  *TerminalDevice;\r
 \r
-  if (ModeNumber == 0) {\r
-    *Columns  = MODE0_COLUMN_COUNT;\r
-    *Rows     = MODE0_ROW_COUNT;\r
-    return EFI_SUCCESS;\r
-  } else if (ModeNumber == 1) {\r
-    *Columns  = MODE1_COLUMN_COUNT;\r
-    *Rows     = MODE1_ROW_COUNT;\r
-    return EFI_SUCCESS;\r
-  } else if (ModeNumber == 2) {\r
-    *Columns  = MODE2_COLUMN_COUNT;\r
-    *Rows     = MODE2_ROW_COUNT;\r
-    return EFI_SUCCESS;\r
-  } else if (ModeNumber == 3) {\r
-    *Columns  = (UINTN) PcdGet32 (PcdConOutColumn);\r
-    if (*Columns == 0) {\r
-      *Columns = MODE0_COLUMN_COUNT;\r
-    }\r
-    *Rows  = (UINTN) PcdGet32 (PcdConOutRow);\r
-    if (*Rows == 0) {\r
-      *Rows     = MODE0_ROW_COUNT;\r
-    }\r
-    return EFI_SUCCESS;\r
+  if (ModeNumber >= (UINTN) This->Mode->MaxMode) {\r
+    return EFI_UNSUPPORTED;\r
   }\r
 \r
-  return EFI_UNSUPPORTED;\r
+  //\r
+  // Get Terminal device data structure pointer.\r
+  //\r
+  TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This);  \r
+  *Columns = TerminalDevice->TerminalConsoleModeData[ModeNumber].Columns;\r
+  *Rows    = TerminalDevice->TerminalConsoleModeData[ModeNumber].Rows;\r
+\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 \r
@@ -476,7 +458,7 @@ TerminalConOutSetMode (
   //\r
   TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This);\r
 \r
-  if (ModeNumber >= TERMINAL_MAX_MODE) {\r
+  if (ModeNumber >= (UINTN) This->Mode->MaxMode) {\r
     return EFI_UNSUPPORTED;\r
   }\r
 \r