summaryrefslogtreecommitdiff
path: root/stand
diff options
context:
space:
mode:
authorAhmad Khalifa <vexeduxr@FreeBSD.org>2026-01-04 15:15:02 +0200
committerAhmad Khalifa <vexeduxr@FreeBSD.org>2026-01-04 15:15:02 +0200
commit5d85dde27b4769604fc108b89328607e70e767ed (patch)
tree05cc27af37d16b3a31469f666e62037ae21c0993 /stand
parentb1bef9f7e0e182a9eee222639ffc8af4883ec0fa (diff)
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
Diffstat (limited to 'stand')
-rw-r--r--stand/efi/loader/framebuffer.c74
1 files changed, 38 insertions, 36 deletions
diff --git a/stand/efi/loader/framebuffer.c b/stand/efi/loader/framebuffer.c
index 08834aa7106b..dc0047de1116 100644
--- a/stand/efi/loader/framebuffer.c
+++ b/stand/efi/loader/framebuffer.c
@@ -590,53 +590,55 @@ 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;
+ if (EFI_ERROR(status)) {
+ status = BS->LocateProtocol(&uga_guid, NULL, (VOID **)&uga);
+ if (status == EFI_SUCCESS) {
+ gfx_state->tg_fb_type = FB_UGA;
+ gfx_state->tg_private = uga;
+ } else {
+ return (efi_status_to_errno(status));
+ }
+ } else {
+ nhandles = hsize / sizeof(*hlist);
- status = OpenProtocolByHandle(hlist[i], &gop_guid, (void **)&tgop);
- if (status != EFI_SUCCESS)
- continue;
+ /*
+ * 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;
+ 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;
+ 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);
+ free(hlist);
+ if (gop_handle == NULL)
+ return (ENXIO);
- 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 {
- status = BS->LocateProtocol(&uga_guid, NULL, (VOID **)&uga);
- if (status == EFI_SUCCESS) {
- gfx_state->tg_fb_type = FB_UGA;
- gfx_state->tg_private = uga;
- } else {
- return (efi_status_to_errno(status));
- }
}
switch (gfx_state->tg_fb_type) {