1 /** @file
2   GopBltLib - Library to perform blt using the UEFI Graphics Output Protocol.
3 
4   Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
5   This program and the accompanying materials
6   are licensed and made available under the terms and conditions of the BSD License
7   which accompanies this distribution.  The full text of the license may be found at
8   http://opensource.org/licenses/bsd-license.php
9 
10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 **/
14 
15 #include "PiDxe.h"
16 
17 #include <Protocol/GraphicsOutput.h>
18 
19 #include <Library/BaseLib.h>
20 #include <Library/BaseMemoryLib.h>
21 #include <Library/BltLib.h>
22 #include <Library/DebugLib.h>
23 #include <Library/MemoryAllocationLib.h>
24 #include <Library/UefiBootServicesTableLib.h>
25 
26 EFI_GRAPHICS_OUTPUT_PROTOCOL         *mGop = NULL;
27 
28 
29 /**
30   Configure the FrameBufferLib instance
31 
32   @param[in] FrameBuffer      Pointer to the start of the frame buffer
33   @param[in] FrameBufferInfo  Describes the frame buffer characteristics
34 
35   @retval  EFI_INVALID_PARAMETER - Invalid parameter
36   @retval  EFI_UNSUPPORTED - The BltLib does not support this configuration
37   @retval  EFI_SUCCESS - Blt operation success
38 
39 **/
40 EFI_STATUS
41 EFIAPI
BltLibConfigure(IN VOID * FrameBuffer,IN EFI_GRAPHICS_OUTPUT_MODE_INFORMATION * FrameBufferInfo)42 BltLibConfigure (
43   IN  VOID                                 *FrameBuffer,
44   IN  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *FrameBufferInfo
45   )
46 {
47   EFI_STATUS                      Status;
48   EFI_HANDLE                      *HandleBuffer;
49   UINTN                           HandleCount;
50   UINTN                           Index;
51   EFI_GRAPHICS_OUTPUT_PROTOCOL    *Gop;
52 
53   Status = gBS->LocateHandleBuffer (
54                   ByProtocol,
55                   &gEfiGraphicsOutputProtocolGuid,
56                   NULL,
57                   &HandleCount,
58                   &HandleBuffer
59                   );
60   if (!EFI_ERROR (Status)) {
61     for (Index = 0; Index < HandleCount; Index++) {
62       Status = gBS->HandleProtocol (
63                       HandleBuffer[Index],
64                       &gEfiGraphicsOutputProtocolGuid,
65                       (VOID*) &Gop
66                       );
67       if (!EFI_ERROR (Status) &&
68           (FrameBuffer == (VOID*)(UINTN) Gop->Mode->FrameBufferBase)) {
69         mGop = Gop;
70         FreePool (HandleBuffer);
71         return EFI_SUCCESS;
72       }
73     }
74 
75     FreePool (HandleBuffer);
76   }
77 
78   return EFI_UNSUPPORTED;
79 }
80 
81 
82 /**
83   Performs a UEFI Graphics Output Protocol Blt operation.
84 
85   @param[in,out] BltBuffer     - The data to transfer to screen
86   @param[in]     BltOperation  - The operation to perform
87   @param[in]     SourceX       - The X coordinate of the source for BltOperation
88   @param[in]     SourceY       - The Y coordinate of the source for BltOperation
89   @param[in]     DestinationX  - The X coordinate of the destination for BltOperation
90   @param[in]     DestinationY  - The Y coordinate of the destination for BltOperation
91   @param[in]     Width         - The width of a rectangle in the blt rectangle in pixels
92   @param[in]     Height        - The height of a rectangle in the blt rectangle in pixels
93   @param[in]     Delta         - Not used for EfiBltVideoFill and EfiBltVideoToVideo operation.
94                                  If a Delta of 0 is used, the entire BltBuffer will be operated on.
95                                  If a subrectangle of the BltBuffer is used, then Delta represents
96                                  the number of bytes in a row of the BltBuffer.
97 
98   @retval  EFI_DEVICE_ERROR - A hardware error occured
99   @retval  EFI_INVALID_PARAMETER - Invalid parameter passed in
100   @retval  EFI_SUCCESS - Blt operation success
101 
102 **/
103 EFI_STATUS
InternalGopBltCommon(IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL * BltBuffer,OPTIONAL IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,IN UINTN SourceX,IN UINTN SourceY,IN UINTN DestinationX,IN UINTN DestinationY,IN UINTN Width,IN UINTN Height,IN UINTN Delta)104 InternalGopBltCommon (
105   IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL         *BltBuffer, OPTIONAL
106   IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION     BltOperation,
107   IN  UINTN                                 SourceX,
108   IN  UINTN                                 SourceY,
109   IN  UINTN                                 DestinationX,
110   IN  UINTN                                 DestinationY,
111   IN  UINTN                                 Width,
112   IN  UINTN                                 Height,
113   IN  UINTN                                 Delta
114   )
115 {
116   if (mGop == NULL) {
117     return EFI_DEVICE_ERROR;
118   }
119 
120   return mGop->Blt (
121                  mGop,
122                  BltBuffer,
123                  BltOperation,
124                  SourceX,
125                  SourceY,
126                  DestinationX,
127                  DestinationY,
128                  Width,
129                  Height,
130                  Delta
131                  );
132 }
133 
134 
135 /**
136   Performs a UEFI Graphics Output Protocol Blt operation.
137 
138   @param[in,out] BltBuffer     - The data to transfer to screen
139   @param[in]     BltOperation  - The operation to perform
140   @param[in]     SourceX       - The X coordinate of the source for BltOperation
141   @param[in]     SourceY       - The Y coordinate of the source for BltOperation
142   @param[in]     DestinationX  - The X coordinate of the destination for BltOperation
143   @param[in]     DestinationY  - The Y coordinate of the destination for BltOperation
144   @param[in]     Width         - The width of a rectangle in the blt rectangle in pixels
145   @param[in]     Height        - The height of a rectangle in the blt rectangle in pixels
146   @param[in]     Delta         - Not used for EfiBltVideoFill and EfiBltVideoToVideo operation.
147                                  If a Delta of 0 is used, the entire BltBuffer will be operated on.
148                                  If a subrectangle of the BltBuffer is used, then Delta represents
149                                  the number of bytes in a row of the BltBuffer.
150 
151   @retval  EFI_DEVICE_ERROR - A hardware error occured
152   @retval  EFI_INVALID_PARAMETER - Invalid parameter passed in
153   @retval  EFI_SUCCESS - Blt operation success
154 
155 **/
156 EFI_STATUS
157 EFIAPI
BltLibGopBlt(IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL * BltBuffer,OPTIONAL IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,IN UINTN SourceX,IN UINTN SourceY,IN UINTN DestinationX,IN UINTN DestinationY,IN UINTN Width,IN UINTN Height,IN UINTN Delta)158 BltLibGopBlt (
159   IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL         *BltBuffer, OPTIONAL
160   IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION     BltOperation,
161   IN  UINTN                                 SourceX,
162   IN  UINTN                                 SourceY,
163   IN  UINTN                                 DestinationX,
164   IN  UINTN                                 DestinationY,
165   IN  UINTN                                 Width,
166   IN  UINTN                                 Height,
167   IN  UINTN                                 Delta
168   )
169 {
170   return InternalGopBltCommon (
171            BltBuffer,
172            BltOperation,
173            SourceX,
174            SourceY,
175            DestinationX,
176            DestinationY,
177            Width,
178            Height,
179            Delta
180            );
181 }
182 
183 
184 /**
185   Performs a UEFI Graphics Output Protocol Blt Video Fill.
186 
187   @param[in]  Color         Color to fill the region with
188   @param[in]  DestinationX  X location to start fill operation
189   @param[in]  DestinationY  Y location to start fill operation
190   @param[in]  Width         Width (in pixels) to fill
191   @param[in]  Height        Height to fill
192 
193   @retval  EFI_DEVICE_ERROR - A hardware error occured
194   @retval  EFI_INVALID_PARAMETER - Invalid parameter passed in
195   @retval  EFI_SUCCESS - The sizes were returned
196 
197 **/
198 EFI_STATUS
199 EFIAPI
BltLibVideoFill(IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL * Color,IN UINTN DestinationX,IN UINTN DestinationY,IN UINTN Width,IN UINTN Height)200 BltLibVideoFill (
201   IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL         *Color,
202   IN  UINTN                                 DestinationX,
203   IN  UINTN                                 DestinationY,
204   IN  UINTN                                 Width,
205   IN  UINTN                                 Height
206   )
207 {
208   return InternalGopBltCommon (
209            Color,
210            EfiBltVideoFill,
211            0,
212            0,
213            DestinationX,
214            DestinationY,
215            Width,
216            Height,
217            0
218            );
219 }
220 
221 
222 /**
223   Performs a UEFI Graphics Output Protocol Blt Video to Buffer operation.
224 
225   @param[out] BltBuffer     Output buffer for pixel color data
226   @param[in]  SourceX       X location within video
227   @param[in]  SourceY       Y location within video
228   @param[in]  Width         Width (in pixels)
229   @param[in]  Height        Height
230 
231   @retval  EFI_DEVICE_ERROR - A hardware error occured
232   @retval  EFI_INVALID_PARAMETER - Invalid parameter passed in
233   @retval  EFI_SUCCESS - The sizes were returned
234 
235 **/
236 EFI_STATUS
237 EFIAPI
BltLibVideoToBltBuffer(OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL * BltBuffer,IN UINTN SourceX,IN UINTN SourceY,IN UINTN Width,IN UINTN Height)238 BltLibVideoToBltBuffer (
239   OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL         *BltBuffer,
240   IN  UINTN                                 SourceX,
241   IN  UINTN                                 SourceY,
242   IN  UINTN                                 Width,
243   IN  UINTN                                 Height
244   )
245 {
246   return InternalGopBltCommon (
247            BltBuffer,
248            EfiBltVideoToBltBuffer,
249            SourceX,
250            SourceY,
251            0,
252            0,
253            Width,
254            Height,
255            0
256            );
257 }
258 
259 
260 /**
261   Performs a UEFI Graphics Output Protocol Blt Video to Buffer operation
262   with extended parameters.
263 
264   @param[out] BltBuffer     Output buffer for pixel color data
265   @param[in]  SourceX       X location within video
266   @param[in]  SourceY       Y location within video
267   @param[in]  DestinationX  X location within BltBuffer
268   @param[in]  DestinationY  Y location within BltBuffer
269   @param[in]  Width         Width (in pixels)
270   @param[in]  Height        Height
271   @param[in]  Delta         Number of bytes in a row of BltBuffer
272 
273   @retval  EFI_DEVICE_ERROR - A hardware error occured
274   @retval  EFI_INVALID_PARAMETER - Invalid parameter passed in
275   @retval  EFI_SUCCESS - The sizes were returned
276 
277 **/
278 EFI_STATUS
279 EFIAPI
BltLibVideoToBltBufferEx(OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL * BltBuffer,IN UINTN SourceX,IN UINTN SourceY,IN UINTN DestinationX,IN UINTN DestinationY,IN UINTN Width,IN UINTN Height,IN UINTN Delta)280 BltLibVideoToBltBufferEx (
281   OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL         *BltBuffer,
282   IN  UINTN                                 SourceX,
283   IN  UINTN                                 SourceY,
284   IN  UINTN                                 DestinationX,
285   IN  UINTN                                 DestinationY,
286   IN  UINTN                                 Width,
287   IN  UINTN                                 Height,
288   IN  UINTN                                 Delta
289   )
290 {
291   return InternalGopBltCommon (
292            BltBuffer,
293            EfiBltVideoToBltBuffer,
294            SourceX,
295            SourceY,
296            DestinationX,
297            DestinationY,
298            Width,
299            Height,
300            Delta
301            );
302 }
303 
304 
305 /**
306   Performs a UEFI Graphics Output Protocol Blt Buffer to Video operation.
307 
308   @param[in]  BltBuffer     Output buffer for pixel color data
309   @param[in]  DestinationX  X location within video
310   @param[in]  DestinationY  Y location within video
311   @param[in]  Width         Width (in pixels)
312   @param[in]  Height        Height
313 
314   @retval  EFI_DEVICE_ERROR - A hardware error occured
315   @retval  EFI_INVALID_PARAMETER - Invalid parameter passed in
316   @retval  EFI_SUCCESS - The sizes were returned
317 
318 **/
319 EFI_STATUS
320 EFIAPI
BltLibBufferToVideo(IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL * BltBuffer,IN UINTN DestinationX,IN UINTN DestinationY,IN UINTN Width,IN UINTN Height)321 BltLibBufferToVideo (
322   IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL         *BltBuffer,
323   IN  UINTN                                 DestinationX,
324   IN  UINTN                                 DestinationY,
325   IN  UINTN                                 Width,
326   IN  UINTN                                 Height
327   )
328 {
329   return InternalGopBltCommon (
330            BltBuffer,
331            EfiBltBufferToVideo,
332            0,
333            0,
334            DestinationX,
335            DestinationY,
336            Width,
337            Height,
338            0
339            );
340 }
341 
342 
343 /**
344   Performs a UEFI Graphics Output Protocol Blt Buffer to Video operation
345   with extended parameters.
346 
347   @param[in]  BltBuffer     Output buffer for pixel color data
348   @param[in]  SourceX       X location within BltBuffer
349   @param[in]  SourceY       Y location within BltBuffer
350   @param[in]  DestinationX  X location within video
351   @param[in]  DestinationY  Y location within video
352   @param[in]  Width         Width (in pixels)
353   @param[in]  Height        Height
354   @param[in]  Delta         Number of bytes in a row of BltBuffer
355 
356   @retval  EFI_DEVICE_ERROR - A hardware error occured
357   @retval  EFI_INVALID_PARAMETER - Invalid parameter passed in
358   @retval  EFI_SUCCESS - The sizes were returned
359 
360 **/
361 EFI_STATUS
362 EFIAPI
BltLibBufferToVideoEx(IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL * BltBuffer,IN UINTN SourceX,IN UINTN SourceY,IN UINTN DestinationX,IN UINTN DestinationY,IN UINTN Width,IN UINTN Height,IN UINTN Delta)363 BltLibBufferToVideoEx (
364   IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL         *BltBuffer,
365   IN  UINTN                                 SourceX,
366   IN  UINTN                                 SourceY,
367   IN  UINTN                                 DestinationX,
368   IN  UINTN                                 DestinationY,
369   IN  UINTN                                 Width,
370   IN  UINTN                                 Height,
371   IN  UINTN                                 Delta
372   )
373 {
374   return InternalGopBltCommon (
375            BltBuffer,
376            EfiBltBufferToVideo,
377            SourceX,
378            SourceY,
379            DestinationX,
380            DestinationY,
381            Width,
382            Height,
383            Delta
384            );
385 }
386 
387 
388 /**
389   Performs a UEFI Graphics Output Protocol Blt Video to Video operation
390 
391   @param[in]  SourceX       X location within video
392   @param[in]  SourceY       Y location within video
393   @param[in]  DestinationX  X location within video
394   @param[in]  DestinationY  Y location within video
395   @param[in]  Width         Width (in pixels)
396   @param[in]  Height        Height
397 
398   @retval  EFI_DEVICE_ERROR - A hardware error occured
399   @retval  EFI_INVALID_PARAMETER - Invalid parameter passed in
400   @retval  EFI_SUCCESS - The sizes were returned
401 
402 **/
403 EFI_STATUS
404 EFIAPI
BltLibVideoToVideo(IN UINTN SourceX,IN UINTN SourceY,IN UINTN DestinationX,IN UINTN DestinationY,IN UINTN Width,IN UINTN Height)405 BltLibVideoToVideo (
406   IN  UINTN                                 SourceX,
407   IN  UINTN                                 SourceY,
408   IN  UINTN                                 DestinationX,
409   IN  UINTN                                 DestinationY,
410   IN  UINTN                                 Width,
411   IN  UINTN                                 Height
412   )
413 {
414   return InternalGopBltCommon (
415            NULL,
416            EfiBltVideoToVideo,
417            SourceX,
418            SourceY,
419            DestinationX,
420            DestinationY,
421            Width,
422            Height,
423            0
424            );
425 }
426 
427 /**
428   Returns the sizes related to the video device
429 
430   @param[out]  Width   Width (in pixels)
431   @param[out]  Height  Height (in pixels)
432 
433   @retval  EFI_INVALID_PARAMETER - Invalid parameter passed in
434   @retval  EFI_SUCCESS - The sizes were returned
435 
436 **/
437 EFI_STATUS
438 EFIAPI
BltLibGetSizes(OUT UINTN * Width,OPTIONAL OUT UINTN * Height OPTIONAL)439 BltLibGetSizes (
440   OUT UINTN                                 *Width,  OPTIONAL
441   OUT UINTN                                 *Height  OPTIONAL
442   )
443 {
444   ASSERT (mGop != NULL);
445 
446   if (Width != NULL) {
447     *Width = mGop->Mode->Info->HorizontalResolution;
448   }
449   if (Height != NULL) {
450     *Height = mGop->Mode->Info->VerticalResolution;
451   }
452 
453   return EFI_SUCCESS;
454 }
455 
456