/* === Parsing code === */
/* This is the generic parsing code. */
-static void cb_parse_memory(unsigned char *ptr, struct sysinfo_t *info)
+static void cb_parse_memory(void *ptr, struct sysinfo_t *info)
{
- struct cb_memory *mem = (struct cb_memory *)ptr;
+ struct cb_memory *mem = ptr;
int count = MEM_RANGE_COUNT(mem);
int i;
info->n_memranges = 0;
for (i = 0; i < count; i++) {
- struct cb_memory_range *range =
- (struct cb_memory_range *)MEM_RANGE_PTR(mem, i);
+ struct cb_memory_range *range = MEM_RANGE_PTR(mem, i);
-#if MEMMAP_RAM_ONLY
+#ifdef CONFIG_MEMMAP_RAM_ONLY
if (range->type != CB_MEM_RAM)
continue;
#endif
info->memrange[info->n_memranges].base =
- UNPACK_CB64(range->start);
+ cb_unpack64(range->start);
info->memrange[info->n_memranges].size =
- UNPACK_CB64(range->size);
+ cb_unpack64(range->size);
info->memrange[info->n_memranges].type = range->type;
}
}
-static void cb_parse_serial(unsigned char *ptr, struct sysinfo_t *info)
+static void cb_parse_serial(void *ptr, struct sysinfo_t *info)
{
- struct cb_serial *ser = (struct cb_serial *)ptr;
- info->ser_ioport = ser->ioport;
+ struct cb_serial *ser = ptr;
+ if (ser->type != CB_SERIAL_TYPE_IO_MAPPED)
+ return;
+ info->ser_ioport = ser->baseaddr;
+}
+
+static void cb_parse_version(void *ptr, struct sysinfo_t *info)
+{
+ struct cb_string *ver = ptr;
+ info->cb_version = (char *)ver->string;
}
#ifdef CONFIG_NVRAM
-static void cb_parse_optiontable(unsigned char *ptr, struct sysinfo_t *info)
+static void cb_parse_optiontable(void *ptr, struct sysinfo_t *info)
{
- info->option_table = (struct cb_cmos_option_table *)ptr;
+ info->option_table = ptr;
}
-static void cb_parse_checksum(unsigned char *ptr, struct sysinfo_t *info)
+static void cb_parse_checksum(void *ptr, struct sysinfo_t *info)
{
- struct cb_cmos_checksum *cmos_cksum = (struct cb_cmos_checksum *)ptr;
+ struct cb_cmos_checksum *cmos_cksum = ptr;
info->cmos_range_start = cmos_cksum->range_start;
info->cmos_range_end = cmos_cksum->range_end;
info->cmos_checksum_location = cmos_cksum->location;
}
#endif
+#ifdef CONFIG_COREBOOT_VIDEO_CONSOLE
+static void cb_parse_framebuffer(void *ptr, struct sysinfo_t *info)
+{
+ info->framebuffer = ptr;
+}
+#endif
+
static int cb_parse_header(void *addr, int len, struct sysinfo_t *info)
{
struct cb_header *header;
- unsigned char *ptr = (unsigned char *)addr;
+ unsigned char *ptr = addr;
int i;
for (i = 0; i < len; i += 16, ptr += 16) {
case CB_TAG_SERIAL:
cb_parse_serial(ptr, info);
break;
+ case CB_TAG_VERSION:
+ cb_parse_version(ptr, info);
+ break;
#ifdef CONFIG_NVRAM
case CB_TAG_CMOS_OPTION_TABLE:
cb_parse_optiontable(ptr, info);
case CB_TAG_OPTION_CHECKSUM:
cb_parse_checksum(ptr, info);
break;
+#endif
+#ifdef CONFIG_COREBOOT_VIDEO_CONSOLE
+ // FIXME we should warn on serial if coreboot set up a
+ // framebuffer buf the payload does not know about it.
+ case CB_TAG_FRAMEBUFFER:
+ cb_parse_framebuffer(ptr, info);
+ break;
#endif
}