attached.

ron
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).

Signed-off-by: Ronald G. Minnich <[email protected]>

Index: src/lib/romfs.c
===================================================================
--- src/lib/romfs.c	(revision 4043)
+++ src/lib/romfs.c	(working copy)
@@ -130,17 +130,34 @@
 	return (void *) ROMFS_SUBHEADER(file);
 }
 
-int romfs_load_optionrom(const char *name, u32 dest)
+void *romfs_load_optionrom(u16 vendor, u16 device, u32 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 *) src,
 			     (void *) dest,
 			     ntohl(orom->len)))
 		return -1;
-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to