On 2/14/19 1:37 PM, Brendan Higgins wrote: > Split out a couple of test cases that these features in base.c from the > unittest.c monolith. The intention is that we will eventually split out > all test cases and group them together based on what portion of device > tree they test. I still object to this patch. I do not want this code scattered into additional files. -Frank > > Signed-off-by: Brendan Higgins <brendanhiggins@xxxxxxxxxx> > --- > drivers/of/Makefile | 2 +- > drivers/of/base-test.c | 214 ++++++++++++++++++++++++ > drivers/of/test-common.c | 175 ++++++++++++++++++++ > drivers/of/test-common.h | 16 ++ > drivers/of/unittest.c | 345 +-------------------------------------- > 5 files changed, 407 insertions(+), 345 deletions(-) > create mode 100644 drivers/of/base-test.c > create mode 100644 drivers/of/test-common.c > create mode 100644 drivers/of/test-common.h > > diff --git a/drivers/of/Makefile b/drivers/of/Makefile > index 663a4af0cccd5..4a4bd527d586c 100644 > --- a/drivers/of/Makefile > +++ b/drivers/of/Makefile > @@ -8,7 +8,7 @@ obj-$(CONFIG_OF_PROMTREE) += pdt.o > obj-$(CONFIG_OF_ADDRESS) += address.o > obj-$(CONFIG_OF_IRQ) += irq.o > obj-$(CONFIG_OF_NET) += of_net.o > -obj-$(CONFIG_OF_UNITTEST) += unittest.o > +obj-$(CONFIG_OF_UNITTEST) += unittest.o base-test.o test-common.o > obj-$(CONFIG_OF_MDIO) += of_mdio.o > obj-$(CONFIG_OF_RESERVED_MEM) += of_reserved_mem.o > obj-$(CONFIG_OF_RESOLVE) += resolver.o > diff --git a/drivers/of/base-test.c b/drivers/of/base-test.c > new file mode 100644 > index 0000000000000..3d3f4f1b74800 > --- /dev/null > +++ b/drivers/of/base-test.c > @@ -0,0 +1,214 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Unit tests for functions defined in base.c. > + */ > +#include <linux/of.h> > + > +#include <kunit/test.h> > + > +#include "test-common.h" > + > +static void of_unittest_find_node_by_name(struct kunit *test) > +{ > + struct device_node *np; > + const char *options, *name; > + > + np = of_find_node_by_path("/testcase-data"); > + name = kasprintf(GFP_KERNEL, "%pOF", np); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > + KUNIT_EXPECT_STREQ_MSG(test, "/testcase-data", name, > + "find /testcase-data failed\n"); > + of_node_put(np); > + kfree(name); > + > + /* Test if trailing '/' works */ > + KUNIT_EXPECT_EQ_MSG(test, of_find_node_by_path("/testcase-data/"), NULL, > + "trailing '/' on /testcase-data/ should fail\n"); > + > + np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a"); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > + name = kasprintf(GFP_KERNEL, "%pOF", np); > + KUNIT_EXPECT_STREQ_MSG( > + test, "/testcase-data/phandle-tests/consumer-a", name, > + "find /testcase-data/phandle-tests/consumer-a failed\n"); > + of_node_put(np); > + kfree(name); > + > + np = of_find_node_by_path("testcase-alias"); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > + name = kasprintf(GFP_KERNEL, "%pOF", np); > + KUNIT_EXPECT_STREQ_MSG(test, "/testcase-data", name, > + "find testcase-alias failed\n"); > + of_node_put(np); > + kfree(name); > + > + /* Test if trailing '/' works on aliases */ > + KUNIT_EXPECT_EQ_MSG(test, of_find_node_by_path("testcase-alias/"), NULL, > + "trailing '/' on testcase-alias/ should fail\n"); > + > + np = of_find_node_by_path("testcase-alias/phandle-tests/consumer-a"); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > + name = kasprintf(GFP_KERNEL, "%pOF", np); > + KUNIT_EXPECT_STREQ_MSG( > + test, "/testcase-data/phandle-tests/consumer-a", name, > + "find testcase-alias/phandle-tests/consumer-a failed\n"); > + of_node_put(np); > + kfree(name); > + > + KUNIT_EXPECT_EQ_MSG( > + test, > + np = of_find_node_by_path("/testcase-data/missing-path"), NULL, > + "non-existent path returned node %pOF\n", np); > + of_node_put(np); > + > + KUNIT_EXPECT_EQ_MSG( > + test, np = of_find_node_by_path("missing-alias"), NULL, > + "non-existent alias returned node %pOF\n", np); > + of_node_put(np); > + > + KUNIT_EXPECT_EQ_MSG( > + test, > + np = of_find_node_by_path("testcase-alias/missing-path"), NULL, > + "non-existent alias with relative path returned node %pOF\n", > + np); > + of_node_put(np); > + > + np = of_find_node_opts_by_path("/testcase-data:testoption", &options); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > + KUNIT_EXPECT_STREQ_MSG(test, "testoption", options, > + "option path test failed\n"); > + of_node_put(np); > + > + np = of_find_node_opts_by_path("/testcase-data:test/option", &options); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > + KUNIT_EXPECT_STREQ_MSG(test, "test/option", options, > + "option path test, subcase #1 failed\n"); > + of_node_put(np); > + > + np = of_find_node_opts_by_path("/testcase-data/testcase-device1:test/option", &options); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > + KUNIT_EXPECT_STREQ_MSG(test, "test/option", options, > + "option path test, subcase #2 failed\n"); > + of_node_put(np); > + > + np = of_find_node_opts_by_path("/testcase-data:testoption", NULL); > + KUNIT_EXPECT_NOT_ERR_OR_NULL_MSG(test, np, > + "NULL option path test failed\n"); > + of_node_put(np); > + > + np = of_find_node_opts_by_path("testcase-alias:testaliasoption", > + &options); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > + KUNIT_EXPECT_STREQ_MSG(test, "testaliasoption", options, > + "option alias path test failed\n"); > + of_node_put(np); > + > + np = of_find_node_opts_by_path("testcase-alias:test/alias/option", > + &options); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > + KUNIT_EXPECT_STREQ_MSG(test, "test/alias/option", options, > + "option alias path test, subcase #1 failed\n"); > + of_node_put(np); > + > + np = of_find_node_opts_by_path("testcase-alias:testaliasoption", NULL); > + KUNIT_EXPECT_NOT_ERR_OR_NULL_MSG( > + test, np, "NULL option alias path test failed\n"); > + of_node_put(np); > + > + options = "testoption"; > + np = of_find_node_opts_by_path("testcase-alias", &options); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > + KUNIT_EXPECT_EQ_MSG(test, options, NULL, > + "option clearing test failed\n"); > + of_node_put(np); > + > + options = "testoption"; > + np = of_find_node_opts_by_path("/", &options); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > + KUNIT_EXPECT_EQ_MSG(test, options, NULL, > + "option clearing root node test failed\n"); > + of_node_put(np); > +} > + > +static void of_unittest_dynamic(struct kunit *test) > +{ > + struct device_node *np; > + struct property *prop; > + > + np = of_find_node_by_path("/testcase-data"); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > + > + /* Array of 4 properties for the purpose of testing */ > + prop = kcalloc(4, sizeof(*prop), GFP_KERNEL); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, prop); > + > + /* Add a new property - should pass*/ > + prop->name = "new-property"; > + prop->value = "new-property-data"; > + prop->length = strlen(prop->value) + 1; > + KUNIT_EXPECT_EQ_MSG(test, of_add_property(np, prop), 0, > + "Adding a new property failed\n"); > + > + /* Try to add an existing property - should fail */ > + prop++; > + prop->name = "new-property"; > + prop->value = "new-property-data-should-fail"; > + prop->length = strlen(prop->value) + 1; > + KUNIT_EXPECT_NE_MSG(test, of_add_property(np, prop), 0, > + "Adding an existing property should have failed\n"); > + > + /* Try to modify an existing property - should pass */ > + prop->value = "modify-property-data-should-pass"; > + prop->length = strlen(prop->value) + 1; > + KUNIT_EXPECT_EQ_MSG( > + test, of_update_property(np, prop), 0, > + "Updating an existing property should have passed\n"); > + > + /* Try to modify non-existent property - should pass*/ > + prop++; > + prop->name = "modify-property"; > + prop->value = "modify-missing-property-data-should-pass"; > + prop->length = strlen(prop->value) + 1; > + KUNIT_EXPECT_EQ_MSG(test, of_update_property(np, prop), 0, > + "Updating a missing property should have passed\n"); > + > + /* Remove property - should pass */ > + KUNIT_EXPECT_EQ_MSG(test, of_remove_property(np, prop), 0, > + "Removing a property should have passed\n"); > + > + /* Adding very large property - should pass */ > + prop++; > + prop->name = "large-property-PAGE_SIZEx8"; > + prop->length = PAGE_SIZE * 8; > + prop->value = kzalloc(prop->length, GFP_KERNEL); > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, prop->value); > + KUNIT_EXPECT_EQ_MSG(test, of_add_property(np, prop), 0, > + "Adding a large property should have passed\n"); > +} > + > +static int of_test_init(struct kunit *test) > +{ > + /* adding data for unittest */ > + KUNIT_ASSERT_EQ(test, 0, unittest_data_add()); > + > + if (!of_aliases) > + of_aliases = of_find_node_by_path("/aliases"); > + > + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, of_find_node_by_path( > + "/testcase-data/phandle-tests/consumer-a")); > + > + return 0; > +} > + > +static struct kunit_case of_test_cases[] = { > + KUNIT_CASE(of_unittest_find_node_by_name), > + KUNIT_CASE(of_unittest_dynamic), > + {}, > +}; > + > +static struct kunit_module of_test_module = { > + .name = "of-base-test", > + .init = of_test_init, > + .test_cases = of_test_cases, > +}; > +module_test(of_test_module); > diff --git a/drivers/of/test-common.c b/drivers/of/test-common.c > new file mode 100644 > index 0000000000000..4c9a5f3b82f7d > --- /dev/null > +++ b/drivers/of/test-common.c > @@ -0,0 +1,175 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * Common code to be used by unit tests. > + */ > +#include "test-common.h" > + > +#include <linux/of_fdt.h> > +#include <linux/slab.h> > + > +#include "of_private.h" > + > +/** > + * update_node_properties - adds the properties > + * of np into dup node (present in live tree) and > + * updates parent of children of np to dup. > + * > + * @np: node whose properties are being added to the live tree > + * @dup: node present in live tree to be updated > + */ > +static void update_node_properties(struct device_node *np, > + struct device_node *dup) > +{ > + struct property *prop; > + struct property *save_next; > + struct device_node *child; > + int ret; > + > + for_each_child_of_node(np, child) > + child->parent = dup; > + > + /* > + * "unittest internal error: unable to add testdata property" > + * > + * If this message reports a property in node '/__symbols__' then > + * the respective unittest overlay contains a label that has the > + * same name as a label in the live devicetree. The label will > + * be in the live devicetree only if the devicetree source was > + * compiled with the '-@' option. If you encounter this error, > + * please consider renaming __all__ of the labels in the unittest > + * overlay dts files with an odd prefix that is unlikely to be > + * used in a real devicetree. > + */ > + > + /* > + * open code for_each_property_of_node() because of_add_property() > + * sets prop->next to NULL > + */ > + for (prop = np->properties; prop != NULL; prop = save_next) { > + save_next = prop->next; > + ret = of_add_property(dup, prop); > + if (ret) > + pr_err("unittest internal error: unable to add testdata property %pOF/%s", > + np, prop->name); > + } > +} > + > +/** > + * attach_node_and_children - attaches nodes > + * and its children to live tree > + * > + * @np: Node to attach to live tree > + */ > +static void attach_node_and_children(struct device_node *np) > +{ > + struct device_node *next, *dup, *child; > + unsigned long flags; > + const char *full_name; > + > + full_name = kasprintf(GFP_KERNEL, "%pOF", np); > + > + if (!strcmp(full_name, "/__local_fixups__") || > + !strcmp(full_name, "/__fixups__")) > + return; > + > + dup = of_find_node_by_path(full_name); > + kfree(full_name); > + if (dup) { > + update_node_properties(np, dup); > + return; > + } > + > + child = np->child; > + np->child = NULL; > + > + mutex_lock(&of_mutex); > + raw_spin_lock_irqsave(&devtree_lock, flags); > + np->sibling = np->parent->child; > + np->parent->child = np; > + of_node_clear_flag(np, OF_DETACHED); > + raw_spin_unlock_irqrestore(&devtree_lock, flags); > + > + __of_attach_node_sysfs(np); > + mutex_unlock(&of_mutex); > + > + while (child) { > + next = child->sibling; > + attach_node_and_children(child); > + child = next; > + } > +} > + > +/** > + * unittest_data_add - Reads, copies data from > + * linked tree and attaches it to the live tree > + */ > +int unittest_data_add(void) > +{ > + void *unittest_data; > + struct device_node *unittest_data_node, *np; > + /* > + * __dtb_testcases_begin[] and __dtb_testcases_end[] are magically > + * created by cmd_dt_S_dtb in scripts/Makefile.lib > + */ > + extern uint8_t __dtb_testcases_begin[]; > + extern uint8_t __dtb_testcases_end[]; > + const int size = __dtb_testcases_end - __dtb_testcases_begin; > + int rc; > + > + if (!size) { > + pr_warn("%s: No testcase data to attach; not running tests\n", > + __func__); > + return -ENODATA; > + } > + > + /* creating copy */ > + unittest_data = kmemdup(__dtb_testcases_begin, size, GFP_KERNEL); > + > + if (!unittest_data) { > + pr_warn("%s: Failed to allocate memory for unittest_data; " > + "not running tests\n", __func__); > + return -ENOMEM; > + } > + of_fdt_unflatten_tree(unittest_data, NULL, &unittest_data_node); > + if (!unittest_data_node) { > + pr_warn("%s: No tree to attach; not running tests\n", __func__); > + return -ENODATA; > + } > + > + /* > + * This lock normally encloses of_resolve_phandles() > + */ > + of_overlay_mutex_lock(); > + > + rc = of_resolve_phandles(unittest_data_node); > + if (rc) { > + pr_err("%s: Failed to resolve phandles (rc=%i)\n", __func__, rc); > + of_overlay_mutex_unlock(); > + return -EINVAL; > + } > + > + if (!of_root) { > + of_root = unittest_data_node; > + for_each_of_allnodes(np) > + __of_attach_node_sysfs(np); > + of_aliases = of_find_node_by_path("/aliases"); > + of_chosen = of_find_node_by_path("/chosen"); > + of_overlay_mutex_unlock(); > + return 0; > + } > + > + /* attach the sub-tree to live tree */ > + np = unittest_data_node->child; > + while (np) { > + struct device_node *next = np->sibling; > + > + np->parent = of_root; > + attach_node_and_children(np); > + np = next; > + } > + > + of_overlay_mutex_unlock(); > + > + return 0; > +} > + > diff --git a/drivers/of/test-common.h b/drivers/of/test-common.h > new file mode 100644 > index 0000000000000..a35484406bbf1 > --- /dev/null > +++ b/drivers/of/test-common.h > @@ -0,0 +1,16 @@ > +/* SPDX-License-Identifier: GPL-2.0+ */ > +/* > + * Common code to be used by unit tests. > + */ > +#ifndef _LINUX_OF_TEST_COMMON_H > +#define _LINUX_OF_TEST_COMMON_H > + > +#include <linux/of.h> > + > +/** > + * unittest_data_add - Reads, copies data from > + * linked tree and attaches it to the live tree > + */ > +int unittest_data_add(void); > + > +#endif /* _LINUX_OF_TEST_COMMON_H */ > diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c > index 96de69ccb3e63..05a2610d0be7f 100644 > --- a/drivers/of/unittest.c > +++ b/drivers/of/unittest.c > @@ -29,184 +29,7 @@ > #include <kunit/test.h> > > #include "of_private.h" > - > -static void of_unittest_find_node_by_name(struct kunit *test) > -{ > - struct device_node *np; > - const char *options, *name; > - > - np = of_find_node_by_path("/testcase-data"); > - name = kasprintf(GFP_KERNEL, "%pOF", np); > - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > - KUNIT_EXPECT_STREQ_MSG(test, "/testcase-data", name, > - "find /testcase-data failed\n"); > - of_node_put(np); > - kfree(name); > - > - /* Test if trailing '/' works */ > - KUNIT_EXPECT_EQ_MSG(test, of_find_node_by_path("/testcase-data/"), NULL, > - "trailing '/' on /testcase-data/ should fail\n"); > - > - np = of_find_node_by_path("/testcase-data/phandle-tests/consumer-a"); > - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > - name = kasprintf(GFP_KERNEL, "%pOF", np); > - KUNIT_EXPECT_STREQ_MSG( > - test, "/testcase-data/phandle-tests/consumer-a", name, > - "find /testcase-data/phandle-tests/consumer-a failed\n"); > - of_node_put(np); > - kfree(name); > - > - np = of_find_node_by_path("testcase-alias"); > - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > - name = kasprintf(GFP_KERNEL, "%pOF", np); > - KUNIT_EXPECT_STREQ_MSG(test, "/testcase-data", name, > - "find testcase-alias failed\n"); > - of_node_put(np); > - kfree(name); > - > - /* Test if trailing '/' works on aliases */ > - KUNIT_EXPECT_EQ_MSG(test, of_find_node_by_path("testcase-alias/"), NULL, > - "trailing '/' on testcase-alias/ should fail\n"); > - > - np = of_find_node_by_path("testcase-alias/phandle-tests/consumer-a"); > - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > - name = kasprintf(GFP_KERNEL, "%pOF", np); > - KUNIT_EXPECT_STREQ_MSG( > - test, "/testcase-data/phandle-tests/consumer-a", name, > - "find testcase-alias/phandle-tests/consumer-a failed\n"); > - of_node_put(np); > - kfree(name); > - > - KUNIT_EXPECT_EQ_MSG( > - test, > - np = of_find_node_by_path("/testcase-data/missing-path"), NULL, > - "non-existent path returned node %pOF\n", np); > - of_node_put(np); > - > - KUNIT_EXPECT_EQ_MSG( > - test, np = of_find_node_by_path("missing-alias"), NULL, > - "non-existent alias returned node %pOF\n", np); > - of_node_put(np); > - > - KUNIT_EXPECT_EQ_MSG( > - test, > - np = of_find_node_by_path("testcase-alias/missing-path"), NULL, > - "non-existent alias with relative path returned node %pOF\n", > - np); > - of_node_put(np); > - > - np = of_find_node_opts_by_path("/testcase-data:testoption", &options); > - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > - KUNIT_EXPECT_STREQ_MSG(test, "testoption", options, > - "option path test failed\n"); > - of_node_put(np); > - > - np = of_find_node_opts_by_path("/testcase-data:test/option", &options); > - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > - KUNIT_EXPECT_STREQ_MSG(test, "test/option", options, > - "option path test, subcase #1 failed\n"); > - of_node_put(np); > - > - np = of_find_node_opts_by_path("/testcase-data/testcase-device1:test/option", &options); > - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > - KUNIT_EXPECT_STREQ_MSG(test, "test/option", options, > - "option path test, subcase #2 failed\n"); > - of_node_put(np); > - > - np = of_find_node_opts_by_path("/testcase-data:testoption", NULL); > - KUNIT_EXPECT_NOT_ERR_OR_NULL_MSG(test, np, > - "NULL option path test failed\n"); > - of_node_put(np); > - > - np = of_find_node_opts_by_path("testcase-alias:testaliasoption", > - &options); > - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > - KUNIT_EXPECT_STREQ_MSG(test, "testaliasoption", options, > - "option alias path test failed\n"); > - of_node_put(np); > - > - np = of_find_node_opts_by_path("testcase-alias:test/alias/option", > - &options); > - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > - KUNIT_EXPECT_STREQ_MSG(test, "test/alias/option", options, > - "option alias path test, subcase #1 failed\n"); > - of_node_put(np); > - > - np = of_find_node_opts_by_path("testcase-alias:testaliasoption", NULL); > - KUNIT_EXPECT_NOT_ERR_OR_NULL_MSG( > - test, np, "NULL option alias path test failed\n"); > - of_node_put(np); > - > - options = "testoption"; > - np = of_find_node_opts_by_path("testcase-alias", &options); > - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > - KUNIT_EXPECT_EQ_MSG(test, options, NULL, > - "option clearing test failed\n"); > - of_node_put(np); > - > - options = "testoption"; > - np = of_find_node_opts_by_path("/", &options); > - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > - KUNIT_EXPECT_EQ_MSG(test, options, NULL, > - "option clearing root node test failed\n"); > - of_node_put(np); > -} > - > -static void of_unittest_dynamic(struct kunit *test) > -{ > - struct device_node *np; > - struct property *prop; > - > - np = of_find_node_by_path("/testcase-data"); > - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, np); > - > - /* Array of 4 properties for the purpose of testing */ > - prop = kcalloc(4, sizeof(*prop), GFP_KERNEL); > - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, prop); > - > - /* Add a new property - should pass*/ > - prop->name = "new-property"; > - prop->value = "new-property-data"; > - prop->length = strlen(prop->value) + 1; > - KUNIT_EXPECT_EQ_MSG(test, of_add_property(np, prop), 0, > - "Adding a new property failed\n"); > - > - /* Try to add an existing property - should fail */ > - prop++; > - prop->name = "new-property"; > - prop->value = "new-property-data-should-fail"; > - prop->length = strlen(prop->value) + 1; > - KUNIT_EXPECT_NE_MSG(test, of_add_property(np, prop), 0, > - "Adding an existing property should have failed\n"); > - > - /* Try to modify an existing property - should pass */ > - prop->value = "modify-property-data-should-pass"; > - prop->length = strlen(prop->value) + 1; > - KUNIT_EXPECT_EQ_MSG( > - test, of_update_property(np, prop), 0, > - "Updating an existing property should have passed\n"); > - > - /* Try to modify non-existent property - should pass*/ > - prop++; > - prop->name = "modify-property"; > - prop->value = "modify-missing-property-data-should-pass"; > - prop->length = strlen(prop->value) + 1; > - KUNIT_EXPECT_EQ_MSG(test, of_update_property(np, prop), 0, > - "Updating a missing property should have passed\n"); > - > - /* Remove property - should pass */ > - KUNIT_EXPECT_EQ_MSG(test, of_remove_property(np, prop), 0, > - "Removing a property should have passed\n"); > - > - /* Adding very large property - should pass */ > - prop++; > - prop->name = "large-property-PAGE_SIZEx8"; > - prop->length = PAGE_SIZE * 8; > - prop->value = kzalloc(prop->length, GFP_KERNEL); > - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, prop->value); > - KUNIT_EXPECT_EQ_MSG(test, of_add_property(np, prop), 0, > - "Adding a large property should have passed\n"); > -} > +#include "test-common.h" > > static int of_unittest_check_node_linkage(struct device_node *np) > { > @@ -1177,170 +1000,6 @@ static void of_unittest_platform_populate(struct kunit *test) > of_node_put(np); > } > > -/** > - * update_node_properties - adds the properties > - * of np into dup node (present in live tree) and > - * updates parent of children of np to dup. > - * > - * @np: node whose properties are being added to the live tree > - * @dup: node present in live tree to be updated > - */ > -static void update_node_properties(struct device_node *np, > - struct device_node *dup) > -{ > - struct property *prop; > - struct property *save_next; > - struct device_node *child; > - int ret; > - > - for_each_child_of_node(np, child) > - child->parent = dup; > - > - /* > - * "unittest internal error: unable to add testdata property" > - * > - * If this message reports a property in node '/__symbols__' then > - * the respective unittest overlay contains a label that has the > - * same name as a label in the live devicetree. The label will > - * be in the live devicetree only if the devicetree source was > - * compiled with the '-@' option. If you encounter this error, > - * please consider renaming __all__ of the labels in the unittest > - * overlay dts files with an odd prefix that is unlikely to be > - * used in a real devicetree. > - */ > - > - /* > - * open code for_each_property_of_node() because of_add_property() > - * sets prop->next to NULL > - */ > - for (prop = np->properties; prop != NULL; prop = save_next) { > - save_next = prop->next; > - ret = of_add_property(dup, prop); > - if (ret) > - pr_err("unittest internal error: unable to add testdata property %pOF/%s", > - np, prop->name); > - } > -} > - > -/** > - * attach_node_and_children - attaches nodes > - * and its children to live tree > - * > - * @np: Node to attach to live tree > - */ > -static void attach_node_and_children(struct device_node *np) > -{ > - struct device_node *next, *dup, *child; > - unsigned long flags; > - const char *full_name; > - > - full_name = kasprintf(GFP_KERNEL, "%pOF", np); > - > - if (!strcmp(full_name, "/__local_fixups__") || > - !strcmp(full_name, "/__fixups__")) > - return; > - > - dup = of_find_node_by_path(full_name); > - kfree(full_name); > - if (dup) { > - update_node_properties(np, dup); > - return; > - } > - > - child = np->child; > - np->child = NULL; > - > - mutex_lock(&of_mutex); > - raw_spin_lock_irqsave(&devtree_lock, flags); > - np->sibling = np->parent->child; > - np->parent->child = np; > - of_node_clear_flag(np, OF_DETACHED); > - raw_spin_unlock_irqrestore(&devtree_lock, flags); > - > - __of_attach_node_sysfs(np); > - mutex_unlock(&of_mutex); > - > - while (child) { > - next = child->sibling; > - attach_node_and_children(child); > - child = next; > - } > -} > - > -/** > - * unittest_data_add - Reads, copies data from > - * linked tree and attaches it to the live tree > - */ > -static int unittest_data_add(void) > -{ > - void *unittest_data; > - struct device_node *unittest_data_node, *np; > - /* > - * __dtb_testcases_begin[] and __dtb_testcases_end[] are magically > - * created by cmd_dt_S_dtb in scripts/Makefile.lib > - */ > - extern uint8_t __dtb_testcases_begin[]; > - extern uint8_t __dtb_testcases_end[]; > - const int size = __dtb_testcases_end - __dtb_testcases_begin; > - int rc; > - > - if (!size) { > - pr_warn("%s: No testcase data to attach; not running tests\n", > - __func__); > - return -ENODATA; > - } > - > - /* creating copy */ > - unittest_data = kmemdup(__dtb_testcases_begin, size, GFP_KERNEL); > - > - if (!unittest_data) { > - pr_warn("%s: Failed to allocate memory for unittest_data; " > - "not running tests\n", __func__); > - return -ENOMEM; > - } > - of_fdt_unflatten_tree(unittest_data, NULL, &unittest_data_node); > - if (!unittest_data_node) { > - pr_warn("%s: No tree to attach; not running tests\n", __func__); > - return -ENODATA; > - } > - > - /* > - * This lock normally encloses of_resolve_phandles() > - */ > - of_overlay_mutex_lock(); > - > - rc = of_resolve_phandles(unittest_data_node); > - if (rc) { > - pr_err("%s: Failed to resolve phandles (rc=%i)\n", __func__, rc); > - of_overlay_mutex_unlock(); > - return -EINVAL; > - } > - > - if (!of_root) { > - of_root = unittest_data_node; > - for_each_of_allnodes(np) > - __of_attach_node_sysfs(np); > - of_aliases = of_find_node_by_path("/aliases"); > - of_chosen = of_find_node_by_path("/chosen"); > - of_overlay_mutex_unlock(); > - return 0; > - } > - > - /* attach the sub-tree to live tree */ > - np = unittest_data_node->child; > - while (np) { > - struct device_node *next = np->sibling; > - > - np->parent = of_root; > - attach_node_and_children(np); > - np = next; > - } > - > - of_overlay_mutex_unlock(); > - > - return 0; > -} > - > #ifdef CONFIG_OF_OVERLAY > static int overlay_data_apply(const char *overlay_name, int *overlay_id); > > @@ -2563,8 +2222,6 @@ static int of_test_init(struct kunit *test) > static struct kunit_case of_test_cases[] = { > KUNIT_CASE(of_unittest_check_tree_linkage), > KUNIT_CASE(of_unittest_check_phandles), > - KUNIT_CASE(of_unittest_find_node_by_name), > - KUNIT_CASE(of_unittest_dynamic), > KUNIT_CASE(of_unittest_parse_phandle_with_args), > KUNIT_CASE(of_unittest_parse_phandle_with_args_map), > KUNIT_CASE(of_unittest_printf), >