aboutsummaryrefslogtreecommitdiff
path: root/fw_cfg.c
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2015-05-21 00:39:02 +0200
committerPaolo Bonzini <pbonzini@redhat.com>2015-05-21 11:44:57 +0200
commit2e7cb17c15c64bfe6394b2a1951fa187c2620c7d (patch)
tree3f42e5910f51339fcc522782529674aa9d9d1543 /fw_cfg.c
parent7cadd5a6fbdbf078c2e6a4d59dcb5e5e2371406e (diff)
downloadqboot-2e7cb17c15c64bfe6394b2a1951fa187c2620c7d.zip
qboot-2e7cb17c15c64bfe6394b2a1951fa187c2620c7d.tar.gz
qboot-2e7cb17c15c64bfe6394b2a1951fa187c2620c7d.tar.bz2
initial fw_cfg support
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'fw_cfg.c')
-rw-r--r--fw_cfg.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/fw_cfg.c b/fw_cfg.c
new file mode 100644
index 0000000..293e4be
--- /dev/null
+++ b/fw_cfg.c
@@ -0,0 +1,50 @@
+#include "bios.h"
+#include "ioport.h"
+#include "string.h"
+#include "fw_cfg.h"
+
+struct fw_cfg_file {
+ uint32_t size;
+ uint16_t select;
+ char name[57];
+};
+
+static struct fw_cfg_file files[32];
+
+void fw_cfg_setup(void)
+{
+ int i, n;
+
+ fw_cfg_select(FW_CFG_FILE_DIR);
+ n = fw_cfg_readl_be();
+ if (n > ARRAY_SIZE(files))
+ n = ARRAY_SIZE(files);
+
+ for (i = 0; i < n; i++) {
+ files[i].size = fw_cfg_readl_be();
+ files[i].select = fw_cfg_readw_be();
+ fw_cfg_readw_be();
+ fw_cfg_read(files[i].name, sizeof(files[i].name) - 1);
+ }
+}
+
+int fw_cfg_file_id(char *name)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(files); i++)
+ if (!strcmp(name, files[i].name))
+ return i;
+
+ return -1;
+}
+
+uint32_t fw_cfg_file_size(int id)
+{
+ return files[id].size;
+}
+
+void fw_cfg_file_select(int id)
+{
+ fw_cfg_select(files[id].select);
+}