Attached as requested: flashrom -p internal:laptop=force_I_want_a_brick -V
using flashrom trunk 1109 patched with latest Rayer patch and Atmel write protection patch

On 7/26/10 5:47 PM, Carl-Daniel Hailfinger wrote:
Next try, with one status register printing corner case fixed and with
a better changelog.

Add detailed status register printing and unlocking for all ATMEL AT25*
chips.

Add support for Atmel AT25DF081A and AT25DQ161.

Some chips require EWSR before WRSR, others require WREN before WRSR,
and some support both variants. Add feature_bits to select the correct
SPI command, and default to EWSR.

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

  Index: flashrom-writeprotect_atmel_at25/flash.h
===================================================================
--- flashrom-writeprotect_atmel_at25/flash.h    (Revision 1109)
+++ flashrom-writeprotect_atmel_at25/flash.h    (Arbeitskopie)
@@ -167,8 +167,9 @@

  /*
   * How many different erase functions do we have per chip?
+ * Atmel AT25FS010 has 6 different functions.
   */
-#define NUM_ERASEFUNCTIONS 5
+#define NUM_ERASEFUNCTIONS 6

  #define FEATURE_REGISTERMAP   (1<<  0)
  #define FEATURE_BYTEWRITES    (1<<  1)
@@ -180,6 +181,9 @@
  #define FEATURE_ADDR_2AA      (1<<  2)
  #define FEATURE_ADDR_AAA      (2<<  2)
  #define FEATURE_ADDR_SHIFTED  (1<<  5)
+#define FEATURE_WRSR_EWSR      (1<<  6)
+#define FEATURE_WRSR_WREN      (1<<  7)
+#define FEATURE_WRSR_EITHER    (FEATURE_WRSR_EWSR | FEATURE_WRSR_WREN)

  struct flashchip {
        const char *vendor;
Index: flashrom-writeprotect_atmel_at25/spi25.c
===================================================================
--- flashrom-writeprotect_atmel_at25/spi25.c    (Revision 1109)
+++ flashrom-writeprotect_atmel_at25/spi25.c    (Arbeitskopie)
@@ -311,8 +311,17 @@
  }

  /* Prettyprint the status register. Common definitions. */
-void spi_prettyprint_status_register_common(uint8_t status)
+static void spi_prettyprint_status_register_welwip(uint8_t status)
  {
+       msg_cdbg("Chip status register: Write Enable Latch (WEL) is "
+                    "%sset\n", (status&  (1<<  1)) ? "" : "not ");
+       msg_cdbg("Chip status register: Write In Progress (WIP/BUSY) is "
+                    "%sset\n", (status&  (1<<  0)) ? "" : "not ");
+}
+
+/* Prettyprint the status register. Common definitions. */
+static void spi_prettyprint_status_register_common(uint8_t status)
+{
        msg_cdbg("Chip status register: Bit 5 / Block Protect 3 (BP3) is "
                     "%sset\n", (status&  (1<<  5)) ? "" : "not ");
        msg_cdbg("Chip status register: Bit 4 / Block Protect 2 (BP2) is "
@@ -321,10 +330,7 @@
                     "%sset\n", (status&  (1<<  3)) ? "" : "not ");
        msg_cdbg("Chip status register: Bit 2 / Block Protect 0 (BP0) is "
                     "%sset\n", (status&  (1<<  2)) ? "" : "not ");
-       msg_cdbg("Chip status register: Write Enable Latch (WEL) is "
-                    "%sset\n", (status&  (1<<  1)) ? "" : "not ");
-       msg_cdbg("Chip status register: Write In Progress (WIP/BUSY) is "
-                    "%sset\n", (status&  (1<<  0)) ? "" : "not ");
+       spi_prettyprint_status_register_welwip(status);
  }

  /* Prettyprint the status register. Works for
@@ -337,6 +343,121 @@
        spi_prettyprint_status_register_common(status);
  }

+/* Prettyprint the status register. Common definitions. */
+static void spi_prettyprint_status_register_at25_srplepewpp(uint8_t status)
+{
+       msg_cdbg("Chip status register: Sector Protection Register Lock (SRPL) "
+                "is %sset\n", (status&  (1<<  7)) ? "" : "not ");
+       msg_cdbg("Chip status register: Bit 6 "
+                "is %sset\n", (status&  (1<<  6)) ? "" : "not ");
+       msg_cdbg("Chip status register: Erase/Program Error (EPE) "
+                "is %sset\n", (status&  (1<<  5)) ? "" : "not ");
+       msg_cdbg("Chip status register: WP# pin (WPP) "
+                "is %sactive\n", (status&  (1<<  4)) ? "not " : "");
+}
+
+int spi_prettyprint_status_register_at25df(struct flashchip *flash)
+{
+       uint8_t status;
+
+       status = spi_read_status_register();
+       msg_cdbg("Chip status register is %02x\n", status);
+
+       spi_prettyprint_status_register_at25_srplepewpp(status);
+       msg_cdbg("Chip status register: Software Protection Status (SWP): ");
+       switch (status&  (3<<  2)) {
+       case 0x0<<  2:
+               msg_cdbg("no sectors are protected\n");
+               break;
+       case 0x1<<  2:
+               msg_cdbg("some sectors are protected\n");
+               /* FIXME: Read individual Sector Protection Registers. */
+               break;
+       case 0x3<<  2:
+               msg_cdbg("all sectors are protected\n");
+               break;
+       default:
+               msg_cdbg("reserved for future use\n");
+               break;
+       }
+       spi_prettyprint_status_register_welwip(status);
+       return 0;
+}
+
+int spi_prettyprint_status_register_at25df_sec(struct flashchip *flash)
+{
+       /* FIXME: We should check the security lockdown. */
+       msg_cdbg("Ignoring security lockdown (if present)\n");
+       msg_cdbg("Ignoring status register byte 2\n");
+       return spi_prettyprint_status_register_at25df(flash);
+}
+
+int spi_prettyprint_status_register_at25f(struct flashchip *flash)
+{
+       uint8_t status;
+
+       status = spi_read_status_register();
+       msg_cdbg("Chip status register is %02x\n", status);
+
+       spi_prettyprint_status_register_at25_srplepewpp(status);
+       msg_cdbg("Chip status register: Bit 3 "
+                "is %sset\n", (status&  (1<<  3)) ? "" : "not ");
+       msg_cdbg("Chip status register: Block Protect 0 (BP0) is "
+                "%sset, %s sectors are protected\n",
+                (status&  (1<<  2)) ? "" : "not ",
+                (status&  (1<<  2)) ? "all" : "no");
+       spi_prettyprint_status_register_welwip(status);
+       return 0;
+}
+
+int spi_prettyprint_status_register_at25fs010(struct flashchip *flash)
+{
+       uint8_t status;
+
+       status = spi_read_status_register();
+       msg_cdbg("Chip status register is %02x\n", status);
+
+       msg_cdbg("Chip status register: Status Register Write Protect (WPEN) "
+                "is %sset\n", (status&  (1<<  7)) ? "" : "not ");
+       msg_cdbg("Chip status register: Bit 6 / Block Protect 4 (BP4) is "
+                "%sset\n", (status&  (1<<  6)) ? "" : "not ");
+       msg_cdbg("Chip status register: Bit 5 / Block Protect 3 (BP3) is "
+                "%sset\n", (status&  (1<<  5)) ? "" : "not ");
+       msg_cdbg("Chip status register: Bit 4 is "
+                "%sset\n", (status&  (1<<  4)) ? "" : "not ");
+       msg_cdbg("Chip status register: Bit 3 / Block Protect 1 (BP1) is "
+                "%sset\n", (status&  (1<<  3)) ? "" : "not ");
+       msg_cdbg("Chip status register: Bit 2 / Block Protect 0 (BP0) is "
+                "%sset\n", (status&  (1<<  2)) ? "" : "not ");
+       /* FIXME: Pretty-print detailed sector protection status. */
+       spi_prettyprint_status_register_welwip(status);
+       return 0;
+}
+
+int spi_prettyprint_status_register_at25fs040(struct flashchip *flash)
+{
+       uint8_t status;
+
+       status = spi_read_status_register();
+       msg_cdbg("Chip status register is %02x\n", status);
+
+       msg_cdbg("Chip status register: Status Register Write Protect (WPEN) "
+                "is %sset\n", (status&  (1<<  7)) ? "" : "not ");
+       msg_cdbg("Chip status register: Bit 6 / Block Protect 4 (BP4) is "
+                "%sset\n", (status&  (1<<  6)) ? "" : "not ");
+       msg_cdbg("Chip status register: Bit 5 / Block Protect 3 (BP3) is "
+                "%sset\n", (status&  (1<<  5)) ? "" : "not ");
+       msg_cdbg("Chip status register: Bit 4 / Block Protect 2 (BP2) is "
+                "%sset\n", (status&  (1<<  4)) ? "" : "not ");
+       msg_cdbg("Chip status register: Bit 3 / Block Protect 1 (BP1) is "
+                "%sset\n", (status&  (1<<  3)) ? "" : "not ");
+       msg_cdbg("Chip status register: Bit 2 / Block Protect 0 (BP0) is "
+                "%sset\n", (status&  (1<<  2)) ? "" : "not ");
+       /* FIXME: Pretty-print detailed sector protection status. */
+       spi_prettyprint_status_register_welwip(status);
+       return 0;
+}
+
  /* Prettyprint the status register. Works for
   * ST M25P series
   * MX MX25L series
@@ -731,12 +852,12 @@
   * This is according the SST25VF016 datasheet, who knows it is more
   * generic that this...
   */
-int spi_write_status_register(int status)
+static int spi_write_status_register_ewsr(struct flashchip *flash, int status)
  {
        int result;
        struct spi_command cmds[] = {
        {
-       /* FIXME: WRSR requires either EWSR or WREN depending on chip type. */
+       /* WRSR requires either EWSR or WREN depending on chip type. */
                .writecnt       = JEDEC_EWSR_OUTSIZE,
                .writearr       = (const unsigned char[]){ JEDEC_EWSR },
                .readcnt        = 0,
@@ -758,9 +879,59 @@
                msg_cerr("%s failed during command execution\n",
                        __func__);
        }
+       /* WRSR performs a self-timed erase before the changes take effect. */
+       programmer_delay(100 * 1000);
        return result;
  }

+static int spi_write_status_register_wren(struct flashchip *flash, int status)
+{
+       int result;
+       struct spi_command cmds[] = {
+       {
+       /* WRSR requires either EWSR or WREN depending on chip type. */
+               .writecnt       = JEDEC_WREN_OUTSIZE,
+               .writearr       = (const unsigned char[]){ JEDEC_WREN },
+               .readcnt        = 0,
+               .readarr        = NULL,
+       }, {
+               .writecnt       = JEDEC_WRSR_OUTSIZE,
+               .writearr       = (const unsigned char[]){ JEDEC_WRSR, 
(unsigned char) status },
+               .readcnt        = 0,
+               .readarr        = NULL,
+       }, {
+               .writecnt       = 0,
+               .writearr       = NULL,
+               .readcnt        = 0,
+               .readarr        = NULL,
+       }};
+
+       result = spi_send_multicommand(cmds);
+       if (result) {
+               msg_cerr("%s failed during command execution\n",
+                       __func__);
+       }
+       /* WRSR performs a self-timed erase before the changes take effect. */
+       programmer_delay(100 * 1000);
+       return result;
+}
+
+static int spi_write_status_register(struct flashchip *flash, int status)
+{
+       int ret = 1;
+
+       if (!(flash->feature_bits&  (FEATURE_WRSR_WREN | FEATURE_WRSR_EWSR))) {
+               msg_cdbg("Missing status register write definition, assuming "
+                        "EWSR is needed\n");
+               flash->feature_bits |= FEATURE_WRSR_EWSR;
+       }
+       if (flash->feature_bits&  FEATURE_WRSR_WREN)
+               ret = spi_write_status_register_wren(flash, status);
+       if (ret&&  (flash->feature_bits&  FEATURE_WRSR_EWSR))
+               ret = spi_write_status_register_ewsr(flash, status);
+       return ret;
+}
+
  int spi_byte_program(int addr, uint8_t databyte)
  {
        int result;
@@ -843,29 +1014,156 @@
        return result;
  }

+/* A generic brute-force block protection disable works like this:
+ * Write 0x00 to the status register. Check if any locks are still set (that
+ * part is chip specific). Repeat once.
+ */
  int spi_disable_blockprotect(struct flashchip *flash)
  {
        uint8_t status;
        int result;

        status = spi_read_status_register();
-       /* If there is block protection in effect, unprotect it first. */
+       /* If block protection is disabled, stop here. */
+       if ((status&  0x3c) == 0)
+               return 0;
+
+       msg_cdbg("Some block protection in effect, disabling\n");
+       result = spi_write_status_register(flash, status&  ~0x3c);
+       if (result) {
+               msg_cerr("spi_write_status_register failed\n");
+               return result;
+       }
+       status = spi_read_status_register();
        if ((status&  0x3c) != 0) {
-               msg_cdbg("Some block protection in effect, disabling\n");
-               result = spi_write_status_register(status&  ~0x3c);
+               msg_cerr("Block protection could not be disabled!\n");
+               return 1;
+       }
+       return 0;
+}
+
+int spi_disable_blockprotect_at25df(struct flashchip *flash)
+{
+       uint8_t status;
+       int result;
+
+       status = spi_read_status_register();
+       /* If block protection is disabled, stop here. */
+       if ((status&  (3<<  2)) == 0)
+               return 0;
+
+       msg_cdbg("Some block protection in effect, disabling\n");
+       if (status&  (1<<  7)) {
+               msg_cdbg("Need to disable Sector Protection Register Lock\n");
+               if ((status&  (1<<  4)) == 0) {
+                       msg_cerr("WP# pin is active, disabling "
+                                "write protection is impossible.\n");
+                       return 1;
+               }
+               /* All bits except bit 7 (SPRL) are readonly. */
+               result = spi_write_status_register(flash, status&  ~(1<<  7));
                if (result) {
                        msg_cerr("spi_write_status_register failed\n");
                        return result;
                }
-               status = spi_read_status_register();
-               if ((status&  0x3c) != 0) {
-                       msg_cerr("Block protection could not be disabled!\n");
-                       return 1;
+               
+       }
+       /* Global unprotect. Make sure to mask SPRL as well. */
+       result = spi_write_status_register(flash, status&  ~0xbc);
+       if (result) {
+               msg_cerr("spi_write_status_register failed\n");
+               return result;
+       }
+       status = spi_read_status_register();
+       if ((status&  (3<<  2)) != 0) {
+               msg_cerr("Block protection could not be disabled!\n");
+               return 1;
+       }
+       return 0;
+}
+
+int spi_disable_blockprotect_at25df_sec(struct flashchip *flash)
+{
+       /* FIXME: We should check the security lockdown. */
+       msg_cinfo("Ignoring security lockdown (if present)\n");
+       return spi_disable_blockprotect_at25df(flash);
+}
+
+int spi_disable_blockprotect_at25f(struct flashchip *flash)
+{
+       /* spi_disable_blockprotect_at25df is not really the right way to do
+        * this, but the side effects of said function work here as well.
+        */
+       return spi_disable_blockprotect_at25df(flash);
+}
+
+int spi_disable_blockprotect_at25fs010(struct flashchip *flash)
+{
+       uint8_t status;
+       int result;
+
+       status = spi_read_status_register();
+       /* If block protection is disabled, stop here. */
+       if ((status&  0x6c) == 0)
+               return 0;
+
+       msg_cdbg("Some block protection in effect, disabling\n");
+       if (status&  (1<<  7)) {
+               msg_cdbg("Need to disable Status Register Write Protect\n");
+               /* Clear bit 7 (WPEN). */
+               result = spi_write_status_register(flash, status&  ~(1<<  7));
+               if (result) {
+                       msg_cerr("spi_write_status_register failed\n");
+                       return result;
                }
        }
+       /* Global unprotect. Make sure to mask WPEN as well. */
+       result = spi_write_status_register(flash, status&  ~0xec);
+       if (result) {
+               msg_cerr("spi_write_status_register failed\n");
+               return result;
+       }
+       status = spi_read_status_register();
+       if ((status&  0x6c) != 0) {
+               msg_cerr("Block protection could not be disabled!\n");
+               return 1;
+       }
        return 0;
  }
+int spi_disable_blockprotect_at25fs040(struct flashchip *flash)
+{
+       uint8_t status;
+       int result;

+       status = spi_read_status_register();
+       /* If block protection is disabled, stop here. */
+       if ((status&  0x7c) == 0)
+               return 0;
+
+       msg_cdbg("Some block protection in effect, disabling\n");
+       if (status&  (1<<  7)) {
+               msg_cdbg("Need to disable Status Register Write Protect\n");
+               /* Clear bit 7 (WPEN). */
+               result = spi_write_status_register(flash, status&  ~(1<<  7));
+               if (result) {
+                       msg_cerr("spi_write_status_register failed\n");
+                       return result;
+               }
+       }
+       /* Global unprotect. Make sure to mask WPEN as well. */
+       result = spi_write_status_register(flash, status&  ~0xfc);
+       if (result) {
+               msg_cerr("spi_write_status_register failed\n");
+               return result;
+       }
+       status = spi_read_status_register();
+       if ((status&  0x7c) != 0) {
+               msg_cerr("Block protection could not be disabled!\n");
+               return 1;
+       }
+       return 0;
+}
+
  int spi_nbyte_read(int address, uint8_t *bytes, int len)
  {
        const unsigned char cmd[JEDEC_READ_OUTSIZE] = {
Index: flashrom-writeprotect_atmel_at25/flashchips.c
===================================================================
--- flashrom-writeprotect_atmel_at25/flashchips.c       (Revision 1109)
+++ flashrom-writeprotect_atmel_at25/flashchips.c       (Arbeitskopie)
@@ -313,6 +313,7 @@
                .model_id       = AT_25DF021,
                .total_size     = 256,
                .page_size      = 256,
+               .feature_bits   = FEATURE_WRSR_WREN,
                .tested         = TEST_UNTESTED,
                .probe          = probe_spi_rdid,
                .probe_timing   = TIMING_ZERO,
@@ -335,7 +336,8 @@
                                .block_erase = spi_block_erase_c7,
                        }
                },
-               .unlock         = spi_disable_blockprotect,
+               .printlock      = spi_prettyprint_status_register_at25df,
+               .unlock         = spi_disable_blockprotect_at25df,
                .write          = spi_chip_write_256,
                .read           = spi_chip_read,
        },
@@ -348,6 +350,7 @@
                .model_id       = AT_25DF041A,
                .total_size     = 512,
                .page_size      = 256,
+               .feature_bits   = FEATURE_WRSR_WREN,
                .tested         = TEST_UNTESTED,
                .probe          = probe_spi_rdid,
                .probe_timing   = TIMING_ZERO,
@@ -370,7 +373,8 @@
                                .block_erase = spi_block_erase_c7,
                        }
                },
-               .unlock         = spi_disable_blockprotect,
+               .printlock      = spi_prettyprint_status_register_at25df,
+               .unlock         = spi_disable_blockprotect_at25df,
                .write          = spi_chip_write_256,
                .read           = spi_chip_read,
        },
@@ -383,6 +387,7 @@
                .model_id       = AT_25DF081,
                .total_size     = 1024,
                .page_size      = 256,
+               .feature_bits   = FEATURE_WRSR_WREN,
                .tested         = TEST_UNTESTED,
                .probe          = probe_spi_rdid,
                .probe_timing   = TIMING_ZERO,
@@ -405,19 +410,58 @@
                                .block_erase = spi_block_erase_c7,
                        }
                },
-               .unlock         = spi_disable_blockprotect,
+               .printlock      = spi_prettyprint_status_register_at25df,
+               .unlock         = spi_disable_blockprotect_at25df,
                .write          = spi_chip_write_256,
                .read           = spi_chip_read,
        },

        {
                .vendor         = "Atmel",
+               .name           = "AT25DF081A",
+               .bustype        = CHIP_BUSTYPE_SPI,
+               .manufacture_id = ATMEL_ID,
+               .model_id       = AT_25DF081A,
+               .total_size     = 1024,
+               .page_size      = 256,
+               .feature_bits   = FEATURE_WRSR_WREN,
+               .tested         = TEST_UNTESTED,
+               .probe          = probe_spi_rdid,
+               .probe_timing   = TIMING_ZERO,
+               .block_erasers  =
+               {
+                       {
+                               .eraseblocks = { {4 * 1024, 256} },
+                               .block_erase = spi_block_erase_20,
+                       }, {
+                               .eraseblocks = { {32 * 1024, 32} },
+                               .block_erase = spi_block_erase_52,
+                       }, {
+                               .eraseblocks = { {64 * 1024, 16} },
+                               .block_erase = spi_block_erase_d8,
+                       }, {
+                               .eraseblocks = { {1024 * 1024, 1} },
+                               .block_erase = spi_block_erase_60,
+                       }, {
+                               .eraseblocks = { {1024 * 1024, 1} },
+                               .block_erase = spi_block_erase_c7,
+                       }
+               },
+               .printlock      = spi_prettyprint_status_register_at25df_sec,
+               .unlock         = spi_disable_blockprotect_at25df_sec,
+               .write          = spi_chip_write_256,
+               .read           = spi_chip_read,
+       },
+
+       {
+               .vendor         = "Atmel",
                .name           = "AT25DF161",
                .bustype        = CHIP_BUSTYPE_SPI,
                .manufacture_id = ATMEL_ID,
                .model_id       = AT_25DF161,
                .total_size     = 2048,
                .page_size      = 256,
+               .feature_bits   = FEATURE_WRSR_WREN,
                .tested         = TEST_UNTESTED,
                .probe          = probe_spi_rdid,
                .probe_timing   = TIMING_ZERO,
@@ -440,7 +484,8 @@
                                .block_erase = spi_block_erase_c7,
                        }
                },
-               .unlock         = spi_disable_blockprotect,
+               .printlock      = spi_prettyprint_status_register_at25df_sec,
+               .unlock         = spi_disable_blockprotect_at25df_sec,
                .write          = spi_chip_write_256,
                .read           = spi_chip_read,
        },
@@ -453,6 +498,7 @@
                .model_id       = AT_25DF321,
                .total_size     = 4096,
                .page_size      = 256,
+               .feature_bits   = FEATURE_WRSR_WREN,
                .tested         = TEST_OK_PRW,
                .probe          = probe_spi_rdid,
                .probe_timing   = TIMING_ZERO,
@@ -475,7 +521,8 @@
                                .block_erase = spi_block_erase_c7,
                        }
                },
-               .unlock         = spi_disable_blockprotect,
+               .printlock      = spi_prettyprint_status_register_at25df,
+               .unlock         = spi_disable_blockprotect_at25df,
                .write          = spi_chip_write_256,
                .read           = spi_chip_read,
        },
@@ -488,6 +535,7 @@
                .model_id       = AT_25DF321A,
                .total_size     = 4096,
                .page_size      = 256,
+               .feature_bits   = FEATURE_WRSR_WREN,
                .tested         = TEST_UNTESTED,
                .probe          = probe_spi_rdid,
                .probe_timing   = TIMING_ZERO,
@@ -510,7 +558,8 @@
                                .block_erase = spi_block_erase_c7,
                        }
                },
-               .unlock         = spi_disable_blockprotect,
+               .printlock      = spi_prettyprint_status_register_at25df_sec,
+               .unlock         = spi_disable_blockprotect_at25df_sec,
                .write          = spi_chip_write_256,
                .read           = spi_chip_read,
        },
@@ -523,6 +572,7 @@
                .model_id       = AT_25DF641,
                .total_size     = 8192,
                .page_size      = 256,
+               .feature_bits   = FEATURE_WRSR_WREN,
                .tested         = TEST_UNTESTED,
                .probe          = probe_spi_rdid,
                .probe_timing   = TIMING_ZERO,
@@ -545,19 +595,58 @@
                                .block_erase = spi_block_erase_c7,
                        }
                },
-               .unlock         = spi_disable_blockprotect,
+               .printlock      = spi_prettyprint_status_register_at25df_sec,
+               .unlock         = spi_disable_blockprotect_at25df_sec,
                .write          = spi_chip_write_256,
                .read           = spi_chip_read,
        },

        {
                .vendor         = "Atmel",
+               .name           = "AT25DQ161",
+               .bustype        = CHIP_BUSTYPE_SPI,
+               .manufacture_id = ATMEL_ID,
+               .model_id       = AT_25DQ161,
+               .total_size     = 2048,
+               .page_size      = 256,
+               .feature_bits   = FEATURE_WRSR_WREN,
+               .tested         = TEST_UNTESTED,
+               .probe          = probe_spi_rdid,
+               .probe_timing   = TIMING_ZERO,
+               .block_erasers  =
+               {
+                       {
+                               .eraseblocks = { {4 * 1024, 512} },
+                               .block_erase = spi_block_erase_20,
+                       }, {
+                               .eraseblocks = { {32 * 1024, 64} },
+                               .block_erase = spi_block_erase_52,
+                       }, {
+                               .eraseblocks = { {64 * 1024, 32} },
+                               .block_erase = spi_block_erase_d8,
+                       }, {
+                               .eraseblocks = { {2 * 1024 * 1024, 1} },
+                               .block_erase = spi_block_erase_60,
+                       }, {
+                               .eraseblocks = { {2 * 1024 * 1024, 1} },
+                               .block_erase = spi_block_erase_c7,
+                       }
+               },
+               .printlock      = spi_prettyprint_status_register_at25df_sec,
+               .unlock         = spi_disable_blockprotect_at25df_sec,
+               .write          = spi_chip_write_256,
+               .read           = spi_chip_read,
+       },
+
+       {
+               .vendor         = "Atmel",
                .name           = "AT25F512B",
                .bustype        = CHIP_BUSTYPE_SPI,
                .manufacture_id = ATMEL_ID,
                .model_id       = AT_25F512B,
                .total_size     = 64,
                .page_size      = 256,
+               .feature_bits   = FEATURE_WRSR_WREN,
                .tested         = TEST_UNTESTED,
                .probe          = probe_spi_rdid,
                .probe_timing   = TIMING_ZERO,
@@ -580,7 +669,8 @@
                                .block_erase = spi_block_erase_c7,
                        }
                },
-               .unlock         = spi_disable_blockprotect,
+               .printlock      = spi_prettyprint_status_register_at25f,
+               .unlock         = spi_disable_blockprotect_at25f,
                .write          = spi_chip_write_256,
                .read           = spi_chip_read,
        },
@@ -602,6 +692,9 @@
                                .eraseblocks = { {4 * 1024, 32} },
                                .block_erase = spi_block_erase_20,
                        }, {
+                               .eraseblocks = { {4 * 1024, 32} },
+                               .block_erase = spi_block_erase_d7,
+                       }, {
                                .eraseblocks = { {32 * 1024, 4} },
                                .block_erase = spi_block_erase_52,
                        }, {
@@ -615,7 +708,8 @@
                                .block_erase = spi_block_erase_c7,
                        }
                },
-               .unlock         = spi_disable_blockprotect,
+               .printlock      = spi_prettyprint_status_register_at25fs010,
+               .unlock         = spi_disable_blockprotect_at25fs010,
                .write          = spi_chip_write_256,
                .read           = spi_chip_read,
        },
@@ -650,7 +744,8 @@
                                .block_erase = spi_block_erase_c7,
                        }
                },
-               .unlock         = spi_disable_blockprotect,
+               .printlock      = spi_prettyprint_status_register_at25fs040,
+               .unlock         = spi_disable_blockprotect_at25fs040,
                .write          = spi_chip_write_256,
                .read           = spi_chip_read,
        },
Index: flashrom-writeprotect_atmel_at25/flashchips.h
===================================================================
--- flashrom-writeprotect_atmel_at25/flashchips.h       (Revision 1109)
+++ flashrom-writeprotect_atmel_at25/flashchips.h       (Arbeitskopie)
@@ -110,12 +110,19 @@
  #define AT_25DF021            0x4300
  #define AT_25DF041A           0x4401
  #define AT_25DF081            0x4502
+#define AT_25DF081A            0x4501  /* Yes, 81A has a lower number than 81 
*/
  #define AT_25DF161            0x4602
  #define AT_25DF321            0x4700  /* Same as 26DF321 */
  #define AT_25DF321A           0x4701
  #define AT_25DF641            0x4800
-#define AT_25F512A             0x65 /* Needs special RDID. AT25F512A_RDID 15 
1d */
+#define AT_25DQ161             0x8600
+#define AT25F512               /* No device ID found in datasheet. Vendor ID
+                                * can be read with AT25F512A_RDID */
+#define AT_25F512A             0x65 /* Needs AT25F512A_RDID */
  #define AT_25F512B            0x6500
+#define AT25F1024              /* No device ID found in datasheet. Vendor ID
+                                * can be read with AT25F512A_RDID */
+#define AT_25F1024A            0x60 /* Needs AT25F512A_RDID */
  #define AT_25FS010            0x6601
  #define AT_25FS040            0x6604
  #define AT_26DF041            0x4400
Index: flashrom-writeprotect_atmel_at25/spi.c
===================================================================
--- flashrom-writeprotect_atmel_at25/spi.c      (Revision 1109)
+++ flashrom-writeprotect_atmel_at25/spi.c      (Arbeitskopie)
@@ -29,8 +29,6 @@

  enum spi_controller spi_controller = SPI_CONTROLLER_NONE;

-void spi_prettyprint_status_register(struct flashchip *flash);
-
  const struct spi_programmer spi_programmer[] = {
        { /* SPI_CONTROLLER_NONE */
                .command = NULL,
Index: flashrom-writeprotect_atmel_at25/spi.h
===================================================================
--- flashrom-writeprotect_atmel_at25/spi.h      (Revision 1109)
+++ flashrom-writeprotect_atmel_at25/spi.h      (Arbeitskopie)
@@ -31,7 +31,7 @@
  #define JEDEC_RDID_INSIZE     0x03

  /* AT25F512A has bit 3 as don't care bit in commands */
-#define AT25F512A_RDID         0x15
+#define AT25F512A_RDID         0x15    /* 0x15 or 0x1d */
  #define AT25F512A_RDID_OUTSIZE        0x01
  #define AT25F512A_RDID_INSIZE 0x02

@@ -123,5 +123,6 @@
  #define SPI_INVALID_OPCODE    -2
  #define SPI_INVALID_ADDRESS   -3
  #define SPI_INVALID_LENGTH    -4
+#define SPI_FLASHROM_BUG       -5

  #endif                /* !__SPI_H__ */
Index: flashrom-writeprotect_atmel_at25/chipdrivers.h
===================================================================
--- flashrom-writeprotect_atmel_at25/chipdrivers.h      (Revision 1109)
+++ flashrom-writeprotect_atmel_at25/chipdrivers.h      (Arbeitskopie)
@@ -47,7 +47,17 @@
  int spi_chip_write_256_new(struct flashchip *flash, uint8_t *buf, int start, 
int len);
  int spi_chip_read(struct flashchip *flash, uint8_t *buf, int start, int len);
  uint8_t spi_read_status_register(void);
+int spi_prettyprint_status_register_at25df(struct flashchip *flash);
+int spi_prettyprint_status_register_at25df_sec(struct flashchip *flash);
+int spi_prettyprint_status_register_at25f(struct flashchip *flash);
+int spi_prettyprint_status_register_at25fs010(struct flashchip *flash);
+int spi_prettyprint_status_register_at25fs040(struct flashchip *flash);
  int spi_disable_blockprotect(struct flashchip *flash);
+int spi_disable_blockprotect_at25df(struct flashchip *flash);
+int spi_disable_blockprotect_at25df_sec(struct flashchip *flash);
+int spi_disable_blockprotect_at25f(struct flashchip *flash);
+int spi_disable_blockprotect_at25fs010(struct flashchip *flash);
+int spi_disable_blockprotect_at25fs040(struct flashchip *flash);
  int spi_byte_program(int addr, uint8_t databyte);
  int spi_nbyte_program(int addr, uint8_t *bytes, int len);
  int spi_nbyte_read(int addr, uint8_t *bytes, int len);


flashrom v0.9.2-runknown on Linux 2.6.26-2-486 (i686), built with libpci 3.1.7, 
GCC 4.3.4, little endian
flashrom is free software, get the source code at http://www.flashrom.org

Calibrating delay loop... OS timer resolution is 1 usecs, 2279M loops per 
second, 10 myus = 13 us, 100 myus = 102 us, 1000 myus = 1014 us, 10000 myus = 
9967 us, 4 myus = 7 us, OK.
Initializing internal programmer
No coreboot table found.
DMI string system-manufacturer: "LENOVO"
DMI string system-product-name: "7658CTO"
DMI string system-version: "ThinkPad T61"
DMI string baseboard-manufacturer: "LENOVO"
DMI string baseboard-product-name: "7658CTO"
DMI string baseboard-version: "Not Available"
DMI string chassis-type: "Notebook"
Laptop detected via DMI
Found chipset "Intel ICH8M-E", enabling flash write... chipset PCI ID is 
8086:2811, 
0xfff80000/0xffb80000 FWH IDSEL: 0x0
0xfff00000/0xffb00000 FWH IDSEL: 0x0
0xffe80000/0xffa80000 FWH IDSEL: 0x1
0xffe00000/0xffa00000 FWH IDSEL: 0x1
0xffd80000/0xff980000 FWH IDSEL: 0x2
0xffd00000/0xff900000 FWH IDSEL: 0x2
0xffc80000/0xff880000 FWH IDSEL: 0x3
0xffc00000/0xff800000 FWH IDSEL: 0x3
0xff700000/0xff300000 FWH IDSEL: 0x4
0xff600000/0xff200000 FWH IDSEL: 0x5
0xff500000/0xff100000 FWH IDSEL: 0x6
0xff400000/0xff000000 FWH IDSEL: 0x7
0xfff80000/0xffb80000 FWH decode enabled
0xfff00000/0xffb00000 FWH decode enabled
0xffe80000/0xffa80000 FWH decode enabled
0xffe00000/0xffa00000 FWH decode enabled
0xffd80000/0xff980000 FWH decode enabled
0xffd00000/0xff900000 FWH decode enabled
0xffc80000/0xff880000 FWH decode enabled
0xffc00000/0xff800000 FWH decode enabled
0xff700000/0xff300000 FWH decode enabled
0xff600000/0xff200000 FWH decode enabled
0xff500000/0xff100000 FWH decode enabled
0xff400000/0xff000000 FWH decode enabled
Maximum FWH chip size: 0x100000 bytes
BIOS Lock Enable: disabled, BIOS Write Enable: enabled, BIOS_CNTL is 0x1

Root Complex Register Block address = 0xfed1c000
GCS = 0x460: BIOS Interface Lock-Down: disabled, BOOT BIOS Straps: 0x1 (SPI)
Top Swap : not enabled
SPIBAR = 0xfed1c000 + 0x3020
0x04: 0x6008 (HSFS)
FLOCKDN 0, FDV 1, FDOPSS 1, SCIP 0, BERASE 1, AEL 0, FCERR 0, FDONE 0
0x50: 0x00000f0f (FRAP)
BMWAG 0x00, BMRAG 0x00, BRWA 0x0f, BRRA 0x0f
0x54: 0x00000000 (FREG0: Flash Descriptor)
0x00000000-0x00000fff is read-write
0x58: 0x03ff0280 (FREG1: BIOS)
0x00280000-0x003fffff is read-write
0x5C: 0x027d0001 (FREG2: Management Engine)
0x00001000-0x0027dfff is read-write
0x60: 0x027f027e (FREG3: Gigabit Ethernet)
0x0027e000-0x0027ffff is read-write
0x64: 0x00000000 (FREG4: Platform Data)
0x00000000-0x00000fff is locked
0x74: 0x1fff03f0 (PR0)
0x78: 0x00000000 (PR1)
0x7C: 0x00000000 (PR2)
0x80: 0x00000000 (PR3)
0x84: 0x00000000 (PR4)
0x90: 0x00414004 (SSFS, SSFC)
0x94: 0x5006     (PREOP)
0x96: 0x463b     (OPTYPE)
0x98: 0x05d80302 (OPMENU)
0x9C: 0xc79f0190 (OPMENU+4)
0xA0: 0x00000000 (BBAR)
0xB0: 0x00000004 (FDOC)
Programming OPCODES... 
program_opcodes: preop=5006 optype=463b opmenu=05d80302c79f0190
done
SPI Read Configuration: prefetching disabled, caching enabled, OK.
This chipset supports the following protocols: FWH,SPI.
Probing for AMD Am29F010A/B, 128 KB: skipped.
Probing for AMD Am29F002(N)BB, 256 KB: skipped.
Probing for AMD Am29F002(N)BT, 256 KB: skipped.
Probing for AMD Am29F016D, 2048 KB: skipped.
Probing for AMD Am29F040B, 512 KB: skipped.
Probing for AMD Am29F080B, 1024 KB: skipped.
Probing for AMD Am29LV040B, 512 KB: skipped.
Probing for AMD Am29LV081B, 1024 KB: skipped.
Probing for ASD AE49F2008, 256 KB: skipped.
Probing for Atmel AT25DF021, 256 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT25DF041A, 512 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT25DF081, 1024 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT25DF081A, 1024 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT25DF161, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT25DF321, 4096 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Chip status register is 10
Found chip "Atmel AT25DF321" (4096 KB, SPI) at physical address 0xffc00000.
Chip status register is 10
Chip status register: Sector Protection Register Lock (SRPL) is not set
Chip status register: Bit 6 is not set
Chip status register: Erase/Program Error (EPE) is not set
Chip status register: WP# pin (WPP) is not active
Chip status register: Software Protection Status (SWP): no sectors are protected
Chip status register: Write Enable Latch (WEL) is not set
Chip status register: Write In Progress (WIP/BUSY) is not set
Probing for Atmel AT25DF321A, 4096 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT25DF641, 8192 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT25DQ161, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT25F512B, 64 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Atmel AT25FS010, 128 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT25FS040, 512 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT26DF041, 512 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT26DF081A, 1024 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT26DF161, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT26DF161A, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT26F004, 512 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Atmel AT29C512, 64 KB: skipped.
Probing for Atmel AT29C010A, 128 KB: skipped.
Probing for Atmel AT29C020, 256 KB: skipped.
Probing for Atmel AT29C040A, 512 KB: skipped.
Probing for Atmel AT45CS1282, 16896 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT45DB011D, 128 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT45DB021D, 256 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT45DB041D, 512 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT45DB081D, 1024 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT45DB161D, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT45DB321C, 4224 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT45DB321D, 4096 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT45DB642D, 8192 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Atmel AT49BV512, 64 KB: skipped.
Probing for Atmel AT49F020, 256 KB: skipped.
Probing for Atmel AT49F002(N), 256 KB: skipped.
Probing for Atmel AT49F002(N)T, 256 KB: skipped.
Probing for AMIC A25L05PT, 64 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for AMIC A25L05PU, 64 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for AMIC A25L10PT, 128 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for AMIC A25L10PU, 128 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for AMIC A25L20PT, 256 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for AMIC A25L20PU, 256 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for AMIC A25L40PT, 512 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for AMIC A25L40PU, 512 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for AMIC A25L80P, 1024 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for AMIC A25L16PT, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for AMIC A25L16PU, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for AMIC A29002B, 256 KB: skipped.
Probing for AMIC A29002T, 256 KB: skipped.
Probing for AMIC A29040B, 512 KB: skipped.
Probing for AMIC A49LF040A, 512 KB: skipped.
Probing for EMST F49B002UA, 256 KB: skipped.
Probing for EMST F25L008A, 1024 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25B05, 64 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25B05T, 64 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25B10, 128 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25B10T, 128 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25B20, 256 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25B20T, 256 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25B40, 512 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25B40T, 512 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25B80, 1024 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25B80T, 1024 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25B16, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25B16T, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25B32, 4096 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25B32T, 4096 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25B64, 8192 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25B64T, 8192 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25D16, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25F05, 64 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25F10, 128 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25F20, 256 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25F40, 512 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25F80, 1024 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25F16, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN25F32, 4096 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Eon EN29F010, 128 KB: skipped.
Probing for EON EN29F002(A)(N)B, 256 KB: skipped.
Probing for EON EN29F002(A)(N)T, 256 KB: skipped.
Probing for Fujitsu MBM29F004BC, 512 KB: skipped.
Probing for Fujitsu MBM29F004TC, 512 KB: skipped.
Probing for Fujitsu MBM29F400BC, 512 KB: skipped.
Probing for Fujitsu MBM29F400TC, 512 KB: skipped.
Probing for Hyundai HY29F002T, 256 KB: skipped.
Probing for Hyundai HY29F002B, 256 KB: skipped.
Probing for Intel 28F001BX-B, 128 KB: skipped.
Probing for Intel 28F001BX-T, 128 KB: skipped.
Probing for Intel 28F002BC-T, 256 KB: skipped.
Probing for Intel 28F004S5, 512 KB: skipped.
Probing for Intel 28F004BV/BE-B, 512 KB: skipped.
Probing for Intel 28F004BV/BE-T, 512 KB: skipped.
Probing for Intel 28F400BV/CV/CE-B, 512 KB: skipped.
Probing for Intel 28F400BV/CV/CE-T, 512 KB: skipped.
Probing for Intel 82802AB, 512 KB: probe_82802ab: id1 0xfe, id2 0xcb, id1 is 
normal flash content, id2 is normal flash content
Probing for Intel 82802AC, 1024 KB: probe_82802ab: id1 0x4d, id2 0x5a, id1 
parity violation, id1 is normal flash content, id2 is normal flash content
Probing for Macronix MX25L512, 64 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Macronix MX25L1005, 128 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Macronix MX25L2005, 256 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Macronix MX25L4005, 512 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Macronix MX25L8005, 1024 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Macronix MX25L1605, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Macronix MX25L1635D, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Macronix MX25L3205, 4096 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Macronix MX25L3235D, 4096 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Macronix MX25L6405, 8192 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Macronix MX25L12805, 16384 KB: probe_spi_rdid_generic: id1 0x1f, 
id2 0x4700
Probing for Macronix MX29F001B, 128 KB: skipped.
Probing for Macronix MX29F001T, 128 KB: skipped.
Probing for Macronix MX29F002B, 256 KB: skipped.
Probing for Macronix MX29F002T, 256 KB: skipped.
Probing for Macronix MX29LV040, 512 KB: skipped.
Probing for Numonyx M25PE10, 128 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Numonyx M25PE20, 256 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Numonyx M25PE40, 512 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Numonyx M25PE80, 1024 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Numonyx M25PE16, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for PMC Pm25LV010, 128 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for PMC Pm25LV016B, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for PMC Pm25LV020, 256 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for PMC Pm25LV040, 512 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for PMC Pm25LV080B, 1024 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for PMC Pm25LV512, 64 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for PMC Pm29F002T, 256 KB: skipped.
Probing for PMC Pm29F002B, 256 KB: skipped.
Probing for PMC Pm39LV010, 128 KB: skipped.
Probing for PMC Pm39LV020, 256 KB: skipped.
Probing for PMC Pm39LV040, 512 KB: skipped.
Probing for PMC Pm49FL002, 256 KB: probe_jedec_common: id1 0x4d, id2 0xda, id1 
parity violation, id1 is normal flash content, id2 is normal flash content
Probing for PMC Pm49FL004, 512 KB: probe_jedec_common: id1 0xfe, id2 0xcb, id1 
is normal flash content, id2 is normal flash content
Probing for Sanyo LF25FW203A, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Sharp LHF00L04, 1024 KB: probe_82802ab: id1 0x4d, id2 0x5a, id1 
parity violation, id1 is normal flash content, id2 is normal flash content
Probing for Spansion S25FL008A, 1024 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Spansion S25FL016A, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for SST SST25VF016B, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for SST SST25VF032B, 4096 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for SST SST25VF064C, 8192 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for SST SST25VF040.REMS, 512 KB: probe_spi_rems: id1 0xff, id2 0xff
Probing for SST SST25VF040B, 512 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for SST SST25LF040A.RES, 512 KB: Invalid OPCODE 0xab
Probing for SST SST25VF040B.REMS, 512 KB: probe_spi_rems: id1 0xff, id2 0xff
Probing for SST SST25VF080B, 1024 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for SST SST28SF040A, 512 KB: skipped.
Probing for SST SST29EE010, 128 KB: skipped.
Probing for SST SST29LE010, 128 KB: skipped.
Probing for SST SST29EE020A, 256 KB: skipped.
Probing for SST SST29LE020, 256 KB: skipped.
Probing for SST SST39SF512, 64 KB: skipped.
Probing for SST SST39SF010A, 128 KB: skipped.
Probing for SST SST39SF020A, 256 KB: skipped.
Probing for SST SST39SF040, 512 KB: skipped.
Probing for SST SST39VF512, 64 KB: skipped.
Probing for SST SST39VF010, 128 KB: skipped.
Probing for SST SST39VF020, 256 KB: skipped.
Probing for SST SST39VF040, 512 KB: skipped.
Probing for SST SST39VF080, 1024 KB: skipped.
Probing for SST SST49LF002A/B, 256 KB: probe_jedec_common: id1 0x4d, id2 0xda, 
id1 parity violation, id1 is normal flash content, id2 is normal flash content
Probing for SST SST49LF003A/B, 384 KB: probe_jedec_common: id1 0x8f, id2 0xdf, 
id1 is normal flash content, id2 is normal flash content
Probing for SST SST49LF004A/B, 512 KB: probe_jedec_common: id1 0xfe, id2 0xcb, 
id1 is normal flash content, id2 is normal flash content
Probing for SST SST49LF004C, 512 KB: probe_82802ab: id1 0xfe, id2 0xcb, id1 is 
normal flash content, id2 is normal flash content
Probing for SST SST49LF008A, 1024 KB: probe_jedec_common: id1 0x4d, id2 0x5a, 
id1 parity violation, id1 is normal flash content, id2 is normal flash content
Probing for SST SST49LF008C, 1024 KB: probe_82802ab: id1 0x4d, id2 0x5a, id1 
parity violation, id1 is normal flash content, id2 is normal flash content
Probing for SST SST49LF016C, 2048 KB: Chip size 2048 kB is bigger than 
supported size 1024 kB of chipset/board/programmer for FWH interface, 
probe/read/erase/write may fail. probe_82802ab: id1 0xff, id2 0xff, id1 parity 
violation, id1 is normal flash content, id2 is normal flash content
Probing for SST SST49LF020, 256 KB: skipped.
Probing for SST SST49LF020A, 256 KB: skipped.
Probing for SST SST49LF040, 512 KB: skipped.
Probing for SST SST49LF040B, 512 KB: skipped.
Probing for SST SST49LF080A, 1024 KB: skipped.
Probing for SST SST49LF160C, 2048 KB: skipped.
Probing for ST M25P05-A, 64 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for ST M25P05.RES, 64 KB: Ignoring RES in favour of RDID.
Probing for ST M25P10-A, 128 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for ST M25P10.RES, 128 KB: Ignoring RES in favour of RDID.
Probing for ST M25P20, 256 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for ST M25P40, 512 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for ST M25P40-old, 512 KB: Ignoring RES in favour of RDID.
Probing for ST M25P80, 1024 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for ST M25P16, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for ST M25P32, 4096 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for ST M25P64, 8192 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for ST M25P128, 16384 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for ST M29F002B, 256 KB: skipped.
Probing for ST M29F002T/NT, 256 KB: skipped.
Probing for ST M29F040B, 512 KB: skipped.
Probing for ST M29F400BB, 512 KB: skipped.
Probing for ST M29F400BT, 512 KB: skipped.
Probing for ST M29W010B, 128 KB: skipped.
Probing for ST M29W040B, 512 KB: skipped.
Probing for ST M29W512B, 64 KB: skipped.
Probing for ST M50FLW040A, 512 KB: probe_82802ab: id1 0xfe, id2 0xcb, id1 is 
normal flash content, id2 is normal flash content
Probing for ST M50FLW040B, 512 KB: probe_82802ab: id1 0xfe, id2 0xcb, id1 is 
normal flash content, id2 is normal flash content
Probing for ST M50FLW080A, 1024 KB: probe_82802ab: id1 0x4d, id2 0x5a, id1 
parity violation, id1 is normal flash content, id2 is normal flash content
Probing for ST M50FLW080B, 1024 KB: probe_82802ab: id1 0x4d, id2 0x5a, id1 
parity violation, id1 is normal flash content, id2 is normal flash content
Probing for ST M50FW002, 256 KB: probe_82802ab: id1 0x4d, id2 0xda, id1 parity 
violation, id1 is normal flash content, id2 is normal flash content
Probing for ST M50FW016, 2048 KB: Chip size 2048 kB is bigger than supported 
size 1024 kB of chipset/board/programmer for FWH interface, 
probe/read/erase/write may fail. probe_82802ab: id1 0xff, id2 0xff, id1 parity 
violation, id1 is normal flash content, id2 is normal flash content
Probing for ST M50FW040, 512 KB: probe_82802ab: id1 0xfe, id2 0xcb, id1 is 
normal flash content, id2 is normal flash content
Probing for ST M50FW080, 1024 KB: probe_82802ab: id1 0x4d, id2 0x5a, id1 parity 
violation, id1 is normal flash content, id2 is normal flash content
Probing for ST M50LPW116, 2048 KB: skipped.
Probing for SyncMOS S29C31004T, 512 KB: skipped.
Probing for SyncMOS S29C51001T, 128 KB: skipped.
Probing for SyncMOS S29C51002T, 256 KB: skipped.
Probing for SyncMOS S29C51004T, 512 KB: skipped.
Probing for TI TMS29F002RB, 256 KB: skipped.
Probing for TI TMS29F002RT, 256 KB: skipped.
Probing for Winbond W25Q80, 1024 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Winbond W25Q16, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Winbond W25Q32, 4096 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Winbond W25Q64, 8192 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Winbond W25x10, 128 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Winbond W25x20, 256 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Winbond W25x40, 512 KB: probe_spi_rdid_generic: id1 0x1f, id2 0x4700
Probing for Winbond W25x80, 1024 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Winbond W25x16, 2048 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Winbond W25x32, 4096 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Winbond W25x64, 8192 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Winbond W29C011, 128 KB: skipped.
Probing for Winbond W29C020C, 256 KB: skipped.
Probing for Winbond W29C040P, 512 KB: skipped.
Probing for Winbond W29EE011, 128 KB: skipped.
Probing for Winbond W39V040A, 512 KB: skipped.
Probing for Winbond W39V040B, 512 KB: skipped.
Probing for Winbond W39V040C, 512 KB: skipped.
Probing for Winbond W39V040FA, 512 KB: probe_jedec_common: id1 0xfe, id2 0xcb, 
id1 is normal flash content, id2 is normal flash content
Probing for Winbond W39V080A, 1024 KB: skipped.
Probing for Winbond W49F002U, 256 KB: skipped.
Probing for Winbond W49F020, 256 KB: skipped.
Probing for Winbond W49V002A, 256 KB: skipped.
Probing for Winbond W49V002FA, 256 KB: probe_jedec_common: id1 0x4d, id2 0xda, 
id1 parity violation, id1 is normal flash content, id2 is normal flash content
Probing for Winbond W39V080FA, 1024 KB: Chip lacks correct probe timing 
information, using default 10mS/40uS. probe_jedec_common: id1 0x4d, id2 0x5a, 
id1 parity violation, id1 is normal flash content, id2 is normal flash content
Probing for Winbond W39V080FA (dual mode), 512 KB: Chip lacks correct probe 
timing information, using default 10mS/40uS. probe_jedec_common: id1 0xfe, id2 
0xcb, id1 is normal flash content, id2 is normal flash content
Probing for AMIC unknown AMIC SPI chip, 0 KB: probe_spi_rdid_generic: id1 0x1f, 
id2 0x4700
Probing for Atmel unknown Atmel SPI chip, 0 KB: probe_spi_rdid_generic: id1 
0x1f, id2 0x4700
Probing for EON unknown EON SPI chip, 0 KB: probe_spi_rdid_generic: id1 0x1f, 
id2 0x4700
Probing for Macronix unknown Macronix SPI chip, 0 KB: probe_spi_rdid_generic: 
id1 0x1f, id2 0x4700
Probing for PMC unknown PMC SPI chip, 0 KB: probe_spi_rdid_generic: id1 0x1f, 
id2 0x4700
Probing for SST unknown SST SPI chip, 0 KB: probe_spi_rdid_generic: id1 0x1f, 
id2 0x4700
Probing for ST unknown ST SPI chip, 0 KB: probe_spi_rdid_generic: id1 0x1f, id2 
0x4700
Probing for Sanyo unknown Sanyo SPI chip, 0 KB: probe_spi_rdid_generic: id1 
0x1f, id2 0x4700
Probing for Generic unknown SPI chip (RDID), 0 KB: probe_spi_rdid_generic: id1 
0x1f, id2 0x4700
Probing for Generic unknown SPI chip (REMS), 0 KB: probe_spi_rems: id1 0xff, 
id2 0xff
===
This flash part has status UNTESTED for operations: ERASE
The test status of this chip may have been updated in the latest development
version of flashrom. If you are running the latest development version,
please email a report to [email protected] if any of the above operations
work correctly for you with this flash part. Please include the flashrom
output with the additional -V option for all operations you tested (-V, -Vr,
-Vw, -VE), and mention which mainboard or programmer you tested.
Thanks for your help!
===
No operations were specified.
_______________________________________________
flashrom mailing list
[email protected]
http://www.flashrom.org/mailman/listinfo/flashrom

Reply via email to