Home | History | Annotate | Line # | Download | only in apps
      1      1.1  jmcneill /*	$NetBSD: bltgrid.c,v 1.1.1.2 2021/09/30 18:50:09 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.1.2  jmcneill 		if (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.1.2  jmcneill 		FreePool(PixelBuffer);
     90      1.1  jmcneill 		return;
     91      1.1  jmcneill 	}
     92      1.1  jmcneill 	Print(L"Never found the active video mode?\n");
     93      1.1  jmcneill }
     94      1.1  jmcneill 
     95      1.1  jmcneill static EFI_STATUS
     96      1.1  jmcneill SetWatchdog(UINTN seconds)
     97      1.1  jmcneill {
     98      1.1  jmcneill 	EFI_STATUS rc;
     99      1.1  jmcneill 	rc = uefi_call_wrapper(BS->SetWatchdogTimer, 4, seconds, 0x1ffff,
    100      1.1  jmcneill 				0, NULL);
    101      1.1  jmcneill 	if (EFI_ERROR(rc)) {
    102      1.1  jmcneill 		CHAR16 Buffer[64];
    103      1.1  jmcneill 		StatusToString(Buffer, rc);
    104      1.1  jmcneill 		Print(L"Bad response from QueryMode: %s (%d)\n", Buffer, rc);
    105      1.1  jmcneill 	}
    106      1.1  jmcneill 	return rc;
    107      1.1  jmcneill }
    108      1.1  jmcneill 
    109      1.1  jmcneill EFI_STATUS
    110      1.1  jmcneill efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab)
    111      1.1  jmcneill {
    112      1.1  jmcneill 	EFI_STATUS rc;
    113      1.1  jmcneill 	EFI_GRAPHICS_OUTPUT_PROTOCOL *gop;
    114      1.1  jmcneill 
    115      1.1  jmcneill 	InitializeLib(image_handle, systab);
    116      1.1  jmcneill 
    117      1.1  jmcneill 	SetWatchdog(10);
    118      1.1  jmcneill 
    119      1.1  jmcneill 	rc = LibLocateProtocol(&GraphicsOutputProtocol, (void **)&gop);
    120      1.1  jmcneill 	if (EFI_ERROR(rc)) {
    121      1.1  jmcneill 		Print(L"Could not locate GOP: %r\n", rc);
    122      1.1  jmcneill 		return rc;
    123      1.1  jmcneill 	}
    124      1.1  jmcneill 
    125      1.1  jmcneill 	if (!gop) {
    126      1.1  jmcneill 		Print(L"LocateProtocol(GOP, &gop) returned %r but GOP is NULL\n", rc);
    127      1.1  jmcneill 		return EFI_UNSUPPORTED;
    128      1.1  jmcneill 	}
    129      1.1  jmcneill 
    130      1.1  jmcneill 	draw_boxes(gop);
    131      1.1  jmcneill 
    132      1.1  jmcneill 	SetWatchdog(0);
    133      1.1  jmcneill 	return EFI_SUCCESS;
    134      1.1  jmcneill }
    135