loader.efi: commands gop, uga and autoresize should use cached data
We are setting up pointers for gop or uga protocol in efi_find_framebuffer(), reuse those pointers.
This commit is contained in:
parent
72c551930b
commit
52ec89a93c
@ -43,11 +43,14 @@ __FBSDID("$FreeBSD$");
|
||||
#include "bootstrap.h"
|
||||
#include "framebuffer.h"
|
||||
|
||||
EFI_GUID conout_guid = EFI_CONSOLE_OUT_DEVICE_GUID;
|
||||
static EFI_GUID conout_guid = EFI_CONSOLE_OUT_DEVICE_GUID;
|
||||
EFI_GUID gop_guid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
|
||||
static EFI_GUID pciio_guid = EFI_PCI_IO_PROTOCOL_GUID;
|
||||
static EFI_GUID uga_guid = EFI_UGA_DRAW_PROTOCOL_GUID;
|
||||
|
||||
static EFI_GRAPHICS_OUTPUT *gop;
|
||||
static EFI_UGA_DRAW_PROTOCOL *uga;
|
||||
|
||||
static struct named_resolution {
|
||||
const char *name;
|
||||
const char *alias;
|
||||
@ -305,7 +308,7 @@ efifb_uga_locate_framebuffer(EFI_PCI_IO_PROTOCOL *pciio, uint64_t *addrp,
|
||||
}
|
||||
|
||||
static int
|
||||
efifb_from_uga(struct efi_fb *efifb, EFI_UGA_DRAW_PROTOCOL *uga)
|
||||
efifb_from_uga(struct efi_fb *efifb)
|
||||
{
|
||||
EFI_PCI_IO_PROTOCOL *pciio;
|
||||
char *ev, *p;
|
||||
@ -470,8 +473,6 @@ efi_find_framebuffer(teken_gfx_t *gfx_state)
|
||||
EFI_HANDLE h, *hlist;
|
||||
UINTN nhandles, i, hsize;
|
||||
struct efi_fb efifb;
|
||||
EFI_GRAPHICS_OUTPUT *gop;
|
||||
EFI_UGA_DRAW_PROTOCOL *uga;
|
||||
EFI_STATUS status;
|
||||
int rv;
|
||||
|
||||
@ -530,7 +531,7 @@ efi_find_framebuffer(teken_gfx_t *gfx_state)
|
||||
break;
|
||||
|
||||
case FB_UGA:
|
||||
rv = efifb_from_uga(&efifb, uga);
|
||||
rv = efifb_from_uga(&efifb);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -624,7 +625,7 @@ efi_get_max_resolution(int *width, int *height)
|
||||
}
|
||||
|
||||
static int
|
||||
gop_autoresize(EFI_GRAPHICS_OUTPUT *gop)
|
||||
gop_autoresize(void)
|
||||
{
|
||||
struct efi_fb efifb;
|
||||
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info;
|
||||
@ -690,7 +691,7 @@ text_autoresize()
|
||||
}
|
||||
|
||||
static int
|
||||
uga_autoresize(EFI_UGA_DRAW_PROTOCOL *uga)
|
||||
uga_autoresize(void)
|
||||
{
|
||||
|
||||
return (text_autoresize());
|
||||
@ -701,25 +702,18 @@ COMMAND_SET(efi_autoresize, "efi-autoresizecons", "EFI Auto-resize Console", com
|
||||
static int
|
||||
command_autoresize(int argc, char *argv[])
|
||||
{
|
||||
EFI_GRAPHICS_OUTPUT *gop;
|
||||
EFI_UGA_DRAW_PROTOCOL *uga;
|
||||
char *textmode;
|
||||
EFI_STATUS status;
|
||||
|
||||
textmode = getenv("hw.vga.textmode");
|
||||
/* If it's set and non-zero, we'll select a console mode instead */
|
||||
if (textmode != NULL && strcmp(textmode, "0") != 0)
|
||||
return (text_autoresize());
|
||||
|
||||
gop = NULL;
|
||||
uga = NULL;
|
||||
status = BS->LocateProtocol(&gop_guid, NULL, (VOID **)&gop);
|
||||
if (EFI_ERROR(status) == 0)
|
||||
return (gop_autoresize(gop));
|
||||
if (gop != NULL)
|
||||
return (gop_autoresize());
|
||||
|
||||
status = BS->LocateProtocol(&uga_guid, NULL, (VOID **)&uga);
|
||||
if (EFI_ERROR(status) == 0)
|
||||
return (uga_autoresize(uga));
|
||||
if (uga != NULL)
|
||||
return (uga_autoresize());
|
||||
|
||||
snprintf(command_errbuf, sizeof(command_errbuf),
|
||||
"%s: Neither Graphics Output Protocol nor Universal Graphics Adapter present",
|
||||
@ -740,15 +734,12 @@ static int
|
||||
command_gop(int argc, char *argv[])
|
||||
{
|
||||
struct efi_fb efifb;
|
||||
EFI_GRAPHICS_OUTPUT *gop;
|
||||
EFI_STATUS status;
|
||||
u_int mode;
|
||||
|
||||
status = BS->LocateProtocol(&gop_guid, NULL, (VOID **)&gop);
|
||||
if (EFI_ERROR(status)) {
|
||||
if (gop == NULL) {
|
||||
snprintf(command_errbuf, sizeof(command_errbuf),
|
||||
"%s: Graphics Output Protocol not present (error=%lu)",
|
||||
argv[0], EFI_ERROR_CODE(status));
|
||||
"%s: Graphics Output Protocol not present", argv[0]);
|
||||
return (CMD_ERROR);
|
||||
}
|
||||
|
||||
@ -813,21 +804,17 @@ static int
|
||||
command_uga(int argc, char *argv[])
|
||||
{
|
||||
struct efi_fb efifb;
|
||||
EFI_UGA_DRAW_PROTOCOL *uga;
|
||||
EFI_STATUS status;
|
||||
|
||||
status = BS->LocateProtocol(&uga_guid, NULL, (VOID **)&uga);
|
||||
if (EFI_ERROR(status)) {
|
||||
if (uga == NULL) {
|
||||
snprintf(command_errbuf, sizeof(command_errbuf),
|
||||
"%s: UGA Protocol not present (error=%lu)",
|
||||
argv[0], EFI_ERROR_CODE(status));
|
||||
"%s: UGA Protocol not present", argv[0]);
|
||||
return (CMD_ERROR);
|
||||
}
|
||||
|
||||
if (argc != 1)
|
||||
goto usage;
|
||||
|
||||
if (efifb_from_uga(&efifb, uga) != CMD_OK) {
|
||||
if (efifb_from_uga(&efifb) != CMD_OK) {
|
||||
snprintf(command_errbuf, sizeof(command_errbuf),
|
||||
"%s: Unable to get UGA information", argv[0]);
|
||||
return (CMD_ERROR);
|
||||
|
Loading…
Reference in New Issue
Block a user