From: Tobias Heider Subject: Re: arm64 bootstrap: support BPP16 EFI framebuffer To: Paul Fertser Cc: patrick@openbsd.org, kettenis@openbsd.org, tech@openbsd.org Date: Tue, 12 Nov 2024 15:12:57 +0100 On Sun, Nov 03, 2024 at 03:11:21AM GMT, Paul Fertser wrote: > Hi, > > This change adds support for the only 16-bit colour framebuffer format > offered by U-Boot[0]. > > Tested on RK3399-based Pineboook Pro with RAMDISK config. Thanks, looks good to me! Happy to commit it for you if we find another ok. > > [0] https://source.denx.de/u-boot/u-boot/-/blob/master/lib/efi_loader/efi_gop.c?ref_type=heads#L544 > > diff --git sys/arch/arm64/stand/efiboot/efiboot.c sys/arch/arm64/stand/efiboot/efiboot.c > index 07e04c331..83be3f249 100644 > --- sys/arch/arm64/stand/efiboot/efiboot.c > +++ sys/arch/arm64/stand/efiboot/efiboot.c > @@ -397,7 +397,7 @@ efi_framebuffer(void) > uint32_t acells, scells; > uint64_t base, size; > uint32_t reg[4]; > - uint32_t width, height, stride; > + uint32_t width, height, stride, pxsize; > char *format; > char *prop; > > @@ -443,15 +443,31 @@ efi_framebuffer(void) > if (gop == NULL || gop->Mode == NULL || gop->Mode->Info == NULL) > return; > > - /* We only support 32-bit pixel modes for now. */ > switch (gop->Mode->Info->PixelFormat) { > case PixelRedGreenBlueReserved8BitPerColor: > format = "x8b8g8r8"; > + pxsize = 4; > break; > case PixelBlueGreenRedReserved8BitPerColor: > format = "x8r8g8b8"; > + pxsize = 4; > break; > + case PixelBitMask: { > + EFI_PIXEL_BITMASK *bm = &gop->Mode->Info->PixelInformation; > + if (bm->RedMask == 0xf800 && > + bm->GreenMask == 0x07e0 && > + bm->BlueMask == 0x001f) { > + format = "r5g6b5"; > + pxsize = 2; > + break; > + } > + printf("Unsupported PixelInformation bitmasks\n"); > + /* FALLTHROUGH */ > + } > default: > + printf("Unsupported PixelFormat %d, not adding " > + "\"simple-framebuffer\" DT node\n", > + gop->Mode->Info->PixelFormat); > return; > } > > @@ -459,7 +475,7 @@ efi_framebuffer(void) > size = gop->Mode->FrameBufferSize; > width = htobe32(gop->Mode->Info->HorizontalResolution); > height = htobe32(gop->Mode->Info->VerticalResolution); > - stride = htobe32(gop->Mode->Info->PixelsPerScanLine * 4); > + stride = htobe32(gop->Mode->Info->PixelsPerScanLine * pxsize); > > node = fdt_find_node("/"); > if (fdt_node_property_int(node, "#address-cells", &acells) != 1) >