Gop.c revision eaf4f336ea42dc32e1a5b31d6b7822c125a15d34
1eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/** @file
2eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Graphics Output Protocol functions for the QEMU video controller.
3eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
4eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
5eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
6eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  This program and the accompanying materials
7eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  are licensed and made available under the terms and conditions of the BSD License
8eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  which accompanies this distribution. The full text of the license may be found at
9eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  http://opensource.org/licenses/bsd-license.php
10eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
11eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
14eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten**/
15eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
16eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten#include "Qemu.h"
17eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten#include <IndustryStandard/Acpi.h>
18eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten#include <Library/BltLib.h>
19eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
20eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenSTATIC
21eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenVOID
22eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoCompleteModeInfo (
23eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  QEMU_VIDEO_MODE_DATA           *ModeData,
24eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  *Info
25eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  )
26eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{
27eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Info->Version = 0;
28eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (ModeData->ColorDepth == 8) {
29eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Info->PixelFormat = PixelBitMask;
30eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Info->PixelInformation.RedMask = PIXEL_RED_MASK;
31eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Info->PixelInformation.GreenMask = PIXEL_GREEN_MASK;
32eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Info->PixelInformation.BlueMask = PIXEL_BLUE_MASK;
33eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Info->PixelInformation.ReservedMask = 0;
34eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  } else if (ModeData->ColorDepth == 24) {
35eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Info->PixelFormat = PixelBitMask;
36eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Info->PixelInformation.RedMask = PIXEL24_RED_MASK;
37eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Info->PixelInformation.GreenMask = PIXEL24_GREEN_MASK;
38eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Info->PixelInformation.BlueMask = PIXEL24_BLUE_MASK;
39eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Info->PixelInformation.ReservedMask = 0;
40eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  } else if (ModeData->ColorDepth == 32) {
41eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    DEBUG ((EFI_D_INFO, "PixelBlueGreenRedReserved8BitPerColor\n"));
42eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Info->PixelFormat = PixelBlueGreenRedReserved8BitPerColor;
43eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
44eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Info->PixelsPerScanLine = Info->HorizontalResolution;
45eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten}
46eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
47eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
48eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenSTATIC
49eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS
50eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoCompleteModeData (
51eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  QEMU_VIDEO_PRIVATE_DATA           *Private,
52eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  OUT EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode
53eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  )
54eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{
55eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  *Info;
56eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR     *FrameBufDesc;
57eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QEMU_VIDEO_MODE_DATA           *ModeData;
58eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
59eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  ModeData = &Private->ModeData[Mode->Mode];
60eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Info = Mode->Info;
61eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QemuVideoCompleteModeInfo (ModeData, Info);
62eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
63eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private->PciIo->GetBarAttributes (
64eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                        Private->PciIo,
65eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                        0,
66eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                        NULL,
67eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                        (VOID**) &FrameBufDesc
68eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                        );
69eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
70eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Mode->FrameBufferBase = FrameBufDesc->AddrRangeMin;
71eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Mode->FrameBufferSize = Info->HorizontalResolution * Info->VerticalResolution;
72eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Mode->FrameBufferSize = Mode->FrameBufferSize * ((ModeData->ColorDepth + 7) / 8);
73eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  DEBUG ((EFI_D_INFO, "FrameBufferBase: 0x%x, FrameBufferSize: 0x%x\n", Mode->FrameBufferBase, Mode->FrameBufferSize));
74eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
75eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  return EFI_SUCCESS;
76eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten}
77eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
78eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
79eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten//
80eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten// Graphics Output Protocol Member Functions
81eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten//
82eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS
83eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFIAPI
84eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputQueryMode (
85eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL          *This,
86eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINT32                                ModeNumber,
87eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  OUT UINTN                                 *SizeOfInfo,
88eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  **Info
89eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  )
90eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++
91eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
92eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description:
93eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
94eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Graphics Output protocol interface to query video mode
95eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
96eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Arguments:
97eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    This                  - Protocol instance pointer.
98eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    ModeNumber            - The mode number to return information on.
99eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Info                  - Caller allocated buffer that returns information about ModeNumber.
100eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    SizeOfInfo            - A pointer to the size, in bytes, of the Info buffer.
101eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
102eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Returns:
103eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    EFI_SUCCESS           - Mode information returned.
104eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    EFI_BUFFER_TOO_SMALL  - The Info buffer was too small.
105eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    EFI_DEVICE_ERROR      - A hardware error occurred trying to retrieve the video mode.
106eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    EFI_NOT_STARTED       - Video display is not initialized. Call SetMode ()
107eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    EFI_INVALID_PARAMETER - One of the input args was NULL.
108eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
109eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/
110eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{
111eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QEMU_VIDEO_PRIVATE_DATA  *Private;
112eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QEMU_VIDEO_MODE_DATA     *ModeData;
113eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
114eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This);
115eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
116eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (Private->HardwareNeedsStarting) {
117eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    return EFI_NOT_STARTED;
118eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
119eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
120eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (Info == NULL || SizeOfInfo == NULL || ModeNumber >= This->Mode->MaxMode) {
121eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    return EFI_INVALID_PARAMETER;
122eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
123eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
124eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
125eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (*Info == NULL) {
126eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    return EFI_OUT_OF_RESOURCES;
127eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
128eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
129eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
130eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
131eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  ModeData = &Private->ModeData[ModeNumber];
132eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  (*Info)->HorizontalResolution = ModeData->HorizontalResolution;
133eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  (*Info)->VerticalResolution   = ModeData->VerticalResolution;
134eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QemuVideoCompleteModeInfo (ModeData, *Info);
135eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
136eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  return EFI_SUCCESS;
137eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten}
138eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
139eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS
140eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFIAPI
141eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputSetMode (
142eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
143eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINT32                       ModeNumber
144eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  )
145eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++
146eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
147eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description:
148eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
149eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Graphics Output protocol interface to set video mode
150eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
151eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Arguments:
152eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    This             - Protocol instance pointer.
153eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    ModeNumber       - The mode number to be set.
154eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
155eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Returns:
156eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    EFI_SUCCESS      - Graphics mode was changed.
157eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    EFI_DEVICE_ERROR - The device had an error and could not complete the request.
158eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    EFI_UNSUPPORTED  - ModeNumber is not supported by this device.
159eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
160eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/
161eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{
162eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QEMU_VIDEO_PRIVATE_DATA    *Private;
163eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QEMU_VIDEO_MODE_DATA       *ModeData;
164eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten//  UINTN                             Count;
165eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
166eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This);
167eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
168eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (ModeNumber >= This->Mode->MaxMode) {
169eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    return EFI_UNSUPPORTED;
170eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
171eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
172eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  ModeData = &Private->ModeData[ModeNumber];
173eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
174eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (Private->LineBuffer) {
175eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    gBS->FreePool (Private->LineBuffer);
176eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
177eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
178eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private->LineBuffer = NULL;
179eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private->LineBuffer = AllocatePool (4 * ModeData->HorizontalResolution);
180eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (Private->LineBuffer == NULL) {
181eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    return EFI_OUT_OF_RESOURCES;
182eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
183eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
184eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  InitializeGraphicsMode (Private, &QemuVideoVideoModes[ModeData->ModeNumber]);
185eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
186eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  This->Mode->Mode = ModeNumber;
187eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  This->Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;
188eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  This->Mode->Info->VerticalResolution = ModeData->VerticalResolution;
189eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  This->Mode->SizeOfInfo = sizeof(EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
190eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
191eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QemuVideoCompleteModeData (Private, This->Mode);
192eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
193eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  BltLibConfigure (
194eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    (VOID*)(UINTN) This->Mode->FrameBufferBase,
195eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    This->Mode->Info
196eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    );
197eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
198eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private->HardwareNeedsStarting  = FALSE;
199eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
200eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  return EFI_SUCCESS;
201eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten}
202eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
203eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS
204eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFIAPI
205eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputBlt (
206eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL          *This,
207eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL         *BltBuffer, OPTIONAL
208eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION     BltOperation,
209eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 SourceX,
210eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 SourceY,
211eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 DestinationX,
212eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 DestinationY,
213eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 Width,
214eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 Height,
215eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 Delta
216eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  )
217eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++
218eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
219eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description:
220eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
221eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Graphics Output protocol instance to block transfer for CirrusLogic device
222eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
223eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenArguments:
224eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
225eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  This          - Pointer to Graphics Output protocol instance
226eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  BltBuffer     - The data to transfer to screen
227eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  BltOperation  - The operation to perform
228eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  SourceX       - The X coordinate of the source for BltOperation
229eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  SourceY       - The Y coordinate of the source for BltOperation
230eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  DestinationX  - The X coordinate of the destination for BltOperation
231eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  DestinationY  - The Y coordinate of the destination for BltOperation
232eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Width         - The width of a rectangle in the blt rectangle in pixels
233eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Height        - The height of a rectangle in the blt rectangle in pixels
234eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Delta         - Not used for EfiBltVideoFill and EfiBltVideoToVideo operation.
235eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  If a Delta of 0 is used, the entire BltBuffer will be operated on.
236eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  If a subrectangle of the BltBuffer is used, then Delta represents
237eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  the number of bytes in a row of the BltBuffer.
238eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
239eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenReturns:
240eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
241eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  EFI_INVALID_PARAMETER - Invalid parameter passed in
242eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  EFI_SUCCESS - Blt operation success
243eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
244eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/
245eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{
246eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  EFI_STATUS                      Status;
247eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  EFI_TPL                         OriginalTPL;
248eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
249eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  //
250eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  // We have to raise to TPL Notify, so we make an atomic write the frame buffer.
251eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  // We would not want a timer based event (Cursor, ...) to come in while we are
252eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  // doing this operation.
253eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  //
254eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);
255eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
256eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  switch (BltOperation) {
257eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  case EfiBltVideoToBltBuffer:
258eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  case EfiBltBufferToVideo:
259eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  case EfiBltVideoFill:
260eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  case EfiBltVideoToVideo:
261eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Status = BltLibGopBlt (
262eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      BltBuffer,
263eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      BltOperation,
264eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      SourceX,
265eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      SourceY,
266eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      DestinationX,
267eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      DestinationY,
268eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      Width,
269eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      Height,
270eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      Delta
271eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      );
272eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    break;
273eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
274eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  default:
275eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Status = EFI_INVALID_PARAMETER;
276eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    ASSERT (FALSE);
277eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
278eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
279eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  gBS->RestoreTPL (OriginalTPL);
280eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
281eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  return Status;
282eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten}
283eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
284eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS
285eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputConstructor (
286eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QEMU_VIDEO_PRIVATE_DATA  *Private
287eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  )
288eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{
289eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  EFI_STATUS                   Status;
290eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
291eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
292eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
293eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  GraphicsOutput            = &Private->GraphicsOutput;
294eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  GraphicsOutput->QueryMode = QemuVideoGraphicsOutputQueryMode;
295eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  GraphicsOutput->SetMode   = QemuVideoGraphicsOutputSetMode;
296eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  GraphicsOutput->Blt       = QemuVideoGraphicsOutputBlt;
297eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
298eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  //
299eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  // Initialize the private data
300eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  //
301eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Status = gBS->AllocatePool (
302eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  EfiBootServicesData,
303eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE),
304eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  (VOID **) &Private->GraphicsOutput.Mode
305eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  );
306eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (EFI_ERROR (Status)) {
307eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    return Status;
308eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
309eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Status = gBS->AllocatePool (
310eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  EfiBootServicesData,
311eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION),
312eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  (VOID **) &Private->GraphicsOutput.Mode->Info
313eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  );
314eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (EFI_ERROR (Status)) {
315eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    return Status;
316eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
317eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private->GraphicsOutput.Mode->MaxMode = (UINT32) Private->MaxMode;
318eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private->GraphicsOutput.Mode->Mode    = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;
319eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private->HardwareNeedsStarting        = TRUE;
320eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private->LineBuffer                   = NULL;
321eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
322eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  //
323eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  // Initialize the hardware
324eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  //
325eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  GraphicsOutput->SetMode (GraphicsOutput, 0);
326eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  DrawLogo (
327eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Private,
328eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Private->ModeData[Private->GraphicsOutput.Mode->Mode].HorizontalResolution,
329eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Private->ModeData[Private->GraphicsOutput.Mode->Mode].VerticalResolution
330eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    );
331eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
332eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  return EFI_SUCCESS;
333eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten}
334eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
335eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS
336eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputDestructor (
337eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QEMU_VIDEO_PRIVATE_DATA  *Private
338eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  )
339eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++
340eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
341eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description:
342eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
343eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenArguments:
344eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
345eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenReturns:
346eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
347eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  None
348eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
349eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/
350eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{
351eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (Private->GraphicsOutput.Mode != NULL) {
352eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    if (Private->GraphicsOutput.Mode->Info != NULL) {
353eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      gBS->FreePool (Private->GraphicsOutput.Mode->Info);
354eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    }
355eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    gBS->FreePool (Private->GraphicsOutput.Mode);
356eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
357eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
358eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  return EFI_SUCCESS;
359eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten}
360eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
361eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
362