Commit e20f378d authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Greg Kroah-Hartman

nvmem: include bit index in cell sysfs file name

Creating sysfs files for all Cells caused a boot failure for linux-6.8-rc1 on
Apple M1, which (in downstream dts files) has multiple nvmem cells that use the
same byte address. This causes the device probe to fail with

[    0.605336] sysfs: cannot create duplicate filename '/devices/platform/soc@200000000/2922bc000.efuse/apple_efuses_nvmem0/cells/efuse@a10'
[    0.605347] CPU: 7 PID: 1 Comm: swapper/0 Tainted: G S                 6.8.0-rc1-arnd-5+ #133
[    0.605355] Hardware name: Apple Mac Studio (M1 Ultra, 2022) (DT)
[    0.605362] Call trace:
[    0.605365]  show_stack+0x18/0x2c
[    0.605374]  dump_stack_lvl+0x60/0x80
[    0.605383]  dump_stack+0x18/0x24
[    0.605388]  sysfs_warn_dup+0x64/0x80
[    0.605395]  sysfs_add_bin_file_mode_ns+0xb0/0xd4
[    0.605402]  internal_create_group+0x268/0x404
[    0.605409]  sysfs_create_groups+0x38/0x94
[    0.605415]  devm_device_add_groups+0x50/0x94
[    0.605572]  nvmem_populate_sysfs_cells+0x180/0x1b0
[    0.605682]  nvmem_register+0x38c/0x470
[    0.605789]  devm_nvmem_register+0x1c/0x6c
[    0.605895]  apple_efuses_probe+0xe4/0x120
[    0.606000]  platform_probe+0xa8/0xd0

As far as I can tell, this is a problem for any device with multiple cells on
different bits of the same address. Avoid the issue by changing the file name
to include the first bit number.

Fixes: 0331c611 ("nvmem: core: Expose cells through sysfs")
Link: https://github.com/AsahiLinux/linux/blob/bd0a1a7d4/arch/arm64/boot/dts/apple/t600x-dieX.dtsi#L156
Cc:  <regressions@lists.linux.dev>
Cc: Miquel Raynal <miquel.raynal@bootlin.com>
Cc: Rafał Miłecki <rafal@milecki.pl>
Cc: Chen-Yu Tsai <wenst@chromium.org>
Cc: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc:  <asahi@lists.linux.dev>
Cc: Sven Peter <sven@svenpeter.dev>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Reviewed-by: default avatarEric Curtin <ecurtin@redhat.com>
Reviewed-by: default avatarMiquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/r/20240209163454.98051-1-srinivas.kandagatla@linaro.orgSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 23d62fb5
...@@ -4,18 +4,18 @@ KernelVersion: 6.5 ...@@ -4,18 +4,18 @@ KernelVersion: 6.5
Contact: Miquel Raynal <miquel.raynal@bootlin.com> Contact: Miquel Raynal <miquel.raynal@bootlin.com>
Description: Description:
The "cells" folder contains one file per cell exposed by the The "cells" folder contains one file per cell exposed by the
NVMEM device. The name of the file is: <name>@<where>, with NVMEM device. The name of the file is: "<name>@<byte>,<bit>",
<name> being the cell name and <where> its location in the NVMEM with <name> being the cell name and <where> its location in
device, in hexadecimal (without the '0x' prefix, to mimic device the NVMEM device, in hexadecimal bytes and bits (without the
tree node names). The length of the file is the size of the cell '0x' prefix, to mimic device tree node names). The length of
(when known). The content of the file is the binary content of the file is the size of the cell (when known). The content of
the cell (may sometimes be ASCII, likely without trailing the file is the binary content of the cell (may sometimes be
character). ASCII, likely without trailing character).
Note: This file is only present if CONFIG_NVMEM_SYSFS Note: This file is only present if CONFIG_NVMEM_SYSFS
is enabled. is enabled.
Example:: Example::
hexdump -C /sys/bus/nvmem/devices/1-00563/cells/product-name@d hexdump -C /sys/bus/nvmem/devices/1-00563/cells/product-name@d,0
00000000 54 4e 34 38 4d 2d 50 2d 44 4e |TN48M-P-DN| 00000000 54 4e 34 38 4d 2d 50 2d 44 4e |TN48M-P-DN|
0000000a 0000000a
...@@ -460,8 +460,9 @@ static int nvmem_populate_sysfs_cells(struct nvmem_device *nvmem) ...@@ -460,8 +460,9 @@ static int nvmem_populate_sysfs_cells(struct nvmem_device *nvmem)
list_for_each_entry(entry, &nvmem->cells, node) { list_for_each_entry(entry, &nvmem->cells, node) {
sysfs_bin_attr_init(&attrs[i]); sysfs_bin_attr_init(&attrs[i]);
attrs[i].attr.name = devm_kasprintf(&nvmem->dev, GFP_KERNEL, attrs[i].attr.name = devm_kasprintf(&nvmem->dev, GFP_KERNEL,
"%s@%x", entry->name, "%s@%x,%x", entry->name,
entry->offset); entry->offset,
entry->bit_offset);
attrs[i].attr.mode = 0444; attrs[i].attr.mode = 0444;
attrs[i].size = entry->bytes; attrs[i].size = entry->bytes;
attrs[i].read = &nvmem_cell_attr_read; attrs[i].read = &nvmem_cell_attr_read;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment