]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
mtd: spi-nor: debugfs: Add a locked sectors map
authorMiquel Raynal <miquel.raynal@bootlin.com>
Tue, 26 May 2026 14:56:43 +0000 (16:56 +0200)
committerPratyush Yadav <pratyush@kernel.org>
Tue, 26 May 2026 15:23:53 +0000 (17:23 +0200)
In order to get a very clear view of the sectors being locked, besides
the `params` output giving the ranges, we may want to see a proper map
of the sectors and for each of them, their status. Depending on the use
case, this map may be easier to parse by humans and gives a more acurate
feeling of the situation. At least myself, for the few locking-related
developments I recently went through, I found it very useful to get a
clearer mental model of what was locked/unlocked.

Here is an example of output:

$ cat /sys/kernel/debug/spi-nor/spi0.0/locked-sectors-map
Locked sectors map (x: locked, .: unlocked, unit: 64kiB)
 0x00000000 (#    0): ................ ................ ................ ................
 0x00400000 (#   64): ................ ................ ................ ................
 0x00800000 (#  128): ................ ................ ................ ................
 0x00c00000 (#  192): ................ ................ ................ ................
 0x01000000 (#  256): ................ ................ ................ ................
 0x01400000 (#  320): ................ ................ ................ ................
 0x01800000 (#  384): ................ ................ ................ ................
 0x01c00000 (#  448): ................ ................ ................ ................
 0x02000000 (#  512): ................ ................ ................ ................
 0x02400000 (#  576): ................ ................ ................ ................
 0x02800000 (#  640): ................ ................ ................ ................
 0x02c00000 (#  704): ................ ................ ................ ................
 0x03000000 (#  768): ................ ................ ................ ................
 0x03400000 (#  832): ................ ................ ................ ................
 0x03800000 (#  896): ................ ................ ................ ................
 0x03c00000 (#  960): ................ ................ ................ ..............xx

The output is wrapped at 64 sectors, spaces every 16 sectors are
improving the readability, every line starts by the first sector
offset (hex) and number (decimal).

Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
[pratyush@kernel.org: split the debugfs_create_file() into two lines]
Signed-off-by: Pratyush Yadav <pratyush@kernel.org>
drivers/mtd/spi-nor/debugfs.c

index 82df8ad4176c974f7294a486b25f4127388b8dca..ef710bd4f30789945a71b7ef40cd6fdaa5dfa68f 100644 (file)
@@ -191,6 +191,41 @@ static int spi_nor_params_show(struct seq_file *s, void *data)
 }
 DEFINE_SHOW_ATTRIBUTE(spi_nor_params);
 
+static int spi_nor_locked_sectors_map_show(struct seq_file *s, void *data)
+{
+       struct spi_nor *nor = s->private;
+       struct spi_nor_flash_parameter *params = nor->params;
+       u64 min_prot_len = spi_nor_get_min_prot_length_sr(nor);
+       unsigned int sector = 0;
+       u64 offset = 0;
+       bool locked;
+       int i;
+
+       seq_printf(s, "Locked sectors map (x: locked, .: unlocked, unit: %lldkiB)\n",
+                  min_prot_len / 1024);
+       while (offset < params->size) {
+               seq_printf(s, " 0x%08llx (#%5d): ", offset, sector);
+               for (i = 0; i < 64 && offset < params->size; i++) {
+                       locked = spi_nor_is_locked_sr(nor, offset, min_prot_len,
+                                                     nor->dfs_sr_cache);
+                       if (locked)
+                               seq_puts(s, "x");
+                       else
+                               seq_puts(s, ".");
+
+                       if (((i + 1) % 16) == 0)
+                               seq_puts(s, " ");
+
+                       offset += min_prot_len;
+                       sector++;
+               }
+               seq_puts(s, "\n");
+       }
+
+       return 0;
+}
+DEFINE_SHOW_ATTRIBUTE(spi_nor_locked_sectors_map);
+
 static void spi_nor_print_read_cmd(struct seq_file *s, u32 cap,
                                   struct spi_nor_read_command *cmd)
 {
@@ -276,6 +311,9 @@ void spi_nor_debugfs_register(struct spi_nor *nor)
        debugfs_create_file("params", 0444, d, nor, &spi_nor_params_fops);
        debugfs_create_file("capabilities", 0444, d, nor,
                            &spi_nor_capabilities_fops);
+       if (spi_nor_has_default_locking_ops(nor))
+               debugfs_create_file("locked-sectors-map", 0444, d, nor,
+                                   &spi_nor_locked_sectors_map_fops);
 }
 
 void spi_nor_debugfs_shutdown(void)