Mode = 0;\r
Index = 0;\r
while (Mode < MaxMode) {\r
- TextOut->QueryMode (\r
- TextOut,\r
- Mode,\r
- &Private->TextOutQueryData[Mode].Columns,\r
- &Private->TextOutQueryData[Mode].Rows\r
- );\r
+ Status = TextOut->QueryMode (\r
+ TextOut,\r
+ Mode,\r
+ &Private->TextOutQueryData[Mode].Columns,\r
+ &Private->TextOutQueryData[Mode].Rows\r
+ );\r
+ //\r
+ // If mode 1 (80x50) is not supported, make sure mode 1 in TextOutQueryData\r
+ // is clear to 0x0.\r
+ //\r
+ if ((EFI_ERROR(Status)) && (Mode == 1)) {\r
+ Private->TextOutQueryData[Mode].Columns = 0;\r
+ Private->TextOutQueryData[Mode].Rows = 0;\r
+ }\r
Private->TextOutModeMap[Index] = Mode;\r
Mode++;\r
Index += Private->TextOutListCount;\r
return EFI_SUCCESS;\r
}\r
\r
+/**\r
+ Reconstruct TextOutModeMap to get intersection of modes\r
+\r
+ This routine reconstruct TextOutModeMap to get the intersection\r
+ of modes for all console out devices. Because EFI/UEFI spec require\r
+ mode 0 is 80x25, mode 1 is 80x50, this routine will not check the\r
+ intersection for mode 0 and mode 1.\r
+\r
+ @parm TextOutModeMap Current text out mode map, begin with the mode 80x25\r
+ @parm NewlyAddedMap New text out mode map, begin with the mode 80x25\r
+ @parm MapStepSize Mode step size for one console device\r
+ @parm NewMapStepSize Mode step size for one console device\r
+ @parm MaxMode Current max text mode\r
+ @parm CurrentMode Current text mode\r
+\r
+ @retval None\r
+\r
+**/\r
STATIC\r
VOID\r
ConSplitterGetIntersection (\r
INT32 CurrentMaxMode;\r
INT32 Mode;\r
\r
- Index = 0;\r
- CurrentMapEntry = TextOutModeMap;\r
- NextMapEntry = TextOutModeMap;\r
+ //\r
+ // According to EFI/UEFI spec, mode 0 and mode 1 have been reserved\r
+ // for 80x25 and 80x50 in Simple Text Out protocol, so don't make intersection\r
+ // for mode 0 and mode 1, mode number starts from 2.\r
+ //\r
+ Index = 2;\r
+ CurrentMapEntry = &TextOutModeMap[MapStepSize * 2];\r
+ NextMapEntry = &TextOutModeMap[MapStepSize * 2];\r
+ NewlyAddedMap = &NewlyAddedMap[NewMapStepSize * 2];\r
+\r
CurrentMaxMode = *MaxMode;\r
Mode = *CurrentMode;\r
\r
UINTN Rows;\r
UINTN Columns;\r
UINTN StepSize;\r
+ EFI_STATUS Status;\r
\r
//\r
// Must make sure that current mode won't change even if mode number changes\r
Mode = 0;\r
MapTable = TextOutModeMap + Private->CurrentNumberOfConsoles;\r
while (Mode < TextOut->Mode->MaxMode) {\r
- TextOut->QueryMode (TextOut, Mode, &Columns, &Rows);\r
+ Status = TextOut->QueryMode (TextOut, Mode, &Columns, &Rows);\r
+ if (EFI_ERROR(Status)) {\r
+ if (Mode == 1) {\r
MapTable[StepSize] = Mode;\r
-\r
+ TextOutQueryData[Mode].Columns = 0;\r
+ TextOutQueryData[Mode].Rows = 0;\r
+ }\r
+ Mode++;\r
+ continue;\r
+ }\r
//\r
// Search the intersection map and QueryData database to see if they intersects\r
//\r
GRAPHICS_CONSOLE_DEV *Private;\r
EFI_STATUS Status;\r
EFI_TPL OldTpl;\r
-\r
+ \r
if (ModeNumber >= (UINTN) This->Mode->MaxMode) {\r
return EFI_UNSUPPORTED;\r
}\r
goto Done;\r
}\r
//\r
- // Otherwise, the size of the text console and/or the UGA mode will be changed,\r
- // so turn off the cursor, and free the LineBuffer for the current mode\r
+ // Otherwise, the size of the text console and/or the GOP/UGA mode will be changed,\r
+ // so erase the cursor, and free the LineBuffer for the current mode\r
//\r
- This->EnableCursor (This, FALSE);\r
+ EraseCursor (This);\r
\r
FreePool (Private->LineBuffer);\r
}\r
// Move the text cursor to the upper left hand corner of the displat and enable it\r
//\r
This->SetCursorPosition (This, 0, 0);\r
- This->EnableCursor (This, TRUE);\r
\r
Status = EFI_SUCCESS;\r
\r
//\r
Mode = This->Mode;\r
\r
- if (Mode->Mode > 1) {\r
+ if (Mode->Mode > 2) {\r
return EFI_UNSUPPORTED;\r
}\r
\r
/*++\r
Routine Description:\r
\r
- Implements EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL.QueryMode().\r
+ Implements EFI_SIMPLE_TEXT_OUT_PROTOCOL.QueryMode().\r
It returns information for an available text mode\r
that the terminal supports.\r
- In this driver, we only support text mode 80x25, which is\r
- defined as mode 0.\r
+ In this driver, we support text mode 80x25 (mode 0),\r
+ 80x50 (mode 1), 100x31 (mode 2).\r
\r
\r
Arguments:\r
\r
--*/\r
{\r
- if (This->Mode->MaxMode > 2) {\r
+ if (This->Mode->MaxMode > 3) {\r
return EFI_DEVICE_ERROR;\r
}\r
\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
}\r
\r
return EFI_UNSUPPORTED;\r
//\r
TerminalDevice = TERMINAL_CON_OUT_DEV_FROM_THIS (This);\r
\r
- if (ModeNumber > 1) {\r
+ if (ModeNumber > 2) {\r
return EFI_UNSUPPORTED;\r
}\r
\r