Skip to content

Commit

Permalink
[efi] Use EFI_CONSOLE_CONTROL_PROTOCOL to set text mode if available
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Curtis Larsen authored and mcb30 committed Jul 16, 2014
1 parent eb55c68 commit 8a42a36
Showing 1 changed file with 34 additions and 0 deletions.
34 changes: 34 additions & 0 deletions src/interface/efi/efi_console.c
Expand Up @@ -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
Expand Down Expand Up @@ -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)
*
Expand Down Expand Up @@ -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,
};

0 comments on commit 8a42a36

Please sign in to comment.