From: Ansuel Smith <ansuelsmth@gmail.com> Date: 2021-02-16 21:27:44
The mtd support for the nvmem api has been stalled from 2018 with a patch
half pushed hoping that a scheme is found for the mtd name later. This
patchset try to address this.
The solution is simple.
New partitions scheme should always have the partitions {} structure and
declare subnodes as partitions is deprecated and should not be used anymore.
Fixed-partitions parser is changed to parse direct subnode as partitions
only if the appropriate compatible is used. This change make possible
the use of nvmem-partitions compatible and the entire partition node can
be parsed by the nvmem of framework.
The current code register the partition to the nvmem framework every time
but skip actually of_node parting. The new nvmem-partitions compatible is
used to enable of_node parsing on the desired partitions.
Ansuel Smith (3):
mtd: partitions: ofpart: skip subnodes parse with compatible
mtd: core: add nvmem-partitions compatible to parse mtd as nvmem cells
dt-bindings: mtd: Document use of nvmem-partitions compatible
.../mtd/partitions/nvmem-partitions.yaml | 105 ++++++++++++++++++
drivers/mtd/mtdcore.c | 3 +-
drivers/mtd/parsers/ofpart.c | 5 +
3 files changed, 112 insertions(+), 1 deletion(-)
create mode 100644 Documentation/devicetree/bindings/mtd/partitions/nvmem-partitions.yaml
--
2.30.0
From: Ansuel Smith <ansuelsmth@gmail.com> Date: 2021-02-16 21:28:17
If a partitions structure is not used, parse direct subnodes as
fixed-partitions only if a compatible is not found or is of type
fixed-partition. A parser can be used directly on the subnode and
subnodes should not be parsed as fixed-partitions by default.
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
---
drivers/mtd/parsers/ofpart.c | 5 +++++
1 file changed, 5 insertions(+)
@@ -50,6 +50,11 @@ static int parse_fixed_partitions(struct mtd_info *master,master->name,mtd_node);ofpart_node=mtd_node;dedicated=false;++/* Skip parsing direct subnodes if a compatible is found and is not fixed-partitions */+if(node_has_compatible(ofpart_node)&&+!of_device_is_compatible(ofpart_node,"fixed-partitions"))+return0;}elseif(!of_device_is_compatible(ofpart_node,"fixed-partitions")){/* The 'partitions' subnode might be used by another parser */return0;
From: Ansuel Smith <ansuelsmth@gmail.com> Date: 2021-02-16 21:28:17
Partitions that contains the nvmem-partitions compatible will register
their direct subonodes as nvmem cells and the node will be treated as a
nvmem provider.
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
---
drivers/mtd/mtdcore.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
From: Ansuel Smith <ansuelsmth@gmail.com> Date: 2021-03-02 20:09:44
On Tue, Mar 02, 2021 at 05:53:54PM +0100, Rafał Miłecki wrote:
On 16.02.2021 22:26, Ansuel Smith wrote:
quoted
If a partitions structure is not used, parse direct subnodes as
fixed-partitions only if a compatible is not found or is of type
fixed-partition. A parser can be used directly on the subnode and
subnodes should not be parsed as fixed-partitions by default.
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
---
drivers/mtd/parsers/ofpart.c | 5 +++++
1 file changed, 5 insertions(+)
@@ -50,6 +50,11 @@ static int parse_fixed_partitions(struct mtd_info *master,master->name,mtd_node);ofpart_node=mtd_node;dedicated=false;++/* Skip parsing direct subnodes if a compatible is found and is not fixed-partitions */+if(node_has_compatible(ofpart_node)&&+!of_device_is_compatible(ofpart_node,"fixed-partitions"))+return0;}elseif(!of_device_is_compatible(ofpart_node,"fixed-partitions")){/* The 'partitions' subnode might be used by another parser */return0;
I admit I'm not familiar with the old binding, so let me know if my
understanding is incorrect.
It seems to me however that your change will break parsing in cases
like:
spi-flash@0 {
compatible = "jedec,spi-nor";
reg = <0x0>;
partition@0 {
label = "bootloader";
reg = <0x0 0x100000>;
};
};
nandcs@0 {
compatible = "brcm,nandcs";
reg = <0>;
partition@0 {
label = "bootloader";
reg = <0x0000000 0x10000>;
};
};
Did we ever use "fixed-partitions" without partitions { } subnode?
Hi, very good point. You are right and I didin't think about this case.
I don't want to assume false statement, but since the ofpart parser and
the partitions structure should have been pushed at the same time, there
shouldn't be any use of "fixed-partitions" without partitions { }
subnodes. With this assumtion, the current implementation looks to be the
cleanest way to skip parsing. (if the parsing is dubious, don't parse at
all... The idea was that)
The hacky and IMHO dirty way to solve this is add a bool to directly
skip the subnode parsing and check for that. Something like
"no-fixed-partition" that would disable the ofnode parser with no
partitions { } subnode would accomplish the same result of this patch
and keep compatibility with nodes scheme you pointed out.
If a partitions structure is not used, parse direct subnodes as
fixed-partitions only if a compatible is not found or is of type
fixed-partition. A parser can be used directly on the subnode and
subnodes should not be parsed as fixed-partitions by default.
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
---
drivers/mtd/parsers/ofpart.c | 5 +++++
1 file changed, 5 insertions(+)
@@ -50,6 +50,11 @@ static int parse_fixed_partitions(struct mtd_info *master,master->name,mtd_node);ofpart_node=mtd_node;dedicated=false;++/* Skip parsing direct subnodes if a compatible is found and is not fixed-partitions */+if(node_has_compatible(ofpart_node)&&+!of_device_is_compatible(ofpart_node,"fixed-partitions"))+return0;}elseif(!of_device_is_compatible(ofpart_node,"fixed-partitions")){/* The 'partitions' subnode might be used by another parser */return0;
I admit I'm not familiar with the old binding, so let me know if my
understanding is incorrect.
It seems to me however that your change will break parsing in cases
like:
spi-flash@0 {
compatible = "jedec,spi-nor";
reg = <0x0>;
partition@0 {
label = "bootloader";
reg = <0x0 0x100000>;
};
};
nandcs@0 {
compatible = "brcm,nandcs";
reg = <0>;
partition@0 {
label = "bootloader";
reg = <0x0000000 0x10000>;
};
};
Did we ever use "fixed-partitions" without partitions { } subnode?
Partitions that contains the nvmem-partitions compatible will register
their direct subonodes as nvmem cells and the node will be treated as a
nvmem provider.
Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com>
Tested-by: Rafał Miłecki <rafal@milecki.pl>
I applied this patch on top of the:
[PATCH] mtd: parsers: ofpart: limit parsing of deprecated DT syntax
I succesfully used NVMEM cell defined in bootloader mtd partition for
reading device MAC address.
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
partition@0 {
compatible = "nvmem-partitions";
label = "bootloader";
reg = <0x0 0x100000>;
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0x0 0x100000>;
base_mac_addr: mac@106a0 {
reg = <0x106a0 0x6>;
};
};
}
[Rob: please advise]
On 16.02.2021 22:26, Ansuel Smith wrote:
Document nvmem-partitions compatible used to treat mtd partitions as a
nvmem provider.
Until now we were using "compatible" string in partition node only for
parsers (looking for subpartitions). We need to think if this change can
break anything from DT / Linux perspective.
Compatible strings should be unique, so there is no risk of conflict
between NVMEM and parsers.
Now: can we ever need mtd partition to:
1. Contain subpartitions
2. Provide NVMEM
at the same time?
Let's say:
partition@0 {
compatible = "vendor,dynamic-firmware-partitions", "nvmem-partitions";
label = "firmware";
reg = <0x0 0x100000>;
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0x0 0x100000>;
firmware-version@10 {
reg = <0x10 0x4>;
};
firmware-date@10 {
reg = <0x20 0x4>;
};
};
Is that allowed to respect both "compatible" strings and have:
1. Linux parser parse "firmware" for subpartitions
2. Linux MTD register "firmware" as NVMEM device
?
If not, what other options do we have? Is that allowed to have a
dangling MTD NVMEM node with phandle to MTD partition?
firmware: partition@0 {
compatible = "vendor,dynamic-firmware-partitions";
label = "firmware";
reg = <0x0 0x100000>;
};
(...)
firmware-version@10 {
compatible = "mtd-nvmem";
reg = <0x10 0x4>;
mtd = <&firmware>;
};
firmware-date@10 {
compatible = "mtd-nvmem";
reg = <0x20 0x4>;
mtd = <&firmware>;
};
Rob: I'd really appreciate your input & help here.
From: Rob Herring <robh@kernel.org> Date: 2021-03-05 22:23:43
On Wed, Mar 03, 2021 at 11:01:55AM +0100, Rafał Miłecki wrote:
[Rob: please advise]
On 16.02.2021 22:26, Ansuel Smith wrote:
quoted
Document nvmem-partitions compatible used to treat mtd partitions as a
nvmem provider.
Until now we were using "compatible" string in partition node only for
parsers (looking for subpartitions). We need to think if this change can
break anything from DT / Linux perspective.
Compatible strings should be unique, so there is no risk of conflict
between NVMEM and parsers.
Now: can we ever need mtd partition to:
1. Contain subpartitions
2. Provide NVMEM
at the same time?
Let's say:
partition@0 {
compatible = "vendor,dynamic-firmware-partitions", "nvmem-partitions";
I think you'd want the "vendor,dynamic-firmware-partitions" parser/code
to serve up any nvmem regions. Whether you have a fallback here depends
if an OS could make use of the regions knowing nothing about
"vendor,dynamic-firmware-partitions".
label = "firmware";
reg = <0x0 0x100000>;
#address-cells = <1>;
#size-cells = <1>;
ranges = <0 0x0 0x100000>;
firmware-version@10 {
reg = <0x10 0x4>;
};
firmware-date@10 {
reg = <0x20 0x4>;
};
};
Is that allowed to respect both "compatible" strings and have:
1. Linux parser parse "firmware" for subpartitions
2. Linux MTD register "firmware" as NVMEM device
?
If not, what other options do we have? Is that allowed to have a
dangling MTD NVMEM node with phandle to MTD partition?
firmware: partition@0 {
compatible = "vendor,dynamic-firmware-partitions";
label = "firmware";
reg = <0x0 0x100000>;
};
(...)
firmware-version@10 {
compatible = "mtd-nvmem";
reg = <0x10 0x4>;
mtd = <&firmware>;
};
firmware-date@10 {
compatible = "mtd-nvmem";
reg = <0x20 0x4>;
mtd = <&firmware>;
};
On Wed, Mar 03, 2021 at 11:01:55AM +0100, Rafał Miłecki wrote:
quoted
[Rob: please advise]
On 16.02.2021 22:26, Ansuel Smith wrote:
quoted
Document nvmem-partitions compatible used to treat mtd partitions as a
nvmem provider.
Until now we were using "compatible" string in partition node only for
parsers (looking for subpartitions). We need to think if this change can
break anything from DT / Linux perspective.
Compatible strings should be unique, so there is no risk of conflict
between NVMEM and parsers.
Now: can we ever need mtd partition to:
1. Contain subpartitions
2. Provide NVMEM
at the same time?
Let's say:
partition@0 {
compatible = "vendor,dynamic-firmware-partitions", "nvmem-partitions";
I think you'd want the "vendor,dynamic-firmware-partitions" parser/code
to serve up any nvmem regions. Whether you have a fallback here depends
if an OS could make use of the regions knowing nothing about
"vendor,dynamic-firmware-partitions".
Perfect! I didn't think that driver handling
"vendor,dynamic-firmware-partitions" may also take care of NVMEM.
Thank you.
Document nvmem-partitions compatible used to treat mtd partitions as a
nvmem provider.
I'm just wondering if "nvmem-partitions" is accurate enough. Partitions
bit sounds a bit ambiguous in the mtd context.
What do you think about "mtd-nvmem-cells" or just "nvmem-cells"?
From: Ansuel Smith <ansuelsmth@gmail.com> Date: 2021-03-08 12:14:50
On Mon, Mar 08, 2021 at 10:48:32AM +0100, Rafał Miłecki wrote:
On 16.02.2021 22:26, Ansuel Smith wrote:
quoted
Document nvmem-partitions compatible used to treat mtd partitions as a
nvmem provider.
I'm just wondering if "nvmem-partitions" is accurate enough. Partitions
bit sounds a bit ambiguous in the mtd context.
What do you think about "mtd-nvmem-cells" or just "nvmem-cells"?
I read somewhere that mtd is not so standard so "nvmem-cells" should be the
right compatible.
To sum up, with v2 I should change the compatible name and just push the
2 and 3 patch. (waiting your fix to be accepted) Correct?
On Mon, Mar 08, 2021 at 10:48:32AM +0100, Rafał Miłecki wrote:
quoted
On 16.02.2021 22:26, Ansuel Smith wrote:
quoted
Document nvmem-partitions compatible used to treat mtd partitions as a
nvmem provider.
I'm just wondering if "nvmem-partitions" is accurate enough. Partitions
bit sounds a bit ambiguous in the mtd context.
What do you think about "mtd-nvmem-cells" or just "nvmem-cells"?
I read somewhere that mtd is not so standard so "nvmem-cells" should be the
right compatible.
To sum up, with v2 I should change the compatible name and just push the
2 and 3 patch. (waiting your fix to be accepted) Correct?
On Mon, Mar 08, 2021 at 10:48:32AM +0100, Rafał Miłecki wrote:
quoted
On 16.02.2021 22:26, Ansuel Smith wrote:
quoted
Document nvmem-partitions compatible used to treat mtd partitions as a
nvmem provider.
I'm just wondering if "nvmem-partitions" is accurate enough. Partitions
bit sounds a bit ambiguous in the mtd context.
What do you think about "mtd-nvmem-cells" or just "nvmem-cells"?
I read somewhere that mtd is not so standard so "nvmem-cells" should be the
right compatible.
To sum up, with v2 I should change the compatible name and just push the
2 and 3 patch. (waiting your fix to be accepted) Correct?
I'm also quite sure you're fine to send V2 now, if you just let
maintainers know (e.g. in a comment below a --- tear line) that it
depends on the:
[PATCH] mtd: parsers: ofpart: limit parsing of deprecated DT syntax
In other words: you don't need to wait for my patch to get accepted.