]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
boot: Use EFI_BOOT_MANAGER_POLICY_PROTOCOL to connect console devices
authorJan Janssen <medhefgo@web.de>
Sun, 27 Nov 2022 12:38:18 +0000 (13:38 +0100)
committerJan Janssen <medhefgo@web.de>
Tue, 29 Nov 2022 14:03:52 +0000 (15:03 +0100)
src/boot/efi/console.c
src/boot/efi/missing_efi.h

index 14c0008afb47bf751a5d8644c196160a67cf5dd8..cd980fd535f8d417e84659778146909c06b002a5 100644 (file)
 #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)
index 250c84c2486551b5115ca111ad66be0bb31cf77e..b446e0399f053426334a6e1a48088966072a70fe 100644 (file)
@@ -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