mb/emulation/qemu-i440fx: add e820 interface
Qemu provides e820 table at fw_cfg interface. Add functions to access it. Change-Id: I547bc7fef09999baa28149a6325cbca91e31e99b Signed-off-by: Thomas Heijligen <thomas.heijligen@secunet.com> Reviewed-on: https://review.coreboot.org/c/30848 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Patrick Rudolph <siro@das-labor.org>
This commit is contained in:
parent
721c8b457b
commit
da9aa6ddd7
|
@ -83,6 +83,45 @@ int fw_cfg_check_file(FWCfgFile *file, const char *name)
|
||||||
return fw_cfg_find_file(file, name);
|
return fw_cfg_find_file(file, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int fw_cfg_e820_select(uint32_t *size)
|
||||||
|
{
|
||||||
|
FWCfgFile file;
|
||||||
|
|
||||||
|
if (!fw_cfg_present() || fw_cfg_find_file(&file, "etc/e820"))
|
||||||
|
return -1;
|
||||||
|
fw_cfg_select(file.select);
|
||||||
|
*size = file.size;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int fw_cfg_e820_read(FwCfgE820Entry *entry, uint32_t *size,
|
||||||
|
uint32_t *pos)
|
||||||
|
{
|
||||||
|
if (*pos + sizeof(*entry) > *size)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
fw_cfg_read(entry, sizeof(*entry));
|
||||||
|
*pos += sizeof(*entry);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* returns tolud on success or 0 on failure */
|
||||||
|
uintptr_t fw_cfg_tolud(void)
|
||||||
|
{
|
||||||
|
FwCfgE820Entry e;
|
||||||
|
uint64_t top = 0;
|
||||||
|
uint32_t size = 0, pos = 0;
|
||||||
|
|
||||||
|
if (fw_cfg_e820_select(&size)) {
|
||||||
|
while (!fw_cfg_e820_read(&e, &size, &pos)) {
|
||||||
|
uint64_t limit = e.address + e.length;
|
||||||
|
if (e.type == 1 && limit < 4ULL * GiB && limit > top)
|
||||||
|
top = limit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (uintptr_t)top;
|
||||||
|
}
|
||||||
|
|
||||||
int fw_cfg_max_cpus(void)
|
int fw_cfg_max_cpus(void)
|
||||||
{
|
{
|
||||||
unsigned short max_cpus;
|
unsigned short max_cpus;
|
||||||
|
|
|
@ -18,5 +18,6 @@ void fw_cfg_get(uint16_t entry, void *dst, int dstlen);
|
||||||
int fw_cfg_check_file(FWCfgFile *file, const char *name);
|
int fw_cfg_check_file(FWCfgFile *file, const char *name);
|
||||||
int fw_cfg_max_cpus(void);
|
int fw_cfg_max_cpus(void);
|
||||||
unsigned long fw_cfg_smbios_tables(int *handle, unsigned long *current);
|
unsigned long fw_cfg_smbios_tables(int *handle, unsigned long *current);
|
||||||
|
uintptr_t fw_cfg_tolud(void);
|
||||||
|
|
||||||
#endif /* FW_CFG_H */
|
#endif /* FW_CFG_H */
|
||||||
|
|
Loading…
Reference in New Issue