Index | Thread | Search

From:
Tobias Heider <tobhe@openbsd.org>
Subject:
Re: arm64 bootstrap: support BPP16 EFI framebuffer
To:
Paul Fertser <fercerpav@gmail.com>
Cc:
patrick@openbsd.org, kettenis@openbsd.org, tech@openbsd.org
Date:
Tue, 12 Nov 2024 15:12:57 +0100

Download raw body.

Thread
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)
>