From 1926a1143913fa92a6bec7495f3ffe0c1e8254a1 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Wed, 26 Jan 2022 13:50:22 +0100 Subject: [PATCH] boot: Add screen resolution to print status --- src/boot/efi/boot.c | 4 +++- src/boot/efi/console.c | 27 ++++++++++++++++++++------- src/boot/efi/console.h | 1 + 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/boot/efi/boot.c b/src/boot/efi/boot.c index 57ca183cf33..eed5bcc9610 100644 --- a/src/boot/efi/boot.c +++ b/src/boot/efi/boot.c @@ -438,6 +438,7 @@ static void ps_bool(const CHAR16 *fmt, BOOLEAN value) { static void print_status(Config *config, CHAR16 *loaded_image_path) { UINT64 key; UINTN x_max, y_max; + UINT32 screen_width = 0, screen_height = 0; SecureBootMode secure; _cleanup_freepool_ CHAR16 *device_part_uuid = NULL; @@ -446,6 +447,7 @@ static void print_status(Config *config, CHAR16 *loaded_image_path) { clear_screen(COLOR_NORMAL); console_query_mode(&x_max, &y_max); + query_screen_resolution(&screen_width, &screen_height); secure = secure_boot_mode(); (void) efivar_get(LOADER_GUID, L"LoaderDevicePartUUID", &device_part_uuid); @@ -463,7 +465,7 @@ static void print_status(Config *config, CHAR16 *loaded_image_path) { Print(L" secure boot: %s (%s)\n", yes_no(IN_SET(secure, SECURE_BOOT_USER, SECURE_BOOT_DEPLOYED)), secure_boot_mode_to_string(secure)); ps_bool(L" shim: %s\n", shim_loaded()); ps_bool(L" TPM: %s\n", tpm_present()); - Print(L" console mode: %d/%d (%lu x %lu)\n", ST->ConOut->Mode->Mode, ST->ConOut->Mode->MaxMode - 1LL, x_max, y_max); + Print(L" console mode: %d/%d (%lux%lu @%ux%u)\n", ST->ConOut->Mode->Mode, ST->ConOut->Mode->MaxMode - 1LL, x_max, y_max, screen_width, screen_height); Print(L"\n--- Press any key to continue. ---\n\n"); console_key_read(&key, UINT64_MAX); diff --git a/src/boot/efi/console.c b/src/boot/efi/console.c index b8142c38b3f..3a0cf535e15 100644 --- a/src/boot/efi/console.c +++ b/src/boot/efi/console.c @@ -183,19 +183,32 @@ static EFI_STATUS change_mode(INT64 mode) { return err; } -static INT64 get_auto_mode(void) { - EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; +EFI_STATUS query_screen_resolution(UINT32 *ret_w, UINT32 *ret_h) { EFI_STATUS err; + EFI_GRAPHICS_OUTPUT_PROTOCOL *go; + + err = LibLocateProtocol(&GraphicsOutputProtocol, (void **) &go); + if (EFI_ERROR(err)) + return err; + + if (!go->Mode || !go->Mode->Info) + return EFI_DEVICE_ERROR; + + *ret_w = go->Mode->Info->HorizontalResolution; + *ret_h = go->Mode->Info->VerticalResolution; + return EFI_SUCCESS; +} + +static INT64 get_auto_mode(void) { + UINT32 screen_width, screen_height; - err = LibLocateProtocol(&GraphicsOutputProtocol, (void **)&GraphicsOutput); - if (!EFI_ERROR(err) && GraphicsOutput->Mode && GraphicsOutput->Mode->Info) { - EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info = GraphicsOutput->Mode->Info; + if (!EFI_ERROR(query_screen_resolution(&screen_width, &screen_height))) { BOOLEAN keep = FALSE; /* Start verifying if we are in a resolution larger than Full HD * (1920x1080). If we're not, assume we're in a good mode and do not * try to change it. */ - if (Info->HorizontalResolution <= HORIZONTAL_MAX_OK && Info->VerticalResolution <= VERTICAL_MAX_OK) + if (screen_width <= HORIZONTAL_MAX_OK && screen_height <= VERTICAL_MAX_OK) keep = TRUE; /* For larger resolutions, calculate the ratio of the total screen * area to the text viewport area. If it's less than 10 times bigger, @@ -203,7 +216,7 @@ static INT64 get_auto_mode(void) { else { UINT64 text_area; UINTN x_max, y_max; - UINT64 screen_area = (UINT64)Info->HorizontalResolution * (UINT64)Info->VerticalResolution; + UINT64 screen_area = (UINT64)screen_width * (UINT64)screen_height; console_query_mode(&x_max, &y_max); text_area = SYSTEM_FONT_WIDTH * SYSTEM_FONT_HEIGHT * (UINT64)x_max * (UINT64)y_max; diff --git a/src/boot/efi/console.h b/src/boot/efi/console.h index 90086028c04..c27c19b39fb 100644 --- a/src/boot/efi/console.h +++ b/src/boot/efi/console.h @@ -29,3 +29,4 @@ enum { EFI_STATUS console_key_read(UINT64 *key, UINT64 timeout_usec); EFI_STATUS console_set_mode(INT64 mode); EFI_STATUS console_query_mode(UINTN *x_max, UINTN *y_max); +EFI_STATUS query_screen_resolution(UINT32 *ret_width, UINT32 *ret_height); -- 2.47.3