aboutsummaryrefslogtreecommitdiffstats
path: root/src/interface
diff options
context:
space:
mode:
authorCurtis Larsen <larsen@dixie.edu>2014-07-16 15:08:24 +0100
committerMichael Brown <mcb30@ipxe.org>2014-07-16 15:10:07 +0100
commit8a42a369420817763fcb200a12cec84562143a13 (patch)
tree1bcab24cf073cc4cea4c2c2fda391d4c83e90dea /src/interface
parenteb55c6871a23e61aaa10095c98eb3abc59b8e902 (diff)
downloadipxe-8a42a369420817763fcb200a12cec84562143a13.tar.gz
[efi] Use EFI_CONSOLE_CONTROL_PROTOCOL to set text mode if available
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>
Diffstat (limited to 'src/interface')
-rw-r--r--src/interface/efi/efi_console.c34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/interface/efi/efi_console.c b/src/interface/efi/efi_console.c
index af60d4f9..331c705b 100644
--- a/src/interface/efi/efi_console.c
+++ b/src/interface/efi/efi_console.c
@@ -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,
+};