diff options
author | Curtis Larsen <larsen@dixie.edu> | 2014-07-16 15:08:24 +0100 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2014-07-16 15:10:07 +0100 |
commit | 8a42a369420817763fcb200a12cec84562143a13 (patch) | |
tree | 1bcab24cf073cc4cea4c2c2fda391d4c83e90dea /src/interface | |
parent | eb55c6871a23e61aaa10095c98eb3abc59b8e902 (diff) | |
download | ipxe-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.c | 34 |
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, +}; |