dm: core: Expand integer-reading tests

The current tests do not cover all the behaviour. Add some more.

Tidy up a few inconsistencies between livetree and flattree which come to
light with these tests. Also drop the -ENODATA error since it is never
actually returned.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2022-09-06 20:27:18 -06:00 committed by Tom Rini
parent 8909066199
commit 66d0d0c188
5 changed files with 125 additions and 17 deletions

View File

@ -471,8 +471,7 @@ struct device_node *of_find_node_by_phandle(struct device_node *root,
* @len: requested length of property value * @len: requested length of property value
* *
* Return: the property value on success, -EINVAL if the property does not * Return: the property value on success, -EINVAL if the property does not
* exist, -ENODATA if property does not have a value, and -EOVERFLOW if the * exist and -EOVERFLOW if the property data isn't large enough.
* property data isn't large enough.
*/ */
static void *of_find_property_value_of_size(const struct device_node *np, static void *of_find_property_value_of_size(const struct device_node *np,
const char *propname, u32 len) const char *propname, u32 len)
@ -481,8 +480,6 @@ static void *of_find_property_value_of_size(const struct device_node *np,
if (!prop) if (!prop)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
if (!prop->value)
return ERR_PTR(-ENODATA);
if (len > prop->length) if (len > prop->length)
return ERR_PTR(-EOVERFLOW); return ERR_PTR(-EOVERFLOW);

View File

@ -296,9 +296,20 @@ int ofnode_read_u32_array(ofnode node, const char *propname,
return of_read_u32_array(ofnode_to_np(node), propname, return of_read_u32_array(ofnode_to_np(node), propname,
out_values, sz); out_values, sz);
} else { } else {
return fdtdec_get_int_array(gd->fdt_blob, int ret;
ofnode_to_offset(node), propname,
out_values, sz); ret = fdtdec_get_int_array(gd->fdt_blob,
ofnode_to_offset(node), propname,
out_values, sz);
/* get the error right, but space is more important in SPL */
if (!IS_ENABLED(CONFIG_SPL_BUILD)) {
if (ret == -FDT_ERR_NOTFOUND)
return -EINVAL;
else if (ret == -FDT_ERR_BADLAYOUT)
return -EOVERFLOW;
}
return ret;
} }
} }

View File

@ -327,8 +327,7 @@ int of_read_u32(const struct device_node *np, const char *propname, u32 *outp);
* @outp: pointer to return value, modified only if return value is 0. * @outp: pointer to return value, modified only if return value is 0.
* *
* Return: * Return:
* 0 on success, -EINVAL if the property does not exist, * 0 on success, -EINVAL if the property does not exist, or -EOVERFLOW if the
* -ENODATA if property does not have a value, and -EOVERFLOW if the
* property data isn't large enough. * property data isn't large enough.
*/ */
int of_read_u32_index(const struct device_node *np, const char *propname, int of_read_u32_index(const struct device_node *np, const char *propname,
@ -345,8 +344,7 @@ int of_read_u32_index(const struct device_node *np, const char *propname,
* @outp: pointer to return value, modified only if return value is 0. * @outp: pointer to return value, modified only if return value is 0.
* *
* Return: * Return:
* 0 on success, -EINVAL if the property does not exist, * 0 on success, -EINVAL if the property does not exist, or -EOVERFLOW if the
* -ENODATA if property does not have a value, and -EOVERFLOW if the
* property data isn't large enough. * property data isn't large enough.
*/ */
int of_read_u64(const struct device_node *np, const char *propname, u64 *outp); int of_read_u64(const struct device_node *np, const char *propname, u64 *outp);
@ -362,8 +360,8 @@ int of_read_u64(const struct device_node *np, const char *propname, u64 *outp);
* @out_values: pointer to return value, modified only if return value is 0. * @out_values: pointer to return value, modified only if return value is 0.
* @sz: number of array elements to read * @sz: number of array elements to read
* Return: * Return:
* 0 on success, -EINVAL if the property does not exist, -ENODATA * 0 on success, -EINVAL if the property does not exist, or -EOVERFLOW if
* if property does not have a value, and -EOVERFLOW is longer than sz. * longer than sz.
*/ */
int of_read_u32_array(const struct device_node *np, const char *propname, int of_read_u32_array(const struct device_node *np, const char *propname,
u32 *out_values, size_t sz); u32 *out_values, size_t sz);

View File

@ -373,12 +373,12 @@ const char *ofnode_read_string(ofnode node, const char *propname);
* @propname: name of the property to read * @propname: name of the property to read
* @out_values: pointer to return value, modified only if return value is 0 * @out_values: pointer to return value, modified only if return value is 0
* @sz: number of array elements to read * @sz: number of array elements to read
* Return: 0 if OK, -ve on error * Return: 0 on success, -EINVAL if the property does not exist,
* -ENODATA if property does not have a value, and -EOVERFLOW if the
* property data isn't large enough
* *
* Search for a property in a device node and read 32-bit value(s) from * Search for a property in a device node and read 32-bit value(s) from
* it. Returns 0 on success, -EINVAL if the property does not exist, * it.
* -ENODATA if property does not have a value, and -EOVERFLOW if the
* property data isn't large enough.
* *
* The out_values is modified only if a valid u32 value can be decoded. * The out_values is modified only if a valid u32 value can be decoded.
*/ */

View File

@ -320,6 +320,9 @@ static int dm_test_ofnode_get_path(struct unit_test_state *uts)
res = ofnode_get_path(node, buf, 32); res = ofnode_get_path(node, buf, 32);
ut_asserteq(-ENOSPC, res); ut_asserteq(-ENOSPC, res);
res = ofnode_get_path(ofnode_root(), buf, 32);
ut_asserteq_str("/", buf);
return 0; return 0;
} }
DM_TEST(dm_test_ofnode_get_path, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT); DM_TEST(dm_test_ofnode_get_path, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
@ -589,6 +592,7 @@ DM_TEST(dm_test_ofnode_livetree_writing,
static int dm_test_ofnode_u32(struct unit_test_state *uts) static int dm_test_ofnode_u32(struct unit_test_state *uts)
{ {
ofnode node; ofnode node;
u32 val;
node = ofnode_path("/lcd"); node = ofnode_path("/lcd");
ut_assert(ofnode_valid(node)); ut_assert(ofnode_valid(node));
@ -597,10 +601,62 @@ static int dm_test_ofnode_u32(struct unit_test_state *uts)
ut_asserteq(1367, ofnode_read_u32_default(node, "xres", 123)); ut_asserteq(1367, ofnode_read_u32_default(node, "xres", 123));
ut_assertok(ofnode_write_u32(node, "xres", 1366)); ut_assertok(ofnode_write_u32(node, "xres", 1366));
node = ofnode_path("/backlight");
ut_assertok(ofnode_read_u32_index(node, "brightness-levels", 0, &val));
ut_asserteq(0, val);
ut_assertok(ofnode_read_u32_index(node, "brightness-levels", 1, &val));
ut_asserteq(16, val);
ut_assertok(ofnode_read_u32_index(node, "brightness-levels", 8, &val));
ut_asserteq(255, val);
ut_asserteq(-EOVERFLOW,
ofnode_read_u32_index(node, "brightness-levels", 9, &val));
ut_asserteq(-EINVAL, ofnode_read_u32_index(node, "missing", 0, &val));
return 0; return 0;
} }
DM_TEST(dm_test_ofnode_u32, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT); DM_TEST(dm_test_ofnode_u32, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
static int dm_test_ofnode_u32_array(struct unit_test_state *uts)
{
ofnode node;
u32 val[10];
node = ofnode_path("/a-test");
ut_assert(ofnode_valid(node));
ut_assertok(ofnode_read_u32_array(node, "int-value", val, 1));
ut_asserteq(-EINVAL, ofnode_read_u32_array(node, "missing", val, 1));
ut_asserteq(-EOVERFLOW, ofnode_read_u32_array(node, "bool-value", val,
1));
memset(val, '\0', sizeof(val));
ut_assertok(ofnode_read_u32_array(node, "int-array", val + 1, 3));
ut_asserteq(0, val[0]);
ut_asserteq(5678, val[1]);
ut_asserteq(9123, val[2]);
ut_asserteq(4567, val[3]);
ut_asserteq(0, val[4]);
ut_asserteq(-EOVERFLOW, ofnode_read_u32_array(node, "int-array", val,
4));
return 0;
}
DM_TEST(dm_test_ofnode_u32_array, UT_TESTF_SCAN_PDATA | UT_TESTF_SCAN_FDT);
static int dm_test_ofnode_u64(struct unit_test_state *uts)
{
ofnode node;
u64 val;
node = ofnode_path("/a-test");
ut_assert(ofnode_valid(node));
ut_assertok(ofnode_read_u64(node, "int64-value", &val));
ut_asserteq_64(0x1111222233334444, val);
ut_asserteq(-EINVAL, ofnode_read_u64(node, "missing", &val));
return 0;
}
DM_TEST(dm_test_ofnode_u64, UT_TESTF_SCAN_FDT);
static int dm_test_ofnode_add_subnode(struct unit_test_state *uts) static int dm_test_ofnode_add_subnode(struct unit_test_state *uts)
{ {
ofnode node, check, subnode; ofnode node, check, subnode;
@ -693,3 +749,49 @@ static int dm_test_ofnode_for_each_prop(struct unit_test_state *uts)
return 0; return 0;
} }
DM_TEST(dm_test_ofnode_for_each_prop, UT_TESTF_SCAN_FDT); DM_TEST(dm_test_ofnode_for_each_prop, UT_TESTF_SCAN_FDT);
static int dm_test_ofnode_by_compatible(struct unit_test_state *uts)
{
const char *compat = "denx,u-boot-fdt-test";
ofnode node;
int count;
count = 0;
for (node = ofnode_null();
node = ofnode_by_compatible(node, compat), ofnode_valid(node);)
count++;
ut_asserteq(11, count);
return 0;
}
DM_TEST(dm_test_ofnode_by_compatible, UT_TESTF_SCAN_FDT);
static int dm_test_ofnode_find_subnode(struct unit_test_state *uts)
{
ofnode node, subnode;
node = ofnode_path("/buttons");
subnode = ofnode_find_subnode(node, "btn1");
ut_assert(ofnode_valid(subnode));
ut_asserteq_str("btn1", ofnode_get_name(subnode));
subnode = ofnode_find_subnode(node, "btn");
ut_assert(!ofnode_valid(subnode));
return 0;
}
DM_TEST(dm_test_ofnode_find_subnode, UT_TESTF_SCAN_FDT);
static int dm_test_ofnode_get_name(struct unit_test_state *uts)
{
ofnode node;
node = ofnode_path("/buttons");
ut_assert(ofnode_valid(node));
ut_asserteq_str("buttons", ofnode_get_name(node));
ut_asserteq_str("", ofnode_get_name(ofnode_root()));
return 0;
}
DM_TEST(dm_test_ofnode_get_name, UT_TESTF_SCAN_FDT);