SPI FAST READ infrastructure.
Add feature bits to allow annotation of SPI flash chips with possible
read methods.
This includes the not-yet-supported Dual and Quad I/O read operations
just in case we ever encounter programmer hardware which can use that
feature.

An alternative design would be to create a separate spi_chip_fast_read
function and have a per-chip array of allowable read functions similar
to what we have for erase functions. A similar design problem exists for
chips supporting multiple write functions (e.g. classic SPI write and
SPI AAI write).

Thorough design review appreciated.

Signed-off-by: Carl-Daniel Hailfinger <[email protected]>

Index: flashrom-spi_fast_read/flash.h
===================================================================
--- flashrom-spi_fast_read/flash.h      (Revision 1249)
+++ flashrom-spi_fast_read/flash.h      (Arbeitskopie)
@@ -92,6 +92,11 @@
 #define FEATURE_WRSR_EWSR      (1 << 6)
 #define FEATURE_WRSR_WREN      (1 << 7)
 #define FEATURE_WRSR_EITHER    (FEATURE_WRSR_EWSR | FEATURE_WRSR_WREN)
+#define FEATURE_SPI_FAST_READ          (1 << 8)
+#define FEATURE_SPI_FAST_READ_DUAL_O   (1 << 9)
+#define FEATURE_SPI_FAST_READ_DUAL_IO  (1 << 10)
+#define FEATURE_SPI_FAST_READ_QUAD_O   (1 << 11)
+#define FEATURE_SPI_FAST_READ_QUAD_IO  (1 << 12)
 
 struct flashchip {
        const char *vendor;
Index: flashrom-spi_fast_read/dediprog.c
===================================================================
--- flashrom-spi_fast_read/dediprog.c   (Revision 1249)
+++ flashrom-spi_fast_read/dediprog.c   (Arbeitskopie)
@@ -220,8 +220,15 @@
 
        /* Round down. */
        bulklen = (len - residue) / chunksize * chunksize;
-       ret = dediprog_spi_bulk_read(flash, buf + residue, start + residue,
-                                    bulklen);
+       if (flash->feature_bits & FEATURE_SPI_FAST_READ) {
+               ret = dediprog_spi_bulk_read(flash, buf + residue,
+                                            start + residue, bulklen);
+       } else {
+               msg_pdbg("Using slow read because your flash chip is not "
+                        "listed as supporting fast read (yet).\n");
+               ret = spi_read_chunked(flash, buf + residue, start + residue,
+                                      bulklen, 16);
+       }
        if (ret)
                return ret;
 
Index: flashrom-spi_fast_read/flashchips.c
===================================================================
--- flashrom-spi_fast_read/flashchips.c (Revision 1249)
+++ flashrom-spi_fast_read/flashchips.c (Arbeitskopie)
@@ -282,6 +282,7 @@
                .model_id       = AMIC_A25L05PT,
                .total_size     = 64,
                .page_size      = 256,
+               .feature_bits   = FEATURE_SPI_FAST_READ | 
FEATURE_SPI_FAST_READ_DUAL_O | FEATURE_SPI_FAST_READ_DUAL_IO,
                .tested         = TEST_UNTESTED,
                .probe          = probe_spi_rdid4,
                .probe_timing   = TIMING_ZERO,
@@ -313,6 +314,7 @@
                .model_id       = AMIC_A25L05PU,
                .total_size     = 64,
                .page_size      = 256,
+               .feature_bits   = FEATURE_SPI_FAST_READ | 
FEATURE_SPI_FAST_READ_DUAL_O | FEATURE_SPI_FAST_READ_DUAL_IO,
                .tested         = TEST_UNTESTED,
                .probe          = probe_spi_rdid4,
                .probe_timing   = TIMING_ZERO,
@@ -344,6 +346,7 @@
                .model_id       = AMIC_A25L10PT,
                .total_size     = 128,
                .page_size      = 256,
+               .feature_bits   = FEATURE_SPI_FAST_READ | 
FEATURE_SPI_FAST_READ_DUAL_O | FEATURE_SPI_FAST_READ_DUAL_IO,
                .tested         = TEST_UNTESTED,
                .probe          = probe_spi_rdid4,
                .probe_timing   = TIMING_ZERO,
@@ -376,6 +379,7 @@
                .model_id       = AMIC_A25L10PU,
                .total_size     = 128,
                .page_size      = 256,
+               .feature_bits   = FEATURE_SPI_FAST_READ | 
FEATURE_SPI_FAST_READ_DUAL_O | FEATURE_SPI_FAST_READ_DUAL_IO,
                .tested         = TEST_UNTESTED,
                .probe          = probe_spi_rdid4,
                .probe_timing   = TIMING_ZERO,
@@ -408,6 +412,7 @@
                .model_id       = AMIC_A25L20PT,
                .total_size     = 256,
                .page_size      = 256,
+               .feature_bits   = FEATURE_SPI_FAST_READ | 
FEATURE_SPI_FAST_READ_DUAL_O | FEATURE_SPI_FAST_READ_DUAL_IO,
                .tested         = TEST_UNTESTED,
                .probe          = probe_spi_rdid4,
                .probe_timing   = TIMING_ZERO,
@@ -440,6 +445,7 @@
                .model_id       = AMIC_A25L20PU,
                .total_size     = 256,
                .page_size      = 256,
+               .feature_bits   = FEATURE_SPI_FAST_READ | 
FEATURE_SPI_FAST_READ_DUAL_O | FEATURE_SPI_FAST_READ_DUAL_IO,
                .tested         = TEST_UNTESTED,
                .probe          = probe_spi_rdid4,
                .probe_timing   = TIMING_ZERO,


-- 
http://www.hailfinger.org/


_______________________________________________
flashrom mailing list
[email protected]
http://www.flashrom.org/mailman/listinfo/flashrom

Reply via email to