of: populate of_root node if bootloader doesn't
Subsystems (5)
v2 cover of: populate of_root node if bootloader doesn't
Arch maintainers, please ack/review patches.
This is a resend of a series from Frank last year[1]. I worked in Rob's review comments to unconditionally call unflatten_device_tree() and fixup/audit calls to of_have_populated_dt() so that behavior doesn't change.
I need this series so I can add DT based tests in the clk framework. Either I can merge it through the clk tree once everyone is happy, or Rob can merge it through the DT tree and provide some branch so I can base clk patches on it.
Changes from Frank's series[1]:
* Add a DTB loaded kunit test
* Make of_have_populated_dt() return false if the DTB isn't from the bootloader
* Architecture calls made unconditional so that a root node is always made
Changes from v1 (https://lore.kernel.org/r/[email protected]):
* x86 patch included
* arm64 knocks out initial dtb if acpi is in use
* keep Kconfig hidden but def_bool enabled otherwise
Frank Rowand (2):
of: Create of_root if no dtb provided by firmware
of: unittest: treat missing of_root as error instead of fixing up
Stephen Boyd (5):
arm64: Unconditionally call unflatten_device_tree()
um: Unconditionally call unflatten_device_tree() x86/of: Unconditionally call unflatten_and_copy_device_tree()
of: Always unflatten in unflatten_and_copy_device_tree()
of: Add KUnit test to confirm DTB is loaded
arch/arm64/kernel/setup.c | 7 +++-- arch/um/kernel/dtb.c | 14 +++++----- arch/x86/kernel/devicetree.c | 24 +++++++++-------- drivers/of/.kunitconfig | 3 +++ drivers/of/Kconfig | 11 +++++++- drivers/of/Makefile | 4 ++- drivers/of/empty_root.dts | 6 +++++ drivers/of/fdt.c | 52 +++++++++++++++++++++++++----------- drivers/of/of_test.c | 48 +++++++++++++++++++++++++++++++++ drivers/of/platform.c | 3 --- drivers/of/unittest.c | 16 +++-------- include/linux/of.h | 25 ++++++++++------- 12 files changed, 151 insertions(+), 62 deletions(-) create mode 100644 drivers/of/.kunitconfig create mode 100644 drivers/of/empty_root.dts create mode 100644 drivers/of/of_test.c
[1] https://lore.kernel.org/r/[email protected]
base-commit: 0dd3ee31125508cd67f7e7172247f05b7fd1753a
Signature · 2 lines
https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git/ https://git.kernel.org/pub/scm/linux/kernel/git/sboyd/spmi.git
PATCH v2 1/7 arm64: Unconditionally call unflatten_device_tree()
Call this function unconditionally so that we can populate an empty DTB on platforms that don't boot with a firmware provided or builtin DTB. Override 'initial_boot_params' to NULL when ACPI is in use but the bootloader has loaded a DTB so that we don't allow both ACPI and DT to be used during boot. If there isn't a valid initial_boot_params dtb then unflatten_device_tree() returns early so this is fine.
--- arch/arm64/kernel/setup.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
arch/arm64/kernel/setup.c +5 -2
@@ -351,8 +351,11 @@ void __init __no_sanitize_address setup_arch(char **cmdline_p)/* Parse the ACPI tables for possible boot-time configuration */ acpi_boot_table_init (); -if (acpi_disabled) -unflatten_device_tree (); +/* Don't use the FDT from boot if ACPI is in use */ +if (!acpi_disabled) + initial_boot_params =NULL ; + +unflatten_device_tree ();bootmem_init ();
Signature · 2 lines
https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git/ https://git.kernel.org/pub/scm/linux/kernel/git/sboyd/spmi.git
Rob Herring
maintainerRe: [PATCH v2 1/7] arm64: Unconditionally call unflatten_device_tree()
Quoted 23 lines · Stephen Boyd
Call this function unconditionally so that we can populate an empty DTB on platforms that don't boot with a firmware provided or builtin DTB. Override '
initial_boot_params' to NULL when ACPI is in use but the bootloader has loaded a DTB so that we don't allow both ACPI and DT to be used during boot. If there isn't a validinitial_boot_paramsdtb thenunflatten_device_tree()returns early so this is fine.Cc Rob Herring <[email protected]>Cc Frank Rowand <[email protected]>Cc Catalin Marinas <[email protected]>Cc Will Deacon <[email protected]>Cc Mark Rutland <[email protected]>Cc <[email protected]>Signed-off-by Stephen Boyd <[email protected]>--- arch/arm64/kernel/setup.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)arch/arm64/kernel/setup.c +0
-0
arch/arm64/kernel/setup.c void __init __no_sanitize_address setup_arch(char **cmdline_p) · line 356
Quoted 8 lines
arch/arm64/kernel/setup.c +3
-2@@ -351,8 +351,11 @@ void __init __no_sanitize_address setup_arch(char **cmdline_p)/* Parse the ACPI tables for possible boot-time configuration */ acpi_boot_table_init (); -if (acpi_disabled) -unflatten_device_tree (); +/* Don't use the FDT from boot if ACPI is in use */ +if (!acpi_disabled) + initial_boot_params =NULL ;
I still think this is a problem for kexec. See of_kexec_alloc_and_setup_fdt(). You see it uses initial_boot_params. At first glance it looks like it would just write out everything we need. But for UEFI boot, I think we need all the chosen properties like linux,uefi-mmap-start preserved from the current boot for the next kernel we kexec.
I think you'll have to check acpi_disabled in unflatten_device_tree() and unflatten the empty tree leaving initial_boot_params alone. That means our FDT and unflattened tree will be different DTs, but I think that's fine.
Rob
Re: [PATCH v2 1/7] arm64: Unconditionally call unflatten_device_tree()
Quoting Rob Herring (2024-01-31 12:54:05)
Quoted 27 lines · Stephen Boyd
Quoted 26 lines
Call this function unconditionally so that we can populate an empty DTB on platforms that don't boot with a firmware provided or builtin DTB. Override '
initial_boot_params' to NULL when ACPI is in use but the bootloader has loaded a DTB so that we don't allow both ACPI and DT to be used during boot. If there isn't a validinitial_boot_paramsdtb thenunflatten_device_tree()returns early so this is fine.Cc Rob Herring <[email protected]>Cc Frank Rowand <[email protected]>Cc Catalin Marinas <[email protected]>Cc Will Deacon <[email protected]>Cc Mark Rutland <[email protected]>Cc <[email protected]>Signed-off-by Stephen Boyd <[email protected]>--- arch/arm64/kernel/setup.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)arch/arm64/kernel/setup.c +0
-0@@ -351,8 +351,11 @@ void __init __no_sanitize_address setup_arch(char **cmdline_p)/* Parse the ACPI tables for possible boot-time configuration */ acpi_boot_table_init ();
Quoted 12 lines
arch/arm64/kernel/setup.c void __init __no_sanitize_address setup_arch(char **cmdline_p) · line 356
Quoted 5 lines
arch/arm64/kernel/setup.c +3
-2-if (acpi_disabled) -unflatten_device_tree (); +/* Don't use the FDT from boot if ACPI is in use */ +if (!acpi_disabled) + initial_boot_params =NULL ;I still think this is a problem for kexec. See
of_kexec_alloc_and_setup_fdt(). You see it usesinitial_boot_params. At first glance it looks like it would just write out everything we need. But for UEFI boot, I think we need all the chosen properties like linux,uefi-mmap-start preserved from the current boot for the next kernel we kexec.
Ok, got it.
Quoted 5 lines
I think you'll have to check
acpi_disabledinunflatten_device_tree()and unflatten the empty tree leavinginitial_boot_paramsalone. That means our FDT and unflattened tree will be different DTs, but I think that's fine.
It's sort of scary given that 'initial_boot_params' is an exported global. Maybe that should be hidden away and accessed with a function instead so that this mismatch doesn't break something later on?
Rob Herring
maintainerRe: [PATCH v2 1/7] arm64: Unconditionally call unflatten_device_tree()
Quoted 44 lines · Stephen Boyd
Quoting Rob Herring (2024-01-31 12:54:05)
Quoted 27 lines · Stephen Boyd
Quoted 26 lines
Call this function unconditionally so that we can populate an empty DTB on platforms that don't boot with a firmware provided or builtin DTB. Override '
initial_boot_params' to NULL when ACPI is in use but the bootloader has loaded a DTB so that we don't allow both ACPI and DT to be used during boot. If there isn't a validinitial_boot_paramsdtb thenunflatten_device_tree()returns early so this is fine.Cc Rob Herring <[email protected]>Cc Frank Rowand <[email protected]>Cc Catalin Marinas <[email protected]>Cc Will Deacon <[email protected]>Cc Mark Rutland <[email protected]>Cc <[email protected]>Signed-off-by Stephen Boyd <[email protected]>--- arch/arm64/kernel/setup.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)arch/arm64/kernel/setup.c +0
-0@@ -351,8 +351,11 @@ void __init __no_sanitize_address setup_arch(char **cmdline_p)/* Parse the ACPI tables for possible boot-time configuration */ acpi_boot_table_init ();Quoted 12 lines
arch/arm64/kernel/setup.c void __init __no_sanitize_address setup_arch(char **cmdline_p) · line 356
Quoted 5 lines
arch/arm64/kernel/setup.c +3
-2-if (acpi_disabled) -unflatten_device_tree (); +/* Don't use the FDT from boot if ACPI is in use */ +if (!acpi_disabled) + initial_boot_params =NULL ;I still think this is a problem for kexec. See
of_kexec_alloc_and_setup_fdt(). You see it usesinitial_boot_params. At first glance it looks like it would just write out everything we need. But for UEFI boot, I think we need all the chosen properties like linux,uefi-mmap-start preserved from the current boot for the next kernel we kexec.Ok, got it.
Quoted 1 line
Quoted 8 lines
Quoted 4 lines
I think you'll have to check
acpi_disabledinunflatten_device_tree()and unflatten the empty tree leavinginitial_boot_paramsalone. That means our FDT and unflattened tree will be different DTs, but I think that's fine.It's sort of scary given that '
initial_boot_params' is an exported global. Maybe that should be hidden away and accessed with a function instead so that this mismatch doesn't break something later on?
What you see now is after I did a pass of minimizing the number of users.
BTW, I've now got another use for unconditionally calling unflatten_device_tree() with this[1].
Rob
PATCH v2 2/7 um: Unconditionally call unflatten_device_tree()
In reply to Stephen BoydCall this function unconditionally so that we can populate an empty DTB on platforms that don't boot with a command line provided DTB. There's no harm in calling unflatten_device_tree() unconditionally. If there isn't a valid initial_boot_params dtb then unflatten_device_tree() returns early.
--- arch/um/kernel/dtb.c | 14 +++++++------- drivers/of/unittest.c | 4 ---- 2 files changed, 7 insertions(+), 11 deletions(-)
arch/um/kernel/dtb.c +7 -7
@@ -16,16 +16,16 @@ void uml_dtb_init(void)void *area; area =uml_load_file (dtb, &size); -if (!area) -return ; +if (area) { +if (!early_init_dt_scan (area)) { +pr_err ("invalid DTB %s\n" , dtb); +memblock_free (area, size); +return ; + } -if (!early_init_dt_scan (area)) { -pr_err ("invalid DTB %s\n" , dtb); -memblock_free (area, size); -return ; +early_init_fdt_scan_reserved_mem (); } -early_init_fdt_scan_reserved_mem ();unflatten_device_tree (); }
drivers/of/unittest.c +0 -4
@@ -4075,10 +4075,6 @@ static int __init of_unittest(void)add_taint (TAINT_TEST ,LOCKDEP_STILL_OK );/* adding data for unittest */ - -if (IS_ENABLED (CONFIG_UML )) -unittest_unflatten_overlay_base (); - res =unittest_data_add ();if (res)return res;
Signature · 2 lines
https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git/ https://git.kernel.org/pub/scm/linux/kernel/git/sboyd/spmi.git
PATCH v2 3/7 x86/of: Unconditionally call unflatten_and_copy_device_tree()
In reply to Stephen BoydCall this function unconditionally so that we can populate an empty DTB on platforms that don't boot with a firmware provided or builtin DTB.
--- arch/x86/kernel/devicetree.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-)
arch/x86/kernel/devicetree.c +13 -11
@@ -283,22 +283,24 @@ void __init x86_flattree_get_config(void)u32 size, map_len;void *dt; -if (!initial_dtb) -return ; +if (initial_dtb) { + map_len =max (PAGE_SIZE - (initial_dtb & ~PAGE_MASK ), (u64 )128 ); - map_len =max (PAGE_SIZE - (initial_dtb & ~PAGE_MASK ), (u64 )128 ); + dt =early_memremap (initial_dtb, map_len); + size =fdt_totalsize (dt); +if (map_len < size) { +early_memunmap (dt, map_len); + dt =early_memremap (initial_dtb, size); + map_len = size; + } - dt =early_memremap (initial_dtb, map_len); - size =fdt_totalsize (dt); -if (map_len < size) { -early_memunmap (dt, map_len); - dt =early_memremap (initial_dtb, size); - map_len = size; +early_init_dt_verify (dt); } -early_init_dt_verify (dt);unflatten_and_copy_device_tree (); - early_memunmap(dt, map_len); + +if (initial_dtb) + early_memunmap(dt, map_len); }#endif
Signature · 2 lines
https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git/ https://git.kernel.org/pub/scm/linux/kernel/git/sboyd/spmi.git
Re: [PATCH v2 3/7] x86/of: Unconditionally call unflatten_and_copy_device_tree()
Quoted 60 lines · Stephen Boyd
Call this function unconditionally so that we can populate an empty DTB on platforms that don't boot with a firmware provided or builtin DTB.
Cc Rob Herring <[email protected]>Cc Frank Rowand <[email protected]>Cc Thomas Gleixner <[email protected]>Cc Ingo Molnar <[email protected]>Cc Borislav Petkov <[email protected]>Cc Dave Hansen <[email protected]>Cc <[email protected]>Cc "H. Peter Anvin" <[email protected]>Cc Saurabh Sengar <[email protected]>Signed-off-by Stephen Boyd <[email protected]>--- arch/x86/kernel/devicetree.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-)arch/x86/kernel/devicetree.c +13
-11@@ -283,22 +283,24 @@ void __init x86_flattree_get_config(void)u32 size, map_len;void *dt; -if (!initial_dtb) -return ; +if (initial_dtb) { + map_len =max (PAGE_SIZE - (initial_dtb & ~PAGE_MASK ), (u64 )128 ); - map_len =max (PAGE_SIZE - (initial_dtb & ~PAGE_MASK ), (u64 )128 ); + dt =early_memremap (initial_dtb, map_len); + size =fdt_totalsize (dt); +if (map_len < size) { +early_memunmap (dt, map_len); + dt =early_memremap (initial_dtb, size); + map_len = size; + } - dt =early_memremap (initial_dtb, map_len); - size =fdt_totalsize (dt); -if (map_len < size) { -early_memunmap (dt, map_len); - dt =early_memremap (initial_dtb, size); - map_len = size; +early_init_dt_verify (dt); } -early_init_dt_verify (dt);unflatten_and_copy_device_tree (); - early_memunmap(dt, map_len); + +if (initial_dtb) + early_memunmap(dt, map_len); }#endif Signature · 2 lines
https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git/ https://git.kernel.org/pub/scm/linux/kernel/git/sboyd/spmi.git
Tested the series in Hyper-V environment. Please feel free to add:
PATCH v2 4/7 of: Always unflatten in unflatten_and_copy_device_tree()
In reply to Stephen BoydWe want to populate an empty DT whenever CONFIG_OF is enabled so that overlays can be applied and the DT unit tests can be run. Make unflatten_and_copy_device_tree() stop printing a warning if the 'initial_boot_params' pointer is NULL. Instead, simply copy the dtb if there is one and then unflatten it. If there isn't a DT to copy, then the call to unflatten_device_tree() is largely a no-op, so nothing really changes here.
--- drivers/of/fdt.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-)
drivers/of/fdt.c +17 -15
@@ -1318,6 +1318,21 @@ bool __init early_init_dt_scan(void *params)return true; } +static void __init copy_device_tree (void ) +{ +int size; +void *dt; + + size =fdt_totalsize (initial_boot_params); + dt =early_init_dt_alloc_memory_arch (size, +roundup_pow_of_two (FDT_V17_SIZE )); + +if (dt) { +memcpy (dt, initial_boot_params, size); + initial_boot_params = dt; + } +} +/** * unflatten_device_tree - create tree of device_nodes from flat blob *
@@ -1350,22 +1365,9 @@ void __init unflatten_device_tree(void)*/ void __init unflatten_and_copy_device_tree (void ) { -int size; -void *dt; +if (initial_boot_params) +copy_device_tree (); -if (!initial_boot_params) { -pr_warn ("No valid device tree found, continuing without\n" ); -return ; - } - - size =fdt_totalsize (initial_boot_params); - dt =early_init_dt_alloc_memory_arch (size, -roundup_pow_of_two (FDT_V17_SIZE )); - -if (dt) { -memcpy (dt, initial_boot_params, size); - initial_boot_params = dt; - }unflatten_device_tree (); }
Signature · 2 lines
https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git/ https://git.kernel.org/pub/scm/linux/kernel/git/sboyd/spmi.git
PATCH v2 5/7 of: Create of_root if no dtb provided by firmware
In reply to Stephen BoydFrom: Frank Rowand <[email protected]>
When enabling CONFIG_OF on a platform where 'of_root' is not populated by firmware, we end up without a root node. In order to apply overlays and create subnodes of the root node, we need one. Create this root node by unflattening an empty builtin dtb.
If firmware provides a flattened device tree (FDT) then the FDT is unflattened via setup_arch(). Otherwise, the call to unflatten(_and_copy)?_device_tree() will create an empty root node.
We make of_have_populated_dt() return true only if the DTB was loaded by firmware so that existing callers don't change behavior after this patch. The call in the of platform code is removed because it prevents overlays from creating platform devices when the platform bus isn't fully initialized.
[[email protected]: Update of_have_populated_dt() to treat this empty dtb as not populated. Drop setup_of() initcall]
--- drivers/of/Kconfig | 2 +- drivers/of/Makefile | 2 +- drivers/of/empty_root.dts | 6 ++++++ drivers/of/fdt.c | 20 ++++++++++++++++++++ drivers/of/platform.c | 3 --- include/linux/of.h | 25 +++++++++++++++---------- 6 files changed, 43 insertions(+), 15 deletions(-) create mode 100644 drivers/of/empty_root.dts
drivers/of/Kconfig +1 -1
@@ -54,7 +54,7 @@ config OF_FLATTREE select CRC32 config OF_EARLY_FLATTREE - bool + def_bool OF && !SPARC select DMA_DECLARE_COHERENT if HAS_DMA && HAS_IOMEM select OF_FLATTREE
drivers/of/Makefile +1 -1
@@ -2,7 +2,7 @@ obj-y = base.o cpu.o device.o module.o platform.o property.o obj-$(CONFIG_OF_KOBJ) += kobj.o obj-$(CONFIG_OF_DYNAMIC) += dynamic.o -obj-$(CONFIG_OF_FLATTREE) += fdt.o +obj-$(CONFIG_OF_FLATTREE) += fdt.o empty_root.dtb.o obj-$(CONFIG_OF_EARLY_FLATTREE) += fdt_address.o obj-$(CONFIG_OF_PROMTREE) += pdt.o obj-$(CONFIG_OF_ADDRESS) += address.o
drivers/of/empty_root.dts new file +6 -0
@@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0-only +/dts-v1/; + +/ { + +};
drivers/of/fdt.c +20 -0
@@ -32,6 +32,13 @@#include "of_private.h" +/* +* __dtb_empty_root_begin[] and __dtb_empty_root_end[] magically created by +* cmd_dt_S_dtb in scripts/Makefile.lib +*/ +extern uint8_t __dtb_empty_root_begin[]; +extern uint8_t __dtb_empty_root_end[]; +/* * of_fdt_limit_memory - limit the number of regions in the /memory node * @limit: maximum entries
@@ -1343,6 +1350,19 @@ static void __init copy_device_tree(void)*/ void __init unflatten_device_tree (void ) { +if (!initial_boot_params) { + initial_boot_params = (void *) __dtb_empty_root_begin; +/* fdt_totalsize() will be used for copy size */ +if (fdt_totalsize (initial_boot_params) > + __dtb_empty_root_end - __dtb_empty_root_begin) { +pr_err ("invalid size in dtb_empty_root\n" ); +return ; + } + of_fdt_crc32 =crc32_be (~0 , initial_boot_params, +fdt_totalsize (initial_boot_params)); +copy_device_tree (); + } +__unflatten_device_tree (initial_boot_params,NULL , &of_root, early_init_dt_alloc_memory_arch, false);
drivers/of/platform.c +0 -3
@@ -549,9 +549,6 @@ static int __init of_platform_default_populate_init(void)device_links_supplier_sync_state_pause (); -if (!of_have_populated_dt ()) -return -ENODEV ; -if (IS_ENABLED (CONFIG_PPC )) {struct device_node *boot_display =NULL ;struct platform_device *dev;
include/linux/of.h +15 -10
@@ -180,11 +180,6 @@ static inline bool is_of_node(const struct fwnode_handle *fwnode) &__of_fwnode_handle_node->fwnode : NULL; \ }) -static inline bool of_have_populated_dt (void ) -{ -return of_root !=NULL ; -} -static inline bool of_node_is_root (const struct device_node *node) {return node && (node->parent ==NULL );
@@ -549,11 +544,6 @@ static inline struct device_node *of_find_node_with_property(#define of_fwnode_handle (node) NULL -static inline bool of_have_populated_dt (void ) -{ -return false; -} -static inline struct device_node *of_get_compatible_child (const struct device_node *parent,const char *compatible) {
@@ -1634,6 +1624,21 @@ static inline bool of_device_is_system_power_controller(const struct device_nodereturn of_property_read_bool (np,"system-power-controller" ); } +/** +* of_have_populated_dt() - Has DT been populated by bootloader +* +* Return: True if a DTB has been populated by the bootloader and it isn't the +* empty builtin one. False otherwise. +*/ +static inline bool of_have_populated_dt (void ) +{ +#ifdef CONFIG_OF +return of_property_present (of_root,"compatible" ); +#else +return false; +#endif +} +/* * Overlay support */
Signature · 2 lines
https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git/ https://git.kernel.org/pub/scm/linux/kernel/git/sboyd/spmi.git
PATCH v2 6/7 of: unittest: treat missing of_root as error instead of fixing up
In reply to Stephen BoydFrom: Frank Rowand <[email protected]>
unflatten_device_tree() now ensures that the 'of_root' node is populated with the root of a default empty devicetree. Remove the unittest code that created 'of_root' if it was missing. Verify that 'of_root' is valid before attempting to attach the testcase-data subtree. Remove the unittest code that unflattens the unittest overlay base if architecture is UML because that is always done now.
--- drivers/of/unittest.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-)
drivers/of/unittest.c +4 -8
@@ -1732,20 +1732,16 @@ static int __init unittest_data_add(void)return -EINVAL ; } +/* attach the sub-tree to live tree */ 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 ; +pr_warn ("%s: no live tree to attach sub-tree\n" , __func__); +kfree (unittest_data); +return -ENODEV ; }EXPECT_BEGIN (KERN_INFO ,"Duplicate name in testcase-data, renamed to \"duplicate-name#1\"" ); -/* attach the sub-tree to live tree */ np = unittest_data_node->child;while (np) {struct device_node *next = np->sibling;
Signature · 2 lines
https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git/ https://git.kernel.org/pub/scm/linux/kernel/git/sboyd/spmi.git
PATCH v2 7/7 of: Add KUnit test to confirm DTB is loaded
In reply to Stephen BoydAdd a KUnit test that confirms a DTB has been loaded, i.e. there is a root node, and that the of_have_populated_dt() API works properly.
--- drivers/of/.kunitconfig | 3 +++ drivers/of/Kconfig | 9 ++++++++ drivers/of/Makefile | 2 ++ drivers/of/of_test.c | 48 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+) create mode 100644 drivers/of/.kunitconfig create mode 100644 drivers/of/of_test.c
drivers/of/.kunitconfig new file +3 -0
@@ -0,0 +1,3 @@ +CONFIG_KUNIT=y +CONFIG_OF=y +CONFIG_OF_KUNIT_TEST=y
drivers/of/Kconfig +9 -0
@@ -37,6 +37,15 @@ config OF_UNITTEST If unsure, say N here. This option is not safe to enable. +config OF_KUNIT_TEST + tristate "Devicetree KUnit Test" if !KUNIT_ALL_TESTS + depends on KUNIT + default KUNIT_ALL_TESTS + help + This option builds KUnit unit tests for device tree infrastructure. + + If unsure, say N here, but this option is safe to enable. + config OF_ALL_DTBS bool "Build all Device Tree Blobs" depends on COMPILE_TEST
drivers/of/Makefile +2 -0
@@ -19,4 +19,6 @@ obj-y += kexec.o endif endif +obj-$(CONFIG_OF_KUNIT_TEST) += of_test.o + obj-$(CONFIG_OF_UNITTEST) += unittest-data/
drivers/of/of_test.c new file +48 -0
48 lines not on this page · raw message
Signature · 2 lines
https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git/ https://git.kernel.org/pub/scm/linux/kernel/git/sboyd/spmi.git