]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Use EFI_CONSOLE_CONTROL_PROTOCOL to set text mode if available
authorCurtis Larsen <larsen@dixie.edu>
Wed, 16 Jul 2014 14:08:24 +0000 (15:08 +0100)
committerMichael Brown <mcb30@ipxe.org>
Wed, 16 Jul 2014 14:10:07 +0000 (15:10 +0100)
On some older EFI 1.10 implementations (observed with an old iMac), we
must use the (now obsolete) EFI_CONSOLE_CONTROL_PROTOCOL to switch the
console into text mode.

Modified-by: Michael Brown <mcb30@ipxe.org>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/interface/efi/efi_console.c

index af60d4f916ee978912e6424acfc347cf5a9ad3bf..331c705bdd24b1d705148e31a0d7514d0ffca58d 100644 (file)
@@ -24,8 +24,10 @@ FILE_LICENCE ( GPL2_OR_LATER );
 #include <errno.h>
 #include <assert.h>
 #include <ipxe/efi/efi.h>
+#include <ipxe/efi/Protocol/ConsoleControl/ConsoleControl.h>
 #include <ipxe/ansiesc.h>
 #include <ipxe/console.h>
+#include <ipxe/init.h>
 #include <config/console.h>
 
 #define ATTR_BOLD              0x08
@@ -61,6 +63,10 @@ FILE_LICENCE ( GPL2_OR_LATER );
 /** Current character attribute */
 static unsigned int efi_attr = ATTR_DEFAULT;
 
+/** Console control protocol */
+static EFI_CONSOLE_CONTROL_PROTOCOL *conctrl;
+EFI_REQUEST_PROTOCOL ( EFI_CONSOLE_CONTROL_PROTOCOL, &conctrl );
+
 /**
  * Handle ANSI CUP (cursor position)
  *
@@ -286,9 +292,37 @@ static int efi_iskey ( void ) {
        return 0;
 }
 
+/** EFI console driver */
 struct console_driver efi_console __console_driver = {
        .putchar = efi_putchar,
        .getchar = efi_getchar,
        .iskey = efi_iskey,
        .usage = CONSOLE_EFI,
 };
+
+/**
+ * Initialise EFI console
+ *
+ */
+static void efi_console_init ( void ) {
+       EFI_CONSOLE_CONTROL_SCREEN_MODE mode;
+
+       /* On some older EFI 1.10 implementations, we must use the
+        * (now obsolete) EFI_CONSOLE_CONTROL_PROTOCOL to switch the
+        * console into text mode.
+        */
+       if ( conctrl ) {
+               conctrl->GetMode ( conctrl, &mode, NULL, NULL );
+               if ( mode != EfiConsoleControlScreenText ) {
+                       conctrl->SetMode ( conctrl,
+                                          EfiConsoleControlScreenText );
+               }
+       }
+}
+
+/**
+ * EFI console initialisation function
+ */
+struct init_fn efi_console_init_fn __init_fn ( INIT_EARLY ) = {
+       .initialise = efi_console_init,
+};