[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v2 8/8] serial: Add ability to specify MMIO ports via 'serial'
From: |
Benjamin Herrenschmidt |
Subject: |
[PATCH v2 8/8] serial: Add ability to specify MMIO ports via 'serial' |
Date: |
Thu, 22 Dec 2022 17:12:57 +1100 |
From: Benjamin Herrenschmidt <benh@amazon.com>
This adds the ability to explicitely add an MMIO based serial port
via the 'serial' command. The syntax is:
serial --port=mmio,<hex_address>{.b,.w,.l,.q}
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
---
docs/grub.texi | 26 ++++++++++++++++++--
grub-core/term/serial.c | 53 +++++++++++++++++++++++++++++++++++++----
2 files changed, 72 insertions(+), 7 deletions(-)
diff --git a/docs/grub.texi b/docs/grub.texi
index fd22a69fa..502ca2ef7 100644
--- a/docs/grub.texi
+++ b/docs/grub.texi
@@ -4168,8 +4168,24 @@ Commands usable anywhere in the menu and in the
command-line.
@deffn Command serial [@option{--unit=unit}] [@option{--port=port}]
[@option{--speed=speed}] [@option{--word=word}] [@option{--parity=parity}]
[@option{--stop=stop}]
Initialize a serial device. @var{unit} is a number in the range 0-3
specifying which serial port to use; default is 0, which corresponds to
-the port often called COM1. @var{port} is the I/O port where the UART
-is to be found; if specified it takes precedence over @var{unit}.
+the port often called COM1.
+
+@var{port} is the I/O port where the UART is to be found or, if prefixed
+with @samp{mmio,}, the MMIO address of the UART. If specified it takes
+precedence over @var{unit}.
+
+Additionally, an MMIO address can be suffixed with:
+@itemize @bullet
+@item
+@samp{.b} for bytes access (default)
+@item
+@samp{.w} for 16-bit word access
+@item
+@samp{.l} for 32-bit long word access or
+@item
+@samp{.q} for 64-bit long long word access
+@end itemize
+
@var{speed} is the transmission speed; default is 9600. @var{word} and
@var{stop} are the number of data bits and stop bits. Data bits must
be in the range 5-8 and stop bits must be 1 or 2. Default is 8 data
@@ -4185,6 +4201,12 @@ The serial port is not used as a communication channel
unless the
@command{terminal_input} or @command{terminal_output} command is used
(@pxref{terminal_input}, @pxref{terminal_output}).
+Examples:
+@example
+serial --port=3f8 --speed=9600
+serial --port=mmio,fefb0000.l --speed=115200
+@end example
+
See also @ref{Serial terminal}.
@end deffn
diff --git a/grub-core/term/serial.c b/grub-core/term/serial.c
index ed7b398b7..d374495cb 100644
--- a/grub-core/term/serial.c
+++ b/grub-core/term/serial.c
@@ -152,8 +152,8 @@ grub_serial_find (const char *name)
break;
#if (defined(__mips__) || defined (__i386__) || defined (__x86_64__)) &&
!defined(GRUB_MACHINE_EMU) && !defined(GRUB_MACHINE_ARC)
- if (!port && grub_memcmp (name, "port", sizeof ("port") - 1) == 0
- && grub_isxdigit (name [sizeof ("port") - 1]))
+ if (!port && grub_strncmp (name, "port", grub_strlen ("port")) == 0
+ && grub_isxdigit (name [grub_strlen ("port")]))
{
name = grub_serial_ns8250_add_port (grub_strtoul (&name[sizeof ("port")
- 1],
0, 16), NULL);
@@ -164,6 +164,49 @@ grub_serial_find (const char *name)
if (grub_strcmp (port->name, name) == 0)
break;
}
+ if (!port && grub_strncmp (name, "mmio,", grub_strlen ("mmio,")) == 0
+ && grub_isxdigit (name [grub_strlen ("mmio,")]))
+ {
+ const char *p1, *p = &name[grub_strlen ("mmio,")];
+ grub_addr_t addr = grub_strtoul (p, &p1, 16);
+ unsigned int acc_size = 1;
+ unsigned int nlen = p1 - p;
+
+ /* Check address validity and general syntax */
+ if (addr == 0 || (p1[0] != '\0' && p1[0] != '.'))
+ return NULL;
+ if (p1[0] == '.')
+ switch(p1[1])
+ {
+ case 'w':
+ acc_size = 2;
+ break;
+ case 'l':
+ acc_size = 3;
+ break;
+ case 'q':
+ acc_size = 4;
+ break;
+ case 'b':
+ acc_size = 1;
+ /* fallthrough */
+ default:
+ /*
+ * Should we abort for an unknown size ? Let's just default
+ * to 1 byte, it would increase the chance that the user who
+ * did a typo can actually see the console.
+ */
+ acc_size = 1;
+ }
+ name = grub_serial_ns8250_add_mmio (addr, acc_size, NULL);
+ if (!name)
+ return NULL;
+
+ FOR_SERIAL_PORTS (port)
+ if (grub_strncmp (port->name, name, nlen) == 0) {
+ break;
+ }
+ }
if (!port && grub_strcmp (name, "auto") == 0)
{
/* Look for an SPCR if any. If not, default to com0 */
@@ -178,9 +221,9 @@ grub_serial_find (const char *name)
#endif
#ifdef GRUB_MACHINE_IEEE1275
- if (!port && grub_memcmp (name, "ieee1275/", sizeof ("ieee1275/") - 1) == 0)
+ if (!port && grub_strncmp (name, "ieee1275/", grub_strlen ("ieee1275/")) ==
0)
{
- name = grub_ofserial_add_port (&name[sizeof ("ieee1275/") - 1]);
+ name = grub_ofserial_add_port (&name[grub_strlen ("ieee1275/")]);
if (!name)
return NULL;
@@ -212,7 +255,7 @@ grub_cmd_serial (grub_extcmd_context_t ctxt, int argc, char
**args)
if (state[OPTION_PORT].set)
{
- if (grub_memcmp (state[OPTION_PORT].arg, "mmio", 4) == 0)
+ if (grub_strncmp (state[OPTION_PORT].arg, "mmio,", grub_strlen
("mmio,")) == 0)
grub_snprintf(pname, sizeof (pname), "%s", state[1].arg);
else
grub_snprintf (pname, sizeof (pname), "port%lx",
--
2.34.1
- [PATCH v2 0/8] serial: Add MMIO & SPCR support, Benjamin Herrenschmidt, 2022/12/22
- [PATCH v2 1/8] acpi: Export a generic grub_acpi_find_table, Benjamin Herrenschmidt, 2022/12/22
- [PATCH v2 2/8] acpi: Add SPCR and generic address definitions, Benjamin Herrenschmidt, 2022/12/22
- [PATCH v2 3/8] ns8250: Add base support for MMIO UARTs, Benjamin Herrenschmidt, 2022/12/22
- [PATCH v2 5/8] ns8250: Add configuration parameter when adding ports, Benjamin Herrenschmidt, 2022/12/22
- [PATCH v2 4/8] ns8250: Move base clock definition to a header, Benjamin Herrenschmidt, 2022/12/22
- [PATCH v2 8/8] serial: Add ability to specify MMIO ports via 'serial',
Benjamin Herrenschmidt <=
- [PATCH v2 6/8] ns8250: Use ACPI SPCR table when available to configure serial, Benjamin Herrenschmidt, 2022/12/22
- [PATCH v2 7/8] ns8250: Support more MMIO access sizes, Benjamin Herrenschmidt, 2022/12/22
- [PATCH v2 0/8] serial: Add MMIO & SPCR support, Benjamin Herrenschmidt, 2022/12/22
- [PATCH v3 2/8] acpi: Add SPCR and generic address definitions, Benjamin Herrenschmidt, 2022/12/22
- [PATCH v3 1/8] acpi: Export a generic grub_acpi_find_table, Benjamin Herrenschmidt, 2022/12/22
- [PATCH v3 3/8] ns8250: Add base support for MMIO UARTs, Benjamin Herrenschmidt, 2022/12/22
- [PATCH v3 4/8] ns8250: Move base clock definition to a header, Benjamin Herrenschmidt, 2022/12/22
- [PATCH v3 5/8] ns8250: Add configuration parameter when adding ports, Benjamin Herrenschmidt, 2022/12/22