1 // SPDX-License-Identifier: GPL-2.0
3 #include <linux/debugfs.h>
4 #include <linux/mtd/spi-nor.h>
5 #include <linux/spi/spi.h>
6 #include <linux/spi/spi-mem.h>
10 #define SPI_NOR_DEBUGFS_ROOT "spi-nor"
12 #define SNOR_F_NAME(name) [ilog2(SNOR_F_##name)] = #name
13 static const char *const snor_f_names
[] = {
14 SNOR_F_NAME(HAS_SR_TB
),
15 SNOR_F_NAME(NO_OP_CHIP_ERASE
),
16 SNOR_F_NAME(BROKEN_RESET
),
17 SNOR_F_NAME(4B_OPCODES
),
18 SNOR_F_NAME(HAS_4BAIT
),
19 SNOR_F_NAME(HAS_LOCK
),
20 SNOR_F_NAME(HAS_16BIT_SR
),
21 SNOR_F_NAME(NO_READ_CR
),
22 SNOR_F_NAME(HAS_SR_TB_BIT6
),
23 SNOR_F_NAME(HAS_4BIT_BP
),
24 SNOR_F_NAME(HAS_SR_BP3_BIT6
),
25 SNOR_F_NAME(IO_MODE_EN_VOLATILE
),
26 SNOR_F_NAME(SOFT_RESET
),
27 SNOR_F_NAME(SWP_IS_VOLATILE
),
34 static const char *spi_nor_protocol_name(enum spi_nor_protocol proto
)
37 case SNOR_PROTO_1_1_1
: return "1S-1S-1S";
38 case SNOR_PROTO_1_1_2
: return "1S-1S-2S";
39 case SNOR_PROTO_1_1_4
: return "1S-1S-4S";
40 case SNOR_PROTO_1_1_8
: return "1S-1S-8S";
41 case SNOR_PROTO_1_2_2
: return "1S-2S-2S";
42 case SNOR_PROTO_1_4_4
: return "1S-4S-4S";
43 case SNOR_PROTO_1_8_8
: return "1S-8S-8S";
44 case SNOR_PROTO_2_2_2
: return "2S-2S-2S";
45 case SNOR_PROTO_4_4_4
: return "4S-4S-4S";
46 case SNOR_PROTO_8_8_8
: return "8S-8S-8S";
47 case SNOR_PROTO_1_1_1_DTR
: return "1D-1D-1D";
48 case SNOR_PROTO_1_2_2_DTR
: return "1D-2D-2D";
49 case SNOR_PROTO_1_4_4_DTR
: return "1D-4D-4D";
50 case SNOR_PROTO_1_8_8_DTR
: return "1D-8D-8D";
51 case SNOR_PROTO_8_8_8_DTR
: return "8D-8D-8D";
57 static void spi_nor_print_flags(struct seq_file
*s
, unsigned long flags
,
58 const char *const *names
, int names_len
)
63 for (i
= 0; i
< sizeof(flags
) * BITS_PER_BYTE
; i
++) {
64 if (!(flags
& BIT(i
)))
69 if (i
< names_len
&& names
[i
])
70 seq_puts(s
, names
[i
]);
72 seq_printf(s
, "1<<%d", i
);
76 static int spi_nor_params_show(struct seq_file
*s
, void *data
)
78 struct spi_nor
*nor
= s
->private;
79 struct spi_nor_flash_parameter
*params
= nor
->params
;
80 struct spi_nor_erase_map
*erase_map
= ¶ms
->erase_map
;
81 struct spi_nor_erase_region
*region
= erase_map
->regions
;
82 const struct flash_info
*info
= nor
->info
;
86 seq_printf(s
, "name\t\t%s\n", info
->name
);
87 seq_printf(s
, "id\t\t%*ph\n", SPI_NOR_MAX_ID_LEN
, nor
->id
);
88 string_get_size(params
->size
, 1, STRING_UNITS_2
, buf
, sizeof(buf
));
89 seq_printf(s
, "size\t\t%s\n", buf
);
90 seq_printf(s
, "write size\t%u\n", params
->writesize
);
91 seq_printf(s
, "page size\t%u\n", params
->page_size
);
92 seq_printf(s
, "address nbytes\t%u\n", nor
->addr_nbytes
);
94 seq_puts(s
, "flags\t\t");
95 spi_nor_print_flags(s
, nor
->flags
, snor_f_names
, sizeof(snor_f_names
));
98 seq_puts(s
, "\nopcodes\n");
99 seq_printf(s
, " read\t\t0x%02x\n", nor
->read_opcode
);
100 seq_printf(s
, " dummy cycles\t%u\n", nor
->read_dummy
);
101 seq_printf(s
, " erase\t\t0x%02x\n", nor
->erase_opcode
);
102 seq_printf(s
, " program\t0x%02x\n", nor
->program_opcode
);
104 switch (nor
->cmd_ext_type
) {
105 case SPI_NOR_EXT_NONE
:
108 case SPI_NOR_EXT_REPEAT
:
111 case SPI_NOR_EXT_INVERT
:
118 seq_printf(s
, " 8D extension\t%s\n", str
);
120 seq_puts(s
, "\nprotocols\n");
121 seq_printf(s
, " read\t\t%s\n",
122 spi_nor_protocol_name(nor
->read_proto
));
123 seq_printf(s
, " write\t\t%s\n",
124 spi_nor_protocol_name(nor
->write_proto
));
125 seq_printf(s
, " register\t%s\n",
126 spi_nor_protocol_name(nor
->reg_proto
));
128 seq_puts(s
, "\nerase commands\n");
129 for (i
= 0; i
< SNOR_ERASE_TYPE_MAX
; i
++) {
130 struct spi_nor_erase_type
*et
= &erase_map
->erase_type
[i
];
133 string_get_size(et
->size
, 1, STRING_UNITS_2
, buf
,
135 seq_printf(s
, " %02x (%s) [%d]\n", et
->opcode
, buf
, i
);
139 if (!(nor
->flags
& SNOR_F_NO_OP_CHIP_ERASE
)) {
140 string_get_size(params
->size
, 1, STRING_UNITS_2
, buf
, sizeof(buf
));
141 seq_printf(s
, " %02x (%s)\n", nor
->params
->die_erase_opcode
, buf
);
144 seq_puts(s
, "\nsector map\n");
145 seq_puts(s
, " region (in hex) | erase mask | overlaid\n");
146 seq_puts(s
, " ------------------+------------+----------\n");
147 for (i
= 0; i
< erase_map
->n_regions
; i
++) {
148 u64 start
= region
[i
].offset
;
149 u64 end
= start
+ region
[i
].size
- 1;
150 u8 erase_mask
= region
[i
].erase_mask
;
152 seq_printf(s
, " %08llx-%08llx | [%c%c%c%c] | %s\n",
154 erase_mask
& BIT(0) ? '0' : ' ',
155 erase_mask
& BIT(1) ? '1' : ' ',
156 erase_mask
& BIT(2) ? '2' : ' ',
157 erase_mask
& BIT(3) ? '3' : ' ',
158 region
[i
].overlaid
? "yes" : "no");
163 DEFINE_SHOW_ATTRIBUTE(spi_nor_params
);
165 static void spi_nor_print_read_cmd(struct seq_file
*s
, u32 cap
,
166 struct spi_nor_read_command
*cmd
)
168 seq_printf(s
, " %s%s\n", spi_nor_protocol_name(cmd
->proto
),
169 cap
== SNOR_HWCAPS_READ_FAST
? " (fast read)" : "");
170 seq_printf(s
, " opcode\t0x%02x\n", cmd
->opcode
);
171 seq_printf(s
, " mode cycles\t%u\n", cmd
->num_mode_clocks
);
172 seq_printf(s
, " dummy cycles\t%u\n", cmd
->num_wait_states
);
175 static void spi_nor_print_pp_cmd(struct seq_file
*s
,
176 struct spi_nor_pp_command
*cmd
)
178 seq_printf(s
, " %s\n", spi_nor_protocol_name(cmd
->proto
));
179 seq_printf(s
, " opcode\t0x%02x\n", cmd
->opcode
);
182 static int spi_nor_capabilities_show(struct seq_file
*s
, void *data
)
184 struct spi_nor
*nor
= s
->private;
185 struct spi_nor_flash_parameter
*params
= nor
->params
;
186 u32 hwcaps
= params
->hwcaps
.mask
;
189 seq_puts(s
, "Supported read modes by the flash\n");
190 for (i
= 0; i
< sizeof(hwcaps
) * BITS_PER_BYTE
; i
++) {
191 if (!(hwcaps
& BIT(i
)))
194 cmd
= spi_nor_hwcaps_read2cmd(BIT(i
));
198 spi_nor_print_read_cmd(s
, BIT(i
), ¶ms
->reads
[cmd
]);
202 seq_puts(s
, "\nSupported page program modes by the flash\n");
203 for (i
= 0; i
< sizeof(hwcaps
) * BITS_PER_BYTE
; i
++) {
204 if (!(hwcaps
& BIT(i
)))
207 cmd
= spi_nor_hwcaps_pp2cmd(BIT(i
));
211 spi_nor_print_pp_cmd(s
, ¶ms
->page_programs
[cmd
]);
216 seq_printf(s
, "\nunknown hwcaps 0x%x\n", hwcaps
);
220 DEFINE_SHOW_ATTRIBUTE(spi_nor_capabilities
);
222 static void spi_nor_debugfs_unregister(void *data
)
224 struct spi_nor
*nor
= data
;
226 debugfs_remove(nor
->debugfs_root
);
227 nor
->debugfs_root
= NULL
;
230 static struct dentry
*rootdir
;
232 void spi_nor_debugfs_register(struct spi_nor
*nor
)
238 rootdir
= debugfs_create_dir(SPI_NOR_DEBUGFS_ROOT
, NULL
);
240 ret
= devm_add_action(nor
->dev
, spi_nor_debugfs_unregister
, nor
);
244 d
= debugfs_create_dir(dev_name(nor
->dev
), rootdir
);
245 nor
->debugfs_root
= d
;
247 debugfs_create_file("params", 0444, d
, nor
, &spi_nor_params_fops
);
248 debugfs_create_file("capabilities", 0444, d
, nor
,
249 &spi_nor_capabilities_fops
);
252 void spi_nor_debugfs_shutdown(void)
254 debugfs_remove(rootdir
);