| /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
| /* |
| * Copyright © 2013 Intel Corporation |
| * Authored by Joonas Lahtinen <joonas.lahtinen@linux.intel.com> |
| */ |
| |
| #include <efi.h> |
| #include <efilib.h> |
| |
| #include "graphics.h" |
| #include "missing_efi.h" |
| #include "util.h" |
| |
| EFI_STATUS graphics_mode(bool on) { |
| EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl = NULL; |
| EFI_CONSOLE_CONTROL_SCREEN_MODE new; |
| EFI_CONSOLE_CONTROL_SCREEN_MODE current; |
| BOOLEAN uga_exists; |
| BOOLEAN stdin_locked; |
| EFI_STATUS err; |
| |
| err = BS->LocateProtocol(MAKE_GUID_PTR(EFI_CONSOLE_CONTROL), NULL, (void **) &ConsoleControl); |
| if (err != EFI_SUCCESS) |
| /* console control protocol is nonstandard and might not exist. */ |
| return err == EFI_NOT_FOUND ? EFI_SUCCESS : err; |
| |
| /* check current mode */ |
| err = ConsoleControl->GetMode(ConsoleControl, ¤t, &uga_exists, &stdin_locked); |
| if (err != EFI_SUCCESS) |
| return err; |
| |
| /* do not touch the mode */ |
| new = on ? EfiConsoleControlScreenGraphics : EfiConsoleControlScreenText; |
| if (new == current) |
| return EFI_SUCCESS; |
| |
| log_wait(); |
| err = ConsoleControl->SetMode(ConsoleControl, new); |
| |
| /* some firmware enables the cursor when switching modes */ |
| ST->ConOut->EnableCursor(ST->ConOut, false); |
| |
| return err; |
| } |