summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>2008-11-28 01:25:00 +0000
committerCarl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>2008-11-28 01:25:00 +0000
commit14e50ac12310eac97f64ee8d6cb17dfb6407259b (patch)
treedb1512123838cee8ce82f11fb61def54898b073f
parent92a54ca0300dd6e0f9773a4313ab489df79020c7 (diff)
downloadast2050-flashrom-14e50ac12310eac97f64ee8d6cb17dfb6407259b.zip
ast2050-flashrom-14e50ac12310eac97f64ee8d6cb17dfb6407259b.tar.gz
Flashrom already has the following probe functions
- probe_spi_rdid with opcode 0x9f, usually 3 bytes ID - probe_spi_res with opcode 0xab, usually 1 byte ID We are missing the following probe function: - probe_spi_rems with opcode 0x90, usually 2 bytes ID RDID provides best specifity (manufacturer, device class and device) and RES is supported by quite a few old chips. However, RES only returns one byte and there are multiple flash chips with different sizes on the market and all of them have the same RES ID. REMS is from the same age as RES, but it provides a manufacturer and a device ID. It is therefore on par with the probing for parallel flash chips and specific enough. The order in which chips should be detected is as follows: 1. RDID 2. REMS 3. RES Corresponding to flashrom svn r349 and coreboot v2 svn r3775. Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net> Acked-by: Peter Stuge <peter@stuge.se>
-rw-r--r--flash.h1
-rw-r--r--spi.c41
-rw-r--r--spi.h5
3 files changed, 47 insertions, 0 deletions
diff --git a/flash.h b/flash.h
index 9f6a862..d1e417f 100644
--- a/flash.h
+++ b/flash.h
@@ -449,6 +449,7 @@ extern char *lb_part, *lb_vendor;
/* spi.c */
int probe_spi_rdid(struct flashchip *flash);
int probe_spi_rdid4(struct flashchip *flash);
+int probe_spi_rems(struct flashchip *flash);
int probe_spi_res(struct flashchip *flash);
int spi_command(unsigned int writecnt, unsigned int readcnt,
const unsigned char *writearr, unsigned char *readarr);
diff --git a/spi.c b/spi.c
index a5b85f4..8812eff 100644
--- a/spi.c
+++ b/spi.c
@@ -61,6 +61,16 @@ static int spi_rdid(unsigned char *readarr, int bytes)
return 0;
}
+static int spi_rems(unsigned char *readarr)
+{
+ const unsigned char cmd[JEDEC_REMS_OUTSIZE] = { JEDEC_REMS, 0, 0, 0 };
+
+ if (spi_command(sizeof(cmd), JEDEC_REMS_INSIZE, cmd, readarr))
+ return 1;
+ printf_debug("REMS returned %02x %02x.\n", readarr[0], readarr[1]);
+ return 0;
+}
+
static int spi_res(unsigned char *readarr)
{
const unsigned char cmd[JEDEC_RES_OUTSIZE] = { JEDEC_RES, 0, 0, 0 };
@@ -155,6 +165,37 @@ int probe_spi_rdid4(struct flashchip *flash)
return 0;
}
+int probe_spi_rems(struct flashchip *flash)
+{
+ unsigned char readarr[JEDEC_REMS_INSIZE];
+ uint32_t manuf_id, model_id;
+
+ if (spi_rems(readarr))
+ return 0;
+
+ manuf_id = readarr[0];
+ model_id = readarr[1];
+
+ printf_debug("%s: id1 0x%x, id2 0x%x\n", __FUNCTION__, manuf_id,
+ model_id);
+
+ if (manuf_id == flash->manufacture_id && model_id == flash->model_id) {
+ /* Print the status register to tell the
+ * user about possible write protection.
+ */
+ spi_prettyprint_status_register(flash);
+
+ return 1;
+ }
+
+ /* Test if this is a pure vendor match. */
+ if (manuf_id == flash->manufacture_id &&
+ GENERIC_DEVICE_ID == flash->model_id)
+ return 1;
+
+ return 0;
+}
+
int probe_spi_res(struct flashchip *flash)
{
unsigned char readarr[3];
diff --git a/spi.h b/spi.h
index 54c71fc..c096dce 100644
--- a/spi.h
+++ b/spi.h
@@ -29,6 +29,11 @@
#define JEDEC_RDID_OUTSIZE 0x01
#define JEDEC_RDID_INSIZE 0x03
+/* Read Electronic Manufacturer Signature */
+#define JEDEC_REMS 0x90
+#define JEDEC_REMS_OUTSIZE 0x04
+#define JEDEC_REMS_INSIZE 0x02
+
/* Read Electronic Signature */
#define JEDEC_RES 0xab
#define JEDEC_RES_OUTSIZE 0x04
OpenPOWER on IntegriCloud