[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>
pull/20/merge
Curtis Larsen 2014-07-16 15:08:24 +01:00 committed by Michael Brown
parent eb55c6871a
commit 8a42a36942
1 changed files with 34 additions and 0 deletions

View 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,
};