diff options
author | Ronald G. Minnich <rminnich@gmail.com> | 2009-04-03 22:23:34 +0000 |
---|---|---|
committer | Ronald G. Minnich <rminnich@gmail.com> | 2009-04-03 22:23:34 +0000 |
commit | d7a709a60fa8b7fa948a2f1996383bf3bde105ad (patch) | |
tree | 1130a6d787a71e83e031719d2f0883353487c7ba /src | |
parent | ace2dc59627a733d43ba00342745e30ac95768d3 (diff) | |
download | coreboot-d7a709a60fa8b7fa948a2f1996383bf3bde105ad.tar.xz |
These are some cleanups and changes. These are build and boot tested on qemu.
Some changes for option roms:
- don't make users pick the name. Names for option roms are in the v3-defined
format of pci%04x,%04x.rom with the vendor and device id filling in the
%04x.
- users pass in vendor and device id.
- users pass in a dest. If the dest is 0, the address of the ROM image in
FLASH is returned. If the address is non-zero, then the decmpressor is called,
and it will make sure the ROM image is copied to the destination (even
in the uncompressed case).
And some type and print cleanup.
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Acked-by: Myles Watson <mylesgw@gmail.com>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4060 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'src')
-rw-r--r-- | src/include/romfs.h | 3 | ||||
-rw-r--r-- | src/lib/romfs.c | 35 |
2 files changed, 27 insertions, 11 deletions
diff --git a/src/include/romfs.h b/src/include/romfs.h index 8456eda269..9867973aa1 100644 --- a/src/include/romfs.h +++ b/src/include/romfs.h @@ -162,8 +162,7 @@ void * romfs_load_payload(struct lb_memory *lb_mem, const char *name); void * romfs_load_stage(const char *name); int romfs_execute_stage(const char *name); void * romfs_get_file(const char *name); -int romfs_load_optionrom(const char *name, u32 dest); - +void *romfs_load_optionrom(u16 vendor, u16 device, void * dest); int run_address(void *f); #endif diff --git a/src/lib/romfs.c b/src/lib/romfs.c index 87095cfb07..b95b5e2390 100644 --- a/src/lib/romfs.c +++ b/src/lib/romfs.c @@ -73,7 +73,7 @@ struct romfs_header *romfs_master_header(void) { struct romfs_header *header; - unsigned long ptr = *((unsigned long *) ROMFS_HEADPTR_ADDR); + void *ptr = (void *)*((unsigned long *) ROMFS_HEADPTR_ADDR); printk_debug("Check ROMFS header at %p\n", ptr); header = (struct romfs_header *) ptr; @@ -130,22 +130,39 @@ struct romfs_stage *romfs_find_file(const char *name, int type) return (void *) ROMFS_SUBHEADER(file); } -int romfs_load_optionrom(const char *name, u32 dest) +void *romfs_load_optionrom(u16 vendor, u16 device, void * dest) { - struct romfs_optionrom *orom = (struct romfs_optionrom *) + char name[17]; + struct romfs_optionrom *orom; + u8 *src; + + sprintf(name,"pci%04x,%04x.rom", vendor, device); + + orom = (struct romfs_optionrom *) romfs_find_file(name, ROMFS_TYPE_OPTIONROM); if (orom == NULL) - return -1; + return NULL; + + /* They might have specified a dest address. If so, we can decompress. + * If not, there's not much hope of decompressing or relocating the rom. + * in the common case, the expansion rom is uncompressed, we + * pass 0 in for the dest, and all we have to do is find the rom and + * return a pointer to it. + */ + + src = ((unsigned char *) orom) + sizeof(struct romfs_optionrom); + + if (! dest) + return src; if (romfs_decompress(ntohl(orom->compression), - ((unsigned char *) orom) + - sizeof(struct romfs_optionrom), - (void *) dest, + src, + dest, ntohl(orom->len))) - return -1; + return NULL; - return 0; + return dest; } void * romfs_load_payload(struct lb_memory *lb_mem, const char *name) |