Commit 57409d4f authored by Tyrel Datwyler's avatar Tyrel Datwyler Committed by Michael Ellerman

powerpc/pseries: Fix bad drc_index_start value parsing of drc-info entry

The ibm,drc-info property is an array property that contains drc-info
entries such that each entry is made up of 2 string encoded elements
followed by 5 int encoded elements. The of_read_drc_info_cell()
helper contains comments that correctly name the expected elements
and their encoding. However, the usage of of_prop_next_string() and
of_prop_next_u32() introduced a subtle skippage of the first u32.
This is a result of of_prop_next_string() returning a pointer to the
next property value which is not a string, but actually a (__be32 *).
As, a result the following call to of_prop_next_u32() passes over the
current int encoded value and actually stores the next one wrongly.

Simply endian swap the current value in place after reading the first
two string values. The remaining int encoded values can then be read
correctly using of_prop_next_u32().
Signed-off-by: default avatarTyrel Datwyler <tyreld@linux.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/1573449697-5448-2-git-send-email-tyreld@linux.ibm.com
parent d34a5709
...@@ -45,14 +45,14 @@ struct device_node *pseries_of_derive_parent(const char *path) ...@@ -45,14 +45,14 @@ struct device_node *pseries_of_derive_parent(const char *path)
int of_read_drc_info_cell(struct property **prop, const __be32 **curval, int of_read_drc_info_cell(struct property **prop, const __be32 **curval,
struct of_drc_info *data) struct of_drc_info *data)
{ {
const char *p; const char *p = (char *)(*curval);
const __be32 *p2; const __be32 *p2;
if (!data) if (!data)
return -EINVAL; return -EINVAL;
/* Get drc-type:encode-string */ /* Get drc-type:encode-string */
p = data->drc_type = (char*) (*curval); data->drc_type = (char *)p;
p = of_prop_next_string(*prop, p); p = of_prop_next_string(*prop, p);
if (!p) if (!p)
return -EINVAL; return -EINVAL;
...@@ -65,9 +65,7 @@ int of_read_drc_info_cell(struct property **prop, const __be32 **curval, ...@@ -65,9 +65,7 @@ int of_read_drc_info_cell(struct property **prop, const __be32 **curval,
/* Get drc-index-start:encode-int */ /* Get drc-index-start:encode-int */
p2 = (const __be32 *)p; p2 = (const __be32 *)p;
p2 = of_prop_next_u32(*prop, p2, &data->drc_index_start); data->drc_index_start = be32_to_cpu(*p2);
if (!p2)
return -EINVAL;
/* Get drc-name-suffix-start:encode-int */ /* Get drc-name-suffix-start:encode-int */
p2 = of_prop_next_u32(*prop, p2, &data->drc_name_suffix_start); p2 = of_prop_next_u32(*prop, p2, &data->drc_name_suffix_start);
......
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