]> git.proxmox.com Git - mirror_edk2.git/blame - OptionRomPkg/CirrusLogic5430Dxe/CirrusLogic5430GraphicsOutput.c
OptionRomPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / OptionRomPkg / CirrusLogic5430Dxe / CirrusLogic5430GraphicsOutput.c
CommitLineData
4e768df6 1/** @file\r
3d78c020 2Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.<BR>\r
96ae5934 3SPDX-License-Identifier: BSD-2-Clause-Patent\r
87f8ccbe 4\r
5Module Name:\r
6\r
7 UefiCirrusLogic5430GraphicsOutput.c\r
8\r
9Abstract:\r
10\r
31f9e631 11 This file produces the graphics abstration of Graphics Output Protocol. It is called by\r
12 CirrusLogic5430.c file which deals with the EFI 1.1 driver model.\r
87f8ccbe 13 This file just does graphics.\r
14\r
4e768df6 15**/\r
87f8ccbe 16#include "CirrusLogic5430.h"\r
110d3a9a 17#include <IndustryStandard/Acpi.h>\r
18\r
19\r
20STATIC\r
21VOID\r
22CirrusLogic5430CompleteModeInfo (\r
23 OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info\r
24 )\r
25{\r
26 Info->Version = 0;\r
27 Info->PixelFormat = PixelBitMask;\r
28 Info->PixelInformation.RedMask = PIXEL_RED_MASK;\r
29 Info->PixelInformation.GreenMask = PIXEL_GREEN_MASK;\r
30 Info->PixelInformation.BlueMask = PIXEL_BLUE_MASK;\r
31 Info->PixelInformation.ReservedMask = 0;\r
32 Info->PixelsPerScanLine = Info->HorizontalResolution;\r
33}\r
34\r
35\r
36STATIC\r
37EFI_STATUS\r
38CirrusLogic5430CompleteModeData (\r
39 IN CIRRUS_LOGIC_5430_PRIVATE_DATA *Private,\r
40 OUT EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode\r
41 )\r
42{\r
43 EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
44 EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *FrameBufDesc;\r
45\r
46 Info = Mode->Info;\r
47 CirrusLogic5430CompleteModeInfo (Info);\r
48\r
49 Private->PciIo->GetBarAttributes (\r
50 Private->PciIo,\r
51 0,\r
52 NULL,\r
53 (VOID**) &FrameBufDesc\r
54 );\r
55\r
56 Mode->FrameBufferBase = FrameBufDesc->AddrRangeMin;\r
57 Mode->FrameBufferSize = Info->HorizontalResolution * Info->VerticalResolution;\r
58\r
59 return EFI_SUCCESS;\r
60}\r
61\r
87f8ccbe 62\r
63//\r
64// Graphics Output Protocol Member Functions\r
65//\r
66EFI_STATUS\r
67EFIAPI\r
68CirrusLogic5430GraphicsOutputQueryMode (\r
69 IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,\r
70 IN UINT32 ModeNumber,\r
71 OUT UINTN *SizeOfInfo,\r
72 OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info\r
73 )\r
74/*++\r
75\r
76Routine Description:\r
77\r
78 Graphics Output protocol interface to query video mode\r
79\r
80 Arguments:\r
81 This - Protocol instance pointer.\r
82 ModeNumber - The mode number to return information on.\r
83 Info - Caller allocated buffer that returns information about ModeNumber.\r
84 SizeOfInfo - A pointer to the size, in bytes, of the Info buffer.\r
85\r
86 Returns:\r
87 EFI_SUCCESS - Mode information returned.\r
88 EFI_BUFFER_TOO_SMALL - The Info buffer was too small.\r
89 EFI_DEVICE_ERROR - A hardware error occurred trying to retrieve the video mode.\r
90 EFI_NOT_STARTED - Video display is not initialized. Call SetMode ()\r
91 EFI_INVALID_PARAMETER - One of the input args was NULL.\r
92\r
93--*/\r
94{\r
95 CIRRUS_LOGIC_5430_PRIVATE_DATA *Private;\r
96\r
97 Private = CIRRUS_LOGIC_5430_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This);\r
98\r
99 if (Private->HardwareNeedsStarting) {\r
100 return EFI_NOT_STARTED;\r
101 }\r
102\r
103 if (Info == NULL || SizeOfInfo == NULL || ModeNumber >= This->Mode->MaxMode) {\r
104 return EFI_INVALID_PARAMETER;\r
105 }\r
106\r
107 *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));\r
108 if (*Info == NULL) {\r
109 return EFI_OUT_OF_RESOURCES;\r
110 }\r
111\r
112 *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
113\r
87f8ccbe 114 (*Info)->HorizontalResolution = Private->ModeData[ModeNumber].HorizontalResolution;\r
115 (*Info)->VerticalResolution = Private->ModeData[ModeNumber].VerticalResolution;\r
110d3a9a 116 CirrusLogic5430CompleteModeInfo (*Info);\r
87f8ccbe 117\r
118 return EFI_SUCCESS;\r
119}\r
120\r
121EFI_STATUS\r
122EFIAPI\r
123CirrusLogic5430GraphicsOutputSetMode (\r
124 IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,\r
125 IN UINT32 ModeNumber\r
126 )\r
127/*++\r
128\r
129Routine Description:\r
130\r
131 Graphics Output protocol interface to set video mode\r
132\r
133 Arguments:\r
134 This - Protocol instance pointer.\r
135 ModeNumber - The mode number to be set.\r
136\r
137 Returns:\r
138 EFI_SUCCESS - Graphics mode was changed.\r
139 EFI_DEVICE_ERROR - The device had an error and could not complete the request.\r
140 EFI_UNSUPPORTED - ModeNumber is not supported by this device.\r
141\r
142--*/\r
143{\r
110d3a9a 144 CIRRUS_LOGIC_5430_PRIVATE_DATA *Private;\r
145 CIRRUS_LOGIC_5430_MODE_DATA *ModeData;\r
87f8ccbe 146\r
147 Private = CIRRUS_LOGIC_5430_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This);\r
148\r
149 if (ModeNumber >= This->Mode->MaxMode) {\r
150 return EFI_UNSUPPORTED;\r
151 }\r
152\r
153 ModeData = &Private->ModeData[ModeNumber];\r
154\r
155 if (Private->LineBuffer) {\r
156 gBS->FreePool (Private->LineBuffer);\r
157 }\r
158\r
159 Private->LineBuffer = NULL;\r
160 Private->LineBuffer = AllocatePool (ModeData->HorizontalResolution);\r
161 if (Private->LineBuffer == NULL) {\r
162 return EFI_OUT_OF_RESOURCES;\r
163 }\r
164\r
31f9e631 165 InitializeGraphicsMode (Private, &CirrusLogic5430VideoModes[ModeData->ModeNumber]);\r
87f8ccbe 166\r
167 This->Mode->Mode = ModeNumber;\r
168 This->Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;\r
169 This->Mode->Info->VerticalResolution = ModeData->VerticalResolution;\r
87f8ccbe 170 This->Mode->SizeOfInfo = sizeof(EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
171\r
110d3a9a 172 CirrusLogic5430CompleteModeData (Private, This->Mode);\r
87f8ccbe 173\r
174 Private->HardwareNeedsStarting = FALSE;\r
175\r
176 return EFI_SUCCESS;\r
177}\r
178\r
179EFI_STATUS\r
180EFIAPI\r
181CirrusLogic5430GraphicsOutputBlt (\r
182 IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,\r
183 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL\r
184 IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,\r
185 IN UINTN SourceX,\r
186 IN UINTN SourceY,\r
187 IN UINTN DestinationX,\r
188 IN UINTN DestinationY,\r
189 IN UINTN Width,\r
190 IN UINTN Height,\r
191 IN UINTN Delta\r
192 )\r
193/*++\r
194\r
195Routine Description:\r
196\r
197 Graphics Output protocol instance to block transfer for CirrusLogic device\r
198\r
199Arguments:\r
200\r
201 This - Pointer to Graphics Output protocol instance\r
202 BltBuffer - The data to transfer to screen\r
203 BltOperation - The operation to perform\r
204 SourceX - The X coordinate of the source for BltOperation\r
205 SourceY - The Y coordinate of the source for BltOperation\r
206 DestinationX - The X coordinate of the destination for BltOperation\r
207 DestinationY - The Y coordinate of the destination for BltOperation\r
208 Width - The width of a rectangle in the blt rectangle in pixels\r
209 Height - The height of a rectangle in the blt rectangle in pixels\r
210 Delta - Not used for EfiBltVideoFill and EfiBltVideoToVideo operation.\r
211 If a Delta of 0 is used, the entire BltBuffer will be operated on.\r
212 If a subrectangle of the BltBuffer is used, then Delta represents\r
213 the number of bytes in a row of the BltBuffer.\r
214\r
215Returns:\r
216\r
217 EFI_INVALID_PARAMETER - Invalid parameter passed in\r
218 EFI_SUCCESS - Blt operation success\r
219\r
220--*/\r
221{\r
222 CIRRUS_LOGIC_5430_PRIVATE_DATA *Private;\r
223 EFI_TPL OriginalTPL;\r
224 UINTN DstY;\r
225 UINTN SrcY;\r
226 EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;\r
227 UINTN X;\r
228 UINT8 Pixel;\r
229 UINT32 WidePixel;\r
230 UINTN ScreenWidth;\r
231 UINTN Offset;\r
232 UINTN SourceOffset;\r
233 UINT32 CurrentMode;\r
234\r
235 Private = CIRRUS_LOGIC_5430_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS (This);\r
236\r
3d78c020 237 if ((UINT32)BltOperation >= EfiGraphicsOutputBltOperationMax) {\r
87f8ccbe 238 return EFI_INVALID_PARAMETER;\r
239 }\r
240\r
241 if (Width == 0 || Height == 0) {\r
242 return EFI_INVALID_PARAMETER;\r
243 }\r
244\r
245 //\r
246 // If Delta is zero, then the entire BltBuffer is being used, so Delta\r
247 // is the number of bytes in each row of BltBuffer. Since BltBuffer is Width pixels size,\r
248 // the number of bytes in each row can be computed.\r
249 //\r
250 if (Delta == 0) {\r
251 Delta = Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);\r
252 }\r
253\r
254 //\r
255 // We need to fill the Virtual Screen buffer with the blt data.\r
256 // The virtual screen is upside down, as the first row is the bootom row of\r
257 // the image.\r
258 //\r
259\r
260 CurrentMode = This->Mode->Mode;\r
261 //\r
262 // Make sure the SourceX, SourceY, DestinationX, DestinationY, Width, and Height parameters\r
263 // are valid for the operation and the current screen geometry.\r
264 //\r
265 if (BltOperation == EfiBltVideoToBltBuffer) {\r
266 //\r
267 // Video to BltBuffer: Source is Video, destination is BltBuffer\r
268 //\r
269 if (SourceY + Height > Private->ModeData[CurrentMode].VerticalResolution) {\r
270 return EFI_INVALID_PARAMETER;\r
271 }\r
272\r
273 if (SourceX + Width > Private->ModeData[CurrentMode].HorizontalResolution) {\r
274 return EFI_INVALID_PARAMETER;\r
275 }\r
276 } else {\r
277 //\r
278 // BltBuffer to Video: Source is BltBuffer, destination is Video\r
279 //\r
280 if (DestinationY + Height > Private->ModeData[CurrentMode].VerticalResolution) {\r
281 return EFI_INVALID_PARAMETER;\r
282 }\r
283\r
284 if (DestinationX + Width > Private->ModeData[CurrentMode].HorizontalResolution) {\r
285 return EFI_INVALID_PARAMETER;\r
286 }\r
287 }\r
288 //\r
289 // We have to raise to TPL Notify, so we make an atomic write the frame buffer.\r
290 // We would not want a timer based event (Cursor, ...) to come in while we are\r
291 // doing this operation.\r
292 //\r
293 OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);\r
294\r
295 switch (BltOperation) {\r
296 case EfiBltVideoToBltBuffer:\r
297 //\r
298 // Video to BltBuffer: Source is Video, destination is BltBuffer\r
299 //\r
300 for (SrcY = SourceY, DstY = DestinationY; DstY < (Height + DestinationY); SrcY++, DstY++) {\r
301\r
302 Offset = (SrcY * Private->ModeData[CurrentMode].HorizontalResolution) + SourceX;\r
303 if (((Offset & 0x03) == 0) && ((Width & 0x03) == 0)) {\r
304 Private->PciIo->Mem.Read (\r
305 Private->PciIo,\r
306 EfiPciIoWidthUint32,\r
307 0,\r
308 Offset,\r
309 Width >> 2,\r
310 Private->LineBuffer\r
311 );\r
312 } else {\r
313 Private->PciIo->Mem.Read (\r
314 Private->PciIo,\r
315 EfiPciIoWidthUint8,\r
316 0,\r
317 Offset,\r
318 Width,\r
319 Private->LineBuffer\r
320 );\r
321 }\r
322\r
323 for (X = 0; X < Width; X++) {\r
324 Blt = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) ((UINT8 *) BltBuffer + (DstY * Delta) + (DestinationX + X) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));\r
325\r
110d3a9a 326 Blt->Red = PIXEL_TO_RED_BYTE (Private->LineBuffer[X]);\r
327 Blt->Green = PIXEL_TO_GREEN_BYTE (Private->LineBuffer[X]);\r
328 Blt->Blue = PIXEL_TO_BLUE_BYTE (Private->LineBuffer[X]);\r
87f8ccbe 329 }\r
330 }\r
331 break;\r
332\r
333 case EfiBltVideoToVideo:\r
334 //\r
335 // Perform hardware acceleration for Video to Video operations\r
336 //\r
337 ScreenWidth = Private->ModeData[CurrentMode].HorizontalResolution;\r
338 SourceOffset = (SourceY * Private->ModeData[CurrentMode].HorizontalResolution) + (SourceX);\r
339 Offset = (DestinationY * Private->ModeData[CurrentMode].HorizontalResolution) + (DestinationX);\r
340\r
341 outw (Private, GRAPH_ADDRESS_REGISTER, 0x0000);\r
342 outw (Private, GRAPH_ADDRESS_REGISTER, 0x0010);\r
343 outw (Private, GRAPH_ADDRESS_REGISTER, 0x0012);\r
344 outw (Private, GRAPH_ADDRESS_REGISTER, 0x0014);\r
345\r
346 outw (Private, GRAPH_ADDRESS_REGISTER, 0x0001);\r
347 outw (Private, GRAPH_ADDRESS_REGISTER, 0x0011);\r
348 outw (Private, GRAPH_ADDRESS_REGISTER, 0x0013);\r
349 outw (Private, GRAPH_ADDRESS_REGISTER, 0x0015);\r
350\r
351 outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) (((Width << 8) & 0xff00) | 0x20));\r
352 outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((Width & 0xff00) | 0x21));\r
353 outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) (((Height << 8) & 0xff00) | 0x22));\r
354 outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((Height & 0xff00) | 0x23));\r
355 outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) (((ScreenWidth << 8) & 0xff00) | 0x24));\r
356 outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((ScreenWidth & 0xff00) | 0x25));\r
357 outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) (((ScreenWidth << 8) & 0xff00) | 0x26));\r
358 outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((ScreenWidth & 0xff00) | 0x27));\r
359 outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((((Offset) << 8) & 0xff00) | 0x28));\r
360 outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((((Offset) >> 0) & 0xff00) | 0x29));\r
361 outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((((Offset) >> 8) & 0xff00) | 0x2a));\r
362 outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((((SourceOffset) << 8) & 0xff00) | 0x2c));\r
363 outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((((SourceOffset) >> 0) & 0xff00) | 0x2d));\r
364 outw (Private, GRAPH_ADDRESS_REGISTER, (UINT16) ((((SourceOffset) >> 8) & 0xff00) | 0x2e));\r
365 outw (Private, GRAPH_ADDRESS_REGISTER, 0x002f);\r
366 outw (Private, GRAPH_ADDRESS_REGISTER, 0x0030);\r
367 outw (Private, GRAPH_ADDRESS_REGISTER, 0x0d32);\r
368 outw (Private, GRAPH_ADDRESS_REGISTER, 0x0033);\r
369 outw (Private, GRAPH_ADDRESS_REGISTER, 0x0034);\r
370 outw (Private, GRAPH_ADDRESS_REGISTER, 0x0035);\r
371\r
372 outw (Private, GRAPH_ADDRESS_REGISTER, 0x0231);\r
373\r
374 outb (Private, GRAPH_ADDRESS_REGISTER, 0x31);\r
375 while ((inb (Private, GRAPH_DATA_REGISTER) & 0x01) == 0x01)\r
376 ;\r
377 break;\r
378\r
379 case EfiBltVideoFill:\r
380 Blt = BltBuffer;\r
110d3a9a 381 Pixel = RGB_BYTES_TO_PIXEL (Blt->Red, Blt->Green, Blt->Blue);\r
87f8ccbe 382 WidePixel = (Pixel << 8) | Pixel;\r
383 WidePixel = (WidePixel << 16) | WidePixel;\r
384\r
385 if (DestinationX == 0 && Width == Private->ModeData[CurrentMode].HorizontalResolution) {\r
386 Offset = DestinationY * Private->ModeData[CurrentMode].HorizontalResolution;\r
387 if (((Offset & 0x03) == 0) && (((Width * Height) & 0x03) == 0)) {\r
388 Private->PciIo->Mem.Write (\r
389 Private->PciIo,\r
390 EfiPciIoWidthFillUint32,\r
391 0,\r
392 Offset,\r
393 (Width * Height) >> 2,\r
394 &WidePixel\r
395 );\r
396 } else {\r
397 Private->PciIo->Mem.Write (\r
398 Private->PciIo,\r
399 EfiPciIoWidthFillUint8,\r
400 0,\r
401 Offset,\r
402 Width * Height,\r
403 &Pixel\r
404 );\r
405 }\r
406 } else {\r
407 for (SrcY = SourceY, DstY = DestinationY; SrcY < (Height + SourceY); SrcY++, DstY++) {\r
408 Offset = (DstY * Private->ModeData[CurrentMode].HorizontalResolution) + DestinationX;\r
409 if (((Offset & 0x03) == 0) && ((Width & 0x03) == 0)) {\r
410 Private->PciIo->Mem.Write (\r
411 Private->PciIo,\r
412 EfiPciIoWidthFillUint32,\r
413 0,\r
414 Offset,\r
415 Width >> 2,\r
416 &WidePixel\r
417 );\r
418 } else {\r
419 Private->PciIo->Mem.Write (\r
420 Private->PciIo,\r
421 EfiPciIoWidthFillUint8,\r
422 0,\r
423 Offset,\r
424 Width,\r
425 &Pixel\r
426 );\r
427 }\r
428 }\r
429 }\r
430 break;\r
431\r
432 case EfiBltBufferToVideo:\r
433 for (SrcY = SourceY, DstY = DestinationY; SrcY < (Height + SourceY); SrcY++, DstY++) {\r
434\r
435 for (X = 0; X < Width; X++) {\r
110d3a9a 436 Blt =\r
437 (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) (\r
438 (UINT8 *) BltBuffer +\r
439 (SrcY * Delta) +\r
440 ((SourceX + X) * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL))\r
441 );\r
442 Private->LineBuffer[X] =\r
443 RGB_BYTES_TO_PIXEL (Blt->Red, Blt->Green, Blt->Blue);\r
87f8ccbe 444 }\r
445\r
446 Offset = (DstY * Private->ModeData[CurrentMode].HorizontalResolution) + DestinationX;\r
447\r
448 if (((Offset & 0x03) == 0) && ((Width & 0x03) == 0)) {\r
449 Private->PciIo->Mem.Write (\r
450 Private->PciIo,\r
451 EfiPciIoWidthUint32,\r
452 0,\r
453 Offset,\r
454 Width >> 2,\r
455 Private->LineBuffer\r
456 );\r
457 } else {\r
458 Private->PciIo->Mem.Write (\r
459 Private->PciIo,\r
460 EfiPciIoWidthUint8,\r
461 0,\r
462 Offset,\r
463 Width,\r
464 Private->LineBuffer\r
465 );\r
466 }\r
467 }\r
468 break;\r
469 default:\r
470 ASSERT (FALSE);\r
471 }\r
472\r
473 gBS->RestoreTPL (OriginalTPL);\r
474\r
475 return EFI_SUCCESS;\r
476}\r
477\r
478EFI_STATUS\r
479CirrusLogic5430GraphicsOutputConstructor (\r
480 CIRRUS_LOGIC_5430_PRIVATE_DATA *Private\r
481 )\r
482{\r
483 EFI_STATUS Status;\r
484 EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
87f8ccbe 485\r
486\r
487 GraphicsOutput = &Private->GraphicsOutput;\r
488 GraphicsOutput->QueryMode = CirrusLogic5430GraphicsOutputQueryMode;\r
489 GraphicsOutput->SetMode = CirrusLogic5430GraphicsOutputSetMode;\r
490 GraphicsOutput->Blt = CirrusLogic5430GraphicsOutputBlt;\r
491\r
492 //\r
493 // Initialize the private data\r
494 //\r
495 Status = gBS->AllocatePool (\r
496 EfiBootServicesData,\r
497 sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE),\r
498 (VOID **) &Private->GraphicsOutput.Mode\r
499 );\r
500 if (EFI_ERROR (Status)) {\r
501 return Status;\r
502 }\r
503 Status = gBS->AllocatePool (\r
504 EfiBootServicesData,\r
505 sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION),\r
506 (VOID **) &Private->GraphicsOutput.Mode->Info\r
507 );\r
508 if (EFI_ERROR (Status)) {\r
509 return Status;\r
510 }\r
31f9e631 511 Private->GraphicsOutput.Mode->MaxMode = (UINT32) Private->MaxMode;\r
512 Private->GraphicsOutput.Mode->Mode = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;\r
513 Private->HardwareNeedsStarting = TRUE;\r
514 Private->LineBuffer = NULL;\r
87f8ccbe 515\r
516 //\r
517 // Initialize the hardware\r
518 //\r
519 GraphicsOutput->SetMode (GraphicsOutput, 0);\r
80448f6c 520 ASSERT (Private->GraphicsOutput.Mode->Mode < CIRRUS_LOGIC_5430_MODE_COUNT);\r
87f8ccbe 521 DrawLogo (\r
522 Private,\r
523 Private->ModeData[Private->GraphicsOutput.Mode->Mode].HorizontalResolution,\r
524 Private->ModeData[Private->GraphicsOutput.Mode->Mode].VerticalResolution\r
525 );\r
526\r
527 return EFI_SUCCESS;\r
528}\r
529\r
530EFI_STATUS\r
531CirrusLogic5430GraphicsOutputDestructor (\r
532 CIRRUS_LOGIC_5430_PRIVATE_DATA *Private\r
533 )\r
534/*++\r
535\r
536Routine Description:\r
537\r
538Arguments:\r
539\r
540Returns:\r
541\r
542 None\r
543\r
544--*/\r
545{\r
546 if (Private->GraphicsOutput.Mode != NULL) {\r
547 if (Private->GraphicsOutput.Mode->Info != NULL) {\r
548 gBS->FreePool (Private->GraphicsOutput.Mode->Info);\r
549 }\r
550 gBS->FreePool (Private->GraphicsOutput.Mode);\r
551 }\r
552\r
553 return EFI_SUCCESS;\r
554}\r
555\r
556\r