aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/sysreset/sysreset_x86.c23
-rw-r--r--lib/efi_loader/efi_console.c62
2 files changed, 57 insertions, 28 deletions
diff --git a/drivers/sysreset/sysreset_x86.c b/drivers/sysreset/sysreset_x86.c
index 20b958c..009f376 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 66c33a5..8e0965b 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;