bltgrid.c revision 1.1 1 1.1 jmcneill /* $NetBSD: bltgrid.c,v 1.1 2018/08/16 18:17:47 jmcneill Exp $ */
2 1.1 jmcneill
3 1.1 jmcneill #include <efi.h>
4 1.1 jmcneill #include <efilib.h>
5 1.1 jmcneill
6 1.1 jmcneill extern EFI_GUID GraphicsOutputProtocol;
7 1.1 jmcneill
8 1.1 jmcneill static void
9 1.1 jmcneill fill_boxes(UINT32 *PixelBuffer, UINT32 Width, UINT32 Height)
10 1.1 jmcneill {
11 1.1 jmcneill UINT32 y, x = 0;
12 1.1 jmcneill /*
13 1.1 jmcneill * This assums BGRR, but it doesn't really matter; we pick red and
14 1.1 jmcneill * green so it'll just be blue/green if the pixel format is backwards.
15 1.1 jmcneill */
16 1.1 jmcneill EFI_GRAPHICS_OUTPUT_BLT_PIXEL Red = {0, 0, 0xff, 0},
17 1.1 jmcneill Green = {0, 0xff, 0, 0},
18 1.1 jmcneill *Color;
19 1.1 jmcneill
20 1.1 jmcneill for (y = 0; y < Height; y++) {
21 1.1 jmcneill Color = ((y / 32) % 2 == 0) ? &Red : &Green;
22 1.1 jmcneill for (x = 0; x < Width; x++) {
23 1.1 jmcneill if (x % 32 == 0 && x != 0)
24 1.1 jmcneill Color = (Color == &Red) ? &Green : &Red;
25 1.1 jmcneill PixelBuffer[y * Width + x] = *(UINT32 *)Color;
26 1.1 jmcneill }
27 1.1 jmcneill }
28 1.1 jmcneill }
29 1.1 jmcneill
30 1.1 jmcneill static void
31 1.1 jmcneill draw_boxes(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop)
32 1.1 jmcneill {
33 1.1 jmcneill int i, imax;
34 1.1 jmcneill EFI_STATUS rc;
35 1.1 jmcneill EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info;
36 1.1 jmcneill UINTN NumPixels;
37 1.1 jmcneill UINT32 *PixelBuffer;
38 1.1 jmcneill UINT32 BufferSize;
39 1.1 jmcneill
40 1.1 jmcneill if (gop->Mode) {
41 1.1 jmcneill imax = gop->Mode->MaxMode;
42 1.1 jmcneill } else {
43 1.1 jmcneill Print(L"gop->Mode is NULL\n");
44 1.1 jmcneill return;
45 1.1 jmcneill }
46 1.1 jmcneill
47 1.1 jmcneill for (i = 0; i < imax; i++) {
48 1.1 jmcneill UINTN SizeOfInfo;
49 1.1 jmcneill rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i, &SizeOfInfo,
50 1.1 jmcneill &info);
51 1.1 jmcneill if (EFI_ERROR(rc) && rc == EFI_NOT_STARTED) {
52 1.1 jmcneill Print(L"gop->QueryMode() returned %r\n", rc);
53 1.1 jmcneill Print(L"Trying to start GOP with SetMode().\n");
54 1.1 jmcneill rc = uefi_call_wrapper(gop->SetMode, 2, gop,
55 1.1 jmcneill gop->Mode ? gop->Mode->Mode : 0);
56 1.1 jmcneill rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i,
57 1.1 jmcneill &SizeOfInfo, &info);
58 1.1 jmcneill }
59 1.1 jmcneill
60 1.1 jmcneill if (EFI_ERROR(rc)) {
61 1.1 jmcneill Print(L"%d: Bad response from QueryMode: %r (%d)\n",
62 1.1 jmcneill i, rc, rc);
63 1.1 jmcneill continue;
64 1.1 jmcneill }
65 1.1 jmcneill
66 1.1 jmcneill if (CompareMem(info, gop->Mode->Info, sizeof (*info)))
67 1.1 jmcneill continue;
68 1.1 jmcneill
69 1.1 jmcneill NumPixels = info->VerticalResolution * info->HorizontalResolution;
70 1.1 jmcneill BufferSize = NumPixels * sizeof(UINT32);
71 1.1 jmcneill
72 1.1 jmcneill PixelBuffer = AllocatePool(BufferSize);
73 1.1 jmcneill if (!PixelBuffer) {
74 1.1 jmcneill Print(L"Allocation of 0x%08lx bytes failed.\n",
75 1.1 jmcneill sizeof(UINT32) * NumPixels);
76 1.1 jmcneill return;
77 1.1 jmcneill }
78 1.1 jmcneill
79 1.1 jmcneill fill_boxes(PixelBuffer,
80 1.1 jmcneill info->HorizontalResolution, info->VerticalResolution);
81 1.1 jmcneill
82 1.1 jmcneill uefi_call_wrapper(gop->Blt, 10, gop,
83 1.1 jmcneill (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)PixelBuffer,
84 1.1 jmcneill EfiBltBufferToVideo,
85 1.1 jmcneill 0, 0, 0, 0,
86 1.1 jmcneill info->HorizontalResolution,
87 1.1 jmcneill info->VerticalResolution,
88 1.1 jmcneill 0);
89 1.1 jmcneill return;
90 1.1 jmcneill }
91 1.1 jmcneill Print(L"Never found the active video mode?\n");
92 1.1 jmcneill }
93 1.1 jmcneill
94 1.1 jmcneill static EFI_STATUS
95 1.1 jmcneill SetWatchdog(UINTN seconds)
96 1.1 jmcneill {
97 1.1 jmcneill EFI_STATUS rc;
98 1.1 jmcneill rc = uefi_call_wrapper(BS->SetWatchdogTimer, 4, seconds, 0x1ffff,
99 1.1 jmcneill 0, NULL);
100 1.1 jmcneill if (EFI_ERROR(rc)) {
101 1.1 jmcneill CHAR16 Buffer[64];
102 1.1 jmcneill StatusToString(Buffer, rc);
103 1.1 jmcneill Print(L"Bad response from QueryMode: %s (%d)\n", Buffer, rc);
104 1.1 jmcneill }
105 1.1 jmcneill return rc;
106 1.1 jmcneill }
107 1.1 jmcneill
108 1.1 jmcneill EFI_STATUS
109 1.1 jmcneill efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab)
110 1.1 jmcneill {
111 1.1 jmcneill EFI_STATUS rc;
112 1.1 jmcneill EFI_GRAPHICS_OUTPUT_PROTOCOL *gop;
113 1.1 jmcneill
114 1.1 jmcneill InitializeLib(image_handle, systab);
115 1.1 jmcneill
116 1.1 jmcneill SetWatchdog(10);
117 1.1 jmcneill
118 1.1 jmcneill rc = LibLocateProtocol(&GraphicsOutputProtocol, (void **)&gop);
119 1.1 jmcneill if (EFI_ERROR(rc)) {
120 1.1 jmcneill Print(L"Could not locate GOP: %r\n", rc);
121 1.1 jmcneill return rc;
122 1.1 jmcneill }
123 1.1 jmcneill
124 1.1 jmcneill if (!gop) {
125 1.1 jmcneill Print(L"LocateProtocol(GOP, &gop) returned %r but GOP is NULL\n", rc);
126 1.1 jmcneill return EFI_UNSUPPORTED;
127 1.1 jmcneill }
128 1.1 jmcneill
129 1.1 jmcneill draw_boxes(gop);
130 1.1 jmcneill
131 1.1 jmcneill SetWatchdog(0);
132 1.1 jmcneill return EFI_SUCCESS;
133 1.1 jmcneill }
134