mb/emulation/qemu-i440fx: change file handling

Reduce the number of fw_find_file calls by returning the file structure
at fw_cfg_check_file. The file structure can then be used to allocate memory
and access the file content directly without recurrence searching.
Remove now unnecessary function fw_cfg_load_file.

Fixed breaking function calls and add include guard at fw_cfg_if.h.

Change-Id: I48cc943aaa999e4323e9d7e5dd666c5316533dcc
Signed-off-by: Thomas Heijligen <thomas.heijligen@secunet.com>
Reviewed-on: https://review.coreboot.org/c/30845
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Patrick Rudolph <siro@das-labor.org>
diff --git a/src/mainboard/emulation/qemu-i440fx/fw_cfg.c b/src/mainboard/emulation/qemu-i440fx/fw_cfg.c
index f6a3de7..9b394f2 100644
--- a/src/mainboard/emulation/qemu-i440fx/fw_cfg.c
+++ b/src/mainboard/emulation/qemu-i440fx/fw_cfg.c
@@ -81,28 +81,16 @@
 	return NULL;
 }
 
-int fw_cfg_check_file(const char *name)
+int fw_cfg_check_file(FWCfgFile *file, const char *name)
 {
-	FWCfgFile *file;
-
+	FWCfgFile *f;
 	if (!fw_cfg_present())
 		return -1;
-	file = fw_cfg_find_file(name);
-	if (!file)
+	f = fw_cfg_find_file(name);
+	if (!f)
 		return -1;
-	return file->size;
-}
-
-void fw_cfg_load_file(const char *name, void *dst)
-{
-	FWCfgFile *file;
-
-	if (!fw_cfg_present())
-		return;
-	file = fw_cfg_find_file(name);
-	if (!file)
-		return;
-	fw_cfg_get(file->select, dst, file->size);
+	*file = *f;
+	return 0;
 }
 
 int fw_cfg_max_cpus(void)
@@ -202,21 +190,21 @@
 
 unsigned long fw_cfg_acpi_tables(unsigned long start)
 {
+	FWCfgFile f;
 	BiosLinkerLoaderEntry *s;
 	unsigned long *addrs, current;
 	uint8_t *ptr;
-	int rc, i, j, src, dst, max;
+	int i, j, src, dst, max;
 
-	rc = fw_cfg_check_file("etc/table-loader");
-	if (rc < 0)
+	if (fw_cfg_check_file(&f, "etc/table-loader"))
 		return 0;
 
 	printk(BIOS_DEBUG, "QEMU: found ACPI tables in fw_cfg.\n");
 
-	max = rc / sizeof(*s);
-	s = malloc(rc);
+	max = f.size / sizeof(*s);
+	s = malloc(f.size);
 	addrs = malloc(max * sizeof(*addrs));
-	fw_cfg_load_file("etc/table-loader", s);
+	fw_cfg_get(f.select, s, f.size);
 
 	current = start;
 	for (i = 0; i < max && s[i].command != 0; i++) {
@@ -227,14 +215,14 @@
 		switch (s[i].command) {
 		case BIOS_LINKER_LOADER_COMMAND_ALLOCATE:
 			current = ALIGN(current, s[i].alloc.align);
-			rc = fw_cfg_check_file(s[i].alloc.file);
-			if (rc < 0)
+			if (fw_cfg_check_file(&f, s[i].alloc.file))
 				goto err;
+
 			printk(BIOS_DEBUG, "QEMU: loading \"%s\" to 0x%lx (len %d)\n",
-			       s[i].alloc.file, current, rc);
-			fw_cfg_load_file(s[i].alloc.file, (void*)current);
+			       s[i].alloc.file, current, f.size);
+			fw_cfg_get(f.select, (void *)current, sizeof(current));
 			addrs[i] = current;
-			current += rc;
+			current += f.size;
 			break;
 
 		case BIOS_LINKER_LOADER_COMMAND_ADD_POINTER:
@@ -400,15 +388,16 @@
  */
 unsigned long fw_cfg_smbios_tables(int *handle, unsigned long *current)
 {
+	FWCfgFile f;
 	struct smbios_type0 *t0;
 	unsigned long start, end;
-	int len, ret, i, count = 1;
+	int ret, i, count = 1;
 	char *str;
 
-	len = fw_cfg_check_file("etc/smbios/smbios-tables");
-	if (len < 0)
+	if (fw_cfg_check_file(&f, "etc/smbios/smbios-tables"))
 		return 0;
-	printk(BIOS_DEBUG, "QEMU: found smbios tables in fw_cfg (len %d).\n", len);
+
+	printk(BIOS_DEBUG, "QEMU: found smbios tables in fw_cfg (len %d).\n", f.size);
 
 	/*
 	 * Search backwards for "coreboot" (first string in type0 table,
@@ -434,7 +423,7 @@
 	 * We'll exclude the end marker as coreboot will add one.
 	 */
 	printk(BIOS_DEBUG, "QEMU: loading smbios tables to 0x%lx\n", start);
-	fw_cfg_load_file("etc/smbios/smbios-tables", (void*)start);
+	fw_cfg_get(f.select, (void *)start, sizeof(start));
 	end = start;
 	do {
 		t0 = (struct smbios_type0*)end;
@@ -442,7 +431,7 @@
 			break;
 		end = smbios_next(end);
 		count++;
-	} while (end < start + len);
+	} while (end < start + f.size);
 
 	/* final fixups. */
 	ret = end - *current;
diff --git a/src/mainboard/emulation/qemu-i440fx/fw_cfg.h b/src/mainboard/emulation/qemu-i440fx/fw_cfg.h
index 5bf16af..b5cdb92 100644
--- a/src/mainboard/emulation/qemu-i440fx/fw_cfg.h
+++ b/src/mainboard/emulation/qemu-i440fx/fw_cfg.h
@@ -10,9 +10,13 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  */
+#ifndef FW_CFG_H
+#define FW_CFG_H
+#include "fw_cfg_if.h"
 
 void fw_cfg_get(int entry, void *dst, int dstlen);
-int fw_cfg_check_file(const char *name);
-void fw_cfg_load_file(const char *name, void *dst);
+int fw_cfg_check_file(FWCfgFile *file, const char *name);
 int fw_cfg_max_cpus(void);
 unsigned long fw_cfg_smbios_tables(int *handle, unsigned long *current);
+
+#endif /* FW_CFG_H */
diff --git a/src/mainboard/emulation/qemu-i440fx/fw_cfg_if.h b/src/mainboard/emulation/qemu-i440fx/fw_cfg_if.h
index 8f1e24c..46aee9b 100644
--- a/src/mainboard/emulation/qemu-i440fx/fw_cfg_if.h
+++ b/src/mainboard/emulation/qemu-i440fx/fw_cfg_if.h
@@ -16,6 +16,8 @@
  * This are the qemu firmware config interface defines and structs.
  * Copyed over from qemu soure tree, include/hw/nvram/fw_cfg.h
  */
+#ifndef FW_CFG_IF_H
+#define FW_CFG_IF_H
 
 #include <stdint.h>
 
@@ -90,3 +92,5 @@
 	uint8_t  tabletype;
 	uint16_t fieldoffset;
 } FwCfgSmbios;
+
+#endif /* FW_CFG_IF_H */
diff --git a/src/mainboard/emulation/qemu-i440fx/northbridge.c b/src/mainboard/emulation/qemu-i440fx/northbridge.c
index 764e8a0..0ff4c54 100644
--- a/src/mainboard/emulation/qemu-i440fx/northbridge.c
+++ b/src/mainboard/emulation/qemu-i440fx/northbridge.c
@@ -59,17 +59,16 @@
 	struct resource *res;
 	unsigned long tomk = 0, high;
 	int idx = 10;
-	int size;
+	FWCfgFile f;
 
 	pci_domain_read_resources(dev);
 
-	size = fw_cfg_check_file("etc/e820");
-	if (size > 0) {
+	if (!fw_cfg_check_file(&f, "etc/e820") && f.size > 0) {
 		/* supported by qemu 1.7+ */
-		FwCfgE820Entry *list = malloc(size);
+		FwCfgE820Entry *list = malloc(f.size);
 		int i;
-		fw_cfg_load_file("etc/e820", list);
-		for (i = 0; i < size/sizeof(*list); i++) {
+		fw_cfg_get(f.select, list, f.size);
+		for (i = 0; i < f.size / sizeof(*list); i++) {
 			switch (list[i].type) {
 			case 1: /* RAM */
 				printk(BIOS_DEBUG, "QEMU: e820/ram: 0x%08llx +0x%08llx\n",