summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Georgi <patrick.georgi@coresystems.de>2009-05-17 20:36:45 +0000
committerPatrick Georgi <patrick.georgi@coresystems.de>2009-05-17 20:36:45 +0000
commitc9a6f0f442846b0ed631ddceb062e632c1154da4 (patch)
treed38c38cb3458eedde489f5f6e35e4a6bf47f709d
parent56ae8fcb6fe545557c6b5a3ffb72f54bd3b53ddc (diff)
downloadcoreboot-c9a6f0f442846b0ed631ddceb062e632c1154da4.tar.xz
Add type field to memranges, and fill it from the source data.
type field contains e820 type ids, which are used by coreboot and multiboot (the two source formats), so they can be used as-is. The MEMMAP_RAM_ONLY define is a way to allow a payload to opt for only having CB_MEM_RAM type fields, which might be helpful to support older payloads easily (just add the define, and it won't encounter "weird" fields) Signed-off-by: Patrick Georgi <patrick.georgi@coresystems.de> Acked-by: Peter Stuge <peter@stuge.se> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4291 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
-rw-r--r--payloads/libpayload/i386/coreboot.c4
-rw-r--r--payloads/libpayload/i386/multiboot.c5
-rw-r--r--payloads/libpayload/i386/sysinfo.c5
-rw-r--r--payloads/libpayload/include/sysinfo.h1
4 files changed, 15 insertions, 0 deletions
diff --git a/payloads/libpayload/i386/coreboot.c b/payloads/libpayload/i386/coreboot.c
index 66e02f11b7..95d8f16f76 100644
--- a/payloads/libpayload/i386/coreboot.c
+++ b/payloads/libpayload/i386/coreboot.c
@@ -57,8 +57,10 @@ static void cb_parse_memory(unsigned char *ptr, struct sysinfo_t *info)
struct cb_memory_range *range =
(struct cb_memory_range *)MEM_RANGE_PTR(mem, i);
+#if MEMMAP_RAM_ONLY
if (range->type != CB_MEM_RAM)
continue;
+#endif
info->memrange[info->n_memranges].base =
UNPACK_CB64(range->start);
@@ -66,6 +68,8 @@ static void cb_parse_memory(unsigned char *ptr, struct sysinfo_t *info)
info->memrange[info->n_memranges].size =
UNPACK_CB64(range->size);
+ info->memrange[info->n_memranges].type = range->type;
+
info->n_memranges++;
}
}
diff --git a/payloads/libpayload/i386/multiboot.c b/payloads/libpayload/i386/multiboot.c
index 290283e8ed..82736b14fe 100644
--- a/payloads/libpayload/i386/multiboot.c
+++ b/payloads/libpayload/i386/multiboot.c
@@ -45,15 +45,20 @@ static void mb_parse_mmap(struct multiboot_header *table,
while(ptr < (start + table->mmap_length)) {
struct multiboot_mmap *mmap = (struct multiboot_mmap *) ptr;
+#if MEMMAP_RAM_ONLY
/* 1 == normal RAM. Ignore everything else for now */
if (mmap->type == 1) {
+#endif
info->memrange[info->n_memranges].base = mmap->addr;
info->memrange[info->n_memranges].size = mmap->length;
+ info->memrange[info->n_memranges].type = mmap->type;
if (++info->n_memranges == SYSINFO_MAX_MEM_RANGES)
return;
+#if MEMMAP_RAM_ONLY
}
+#endif
ptr += (mmap->size + sizeof(mmap->size));
}
diff --git a/payloads/libpayload/i386/sysinfo.c b/payloads/libpayload/i386/sysinfo.c
index 02e1d3daec..599a81140d 100644
--- a/payloads/libpayload/i386/sysinfo.c
+++ b/payloads/libpayload/i386/sysinfo.c
@@ -29,6 +29,7 @@
#include <libpayload-config.h>
#include <libpayload.h>
+#include <coreboot_tables.h>
#include <multiboot_tables.h>
/**
@@ -63,9 +64,13 @@ void lib_get_sysinfo(void)
if (!lib_sysinfo.n_memranges) {
/* If we can't get a good memory range, use the default. */
lib_sysinfo.n_memranges = 2;
+
lib_sysinfo.memrange[0].base = 0;
lib_sysinfo.memrange[0].size = 640 * 1024;
+ lib_sysinfo.memrange[0].type = CB_MEM_RAM;
+
lib_sysinfo.memrange[1].base = 1024 * 1024;
lib_sysinfo.memrange[1].size = 31 * 1024 * 1024;
+ lib_sysinfo.memrange[1].type = CB_MEM_RAM;
}
}
diff --git a/payloads/libpayload/include/sysinfo.h b/payloads/libpayload/include/sysinfo.h
index 3b2c69c61d..bcc3d5fbab 100644
--- a/payloads/libpayload/include/sysinfo.h
+++ b/payloads/libpayload/include/sysinfo.h
@@ -42,6 +42,7 @@ struct sysinfo_t {
struct memrange {
unsigned long long base;
unsigned long long size;
+ unsigned int type;
} memrange[SYSINFO_MAX_MEM_RANGES];
struct cb_cmos_option_table *option_table;