42 EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;
45 EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
51 Status =
gBS->HandleProtocol (
63 "GOP #%u of total %u, %a - %r\n",
64 (UINT32)(GopIndex + 1),
66 gST->ConsoleOutHandle ==
Handle ?
"console" :
"auxiliary",
69 DEBUG ((DEBUG_WARN,
"GSTT: %a", Tmp));
70 AsciiStrCatS (Report, EFI_PAGE_SIZE, Tmp);
72 if (EFI_ERROR (Status)) {
79 "Current mode %u, max mode %u, FB: %p, FBS: %LX\n",
82 (UINT64)Gop->Mode->FrameBufferBase,
83 (UINT32)Gop->Mode->FrameBufferSize
85 DEBUG ((DEBUG_WARN,
"GSTT: %a", Tmp));
86 AsciiStrCatS (Report, EFI_PAGE_SIZE, Tmp);
88 Info = Gop->Mode->Info;
92 "Current: %u x %u, pixel %d (%X %X %X %X), scan: %u\n",
93 Info->HorizontalResolution,
94 Info->VerticalResolution,
96 Info->PixelInformation.RedMask,
97 Info->PixelInformation.GreenMask,
98 Info->PixelInformation.BlueMask,
99 Info->PixelInformation.ReservedMask,
100 Info->PixelsPerScanLine
102 DEBUG ((DEBUG_WARN,
"GSTT: %a", Tmp));
103 AsciiStrCatS (Report, EFI_PAGE_SIZE, Tmp);
109 for (Index = 0; Index < Gop->Mode->MaxMode; ++Index) {
110 Status = Gop->QueryMode (
117 if (EFI_ERROR (Status)) {
125 DEBUG ((DEBUG_WARN,
"GSTT: %a", Tmp));
126 AsciiStrCatS (Report, EFI_PAGE_SIZE, Tmp);
133 "%u: %u x %u, pixel %d (%X %X %X %X), scan: %u\n",
135 Info->HorizontalResolution,
136 Info->VerticalResolution,
138 Info->PixelInformation.RedMask,
139 Info->PixelInformation.GreenMask,
140 Info->PixelInformation.BlueMask,
141 Info->PixelInformation.ReservedMask,
142 Info->PixelsPerScanLine
144 DEBUG ((DEBUG_WARN,
"GSTT: %a", Tmp));
145 AsciiStrCatS (Report, EFI_PAGE_SIZE, Tmp);
147 if ( (Info->HorizontalResolution > Width)
148 || ((Info->HorizontalResolution == Width) && (Info->VerticalResolution > Height)))
150 Width = Info->HorizontalResolution;
151 Height = Info->VerticalResolution;
152 NewMode = (INTN)Index;
159 Status = Gop->SetMode (
164 Info = Gop->Mode->Info;
168 "New %u <-> %u: max mode %u, FB: %p, FBS: %LX - %r\n",
172 (UINT64)Gop->Mode->FrameBufferBase,
173 (UINT32)Gop->Mode->FrameBufferSize,
176 DEBUG ((DEBUG_WARN,
"GSTT: %a", Tmp));
177 AsciiStrCatS (Report, EFI_PAGE_SIZE, Tmp);
181 "New %u <-> %u: %u x %u, pixel %d (%X %X %X %X), scan: %u\n",
184 Info->HorizontalResolution,
185 Info->VerticalResolution,
187 Info->PixelInformation.RedMask,
188 Info->PixelInformation.GreenMask,
189 Info->PixelInformation.BlueMask,
190 Info->PixelInformation.ReservedMask,
191 Info->PixelsPerScanLine
193 DEBUG ((DEBUG_WARN,
"GSTT: %a", Tmp));
194 AsciiStrCatS (Report, EFI_PAGE_SIZE, Tmp);
205 EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;
213 Status =
gBS->HandleProtocol (
219 if ( EFI_ERROR (Status)
220 || (Gop->Mode->Info->HorizontalResolution == 0)
221 || (Gop->Mode->Info->VerticalResolution == 0))
230 { 0x00, 0x00, 0x00, 0x00 },
231 { 0x98, 0x00, 0x00, 0x00 },
232 { 0x00, 0x98, 0x00, 0x00 },
233 { 0x98, 0x98, 0x00, 0x00 },
234 { 0x00, 0x00, 0x98, 0x00 },
235 { 0x98, 0x00, 0x98, 0x00 },
236 { 0x00, 0x98, 0x98, 0x00 },
237 { 0x98, 0x98, 0x98, 0x00 },
238 { 0x30, 0x30, 0x30, 0x00 },
239 { 0xff, 0x00, 0x00, 0x00 },
240 { 0x00, 0xff, 0x00, 0x00 },
241 { 0xff, 0xff, 0x00, 0x00 },
242 { 0x00, 0x00, 0xff, 0x00 },
243 { 0xff, 0x00, 0xff, 0x00 },
244 { 0x00, 0xff, 0xff, 0x00 },
245 { 0xff, 0xff, 0xff, 0x00 }
248 STATIC UINT32 mColorsTest[9] = { 12, 10, 9, 15, 7, 0, 11, 5, 14 };
250 if (Gop->Mode->FrameBufferBase != 0) {
255 (VOID *)(UINTN)Gop->Mode->FrameBufferBase,
256 Gop->Mode->Info->VerticalResolution * Gop->Mode->Info->PixelsPerScanLine * sizeof (UINT32),
264 for (Index = 0; Index < 5; ++Index) {
273 ChunkW = Gop->Mode->Info->HorizontalResolution / 2;
274 ChunkH = Gop->Mode->Info->VerticalResolution / 2;
276 for (ChunkY = 0; ChunkY + ChunkH <= Gop->Mode->Info->VerticalResolution; ChunkY += ChunkH) {
277 for (ChunkX = 0; ChunkX + ChunkW <= Gop->Mode->Info->HorizontalResolution; ChunkX += ChunkW) {
298 for (Index = 0; Index < 5; ++Index) {
325 ChunkW = Gop->Mode->Info->HorizontalResolution / 3;
326 ChunkH = Gop->Mode->Info->VerticalResolution / 3;
328 for (ChunkY = 0; ChunkY + ChunkH <= Gop->Mode->Info->VerticalResolution; ChunkY += ChunkH) {
329 for (ChunkX = 0; ChunkX + ChunkW <= Gop->Mode->Info->HorizontalResolution; ChunkX += ChunkW) {
350 for (Index = 0; Index < 5; ++Index) {
358 IN EFI_HANDLE ImageHandle,
359 IN EFI_SYSTEM_TABLE *SystemTable
364 EFI_HANDLE *HandleBuffer;
367 CHAR8 (*Reports)[EFI_PAGE_SIZE];
375 gBS->SetWatchdogTimer (0, 0, 0, NULL);
381 Status =
gBS->LocateHandleBuffer (
391 "GSTT: Found %u handles with GOP protocol - %r\n",
396 if (EFI_ERROR (Status)) {
403 Reports = AllocateZeroPool (EFI_PAGE_SIZE * HandleCount);
404 if (Reports == NULL) {
405 DEBUG ((DEBUG_WARN,
"GSTT: Cannot allocate memory for GOP reports\n"));
406 FreePool (HandleBuffer);
407 return EFI_OUT_OF_RESOURCES;
413 for (Index = 0; Index < HandleCount; ++Index) {
420 FinalReport = AllocateZeroPool (EFI_PAGE_SIZE * HandleCount);
421 if (FinalReport != NULL) {
422 for (Index = 0; Index < HandleCount; ++Index) {
423 AsciiStrCatS (FinalReport, EFI_PAGE_SIZE * HandleCount, Reports[Index]);
424 AsciiStrCatS (FinalReport, EFI_PAGE_SIZE * HandleCount,
"\n\n");
427 Status =
gRT->GetTime (&Date, NULL);
428 if (EFI_ERROR (Status)) {
429 ZeroMem (&Date,
sizeof (Date));
435 L
"gop-%04u-%02u-%02u-%02u%02u%02u.txt",
444 OcSetFileData (NULL, Filename, FinalReport, (UINT32)AsciiStrLen (FinalReport));
446 FreePool (FinalReport);
448 DEBUG ((DEBUG_WARN,
"GSTT: Cannot allocate memory for final report\n"));
454 for (Index = 0; Index < HandleCount; ++Index) {
459 FreePool (HandleBuffer);
STATIC UINT32 mGraphicsEfiColors[16]