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