X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=EdkModulePkg%2FUniversal%2FConsole%2FConSplitter%2FDxe%2FConSplitter.c;h=fc2903eaa068b0dcf51d208fd7f4c5384288548b;hb=406adcd15cafe2f1f6cff0750ef9bfd8c613013a;hp=a9d39e945eb31205798294b3523d3c0ee6e3c2c7;hpb=d02920ead2934c94ad3603bdce18d699af027a9f;p=mirror_edk2.git diff --git a/EdkModulePkg/Universal/Console/ConSplitter/Dxe/ConSplitter.c b/EdkModulePkg/Universal/Console/ConSplitter/Dxe/ConSplitter.c index a9d39e945e..fc2903eaa0 100644 --- a/EdkModulePkg/Universal/Console/ConSplitter/Dxe/ConSplitter.c +++ b/EdkModulePkg/Universal/Console/ConSplitter/Dxe/ConSplitter.c @@ -39,7 +39,7 @@ Abstract: // // Global Variables // -static TEXT_IN_SPLITTER_PRIVATE_DATA mConIn = { +STATIC TEXT_IN_SPLITTER_PRIVATE_DATA mConIn = { TEXT_IN_SPLITTER_PRIVATE_DATA_SIGNATURE, (EFI_HANDLE) NULL, { @@ -88,7 +88,7 @@ static TEXT_IN_SPLITTER_PRIVATE_DATA mConIn = { FALSE }; -static TEXT_OUT_SPLITTER_PRIVATE_DATA mConOut = { +STATIC TEXT_OUT_SPLITTER_PRIVATE_DATA mConOut = { TEXT_OUT_SPLITTER_PRIVATE_DATA_SIGNATURE, (EFI_HANDLE) NULL, { @@ -111,6 +111,7 @@ static TEXT_OUT_SPLITTER_PRIVATE_DATA mConOut = { 0, FALSE, }, +#if (EFI_SPECIFICATION_VERSION < 0x00020000) { ConSpliterUgaDrawGetMode, ConSpliterUgaDrawSetMode, @@ -121,7 +122,18 @@ static TEXT_OUT_SPLITTER_PRIVATE_DATA mConOut = { 0, 0, (EFI_UGA_PIXEL *) NULL, - +#else + { + ConSpliterGraphicsOutputQueryMode, + ConSpliterGraphicsOutputSetMode, + ConSpliterGraphicsOutputBlt, + NULL + }, + (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) NULL, + (TEXT_OUT_GOP_MODE *) NULL, + 0, + TRUE, +#endif { ConSpliterConsoleControlGetMode, ConSpliterConsoleControlSetMode, @@ -129,7 +141,7 @@ static TEXT_OUT_SPLITTER_PRIVATE_DATA mConOut = { }, 0, - (TEXT_OUT_AND_UGA_DATA *) NULL, + (TEXT_OUT_AND_GOP_DATA *) NULL, 0, (TEXT_OUT_SPLITTER_QUERY_DATA *) NULL, 0, @@ -142,7 +154,7 @@ static TEXT_OUT_SPLITTER_PRIVATE_DATA mConOut = { (INT32 *) NULL }; -static TEXT_OUT_SPLITTER_PRIVATE_DATA mStdErr = { +STATIC TEXT_OUT_SPLITTER_PRIVATE_DATA mStdErr = { TEXT_OUT_SPLITTER_PRIVATE_DATA_SIGNATURE, (EFI_HANDLE) NULL, { @@ -165,6 +177,7 @@ static TEXT_OUT_SPLITTER_PRIVATE_DATA mStdErr = { 0, FALSE, }, +#if (EFI_SPECIFICATION_VERSION < 0x00020000) { ConSpliterUgaDrawGetMode, ConSpliterUgaDrawSetMode, @@ -175,7 +188,18 @@ static TEXT_OUT_SPLITTER_PRIVATE_DATA mStdErr = { 0, 0, (EFI_UGA_PIXEL *) NULL, - +#else + { + ConSpliterGraphicsOutputQueryMode, + ConSpliterGraphicsOutputSetMode, + ConSpliterGraphicsOutputBlt, + NULL + }, + (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) NULL, + (TEXT_OUT_GOP_MODE *) NULL, + 0, + TRUE, +#endif { ConSpliterConsoleControlGetMode, ConSpliterConsoleControlSetMode, @@ -183,7 +207,7 @@ static TEXT_OUT_SPLITTER_PRIVATE_DATA mStdErr = { }, 0, - (TEXT_OUT_AND_UGA_DATA *) NULL, + (TEXT_OUT_AND_GOP_DATA *) NULL, 0, (TEXT_OUT_SPLITTER_QUERY_DATA *) NULL, 0, @@ -301,6 +325,10 @@ Returns: // Status = ConSplitterTextOutConstructor (&mConOut); if (!EFI_ERROR (Status)) { +#if (EFI_SPECIFICATION_VERSION < 0x00020000) + // + // In EFI mode, UGA Draw protocol is installed + // Status = gBS->InstallMultipleProtocolInterfaces ( &mConOut.VirtualHandle, &gEfiSimpleTextOutProtocolGuid, @@ -313,6 +341,24 @@ Returns: NULL, NULL ); +#else + // + // In UEFI mode, Graphics Output Protocol is installed on virtual handle. + // + Status = gBS->InstallMultipleProtocolInterfaces ( + &mConOut.VirtualHandle, + &gEfiSimpleTextOutProtocolGuid, + &mConOut.TextOut, + &gEfiGraphicsOutputProtocolGuid, + &mConOut.GraphicsOutput, + &gEfiConsoleControlProtocolGuid, + &mConOut.ConsoleControl, + &gEfiPrimaryConsoleOutDeviceGuid, + NULL, + NULL + ); +#endif + if (!EFI_ERROR (Status)) { // // Update the EFI System Table with new virtual console @@ -335,7 +381,7 @@ Returns: return EFI_SUCCESS; } - +STATIC EFI_STATUS ConSplitterTextInConstructor ( TEXT_IN_SPLITTER_PRIVATE_DATA *ConInPrivate @@ -411,7 +457,7 @@ Returns: return Status; } - +STATIC EFI_STATUS ConSplitterTextOutConstructor ( TEXT_OUT_SPLITTER_PRIVATE_DATA *ConOutPrivate @@ -425,7 +471,7 @@ ConSplitterTextOutConstructor ( ConOutPrivate->TextOut.Mode = &ConOutPrivate->TextOutMode; Status = ConSplitterGrowBuffer ( - sizeof (TEXT_OUT_AND_UGA_DATA), + sizeof (TEXT_OUT_AND_GOP_DATA), &ConOutPrivate->TextOutListCount, (VOID **) &ConOutPrivate->TextOutList ); @@ -448,15 +494,53 @@ ConSplitterTextOutConstructor ( ConOutPrivate->TextOutQueryData[0].Rows = 25; DevNullTextOutSetMode (ConOutPrivate, 0); +#if (EFI_SPECIFICATION_VERSION < 0x00020000) // // Setup the DevNullUgaDraw to 800 x 600 x 32 bits per pixel // ConSpliterUgaDrawSetMode (&ConOutPrivate->UgaDraw, 800, 600, 32, 60); +#else + // + // Setup resource for mode information in Graphics Output Protocol interface + // + if ((ConOutPrivate->GraphicsOutput.Mode = AllocateZeroPool (sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE))) == NULL) { + return EFI_OUT_OF_RESOURCES; + } + if ((ConOutPrivate->GraphicsOutput.Mode->Info = AllocateZeroPool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION))) == NULL) { + return EFI_OUT_OF_RESOURCES; + } + // + // Setup the DevNullGraphicsOutput to 800 x 600 x 32 bits per pixel + // + if ((ConOutPrivate->GraphicsOutputModeBuffer = AllocateZeroPool (sizeof (TEXT_OUT_GOP_MODE))) == NULL) { + return EFI_OUT_OF_RESOURCES; + } + ConOutPrivate->GraphicsOutputModeBuffer[0].HorizontalResolution = 800; + ConOutPrivate->GraphicsOutputModeBuffer[0].VerticalResolution = 600; + + // + // Initialize the following items, theset items remain unchanged in GraphicsOutput->SetMode() + // GraphicsOutputMode->Info->Version, GraphicsOutputMode->Info->PixelFormat + // GraphicsOutputMode->SizeOfInfo, GraphicsOutputMode->FrameBufferBase, GraphicsOutputMode->FrameBufferSize + // + ConOutPrivate->GraphicsOutput.Mode->Info->Version = 0; + ConOutPrivate->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly; + ConOutPrivate->GraphicsOutput.Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); + ConOutPrivate->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) NULL; + ConOutPrivate->GraphicsOutput.Mode->FrameBufferSize = 0; + + ConOutPrivate->GraphicsOutput.Mode->MaxMode = 1; + // + // Initial current mode to unknow state, and then set to mode 0 + // + ConOutPrivate->GraphicsOutput.Mode->Mode = 0xffff; + ConOutPrivate->GraphicsOutput.SetMode (&ConOutPrivate->GraphicsOutput, 0); +#endif return Status; } - +STATIC EFI_STATUS ConSplitterSupported ( IN EFI_DRIVER_BINDING_PROTOCOL *This, @@ -523,7 +607,7 @@ Returns: return EFI_SUCCESS; } - +STATIC EFI_STATUS EFIAPI ConSplitterConInDriverBindingSupported ( @@ -554,7 +638,7 @@ Returns: ); } - +STATIC EFI_STATUS EFIAPI ConSplitterSimplePointerDriverBindingSupported ( @@ -585,7 +669,7 @@ Returns: ); } - +STATIC EFI_STATUS EFIAPI ConSplitterConOutDriverBindingSupported ( @@ -616,7 +700,7 @@ Returns: ); } - +STATIC EFI_STATUS EFIAPI ConSplitterStdErrDriverBindingSupported ( @@ -647,7 +731,7 @@ Returns: ); } - +STATIC EFI_STATUS EFIAPI ConSplitterStart ( @@ -712,7 +796,7 @@ Returns: ); } - +STATIC EFI_STATUS EFIAPI ConSplitterConInDriverBindingStart ( @@ -760,7 +844,7 @@ Returns: return ConSplitterTextInAddDevice (&mConIn, TextIn); } - +STATIC EFI_STATUS EFIAPI ConSplitterSimplePointerDriverBindingStart ( @@ -803,7 +887,7 @@ Returns: return ConSplitterSimplePointerAddDevice (&mConIn, SimplePointer); } - +STATIC EFI_STATUS EFIAPI ConSplitterConOutDriverBindingStart ( @@ -829,6 +913,7 @@ Returns: { EFI_STATUS Status; EFI_SIMPLE_TEXT_OUT_PROTOCOL *TextOut; + EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; EFI_UGA_DRAW_PROTOCOL *UgaDraw; Status = ConSplitterStart ( @@ -843,6 +928,20 @@ Returns: return Status; } // + // Try to Open Graphics Output protocol + // + Status = gBS->OpenProtocol ( + ControllerHandle, + &gEfiGraphicsOutputProtocolGuid, + &GraphicsOutput, + This->DriverBindingHandle, + mConOut.VirtualHandle, + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + if (EFI_ERROR (Status)) { + GraphicsOutput = NULL; + } + // // Open UGA_DRAW protocol // Status = gBS->OpenProtocol ( @@ -860,12 +959,14 @@ Returns: // If both ConOut and StdErr incorporate the same Text Out device, // their MaxMode and QueryData should be the intersection of both. // - Status = ConSplitterTextOutAddDevice (&mConOut, TextOut, UgaDraw); + Status = ConSplitterTextOutAddDevice (&mConOut, TextOut, GraphicsOutput, UgaDraw); ConSplitterTextOutSetAttribute (&mConOut.TextOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK)); + +#if (EFI_SPECIFICATION_VERSION < 0x00020000) // // Match the UGA mode data of ConOut with the current mode // - if (UgaDraw) { + if (UgaDraw != NULL) { UgaDraw->GetMode ( UgaDraw, &mConOut.UgaHorizontalResolution, @@ -873,11 +974,13 @@ Returns: &mConOut.UgaColorDepth, &mConOut.UgaRefreshRate ); - } + } +#endif + return Status; } - +STATIC EFI_STATUS EFIAPI ConSplitterStdErrDriverBindingStart ( @@ -919,7 +1022,7 @@ Returns: // If both ConOut and StdErr incorporate the same Text Out device, // their MaxMode and QueryData should be the intersection of both. // - Status = ConSplitterTextOutAddDevice (&mStdErr, TextOut, NULL); + Status = ConSplitterTextOutAddDevice (&mStdErr, TextOut, NULL, NULL); ConSplitterTextOutSetAttribute (&mStdErr.TextOut, EFI_TEXT_ATTR (EFI_MAGENTA, EFI_BLACK)); if (EFI_ERROR (Status)) { return Status; @@ -942,7 +1045,7 @@ Returns: return Status; } - +STATIC EFI_STATUS EFIAPI ConSplitterStop ( @@ -998,7 +1101,7 @@ Returns: return EFI_SUCCESS; } - +STATIC EFI_STATUS EFIAPI ConSplitterConInDriverBindingStop ( @@ -1044,7 +1147,7 @@ Returns: return ConSplitterTextInDeleteDevice (&mConIn, TextIn); } - +STATIC EFI_STATUS EFIAPI ConSplitterSimplePointerDriverBindingStop ( @@ -1090,7 +1193,7 @@ Returns: return ConSplitterSimplePointerDeleteDevice (&mConIn, SimplePointer); } - +STATIC EFI_STATUS EFIAPI ConSplitterConOutDriverBindingStop ( @@ -1114,7 +1217,6 @@ Returns: { EFI_STATUS Status; EFI_SIMPLE_TEXT_OUT_PROTOCOL *TextOut; - EFI_UGA_DRAW_PROTOCOL *UgaDraw; if (NumberOfChildren == 0) { return EFI_SUCCESS; @@ -1131,17 +1233,6 @@ Returns: if (EFI_ERROR (Status)) { return Status; } - // - // Remove any UGA devices - // - Status = gBS->OpenProtocol ( - ControllerHandle, - &gEfiUgaDrawProtocolGuid, - (VOID **) &UgaDraw, - This->DriverBindingHandle, - mConOut.VirtualHandle, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); // // Delete this console output device's data structures. @@ -1149,7 +1240,7 @@ Returns: return ConSplitterTextOutDeleteDevice (&mConOut, TextOut); } - +STATIC EFI_STATUS EFIAPI ConSplitterStdErrDriverBindingStop ( @@ -1717,13 +1808,14 @@ Arguments: Returns: None + EFI_OUT_OF_RESOURCES --*/ { UINTN ConOutNumOfConsoles; UINTN StdErrNumOfConsoles; - TEXT_OUT_AND_UGA_DATA *ConOutTextOutList; - TEXT_OUT_AND_UGA_DATA *StdErrTextOutList; + TEXT_OUT_AND_GOP_DATA *ConOutTextOutList; + TEXT_OUT_AND_GOP_DATA *StdErrTextOutList; UINTN Indexi; UINTN Indexj; UINTN Rows; @@ -1864,10 +1956,198 @@ Returns: return EFI_SUCCESS; } +#if (EFI_SPECIFICATION_VERSION >= 0x00020000) +EFI_STATUS +ConSplitterAddGraphicsOutputMode ( + IN TEXT_OUT_SPLITTER_PRIVATE_DATA *Private, + IN EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput, + IN EFI_UGA_DRAW_PROTOCOL *UgaDraw + ) +/*++ + +Routine Description: + +Arguments: + +Returns: + + None + +--*/ +{ + EFI_STATUS Status; + UINTN Index; + TEXT_OUT_GOP_MODE *Mode; + UINTN SizeOfInfo; + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; + EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *CurrentGraphicsOutputMode; + TEXT_OUT_GOP_MODE *ModeBuffer; + TEXT_OUT_GOP_MODE *MatchedMode; + UINTN NumberIndex; + BOOLEAN Match; + + if ((GraphicsOutput == NULL) && (UgaDraw == NULL)) { + return EFI_UNSUPPORTED; + } + + CurrentGraphicsOutputMode = Private->GraphicsOutput.Mode; + + if (GraphicsOutput != NULL) { + if (Private->CurrentNumberOfGraphicsOutput == 0) { + // + // This is the first Graphics Output device added + // + CurrentGraphicsOutputMode->MaxMode = GraphicsOutput->Mode->MaxMode; + CurrentGraphicsOutputMode->Mode = GraphicsOutput->Mode->Mode; + CopyMem (CurrentGraphicsOutputMode->Info, GraphicsOutput->Mode->Info, GraphicsOutput->Mode->SizeOfInfo); + CurrentGraphicsOutputMode->SizeOfInfo = GraphicsOutput->Mode->SizeOfInfo; + CurrentGraphicsOutputMode->FrameBufferBase = GraphicsOutput->Mode->FrameBufferBase; + CurrentGraphicsOutputMode->FrameBufferSize = GraphicsOutput->Mode->FrameBufferSize; + + // + // Allocate resource for the private mode buffer + // + ModeBuffer = AllocatePool (sizeof (TEXT_OUT_GOP_MODE) * GraphicsOutput->Mode->MaxMode); + if (ModeBuffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + gBS->FreePool (Private->GraphicsOutputModeBuffer); + Private->GraphicsOutputModeBuffer = ModeBuffer; + + // + // Store all supported display modes to the private mode buffer + // + Mode = ModeBuffer; + for (Index = 0; Index < GraphicsOutput->Mode->MaxMode; Index++) { + Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32) Index, &SizeOfInfo, &Info); + if (EFI_ERROR (Status)) { + return Status; + } + Mode->HorizontalResolution = Info->HorizontalResolution; + Mode->VerticalResolution = Info->VerticalResolution; + Mode++; + gBS->FreePool (Info); + } + } else { + // + // Check intersection of display mode + // + ModeBuffer = AllocatePool (sizeof (TEXT_OUT_GOP_MODE) * CurrentGraphicsOutputMode->MaxMode); + if (ModeBuffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + MatchedMode = ModeBuffer; + Mode = &Private->GraphicsOutputModeBuffer[0]; + for (Index = 0; Index < CurrentGraphicsOutputMode->MaxMode; Index++) { + Match = FALSE; + + for (NumberIndex = 0; NumberIndex < GraphicsOutput->Mode->MaxMode; NumberIndex++) { + Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32) NumberIndex, &SizeOfInfo, &Info); + if (EFI_ERROR (Status)) { + return Status; + } + if ((Info->HorizontalResolution == Mode->HorizontalResolution) && + (Info->VerticalResolution == Mode->VerticalResolution)){ + Match = TRUE; + gBS->FreePool (Info); + break; + } + gBS->FreePool (Info); + } + + if (Match) { + CopyMem (MatchedMode, Mode, sizeof (TEXT_OUT_GOP_MODE)); + MatchedMode++; + } + + Mode++; + } + + // + // Drop the old mode buffer, assign it to a new one + // + gBS->FreePool (Private->GraphicsOutputModeBuffer); + Private->GraphicsOutputModeBuffer = ModeBuffer; + + // + // Physical frame buffer is no longer available when there are more than one physical GOP devices + // + CurrentGraphicsOutputMode->MaxMode = (UINT32) (((UINTN) MatchedMode - (UINTN) ModeBuffer) / sizeof (TEXT_OUT_GOP_MODE)); + CurrentGraphicsOutputMode->Info->PixelFormat = PixelBltOnly; + ZeroMem (&CurrentGraphicsOutputMode->Info->PixelInformation, sizeof (EFI_PIXEL_BITMASK)); + CurrentGraphicsOutputMode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); + CurrentGraphicsOutputMode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) NULL; + CurrentGraphicsOutputMode->FrameBufferSize = 0; + } + + // + // Select a prefered Display mode 800x600 + // + for (Index = 0; Index < CurrentGraphicsOutputMode->MaxMode; Index++) { + Mode = &Private->GraphicsOutputModeBuffer[Index]; + if ((Mode->HorizontalResolution == 800) && (Mode->VerticalResolution == 600)) { + break; + } + } + // + // Prefered mode is not found, set to mode 0 + // + if (Index >= CurrentGraphicsOutputMode->MaxMode) { + Index = 0; + } + + // + // Current mode number may need update now, so set it to an invalide mode number + // + CurrentGraphicsOutputMode->Mode = 0xffff; + } else { + // + // For UGA device, it's inconvenient to retrieve all the supported display modes. + // To simplify the implementation, only add one resolution(800x600, 32bit color depth) as defined in UEFI spec + // + CurrentGraphicsOutputMode->MaxMode = 1; + CurrentGraphicsOutputMode->Info->Version = 0; + CurrentGraphicsOutputMode->Info->HorizontalResolution = 800; + CurrentGraphicsOutputMode->Info->VerticalResolution = 600; + CurrentGraphicsOutputMode->Info->PixelFormat = PixelBltOnly; + CurrentGraphicsOutputMode->Info->PixelsPerScanLine = 800; + CurrentGraphicsOutputMode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); + CurrentGraphicsOutputMode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) NULL; + CurrentGraphicsOutputMode->FrameBufferSize = 0; + + // + // Update the private mode buffer + // + ModeBuffer = &Private->GraphicsOutputModeBuffer[0]; + ModeBuffer->HorizontalResolution = 800; + ModeBuffer->VerticalResolution = 600; + + // + // Current mode is unknow now, set it to an invalid mode number 0xffff + // + CurrentGraphicsOutputMode->Mode = 0xffff; + Index = 0; + } + + // + // Force GraphicsOutput mode to be set, + // regardless whether the console is in EfiConsoleControlScreenGraphics or EfiConsoleControlScreenText mode + // + Private->HardwareNeedsStarting = TRUE; + Status = Private->GraphicsOutput.SetMode (&Private->GraphicsOutput, (UINT32) Index); + + Private->CurrentNumberOfGraphicsOutput++; + + return Status; +} +#endif + EFI_STATUS ConSplitterTextOutAddDevice ( IN TEXT_OUT_SPLITTER_PRIVATE_DATA *Private, IN EFI_SIMPLE_TEXT_OUT_PROTOCOL *TextOut, + IN EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput, IN EFI_UGA_DRAW_PROTOCOL *UgaDraw ) /*++ @@ -1886,7 +2166,7 @@ Returns: UINTN CurrentNumOfConsoles; INT32 CurrentMode; INT32 MaxMode; - TEXT_OUT_AND_UGA_DATA *TextAndUga; + TEXT_OUT_AND_GOP_DATA *TextAndGop; Status = EFI_SUCCESS; CurrentNumOfConsoles = Private->CurrentNumberOfConsoles; @@ -1896,7 +2176,7 @@ Returns: // while (CurrentNumOfConsoles >= Private->TextOutListCount) { Status = ConSplitterGrowBuffer ( - sizeof (TEXT_OUT_AND_UGA_DATA), + sizeof (TEXT_OUT_AND_GOP_DATA), &Private->TextOutListCount, (VOID **) &Private->TextOutList ); @@ -1912,20 +2192,22 @@ Returns: } } - TextAndUga = &Private->TextOutList[CurrentNumOfConsoles]; + TextAndGop = &Private->TextOutList[CurrentNumOfConsoles]; + + TextAndGop->TextOut = TextOut; + TextAndGop->GraphicsOutput = GraphicsOutput; + TextAndGop->UgaDraw = UgaDraw; - TextAndUga->TextOut = TextOut; - TextAndUga->UgaDraw = UgaDraw; - if (UgaDraw == NULL) { + if ((GraphicsOutput == NULL) && (UgaDraw == NULL)) { // // If No UGA device then use the ConOut device // - TextAndUga->TextOutEnabled = TRUE; + TextAndGop->TextOutEnabled = TRUE; } else { // // If UGA device use ConOut device only used if UGA screen is in Text mode // - TextAndUga->TextOutEnabled = (BOOLEAN) (Private->UgaMode == EfiConsoleControlScreenText); + TextAndGop->TextOutEnabled = (BOOLEAN) (Private->ConsoleOutputMode == EfiConsoleControlScreenText); } if (CurrentNumOfConsoles == 0) { @@ -1950,17 +2232,26 @@ Returns: MaxMode = Private->TextOutMode.MaxMode; ASSERT (MaxMode >= 1); - if (Private->UgaMode == EfiConsoleControlScreenGraphics && UgaDraw != NULL) { +#if (EFI_SPECIFICATION_VERSION >= 0x00020000) + if ((GraphicsOutput != NULL) || (UgaDraw != NULL)) { + ConSplitterAddGraphicsOutputMode (Private, GraphicsOutput, UgaDraw); + } +#endif + + if (Private->ConsoleOutputMode == EfiConsoleControlScreenGraphics && GraphicsOutput != NULL) { // // We just added a new UGA device in graphics mode // +#if (EFI_SPECIFICATION_VERSION >= 0x00020000) + DevNullGopSync (Private, GraphicsOutput, UgaDraw); +#else DevNullUgaSync (Private, UgaDraw); - - } else if ((CurrentMode >= 0) && (UgaDraw != NULL) && (CurrentMode < Private->TextOutMode.MaxMode)) { +#endif + } else if ((CurrentMode >= 0) && ((GraphicsOutput != NULL) || (UgaDraw != NULL)) && (CurrentMode < Private->TextOutMode.MaxMode)) { // // The new console supports the same mode of the current console so sync up // - DevNullSyncUgaStdOut (Private); + DevNullSyncGopStdOut (Private); } else { // // If ConOut, then set the mode to Mode #0 which us 80 x 25 @@ -1990,7 +2281,7 @@ Returns: { INT32 Index; UINTN CurrentNumOfConsoles; - TEXT_OUT_AND_UGA_DATA *TextOutList; + TEXT_OUT_AND_GOP_DATA *TextOutList; EFI_STATUS Status; // @@ -2002,7 +2293,7 @@ Returns: TextOutList = Private->TextOutList; while (Index >= 0) { if (TextOutList->TextOut == TextOut) { - CopyMem (TextOutList, TextOutList + 1, sizeof (TEXT_OUT_AND_UGA_DATA) * Index); + CopyMem (TextOutList, TextOutList + 1, sizeof (TEXT_OUT_AND_GOP_DATA) * Index); CurrentNumOfConsoles--; break; } @@ -2862,7 +3153,8 @@ ConSplitterTextOutQueryMode ( // Check whether param ModeNumber is valid. // ModeNumber should be within range 0 ~ MaxMode - 1. // - if (ModeNumber > (UINTN)(((UINT32)-1)>>1)) { + if ( (ModeNumber < 0) || + (ModeNumber > (UINTN)(((UINT32)-1)>>1)) ) { return EFI_UNSUPPORTED; } @@ -2916,7 +3208,8 @@ ConSplitterTextOutSetMode ( // Check whether param ModeNumber is valid. // ModeNumber should be within range 0 ~ MaxMode - 1. // - if (ModeNumber > (UINTN)(((UINT32)-1)>>1)) { + if ( (ModeNumber < 0) || + (ModeNumber > (UINTN)(((UINT32)-1)>>1)) ) { return EFI_UNSUPPORTED; } @@ -2944,7 +3237,7 @@ ConSplitterTextOutSetMode ( // If this console device is based on a UGA device, then sync up the bitmap from // the UGA splitter and reclear the text portion of the display in the new mode. // - if (Private->TextOutList[Index].UgaDraw != NULL) { + if ((Private->TextOutList[Index].GraphicsOutput != NULL) || (Private->TextOutList[Index].UgaDraw != NULL)) { Private->TextOutList[Index].TextOut->ClearScreen (Private->TextOutList[Index].TextOut); }