diff options
author | Tom Rini <trini@konsulko.com> | 2019-03-12 10:56:02 -0400 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2019-03-12 10:56:02 -0400 |
commit | 116a3a1ae085753e04b62c37a0f11f80cab9d730 (patch) | |
tree | 4cec43fd7036c42a5fd31b434077edc57eb19e30 | |
parent | 2e8092d94f40a5692baf3ec768ce3216a7bf032a (diff) | |
parent | 3eeb09b4c06fd6eb5c724b21cd2ac538fc015a31 (diff) | |
download | u-boot-116a3a1ae085753e04b62c37a0f11f80cab9d730.tar.gz |
Merge tag 'efi-2019-04-rc4-2' of https://github.com/xypron2/u-boot
Pull request for UEFI system for v2019.04-rc4
Fix an error with the serial communication on boards with a very small
UART buffer which leads to a stalled system.
Provide an X86 reset driver for the UEFI runtime.
-rw-r--r-- | drivers/sysreset/sysreset_x86.c | 23 | ||||
-rw-r--r-- | lib/efi_loader/efi_console.c | 62 |
2 files changed, 57 insertions, 28 deletions
diff --git a/drivers/sysreset/sysreset_x86.c b/drivers/sysreset/sysreset_x86.c index 20b958cfd4..009f376602 100644 --- a/drivers/sysreset/sysreset_x86.c +++ b/drivers/sysreset/sysreset_x86.c @@ -10,8 +10,10 @@ #include <sysreset.h> #include <asm/io.h> #include <asm/processor.h> +#include <efi_loader.h> -static int x86_sysreset_request(struct udevice *dev, enum sysreset_t type) +static __efi_runtime int x86_sysreset_request(struct udevice *dev, + enum sysreset_t type) { int value; @@ -31,6 +33,25 @@ static int x86_sysreset_request(struct udevice *dev, enum sysreset_t type) return -EINPROGRESS; } +#ifdef CONFIG_EFI_LOADER +void __efi_runtime EFIAPI efi_reset_system( + enum efi_reset_type reset_type, + efi_status_t reset_status, + unsigned long data_size, void *reset_data) +{ + if (reset_type == EFI_RESET_COLD || + reset_type == EFI_RESET_PLATFORM_SPECIFIC) + x86_sysreset_request(NULL, SYSRESET_COLD); + else if (reset_type == EFI_RESET_WARM) + x86_sysreset_request(NULL, SYSRESET_WARM); + + /* TODO EFI_RESET_SHUTDOWN */ + + while (1) { } +} +#endif + + static const struct udevice_id x86_sysreset_ids[] = { { .compatible = "x86,reset" }, { } diff --git a/lib/efi_loader/efi_console.c b/lib/efi_loader/efi_console.c index 66c33a551d..8e0965bfc8 100644 --- a/lib/efi_loader/efi_console.c +++ b/lib/efi_loader/efi_console.c @@ -62,6 +62,21 @@ static struct simple_text_output_mode efi_con_mode = { .cursor_visible = 1, }; +static int term_get_char(s32 *c) +{ + u64 timeout; + + /* Wait up to 100 ms for a character */ + timeout = timer_get_us() + 100000; + + while (!tstc()) + if (timer_get_us() > timeout) + return 1; + + *c = getc(); + return 0; +} + /* * Receive and parse a reply from the terminal. * @@ -72,34 +87,36 @@ static struct simple_text_output_mode efi_con_mode = { */ static int term_read_reply(int *n, int num, char end_char) { - char c; + s32 c; int i = 0; - c = getc(); - if (c != cESC) + if (term_get_char(&c) || c != cESC) return -1; - c = getc(); - if (c != '[') + + if (term_get_char(&c) || c != '[') return -1; n[0] = 0; while (1) { - c = getc(); - if (c == ';') { - i++; - if (i >= num) + if (!term_get_char(&c)) { + if (c == ';') { + i++; + if (i >= num) + return -1; + n[i] = 0; + continue; + } else if (c == end_char) { + break; + } else if (c > '9' || c < '0') { return -1; - n[i] = 0; - continue; - } else if (c == end_char) { - break; - } else if (c > '9' || c < '0') { + } + + /* Read one more decimal position */ + n[i] *= 10; + n[i] += c - '0'; + } else { return -1; } - - /* Read one more decimal position */ - n[i] *= 10; - n[i] += c - '0'; } if (i != num - 1) return -1; @@ -196,7 +213,6 @@ static int query_console_serial(int *rows, int *cols) { int ret = 0; int n[2]; - u64 timeout; /* Empty input buffer */ while (tstc()) @@ -216,14 +232,6 @@ static int query_console_serial(int *rows, int *cols) ESC "[999;999H" /* Move to bottom right corner */ ESC "[6n"); /* Query cursor position */ - /* Allow up to one second for a response */ - timeout = timer_get_us() + 1000000; - while (!tstc()) - if (timer_get_us() > timeout) { - ret = -1; - goto out; - } - /* Read {rows,cols} */ if (term_read_reply(n, 2, 'R')) { ret = 1; |