Save the sftp_size in the spi_nor struct so we can use it to dump the
SFDP table without parsing the headers again.

Signed-off-by: Michael Walle <mich...@walle.cc>
---
 drivers/mtd/spi-nor/sfdp.c  | 12 ++++++++++++
 include/linux/mtd/spi-nor.h |  1 +
 2 files changed, 13 insertions(+)

diff --git a/drivers/mtd/spi-nor/sfdp.c b/drivers/mtd/spi-nor/sfdp.c
index 25142ec4737b..b1814afefc33 100644
--- a/drivers/mtd/spi-nor/sfdp.c
+++ b/drivers/mtd/spi-nor/sfdp.c
@@ -16,6 +16,7 @@
        (((p)->parameter_table_pointer[2] << 16) | \
         ((p)->parameter_table_pointer[1] <<  8) | \
         ((p)->parameter_table_pointer[0] <<  0))
+#define SFDP_PARAM_HEADER_PARAM_LEN(p) ((p)->length * 4)
 
 #define SFDP_BFPT_ID           0xff00  /* Basic Flash Parameter Table */
 #define SFDP_SECTOR_MAP_ID     0xff81  /* Sector Map Table */
@@ -1263,6 +1264,7 @@ int spi_nor_parse_sfdp(struct spi_nor *nor,
        struct sfdp_parameter_header *param_headers = NULL;
        struct sfdp_header header;
        struct device *dev = nor->dev;
+       size_t param_max_offset;
        size_t psize;
        int i, err;
 
@@ -1285,6 +1287,9 @@ int spi_nor_parse_sfdp(struct spi_nor *nor,
            bfpt_header->major != SFDP_JESD216_MAJOR)
                return -EINVAL;
 
+       nor->sfdp_size = SFDP_PARAM_HEADER_PTP(bfpt_header) +
+                        SFDP_PARAM_HEADER_PARAM_LEN(bfpt_header);
+
        /*
         * Allocate memory then read all parameter headers with a single
         * Read SFDP command. These parameter headers will actually be parsed
@@ -1311,6 +1316,13 @@ int spi_nor_parse_sfdp(struct spi_nor *nor,
                }
        }
 
+       for (i = 0; i < header.nph; i++) {
+               param_header = &param_headers[i];
+               param_max_offset = SFDP_PARAM_HEADER_PTP(param_header) +
+                                  SFDP_PARAM_HEADER_PARAM_LEN(param_header);
+               nor->sfdp_size = max(nor->sfdp_size, param_max_offset);
+       }
+
        /*
         * Check other parameter headers to get the latest revision of
         * the basic flash parameter table.
diff --git a/include/linux/mtd/spi-nor.h b/include/linux/mtd/spi-nor.h
index a0d572855444..a58118b8b002 100644
--- a/include/linux/mtd/spi-nor.h
+++ b/include/linux/mtd/spi-nor.h
@@ -404,6 +404,7 @@ struct spi_nor {
        bool                    sst_write_second;
        u32                     flags;
        enum spi_nor_cmd_ext    cmd_ext_type;
+       size_t                  sfdp_size;
 
        const struct spi_nor_controller_ops *controller_ops;
 
-- 
2.20.1

Reply via email to