summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--util/flashrom/flash.h1
-rw-r--r--util/flashrom/spi.c41
-rw-r--r--util/flashrom/spi.h5
3 files changed, 47 insertions, 0 deletions
diff --git a/util/flashrom/flash.h b/util/flashrom/flash.h
index 9f6a862795..d1e417fb39 100644
--- a/util/flashrom/flash.h
+++ b/util/flashrom/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/util/flashrom/spi.c b/util/flashrom/spi.c
index a5b85f4e02..8812eff123 100644
--- a/util/flashrom/spi.c
+++ b/util/flashrom/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/util/flashrom/spi.h b/util/flashrom/spi.h
index 54c71fc668..c096dce5c6 100644
--- a/util/flashrom/spi.h
+++ b/util/flashrom/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