[flashrom] [commit] r965 - trunk

repository service svn at flashrom.org
Mon Mar 22 05:39:31 CET 2010


Author: snelson
Date: Mon Mar 22 05:39:31 2010
New Revision: 965
URL: http://flashrom.org/trac/coreboot/changeset/965

Log:
To access/read the lock bits, we use the same mode to read the chip id.

This patch looks into the write situation for the Intel 28F001BX-{B,T}. Looks like they're just a 82802ab page write.

Unlock_28f004s5 has been changed to read all the lock bits and if at least one of the block lock bits are set, clear them all. If the master lock bit is set, we can't do anything about it, so we return.

Signed-off-by: Sean Nelson <audiohacked at gmail.com>
Acked-by: Carl-Daniel Hailfinger<c-d.hailfinger.devel.2006 at gmx.net>

Modified:
   trunk/82802ab.c
   trunk/flashchips.c

Modified: trunk/82802ab.c
==============================================================================
--- trunk/82802ab.c	Mon Mar 22 04:30:58 2010	(r964)
+++ trunk/82802ab.c	Mon Mar 22 05:39:31 2010	(r965)
@@ -205,3 +205,52 @@
 
 	return 0;
 }
+
+int unlock_28f004s5(struct flashrom *flash)
+{
+	chipaddr bios = flash->virtual_memory;
+	uint8_t mcfg, bcfg, need_unlock = 0, can_unlock = 0;
+
+	/* Clear status register */
+	chip_writeb(0x50, bios);
+
+	/* Read identifier codes */
+	chip_writeb(0x90, bios);
+
+	/* Read master lock-bit */
+	mcfg = chip_readb(bios + 0x3);
+	msg_cinfo("master lock is ");
+	if (mcfg) {
+		msg_cdbg("locked!\n");
+	} else {
+		msg_cdbg("unlocked!\n");
+		can_unlock = 1;
+	}
+	
+	/* Read block lock-bits */
+	for (i = 0; i < flash->total_size * 1024; i+= (64 * 1024)) {
+		bcfg = chip_readb(bios + i + 2); // read block lock config
+		msg_cdbg("block lock at %06x is %slocked!\n", i, bcfg ? "" : "un");
+		if (bcfg) {
+			need_unlock = 1;
+		}
+	}
+
+	/* Reset chip */
+	chip_writeb(0xFF, bios);
+
+	/* Unlock: clear block lock-bits, if needed */
+	if (can_unlock && need_unlock) {
+		chip_writeb(0x60, bios);
+		chip_writeb(0xD0, bios);
+		chip_writeb(0xFF, bios);
+	}
+
+	/* Error: master locked or a block is locked */
+	if (!can_unlock && need_unlock) {
+		msg_cerr("At least one block is locked and lockdown is active!\n");
+		return -1;
+	}
+
+	return 0;
+}

Modified: trunk/flashchips.c
==============================================================================
--- trunk/flashchips.c	Mon Mar 22 04:30:58 2010	(r964)
+++ trunk/flashchips.c	Mon Mar 22 05:39:31 2010	(r965)
@@ -2316,7 +2316,7 @@
 		.model_id	= P28F001BXB,
 		.total_size	= 128,
 		.page_size	= 128 * 1024, /* 8k + 2x4k + 112k */
-		.tested		= TEST_BAD_WRITE,
+		.tested		= TEST_UNTESTED,
 		.probe		= probe_jedec,
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
@@ -2330,7 +2330,7 @@
 				.block_erase = erase_block_82802ab,
 			},
 		},
-		.write		= NULL,
+		.write		= write_82802ab,
 		.read		= read_memmapped,
 	},
 
@@ -2342,7 +2342,7 @@
 		.model_id	= P28F001BXT,
 		.total_size	= 128,
 		.page_size	= 128 * 1024, /* 112k + 2x4k + 8k */
-		.tested		= TEST_BAD_WRITE,
+		.tested		= TEST_UNTESTED,
 		.probe		= probe_jedec,
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
 		.block_erasers	=
@@ -2356,7 +2356,7 @@
 				.block_erase = erase_block_82802ab,
 			},
 		},
-		.write		= NULL,
+		.write		= write_82802ab,
 		.read		= read_memmapped,
 	},
 
@@ -2368,7 +2368,6 @@
 		.model_id	= E_28F004S5,
 		.total_size	= 512,
 		.page_size	= 256,
-		.feature_bits	= FEATURE_REGISTERMAP,
 		.tested		= TEST_UNTESTED,
 		.probe		= probe_82802ab,
 		.probe_timing	= TIMING_ZERO,	/* Datasheet has no timing info specified */
@@ -2379,7 +2378,7 @@
 				.block_erase = erase_block_82802ab,
 			},
 		},
-		.unlock		= unlock_82802ab,
+		.unlock		= unlock_28f004s5,
 		.write		= write_82802ab,
 		.read		= read_memmapped,
 	},




More information about the flashrom mailing list