From: Curtis Larsen Date: Wed, 16 Jul 2014 14:08:24 +0000 (+0100) Subject: [efi] Use EFI_CONSOLE_CONTROL_PROTOCOL to set text mode if available X-Git-Tag: v1.20.1~1132 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8a42a369420817763fcb200a12cec84562143a13;p=thirdparty%2Fipxe.git [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 Signed-off-by: Michael Brown --- diff --git a/src/interface/efi/efi_console.c b/src/interface/efi/efi_console.c index af60d4f91..331c705bd 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 #include #include +#include #include #include +#include #include #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, +};