device property: Add fwnode_property_get_reference_optional_args
Subsystems (4)
cover device property: Add fwnode_property_get_reference_optional_args
This series adds a fwnode-equivalent to of_parse_phandle_with_optional_args.
Sean Anderson (2):
device property: Add optional nargs_prop for get_reference_args device property: Add fwnode_property_get_reference_optional_args
drivers/base/property.c | 50 ++++++++++++++++++++++++++++++++++++++-- drivers/base/swnode.c | 13 +++++++---- drivers/of/property.c | 10 +++----- include/linux/fwnode.h | 2 +- include/linux/property.h | 4 ++++ 5 files changed, 65 insertions(+), 14 deletions(-)
Signature · 1 line
2.35.1.1320.gc452695387.dirty
PATCH 1/2 device property: Add optional nargs_prop for get_reference_args
get_reference_args does not permit falling back to nargs when nargs_prop is missing. This makes it difficult to support older devicetrees where nargs_prop may not be present. Add support for this by converting nargs to a signed value. Where before nargs was ignored if nargs_prop was passed, now nargs is only ignored if it is strictly negative. When it is positive, nargs represents the fallback cells to use if nargs_prop is absent.
---
drivers/base/property.c | 4 ++-- drivers/base/swnode.c | 13 +++++++++---- drivers/of/property.c | 10 +++------- include/linux/fwnode.h | 2 +- 4 files changed, 15 insertions(+), 14 deletions(-)
drivers/base/property.c +2 -2
@@ -606,7 +606,7 @@ int fwnode_property_get_reference_args(const struct fwnode_handle *fwnode,return -ENOENT ; ret =fwnode_call_int_op (fwnode, get_reference_args, prop, nargs_prop, - nargs, index, args); + nargs_prop ?-1 : nargs, index, args);if (ret ==0 )return ret;
@@ -614,7 +614,7 @@ int fwnode_property_get_reference_args(const struct fwnode_handle *fwnode,return ret;return fwnode_call_int_op (fwnode->secondary, get_reference_args, prop, nargs_prop, - nargs, index, args); + nargs_prop ?-1 : nargs, index, args); }EXPORT_SYMBOL_GPL (fwnode_property_get_reference_args);
drivers/base/swnode.c +9 -4
@@ -503,7 +503,7 @@ software_node_get_named_child_node(const struct fwnode_handle *fwnode,static int software_node_get_reference_args (const struct fwnode_handle *fwnode,const char *propname,const char *nargs_prop, -unsigned int nargs,unsigned int index, +int nargs,unsigned int index,struct fwnode_reference_args *args) {struct swnode *swnode =to_swnode (fwnode);
@@ -543,10 +543,15 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode, error =property_entry_read_int_array (ref->node->properties, nargs_prop,sizeof (u32), &nargs_prop_val,1 ); -if (error) + +if (error == -EINVAL ) { +if (nargs <0 ) +return error; + }else if (error) {return error; - - nargs = nargs_prop_val; + }else { + nargs = nargs_prop_val; + } }if (nargs >NR_FWNODE_REFERENCE_ARGS )
drivers/of/property.c +3 -7
@@ -1116,19 +1116,15 @@ of_fwnode_get_named_child_node(const struct fwnode_handle *fwnode,static int of_fwnode_get_reference_args (const struct fwnode_handle *fwnode,const char *prop,const char *nargs_prop, -unsigned int nargs,unsigned int index, +int nargs,unsigned int index,struct fwnode_reference_args *args) {struct of_phandle_args of_args;unsigned int i;int ret; -if (nargs_prop) - ret =of_parse_phandle_with_args (to_of_node (fwnode), prop, - nargs_prop, index, &of_args); -else - ret =of_parse_phandle_with_fixed_args (to_of_node (fwnode), prop, - nargs, index, &of_args); + ret =__of_parse_phandle_with_args (to_of_node (fwnode), prop, nargs_prop, + nargs, index, &of_args);if (ret <0 )return ret;if (!args) {
include/linux/fwnode.h +1 -1
@@ -163,7 +163,7 @@ struct fwnode_operations { const char *name);int (*get_reference_args)(const struct fwnode_handle *fwnode,const char *prop,const char *nargs_prop, -unsigned int nargs,unsigned int index, +int nargs,unsigned int index,struct fwnode_reference_args *args);struct fwnode_handle * (*graph_get_next_endpoint)(const struct fwnode_handle *fwnode,
Signature · 1 line
2.35.1.1320.gc452695387.dirty
Andy Shevchenko
reviewerRe: [PATCH 1/2] device property: Add optional nargs_prop for get_reference_args
Quoted 7 lines · Sean Anderson
get_reference_argsdoes not permit falling back to nargs whennargs_propis missing. This makes it difficult to support older devicetrees wherenargs_propmay not be present. Add support for this by converting nargs to a signed value. Where before nargs was ignored ifnargs_propwas passed, now nargs is only ignored if it is strictly negative. When it is positive, nargs represents the fallback cells to use ifnargs_propis absent.
And what is the case to support old DTs on most likely outdated hardware?
...
drivers/base/property.c int fwnode_property_get_reference_args(const struct fwnode_handle *fwnode,
Quoted 7 lines
drivers/base/property.c +2
-2ret =fwnode_call_int_op (fwnode, get_reference_args, prop, nargs_prop, - nargs, index, args); + nargs_prop ?-1 : nargs, index, args);return fwnode_call_int_op (fwnode->secondary, get_reference_args, prop, nargs_prop, - nargs, index, args); + nargs_prop ?-1 : nargs, index, args);
I don't understand why it's needed here. The nargs_prop is passed to the callee.
...
Review
Quoted 2 lines
(quoted diff) +1
-1- unsigned int nargs, unsigned int index, + int nargs, unsigned int index,
As per above.
...
drivers/base/swnode.c software_node_get_reference_args(const struct fwnode_handle *fwnode,
Quoted 6 lines
drivers/base/swnode.c +1
-1error =property_entry_read_int_array (ref->node->properties, nargs_prop,sizeof (u32), &nargs_prop_val,1 ); -if (error) +
Stray blank line.
drivers/base/swnode.c software_node_get_reference_args(const struct fwnode_handle *fwnode, · line 547
Quoted 1 line
drivers/base/swnode.c +1
-0+if (error == -EINVAL ) {
Why do we need an explicit error code check? This is fragile. Just check the parameter before calling the above.
Quoted 9 lines
drivers/base/swnode.c +6
-2+if (nargs <0 ) +return error; + }else if (error) {return error; - - nargs = nargs_prop_val; + }else { + nargs = nargs_prop_val; + }
...
drivers/of/property.c of_fwnode_get_named_child_node(const struct fwnode_handle *fwnode, · line 1120
Quoted 5 lines
of_fwnode_get_reference_args(const struct
fwnode_handle*fwnode,drivers/of/property.c +1
-1const char *prop, const char *nargs_prop, - unsigned int nargs, unsigned int index, + int nargs, unsigned int index, struct fwnode_reference_args *args)
Same comments as per above.
Signature · 2 lines
With Best Regards, Andy Shevchenko
Rob Herring
maintainerRe: [PATCH 1/2] device property: Add optional nargs_prop for get_reference_args
Quoted 11 lines · Andy Shevchenko
Quoted 7 lines · Sean Anderson
get_reference_argsdoes not permit falling back to nargs whennargs_propis missing. This makes it difficult to support older devicetrees wherenargs_propmay not be present. Add support for this by converting nargs to a signed value. Where before nargs was ignored ifnargs_propwas passed, now nargs is only ignored if it is strictly negative. When it is positive, nargs represents the fallback cells to use ifnargs_propis absent.And what is the case to support old DTs on most likely outdated hardware?
People still care when I break 1990s PowerMacs...
It's more that some bindings (like MSI) start out without #foo-cells, and then we end up adding arg cells later. So we have to support no #foo-cells means 0.
Rob
Sakari Ailus
reviewerRe: [PATCH 1/2] device property: Add optional nargs_prop for get_reference_args
In reply to Sean AndersonHi Sean,
Quoted 7 lines · Sean Anderson
get_reference_argsdoes not permit falling back to nargs whennargs_propis missing. This makes it difficult to support older devicetrees wherenargs_propmay not be present. Add support for this by converting nargs to a signed value. Where before nargs was ignored ifnargs_propwas passed, now nargs is only ignored if it is strictly negative. When it is positive, nargs represents the fallback cells to use ifnargs_propis absent.
If you don't know either the argument count or have a property that tells it, there's no way to differentiate phandles from arguments. I'd say such DTS are broken. Where do they exist?
At the very least this needs to be documented as a workaround and moved to the OF framework. I wouldn't add such a workaround to swnodes either, the bugs should be fixed instead.
Quoted 104 lines
Signed-off-by Sean Anderson <[email protected]>---
drivers/base/property.c | 4 ++-- drivers/base/swnode.c | 13 +++++++++---- drivers/of/property.c | 10 +++------- include/linux/fwnode.h | 2 +- 4 files changed, 15 insertions(+), 14 deletions(-)drivers/base/property.c +2
-2@@ -606,7 +606,7 @@ int fwnode_property_get_reference_args(const struct fwnode_handle *fwnode,return -ENOENT ; ret =fwnode_call_int_op (fwnode, get_reference_args, prop, nargs_prop, - nargs, index, args); + nargs_prop ?-1 : nargs, index, args);if (ret ==0 )return ret;@@ -614,7 +614,7 @@ int fwnode_property_get_reference_args(const struct fwnode_handle *fwnode,return ret;return fwnode_call_int_op (fwnode->secondary, get_reference_args, prop, nargs_prop, - nargs, index, args); + nargs_prop ?-1 : nargs, index, args); }EXPORT_SYMBOL_GPL (fwnode_property_get_reference_args);drivers/base/swnode.c +9
-4@@ -503,7 +503,7 @@ software_node_get_named_child_node(const struct fwnode_handle *fwnode,static int software_node_get_reference_args (const struct fwnode_handle *fwnode,const char *propname,const char *nargs_prop, -unsigned int nargs,unsigned int index, +int nargs,unsigned int index,struct fwnode_reference_args *args) {struct swnode *swnode =to_swnode (fwnode);@@ -543,10 +543,15 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode, error =property_entry_read_int_array (ref->node->properties, nargs_prop,sizeof (u32), &nargs_prop_val,1 ); -if (error) + +if (error == -EINVAL ) { +if (nargs <0 ) +return error; + }else if (error) {return error; - - nargs = nargs_prop_val; + }else { + nargs = nargs_prop_val; + } }if (nargs >NR_FWNODE_REFERENCE_ARGS )drivers/of/property.c +3
-7@@ -1116,19 +1116,15 @@ of_fwnode_get_named_child_node(const struct fwnode_handle *fwnode,static int of_fwnode_get_reference_args (const struct fwnode_handle *fwnode,const char *prop,const char *nargs_prop, -unsigned int nargs,unsigned int index, +int nargs,unsigned int index,struct fwnode_reference_args *args) {struct of_phandle_args of_args;unsigned int i;int ret; -if (nargs_prop) - ret =of_parse_phandle_with_args (to_of_node (fwnode), prop, - nargs_prop, index, &of_args); -else - ret =of_parse_phandle_with_fixed_args (to_of_node (fwnode), prop, - nargs, index, &of_args); + ret =__of_parse_phandle_with_args (to_of_node (fwnode), prop, nargs_prop, + nargs, index, &of_args);if (ret <0 )return ret;if (!args) {include/linux/fwnode.h +1
-1@@ -163,7 +163,7 @@ struct fwnode_operations { const char *name);int (*get_reference_args)(const struct fwnode_handle *fwnode,const char *prop,const char *nargs_prop, -unsigned int nargs,unsigned int index, +int nargs,unsigned int index,struct fwnode_reference_args *args);struct fwnode_handle * (*graph_get_next_endpoint)(const struct fwnode_handle *fwnode,
Signature · 3 lines
Regards, Sakari Ailus
Rob Herring
maintainerRe: [PATCH 1/2] device property: Add optional nargs_prop for get_reference_args
Quoted 12 lines · Sakari Ailus
Hi Sean,
Quoted 7 lines · Sean Anderson
get_reference_argsdoes not permit falling back to nargs whennargs_propis missing. This makes it difficult to support older devicetrees wherenargs_propmay not be present. Add support for this by converting nargs to a signed value. Where before nargs was ignored ifnargs_propwas passed, now nargs is only ignored if it is strictly negative. When it is positive, nargs represents the fallback cells to use ifnargs_propis absent.
Quoted 3 lines
If you don't know either the argument count or have a property that tells it, there's no way to differentiate phandles from arguments. I'd say such DTS are broken. Where do they exist?
#msi-cells for one is optional because we added it after the initial bindings and missing means 0.
Quoted 3 lines
At the very least this needs to be documented as a workaround and moved to the OF framework. I wouldn't add such a workaround to swnodes either, the bugs should be fixed instead.
The DT API supports this already.
Rob
PATCH 2/2 device property: Add fwnode_property_get_reference_optional_args
In reply to Sean AndersonAdd a fwnode variant of of_parse_phandle_with_optional_args to allow nargs_prop to be absent from the referenced node. This improves compatibility for references where the devicetree might not always have nargs_prop.
---
drivers/base/property.c | 46 ++++++++++++++++++++++++++++++++++++++++ include/linux/property.h | 4 ++++ 2 files changed, 50 insertions(+)
drivers/base/property.c +46 -0
@@ -618,6 +618,52 @@ int fwnode_property_get_reference_args(const struct fwnode_handle *fwnode, }EXPORT_SYMBOL_GPL (fwnode_property_get_reference_args); +/** +* fwnode_property_get_reference_optional_args() - Find a reference with optional arguments +* @fwnode: Firmware node where to look for the reference +* @prop: The name of the property +* @nargs_prop: The name of the property telling the number of +* arguments in the referred node. +* @index: Index of the reference, from zero onwards. +* @args: Result structure with reference and integer arguments. +* May be NULL. +* +* Obtain a reference based on a named property in an fwnode, with +* integer arguments. If @nargs_prop is absent from the referenced node, then +* number of arguments is be assumed to be 0. +* +* The caller is responsible for calling fwnode_handle_put() on the returned +* @args->fwnode pointer. +* +* Return: %0 on success +* %-ENOENT when the index is out of bounds, the index has an empty +* reference or the property was not found +* %-EINVAL on parse error +*/ +int fwnode_property_get_reference_optional_args (const struct fwnode_handle *fwnode, +const char *prop, +const char *nargs_prop, +unsigned int index, +struct fwnode_reference_args *args) +{ +int ret; + +if (IS_ERR_OR_NULL (fwnode)) +return -ENOENT ; + + ret =fwnode_call_int_op (fwnode, get_reference_args, prop, nargs_prop, +0 , index, args); +if (ret ==0 ) +return ret; + +if (IS_ERR_OR_NULL (fwnode->secondary)) +return ret; + +return fwnode_call_int_op (fwnode->secondary, get_reference_args, prop, nargs_prop, +0 , index, args); +} +EXPORT_SYMBOL_GPL (fwnode_property_get_reference_optional_args); +/** * fwnode_find_reference - Find named reference to a fwnode_handle * @fwnode: Firmware node where to look for the reference
include/linux/property.h +4 -0
@@ -139,6 +139,10 @@ int fwnode_property_get_reference_args(const struct fwnode_handle *fwnode, const char *prop, const char *nargs_prop, unsigned int nargs, unsigned int index, struct fwnode_reference_args *args); +int fwnode_property_get_reference_optional_args (const struct fwnode_handle *fwnode, +const char *prop,const char *nargs_prop, +unsigned int index, +struct fwnode_reference_args *args); struct fwnode_handle *fwnode_find_reference(const struct fwnode_handle *fwnode, const char *name,
Signature · 1 line
2.35.1.1320.gc452695387.dirty
Andy Shevchenko
reviewerQuoted 4 lines · Sean Anderson
Add a fwnode variant of
of_parse_phandle_with_optional_argsto allownargs_propto be absent from the referenced node. This improves compatibility for references where the devicetree might not always havenargs_prop.
...
Quoted 5 lines
+/**
+ *fwnode_property_get_reference_optional_args()- Find a reference with optional arguments
+ * @fwnode: Firmware node where to look for the reference
+ * @prop: The name of the property
+ * @nargs_prop: The name of the property telling the number of
Use space instead of TAB as it's already too long to make it aligned with the rest.
Quoted 17 lines
+ * arguments in the referred node.
+ * @index: Index of the reference, from zero onwards.
+ * @args: Result structure with reference and integer arguments.
+ * May be NULL.
+ *
+ * Obtain a reference based on a named property in an fwnode, with
+ * integer arguments. If @nargs_prop is absent from the referenced node, then
+ * number of arguments is be assumed to be 0.
+ *
+ * The caller is responsible for callingfwnode_handle_put()on the returned
+ * @args->fwnode pointer.
+ *
+ * Return: %0 on success
+ * %-ENOENT when the index is out of bounds, the index has an empty
+ * reference or the property was not found
+ * %-EINVAL on parse error
+ */
drivers/base/property.c int fwnode_property_get_reference_args(const struct fwnode_handle *fwnode, · line 652
Quoted 10 lines
drivers/base/property.c +9
-0+int fwnode_property_get_reference_optional_args (const struct fwnode_handle *fwnode, +const char *prop, +const char *nargs_prop, +unsigned int index, +struct fwnode_reference_args *args) +{ +int ret; +if (IS_ERR_OR_NULL (fwnode)) +return -ENOENT ;
This is incorrect most likely, see below.
drivers/base/property.c int fwnode_property_get_reference_args(const struct fwnode_handle *fwnode, · line 660
Quoted 7 lines
drivers/base/property.c +7
-0+ ret =fwnode_call_int_op (fwnode, get_reference_args, prop, nargs_prop, +0 , index, args); +if (ret ==0 ) +return ret; + +if (IS_ERR_OR_NULL (fwnode->secondary)) +return ret;
Here no such error code shadowing, and TBH I do not like the shadowing without real need.
Quoted 3 lines
drivers/base/property.c +3
-0+return fwnode_call_int_op (fwnode->secondary, get_reference_args, prop, nargs_prop, +0 , index, args); +}
Signature · 2 lines
With Best Regards, Andy Shevchenko
Quoted 47 lines · Andy Shevchenko
Quoted 4 lines · Sean Anderson
Add a fwnode variant of
of_parse_phandle_with_optional_argsto allownargs_propto be absent from the referenced node. This improves compatibility for references where the devicetree might not always havenargs_prop....
Quoted 5 lines
+/**
+ *fwnode_property_get_reference_optional_args()- Find a reference with optional arguments
+ * @fwnode: Firmware node where to look for the reference
+ * @prop: The name of the property
+ * @nargs_prop: The name of the property telling the number ofUse space instead of TAB as it's already too long to make it aligned with the rest.
Quoted 17 lines
+ * arguments in the referred node.
+ * @index: Index of the reference, from zero onwards.
+ * @args: Result structure with reference and integer arguments.
+ * May be NULL.
+ *
+ * Obtain a reference based on a named property in an fwnode, with
+ * integer arguments. If @nargs_prop is absent from the referenced node, then
+ * number of arguments is be assumed to be 0.
+ *
+ * The caller is responsible for callingfwnode_handle_put()on the returned
+ * @args->fwnode pointer.
+ *
+ * Return: %0 on success
+ * %-ENOENT when the index is out of bounds, the index has an empty
+ * reference or the property was not found
+ * %-EINVAL on parse error
+ */drivers/base/property.c int fwnode_property_get_reference_args(const struct fwnode_handle *fwnode, · line 652
Quoted 10 lines
drivers/base/property.c +9
-0+int fwnode_property_get_reference_optional_args (const struct fwnode_handle *fwnode, +const char *prop, +const char *nargs_prop, +unsigned int index, +struct fwnode_reference_args *args) +{ +int ret; +if (IS_ERR_OR_NULL (fwnode)) +return -ENOENT ;This is incorrect most likely, see below.
Quoted 10 lines
drivers/base/property.c int fwnode_property_get_reference_args(const struct fwnode_handle *fwnode, · line 660
Quoted 7 lines
drivers/base/property.c +7
-0+ ret =fwnode_call_int_op (fwnode, get_reference_args, prop, nargs_prop, +0 , index, args); +if (ret ==0 ) +return ret; + +if (IS_ERR_OR_NULL (fwnode->secondary)) +return ret;Here no such error code shadowing, and TBH I do not like the shadowing without real need.
I don't understand the objection. First, this logic is identical to fwnode_property_get_reference_args. Second, the process seems clear to me:
- If we have a primary fwnode, try it otherwise return -ENOENT
- If we have a secondary fwnode and the first failed, try it otherwise return the original error code
The purpose of a secondary fwnode is to allow supplying missing properties absent from the primary fwnode. Which part of the above do you dislike?
--Sean
Rob Herring
maintainerQuoted 5 lines · Sean Anderson
Add a fwnode variant of
of_parse_phandle_with_optional_argsto allownargs_propto be absent from the referenced node. This improves compatibility for references where the devicetree might not always havenargs_prop.
Can't we just make fwnode_property_get_reference_args() handle this case? Or why is it not just a 1 line wrapper function?
Quoted 9 lines · Rob Herring
Quoted 5 lines · Sean Anderson
Add a fwnode variant of
of_parse_phandle_with_optional_argsto allownargs_propto be absent from the referenced node. This improves compatibility for references where the devicetree might not always havenargs_prop.Can't we just make
fwnode_property_get_reference_args()handle this case? Or why is it not just a 1 line wrapper function?
fwnode_property_get_reference_args ignores nargs when nargs_prop is non-NULL. So all the existing callers just pass 0 to nargs. Rather than convert them, I chose to add another function with different defaults. There are only four callers that pass nargs_prop, so I could just as easily change the callers instead.
--Sean
Rob Herring
maintainerQuoted 9 lines · Sean Anderson
Quoted 7 lines · Rob Herring
Quoted 5 lines · Sean Anderson
Add a fwnode variant of
of_parse_phandle_with_optional_argsto allownargs_propto be absent from the referenced node. This improves compatibility for references where the devicetree might not always havenargs_prop.
Quoted 8 lines
Quoted 2 lines
Can't we just make
fwnode_property_get_reference_args()handle this case? Or why is it not just a 1 line wrapper function?
fwnode_property_get_reference_argsignores nargs whennargs_propis non-NULL. So all the existing callers just pass 0 to nargs. Rather than convert them, I chose to add another function with different defaults. There are only four callers that passnargs_prop, so I could just as easily change the callers instead.
Why do you have to change the callers? nargs value won't matter because they obviously have nargs_prop present or they would not have worked in the first place. If behavior changes because there's an error in their DT, who cares. That's their problem for not validating the DT.
Rob
Quoted 19 lines · Rob Herring
Quoted 9 lines · Sean Anderson
Quoted 7 lines · Rob Herring
Quoted 5 lines · Sean Anderson
Add a fwnode variant of
of_parse_phandle_with_optional_argsto allownargs_propto be absent from the referenced node. This improves compatibility for references where the devicetree might not always havenargs_prop.Quoted 8 lines
Quoted 2 lines
Can't we just make
fwnode_property_get_reference_args()handle this case? Or why is it not just a 1 line wrapper function?
fwnode_property_get_reference_argsignores nargs whennargs_propis non-NULL. So all the existing callers just pass 0 to nargs. Rather than convert them, I chose to add another function with different defaults. There are only four callers that passnargs_prop, so I could just as easily change the callers instead.
Quoted 5 lines
Why do you have to change the callers? nargs value won't matter because they obviously have
nargs_proppresent or they would not have worked in the first place. If behavior changes because there's an error in their DT, who cares. That's their problem for not validating the DT.
Because the change would be to make nargs matter even when nargs_prop is present. For the sake of example, consider something like
foo: foo {
#my-cells = <1>;
};
bar: bar {
};
baz {
my-prop = <&bar>, <&foo 5>, ;
my-prop-names = "bar", "foo";
};Before we would have
fwnode_property_get_reference_args(baz, "my-prop", NULL, 0, "bar", args) <bar> fwnode_property_get_reference_args(baz, "my-prop", NULL, 0, "foo", args) <foo> fwnode_property_get_reference_args(baz, "my-prop", "#my-cells", -1, "bar", args) ERROR fwnode_property_get_reference_args(baz, "my-prop", "#my-cells", -1, "foo", args) ERROR fwnode_property_get_reference_args(baz, "my-prop", "#my-cells", 0, "bar", args) ERROR fwnode_property_get_reference_args(baz, "my-prop", "#my-cells", 0, "foo", args) ERROR
and after we would have
fwnode_property_get_reference_args(baz, "my-prop", NULL, 0, "bar", args) <bar> fwnode_property_get_reference_args(baz, "my-prop", NULL, 0, "foo", args) <foo> fwnode_property_get_reference_args(baz, "my-prop", "#my-cells", -1, "bar", args) ERROR fwnode_property_get_reference_args(baz, "my-prop", "#my-cells", -1, "foo", args) ERROR fwnode_property_get_reference_args(baz, "my-prop", "#my-cells", 0, "bar", args) <bar> fwnode_property_get_reference_args(baz, "my-prop", "#my-cells", 0, "foo", args) <foo 5>
The problem is that all existing callers pass nargs=0 when nargs_prop="#my-cells" so they will get the new behavior even when they shouldn't. So if we change the behavior we have to change the callers too. If we make a new function with new behavior the callers stay the same.
--Sean
Rob Herring
maintainerQuoted 60 lines · Sean Anderson
Quoted 19 lines · Rob Herring
Quoted 9 lines · Sean Anderson
Quoted 7 lines · Rob Herring
Quoted 5 lines · Sean Anderson
Add a fwnode variant of
of_parse_phandle_with_optional_argsto allownargs_propto be absent from the referenced node. This improves compatibility for references where the devicetree might not always havenargs_prop.Quoted 8 lines
Quoted 2 lines
Can't we just make
fwnode_property_get_reference_args()handle this case? Or why is it not just a 1 line wrapper function?
fwnode_property_get_reference_argsignores nargs whennargs_propis non-NULL. So all the existing callers just pass 0 to nargs. Rather than convert them, I chose to add another function with different defaults. There are only four callers that passnargs_prop, so I could just as easily change the callers instead.Quoted 5 lines
Why do you have to change the callers? nargs value won't matter because they obviously have
nargs_proppresent or they would not have worked in the first place. If behavior changes because there's an error in their DT, who cares. That's their problem for not validating the DT.Because the change would be to make nargs matter even when
nargs_propis present. For the sake of example, consider something likefoo: foo { #my-cells = <1>; }; bar: bar { }; baz { my-prop = <&bar>, <&foo 5>, ; my-prop-names = "bar", "foo"; };Before we would have
fwnode_property_get_reference_args(baz, "my-prop", NULL, 0, "bar", args)<bar>fwnode_property_get_reference_args(baz, "my-prop", NULL, 0, "foo", args)<foo>fwnode_property_get_reference_args(baz, "my-prop", "#my-cells", -1, "bar", args)ERRORfwnode_property_get_reference_args(baz, "my-prop", "#my-cells", -1, "foo", args)ERRORfwnode_property_get_reference_args(baz, "my-prop", "#my-cells", 0, "bar", args)ERRORfwnode_property_get_reference_args(baz, "my-prop", "#my-cells", 0, "foo", args)ERRORand after we would have
fwnode_property_get_reference_args(baz, "my-prop", NULL, 0, "bar", args)<bar>fwnode_property_get_reference_args(baz, "my-prop", NULL, 0, "foo", args)<foo>fwnode_property_get_reference_args(baz, "my-prop", "#my-cells", -1, "bar", args)ERRORfwnode_property_get_reference_args(baz, "my-prop", "#my-cells", -1, "foo", args)ERRORfwnode_property_get_reference_args(baz, "my-prop", "#my-cells", 0, "bar", args)<bar>fwnode_property_get_reference_args(baz, "my-prop", "#my-cells", 0, "foo", args)<foo 5>
Quoted 5 lines
The problem is that all existing callers pass nargs=0 when nargs_prop="#my-cells" so they will get the new behavior even when they shouldn't. So if we change the behavior we have to change the callers too. If we make a new function with new behavior the callers stay the same.
It does not matter! It is not the kernel's job to validate the DT. If it was: it does a terrible job at it and we wouldn't have needed dtschema. In your example, the change actually makes things work despite the error! Why would you not want that? No one is relying on the last 2 cases returning an error other than to debug their DT.
That being said, looking at the DT side, we have of_parse_phandle_with_args(), of_parse_phandle_with_fixed_args(), and of_parse_phandle_with_optional_args(). We should mirror that API here as you have done. So to rephrase, make fwnode_property_get_reference_args() contents a static function and then both fwnode_property_get_reference_args() and fwnode_property_get_reference_optional_args() call that static function. IOW, similar to the DT API implementation using __of_parse_phandle_with_args().
Rob
Andy Shevchenko
reviewerQuoted 1 line · Sean Anderson
This series adds a fwnode-equivalent to
of_parse_phandle_with_optional_args.
Thanks, but no user. Not acceptable in this form. Also see individual comments.
Signature · 2 lines
With Best Regards, Andy Shevchenko
Quoted 5 lines · Andy Shevchenko
Quoted 1 line · Sean Anderson
This series adds a fwnode-equivalent to
of_parse_phandle_with_optional_args.Thanks, but no user. Not acceptable in this form. Also see individual comments.
https://lore.kernel.org/netdev/[email protected]/
I was hoping to get these patches reviewed/applied separately, since netdev has a limit on series length and these patches push that series over.
--Sean