Gop.c revision cd1526101469cb639c7166c0b750c5ebb810a446
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 (Info == NULL || SizeOfInfo == NULL || ModeNumber >= This->Mode->MaxMode) {
118eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    return EFI_INVALID_PARAMETER;
119eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
120eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
121eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
122eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (*Info == NULL) {
123eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    return EFI_OUT_OF_RESOURCES;
124eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
125eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
126eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
127eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
128eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  ModeData = &Private->ModeData[ModeNumber];
129eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  (*Info)->HorizontalResolution = ModeData->HorizontalResolution;
130eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  (*Info)->VerticalResolution   = ModeData->VerticalResolution;
131eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QemuVideoCompleteModeInfo (ModeData, *Info);
132eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
133eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  return EFI_SUCCESS;
134eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten}
135eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
136eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS
137eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFIAPI
138eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputSetMode (
139eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
140eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINT32                       ModeNumber
141eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  )
142eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++
143eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
144eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description:
145eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
146eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Graphics Output protocol interface to set video mode
147eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
148eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Arguments:
149eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    This             - Protocol instance pointer.
150eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    ModeNumber       - The mode number to be set.
151eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
152eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Returns:
153eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    EFI_SUCCESS      - Graphics mode was changed.
154eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    EFI_DEVICE_ERROR - The device had an error and could not complete the request.
155eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    EFI_UNSUPPORTED  - ModeNumber is not supported by this device.
156eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
157eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/
158eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{
159eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QEMU_VIDEO_PRIVATE_DATA    *Private;
160eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QEMU_VIDEO_MODE_DATA       *ModeData;
161eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten//  UINTN                             Count;
162eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
163eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private = QEMU_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This);
164eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
165eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (ModeNumber >= This->Mode->MaxMode) {
166eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    return EFI_UNSUPPORTED;
167eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
168eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
169eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  ModeData = &Private->ModeData[ModeNumber];
170eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
171eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (Private->LineBuffer) {
172eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    gBS->FreePool (Private->LineBuffer);
173eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
174eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
175eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private->LineBuffer = AllocatePool (4 * ModeData->HorizontalResolution);
176eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (Private->LineBuffer == NULL) {
177eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    return EFI_OUT_OF_RESOURCES;
178eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
179eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
180212aac55fd13e985cebf88042f40479c01ac2e44jljusten  switch (Private->Variant) {
181212aac55fd13e985cebf88042f40479c01ac2e44jljusten  case QEMU_VIDEO_CIRRUS_5430:
182212aac55fd13e985cebf88042f40479c01ac2e44jljusten  case QEMU_VIDEO_CIRRUS_5446:
183cd1526101469cb639c7166c0b750c5ebb810a446Laszlo Ersek    InitializeCirrusGraphicsMode (Private, &QemuVideoCirrusModes[ModeData->InternalModeIndex]);
184212aac55fd13e985cebf88042f40479c01ac2e44jljusten    break;
185cdb4f5dcb1d4778da71c82cc15cab6e3cf218417jljusten  case QEMU_VIDEO_BOCHS_MMIO:
18654f9b9accbcb6dc7f965342fc75b478464de21a3jljusten  case QEMU_VIDEO_BOCHS:
187cd1526101469cb639c7166c0b750c5ebb810a446Laszlo Ersek    InitializeBochsGraphicsMode (Private, &QemuVideoBochsModes[ModeData->InternalModeIndex]);
18854f9b9accbcb6dc7f965342fc75b478464de21a3jljusten    break;
189212aac55fd13e985cebf88042f40479c01ac2e44jljusten  default:
190212aac55fd13e985cebf88042f40479c01ac2e44jljusten    ASSERT (FALSE);
191212aac55fd13e985cebf88042f40479c01ac2e44jljusten    gBS->FreePool (Private->LineBuffer);
192212aac55fd13e985cebf88042f40479c01ac2e44jljusten    Private->LineBuffer = NULL;
193212aac55fd13e985cebf88042f40479c01ac2e44jljusten    return EFI_DEVICE_ERROR;
194212aac55fd13e985cebf88042f40479c01ac2e44jljusten  }
195eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
196eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  This->Mode->Mode = ModeNumber;
197eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  This->Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;
198eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  This->Mode->Info->VerticalResolution = ModeData->VerticalResolution;
199eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  This->Mode->SizeOfInfo = sizeof(EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
200eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
201eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QemuVideoCompleteModeData (Private, This->Mode);
202eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
203eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  BltLibConfigure (
204eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    (VOID*)(UINTN) This->Mode->FrameBufferBase,
205eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    This->Mode->Info
206eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    );
207eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
208eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  return EFI_SUCCESS;
209eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten}
210eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
211eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS
212eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFIAPI
213eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputBlt (
214eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL          *This,
215eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL         *BltBuffer, OPTIONAL
216eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION     BltOperation,
217eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 SourceX,
218eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 SourceY,
219eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 DestinationX,
220eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 DestinationY,
221eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 Width,
222eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 Height,
223eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  IN  UINTN                                 Delta
224eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  )
225eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++
226eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
227eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description:
228eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
229eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Graphics Output protocol instance to block transfer for CirrusLogic device
230eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
231eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenArguments:
232eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
233eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  This          - Pointer to Graphics Output protocol instance
234eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  BltBuffer     - The data to transfer to screen
235eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  BltOperation  - The operation to perform
236eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  SourceX       - The X coordinate of the source for BltOperation
237eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  SourceY       - The Y coordinate of the source for BltOperation
238eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  DestinationX  - The X coordinate of the destination for BltOperation
239eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  DestinationY  - The Y coordinate of the destination for BltOperation
240eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Width         - The width of a rectangle in the blt rectangle in pixels
241eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Height        - The height of a rectangle in the blt rectangle in pixels
242eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Delta         - Not used for EfiBltVideoFill and EfiBltVideoToVideo operation.
243eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  If a Delta of 0 is used, the entire BltBuffer will be operated on.
244eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  If a subrectangle of the BltBuffer is used, then Delta represents
245eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  the number of bytes in a row of the BltBuffer.
246eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
247eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenReturns:
248eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
249eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  EFI_INVALID_PARAMETER - Invalid parameter passed in
250eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  EFI_SUCCESS - Blt operation success
251eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
252eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/
253eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{
254eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  EFI_STATUS                      Status;
255eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  EFI_TPL                         OriginalTPL;
256eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
257eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  //
258eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  // We have to raise to TPL Notify, so we make an atomic write the frame buffer.
259eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  // We would not want a timer based event (Cursor, ...) to come in while we are
260eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  // doing this operation.
261eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  //
262eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);
263eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
264eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  switch (BltOperation) {
265eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  case EfiBltVideoToBltBuffer:
266eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  case EfiBltBufferToVideo:
267eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  case EfiBltVideoFill:
268eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  case EfiBltVideoToVideo:
269eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Status = BltLibGopBlt (
270eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      BltBuffer,
271eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      BltOperation,
272eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      SourceX,
273eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      SourceY,
274eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      DestinationX,
275eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      DestinationY,
276eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      Width,
277eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      Height,
278eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      Delta
279eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      );
280eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    break;
281eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
282eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  default:
283eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Status = EFI_INVALID_PARAMETER;
284eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    ASSERT (FALSE);
285eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
286eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
287eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  gBS->RestoreTPL (OriginalTPL);
288eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
289eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  return Status;
290eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten}
291eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
292eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS
293eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputConstructor (
294eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QEMU_VIDEO_PRIVATE_DATA  *Private
295eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  )
296eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{
297eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  EFI_STATUS                   Status;
298eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
299eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
300eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
301eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  GraphicsOutput            = &Private->GraphicsOutput;
302eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  GraphicsOutput->QueryMode = QemuVideoGraphicsOutputQueryMode;
303eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  GraphicsOutput->SetMode   = QemuVideoGraphicsOutputSetMode;
304eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  GraphicsOutput->Blt       = QemuVideoGraphicsOutputBlt;
305eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
306eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  //
307eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  // Initialize the private data
308eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  //
309eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Status = gBS->AllocatePool (
310eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  EfiBootServicesData,
311eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE),
312eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  (VOID **) &Private->GraphicsOutput.Mode
313eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  );
314eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (EFI_ERROR (Status)) {
315eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    return Status;
316eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
317d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek
318eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Status = gBS->AllocatePool (
319eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  EfiBootServicesData,
320eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION),
321eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  (VOID **) &Private->GraphicsOutput.Mode->Info
322eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten                  );
323eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (EFI_ERROR (Status)) {
324d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek    goto FreeMode;
325eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
326eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private->GraphicsOutput.Mode->MaxMode = (UINT32) Private->MaxMode;
327eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private->GraphicsOutput.Mode->Mode    = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;
328eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  Private->LineBuffer                   = NULL;
329eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
330eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  //
331eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  // Initialize the hardware
332eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  //
333d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek  Status = GraphicsOutput->SetMode (GraphicsOutput, 0);
334d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek  if (EFI_ERROR (Status)) {
335d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek    goto FreeInfo;
336d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek  }
337d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek
338eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  DrawLogo (
339eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Private,
340eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Private->ModeData[Private->GraphicsOutput.Mode->Mode].HorizontalResolution,
341eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    Private->ModeData[Private->GraphicsOutput.Mode->Mode].VerticalResolution
342eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    );
343eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
344eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  return EFI_SUCCESS;
345d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek
346d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo ErsekFreeInfo:
347d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek  FreePool (Private->GraphicsOutput.Mode->Info);
348d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek
349d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo ErsekFreeMode:
350d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek  FreePool (Private->GraphicsOutput.Mode);
351d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek  Private->GraphicsOutput.Mode = NULL;
352d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek
353d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek  return Status;
354eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten}
355eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
356eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenEFI_STATUS
357eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenQemuVideoGraphicsOutputDestructor (
358eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  QEMU_VIDEO_PRIVATE_DATA  *Private
359eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  )
360eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten/*++
361eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
362eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenRoutine Description:
363eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
364eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenArguments:
365eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
366eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljustenReturns:
367eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
368eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  None
369eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
370eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten--*/
371eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten{
372d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek  if (Private->LineBuffer != NULL) {
373d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek    FreePool (Private->LineBuffer);
374d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek  }
375d89186bc869bfedd9f83f8e52f995dfd04691521Laszlo Ersek
376eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  if (Private->GraphicsOutput.Mode != NULL) {
377eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    if (Private->GraphicsOutput.Mode->Info != NULL) {
378eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten      gBS->FreePool (Private->GraphicsOutput.Mode->Info);
379eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    }
380eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten    gBS->FreePool (Private->GraphicsOutput.Mode);
381eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  }
382eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
383eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten  return EFI_SUCCESS;
384eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten}
385eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
386eaf4f336ea42dc32e1a5b31d6b7822c125a15d34jljusten
387