From: Jan Janssen Date: Sun, 27 Nov 2022 12:38:18 +0000 (+0100) Subject: boot: Use EFI_BOOT_MANAGER_POLICY_PROTOCOL to connect console devices X-Git-Tag: v253-rc1~385^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b99bf5811850afdb2502ba37251c48348da63c82;p=thirdparty%2Fsystemd.git boot: Use EFI_BOOT_MANAGER_POLICY_PROTOCOL to connect console devices --- diff --git a/src/boot/efi/console.c b/src/boot/efi/console.c index 14c0008afb4..cd980fd535f 100644 --- a/src/boot/efi/console.c +++ b/src/boot/efi/console.c @@ -12,6 +12,20 @@ #define VERTICAL_MAX_OK 1080 #define VIEWPORT_RATIO 10 +static EFI_STATUS console_connect(void) { + EFI_BOOT_MANAGER_POLICY_PROTOCOL *boot_policy; + EFI_STATUS err; + + /* This should make console devices appear/fully initialize on fastboot firmware. */ + + err = BS->LocateProtocol( + &(EFI_GUID) EFI_BOOT_MANAGER_POLICY_PROTOCOL_GUID, NULL, (void **) &boot_policy); + if (err != EFI_SUCCESS) + return err; + + return boot_policy->ConnectDeviceClass(boot_policy, &(EFI_GUID) EFI_BOOT_MANAGER_POLICY_CONSOLE_GUID); +} + static inline void event_closep(EFI_EVENT *event) { if (!*event) return; @@ -47,6 +61,8 @@ EFI_STATUS console_key_read(uint64_t *key, uint64_t timeout_usec) { assert(key); if (!checked) { + console_connect(); + /* Get the *first* TextInputEx device.*/ err = BS->LocateProtocol(&SimpleTextInputExProtocol, NULL, (void **) &extraInEx); if (err != EFI_SUCCESS || BS->CheckEvent(extraInEx->WaitForKeyEx) == EFI_INVALID_PARAMETER) diff --git a/src/boot/efi/missing_efi.h b/src/boot/efi/missing_efi.h index 250c84c2486..b446e0399f0 100644 --- a/src/boot/efi/missing_efi.h +++ b/src/boot/efi/missing_efi.h @@ -398,3 +398,22 @@ typedef struct { void *StdErr; } EFI_SHELL_PARAMETERS_PROTOCOL; #endif + +#ifndef EFI_BOOT_MANAGER_POLICY_PROTOCOL_GUID +#define EFI_BOOT_MANAGER_POLICY_PROTOCOL_GUID \ + { 0xFEDF8E0C, 0xE147, 0x11E3, { 0x99, 0x03, 0xB8, 0xE8, 0x56, 0x2C, 0xBA, 0xFA } } +#define EFI_BOOT_MANAGER_POLICY_CONSOLE_GUID \ + { 0xCAB0E94C, 0xE15F, 0x11E3, { 0x91, 0x8D, 0xB8, 0xE8, 0x56, 0x2C, 0xBA, 0xFA } } + +typedef struct EFI_BOOT_MANAGER_POLICY_PROTOCOL EFI_BOOT_MANAGER_POLICY_PROTOCOL; +struct EFI_BOOT_MANAGER_POLICY_PROTOCOL { + UINT64 Revision; + EFI_STATUS (EFIAPI *ConnectDevicePath)( + EFI_BOOT_MANAGER_POLICY_PROTOCOL *This, + EFI_DEVICE_PATH *DevicePath, + BOOLEAN Recursive); + EFI_STATUS (EFIAPI *ConnectDeviceClass)( + EFI_BOOT_MANAGER_POLICY_PROTOCOL *This, + EFI_GUID *Class); +}; +#endif