]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[uart] Make baud rate a property of the UART
authorMichael Brown <mcb30@ipxe.org>
Wed, 5 Nov 2025 12:16:22 +0000 (12:16 +0000)
committerMichael Brown <mcb30@ipxe.org>
Wed, 5 Nov 2025 12:18:17 +0000 (12:18 +0000)
Make the current baud rate (if specified) a property of the UART, to
allow the default_serial_console() function to specify the default
baud rate as well as the default UART device.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/core/gdbserial.c
src/core/serial.c
src/core/uart.c
src/drivers/uart/ns16550.c
src/include/ipxe/uart.h

index 0f74e5fe0bbd3c40e132c1d283fc727526915779..61add5d47aa20b553a3f09477b57affb6e81e916 100644 (file)
@@ -95,7 +95,9 @@ struct gdb_transport * gdbserial_configure ( const char *name,
                return NULL;
        uart_get ( gdbserial_uart );
 
-       if ( ( rc = uart_init ( gdbserial_uart, baud ) ) != 0 )
+       gdbserial_uart->baud = baud;
+
+       if ( ( rc = uart_init ( gdbserial_uart ) ) != 0 )
                return NULL;
 
        return &serial_gdb_transport;
index f3b33cd90ea2c278efdf1238f8784ff36031b4b3..34ae4a17b31322f1911e7c839ff25be22451b0b9 100644 (file)
@@ -74,8 +74,14 @@ struct uart *serial_console = NULL;
  * @ret uart           Serial console UART, or NULL
  */
 static struct uart * serial_comconsole ( void ) {
+       struct uart *uart = COMCONSOLE;
+       unsigned int baud = COMSPEED;
 
-       return COMCONSOLE;
+       /* Set default baud rate, if applicable */
+       if ( uart && baud )
+               uart->baud = baud;
+
+       return uart;
 }
 
 /**
@@ -154,9 +160,9 @@ static void serial_init ( void ) {
                return;
 
        /* Initialise UART */
-       if ( ( rc = uart_init ( uart, COMSPEED ) ) != 0 ) {
-               DBGC ( uart, "SERIAL could not initialise %s baud %d: %s\n",
-                      uart->name, COMSPEED, strerror ( rc ) );
+       if ( ( rc = uart_init ( uart ) ) != 0 ) {
+               DBGC ( uart, "SERIAL could not initialise %s: %s\n",
+                      uart->name, strerror ( rc ) );
                return;
        }
 
index a645bd3986a7bb4bca35b8b8e599aa7d2681fb86..5bff9fdd5df7b3708739eb099475fa7915f102c7 100644 (file)
@@ -49,8 +49,7 @@ static uint8_t null_uart_receive ( struct uart *uart __unused ) {
        return 0;
 }
 
-static int null_uart_init ( struct uart *uart __unused,
-                           unsigned int baud __unused ) {
+static int null_uart_init ( struct uart *uart __unused ) {
        return 0;
 }
 
index 428771ab508a269437b13a9e5058041b9d10d264..f00e834b4b8cb8832b4e03839bb4a7e650588ad9 100644 (file)
@@ -115,10 +115,9 @@ static void ns16550_flush ( struct uart *uart ) {
  * Initialise UART
  *
  * @v uart             UART
- * @v baud             Baud rate, or zero to leave unchanged
  * @ret rc             Return status code
  */
-static int ns16550_init ( struct uart *uart, unsigned int baud ) {
+static int ns16550_init ( struct uart *uart ) {
        struct ns16550_uart *ns16550 = uart->priv;
        uint8_t dlm;
        uint8_t dll;
@@ -137,8 +136,8 @@ static int ns16550_init ( struct uart *uart, unsigned int baud ) {
        /* Configure divisor and line control register, if applicable */
        ns16550_write ( ns16550, NS16550_LCR,
                        ( NS16550_LCR_8N1 | NS16550_LCR_DLAB ) );
-       if ( baud ) {
-               ns16550->divisor = ( ( ns16550->clock / baud ) /
+       if ( uart->baud ) {
+               ns16550->divisor = ( ( ns16550->clock / uart->baud ) /
                                     NS16550_CLK_BIT );
                dlm = ( ( ns16550->divisor >> 8 ) & 0xff );
                dll = ( ( ns16550->divisor >> 0 ) & 0xff );
index 15adfa93270cf4ff7208402a1347f6c4939f4cc7..f2ecf3ce9290741afc846c400afc0160b4d2148d 100644 (file)
@@ -22,6 +22,9 @@ struct uart {
        /** List of registered UARTs */
        struct list_head list;
 
+       /** Baud rate (if specified) */
+       unsigned int baud;
+
        /** UART operations */
        struct uart_operations *op;
        /** Driver-private data */
@@ -56,10 +59,9 @@ struct uart_operations {
         * Initialise UART
         *
         * @v uart              UART
-        * @v baud              Baud rate, or zero to leave unchanged
         * @ret rc              Return status code
         */
-       int ( * init ) ( struct uart *uart, unsigned int baud );
+       int ( * init ) ( struct uart *uart );
        /**
         * Flush transmitted data
         *
@@ -109,13 +111,12 @@ uart_receive ( struct uart *uart ) {
  * Initialise UART
  *
  * @v uart             UART
- * @v baud             Baud rate, or zero to leave unchanged
  * @ret rc             Return status code
  */
 static inline __attribute__ (( always_inline )) int
-uart_init ( struct uart *uart, unsigned int baud ) {
+uart_init ( struct uart *uart ) {
 
-       return uart->op->init ( uart, baud );
+       return uart->op->init ( uart );
 }
 
 /**