This patch implements a "flash friendly" value for initialized areas of flash.
authorRonald G. Minnich <rminnich@gmail.com>
Sat, 16 May 2009 23:05:20 +0000 (23:05 +0000)
committerRonald G. Minnich <rminnich@gmail.com>
Sat, 16 May 2009 23:05:20 +0000 (23:05 +0000)
It makes the write part of flashrom dramatically faster with small
payloads like filo; and it also eliminates unnecessary wear on flash
by not writing zeros (it's unlikely this really matters; let me know
next time you flash a BIOS flash 100,000 times!).

More importantly, it allows for future partial flash upgrades with cbfs.

Note that uninitialized_flash_value is a global that can, if we ever need it,
be set by an argument in main. Assuming we ever see a flash where the
"erased" value is 0, not 0xff.

At the same time, "erased" value has been "1" on every EEPROM or
FLASH I've used for some time now.

Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Acked-by: Peter Stuge <peter@stuge.se>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@4290 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1

util/cbfstool/cbfstool.h
util/cbfstool/util.c

index dc52bfb16b10c58f81d284aee4f12807e4120d8b..5804fdef505dea3d79202172e3ba3a2d8be2611d 100644 (file)
@@ -56,6 +56,7 @@ struct rom {
 /* Function prototypes */
 
 /* util.c */
+void flashinit(void *ptr, size_t len);
 int open_rom(struct rom *rom, const char *filename);
 int create_rom(struct rom *rom, const unsigned char *filename, int size,
               const char *bootblockname, int bootblocksize,
index b36e9187a08f2a9577157a7d061ec525a1306ff0..f0c0b293cfe8a2c224f17791726adaaaeace9cb4 100644 (file)
 #include <sys/mman.h>
 #include "cbfstool.h"
 
+int uninitialized_flash_value = 0xff;
+
+void flashinit(void *ptr, size_t len)
+{
+       memset(ptr, uninitialized_flash_value, len);
+}
+
 int get_size(const char *size)
 {
        char *next;
@@ -203,6 +210,9 @@ int create_rom(struct rom *rom, const unsigned char *filename,
                return -1;
        }
 
+       /* mmap'ed pages are by default zero-filled. Fix that. */
+       flashinit(rom->ptr, romsize);
+
        /* This is a pointer to the header for easy access */
        rom->header = (struct cbfs_header *)
            ROM_PTR(rom, rom->size - 16 - bootblocksize - sizeof(struct cbfs_header));