cxgb4: add support to read serial flash
authorVishal Kulkarni <vishal@chelsio.com>
Thu, 18 Jun 2020 06:05:56 +0000 (11:35 +0530)
committerDavid S. Miller <davem@davemloft.net>
Fri, 19 Jun 2020 03:49:55 +0000 (20:49 -0700)
This patch adds support to dump flash memory via
ethtool --get-dump

Signed-off-by: Vishal Kulkarni <vishal@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/chelsio/cxgb4/cudbg_if.h
drivers/net/ethernet/chelsio/cxgb4/cudbg_lib.c
drivers/net/ethernet/chelsio/cxgb4/cudbg_lib.h
drivers/net/ethernet/chelsio/cxgb4/cxgb4_cudbg.c
drivers/net/ethernet/chelsio/cxgb4/cxgb4_cudbg.h

index fc38130..c84719e 100644 (file)
@@ -70,7 +70,8 @@ enum cudbg_dbg_entity_type {
        CUDBG_HMA_INDIRECT = 67,
        CUDBG_HMA = 68,
        CUDBG_QDESC = 70,
-       CUDBG_MAX_ENTITY = 71,
+       CUDBG_FLASH = 71,
+       CUDBG_MAX_ENTITY = 72,
 };
 
 struct cudbg_init {
index 7b9cd69..cd9494c 100644 (file)
@@ -3156,3 +3156,40 @@ out_free:
 
        return rc;
 }
+
+int cudbg_collect_flash(struct cudbg_init *pdbg_init,
+                       struct cudbg_buffer *dbg_buff,
+                       struct cudbg_error *cudbg_err)
+{
+       struct adapter *padap = pdbg_init->adap;
+       u32 count = padap->params.sf_size, n;
+       struct cudbg_buffer temp_buff = {0};
+       u32 addr, i;
+       int rc;
+
+       addr = FLASH_EXP_ROM_START;
+
+       for (i = 0; i < count; i += SF_PAGE_SIZE) {
+               n = min_t(u32, count - i, SF_PAGE_SIZE);
+
+               rc = cudbg_get_buff(pdbg_init, dbg_buff, n, &temp_buff);
+               if (rc) {
+                       cudbg_err->sys_warn = CUDBG_STATUS_PARTIAL_DATA;
+                       goto out;
+               }
+               rc = t4_read_flash(padap, addr, n, (u32 *)temp_buff.data, 0);
+               if (rc)
+                       goto out;
+
+               addr += (n * 4);
+               rc = cudbg_write_and_release_buff(pdbg_init, &temp_buff,
+                                                 dbg_buff);
+               if (rc) {
+                       cudbg_err->sys_warn = CUDBG_STATUS_PARTIAL_DATA;
+                       goto out;
+               }
+       }
+
+out:
+       return rc;
+}
index 10ee6ed..0f488d5 100644 (file)
@@ -162,7 +162,9 @@ int cudbg_collect_hma_meminfo(struct cudbg_init *pdbg_init,
 int cudbg_collect_qdesc(struct cudbg_init *pdbg_init,
                        struct cudbg_buffer *dbg_buff,
                        struct cudbg_error *cudbg_err);
-
+int cudbg_collect_flash(struct cudbg_init *pdbg_init,
+                       struct cudbg_buffer *dbg_buff,
+                       struct cudbg_error *cudbg_err);
 struct cudbg_entity_hdr *cudbg_get_entity_hdr(void *outbuf, int i);
 void cudbg_align_debug_buffer(struct cudbg_buffer *dbg_buff,
                              struct cudbg_entity_hdr *entity_hdr);
index e374b41..d7afe07 100644 (file)
@@ -66,6 +66,10 @@ static const struct cxgb4_collect_entity cxgb4_collect_hw_dump[] = {
        { CUDBG_HMA_INDIRECT, cudbg_collect_hma_indirect },
 };
 
+static const struct cxgb4_collect_entity cxgb4_collect_flash_dump[] = {
+       { CUDBG_FLASH, cudbg_collect_flash },
+};
+
 static u32 cxgb4_get_entity_length(struct adapter *adap, u32 entity)
 {
        struct cudbg_tcam tcam_region = { 0 };
@@ -330,6 +334,9 @@ u32 cxgb4_get_dump_length(struct adapter *adap, u32 flag)
                }
        }
 
+       if (flag & CXGB4_ETH_DUMP_FLASH)
+               len += adap->params.sf_size;
+
        /* If compression is enabled, a smaller destination buffer is enough */
        wsize = cudbg_get_workspace_size();
        if (wsize && len > CUDBG_DUMP_BUFF_SIZE)
@@ -468,6 +475,13 @@ int cxgb4_cudbg_collect(struct adapter *adap, void *buf, u32 *buf_size,
                                           buf,
                                           &total_size);
 
+       if (flag & CXGB4_ETH_DUMP_FLASH)
+               cxgb4_cudbg_collect_entity(&cudbg_init, &dbg_buff,
+                                          cxgb4_collect_flash_dump,
+                                          ARRAY_SIZE(cxgb4_collect_flash_dump),
+                                          buf,
+                                          &total_size);
+
        cudbg_free_compress_buff(&cudbg_init);
        cudbg_hdr->data_len = total_size;
        if (cudbg_init.compress_type != CUDBG_COMPRESSION_NONE)
index 66b805c..c04a49b 100644 (file)
@@ -27,6 +27,7 @@ enum CXGB4_ETHTOOL_DUMP_FLAGS {
        CXGB4_ETH_DUMP_NONE = ETH_FW_DUMP_DISABLE,
        CXGB4_ETH_DUMP_MEM = (1 << 0), /* On-Chip Memory Dumps */
        CXGB4_ETH_DUMP_HW = (1 << 1), /* various FW and HW dumps */
+       CXGB4_ETH_DUMP_FLASH = (1 << 2), /* Dump flash memory */
 };
 
 #define CXGB4_ETH_DUMP_ALL (CXGB4_ETH_DUMP_MEM | CXGB4_ETH_DUMP_HW)