diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2015-05-21 00:39:02 +0200 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2015-05-21 11:44:57 +0200 |
commit | 2e7cb17c15c64bfe6394b2a1951fa187c2620c7d (patch) | |
tree | 3f42e5910f51339fcc522782529674aa9d9d1543 /fw_cfg.c | |
parent | 7cadd5a6fbdbf078c2e6a4d59dcb5e5e2371406e (diff) | |
download | qboot-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.c | 50 |
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); +} |