Imported Upstream version 3.0
[platform/upstream/gnu-efi.git] / apps / modelist.c
1 #include <efi.h>
2 #include <efilib.h>
3
4 extern EFI_GUID GraphicsOutputProtocol;
5
6 static int memcmp(const void *s1, const void *s2, UINTN n)
7 {
8         const unsigned char *c1 = s1, *c2 = s2;
9         int d = 0;
10
11         if (!s1 && !s2)
12                 return 0;
13         if (s1 && !s2)
14                 return 1;
15         if (!s1 && s2)
16                 return -1;
17
18         while (n--) {
19                 d = (int)*c1++ - (int)*c2++;
20                 if (d)
21                         break;
22         }
23         return d;
24 }
25
26 static void
27 print_modes(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop)
28 {
29         int i, imax;
30         EFI_STATUS rc;
31
32         imax = gop->Mode->MaxMode;
33
34         Print(L"GOP reports MaxMode %d\n", imax);
35         for (i = 0; i < imax; i++) {
36                 EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info;
37                 UINTN SizeOfInfo;
38                 rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i, &SizeOfInfo,
39                                         &info);
40                 if (EFI_ERROR(rc) && rc == EFI_NOT_STARTED) {
41                         rc = uefi_call_wrapper(gop->SetMode, 2, gop,
42                                 gop->Mode->Mode);
43                         rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i,
44                                 &SizeOfInfo, &info);
45                 }
46
47                 if (EFI_ERROR(rc)) {
48                         CHAR16 Buffer[64];
49                         StatusToString(Buffer, rc);
50                         Print(L"%d: Bad response from QueryMode: %s (%d)\n",
51                                 i, Buffer, rc);
52                         continue;
53                 }
54                 Print(L"%c%d: %dx%d ", memcmp(info,gop->Mode->Info,sizeof(*info)) == 0 ? '*' : ' ', i,
55                         info->HorizontalResolution,
56                         info->VerticalResolution);
57                 switch(info->PixelFormat) {
58                         case PixelRedGreenBlueReserved8BitPerColor:
59                                 Print(L"RGBR");
60                                 break;
61                         case PixelBlueGreenRedReserved8BitPerColor:
62                                 Print(L"BGRR");
63                                 break;
64                         case PixelBitMask:
65                                 Print(L"R:%08x G:%08x B:%08x X:%08x",
66                                         info->PixelInformation.RedMask,
67                                         info->PixelInformation.GreenMask,
68                                         info->PixelInformation.BlueMask,
69                                         info->PixelInformation.ReservedMask);
70                                 break;
71                         case PixelBltOnly:
72                                 Print(L"(blt only)");
73                                 break;
74                         default:
75                                 Print(L"(Invalid pixel format)");
76                                 break;
77                 }
78                 Print(L" pitch %d\n", info->PixelsPerScanLine);
79         }
80 }
81
82 static EFI_STATUS
83 SetWatchdog(UINTN seconds)
84 {
85         EFI_STATUS rc;
86         rc = uefi_call_wrapper(BS->SetWatchdogTimer, 4, seconds, 0x1ffff,
87                                 0, NULL);
88         if (EFI_ERROR(rc)) {
89                 CHAR16 Buffer[64];
90                 StatusToString(Buffer, rc);
91                 Print(L"Bad response from QueryMode: %s (%d)\n", Buffer, rc);
92         }
93         return rc;
94 }
95
96 EFI_STATUS
97 efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab)
98 {
99         EFI_STATUS rc;
100         EFI_GRAPHICS_OUTPUT_PROTOCOL *gop;
101
102         InitializeLib(image_handle, systab);
103
104         SetWatchdog(10);
105
106         rc = LibLocateProtocol(&GraphicsOutputProtocol, (void **)&gop);
107         if (EFI_ERROR(rc))
108                 return rc;
109
110         print_modes(gop);
111
112         SetWatchdog(0);
113         return EFI_SUCCESS;
114 }