summaryrefslogtreecommitdiff
path: root/UnixPkg/UnixUgaDxe/UnixUgaScreen.c
diff options
context:
space:
mode:
Diffstat (limited to 'UnixPkg/UnixUgaDxe/UnixUgaScreen.c')
-rw-r--r--UnixPkg/UnixUgaDxe/UnixUgaScreen.c446
1 files changed, 446 insertions, 0 deletions
diff --git a/UnixPkg/UnixUgaDxe/UnixUgaScreen.c b/UnixPkg/UnixUgaDxe/UnixUgaScreen.c
new file mode 100644
index 0000000000..d9118aa00f
--- /dev/null
+++ b/UnixPkg/UnixUgaDxe/UnixUgaScreen.c
@@ -0,0 +1,446 @@
+/*++
+
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+Module Name:
+
+ UnixUgaScreen.c
+
+Abstract:
+
+ This file produces the graphics abstration of UGA. It is called by
+ UnixUgaDriver.c file which deals with the EFI 1.1 driver model.
+ This file just does graphics.
+
+--*/
+
+#include "UnixUga.h"
+
+EFI_UNIX_THUNK_PROTOCOL *mUnix;
+static EFI_EVENT mUgaScreenExitBootServicesEvent;
+
+STATIC
+EFI_STATUS
+UnixUgaStartWindow (
+ IN UGA_PRIVATE_DATA *Private,
+ IN UINT32 HorizontalResolution,
+ IN UINT32 VerticalResolution,
+ IN UINT32 ColorDepth,
+ IN UINT32 RefreshRate
+ );
+
+STATIC
+VOID
+EFIAPI
+KillNtUgaThread (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ );
+
+//
+// UGA Protocol Member Functions
+//
+
+EFI_STATUS
+EFIAPI
+UnixUgaGetMode (
+ EFI_UGA_DRAW_PROTOCOL *This,
+ UINT32 *HorizontalResolution,
+ UINT32 *VerticalResolution,
+ UINT32 *ColorDepth,
+ UINT32 *RefreshRate
+ )
+/*++
+
+ Routine Description:
+ Return the current video mode information.
+
+ Arguments:
+ This - Protocol instance pointer.
+ HorizontalResolution - Current video horizontal resolution in pixels
+ VerticalResolution - Current video Vertical resolution in pixels
+ ColorDepth - Current video color depth in bits per pixel
+ RefreshRate - Current video refresh rate in Hz.
+
+ Returns:
+ EFI_SUCCESS - Mode information returned.
+ EFI_NOT_STARTED - Video display is not initialized. Call SetMode ()
+ EFI_INVALID_PARAMETER - One of the input args was NULL.
+
+--*/
+// TODO: ADD IN/OUT description here
+{
+ UGA_PRIVATE_DATA *Private;
+
+ Private = UGA_DRAW_PRIVATE_DATA_FROM_THIS (This);
+
+ if (Private->HardwareNeedsStarting) {
+ return EFI_NOT_STARTED;
+ }
+
+ if ((HorizontalResolution == NULL) ||
+ (VerticalResolution == NULL) ||
+ (ColorDepth == NULL) ||
+ (RefreshRate == NULL)) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ *HorizontalResolution = Private->HorizontalResolution;
+ *VerticalResolution = Private->VerticalResolution;
+ *ColorDepth = Private->ColorDepth;
+ *RefreshRate = Private->RefreshRate;
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+UnixUgaSetMode (
+ EFI_UGA_DRAW_PROTOCOL *This,
+ UINT32 HorizontalResolution,
+ UINT32 VerticalResolution,
+ UINT32 ColorDepth,
+ UINT32 RefreshRate
+ )
+/*++
+
+ Routine Description:
+ Return the current video mode information.
+
+ Arguments:
+ This - Protocol instance pointer.
+ HorizontalResolution - Current video horizontal resolution in pixels
+ VerticalResolution - Current video Vertical resolution in pixels
+ ColorDepth - Current video color depth in bits per pixel
+ RefreshRate - Current video refresh rate in Hz.
+
+ Returns:
+ EFI_SUCCESS - Mode information returned.
+ EFI_NOT_STARTED - Video display is not initialized. Call SetMode ()
+ EFI_INVALID_PARAMETER - One of the input args was NULL.
+
+--*/
+// TODO: EFI_DEVICE_ERROR - add return value to function comment
+// TODO: EFI_DEVICE_ERROR - add return value to function comment
+// TODO: ADD IN/OUT description here
+{
+ EFI_STATUS Status;
+ UGA_PRIVATE_DATA *Private;
+ EFI_UGA_PIXEL Fill;
+
+ Private = UGA_DRAW_PRIVATE_DATA_FROM_THIS (This);
+
+ if (Private->HardwareNeedsStarting) {
+ Status = UnixUgaStartWindow (
+ Private,
+ HorizontalResolution,
+ VerticalResolution,
+ ColorDepth,
+ RefreshRate
+ );
+ if (EFI_ERROR (Status)) {
+ return EFI_DEVICE_ERROR;
+ }
+
+ Private->HardwareNeedsStarting = FALSE;
+ }
+ Status = Private->UgaIo->UgaSize(Private->UgaIo,
+ HorizontalResolution,
+ VerticalResolution);
+
+ Private->HorizontalResolution = HorizontalResolution;
+ Private->VerticalResolution = VerticalResolution;
+ Private->ColorDepth = ColorDepth;
+ Private->RefreshRate = RefreshRate;
+
+ Fill.Red = 0x7f;
+ Fill.Green = 0x7F;
+ Fill.Blue = 0x7f;
+ This->Blt (
+ This,
+ &Fill,
+ EfiUgaVideoFill,
+ 0,
+ 0,
+ 0,
+ 0,
+ HorizontalResolution,
+ VerticalResolution,
+ HorizontalResolution * sizeof (EFI_UGA_PIXEL)
+ );
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+UnixUgaBlt (
+ IN EFI_UGA_DRAW_PROTOCOL *This,
+ IN EFI_UGA_PIXEL *BltBuffer, OPTIONAL
+ IN EFI_UGA_BLT_OPERATION BltOperation,
+ IN UINTN SourceX,
+ IN UINTN SourceY,
+ IN UINTN DestinationX,
+ IN UINTN DestinationY,
+ IN UINTN Width,
+ IN UINTN Height,
+ IN UINTN Delta OPTIONAL
+ )
+/*++
+
+ Routine Description:
+ Blt pixels from the rectangle (Width X Height) formed by the BltBuffer
+ onto the graphics screen starting a location (X, Y). (0, 0) is defined as
+ the upper left hand side of the screen. (X, Y) can be outside of the
+ current screen geometry and the BltBuffer will be cliped when it is
+ displayed. X and Y can be negative or positive. If Width or Height is
+ bigger than the current video screen the image will be clipped.
+
+ Arguments:
+ This - Protocol instance pointer.
+ X - X location on graphics screen.
+ Y - Y location on the graphics screen.
+ Width - Width of BltBuffer.
+ Height - Hight of BltBuffer
+ BltOperation - Operation to perform on BltBuffer and video memory
+ BltBuffer - Buffer containing data to blt into video buffer. This
+ buffer has a size of Width*Height*sizeof(EFI_UGA_PIXEL)
+ SourceX - If the BltOperation is a EfiCopyBlt this is the source
+ of the copy. For other BLT operations this argument is not
+ used.
+ SourceX - If the BltOperation is a EfiCopyBlt this is the source
+ of the copy. For other BLT operations this argument is not
+ used.
+
+ Returns:
+ EFI_SUCCESS - The palette is updated with PaletteArray.
+ EFI_INVALID_PARAMETER - BltOperation is not valid.
+ EFI_DEVICE_ERROR - A hardware error occured writting to the video
+ buffer.
+
+--*/
+// TODO: SourceY - add argument and description to function comment
+// TODO: DestinationX - add argument and description to function comment
+// TODO: DestinationY - add argument and description to function comment
+// TODO: Delta - add argument and description to function comment
+{
+ UGA_PRIVATE_DATA *Private;
+ EFI_TPL OriginalTPL;
+ EFI_STATUS Status;
+
+ Private = UGA_DRAW_PRIVATE_DATA_FROM_THIS (This);
+
+ if ((BltOperation < 0) || (BltOperation >= EfiUgaBltMax)) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (Width == 0 || Height == 0) {
+ return EFI_INVALID_PARAMETER;
+ }
+ //
+ // If Delta is zero, then the entire BltBuffer is being used, so Delta
+ // is the number of bytes in each row of BltBuffer. Since BltBuffer is Width pixels size,
+ // the number of bytes in each row can be computed.
+ //
+ if (Delta == 0) {
+ Delta = Width * sizeof (EFI_UGA_PIXEL);
+ }
+
+ //
+ // We have to raise to TPL Notify, so we make an atomic write the frame buffer.
+ // We would not want a timer based event (Cursor, ...) to come in while we are
+ // doing this operation.
+ //
+ OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);
+
+ Status = Private->UgaIo->UgaBlt (Private->UgaIo,
+ BltBuffer,
+ BltOperation,
+ SourceX, SourceY,
+ DestinationX, DestinationY,
+ Width, Height,
+ Delta);
+
+ gBS->RestoreTPL (OriginalTPL);
+
+ return Status;
+}
+
+
+//
+// Construction and Destruction functions
+//
+
+EFI_STATUS
+UnixUgaSupported (
+ IN EFI_UNIX_IO_PROTOCOL *UnixIo
+ )
+/*++
+
+Routine Description:
+
+Arguments:
+
+Returns:
+
+ None
+
+--*/
+// TODO: UnixIo - add argument and description to function comment
+// TODO: EFI_UNSUPPORTED - add return value to function comment
+// TODO: EFI_SUCCESS - add return value to function comment
+{
+ //
+ // Check to see if the IO abstraction represents a device type we support.
+ //
+ // This would be replaced a check of PCI subsystem ID, etc.
+ //
+ if (!CompareGuid (UnixIo->TypeGuid, &gEfiUnixUgaGuid)) {
+ return EFI_UNSUPPORTED;
+ }
+
+ return EFI_SUCCESS;
+}
+
+
+STATIC
+EFI_STATUS
+UnixUgaStartWindow (
+ IN UGA_PRIVATE_DATA *Private,
+ IN UINT32 HorizontalResolution,
+ IN UINT32 VerticalResolution,
+ IN UINT32 ColorDepth,
+ IN UINT32 RefreshRate
+ )
+/*++
+
+Routine Description:
+
+ TODO: Add function description
+
+Arguments:
+
+ Private - TODO: add argument description
+ HorizontalResolution - TODO: add argument description
+ VerticalResolution - TODO: add argument description
+ ColorDepth - TODO: add argument description
+ RefreshRate - TODO: add argument description
+
+Returns:
+
+ TODO: add return values
+
+--*/
+{
+ EFI_STATUS Status;
+
+ mUnix = Private->UnixThunk;
+
+ Private->HorizontalResolution = HorizontalResolution;
+ Private->VerticalResolution = VerticalResolution;
+
+ //
+ // Register to be notified on exit boot services so we can destroy the window.
+ //
+ Status = gBS->CreateEvent (
+ EVT_SIGNAL_EXIT_BOOT_SERVICES,
+ TPL_CALLBACK,
+ KillNtUgaThread,
+ Private,
+ &mUgaScreenExitBootServicesEvent
+ );
+
+ Status = Private->UnixThunk->UgaCreate(&Private->UgaIo, Private->WindowName);
+ return Status;
+}
+
+EFI_STATUS
+UnixUgaConstructor (
+ UGA_PRIVATE_DATA *Private
+ )
+/*++
+
+Routine Description:
+
+Arguments:
+
+Returns:
+
+ None
+
+--*/
+// TODO: Private - add argument and description to function comment
+// TODO: EFI_SUCCESS - add return value to function comment
+{
+
+ Private->UgaDraw.GetMode = UnixUgaGetMode;
+ Private->UgaDraw.SetMode = UnixUgaSetMode;
+ Private->UgaDraw.Blt = UnixUgaBlt;
+
+ Private->HardwareNeedsStarting = TRUE;
+ Private->UgaIo = NULL;
+
+ UnixUgaInitializeSimpleTextInForWindow (Private);
+
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+UnixUgaDestructor (
+ UGA_PRIVATE_DATA *Private
+ )
+/*++
+
+Routine Description:
+
+Arguments:
+
+Returns:
+
+ None
+
+--*/
+// TODO: Private - add argument and description to function comment
+// TODO: EFI_SUCCESS - add return value to function comment
+{
+ if (!Private->HardwareNeedsStarting) {
+ Private->UgaIo->UgaClose(Private->UgaIo);
+ Private->UgaIo = NULL;
+ }
+
+ return EFI_SUCCESS;
+}
+
+STATIC
+VOID
+EFIAPI
+KillNtUgaThread (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+/*++
+
+Routine Description:
+
+ This is the UGA screen's callback notification function for exit-boot-services.
+ All we do here is call UnixUgaDestructor().
+
+Arguments:
+
+ Event - not used
+ Context - pointer to the Private structure.
+
+Returns:
+
+ None.
+
+--*/
+{
+ EFI_STATUS Status;
+ Status = UnixUgaDestructor (Context);
+}