Add a dummy SPI controller driver, similar to the dummy LPC/FWH/Parallel
flasher driver.
Does not support reading or writing the fake chip yet.

flashrom --programmer dummy
also enables the dummy SPI controller driver.

Testing the dummy SPI driver revealed a RDID debug printing bug in the
SPI core. Fix that as well.

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

Index: flashrom-dummy_spi/flash.h
===================================================================
--- flashrom-dummy_spi/flash.h  (Revision 495)
+++ flashrom-dummy_spi/flash.h  (Arbeitskopie)
@@ -569,7 +569,8 @@
        BUS_TYPE_IT87XX_SPI,
        BUS_TYPE_SB600_SPI,
        BUS_TYPE_VIA_SPI,
-       BUS_TYPE_WBSIO_SPI
+       BUS_TYPE_WBSIO_SPI,
+       BUS_TYPE_DUMMY_SPI
 } flashbus_t;
 
 extern flashbus_t flashbus;
@@ -600,6 +601,8 @@
 uint8_t dummy_chip_readb(const volatile void *addr);
 uint16_t dummy_chip_readw(const volatile void *addr);
 uint32_t dummy_chip_readl(const volatile void *addr);
+int dummy_spi_command(unsigned int writecnt, unsigned int readcnt,
+                     const unsigned char *writearr, unsigned char *readarr);
 
 /* flashrom.c */
 extern int verbose;
Index: flashrom-dummy_spi/spi.c
===================================================================
--- flashrom-dummy_spi/spi.c    (Revision 495)
+++ flashrom-dummy_spi/spi.c    (Arbeitskopie)
@@ -46,6 +46,8 @@
                return sb600_spi_command(writecnt, readcnt, writearr, readarr);
        case BUS_TYPE_WBSIO_SPI:
                return wbsio_spi_command(writecnt, readcnt, writearr, readarr);
+       case BUS_TYPE_DUMMY_SPI:
+               return dummy_spi_command(writecnt, readcnt, writearr, readarr);
        default:
                printf_debug
                    ("%s called, but no SPI chipset/strapping detected\n",
@@ -57,11 +59,14 @@
 static int spi_rdid(unsigned char *readarr, int bytes)
 {
        const unsigned char cmd[JEDEC_RDID_OUTSIZE] = { JEDEC_RDID };
+       int i;
 
        if (spi_command(sizeof(cmd), bytes, cmd, readarr))
                return 1;
-       printf_debug("RDID returned %02x %02x %02x.\n", readarr[0], readarr[1],
-                    readarr[2]);
+       printf_debug("RDID returned");
+       for (i = 0; i < bytes; i++)
+               printf_debug(" 0x%02x", readarr[i]);
+       printf_debug("\n");
        return 0;
 }
 
@@ -178,6 +183,7 @@
        case BUS_TYPE_VIA_SPI:
        case BUS_TYPE_SB600_SPI:
        case BUS_TYPE_WBSIO_SPI:
+       case BUS_TYPE_DUMMY_SPI:
                return probe_spi_rdid_generic(flash, 4);
        default:
                printf_debug("4b ID not supported on this SPI controller\n");
Index: flashrom-dummy_spi/dummyflasher.c
===================================================================
--- flashrom-dummy_spi/dummyflasher.c   (Revision 495)
+++ flashrom-dummy_spi/dummyflasher.c   (Arbeitskopie)
@@ -31,6 +31,7 @@
 int dummy_init(void)
 {
        printf_debug("%s\n", __func__);
+       flashbus = BUS_TYPE_DUMMY_SPI;
        return 0; 
 }
 
@@ -86,3 +87,23 @@
        return 0xffffffff;
 }
 
+int dummy_spi_command(unsigned int writecnt, unsigned int readcnt,
+                     const unsigned char *writearr, unsigned char *readarr)
+{
+       int i;
+
+       printf_debug("%s:", __func__);
+
+       printf_debug(" writing %u bytes:", writecnt);
+       for (i = 0; i < writecnt; i++)
+               printf_debug(" 0x%02x", writearr[i]);
+
+       printf_debug(" reading %u bytes:", readcnt);
+       for (i = 0; i < readcnt; i++) {
+               printf_debug(" 0xff");
+               readarr[i] = 0xff;
+       }
+
+       printf_debug("\n");
+       return 0;
+}


-- 
http://www.hailfinger.org/

Index: flashrom-dummy_spi/flash.h
===================================================================
--- flashrom-dummy_spi/flash.h  (Revision 495)
+++ flashrom-dummy_spi/flash.h  (Arbeitskopie)
@@ -569,7 +569,8 @@
        BUS_TYPE_IT87XX_SPI,
        BUS_TYPE_SB600_SPI,
        BUS_TYPE_VIA_SPI,
-       BUS_TYPE_WBSIO_SPI
+       BUS_TYPE_WBSIO_SPI,
+       BUS_TYPE_DUMMY_SPI
 } flashbus_t;
 
 extern flashbus_t flashbus;
@@ -600,6 +601,8 @@
 uint8_t dummy_chip_readb(const volatile void *addr);
 uint16_t dummy_chip_readw(const volatile void *addr);
 uint32_t dummy_chip_readl(const volatile void *addr);
+int dummy_spi_command(unsigned int writecnt, unsigned int readcnt,
+                     const unsigned char *writearr, unsigned char *readarr);
 
 /* flashrom.c */
 extern int verbose;
Index: flashrom-dummy_spi/spi.c
===================================================================
--- flashrom-dummy_spi/spi.c    (Revision 495)
+++ flashrom-dummy_spi/spi.c    (Arbeitskopie)
@@ -46,6 +46,8 @@
                return sb600_spi_command(writecnt, readcnt, writearr, readarr);
        case BUS_TYPE_WBSIO_SPI:
                return wbsio_spi_command(writecnt, readcnt, writearr, readarr);
+       case BUS_TYPE_DUMMY_SPI:
+               return dummy_spi_command(writecnt, readcnt, writearr, readarr);
        default:
                printf_debug
                    ("%s called, but no SPI chipset/strapping detected\n",
@@ -57,11 +59,14 @@
 static int spi_rdid(unsigned char *readarr, int bytes)
 {
        const unsigned char cmd[JEDEC_RDID_OUTSIZE] = { JEDEC_RDID };
+       int i;
 
        if (spi_command(sizeof(cmd), bytes, cmd, readarr))
                return 1;
-       printf_debug("RDID returned %02x %02x %02x.\n", readarr[0], readarr[1],
-                    readarr[2]);
+       printf_debug("RDID returned");
+       for (i = 0; i < bytes; i++)
+               printf_debug(" 0x%02x", readarr[i]);
+       printf_debug("\n");
        return 0;
 }
 
@@ -178,6 +183,7 @@
        case BUS_TYPE_VIA_SPI:
        case BUS_TYPE_SB600_SPI:
        case BUS_TYPE_WBSIO_SPI:
+       case BUS_TYPE_DUMMY_SPI:
                return probe_spi_rdid_generic(flash, 4);
        default:
                printf_debug("4b ID not supported on this SPI controller\n");
Index: flashrom-dummy_spi/dummyflasher.c
===================================================================
--- flashrom-dummy_spi/dummyflasher.c   (Revision 495)
+++ flashrom-dummy_spi/dummyflasher.c   (Arbeitskopie)
@@ -31,6 +31,7 @@
 int dummy_init(void)
 {
        printf_debug("%s\n", __func__);
+       flashbus = BUS_TYPE_DUMMY_SPI;
        return 0; 
 }
 
@@ -86,3 +87,23 @@
        return 0xffffffff;
 }
 
+int dummy_spi_command(unsigned int writecnt, unsigned int readcnt,
+                     const unsigned char *writearr, unsigned char *readarr)
+{
+       int i;
+
+       printf_debug("%s:", __func__);
+
+       printf_debug(" writing %u bytes:", writecnt);
+       for (i = 0; i < writecnt; i++)
+               printf_debug(" 0x%02x", writearr[i]);
+
+       printf_debug(" reading %u bytes:", readcnt);
+       for (i = 0; i < readcnt; i++) {
+               printf_debug(" 0xff");
+               readarr[i] = 0xff;
+       }
+
+       printf_debug("\n");
+       return 0;
+}
-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to