Extend coreboot table entry for serial ports
authorStefan Reinauer <reinauer@chromium.org>
Wed, 22 Jun 2011 23:39:19 +0000 (16:39 -0700)
committerStefan Reinauer <stefan.reinauer@coreboot.org>
Fri, 21 Oct 2011 21:34:30 +0000 (23:34 +0200)
Add information about memory mapped/io mapped base addresses.

and fix up libpayload to use the same structures

Signed-off-by: Stefan Reinauer <reinauer@google.com>
Change-Id: I5f7b5eda6063261b9acb7a46310172d4a5471dfb
Reviewed-on: http://review.coreboot.org/261
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
payloads/libpayload/arch/i386/coreboot.c
payloads/libpayload/arch/powerpc/coreboot.c
payloads/libpayload/include/coreboot_tables.h
src/arch/x86/boot/coreboot_table.c
src/console/uart8250mem_console.c
src/include/boot/coreboot_tables.h
src/include/uart8250.h

index e3c944d443d85ee8b3c3b823e5c630bc168b68f4..bdef4e85d3de9866651233e99d26e05cb5893d7b 100644 (file)
@@ -77,7 +77,9 @@ static void cb_parse_memory(unsigned char *ptr, struct sysinfo_t *info)
 static void cb_parse_serial(unsigned char *ptr, struct sysinfo_t *info)
 {
        struct cb_serial *ser = (struct cb_serial *)ptr;
-       info->ser_ioport = ser->ioport;
+       if (ser->type != CB_SERIAL_TYPE_IO_MAPPED)
+               return;
+       info->ser_ioport = ser->baseaddr;
 }
 
 #ifdef CONFIG_NVRAM
index ee1842c82f8c15f7c20e15f9c707df8d59e86e48..7da87ed2f2f25cf9c37e9d3f1e2ad3dea739173f 100644 (file)
@@ -77,7 +77,9 @@ static void cb_parse_memory(unsigned char *ptr, struct sysinfo_t *info)
 static void cb_parse_serial(unsigned char *ptr, struct sysinfo_t *info)
 {
        struct cb_serial *ser = (struct cb_serial *)ptr;
-       info->ser_ioport = ser->ioport;
+       if (ser->type != CB_SERIAL_TYPE_IO_MAPPED)
+               return;
+       info->ser_ioport = ser->baseaddr;
 }
 
 #ifdef CONFIG_NVRAM
index c4dc1158adf3425fdbf7c5266d997f5535b477e5..d342c992c4c212cf12ffedfa481952a7ffa728d8 100644 (file)
@@ -60,9 +60,13 @@ struct cb_memory_range {
        u32 type;
 };
 
-#define CB_MEM_RAM      1
-#define CB_MEM_RESERVED 2
-#define CB_MEM_TABLE    16
+#define CB_MEM_RAM          1
+#define CB_MEM_RESERVED     2
+#define CB_MEM_ACPI         3
+#define CB_MEM_NVS          4
+#define CB_MEM_UNUSABLE     5
+#define CB_MEM_VENDOR_RSVD  6
+#define CB_MEM_TABLE       16
 
 struct cb_memory {
        u32 tag;
@@ -110,7 +114,11 @@ struct cb_string {
 struct cb_serial {
        u32 tag;
        u32 size;
-       u16 ioport;
+#define CB_SERIAL_TYPE_IO_MAPPED     1
+#define CB_SERIAL_TYPE_MEMORY_MAPPED 2
+       u32 type;
+       u32 baseaddr;
+       u32 baud;
 };
 
 #define CB_TAG_CONSOLE       0x00010
index cdfc0c1d8d79d1ce6176febc290421fcf175a0f1..78ff97d21b3cea838d15a0304ad55e0d73454d61 100644 (file)
@@ -112,7 +112,19 @@ static struct lb_serial *lb_serial(struct lb_header *header)
        serial = (struct lb_serial *)rec;
        serial->tag = LB_TAG_SERIAL;
        serial->size = sizeof(*serial);
-       serial->ioport = CONFIG_TTYS0_BASE;
+       serial->type = LB_SERIAL_TYPE_IO_MAPPED;
+       serial->baseaddr = CONFIG_TTYS0_BASE;
+       serial->baud = CONFIG_TTYS0_BAUD;
+       return serial;
+#elif CONFIG_CONSOLE_SERIAL8250MEM
+       struct lb_record *rec;
+       struct lb_serial *serial;
+       rec = lb_new_record(header);
+       serial = (struct lb_serial *)rec;
+       serial->tag = LB_TAG_SERIAL;
+       serial->size = sizeof(*serial);
+       serial->type = LB_SERIAL_TYPE_MEMORY_MAPPED;
+       serial->baseaddr = uartmem_getbaseaddr();
        serial->baud = CONFIG_TTYS0_BAUD;
        return serial;
 #else
@@ -131,7 +143,6 @@ static void add_console(struct lb_header *header, u16 consoletype)
        console->size = sizeof(*console);
        console->type = consoletype;
 }
-
 #endif
 
 static void lb_console(struct lb_header *header)
index e622ad090cb6f35b25d59cb83df1097884cafd17..923df99df1c893d0d98a554b46286f2682bad2f7 100644 (file)
@@ -28,6 +28,11 @@ static void uartmem_init(void)
        uart_bar = uart_mem_init();
 }
 
+u32 uartmem_getbaseaddr(void)
+{
+       return uart_bar;
+}
+
 static void uartmem_tx_byte(unsigned char data)
 {
        if (!uart_bar)
index 983b03f602f364701b9ffdb5b45bfc88bb591942..45ba3af110e20a56624cbe281062dd95568aed14 100644 (file)
@@ -146,7 +146,10 @@ struct lb_string {
 struct lb_serial {
        uint32_t tag;
        uint32_t size;
-       uint16_t ioport;
+#define LB_SERIAL_TYPE_IO_MAPPED     1
+#define LB_SERIAL_TYPE_MEMORY_MAPPED 2
+       uint32_t type;
+       uint32_t baseaddr;
        uint32_t baud;
 };
 
index 4a02179210283085f6dea7c22e3be77543d0e281..3c8ea0929138d8d052e389340befe6852d6e64f1 100644 (file)
@@ -146,6 +146,7 @@ void uart8250_mem_tx_byte(unsigned base_port, unsigned char data);
 void uart8250_mem_tx_flush(unsigned base_port);
 void uart8250_mem_init(unsigned base_port, unsigned divisor);
 u32 uart_mem_init(void);
+u32 uartmem_getbaseaddr(void);
 
 /* and special init for OXPCIe based cards */
 void oxford_init(void);