From 6f24cbc0833fd923238f516dd8964660807ef789 Mon Sep 17 00:00:00 2001 From: Carl-Daniel Hailfinger Date: Fri, 28 Nov 2008 01:25:00 +0000 Subject: 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 Signed-off-by: Carl-Daniel Hailfinger Acked-by: Peter Stuge git-svn-id: svn://svn.coreboot.org/coreboot/trunk@3775 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- util/flashrom/spi.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'util/flashrom/spi.c') 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]; -- cgit v1.2.3