On 16.09.2009 15:33, Carl-Daniel Hailfinger wrote:
> The current ICH SPI preop handling is a hack which spews lots of
> warnings, but still yields correct results.
> With the multicommand infrastructure I introduced in r645, it became
> possible to integrate ICH SPI preopcodes cleanly into the flashrom design.
>
> The new code checks for every opcode in a multicommand array if it is a
> preopcode. If yes, it checks if the next opcode is associated with that
> preopcode and in that case it simply runs the opcode because the correct
> preopcode will be run automatically before the opcode.
>   

Updated patch with comments from FENG Yu Ning incorporated. I also shortened
struct spi_command *spicommands
to
struct spi_command *cmds
in a few places. I think the code is still readable, and we don't break
the 80 char limit anymore.

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

Index: flashrom-ich9_multicommand_preop/flash.h
===================================================================
--- flashrom-ich9_multicommand_preop/flash.h    (Revision 725)
+++ flashrom-ich9_multicommand_preop/flash.h    (Arbeitskopie)
@@ -498,7 +498,7 @@
 struct spi_programmer {
        int (*command)(unsigned int writecnt, unsigned int readcnt,
                   const unsigned char *writearr, unsigned char *readarr);
-       int (*multicommand)(struct spi_command *spicommands);
+       int (*multicommand)(struct spi_command *cmds);
 
        /* Optimized functions for this programmer */
        int (*read)(struct flashchip *flash, uint8_t *buf, int start, int len);
@@ -514,7 +514,7 @@
 int probe_spi_res(struct flashchip *flash);
 int spi_send_command(unsigned int writecnt, unsigned int readcnt,
                const unsigned char *writearr, unsigned char *readarr);
-int spi_send_multicommand(struct spi_command *spicommands);
+int spi_send_multicommand(struct spi_command *cmds);
 int spi_write_enable(void);
 int spi_write_disable(void);
 int spi_chip_erase_60(struct flashchip *flash);
@@ -539,7 +539,7 @@
 uint32_t spi_get_valid_read_addr(void);
 int default_spi_send_command(unsigned int writecnt, unsigned int readcnt,
                             const unsigned char *writearr, unsigned char 
*readarr);
-int default_spi_send_multicommand(struct spi_command *spicommands);
+int default_spi_send_multicommand(struct spi_command *cmds);
 
 /* 82802ab.c */
 int probe_82802ab(struct flashchip *flash);
@@ -565,7 +565,7 @@
                    const unsigned char *writearr, unsigned char *readarr);
 int ich_spi_read(struct flashchip *flash, uint8_t *buf, int start, int len);
 int ich_spi_write_256(struct flashchip *flash, uint8_t * buf);
-int ich_spi_send_multicommand(struct spi_command *spicommands);
+int ich_spi_send_multicommand(struct spi_command *cmds);
 
 /* it87spi.c */
 extern uint16_t it8716f_flashport;
Index: flashrom-ich9_multicommand_preop/spi.c
===================================================================
--- flashrom-ich9_multicommand_preop/spi.c      (Revision 725)
+++ flashrom-ich9_multicommand_preop/spi.c      (Arbeitskopie)
@@ -118,7 +118,7 @@
                                                      writearr, readarr);
 }
 
-int spi_send_multicommand(struct spi_command *spicommands)
+int spi_send_multicommand(struct spi_command *cmds)
 {
        if (!spi_programmer[spi_controller].multicommand) {
                fprintf(stderr, "%s called, but SPI is unsupported on this "
@@ -126,7 +126,7 @@
                return 1;
        }
 
-       return spi_programmer[spi_controller].multicommand(spicommands);
+       return spi_programmer[spi_controller].multicommand(cmds);
 }
 
 int default_spi_send_command(unsigned int writecnt, unsigned int readcnt,
@@ -148,13 +148,12 @@
        return spi_send_multicommand(cmd);
 }
 
-int default_spi_send_multicommand(struct spi_command *spicommands)
+int default_spi_send_multicommand(struct spi_command *cmds)
 {
        int result = 0;
-       while ((spicommands->writecnt || spicommands->readcnt) && !result) {
-               result = spi_send_command(spicommands->writecnt, 
spicommands->readcnt,
-                                         spicommands->writearr, 
spicommands->readarr);
-               spicommands++;
+       for (; (cmds->writecnt || cmds->readcnt) && !result; cmds++) {
+               result = spi_send_command(cmds->writecnt, cmds->readcnt,
+                                         cmds->writearr, cmds->readarr);
        }
        return result;
 }
@@ -494,7 +493,7 @@
 int spi_chip_erase_60(struct flashchip *flash)
 {
        int result;
-       struct spi_command spicommands[] = {
+       struct spi_command cmds[] = {
        {
                .writecnt       = JEDEC_WREN_OUTSIZE,
                .writearr       = (const unsigned char[]){ JEDEC_WREN },
@@ -518,7 +517,7 @@
                return result;
        }
        
-       result = spi_send_multicommand(spicommands);
+       result = spi_send_multicommand(cmds);
        if (result) {
                fprintf(stderr, "%s failed during command execution\n",
                        __func__);
@@ -540,7 +539,7 @@
 int spi_chip_erase_c7(struct flashchip *flash)
 {
        int result;
-       struct spi_command spicommands[] = {
+       struct spi_command cmds[] = {
        {
                .writecnt       = JEDEC_WREN_OUTSIZE,
                .writearr       = (const unsigned char[]){ JEDEC_WREN },
@@ -564,7 +563,7 @@
                return result;
        }
 
-       result = spi_send_multicommand(spicommands);
+       result = spi_send_multicommand(cmds);
        if (result) {
                fprintf(stderr, "%s failed during command execution\n", 
__func__);
                return result;
@@ -596,7 +595,7 @@
 int spi_block_erase_52(struct flashchip *flash, unsigned int addr, unsigned 
int blocklen)
 {
        int result;
-       struct spi_command spicommands[] = {
+       struct spi_command cmds[] = {
        {
                .writecnt       = JEDEC_WREN_OUTSIZE,
                .writearr       = (const unsigned char[]){ JEDEC_WREN },
@@ -614,7 +613,7 @@
                .readarr        = NULL,
        }};
 
-       result = spi_send_multicommand(spicommands);
+       result = spi_send_multicommand(cmds);
        if (result) {
                fprintf(stderr, "%s failed during command execution\n",
                        __func__);
@@ -640,7 +639,7 @@
 int spi_block_erase_d8(struct flashchip *flash, unsigned int addr, unsigned 
int blocklen)
 {
        int result;
-       struct spi_command spicommands[] = {
+       struct spi_command cmds[] = {
        {
                .writecnt       = JEDEC_WREN_OUTSIZE,
                .writearr       = (const unsigned char[]){ JEDEC_WREN },
@@ -658,7 +657,7 @@
                .readarr        = NULL,
        }};
 
-       result = spi_send_multicommand(spicommands);
+       result = spi_send_multicommand(cmds);
        if (result) {
                fprintf(stderr, "%s failed during command execution\n", 
__func__);
                return result;
@@ -702,7 +701,7 @@
 int spi_block_erase_20(struct flashchip *flash, unsigned int addr, unsigned 
int blocklen)
 {
        int result;
-       struct spi_command spicommands[] = {
+       struct spi_command cmds[] = {
        {
                .writecnt       = JEDEC_WREN_OUTSIZE,
                .writearr       = (const unsigned char[]){ JEDEC_WREN },
@@ -720,7 +719,7 @@
                .readarr        = NULL,
        }};
 
-       result = spi_send_multicommand(spicommands);
+       result = spi_send_multicommand(cmds);
        if (result) {
                fprintf(stderr, "%s failed during command execution\n",
                        __func__);
@@ -779,7 +778,7 @@
 int spi_write_status_register(int status)
 {
        int result;
-       struct spi_command spicommands[] = {
+       struct spi_command cmds[] = {
        {
                .writecnt       = JEDEC_EWSR_OUTSIZE,
                .writearr       = (const unsigned char[]){ JEDEC_EWSR },
@@ -797,7 +796,7 @@
                .readarr        = NULL,
        }};
 
-       result = spi_send_multicommand(spicommands);
+       result = spi_send_multicommand(cmds);
        if (result) {
                fprintf(stderr, "%s failed during command execution\n",
                        __func__);
@@ -808,7 +807,7 @@
 int spi_byte_program(int addr, uint8_t byte)
 {
        int result;
-       struct spi_command spicommands[] = {
+       struct spi_command cmds[] = {
        {
                .writecnt       = JEDEC_WREN_OUTSIZE,
                .writearr       = (const unsigned char[]){ JEDEC_WREN },
@@ -826,7 +825,7 @@
                .readarr        = NULL,
        }};
 
-       result = spi_send_multicommand(spicommands);
+       result = spi_send_multicommand(cmds);
        if (result) {
                fprintf(stderr, "%s failed during command execution\n",
                        __func__);
@@ -844,7 +843,7 @@
                (address >> 8) & 0xff,
                (address >> 0) & 0xff,
        };
-       struct spi_command spicommands[] = {
+       struct spi_command cmds[] = {
        {
                .writecnt       = JEDEC_WREN_OUTSIZE,
                .writearr       = (const unsigned char[]){ JEDEC_WREN },
@@ -873,7 +872,7 @@
 
        memcpy(&cmd[4], bytes, len);
 
-       result = spi_send_multicommand(spicommands);
+       result = spi_send_multicommand(cmds);
        if (result) {
                fprintf(stderr, "%s failed during command execution\n",
                        __func__);
Index: flashrom-ich9_multicommand_preop/ichspi.c
===================================================================
--- flashrom-ich9_multicommand_preop/ichspi.c   (Revision 725)
+++ flashrom-ich9_multicommand_preop/ichspi.c   (Arbeitskopie)
@@ -742,22 +742,26 @@
        return result;
 }
 
-int ich_spi_send_multicommand(struct spi_command *spicommands)
+int ich_spi_send_multicommand(struct spi_command *cmds)
 {
        int ret = 0;
-       while ((spicommands->writecnt || spicommands->readcnt) && !ret) {
-               ret = ich_spi_send_command(spicommands->writecnt, 
spicommands->readcnt,
-                                          spicommands->writearr, 
spicommands->readarr);
-               /* This awful hack needs to be smarter.
-                */
-               if ((ret == SPI_INVALID_OPCODE) &&
-                   ((spicommands->writearr[0] == JEDEC_WREN) ||
-                    (spicommands->writearr[0] == JEDEC_EWSR))) {
-                       printf_debug(" due to SPI master limitation, ignoring"
-                                    " and hoping it will be run as PREOP\n");
-                       ret = 0;
-               }
-               spicommands++;
+       int oppos, preoppos;
+       for (; (cmds->writecnt || cmds->readcnt) && !ret; cmds++) {
+               /* Is the next command valid or a terminator? */
+               if ((cmds + 1)->writecnt || (cmds + 1)->readcnt) {
+                       preoppos = find_preop(curopcodes, cmds->writearr[0]);
+                       oppos = find_opcode(curopcodes, (cmds + 
1)->writearr[0]);
+                       /* Is the current opcode a preopcode for the next 
opcode? */
+                       if ((oppos != -1) && (preoppos != -1) &&
+                           (curopcodes->opcode[oppos].atomic == preoppos)) {
+                               printf_debug("opcode 0x%02x will be run as 
PREOP\n",
+                                            cmds->writearr[0]);
+                               continue;
+                       }
+               }       
+                       
+               ret = ich_spi_send_command(cmds->writecnt, cmds->readcnt,
+                                          cmds->writearr, cmds->readarr);
        }
        return ret;
 }


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


_______________________________________________
flashrom mailing list
[email protected]
http://www.flashrom.org/mailman/listinfo/flashrom

Reply via email to