[PATCH 15/25] efi-stdio: implement input buffering with a kfifo

Sascha Hauer s.hauer at pengutronix.de
Mon Dec 13 13:08:55 PST 2021


The efi-stdio tstc() implementation needs buffering an input character
in order to return that character later in getc(). To implement
retrieving the current cursor position later we'll have to buffer more
than only a single character, so re-implement input buffering with a
kfifo.

Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
 drivers/serial/efi-stdio.c | 23 ++++++++++++-----------
 1 file changed, 12 insertions(+), 11 deletions(-)

diff --git a/drivers/serial/efi-stdio.c b/drivers/serial/efi-stdio.c
index beef911a16..dacdb74934 100644
--- a/drivers/serial/efi-stdio.c
+++ b/drivers/serial/efi-stdio.c
@@ -14,6 +14,7 @@
 #include <readkey.h>
 #include <linux/ctype.h>
 #include <efi/efi.h>
+#include <kfifo.h>
 #include <efi/efi-device.h>
 #include "efi-stdio.h"
 
@@ -63,10 +64,11 @@ struct efi_console_priv {
 	struct efi_simple_input_interface *in;
 	struct efi_simple_text_input_ex_protocol *inex;
 	struct console_device cdev;
-	int lastkey;
 	u16 efi_console_buffer[CONFIG_CBSIZE + 1];
 	int pos;
 
+	struct kfifo *inputbuffer;
+
 	unsigned long columns, rows;
 
 	int fg;
@@ -358,14 +360,14 @@ static int efi_console_tstc(struct console_device *cdev)
 	struct efi_console_priv *priv = to_efi(cdev);
 	int key;
 
-	if (priv->lastkey > 0)
+	if (kfifo_len(priv->inputbuffer))
 		return 1;
 
 	key = efi_read_key(priv, 0);
 	if (key < 0)
 		return 0;
 
-	priv->lastkey = key;
+	kfifo_putc(priv->inputbuffer, key);
 
 	return 1;
 }
@@ -373,13 +375,10 @@ static int efi_console_tstc(struct console_device *cdev)
 static int efi_console_getc(struct console_device *cdev)
 {
 	struct efi_console_priv *priv = to_efi(cdev);
-	int key;
+	unsigned char c;
 
-	if (priv->lastkey > 0) {
-		key = priv->lastkey;
-		priv->lastkey = -1;
-		return key;
-	}
+	if (!kfifo_getc(priv->inputbuffer, &c))
+		return c;
 
 	return efi_read_key(priv, 1);
 }
@@ -424,6 +423,10 @@ static int efi_console_probe(struct device_d *dev)
 	priv->out = efi_sys_table->con_out;
 	priv->in = efi_sys_table->con_in;
 
+	priv->inputbuffer = kfifo_alloc(128);
+	if (!priv->inputbuffer)
+		return -ENOMEM;
+
 	efiret = BS->open_protocol((void *)efi_sys_table->con_in_handle,
 			     &inex_guid,
 			     (void **)&inex,
@@ -454,8 +457,6 @@ static int efi_console_probe(struct device_d *dev)
 	cdev->putc = efi_console_putc;
 	cdev->puts = efi_console_puts;
 
-	priv->lastkey = -1;
-
 	return console_register(cdev);
 }
 
-- 
2.30.2




More information about the barebox mailing list