static struct lb_serial *lb_serial(struct lb_header *header) { #if CONFIG_CONSOLE_SERIAL8250 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_IO_MAPPED; serial->baseaddr = CONFIG_TTYS0_BASE; serial->baud = CONFIG_TTYS0_BAUD; return serial; #elif CONFIG_CONSOLE_SERIAL8250MEM || CONFIG_CONSOLE_SERIAL_UART 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 }
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 = (unsigned long)cbmem_addr; } }
static void lb_strings(struct lb_header *header) { static const struct { uint32_t tag; const char *string; } strings[] = { { LB_TAG_VERSION, coreboot_version, }, { LB_TAG_EXTRA_VERSION, coreboot_extra_version, }, { LB_TAG_BUILD, coreboot_build, }, { LB_TAG_COMPILE_TIME, coreboot_compile_time, }, { LB_TAG_COMPILE_BY, coreboot_compile_by, }, { LB_TAG_COMPILE_HOST, coreboot_compile_host, }, { LB_TAG_COMPILE_DOMAIN, coreboot_compile_domain, }, { LB_TAG_COMPILER, coreboot_compiler, }, { LB_TAG_LINKER, coreboot_linker, }, { LB_TAG_ASSEMBLER, coreboot_assembler, }, }; unsigned int i; for(i = 0; i < ARRAY_SIZE(strings); i++) { struct lb_string *rec; size_t len; rec = (struct lb_string *)lb_new_record(header); len = strlen(strings[i].string); rec->tag = strings[i].tag; rec->size = (sizeof(*rec) + len + 1 + 3) & ~3; memcpy(rec->string, strings[i].string, len+1); } }
void cbmem_add_records_to_cbtable(struct lb_header *header) { struct imd_cursor cursor; struct imd *imd; imd = cbmem_get_imd(); if (imd_cursor_init(imd, &cursor)) return; while (1) { const struct imd_entry *e; struct lb_cbmem_entry *lbe; uint32_t id; e = imd_cursor_next(&cursor); if (e == NULL) break; id = imd_entry_id(imd, e); /* Don't add these metadata entries. */ if (id == CBMEM_ID_IMD_ROOT || id == CBMEM_ID_IMD_SMALL) continue; lbe = (struct lb_cbmem_entry *)lb_new_record(header); lbe->tag = LB_TAG_CBMEM_ENTRY; lbe->size = sizeof(*lbe); lbe->address = (uintptr_t)imd_entry_at(imd, e); lbe->entry_size = imd_entry_size(imd, e); lbe->id = id; } }
static void lb_boot_media_params(struct lb_header *header) { struct lb_boot_media_params *bmp; struct cbfs_props props; const struct region_device *boot_dev; struct region_device fmrd; boot_device_init(); if (cbfs_boot_region_properties(&props)) return; boot_dev = boot_device_ro(); if (boot_dev == NULL) return; bmp = (struct lb_boot_media_params *)lb_new_record(header); bmp->tag = LB_TAG_BOOT_MEDIA_PARAMS; bmp->size = sizeof(*bmp); bmp->cbfs_offset = props.offset; bmp->cbfs_size = props.size; bmp->boot_media_size = region_device_sz(boot_dev); bmp->fmap_offset = ~(uint64_t)0; if (find_fmap_directory(&fmrd) == 0) { bmp->fmap_offset = region_device_offset(&fmrd); } }
static void lb_record_version_timestamp(struct lb_header *header) { struct lb_timestamp *rec; rec = (struct lb_timestamp *)lb_new_record(header); rec->tag = LB_TAG_VERSION_TIMESTAMP; rec->size = sizeof(*rec); rec->timestamp = coreboot_version_timestamp; }
static void add_console(struct lb_header *header, u16 consoletype) { struct lb_console *console; console = (struct lb_console *)lb_new_record(header); console->tag = LB_TAG_CONSOLE; console->size = sizeof(*console); console->type = consoletype; }
static void lb_gpios(struct lb_header *header) { struct lb_gpios *gpios; gpios = (struct lb_gpios *)lb_new_record(header); gpios->tag = LB_TAG_GPIO; gpios->size = sizeof(*gpios); gpios->count = 0; fill_lb_gpios(gpios); }
void soc_add_mtc(struct lb_header *header) { struct lb_range *mtc; mtc = (struct lb_range *)lb_new_record(header); mtc->tag = LB_TAG_MTC; mtc->size = sizeof(*mtc); mtc->range_start = (uintptr_t)cbmem_find(CBMEM_ID_MTC); mtc->range_size = mtc_table_size; }
void lb_board(struct lb_header *header) { struct lb_range *dma; dma = (struct lb_range *)lb_new_record(header); dma->tag = LB_TAB_DMA; dma->size = sizeof(*dma); dma->range_start = (uintptr_t)_dma_coherent; dma->range_size = _dma_coherent_size; }
static struct lb_memory *lb_memory(struct lb_header *header) { struct lb_record *rec; struct lb_memory *mem; rec = lb_new_record(header); mem = (struct lb_memory *)rec; mem->tag = LB_TAG_MEMORY; mem->size = sizeof(*mem); return mem; }
void lb_board(struct lb_header *header) { struct lb_range *dma; dma = (struct lb_range *)lb_new_record(header); dma->tag = LB_TAB_DMA; dma->size = sizeof(*dma); dma->range_start = (intptr_t)DMA_START; dma->range_size = DMA_SIZE; }
void lb_add_console(uint16_t consoletype, void *data) { struct lb_header *header = (struct lb_header *)data; struct lb_console *console; console = (struct lb_console *)lb_new_record(header); console->tag = LB_TAG_CONSOLE; console->size = sizeof(*console); console->type = consoletype; }
static void lb_vdat(struct lb_header *header) { #if CONFIG_GENERATE_ACPI_TABLES struct lb_vdat* vdat; vdat = (struct lb_vdat *)lb_new_record(header); vdat->tag = LB_TAG_VDAT; vdat->size = sizeof(*vdat); acpi_get_vdat_info(&vdat->vdat_addr, &vdat->vdat_size); #endif }
static struct lb_forward *lb_forward(struct lb_header *header, struct lb_header *next_header) { struct lb_record *rec; struct lb_forward *forward; rec = lb_new_record(header); forward = (struct lb_forward *)rec; forward->tag = LB_TAG_FORWARD; forward->size = sizeof(*forward); forward->forward = (uint64_t)(unsigned long)next_header; return forward; }
static void lb_vdat(struct lb_header *header) { #if CONFIG_HAVE_ACPI_TABLES struct lb_range *vdat; vdat = (struct lb_range *)lb_new_record(header); vdat->tag = LB_TAG_VDAT; vdat->size = sizeof(*vdat); acpi_get_vdat_info(&vdat->range_start, &vdat->range_size); #endif }
static void lb_vboot_workbuf(struct lb_header *header) { struct lb_range *vbwb; struct vboot_working_data *wd = vboot_get_working_data(); vbwb = (struct lb_range *)lb_new_record(header); vbwb->tag = LB_TAB_VBOOT_WORKBUF; vbwb->size = sizeof(*vbwb); vbwb->range_start = (uintptr_t)wd + wd->buffer_offset; vbwb->range_size = wd->buffer_size; }
static void lb_vbnv(struct lb_header *header) { #if CONFIG(PC80_SYSTEM) struct lb_range *vbnv; vbnv = (struct lb_range *)lb_new_record(header); vbnv->tag = LB_TAG_VBNV; vbnv->size = sizeof(*vbnv); vbnv->range_start = CONFIG_VBOOT_VBNV_OFFSET + 14; vbnv->range_size = VBOOT_VBNV_BLOCK_SIZE; #endif }
static void lb_vbnv(struct lb_header *header) { #if CONFIG_PC80_SYSTEM struct lb_vbnv* vbnv; vbnv = (struct lb_vbnv *)lb_new_record(header); vbnv->tag = LB_TAG_VBNV; vbnv->size = sizeof(*vbnv); vbnv->vbnv_start = CONFIG_VBNV_OFFSET + 14; vbnv->vbnv_size = CONFIG_VBNV_SIZE; #endif }
void lb_add_serial(struct lb_serial *new_serial, void *data) { struct lb_header *header = (struct lb_header *)data; struct lb_serial *serial; serial = (struct lb_serial *)lb_new_record(header); serial->tag = LB_TAG_SERIAL; serial->size = sizeof(*serial); serial->type = new_serial->type; serial->baseaddr = new_serial->baseaddr; serial->baud = new_serial->baud; }
static void lb_ram_code(struct lb_header *header) { #if IS_ENABLED(CONFIG_RAM_CODE_SUPPORT) struct lb_ram_code *code; code = (struct lb_ram_code *)lb_new_record(header); code->tag = LB_TAG_RAM_CODE; code->size = sizeof(*code); code->ram_code = ram_code(); #endif }
static void lb_board_id(struct lb_header *header) { #if CONFIG_BOARD_ID_AUTO || CONFIG_BOARD_ID_MANUAL struct lb_board_id *bid; bid = (struct lb_board_id *)lb_new_record(header); bid->tag = LB_TAG_BOARD_ID; bid->size = sizeof(*bid); bid->board_id = board_id(); #endif }
static void lb_framebuffer(struct lb_header *header) { #if defined(CONFIG_BOOTSPLASH) && CONFIG_BOOTSPLASH && CONFIG_COREBOOT_KEEP_FRAMEBUFFER void fill_lb_framebuffer(struct lb_framebuffer *framebuffer); struct lb_framebuffer *framebuffer; framebuffer = (struct lb_framebuffer *)lb_new_record(header); framebuffer->tag = LB_TAG_FRAMEBUFFER; framebuffer->size = sizeof(*framebuffer); fill_lb_framebuffer(framebuffer); #endif }
static void lb_framebuffer(struct lb_header *header) { struct lb_framebuffer *framebuffer; struct lb_framebuffer fb = {0}; if (!CONFIG(LINEAR_FRAMEBUFFER) || fill_lb_framebuffer(&fb)) return; framebuffer = (struct lb_framebuffer *)lb_new_record(header); memcpy(framebuffer, &fb, sizeof(*framebuffer)); framebuffer->tag = LB_TAG_FRAMEBUFFER; framebuffer->size = sizeof(*framebuffer); }
void lb_table_add_macs_from_vpd(struct lb_header *header) { /* * Mac addresses in the VPD can be stored in two groups, for ethernet * and WiFi, with keys 'ethernet_macX and wifi_macX. */ const char *mac_addr_key_bases[] = {"ethernet_mac0", "wifi_mac0"}; char mac_addr_key[20]; /* large enough for either key */ char mac_addr_str[13]; /* 12 symbols and the trailing zero. */ int i, count; struct lb_macs *macs = NULL; /* Make sure the copy is always zero terminated. */ mac_addr_key[sizeof(mac_addr_key) - 1] = '\0'; count = 0; for (i = 0; i < ARRAY_SIZE(mac_addr_key_bases); i++) { int index_of_index; strncpy(mac_addr_key, mac_addr_key_bases[i], sizeof(mac_addr_key) - 1); index_of_index = strlen(mac_addr_key) - 1; do { /* * If there are no more MAC addresses of this template * in the VPD - move on. */ if (!cros_vpd_gets(mac_addr_key, mac_addr_str, sizeof(mac_addr_str))) break; if (!macs) { macs = (struct lb_macs *)lb_new_record(header); macs->tag = LB_TAG_MAC_ADDRS; } decode_mac(macs->mac_addrs + count, mac_addr_str, mac_addr_key); count++; mac_addr_key[index_of_index]++; } while (count < 10); } if (!count) return; /* No MAC addresses in the VPD. */ macs->count = count; macs->size = sizeof(*macs) + count * sizeof(struct mac_address); }
void lb_ramoops(struct lb_header *header) { void *buffer = cbmem_find(CBMEM_ID_RAM_OOPS); if (buffer == NULL) return; struct lb_range *ramoops; ramoops = (struct lb_range *)lb_new_record(header); ramoops->tag = LB_TAG_RAM_OOPS; ramoops->size = sizeof(*ramoops); ramoops->range_start = (uintptr_t)buffer; ramoops->range_size = CONFIG_CHROMEOS_RAMOOPS_RAM_SIZE; }
void lb_board(struct lb_header *header) { struct lb_range *dma; dma = (struct lb_range *)lb_new_record(header); dma->tag = LB_TAB_DMA; dma->size = sizeof(*dma); dma->range_start = (uintptr_t)_dma_coherent; dma->range_size = _dma_coherent_size; #if IS_ENABLED(CONFIG_CHROMEOS) /* Retrieve the switch interface MAC addressses. */ lb_table_add_macs_from_vpd(header); #endif }
void lb_add_serial(struct lb_serial *new_serial, void *data) { struct lb_header *header = (struct lb_header *)data; struct lb_serial *serial; serial = (struct lb_serial *)lb_new_record(header); serial->tag = LB_TAG_SERIAL; serial->size = sizeof(*serial); serial->type = new_serial->type; serial->baseaddr = new_serial->baseaddr; serial->baud = new_serial->baud; serial->regwidth = new_serial->regwidth; serial->input_hertz = new_serial->input_hertz; serial->uart_pci_addr = new_serial->uart_pci_addr; }
static void lb_vboot_handoff(struct lb_header *header) { void *addr; uint32_t size; struct lb_vboot_handoff* vbho; if (vboot_get_handoff_info(&addr, &size)) return; vbho = (struct lb_vboot_handoff *)lb_new_record(header); vbho->tag = LB_TAB_VBOOT_HANDOFF; vbho->size = sizeof(*vbho); vbho->vboot_handoff_addr = addr; vbho->vboot_handoff_size = size; }
static struct lb_serial *lb_serial(struct lb_header *header) { #if CONFIG_CONSOLE_SERIAL8250 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->ioport = CONFIG_TTYS0_BASE; serial->baud = CONFIG_TTYS0_BAUD; return serial; #else return header; #endif }