Refactor publishing CBMEM addresses through coreboot table.
[coreboot.git] / src / arch / x86 / boot / coreboot_table.c
index a7e8bbc41215e4a209ac7e233743797f68650a05..a9ff6f0f1be63d455fef4072de74326fe092efc8 100644 (file)
 #include <version.h>
 #include <device/device.h>
 #include <stdlib.h>
+#include <cbfs.h>
+#include <cbmem.h>
 #if CONFIG_USE_OPTION_TABLE
 #include <option_table.h>
-#include <cbfs.h>
 #endif
 
 static struct lb_header *lb_table_init(unsigned long addr)
@@ -117,16 +118,20 @@ static struct lb_serial *lb_serial(struct lb_header *header)
        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;
+       if (uartmem_getbaseaddr()) {
+               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 {
+               return NULL;
+       }
 #else
        return NULL;
 #endif
@@ -174,6 +179,40 @@ static void lb_framebuffer(struct lb_header *header)
 #endif
 }
 
+static void add_cbmem_pointers(struct lb_header *header)
+{
+       /*
+        * These CBMEM sections' addresses are included in the coreboot table
+        * with the appropriate tags.
+        */
+       const struct section_id {
+               int cbmem_id;
+               int table_tag;
+       } section_ids[] = {
+               {CBMEM_ID_TIMESTAMP, LB_TAG_TIMESTAMPS},
+               {CBMEM_ID_CONSOLE, LB_TAG_CBMEM_CONSOLE}
+       };
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(section_ids); i++) {
+               const struct section_id *sid = section_ids + i;
+               struct lb_cbmem_ref *cbmem_ref;
+               void *cbmem_addr = cbmem_find(sid->cbmem_id);
+
+               if (!cbmem_addr)
+                       continue;  /* This section is not present */
+
+               cbmem_ref = (struct lb_cbmem_ref *)lb_new_record(header);
+               if (!cbmem_ref) {
+                       printk(BIOS_ERR, "No more room in coreboot table!\n");
+                       break;
+               }
+               cbmem_ref->tag = sid->table_tag;
+               cbmem_ref->size = sizeof(*cbmem_ref);
+               cbmem_ref->cbmem_addr = cbmem_addr;
+       }
+}
+
 static struct lb_mainboard *lb_mainboard(struct lb_header *header)
 {
        struct lb_record *rec;
@@ -513,10 +552,6 @@ static void add_lb_reserved(struct lb_memory *mem)
                lb_add_rsvd_range, mem);
 }
 
-#if CONFIG_WRITE_HIGH_TABLES
-extern uint64_t high_tables_base, high_tables_size;
-#endif
-
 unsigned long write_coreboot_table(
        unsigned long low_table_start, unsigned long low_table_end,
        unsigned long rom_table_start, unsigned long rom_table_end)
@@ -619,6 +654,8 @@ unsigned long write_coreboot_table(
        /* Record our framebuffer */
        lb_framebuffer(head);
 
+       add_cbmem_pointers(head);
+
        /* Remember where my valid memory ranges are */
        return lb_table_fini(head, 1);