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
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
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
}\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
FreePool (Private->LineBuffer);\r
}\r
\r
+ if (Private->ModeData != NULL) {\r
+ FreePool (Private->ModeData);\r
+ }\r
+\r
//\r
// Free private data\r
//\r
FreePool (Private->LineBuffer);\r
}\r
\r
+ if (Private->ModeData != NULL) {\r
+ FreePool (Private->ModeData);\r
+ }\r
+\r
//\r
// Free our instance data\r
//\r
*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
0, // CursorRow\r
TRUE // CursorVisible\r
},\r
+ NULL, // TerminalConsoleModeData\r
0, // SerialInTimeOut\r
\r
NULL, // RawFifo\r
}\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
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
BOOLEAN SimTxtInInstalled;\r
BOOLEAN SimTxtOutInstalled;\r
BOOLEAN FirstEnter;\r
+ UINTN ModeCount;\r
\r
TerminalDevice = NULL;\r
DefaultNode = NULL;\r
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
FreePool (TerminalDevice->DevicePath);\r
}\r
\r
+ if (TerminalDevice->TerminalConsoleModeData != NULL) {\r
+ FreePool (TerminalDevice->TerminalConsoleModeData);\r
+ }\r
+\r
FreePool (TerminalDevice);\r
}\r
}\r
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
//\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
\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
\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
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
//\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