]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
term/ns8250: Add configuration parameter when adding ports
authorBenjamin Herrenschmidt <benh@amazon.com>
Fri, 23 Dec 2022 01:47:56 +0000 (12:47 +1100)
committerDaniel Kiper <daniel.kiper@oracle.com>
Thu, 19 Jan 2023 16:39:03 +0000 (17:39 +0100)
This will allow ports to be added with a pre-set configuration.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
grub-core/term/ns8250.c
grub-core/term/serial.c
include/grub/serial.h

index abd81de2b81153f05fe14dfef37e3165d6d0a2ec..7294d451bbf6ea56da3e0991843aeb230d27584e 100644 (file)
@@ -304,7 +304,7 @@ grub_ns8250_hw_get_port (const unsigned int unit)
 }
 
 char *
-grub_serial_ns8250_add_port (grub_port_t port)
+grub_serial_ns8250_add_port (grub_port_t port, struct grub_serial_config *config)
 {
   struct grub_serial_port *p;
   unsigned i;
@@ -314,6 +314,9 @@ grub_serial_ns8250_add_port (grub_port_t port)
       {
        if (dead_ports & (1 << i))
          return NULL;
+       /* Give the opportunity for SPCR to configure a default com port. */
+       if (config != NULL)
+         grub_serial_port_configure (&com_ports[i], config);
        return com_names[i];
       }
 
@@ -326,32 +329,39 @@ grub_serial_ns8250_add_port (grub_port_t port)
     return NULL;
 
   p = grub_malloc (sizeof (*p));
-  if (!p)
+  if (p == NULL)
     return NULL;
   p->name = grub_xasprintf ("port%lx", (unsigned long) port);
-  if (!p->name)
+  if (p->name == NULL)
     {
       grub_free (p);
       return NULL;
     }
   p->driver = &grub_ns8250_driver;
-  grub_serial_config_defaults (p);
   p->mmio = false;
   p->port = port;
+  if (config != NULL)
+    grub_serial_port_configure (p, config);
+  else
+    grub_serial_config_defaults (p);
   grub_serial_register (p);
 
   return p->name;
 }
 
 char *
-grub_serial_ns8250_add_mmio (grub_addr_t addr)
+grub_serial_ns8250_add_mmio (grub_addr_t addr, struct grub_serial_config *config)
 {
   struct grub_serial_port *p;
   unsigned i;
 
   for (i = 0; i < GRUB_SERIAL_PORT_NUM; i++)
     if (com_ports[i].mmio == true && com_ports[i].mmio_base == addr)
-       return com_names[i];
+      {
+        if (config != NULL)
+          grub_serial_port_configure (&com_ports[i], config);
+        return com_names[i];
+      }
 
   p = grub_malloc (sizeof (*p));
   if (p == NULL)
@@ -363,9 +373,12 @@ grub_serial_ns8250_add_mmio (grub_addr_t addr)
       return NULL;
     }
   p->driver = &grub_ns8250_driver;
-  grub_serial_config_defaults (p);
   p->mmio = true;
   p->mmio_base = addr;
+  if (config != NULL)
+    grub_serial_port_configure (p, config);
+  else
+    grub_serial_config_defaults (p);
   grub_serial_register (p);
 
   return p->name;
index 842322b1c607bffddd56626515f5a156b7d5192a..cdbbc54e3a10658162901664512c8004e4158839 100644 (file)
@@ -156,7 +156,7 @@ grub_serial_find (const char *name)
       && grub_isxdigit (name [sizeof ("port") - 1]))
     {
       name = grub_serial_ns8250_add_port (grub_strtoul (&name[sizeof ("port") - 1],
-                                                       0, 16));
+                                                       0, 16), NULL);
       if (!name)
        return NULL;
 
index 5e008f0f55b236945e3b5e3819d66e7ea3cc188a..a943271408467398ad4e53f3d0517e178541dccb 100644 (file)
@@ -185,8 +185,8 @@ grub_serial_config_defaults (struct grub_serial_port *port)
 
 #if defined(__mips__) || defined (__i386__) || defined (__x86_64__)
 void grub_ns8250_init (void);
-char *grub_serial_ns8250_add_port (grub_port_t port);
-char *grub_serial_ns8250_add_mmio (grub_addr_t addr);
+char *grub_serial_ns8250_add_port (grub_port_t port, struct grub_serial_config *config);
+char *grub_serial_ns8250_add_mmio (grub_addr_t addr, struct grub_serial_config *config);
 #endif
 #ifdef GRUB_MACHINE_IEEE1275
 void grub_ofserial_init (void);