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:
parent
8909066199
commit
66d0d0c188
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
102
test/dm/ofnode.c
102
test/dm/ofnode.c
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user