loader.efi: probe for UGA if GOP isn't found

Probe for UGA instead of returning early if we can't find GOP.

Reviewed by:	tsoome
PR:		291935
MFC after:	1 week
Differential Revision:	https://reviews.freebsd.org/D54431
This commit is contained in:
Ahmad Khalifa
2026-01-04 15:15:02 +02:00
parent b1bef9f7e0
commit 5d85dde27b
+41 -39
View File
@@ -590,46 +590,8 @@ efi_find_framebuffer(teken_gfx_t *gfx_state)
if (EFI_ERROR(status))
free(hlist);
}
if (EFI_ERROR(status))
return (efi_status_to_errno(status));
nhandles = hsize / sizeof(*hlist);
/*
* Search for ConOut protocol, if not found, use first handle.
*/
gop_handle = NULL;
for (i = 0; i < nhandles; i++) {
EFI_GRAPHICS_OUTPUT_PROTOCOL *tgop;
void *dummy;
status = OpenProtocolByHandle(hlist[i], &gop_guid, (void **)&tgop);
if (status != EFI_SUCCESS)
continue;
if (tgop->Mode->Info->PixelFormat == PixelBltOnly ||
tgop->Mode->Info->PixelFormat >= PixelFormatMax)
continue;
status = OpenProtocolByHandle(hlist[i], &conout_guid, &dummy);
if (status == EFI_SUCCESS) {
gop_handle = hlist[i];
gop = tgop;
break;
} else if (gop_handle == NULL) {
gop_handle = hlist[i];
gop = tgop;
}
}
free(hlist);
if (gop_handle != NULL) {
gfx_state->tg_fb_type = FB_GOP;
gfx_state->tg_private = gop;
if (edid_info == NULL)
edid_info = efifb_gop_get_edid(gop_handle);
} else {
if (EFI_ERROR(status)) {
status = BS->LocateProtocol(&uga_guid, NULL, (VOID **)&uga);
if (status == EFI_SUCCESS) {
gfx_state->tg_fb_type = FB_UGA;
@@ -637,6 +599,46 @@ efi_find_framebuffer(teken_gfx_t *gfx_state)
} else {
return (efi_status_to_errno(status));
}
} else {
nhandles = hsize / sizeof(*hlist);
/*
* Search for ConOut protocol, if not found, use first handle.
*/
gop_handle = NULL;
for (i = 0; i < nhandles; i++) {
EFI_GRAPHICS_OUTPUT_PROTOCOL *tgop;
void *dummy;
status = OpenProtocolByHandle(hlist[i], &gop_guid,
(void **)&tgop);
if (status != EFI_SUCCESS)
continue;
if (tgop->Mode->Info->PixelFormat == PixelBltOnly ||
tgop->Mode->Info->PixelFormat >= PixelFormatMax)
continue;
status = OpenProtocolByHandle(hlist[i], &conout_guid,
&dummy);
if (status == EFI_SUCCESS) {
gop_handle = hlist[i];
gop = tgop;
break;
} else if (gop_handle == NULL) {
gop_handle = hlist[i];
gop = tgop;
}
}
free(hlist);
if (gop_handle == NULL)
return (ENXIO);
gfx_state->tg_fb_type = FB_GOP;
gfx_state->tg_private = gop;
if (edid_info == NULL)
edid_info = efifb_gop_get_edid(gop_handle);
}
switch (gfx_state->tg_fb_type) {