On Sat, Nov 29, 2008 at 9:15 AM, Carl-Daniel Hailfinger
<[EMAIL PROTECTED]> wrote:
> This is a patch which stores eraseblock sizes in struct flashchip. I
> decided to fill in the info for a few chips to illustrate how this works
> both for uniform and non-uniform sector sizes.

This is to unify different kinds of things.

> Index: flashrom-eraseblocks/flashchips.c
...
> +       {"AMIC",        "A29002B",              AMIC_ID_NOPREFIX, 
> AMIC_A29002B,         256,    64 * 1024,      
> {{16384,1},{8192,2},{32768,1},{65536,3}},TEST_UNTESTED, probe_29f002,         
>   erase_29f002,           NULL,           write_29f002},
> +       {"AMIC",        "A29002T",              AMIC_ID_NOPREFIX, 
> AMIC_A29002T,         256,    64 * 1024,      
> {{65536,3},{32768,1},{8192,2},{16384,1}},TEST_OK_PREW,  probe_29f002,         
>   erase_29f002,           NULL,           write_29f002},
...
> +       {"EON",         "EN29F002(A)(N)B",      EON_ID,         EN_29F002B,   
>           256,    256,            
> {{16384,1},{8192,2},{32768,1},{65536,3}},TEST_UNTESTED, probe_jedec,          
>   erase_chip_jedec,       NULL,           write_en29f002a},
> +       {"EON",         "EN29F002(A)(N)T",      EON_ID,         EN_29F002T,   
>           256,    256,            
> {{65536,3},{32768,1},{8192,2},{16384,1}},TEST_OK_PREW,  probe_jedec,          
>   erase_chip_jedec,       NULL,           write_en29f002a},
> +       {"Fujitsu",     "MBM29F004BC",          FUJITSU_ID,     MBM29F004BC,  
>           512,    64 * 1024,      
> {{16384,1},{8192,2},{32768,1},{65536,7}},TEST_UNTESTED, probe_jedec,          
>   NULL,                   NULL,           NULL},
> +       {"Fujitsu",     "MBM29F004TC",          FUJITSU_ID,     MBM29F004TC,  
>           512,    64 * 1024,      
> {{65536,7},{32768,1},{8192,2},{16384,1}},TEST_UNTESTED, probe_jedec,          
>   NULL,                   NULL,           NULL},
> +       {"Fujitsu",     "MBM29F400BC",          FUJITSU_ID,     MBM29F400BC,  
>           512,    64 * 1024,      
> {{16384,1},{8192,2},{32768,1},{65536,7}},TEST_UNTESTED, probe_m29f400bt,      
>   erase_m29f400bt,        NULL,           write_coreboot_m29f400bt},
> +       {"Fujitsu",     "MBM29F400TC",          FUJITSU_ID,     MBM29F400TC,  
>           512,    64 * 1024,      
> {{65536,7},{32768,1},{8192,2},{16384,1}},TEST_UNTESTED, probe_m29f400bt,      
>   erase_m29f400bt,        NULL,           write_coreboot_m29f400bt},
...
> +       {"Macronix",    "MX25L512",             MX_ID,          MX_25L512,    
>           64,     256,            {{4096,16}},                            
> TEST_UNTESTED,  probe_spi_rdid,         spi_chip_erase_c7,      NULL,         
>   spi_chip_write, spi_chip_read},
> +       {"Macronix",    "MX25L1005",            MX_ID,          MX_25L1005,   
>           128,    256,            {{4096,32}},                            
> TEST_UNTESTED,  probe_spi_rdid,         spi_chip_erase_c7,      NULL,         
>   spi_chip_write, spi_chip_read},
> +       {"Macronix",    "MX25L2005",            MX_ID,          MX_25L2005,   
>           256,    256,            {{4096,64}},                            
> TEST_UNTESTED,  probe_spi_rdid,         spi_chip_erase_c7,      NULL,         
>   spi_chip_write, spi_chip_read},
> +       {"Macronix",    "MX25L4005",            MX_ID,          MX_25L4005,   
>           512,    256,            {{4096,128}},                           
> TEST_OK_PREW,   probe_spi_rdid,         spi_chip_erase_c7,      NULL,         
>   spi_chip_write, spi_chip_read},
> +       {"Macronix",    "MX25L8005",            MX_ID,          MX_25L8005,   
>           1024,   256,            {{4096,256}},                           
> TEST_OK_PREW,   probe_spi_rdid,         spi_chip_erase_c7,      NULL,         
>   spi_chip_write, spi_chip_read},
> +       {"Macronix",    "MX25L1605",            MX_ID,          MX_25L1605,   
>           2048,   256,            {{4096,512}},                           
> TEST_UNTESTED,  probe_spi_rdid,         spi_chip_erase_c7,      NULL,         
>   spi_chip_write, spi_chip_read},
> +       {"Macronix",    "MX25L3205",            MX_ID,          MX_25L3205,   
>           4096,   256,            {{4096,1024}},                          
> TEST_OK_PREW,   probe_spi_rdid,         spi_chip_erase_c7,      NULL,         
>   spi_chip_write, spi_chip_read},
> +       {"Macronix",    "MX25L6405",            MX_ID,          MX_25L6405,   
>           8192,   256,            {{4096,2048}},                          
> TEST_UNTESTED,  probe_spi_rdid,         spi_chip_erase_c7,      NULL,         
>   spi_chip_write, spi_chip_read},
> +       {"Macronix",    "MX29F002B",            MX_ID,          MX_29F002B,   
>           256,    64 * 1024,      
> {{16384,1},{8192,2},{32768,1},{65536,3}},TEST_UNTESTED, probe_29f002,         
>   erase_29f002,           NULL,           write_29f002},
> +       {"Macronix",    "MX29F002T",            MX_ID,          MX_29F002T,   
>           256,    64 * 1024,      
> {{65536,3},{32768,1},{8192,2},{16384,1}},TEST_UNTESTED, probe_29f002,         
>   erase_29f002,           NULL,           write_29f002},
...

>From the flash chip names, I guess the chips with uniform erase block
size are serial flash chips, and the ones with non-uniform size are
parallel flash chips. I propose a new design the 'flashchip'
structure. In this new design, serial and parallel flash chip
information is stored in 'serial_flashchip' and 'parallel_flashchip'
seperately, with a common 'flashchip_common' internal struct as their
first field.


serial_flashchip
+------------------+------------------------------+
| flashchip_common | sector_size, block_size, ... |
+------------------+------------------------------+

parallel_flashchip
+------------------+------------------------------+
| flashchip_common | erase_block                  |
+------------------+------------------------------+

'flashchip_common' contains names, id's and common operation functions.

The design above looks clearer. And There is another advantage.

I guess(confirm and disproof welcome) one chipset only provides one of
the two flash interface. When a chipset is detected, we can probe only
one kind of them, (hopefully) faster and safer. It is ok if we want to
probe the other kind.


> Index: flashrom-eraseblocks/flashrom.c
> ===================================================================
> --- flashrom-eraseblocks/flashrom.c     (Revision 3776)
> +++ flashrom-eraseblocks/flashrom.c     (Arbeitskopie)
> @@ -534,11 +534,33 @@
>
>        if (erase_it) {
>                printf("Erasing flash chip.\n");
> -               if (!flash->erase) {
> -                       fprintf(stderr, "Error: flashrom has no erase 
> function for this flash chip.\n");
> +               if (!flash->block_erase && flash->eraseblocks[0].count) {
> +                       fprintf(stderr, "Hint: flashrom knows the eraseblock "
> +                               "layout, but there is no blockwise erase "
> +                               "function for this flash chip. "
> +                               "Using whole-chip erase.\n");
> +               }
> +               if (flash->block_erase && !flash->eraseblocks[0].count) {
> +                       fprintf(stderr, "Hint: flashrom has a blockwise erase 
> "
> +                               "function for this flash chip, but the "
> +                               "eraseblock layout is unknown. "
> +                               "Using whole-chip erase.\n");
> +               }
> +               if (flash->block_erase && flash->eraseblocks[0].count) {
> +                       unsigned long done = 0;
> +                       int i, j;
> +                       for (i = 0; done < flash->total_size * 1024; i++) {
> +                               for (j = 0; j < flash->eraseblocks[i].count; 
> j++) {
> +                                       flash->block_erase(flash, done + 
> flash->eraseblocks[i].size * j);
> +                               }
> +                               done += flash->eraseblocks[i].count * 
> flash->eraseblocks[i].size;
> +                       }
> +               } else if (flash->erase) {
> +                       flash->erase(flash);
> +               } else {
> +                       fprintf(stderr, "Error: flashrom has no chip erase 
> function for this flash chip.\n");
>                        return 1;
>                }
> -               flash->erase(flash);
>                exit(0);
>        } else if (read_it) {
>                if ((image = fopen(filename, "w")) == NULL) {

No comment to the logic. But the new code has a different degree of
detail compared to other 'if (do_it)' blocks(i.e., the for loop).

yu ning

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

Reply via email to