Author: rminnich
Date: 2009-04-04 00:23:34 +0200 (Sat, 04 Apr 2009)
New Revision: 4060

Modified:
   trunk/coreboot-v2/src/include/romfs.h
   trunk/coreboot-v2/src/lib/romfs.c
Log:
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 <[email protected]>
Acked-by: Myles Watson <[email protected]>




Modified: trunk/coreboot-v2/src/include/romfs.h
===================================================================
--- trunk/coreboot-v2/src/include/romfs.h       2009-04-03 20:14:59 UTC (rev 
4059)
+++ trunk/coreboot-v2/src/include/romfs.h       2009-04-03 22:23:34 UTC (rev 
4060)
@@ -162,8 +162,7 @@
 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

Modified: trunk/coreboot-v2/src/lib/romfs.c
===================================================================
--- trunk/coreboot-v2/src/lib/romfs.c   2009-04-03 20:14:59 UTC (rev 4059)
+++ trunk/coreboot-v2/src/lib/romfs.c   2009-04-03 22:23:34 UTC (rev 4060)
@@ -73,7 +73,7 @@
 {
        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 @@
        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)


-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to