Gop.c revision 5cdb96fa0d5f689cb4b3b17ddd2cec164842aebd
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
755cdb96fa0d5f689cb4b3b17ddd2cec164842aebdLaszlo Ersek  FreePool (FrameBufDesc);
76eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  return EFI_SUCCESS;
77eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten}
78eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
79eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
80eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten//
81eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten// Graphics Output Protocol Member Functions
82eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten//
83eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS
84eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFIAPI
85eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputQueryMode (
86eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL          *This,
87eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINT32                                ModeNumber,
88eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  OUT UINTN                                 *SizeOfInfo,
89eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  **Info
90eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  )
91eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++
92eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
93eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description:
94eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
95eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Graphics Output protocol interface to query video mode
96eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
97eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Arguments:
98eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    This                  - Protocol instance pointer.
99eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    ModeNumber            - The mode number to return information on.
100eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Info                  - Caller allocated buffer that returns information about ModeNumber.
101eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    SizeOfInfo            - A pointer to the size, in bytes, of the Info buffer.
102eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
103eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Returns:
104eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    EFI_SUCCESS           - Mode information returned.
105eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    EFI_BUFFER_TOO_SMALL  - The Info buffer was too small.
106eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    EFI_DEVICE_ERROR      - A hardware error occurred trying to retrieve the video mode.
107eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    EFI_NOT_STARTED       - Video display is not initialized. Call SetMode ()
108eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    EFI_INVALID_PARAMETER - One of the input args was NULL.
109eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
110eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/
111eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{
112eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QEMU_VIDEO_PRIVATE_DATA  *Private;
113eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QEMU_VIDEO_MODE_DATA     *ModeData;
114eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
115eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This);
116eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
117eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (Private->HardwareNeedsStarting) {
118eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    return EFI_NOT_STARTED;
119eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
120eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
121eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (Info == NULL || SizeOfInfo == NULL || ModeNumber >= This->Mode->MaxMode) {
122eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    return EFI_INVALID_PARAMETER;
123eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
124eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
125eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
126eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (*Info == NULL) {
127eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    return EFI_OUT_OF_RESOURCES;
128eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
129eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
130eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
131eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
132eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  ModeData = &Private->ModeData[ModeNumber];
133eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  (*Info)->HorizontalResolution = ModeData->HorizontalResolution;
134eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  (*Info)->VerticalResolution   = ModeData->VerticalResolution;
135eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QemuVideoCompleteModeInfo (ModeData, *Info);
136eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
137eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  return EFI_SUCCESS;
138eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten}
139eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
140eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS
141eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFIAPI
142eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputSetMode (
143eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
144eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINT32                       ModeNumber
145eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  )
146eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++
147eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
148eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description:
149eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
150eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Graphics Output protocol interface to set video mode
151eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
152eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Arguments:
153eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    This             - Protocol instance pointer.
154eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    ModeNumber       - The mode number to be set.
155eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
156eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Returns:
157eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    EFI_SUCCESS      - Graphics mode was changed.
158eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    EFI_DEVICE_ERROR - The device had an error and could not complete the request.
159eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    EFI_UNSUPPORTED  - ModeNumber is not supported by this device.
160eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
161eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/
162eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{
163eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QEMU_VIDEO_PRIVATE_DATA    *Private;
164eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QEMU_VIDEO_MODE_DATA       *ModeData;
165eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten//  UINTN                             Count;
166eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
167eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This);
168eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
169eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (ModeNumber >= This->Mode->MaxMode) {
170eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    return EFI_UNSUPPORTED;
171eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
172eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
173eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  ModeData = &Private->ModeData[ModeNumber];
174eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
175eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (Private->LineBuffer) {
176eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    gBS->FreePool (Private->LineBuffer);
177eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
178eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
179eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private->LineBuffer = NULL;
180eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private->LineBuffer = AllocatePool (4 * ModeData->HorizontalResolution);
181eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (Private->LineBuffer == NULL) {
182eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    return EFI_OUT_OF_RESOURCES;
183eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
184eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
185212aac55fd13e985cebf88042f40479c01ac2e44jljusten  switch (Private->Variant) {
186212aac55fd13e985cebf88042f40479c01ac2e44jljusten  case QEMU_VIDEO_CIRRUS_5430:
187212aac55fd13e985cebf88042f40479c01ac2e44jljusten  case QEMU_VIDEO_CIRRUS_5446:
188212aac55fd13e985cebf88042f40479c01ac2e44jljusten    InitializeCirrusGraphicsMode (Private, &QemuVideoCirrusModes[ModeData->ModeNumber]);
189212aac55fd13e985cebf88042f40479c01ac2e44jljusten    break;
190cdb4f5dcb1d4778da71c82cc15cab6e3cf218417jljusten  case QEMU_VIDEO_BOCHS_MMIO:
19154f9b9accbcb6dc7f965342fc75b478464de21a3jljusten  case QEMU_VIDEO_BOCHS:
19254f9b9accbcb6dc7f965342fc75b478464de21a3jljusten    InitializeBochsGraphicsMode (Private, &QemuVideoBochsModes[ModeData->ModeNumber]);
19354f9b9accbcb6dc7f965342fc75b478464de21a3jljusten    break;
194212aac55fd13e985cebf88042f40479c01ac2e44jljusten  default:
195212aac55fd13e985cebf88042f40479c01ac2e44jljusten    ASSERT (FALSE);
196212aac55fd13e985cebf88042f40479c01ac2e44jljusten    gBS->FreePool (Private->LineBuffer);
197212aac55fd13e985cebf88042f40479c01ac2e44jljusten    Private->LineBuffer = NULL;
198212aac55fd13e985cebf88042f40479c01ac2e44jljusten    return EFI_DEVICE_ERROR;
199212aac55fd13e985cebf88042f40479c01ac2e44jljusten  }
200eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
201eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  This->Mode->Mode = ModeNumber;
202eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  This->Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;
203eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  This->Mode->Info->VerticalResolution = ModeData->VerticalResolution;
204eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  This->Mode->SizeOfInfo = sizeof(EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
205eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
206eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QemuVideoCompleteModeData (Private, This->Mode);
207eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
208eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  BltLibConfigure (
209eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    (VOID*)(UINTN) This->Mode->FrameBufferBase,
210eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    This->Mode->Info
211eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    );
212eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
213eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private->HardwareNeedsStarting  = FALSE;
214eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
215eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  return EFI_SUCCESS;
216eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten}
217eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
218eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS
219eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFIAPI
220eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputBlt (
221eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL          *This,
222eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL         *BltBuffer, OPTIONAL
223eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION     BltOperation,
224eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 SourceX,
225eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 SourceY,
226eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 DestinationX,
227eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 DestinationY,
228eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 Width,
229eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 Height,
230eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 Delta
231eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  )
232eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++
233eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
234eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description:
235eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
236eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Graphics Output protocol instance to block transfer for CirrusLogic device
237eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
238eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenArguments:
239eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
240eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  This          - Pointer to Graphics Output protocol instance
241eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  BltBuffer     - The data to transfer to screen
242eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  BltOperation  - The operation to perform
243eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  SourceX       - The X coordinate of the source for BltOperation
244eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  SourceY       - The Y coordinate of the source for BltOperation
245eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  DestinationX  - The X coordinate of the destination for BltOperation
246eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  DestinationY  - The Y coordinate of the destination for BltOperation
247eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Width         - The width of a rectangle in the blt rectangle in pixels
248eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Height        - The height of a rectangle in the blt rectangle in pixels
249eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Delta         - Not used for EfiBltVideoFill and EfiBltVideoToVideo operation.
250eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  If a Delta of 0 is used, the entire BltBuffer will be operated on.
251eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  If a subrectangle of the BltBuffer is used, then Delta represents
252eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  the number of bytes in a row of the BltBuffer.
253eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
254eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenReturns:
255eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
256eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  EFI_INVALID_PARAMETER - Invalid parameter passed in
257eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  EFI_SUCCESS - Blt operation success
258eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
259eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/
260eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{
261eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  EFI_STATUS                      Status;
262eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  EFI_TPL                         OriginalTPL;
263eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
264eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  //
265eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  // We have to raise to TPL Notify, so we make an atomic write the frame buffer.
266eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  // We would not want a timer based event (Cursor, ...) to come in while we are
267eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  // doing this operation.
268eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  //
269eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);
270eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
271eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  switch (BltOperation) {
272eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  case EfiBltVideoToBltBuffer:
273eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  case EfiBltBufferToVideo:
274eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  case EfiBltVideoFill:
275eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  case EfiBltVideoToVideo:
276eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Status = BltLibGopBlt (
277eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      BltBuffer,
278eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      BltOperation,
279eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      SourceX,
280eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      SourceY,
281eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      DestinationX,
282eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      DestinationY,
283eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      Width,
284eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      Height,
285eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      Delta
286eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      );
287eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    break;
288eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
289eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  default:
290eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Status = EFI_INVALID_PARAMETER;
291eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    ASSERT (FALSE);
292eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
293eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
294eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  gBS->RestoreTPL (OriginalTPL);
295eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
296eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  return Status;
297eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten}
298eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
299eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS
300eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputConstructor (
301eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QEMU_VIDEO_PRIVATE_DATA  *Private
302eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  )
303eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{
304eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  EFI_STATUS                   Status;
305eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
306eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
307eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
308eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  GraphicsOutput            = &Private->GraphicsOutput;
309eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  GraphicsOutput->QueryMode = QemuVideoGraphicsOutputQueryMode;
310eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  GraphicsOutput->SetMode   = QemuVideoGraphicsOutputSetMode;
311eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  GraphicsOutput->Blt       = QemuVideoGraphicsOutputBlt;
312eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
313eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  //
314eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  // Initialize the private data
315eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  //
316eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Status = gBS->AllocatePool (
317eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  EfiBootServicesData,
318eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE),
319eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  (VOID **) &Private->GraphicsOutput.Mode
320eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  );
321eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (EFI_ERROR (Status)) {
322eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    return Status;
323eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
324eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Status = gBS->AllocatePool (
325eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  EfiBootServicesData,
326eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION),
327eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  (VOID **) &Private->GraphicsOutput.Mode->Info
328eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  );
329eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (EFI_ERROR (Status)) {
330eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    return Status;
331eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
332eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private->GraphicsOutput.Mode->MaxMode = (UINT32) Private->MaxMode;
333eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private->GraphicsOutput.Mode->Mode    = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;
334eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private->HardwareNeedsStarting        = TRUE;
335eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private->LineBuffer                   = NULL;
336eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
337eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  //
338eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  // Initialize the hardware
339eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  //
340eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  GraphicsOutput->SetMode (GraphicsOutput, 0);
341eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  DrawLogo (
342eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Private,
343eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Private->ModeData[Private->GraphicsOutput.Mode->Mode].HorizontalResolution,
344eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Private->ModeData[Private->GraphicsOutput.Mode->Mode].VerticalResolution
345eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    );
346eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
347eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  return EFI_SUCCESS;
348eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten}
349eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
350eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS
351eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputDestructor (
352eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QEMU_VIDEO_PRIVATE_DATA  *Private
353eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  )
354eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++
355eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
356eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description:
357eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
358eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenArguments:
359eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
360eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenReturns:
361eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
362eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  None
363eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
364eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/
365eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{
366eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (Private->GraphicsOutput.Mode != NULL) {
367eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    if (Private->GraphicsOutput.Mode->Info != NULL) {
368eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      gBS->FreePool (Private->GraphicsOutput.Mode->Info);
369eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    }
370eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    gBS->FreePool (Private->GraphicsOutput.Mode);
371eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
372eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
373eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  return EFI_SUCCESS;
374eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten}
375eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
376eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
377