Skip to contentSkip to conversation

clk: Add kunit tests for fixed rate and parent data

PATCH Applied Stephen Boyd 3 participants 34 messages Jul 18, 2024 – Oct 9, 2024

Subsystems (8)
lore
Share & tools
lore

Stephen Boyd

author maintainer
#0 lore raw

v8 cover clk: Add kunit tests for fixed rate and parent data

This patch series adds unit tests for the clk fixed rate basic type and the clk registration functions that use struct clk_parent_data. To get there, we add support for loading device tree overlays onto the live DTB along with probing platform drivers to bind to device nodes in the overlays. With this series, we're able to exercise some of the code in the common clk framework that uses devicetree lookups to find parents and the fixed rate clk code that scans device tree directly and creates clks. Please review.

I Cced everyone to all the patches so they get the full context. I'm hoping I can take the whole pile through the clk tree as they all build upon each other. Or the DT part can be merged through the DT tree to reduce the dependencies.

Changes from v7: https://lore.kernel.org/r/[email protected]
* Support modular builds properly by compiling overlay with tests into one .ko
* Fold in thinko fix from Geert to DT overlay application patch
* Export device_is_bound() to fix module build
* Add more module license and description

Changes from v6: https://lore.kernel.org/r/[email protected]
* Fix kasan error in platform test by fixing the condition to check for correct free callback
* Add module descriptions to new modules

Changes from v5: https://lore.kernel.org/r/[email protected]
* Pick up reviewed-by tags
* Drop test vendor prefix bindings as dtschema allows anything now
* Use of_node_put_kunit() more to plug some reference leaks
* Select DTC config to avoid compile fails because of missing dtc
* Don't skip for OF_OVERLAY in overlay tests because they depend on it

Changes from v4: https://lore.kernel.org/r/[email protected]
* Picked up reviewed-by tags
* Check for non-NULL device pointers before calling put_device()
* Fix CFI issues with kunit actions
* Introduce platform_device_prepare_wait_for_probe() helper to wait for a platform device to probe
* Move platform code to lib/kunit and rename functions to have kunit prefix
* Fix issue with platform wrappers messing up reference counting because they used kunit actions
* New patch to populate overlay devices on root node for powerpc
* Make fixed-rate binding generic single clk consumer binding

Changes from v3: https://lore.kernel.org/r/[email protected]
* No longer depend on Frank's series[1] because it was merged upstream[2]
* Use kunit_add_action_or_reset() to shorten code
* Skip tests properly when CONFIG_OF_OVERLAY isn't set

Changes from v2: https://lore.kernel.org/r/[email protected]
* Overlays don't depend on __symbols__ node
* Depend on Frank's always create root node if CONFIG_OF series[1]
* Added kernel-doc to KUnit API doc
* Fixed some kernel-doc on functions
* More test cases for fixed rate clk

Changes from v1: https://lore.kernel.org/r/[email protected]
* Don't depend on UML, use unittest data approach to attach nodes
* Introduce overlay loading API for KUnit
* Move platform_device KUnit code to drivers/base/test
* Use #define macros for constants shared between unit tests and overlays
* Settle on "test" as a vendor prefix
* Make KUnit wrappers have "_kunit" postfix

[1] https://lore.kernel.org/r/[email protected]
[2] https://lore.kernel.org/r/[email protected]

Stephen Boyd (8):
of/platform: Allow overlays to create platform devices from the root
node
of: Add test managed wrappers for of_overlay_apply()/of_node_put()
dt-bindings: vendor-prefixes: Add "test" vendor for KUnit and friends
of: Add a KUnit test for overlays and test managed APIs
platform: Add test managed platform_device/driver APIs
clk: Add test managed clk provider/consumer APIs
clk: Add KUnit tests for clk fixed rate basic type
clk: Add KUnit tests for clks registered with struct clk_parent_data

 Documentation/dev-tools/kunit/api/clk.rst     |  10 +
 Documentation/dev-tools/kunit/api/index.rst   |  21 +
 Documentation/dev-tools/kunit/api/of.rst      |  13 +
 .../dev-tools/kunit/api/platformdevice.rst    |  10 +
 .../devicetree/bindings/vendor-prefixes.yaml  |   2 +
 drivers/base/dd.c                             |   1 +
 drivers/clk/.kunitconfig                      |   2 +
 drivers/clk/Kconfig                           |  11 +
 drivers/clk/Makefile                          |  11 +-
 drivers/clk/clk-fixed-rate_test.c             | 380 +++++++++++++++
 drivers/clk/clk-fixed-rate_test.h             |   8 +
 drivers/clk/clk_kunit_helpers.c               | 207 ++++++++
 drivers/clk/clk_parent_data_test.h            |  10 +
 drivers/clk/clk_test.c                        | 453 +++++++++++++++++-
 drivers/clk/kunit_clk_fixed_rate_test.dtso    |  19 +
 drivers/clk/kunit_clk_parent_data_test.dtso   |  28 ++
 drivers/of/.kunitconfig                       |   1 +
 drivers/of/Kconfig                            |  10 +
 drivers/of/Makefile                           |   3 +
 drivers/of/kunit_overlay_test.dtso            |   9 +
 drivers/of/of_kunit_helpers.c                 |  77 +++
 drivers/of/overlay_test.c                     | 115 +++++
 drivers/of/platform.c                         |   9 +-
 include/kunit/clk.h                           |  28 ++
 include/kunit/of.h                            | 115 +++++
 include/kunit/platform_device.h               |  20 +
 lib/kunit/Makefile                            |   4 +-
 lib/kunit/platform-test.c                     | 224 +++++++++
 lib/kunit/platform.c                          | 302 ++++++++++++
 29 files changed, 2097 insertions(+), 6 deletions(-)
 create mode 100644 Documentation/dev-tools/kunit/api/clk.rst
 create mode 100644 Documentation/dev-tools/kunit/api/of.rst
 create mode 100644 Documentation/dev-tools/kunit/api/platformdevice.rst
 create mode 100644 drivers/clk/clk-fixed-rate_test.c
 create mode 100644 drivers/clk/clk-fixed-rate_test.h
 create mode 100644 drivers/clk/clk_kunit_helpers.c
 create mode 100644 drivers/clk/clk_parent_data_test.h
 create mode 100644 drivers/clk/kunit_clk_fixed_rate_test.dtso
 create mode 100644 drivers/clk/kunit_clk_parent_data_test.dtso
 create mode 100644 drivers/of/kunit_overlay_test.dtso
 create mode 100644 drivers/of/of_kunit_helpers.c
 create mode 100644 drivers/of/overlay_test.c
 create mode 100644 include/kunit/clk.h
 create mode 100644 include/kunit/of.h
 create mode 100644 include/kunit/platform_device.h
 create mode 100644 lib/kunit/platform-test.c
 create mode 100644 lib/kunit/platform.c

base-commit: 1613e604df0cd359cf2a7fbd9be7a0bcfacfabd0

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
author maintainer
#1 lore raw

PATCH v8 1/8 of/platform: Allow overlays to create platform devices from the root node

We'd like to apply overlays to the root node in KUnit so we can test platform devices created as children of the root node.

On some architectures (powerpc), the root node isn't marked with OF_POPULATED_BUS. If an overlay tries to modify the root node on these platforms it will fail, while on other platforms, such as ARM, it will succeed. This is because the root node is marked with OF_POPULATED_BUS by of_platform_default_populate_init() calling of_platform_default_populate() with NULL as the first argument.

Loosen the requirement here so that platform devices can be created for nodes created as children of the root node via DT overlays even if the platform bus wasn't populated for the root node.

---
 drivers/of/platform.c | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/of/platform.c +6 -3
index 389d4ea6bfc1..86be4dfb9323 100644
@@ -732,11 +732,14 @@ static int of_platform_notify(struct notifier_block *nb,
 	struct of_reconfig_data *rd = arg;
 	struct platform_device *pdev_parent, *pdev;
 	bool children_left;
+	struct device_node *parent;
 
 	switch (of_reconfig_get_state_change(action, rd)) {
 	case OF_RECONFIG_CHANGE_ADD:
-		/* verify that the parent is a bus */
-		if (!of_node_check_flag(rd->dn->parent, OF_POPULATED_BUS))
+		parent = rd->dn->parent;
+		/* verify that the parent is a bus (or the root node) */
+		if (!of_node_is_root(parent) &&
+		    !of_node_check_flag(parent, OF_POPULATED_BUS))
 			return NOTIFY_OK;	/* not for us */
 
 		/* already populated? (driver using of_populate manually) */
@@ -749,7 +752,7 @@ static int of_platform_notify(struct notifier_block *nb,
 		 */
 		rd->dn->fwnode.flags &= ~FWNODE_FLAG_NOT_DEVICE;
 		/* pdev_parent may be NULL when no bus platform device */
-		pdev_parent = of_find_device_by_node(rd->dn->parent);
+		pdev_parent = of_find_device_by_node(parent);
 		pdev = of_platform_device_create(rd->dn, NULL,
 				pdev_parent ? &pdev_parent->dev : NULL);
 		platform_device_put(pdev_parent);
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
author maintainer Applied
#2 lore raw

Re: [PATCH v8 1/8] of/platform: Allow overlays to create platform devices from the root node

Quoting Stephen Boyd (2024-07-18 14:05:00)

Quoted 14 lines

We'd like to apply overlays to the root node in KUnit so we can test platform devices created as children of the root node.

On some architectures (powerpc), the root node isn't marked with OF_POPULATED_BUS. If an overlay tries to modify the root node on these platforms it will fail, while on other platforms, such as ARM, it will succeed. This is because the root node is marked with OF_POPULATED_BUS by of_platform_default_populate_init() calling of_platform_default_populate() with NULL as the first argument.

Loosen the requirement here so that platform devices can be created for nodes created as children of the root node via DT overlays even if the platform bus wasn't populated for the root node.

Quoted 6 lines

---

Applied to clk-next

author maintainer
#3 lore raw

PATCH v8 2/8 of: Add test managed wrappers for of_overlay_apply()/of_node_put()

In reply to Stephen Boyd

Add test managed wrappers for of_overlay_apply() that automatically removes the overlay when the test is finished. This API is intended for use by KUnit tests that test code which relies on 'struct device_node's and of_*() APIs.

KUnit tests will call of_overlay_apply_kunit() to load an overlay that's been built into the kernel image. When the test is complete, the overlay will be removed.

This has a few benefits:

1) It keeps the tests hermetic because the overlay is removed when the test is complete. Tests won't even be aware that an overlay was loaded in another test.

2) The overlay code can live right next to the unit test that loads it. The overlay and the unit test can be compiled into one kernel module if desired.

3) We can test different device tree configurations by loading different overlays. The overlays can be written for a specific test, and there can be many of them loaded per-test without needing to jam all possible combinations into one DTB.

4) It also allows KUnit to test device tree dependent code on any architecture, not just UML. This allows KUnit tests to test architecture specific device tree code.

There are some potential pitfalls though. Test authors need to be careful to not overwrite properties in the live tree. The easiest way to do this is to add and remove nodes with a 'kunit-' prefix, almost guaranteeing that the same node won't be present in the tree loaded at boot.

---
 Documentation/dev-tools/kunit/api/index.rst |  11 ++
 Documentation/dev-tools/kunit/api/of.rst    |  13 +++
 drivers/of/Makefile                         |   1 +
 drivers/of/of_kunit_helpers.c               |  77 +++++++++++++
 include/kunit/of.h                          | 115 ++++++++++++++++++++
 5 files changed, 217 insertions(+)
 create mode 100644 Documentation/dev-tools/kunit/api/of.rst
 create mode 100644 drivers/of/of_kunit_helpers.c
 create mode 100644 include/kunit/of.h
Documentation/dev-tools/kunit/api/index.rst +11 -0
index 2d8f756aab56..282befa17edf 100644
@@ -9,11 +9,15 @@ API Reference
 	test
 	resource
 	functionredirection
+	of
 
 
 This page documents the KUnit kernel testing API. It is divided into the
 following sections:
 
+Core KUnit API
+==============
+
 Documentation/dev-tools/kunit/api/test.rst
 
  - Documents all of the standard testing API
@@ -25,3 +29,10 @@ Documentation/dev-tools/kunit/api/resource.rst
 Documentation/dev-tools/kunit/api/functionredirection.rst
 
  - Documents the KUnit Function Redirection API
+
+Driver KUnit API
+================
+
+Documentation/dev-tools/kunit/api/of.rst
+
+ - Documents the KUnit device tree (OF) API
Documentation/dev-tools/kunit/api/of.rst new file +13 -0
new file mode 100644
index 000000000000..cb4193dcddbb
@@ -0,0 +1,13 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+====================
+Device Tree (OF) API
+====================
+
+The KUnit device tree API is used to test device tree (of_*) dependent code.
+
+.. kernel-doc:: include/kunit/of.h
+   :internal:
+
+.. kernel-doc:: drivers/of/of_kunit_helpers.c
+   :export:
drivers/of/Makefile +1 -0
index 251d33532148..2ae909adde49 100644
@@ -19,6 +19,7 @@ obj-y	+= kexec.o
 endif
 endif
 
+obj-$(CONFIG_KUNIT) += of_kunit_helpers.o
 obj-$(CONFIG_OF_KUNIT_TEST) += of_test.o
 
 obj-$(CONFIG_OF_UNITTEST) += unittest-data/
drivers/of/of_kunit_helpers.c new file +77 -0

77 lines not on this page · raw message

include/kunit/of.h new file +115 -0

115 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
author maintainer Applied
#4 lore raw

Re: [PATCH v8 2/8] of: Add test managed wrappers for of_overlay_apply()/of_node_put()

Quoting Stephen Boyd (2024-07-18 14:05:01)

Quoted 34 lines

Add test managed wrappers for of_overlay_apply() that automatically removes the overlay when the test is finished. This API is intended for use by KUnit tests that test code which relies on 'struct device_node's and of_*() APIs.

KUnit tests will call of_overlay_apply_kunit() to load an overlay that's been built into the kernel image. When the test is complete, the overlay will be removed.

This has a few benefits:

1) It keeps the tests hermetic because the overlay is removed when the test is complete. Tests won't even be aware that an overlay was loaded in another test.

2) The overlay code can live right next to the unit test that loads it. The overlay and the unit test can be compiled into one kernel module if desired.

3) We can test different device tree configurations by loading different overlays. The overlays can be written for a specific test, and there can be many of them loaded per-test without needing to jam all possible combinations into one DTB.

4) It also allows KUnit to test device tree dependent code on any architecture, not just UML. This allows KUnit tests to test architecture specific device tree code.

There are some potential pitfalls though. Test authors need to be careful to not overwrite properties in the live tree. The easiest way to do this is to add and remove nodes with a 'kunit-' prefix, almost guaranteeing that the same node won't be present in the tree loaded at boot.

Quoted 7 lines

---

Applied to clk-next

author maintainer
#5 lore raw

PATCH v8 3/8 dt-bindings: vendor-prefixes: Add "test" vendor for KUnit and friends

In reply to Stephen Boyd

Add the vendor prefix "test" to reserve a vendor prefix for bindings that are purely for testing device tree code. This allows test code to write bindings that can be checked by the schema validator.

---
 Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++
 1 file changed, 2 insertions(+)
Documentation/devicetree/bindings/vendor-prefixes.yaml +2 -0
index fbf47f0bacf1..02a22c2722ec 100644
@@ -1456,6 +1456,8 @@ patternProperties:
     description: Terasic Inc.
   "^tesla,.*":
     description: Tesla, Inc.
+  "^test,.*":
+    description: Reserved for use by tests. For example, KUnit.
   "^tfc,.*":
     description: Three Five Corp
   "^thead,.*":
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
author maintainer Applied
#6 lore raw

Re: [PATCH v8 3/8] dt-bindings: vendor-prefixes: Add "test" vendor for KUnit and friends

Quoting Stephen Boyd (2024-07-18 14:05:02)

Quoted 10 lines

Add the vendor prefix "test" to reserve a vendor prefix for bindings that are purely for testing device tree code. This allows test code to write bindings that can be checked by the schema validator.

---

Applied to clk-next

author maintainer
#7 lore raw

PATCH v8 4/8 of: Add a KUnit test for overlays and test managed APIs

In reply to Stephen Boyd

Test the KUnit test managed overlay APIs. Confirm that platform devices are created and destroyed properly. This provides us confidence that the test managed APIs work correctly and can be relied upon to provide tests with fake platform devices and device nodes via overlays compiled into the kernel image.

Cc Rob Herring <[email protected]>
Cc Saravana Kannan <[email protected]>
Cc Daniel Latypov <[email protected]>
Cc Brendan Higgins <[email protected]>
Cc Rae Moar <[email protected]>
---
 drivers/of/.kunitconfig            |   1 +
 drivers/of/Kconfig                 |  10 +++
 drivers/of/Makefile                |   2 +
 drivers/of/kunit_overlay_test.dtso |   9 +++
 drivers/of/overlay_test.c          | 115 +++++++++++++++++++++++++++++
 5 files changed, 137 insertions(+)
 create mode 100644 drivers/of/kunit_overlay_test.dtso
 create mode 100644 drivers/of/overlay_test.c
drivers/of/.kunitconfig +1 -0
index 5a8fee11978c..4c53d2c7a275 100644
@@ -1,3 +1,4 @@
 CONFIG_KUNIT=y
 CONFIG_OF=y
 CONFIG_OF_KUNIT_TEST=y
+CONFIG_OF_OVERLAY_KUNIT_TEST=y
drivers/of/Kconfig +10 -0
index dd726c7056bf..0e2d608c3e20 100644
@@ -107,6 +107,16 @@ config OF_OVERLAY
 	  While this option is selected automatically when needed, you can
 	  enable it manually to improve device tree unit test coverage.
 
+config OF_OVERLAY_KUNIT_TEST
+	tristate "Device Tree overlay KUnit tests" if !KUNIT_ALL_TESTS
+	depends on KUNIT
+	default KUNIT_ALL_TESTS
+	select OF_OVERLAY
+	help
+	  This option builds KUnit unit tests for the device tree overlay code.
+
+	  If unsure, say N here, but this option is safe to enable.
+
 config OF_NUMA
 	bool
 
drivers/of/Makefile +2 -0
index 2ae909adde49..379a0afcbdc0 100644
@@ -21,5 +21,7 @@ endif
 
 obj-$(CONFIG_KUNIT) += of_kunit_helpers.o
 obj-$(CONFIG_OF_KUNIT_TEST) += of_test.o
+obj-$(CONFIG_OF_OVERLAY_KUNIT_TEST) += overlay-test.o
+overlay-test-y := overlay_test.o kunit_overlay_test.dtbo.o
 
 obj-$(CONFIG_OF_UNITTEST) += unittest-data/
drivers/of/kunit_overlay_test.dtso new file +9 -0
new file mode 100644
index 000000000000..85f20b4b4c16
@@ -0,0 +1,9 @@
+// SPDX-License-Identifier: GPL-2.0
+/dts-v1/;
+/plugin/;
+
+&{/} {
+	kunit-test {
+		compatible = "test,empty";
+	};
+};
drivers/of/overlay_test.c new file +115 -0

115 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
author maintainer Applied
#8 lore raw

Re: [PATCH v8 4/8] of: Add a KUnit test for overlays and test managed APIs

Quoting Stephen Boyd (2024-07-18 14:05:03)

Quoted 14 lines

Test the KUnit test managed overlay APIs. Confirm that platform devices are created and destroyed properly. This provides us confidence that the test managed APIs work correctly and can be relied upon to provide tests with fake platform devices and device nodes via overlays compiled into the kernel image.

Cc Rob Herring <[email protected]>
Cc Saravana Kannan <[email protected]>
Cc Daniel Latypov <[email protected]>
Cc Brendan Higgins <[email protected]>
Cc Rae Moar <[email protected]>
Quoted 1 line

---

Applied to clk-next

author maintainer
#9 lore raw

PATCH v8 5/8 platform: Add test managed platform_device/driver APIs

In reply to Stephen Boyd

Introduce KUnit resource wrappers around platform_driver_register(), platform_device_alloc(), and platform_device_add() so that test authors can register platform drivers/devices from their tests and have the drivers/devices automatically be unregistered when the test is done.

This makes test setup code simpler when a platform driver or platform device is needed. Add a few test cases at the same time to make sure the APIs work as intended.

---
 Documentation/dev-tools/kunit/api/index.rst   |   5 +
 .../dev-tools/kunit/api/platformdevice.rst    |  10 +
 drivers/base/dd.c                             |   1 +
 include/kunit/platform_device.h               |  20 ++
 lib/kunit/Makefile                            |   4 +-
 lib/kunit/platform-test.c                     | 224 +++++++++++++
 lib/kunit/platform.c                          | 302 ++++++++++++++++++
 7 files changed, 565 insertions(+), 1 deletion(-)
 create mode 100644 Documentation/dev-tools/kunit/api/platformdevice.rst
 create mode 100644 include/kunit/platform_device.h
 create mode 100644 lib/kunit/platform-test.c
 create mode 100644 lib/kunit/platform.c
Documentation/dev-tools/kunit/api/index.rst +5 -0
index 282befa17edf..02b26f5e8750 100644
@@ -10,6 +10,7 @@ API Reference
 	resource
 	functionredirection
 	of
+	platformdevice
 
 
 This page documents the KUnit kernel testing API. It is divided into the
@@ -36,3 +37,7 @@ Driver KUnit API
 Documentation/dev-tools/kunit/api/of.rst
 
  - Documents the KUnit device tree (OF) API
+
+Documentation/dev-tools/kunit/api/platformdevice.rst
+
+ - Documents the KUnit platform device API
Documentation/dev-tools/kunit/api/platformdevice.rst new file +10 -0
new file mode 100644
index 000000000000..49ddd5729003
@@ -0,0 +1,10 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+===================
+Platform Device API
+===================
+
+The KUnit platform device API is used to test platform devices.
+
+.. kernel-doc:: lib/kunit/platform.c
+   :export:
drivers/base/dd.c +1 -0
index 83d352394fdf..114c4ae2a39b 100644
@@ -393,6 +393,7 @@ bool device_is_bound(struct device *dev)
 {
 	return dev->p && klist_node_attached(&dev->p->knode_driver);
 }
+EXPORT_SYMBOL_GPL(device_is_bound);
 
 static void driver_bound(struct device *dev)
 {
include/kunit/platform_device.h new file +20 -0
new file mode 100644
index 000000000000..0fc0999d2420
@@ -0,0 +1,20 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _KUNIT_PLATFORM_DRIVER_H
+#define _KUNIT_PLATFORM_DRIVER_H
+
+struct kunit;
+struct platform_device;
+struct platform_driver;
+
+struct platform_device *
+kunit_platform_device_alloc(struct kunit *test, const char *name, int id);
+int kunit_platform_device_add(struct kunit *test, struct platform_device *pdev);
+
+int kunit_platform_device_prepare_wait_for_probe(struct kunit *test,
+						 struct platform_device *pdev,
+						 struct completion *x);
+
+int kunit_platform_driver_register(struct kunit *test,
+				   struct platform_driver *drv);
+
+#endif
lib/kunit/Makefile +3 -1
index 309659a32a78..a980ae62eff6 100644
@@ -8,7 +8,8 @@ kunit-objs +=				test.o \
 					try-catch.o \
 					executor.o \
 					attributes.o \
-					device.o
+					device.o \
+					platform.o
 
 ifeq ($(CONFIG_KUNIT_DEBUGFS),y)
 kunit-objs +=				debugfs.o
@@ -18,6 +19,7 @@ endif
 obj-y +=				hooks.o
 
 obj-$(CONFIG_KUNIT_TEST) +=		kunit-test.o
+obj-$(CONFIG_KUNIT_TEST) +=		platform-test.o
 
 # string-stream-test compiles built-in only.
 ifeq ($(CONFIG_KUNIT_TEST),y)
lib/kunit/platform-test.c new file +224 -0

224 lines not on this page · raw message

lib/kunit/platform.c new file +302 -0

302 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
author maintainer Applied
#10 lore raw

Re: [PATCH v8 5/8] platform: Add test managed platform_device/driver APIs

Quoting Stephen Boyd (2024-07-18 14:05:04)

Quoted 9 lines

Introduce KUnit resource wrappers around platform_driver_register(), platform_device_alloc(), and platform_device_add() so that test authors can register platform drivers/devices from their tests and have the drivers/devices automatically be unregistered when the test is done.

This makes test setup code simpler when a platform driver or platform device is needed. Add a few test cases at the same time to make sure the APIs work as intended.

Quoted 7 lines

---

Applied to clk-next

#11 lore raw

Re: [PATCH v8 5/8] platform: Add test managed platform_device/driver APIs

In reply to Stephen Boyd
Quoted 9 lines · Stephen Boyd

Introduce KUnit resource wrappers around platform_driver_register(), platform_device_alloc(), and platform_device_add() so that test authors can register platform drivers/devices from their tests and have the drivers/devices automatically be unregistered when the test is done.

This makes test setup code simpler when a platform driver or platform device is needed. Add a few test cases at the same time to make sure the APIs work as intended.

Quoted 6 lines

This patch adds another intentional warning traceback seen whenever CONFIG_KUNIT_TEST is enabled.

sysfs: cannot create duplicate filename '/devices/platform/kunit-platform-add-2'

CPU: 0 UID: 0 PID: 421 Comm: kunit_try_catch Tainted: G                 N 6.11.0-mac-09967-g2ece55614b92 #1
Tainted: [N]=TEST
Stack from 015a9de0:
        015a9de0 006168ac 006168ac 0158c000 026e8ea0 00c4a6b8 004bbe32 006168ac
        00166cd4 005fa210 0158c000 026e8ea0 ffffffef 00c4a6b8 0067a18c 00166dc0
        00c4a6b8 026e8ea0 01a6ac0e 006cb3c8 01a6ac0a 006cb3c8 00000000 00000000
        0049b6de 01a6ac0a 00000000 01a6ac0a 00000000 006cb3c8 01a6ac0a 006cb3c8
        01a6ac0a 015a9e78 0049b8b4 01a6ac0a 01a6ac00 01a6ac0a 0001bbfa 00321592
        01a6ac0a 006cb3c8 00000000 01a6ac00 00000000 0067a18c 0002d21c 00000000
Call Trace: [<004bbe32>] dump_stack+0xc/0x10
 [<00166cd4>] sysfs_warn_dup+0x52/0x64
 [<00166dc0>] sysfs_create_dir_ns+0x9a/0xac
 [<0049b6de>] kobject_add_internal+0xdc/0x238
 [<0049b8b4>] kobject_add+0x7a/0x7e
 [<0001bbfa>] insert_resource+0x0/0x1a
 [<00321592>] device_add+0x104/0x588
 [<0002d21c>] list_del_init+0x0/0x2a
 [<0001bbfa>] insert_resource+0x0/0x1a
 [<00326358>] platform_device_add+0x58/0x180
 [<00326378>] platform_device_add+0x78/0x180
 [<00273234>] IS_ERR_OR_NULL+0x0/0x1c
 [<00270c58>] kunit_platform_device_add+0x14/0x118
 [<0002d21c>] list_del_init+0x0/0x2a
 [<00270c44>] kunit_platform_device_add+0x0/0x118
 [<00273234>] IS_ERR_OR_NULL+0x0/0x1c
 [<002733de>] kunit_platform_device_add_twice_fails_test+0x118/0x170
 [<00050e44>] ktime_get_ts64+0x0/0xd8
 [<00050e44>] ktime_get_ts64+0x0/0xd8
 [<004b04d0>] memset+0x0/0x8c
 [<0026cc3e>] kunit_try_run_case+0xa0/0x176
 [<0002d21c>] list_del_init+0x0/0x2a
 [<0002cfaa>] kthread_exit+0x0/0x14
 [<0026e3d0>] kunit_generic_run_threadfn_adapter+0x0/0x2a
 [<0026e3e6>] kunit_generic_run_threadfn_adapter+0x16/0x2a
 [<0002d2d6>] kthread+0x90/0x9a
 [<0002d246>] kthread+0x0/0x9a
 [<0000252c>] ret_from_kernel_thread+0xc/0x14

kobject: kobject_add_internal failed for kunit-platform-add-2 with -EEXIST, don't try to register things with the same name in the same directory.
# kunit_platform_device_add_twice_fails_test: pass:1 fail:0 skip:0 total:1
ok 3 kunit_platform_device_add_twice_fails_test
# kunit_platform_device_add_cleans_up: pass:1 fail:0 skip:0 total:1
ok 4 kunit_platform_device_add_cleans_up
# kunit_platform_device: pass:4 fail:0 skip:0 total:4

I have said several times that my test system can and will not handle intentional warning backtraces. I strongly believe that it is wrong to expect that testbed maintainers have to keep track of intentional backtraces. That means that I now also disabled CONFIG_KUNIT_TEST in my testbed.

Guenter

author maintainer
#12 lore raw

PATCH v8 6/8 clk: Add test managed clk provider/consumer APIs

In reply to Stephen Boyd

Unit tests are more ergonomic and simpler to understand if they don't have to hoist a bunch of code into the test harness init and exit functions. Add some test managed wrappers for the clk APIs so that clk unit tests can write more code in the actual test and less code in the harness.

Only add APIs that are used for now. More wrappers can be added in the future as necessary.

Cc Brendan Higgins <[email protected]>
Cc David Gow <[email protected]>
Cc Rae Moar <[email protected]>
---
 Documentation/dev-tools/kunit/api/clk.rst   |  10 +
 Documentation/dev-tools/kunit/api/index.rst |   5 +
 drivers/clk/Makefile                        |   5 +
 drivers/clk/clk_kunit_helpers.c             | 207 ++++++++++++++++++++
 include/kunit/clk.h                         |  28 +++
 5 files changed, 255 insertions(+)
 create mode 100644 Documentation/dev-tools/kunit/api/clk.rst
 create mode 100644 drivers/clk/clk_kunit_helpers.c
 create mode 100644 include/kunit/clk.h
Documentation/dev-tools/kunit/api/clk.rst new file +10 -0
new file mode 100644
index 000000000000..eeaa50089453
@@ -0,0 +1,10 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+========
+Clk API
+========
+
+The KUnit clk API is used to test clk providers and clk consumers.
+
+.. kernel-doc:: drivers/clk/clk_kunit_helpers.c
+   :export:
Documentation/dev-tools/kunit/api/index.rst +5 -0
index 02b26f5e8750..5cdb552a0808 100644
@@ -9,6 +9,7 @@ API Reference
 	test
 	resource
 	functionredirection
+	clk
 	of
 	platformdevice
 
@@ -34,6 +35,10 @@ Documentation/dev-tools/kunit/api/functionredirection.rst
 Driver KUnit API
 ================
 
+Documentation/dev-tools/kunit/api/clk.rst
+
+ - Documents the KUnit clk API
+
 Documentation/dev-tools/kunit/api/of.rst
 
  - Documents the KUnit device tree (OF) API
drivers/clk/Makefile +5 -0
index 4abe16c8ccdf..8bb63f1ddd98 100644
@@ -18,6 +18,11 @@ ifeq ($(CONFIG_OF), y)
 obj-$(CONFIG_COMMON_CLK)	+= clk-conf.o
 endif
 
+# KUnit specific helpers
+ifeq ($(CONFIG_COMMON_CLK), y)
+obj-$(CONFIG_KUNIT)		+= clk_kunit_helpers.o
+endif
+
 # hardware specific clock types
 # please keep this section sorted lexicographically by file path name
 obj-$(CONFIG_COMMON_CLK_APPLE_NCO)  	+= clk-apple-nco.o
drivers/clk/clk_kunit_helpers.c new file +207 -0

207 lines not on this page · raw message

include/kunit/clk.h new file +28 -0
new file mode 100644
index 000000000000..73bc99cefe7b
@@ -0,0 +1,28 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _CLK_KUNIT_H
+#define _CLK_KUNIT_H
+
+struct clk;
+struct clk_hw;
+struct device;
+struct device_node;
+struct kunit;
+
+struct clk *
+clk_get_kunit(struct kunit *test, struct device *dev, const char *con_id);
+struct clk *
+of_clk_get_kunit(struct kunit *test, struct device_node *np, int index);
+
+struct clk *
+clk_hw_get_clk_kunit(struct kunit *test, struct clk_hw *hw, const char *con_id);
+struct clk *
+clk_hw_get_clk_prepared_enabled_kunit(struct kunit *test, struct clk_hw *hw,
+				      const char *con_id);
+
+int clk_prepare_enable_kunit(struct kunit *test, struct clk *clk);
+
+int clk_hw_register_kunit(struct kunit *test, struct device *dev, struct clk_hw *hw);
+int of_clk_hw_register_kunit(struct kunit *test, struct device_node *node,
+			     struct clk_hw *hw);
+
+#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
author maintainer Applied
#13 lore raw

Re: [PATCH v8 6/8] clk: Add test managed clk provider/consumer APIs

Quoting Stephen Boyd (2024-07-18 14:05:05)

Quoted 6 lines

Unit tests are more ergonomic and simpler to understand if they don't have to hoist a bunch of code into the test harness init and exit functions. Add some test managed wrappers for the clk APIs so that clk unit tests can write more code in the actual test and less code in the harness.

Quoted 8 lines

Only add APIs that are used for now. More wrappers can be added in the future as necessary.

Cc Brendan Higgins <[email protected]>
Cc David Gow <[email protected]>
Cc Rae Moar <[email protected]>

---

Applied to clk-next

author maintainer
#14 lore raw

PATCH v8 7/8 clk: Add KUnit tests for clk fixed rate basic type

In reply to Stephen Boyd

Test that the fixed rate basic type clk works as intended.

Cc Brendan Higgins <[email protected]>
Cc David Gow <[email protected]>
Cc Rae Moar <[email protected]>
---
 drivers/clk/.kunitconfig                   |   2 +
 drivers/clk/Kconfig                        |   9 +
 drivers/clk/Makefile                       |   2 +
 drivers/clk/clk-fixed-rate_test.c          | 380 +++++++++++++++++++++
 drivers/clk/clk-fixed-rate_test.h          |   8 +
 drivers/clk/kunit_clk_fixed_rate_test.dtso |  19 ++
 6 files changed, 420 insertions(+)
 create mode 100644 drivers/clk/clk-fixed-rate_test.c
 create mode 100644 drivers/clk/clk-fixed-rate_test.h
 create mode 100644 drivers/clk/kunit_clk_fixed_rate_test.dtso
drivers/clk/.kunitconfig +2 -0
index efa12ac2b3f2..54ece9207055 100644
@@ -1,6 +1,8 @@
 CONFIG_KUNIT=y
+CONFIG_OF=y
 CONFIG_COMMON_CLK=y
 CONFIG_CLK_KUNIT_TEST=y
+CONFIG_CLK_FIXED_RATE_KUNIT_TEST=y
 CONFIG_CLK_GATE_KUNIT_TEST=y
 CONFIG_CLK_FD_KUNIT_TEST=y
 CONFIG_UML_PCI_OVER_VIRTIO=n
drivers/clk/Kconfig +9 -0
index 3e9099504fad..d8482e015c49 100644
@@ -511,6 +511,15 @@ config CLK_KUNIT_TEST
 	help
 	  Kunit tests for the common clock framework.
 
+config CLK_FIXED_RATE_KUNIT_TEST
+	tristate "Basic fixed rate clk type KUnit test" if !KUNIT_ALL_TESTS
+	depends on KUNIT
+	default KUNIT_ALL_TESTS
+	select OF_OVERLAY if OF
+	select DTC
+	help
+	  KUnit tests for the basic fixed rate clk type.
+
 config CLK_GATE_KUNIT_TEST
 	tristate "Basic gate type Kunit test" if !KUNIT_ALL_TESTS
 	depends on KUNIT
drivers/clk/Makefile +2 -0
index 8bb63f1ddd98..217aa4d4d48c 100644
@@ -6,6 +6,8 @@ obj-$(CONFIG_CLK_KUNIT_TEST)	+= clk_test.o
 obj-$(CONFIG_COMMON_CLK)	+= clk-divider.o
 obj-$(CONFIG_COMMON_CLK)	+= clk-fixed-factor.o
 obj-$(CONFIG_COMMON_CLK)	+= clk-fixed-rate.o
+obj-$(CONFIG_CLK_FIXED_RATE_KUNIT_TEST)	+= clk-fixed-rate-test.o
+clk-fixed-rate-test-y		:= clk-fixed-rate_test.o kunit_clk_fixed_rate_test.dtbo.o
 obj-$(CONFIG_COMMON_CLK)	+= clk-gate.o
 obj-$(CONFIG_CLK_GATE_KUNIT_TEST) += clk-gate_test.o
 obj-$(CONFIG_COMMON_CLK)	+= clk-multiplier.o
drivers/clk/clk-fixed-rate_test.c new file +380 -0

380 lines not on this page · raw message

drivers/clk/clk-fixed-rate_test.h new file +8 -0
new file mode 100644
index 000000000000..e0d28e5b6081
@@ -0,0 +1,8 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _CLK_FIXED_RATE_TEST_H
+#define _CLK_FIXED_RATE_TEST_H
+
+#define TEST_FIXED_FREQUENCY	50000000
+#define TEST_FIXED_ACCURACY	300
+
+#endif
drivers/clk/kunit_clk_fixed_rate_test.dtso new file +19 -0
new file mode 100644
index 000000000000..d838ce766fa2
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: GPL-2.0
+/dts-v1/;
+/plugin/;
+
+#include "clk-fixed-rate_test.h"
+
+&{/} {
+	fixed_50MHz: kunit-clock {
+		compatible = "fixed-clock";
+		#clock-cells = <0>;
+		clock-frequency = <TEST_FIXED_FREQUENCY>;
+		clock-accuracy = <TEST_FIXED_ACCURACY>;
+	};
+
+	kunit-clock-consumer {
+		compatible = "test,single-clk-consumer";
+		clocks = <&fixed_50MHz>;
+	};
+};
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
author maintainer
#16 lore raw

PATCH v8 8/8 clk: Add KUnit tests for clks registered with struct clk_parent_data

In reply to Stephen Boyd

Test that clks registered with 'struct clk_parent_data' work as intended and can find their parents.

Cc Christian Marangi <[email protected]>
Cc Brendan Higgins <[email protected]>
Cc Rae Moar <[email protected]>
---
 drivers/clk/Kconfig                         |   2 +
 drivers/clk/Makefile                        |   4 +-
 drivers/clk/clk_parent_data_test.h          |  10 +
 drivers/clk/clk_test.c                      | 453 +++++++++++++++++++-
 drivers/clk/kunit_clk_parent_data_test.dtso |  28 ++
 5 files changed, 495 insertions(+), 2 deletions(-)
 create mode 100644 drivers/clk/clk_parent_data_test.h
 create mode 100644 drivers/clk/kunit_clk_parent_data_test.dtso
drivers/clk/Kconfig +2 -0
index d8482e015c49..0e4819c1cfd2 100644
@@ -508,6 +508,8 @@ config CLK_KUNIT_TEST
 	tristate "Basic Clock Framework Kunit Tests" if !KUNIT_ALL_TESTS
 	depends on KUNIT
 	default KUNIT_ALL_TESTS
+	select OF_OVERLAY if OF
+	select DTC
 	help
 	  Kunit tests for the common clock framework.
 
drivers/clk/Makefile +3 -1
index 217aa4d4d48c..dddc9d87955a 100644
@@ -2,7 +2,9 @@
 # common clock types
 obj-$(CONFIG_HAVE_CLK)		+= clk-devres.o clk-bulk.o clkdev.o
 obj-$(CONFIG_COMMON_CLK)	+= clk.o
-obj-$(CONFIG_CLK_KUNIT_TEST)	+= clk_test.o
+obj-$(CONFIG_CLK_KUNIT_TEST)	+= clk-test.o
+clk-test-y			:= clk_test.o \
+				   kunit_clk_parent_data_test.dtbo.o
 obj-$(CONFIG_COMMON_CLK)	+= clk-divider.o
 obj-$(CONFIG_COMMON_CLK)	+= clk-fixed-factor.o
 obj-$(CONFIG_COMMON_CLK)	+= clk-fixed-rate.o
drivers/clk/clk_parent_data_test.h new file +10 -0
new file mode 100644
index 000000000000..eedd53ae910d
@@ -0,0 +1,10 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef _CLK_PARENT_DATA_TEST_H
+#define _CLK_PARENT_DATA_TEST_H
+
+#define CLK_PARENT_DATA_1MHZ_NAME	"1mhz_fixed_legacy"
+#define CLK_PARENT_DATA_PARENT1		"parent_fwname"
+#define CLK_PARENT_DATA_PARENT2		"50"
+#define CLK_PARENT_DATA_50MHZ_NAME	"50_clk"
+
+#endif
drivers/clk/clk_test.c +452 -1

477 lines not on this page · raw message

drivers/clk/kunit_clk_parent_data_test.dtso new file +28 -0
new file mode 100644
index 000000000000..7d3ed9a5a2e8
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: GPL-2.0
+/dts-v1/;
+/plugin/;
+
+#include "clk_parent_data_test.h"
+
+&{/} {
+	fixed_50: kunit-clock-50MHz {
+		compatible = "fixed-clock";
+		#clock-cells = <0>;
+		clock-frequency = <50000000>;
+		clock-output-names = CLK_PARENT_DATA_50MHZ_NAME;
+	};
+
+	fixed_parent: kunit-clock-1MHz {
+		compatible = "fixed-clock";
+		#clock-cells = <0>;
+		clock-frequency = <1000000>;
+		clock-output-names = CLK_PARENT_DATA_1MHZ_NAME;
+	};
+
+	kunit-clock-controller {
+		compatible = "test,clk-parent-data";
+		clocks = <&fixed_parent>, <&fixed_50>;
+		clock-names = CLK_PARENT_DATA_PARENT1, CLK_PARENT_DATA_PARENT2;
+		#clock-cells = <1>;
+	};
+};
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
author maintainer Applied
#17 lore raw

Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data

Quoting Stephen Boyd (2024-07-18 14:05:07)

Quoted 9 lines

Test that clks registered with 'struct clk_parent_data' work as intended and can find their parents.

Cc Christian Marangi <[email protected]>
Cc Brendan Higgins <[email protected]>
Cc Rae Moar <[email protected]>

---

Applied to clk-next

#18 lore raw

Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data

In reply to Stephen Boyd

Hi Stephen,

Quoted 3 lines · Stephen Boyd

Test that clks registered with 'struct clk_parent_data' work as intended and can find their parents.

When testing this on arm64, I see the error below. The error is only seen if I boot through efi, i.e., with "-bios QEMU_EFI-aarch64.fd" qemu parameter.

Any idea what might cause the problem ?

Thanks,
Guenter

---

[   20.464809]     KTAP version 1
[   20.464865]     # Subtest: clk_register_clk_parent_data_of
[   20.464936]     # module: clk_test
[   20.464979]     1..1
[   20.465098]         KTAP version 1
[   20.465208]         # Subtest: clk_register_clk_parent_data_of_test
[   20.468964] OF: overlay: find target, node: /fragment@0, path '/' not found
[   20.469558] OF: overlay: init_overlay_changeset() failed, ret = -22
[   20.470177]     # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760
[   20.470177]     Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but
[   20.470177]         ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea)
[   20.471793]         not ok 1 clk_parent_data_of_index_test
[   20.474095] OF: overlay: find target, node: /fragment@0, path '/' not found
[   20.474373] OF: overlay: init_overlay_changeset() failed, ret = -22
[   20.474737]     # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760
[   20.474737]     Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but
[   20.474737]         ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea)
[   20.477677]         not ok 2 clk_parent_data_of_fwname_test
[   20.479773] OF: overlay: find target, node: /fragment@0, path '/' not found
[   20.479941] OF: overlay: init_overlay_changeset() failed, ret = -22
[   20.480160]     # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760
[   20.480160]     Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but
[   20.480160]         ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea)
[   20.481513]         not ok 3 clk_parent_data_of_name_test
[   20.483711] OF: overlay: find target, node: /fragment@0, path '/' not found
[   20.483878] OF: overlay: init_overlay_changeset() failed, ret = -22
[   20.484100]     # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760
[   20.484100]     Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but
[   20.484100]         ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea)
[   20.485444]         not ok 4 clk_parent_data_of_fwname_name_test
[   20.487432] OF: overlay: find target, node: /fragment@0, path '/' not found
[   20.487600] OF: overlay: init_overlay_changeset() failed, ret = -22
[   20.487841]     # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760
[   20.487841]     Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but
[   20.487841]         ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea)
[   20.489207]         not ok 5 clk_parent_data_of_index_name_priority_test
[   20.490998] OF: overlay: find target, node: /fragment@0, path '/' not found
[   20.491504] OF: overlay: init_overlay_changeset() failed, ret = -22
[   20.491725]     # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760
[   20.491725]     Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but
[   20.491725]         ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea)
[   20.493053]         not ok 6 clk_parent_data_of_index_fwname_name_priority_test
[   20.493583]     # clk_register_clk_parent_data_of_test: pass:0 fail:6 skip:0 total:6
[   20.493701]     not ok 1 clk_register_clk_parent_data_of_test
[   20.493822] # clk_register_clk_parent_data_of: pass:0 fail:1 skip:0 total:1
[   20.493920] # Totals: pass:0 fail:6 skip:0 total:6
[   20.494032] not ok 49 clk_register_clk_parent_data_of
#19 lore raw

Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data

Quoted 7 lines · Guenter Roeck

Hi Stephen,

Quoted 3 lines · Stephen Boyd

Test that clks registered with 'struct clk_parent_data' work as intended and can find their parents.

Quoted 6 lines

When testing this on arm64, I see the error below. The error is only seen if I boot through efi, i.e., with "-bios QEMU_EFI-aarch64.fd" qemu parameter.

Any idea what might cause the problem ?

I noticed that the new overlay tests fail as well, also with "path '/' not found".

[Maybe] answering my own question: I think the problem may be that there is no devicetree file and thus no devicetree root when booting through efi (in other words, of_root is NULL). Would it make sense to skip the tests in that case ?

Thanks,
Guenter

Quoted 51 lines

Thanks,
Guenter

---

[   20.464809]     KTAP version 1
[   20.464865]     # Subtest: clk_register_clk_parent_data_of
[   20.464936]     # module: clk_test
[   20.464979]     1..1
[   20.465098]         KTAP version 1
[   20.465208]         # Subtest: clk_register_clk_parent_data_of_test
[   20.468964] OF: overlay: find target, node: /fragment@0, path '/' not found
[   20.469558] OF: overlay: init_overlay_changeset() failed, ret = -22
[   20.470177]     # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760
[   20.470177]     Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but
[   20.470177]         ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea)
[   20.471793]         not ok 1 clk_parent_data_of_index_test
[   20.474095] OF: overlay: find target, node: /fragment@0, path '/' not found
[   20.474373] OF: overlay: init_overlay_changeset() failed, ret = -22
[   20.474737]     # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760
[   20.474737]     Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but
[   20.474737]         ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea)
[   20.477677]         not ok 2 clk_parent_data_of_fwname_test
[   20.479773] OF: overlay: find target, node: /fragment@0, path '/' not found
[   20.479941] OF: overlay: init_overlay_changeset() failed, ret = -22
[   20.480160]     # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760
[   20.480160]     Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but
[   20.480160]         ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea)
[   20.481513]         not ok 3 clk_parent_data_of_name_test
[   20.483711] OF: overlay: find target, node: /fragment@0, path '/' not found
[   20.483878] OF: overlay: init_overlay_changeset() failed, ret = -22
[   20.484100]     # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760
[   20.484100]     Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but
[   20.484100]         ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea)
[   20.485444]         not ok 4 clk_parent_data_of_fwname_name_test
[   20.487432] OF: overlay: find target, node: /fragment@0, path '/' not found
[   20.487600] OF: overlay: init_overlay_changeset() failed, ret = -22
[   20.487841]     # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760
[   20.487841]     Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but
[   20.487841]         ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea)
[   20.489207]         not ok 5 clk_parent_data_of_index_name_priority_test
[   20.490998] OF: overlay: find target, node: /fragment@0, path '/' not found
[   20.491504] OF: overlay: init_overlay_changeset() failed, ret = -22
[   20.491725]     # clk_register_clk_parent_data_of_test: ASSERTION FAILED at drivers/clk/clk_test.c:2760
[   20.491725]     Expected 0 == ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }), but
[   20.491725]         ({ extern uint8_t __dtbo_kunit_clk_parent_data_test_begin[]; extern uint8_t __dtbo_kunit_clk_parent_data_test_end[]; __of_overlay_apply_kunit((test), __dtbo_kunit_clk_parent_data_test_begin, __dtbo_kunit_clk_parent_data_test_end); }) == -22 (0xffffffffffffffea)
[   20.493053]         not ok 6 clk_parent_data_of_index_fwname_name_priority_test
[   20.493583]     # clk_register_clk_parent_data_of_test: pass:0 fail:6 skip:0 total:6
[   20.493701]     not ok 1 clk_register_clk_parent_data_of_test
[   20.493822] # clk_register_clk_parent_data_of: pass:0 fail:1 skip:0 total:1
[   20.493920] # Totals: pass:0 fail:6 skip:0 total:6
[   20.494032] not ok 49 clk_register_clk_parent_data_of
#20 lore raw

Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data

Copying devicetree maintainers.

Quoted 14 lines · Guenter Roeck
Quoted 7 lines · Guenter Roeck

Hi Stephen,

Quoted 3 lines · Stephen Boyd

Test that clks registered with 'struct clk_parent_data' work as intended and can find their parents.

Quoted 6 lines

When testing this on arm64, I see the error below. The error is only seen if I boot through efi, i.e., with "-bios QEMU_EFI-aarch64.fd" qemu parameter.

Any idea what might cause the problem ?

Quoted 8 lines

I noticed that the new overlay tests fail as well, also with "path '/' not found".

[Maybe] answering my own question: I think the problem may be that there is no devicetree file and thus no devicetree root when booting through efi (in other words, of_root is NULL). Would it make sense to skip the tests in that case ?

The problem is that of_root is not initialized in arm64 boots if ACPI is enabled.

From arch/arm64/kernel/setup.c:setup_arch():

	if (acpi_disabled)
		unflatten_device_tree();		// initializes of_root

ACPI is enabled if the system boots from EFI. This also affects CONFIG_OF_KUNIT_TEST, which explicitly checks if of_root exists and fails the test if it doesn't.

I think those tests need to add a check for this condition, or affected machines won't be able to run those unit tests. The obvious solution would be to check if of_root is set, but then the associated test case in CONFIG_OF_KUNIT_TEST would not make sense.

Any suggestions ?

Thanks,
Guenter

maintainer
#21 lore raw

Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data

Quoted 38 lines · Guenter Roeck

Copying devicetree maintainers.

Quoted 14 lines · Guenter Roeck
Quoted 7 lines · Guenter Roeck

Hi Stephen,

Quoted 3 lines · Stephen Boyd

Test that clks registered with 'struct clk_parent_data' work as intended and can find their parents.

Quoted 6 lines

When testing this on arm64, I see the error below. The error is only seen if I boot through efi, i.e., with "-bios QEMU_EFI-aarch64.fd" qemu parameter.

Any idea what might cause the problem ?

Quoted 8 lines

I noticed that the new overlay tests fail as well, also with "path '/' not found".

[Maybe] answering my own question: I think the problem may be that there is no devicetree file and thus no devicetree root when booting through efi (in other words, of_root is NULL). Would it make sense to skip the tests in that case ?

The problem is that of_root is not initialized in arm64 boots if ACPI is enabled.

From arch/arm64/kernel/setup.c:setup_arch():

	if (acpi_disabled)
		unflatten_device_tree();		// initializes of_root

ACPI is enabled if the system boots from EFI. This also affects CONFIG_OF_KUNIT_TEST, which explicitly checks if of_root exists and fails the test if it doesn't.

Quoted 7 lines

I think those tests need to add a check for this condition, or affected machines won't be able to run those unit tests. The obvious solution would be to check if of_root is set, but then the associated test case in CONFIG_OF_KUNIT_TEST would not make sense.

Any suggestions ?

Would it work if these tests check if acpi_disabled and skip if it isn't disabled? It might be low overhead condition to check from these tests.

acpi_disabled is exported:

arch/arm64/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/loongarch/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/riscv/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/x86/kernel/acpi/boot.c:EXPORT_SYMBOL(acpi_disabled);

thanks,
-- Shuah

#22 lore raw

Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data

Quoted 50 lines · Shuah Khan
Quoted 38 lines · Guenter Roeck

Copying devicetree maintainers.

Quoted 14 lines · Guenter Roeck
Quoted 7 lines · Guenter Roeck

Hi Stephen,

Quoted 3 lines · Stephen Boyd

Test that clks registered with 'struct clk_parent_data' work as intended and can find their parents.

Quoted 6 lines

When testing this on arm64, I see the error below. The error is only seen if I boot through efi, i.e., with "-bios QEMU_EFI-aarch64.fd" qemu parameter.

Any idea what might cause the problem ?

Quoted 8 lines

I noticed that the new overlay tests fail as well, also with "path '/' not found".

[Maybe] answering my own question: I think the problem may be that there is no devicetree file and thus no devicetree root when booting through efi (in other words, of_root is NULL). Would it make sense to skip the tests in that case ?

The problem is that of_root is not initialized in arm64 boots if ACPI is enabled.

 From arch/arm64/kernel/setup.c:setup_arch():

    if (acpi_disabled)
        unflatten_device_tree();        // initializes of_root

ACPI is enabled if the system boots from EFI. This also affects CONFIG_OF_KUNIT_TEST, which explicitly checks if of_root exists and fails the test if it doesn't.

Quoted 7 lines

I think those tests need to add a check for this condition, or affected machines won't be able to run those unit tests. The obvious solution would be to check if of_root is set, but then the associated test case in CONFIG_OF_KUNIT_TEST would not make sense.

Any suggestions ?

Would it work if these tests check if acpi_disabled and skip if it isn't disabled? It might be low overhead condition to check from these tests.

Quoted 7 lines

acpi_disabled is exported:

arch/arm64/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/loongarch/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/riscv/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/x86/kernel/acpi/boot.c:EXPORT_SYMBOL(acpi_disabled);

I don't think that would work. Looking through the use of acpi_init, I don't think that of_root is always NULL when acpi_init is false; that just happens to be the case on arm64 when booting through efi. However, even arm64 has the following code.

        if (acpi_disabled)
                psci_dt_init();
        else
                psci_acpi_init();

While psci_dt_init() doesn't set of_root, it does try to do a devicetree match. So there must be some other condition where acpi_disabled is set but of_root is set anyway. I just have not found that code path.

Guenter

#23 lore raw

Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data

Quoted 64 lines · Guenter Roeck
Quoted 50 lines · Shuah Khan
Quoted 38 lines · Guenter Roeck

Copying devicetree maintainers.

Quoted 14 lines · Guenter Roeck
Quoted 7 lines · Guenter Roeck

Hi Stephen,

Quoted 3 lines · Stephen Boyd

Test that clks registered with 'struct clk_parent_data' work as intended and can find their parents.

Quoted 6 lines

When testing this on arm64, I see the error below. The error is only seen if I boot through efi, i.e., with "-bios QEMU_EFI-aarch64.fd" qemu parameter.

Any idea what might cause the problem ?

Quoted 8 lines

I noticed that the new overlay tests fail as well, also with "path '/' not found".

[Maybe] answering my own question: I think the problem may be that there is no devicetree file and thus no devicetree root when booting through efi (in other words, of_root is NULL). Would it make sense to skip the tests in that case ?

The problem is that of_root is not initialized in arm64 boots if ACPI is enabled.

 From arch/arm64/kernel/setup.c:setup_arch():

    if (acpi_disabled)
        unflatten_device_tree();        // initializes of_root

ACPI is enabled if the system boots from EFI. This also affects CONFIG_OF_KUNIT_TEST, which explicitly checks if of_root exists and fails the test if it doesn't.

Quoted 7 lines

I think those tests need to add a check for this condition, or affected machines won't be able to run those unit tests. The obvious solution would be to check if of_root is set, but then the associated test case in CONFIG_OF_KUNIT_TEST would not make sense.

Any suggestions ?

Would it work if these tests check if acpi_disabled and skip if it isn't disabled? It might be low overhead condition to check from these tests.

Quoted 7 lines

acpi_disabled is exported:

arch/arm64/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/loongarch/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/riscv/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/x86/kernel/acpi/boot.c:EXPORT_SYMBOL(acpi_disabled);

I don't think that would work. Looking through the use of acpi_init, I don't think that of_root is always NULL when acpi_init is false; that just happens to be the case on arm64 when booting through efi. However, even arm64 has the following code.

Quoted 9 lines

        if (acpi_disabled)
                psci_dt_init();
        else
                psci_acpi_init();

While psci_dt_init() doesn't set of_root, it does try to do a devicetree match. So there must be some other condition where acpi_disabled is set but of_root is set anyway. I just have not found that code path.

I ended up disabling all affected unit tests for arm64. I'll do the same for other architectures if I encounter the problem there as well.

Unfortunately that includes all clock unit tests because the tests requiring devicetree support can not be enabled/disabled separately, but that can't be helped and is still better than "mandatory" failures.

Guenter

maintainer
#24 lore raw

Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data

Quoted 75 lines · Guenter Roeck
Quoted 64 lines · Guenter Roeck
Quoted 50 lines · Shuah Khan
Quoted 38 lines · Guenter Roeck

Copying devicetree maintainers.

Quoted 14 lines · Guenter Roeck
Quoted 7 lines · Guenter Roeck

Hi Stephen,

Quoted 3 lines · Stephen Boyd

Test that clks registered with 'struct clk_parent_data' work as intended and can find their parents.

Quoted 6 lines

When testing this on arm64, I see the error below. The error is only seen if I boot through efi, i.e., with "-bios QEMU_EFI-aarch64.fd" qemu parameter.

Any idea what might cause the problem ?

Quoted 8 lines

I noticed that the new overlay tests fail as well, also with "path '/' not found".

[Maybe] answering my own question: I think the problem may be that there is no devicetree file and thus no devicetree root when booting through efi (in other words, of_root is NULL). Would it make sense to skip the tests in that case ?

The problem is that of_root is not initialized in arm64 boots if ACPI is enabled.

 From arch/arm64/kernel/setup.c:setup_arch():

    if (acpi_disabled)
        unflatten_device_tree();        // initializes of_root

ACPI is enabled if the system boots from EFI. This also affects CONFIG_OF_KUNIT_TEST, which explicitly checks if of_root exists and fails the test if it doesn't.

Quoted 7 lines

I think those tests need to add a check for this condition, or affected machines won't be able to run those unit tests. The obvious solution would be to check if of_root is set, but then the associated test case in CONFIG_OF_KUNIT_TEST would not make sense.

Any suggestions ?

Would it work if these tests check if acpi_disabled and skip if it isn't disabled? It might be low overhead condition to check from these tests.

Quoted 7 lines

acpi_disabled is exported:

arch/arm64/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/loongarch/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/riscv/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/x86/kernel/acpi/boot.c:EXPORT_SYMBOL(acpi_disabled);

I don't think that would work. Looking through the use of acpi_init, I don't think that of_root is always NULL when acpi_init is false; that just happens to be the case on arm64 when booting through efi. However, even arm64 has the following code.

Quoted 9 lines

         if (acpi_disabled)
                 psci_dt_init();
         else
                 psci_acpi_init();

While psci_dt_init() doesn't set of_root, it does try to do a devicetree match. So there must be some other condition where acpi_disabled is set but of_root is set anyway. I just have not found that code path.

Quoted 7 lines

I ended up disabling all affected unit tests for arm64. I'll do the same for other architectures if I encounter the problem there as well.

Unfortunately that includes all clock unit tests because the tests requiring devicetree support can not be enabled/disabled separately, but that can't be helped and is still better than "mandatory" failures.

I am hoping Stephen will have a solution for this problem. In the meantime, I will look into this to see if we can find a check that works.

thanks,
-- Shuah

maintainer
#25 lore raw

Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data

Quoted 76 lines · Shuah Khan
Quoted 75 lines · Guenter Roeck
Quoted 73 lines · Guenter Roeck
Quoted 50 lines · Shuah Khan
Quoted 38 lines · Guenter Roeck

Copying devicetree maintainers.

Quoted 14 lines · Guenter Roeck
Quoted 7 lines · Guenter Roeck

Hi Stephen,

Quoted 3 lines · Stephen Boyd

Test that clks registered with 'struct clk_parent_data' work as intended and can find their parents.

Quoted 6 lines

When testing this on arm64, I see the error below. The error is only seen if I boot through efi, i.e., with "-bios QEMU_EFI-aarch64.fd" qemu parameter.

Any idea what might cause the problem ?

Quoted 8 lines

I noticed that the new overlay tests fail as well, also with "path '/' not found".

[Maybe] answering my own question: I think the problem may be that there is no devicetree file and thus no devicetree root when booting through efi (in other words, of_root is NULL). Would it make sense to skip the tests in that case ?

The problem is that of_root is not initialized in arm64 boots if ACPI is enabled.

 From arch/arm64/kernel/setup.c:setup_arch():

    if (acpi_disabled)
        unflatten_device_tree();        // initializes of_root

ACPI is enabled if the system boots from EFI. This also affects CONFIG_OF_KUNIT_TEST, which explicitly checks if of_root exists and fails the test if it doesn't.

Quoted 7 lines

I think those tests need to add a check for this condition, or affected machines won't be able to run those unit tests. The obvious solution would be to check if of_root is set, but then the associated test case in CONFIG_OF_KUNIT_TEST would not make sense.

Any suggestions ?

Would it work if these tests check if acpi_disabled and skip if it isn't disabled? It might be low overhead condition to check from these tests.

Quoted 7 lines

acpi_disabled is exported:

arch/arm64/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/loongarch/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/riscv/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/x86/kernel/acpi/boot.c:EXPORT_SYMBOL(acpi_disabled);

I don't think that would work. Looking through the use of acpi_init, I don't think that of_root is always NULL when acpi_init is false; that just happens to be the case on arm64 when booting through efi. However, even arm64 has the following code.

         if (acpi_disabled)
                 psci_dt_init();
         else
                 psci_acpi_init();

While psci_dt_init() doesn't set of_root, it does try to do a devicetree match. So there must be some other condition where acpi_disabled is set but of_root is set anyway. I just have not found that code path.

Quoted 8 lines
Quoted 7 lines

I ended up disabling all affected unit tests for arm64. I'll do the same for other architectures if I encounter the problem there as well.

Unfortunately that includes all clock unit tests because the tests requiring devicetree support can not be enabled/disabled separately, but that can't be helped and is still better than "mandatory" failures.

of_root is set in drivers/of/pdt.c when it creates the root node. This could be a definitive test for kunit tests that depend on devicetree support.

It is an exported symbol. drivers/of/base.c exports it.

thanks,
-- SHuah

#26 lore raw

Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data

Quoted 86 lines · Shuah Khan
Quoted 76 lines · Shuah Khan
Quoted 75 lines · Guenter Roeck
Quoted 73 lines · Guenter Roeck
Quoted 50 lines · Shuah Khan
Quoted 38 lines · Guenter Roeck

Copying devicetree maintainers.

Quoted 14 lines · Guenter Roeck
Quoted 7 lines · Guenter Roeck

Hi Stephen,

Quoted 3 lines · Stephen Boyd

Test that clks registered with 'struct clk_parent_data' work as intended and can find their parents.

Quoted 6 lines

When testing this on arm64, I see the error below. The error is only seen if I boot through efi, i.e., with "-bios QEMU_EFI-aarch64.fd" qemu parameter.

Any idea what might cause the problem ?

Quoted 8 lines

I noticed that the new overlay tests fail as well, also with "path '/' not found".

[Maybe] answering my own question: I think the problem may be that there is no devicetree file and thus no devicetree root when booting through efi (in other words, of_root is NULL). Would it make sense to skip the tests in that case ?

The problem is that of_root is not initialized in arm64 boots if ACPI is enabled.

 From arch/arm64/kernel/setup.c:setup_arch():

    if (acpi_disabled)
        unflatten_device_tree();        // initializes of_root

ACPI is enabled if the system boots from EFI. This also affects CONFIG_OF_KUNIT_TEST, which explicitly checks if of_root exists and fails the test if it doesn't.

Quoted 7 lines

I think those tests need to add a check for this condition, or affected machines won't be able to run those unit tests. The obvious solution would be to check if of_root is set, but then the associated test case in CONFIG_OF_KUNIT_TEST would not make sense.

Any suggestions ?

Would it work if these tests check if acpi_disabled and skip if it isn't disabled? It might be low overhead condition to check from these tests.

Quoted 7 lines

acpi_disabled is exported:

arch/arm64/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/loongarch/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/riscv/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/x86/kernel/acpi/boot.c:EXPORT_SYMBOL(acpi_disabled);

I don't think that would work. Looking through the use of acpi_init, I don't think that of_root is always NULL when acpi_init is false; that just happens to be the case on arm64 when booting through efi. However, even arm64 has the following code.

         if (acpi_disabled)
                 psci_dt_init();
         else
                 psci_acpi_init();

While psci_dt_init() doesn't set of_root, it does try to do a devicetree match. So there must be some other condition where acpi_disabled is set but of_root is set anyway. I just have not found that code path.

Quoted 8 lines
Quoted 7 lines

I ended up disabling all affected unit tests for arm64. I'll do the same for other architectures if I encounter the problem there as well.

Unfortunately that includes all clock unit tests because the tests requiring devicetree support can not be enabled/disabled separately, but that can't be helped and is still better than "mandatory" failures.

Quoted 4 lines

of_root is set in drivers/of/pdt.c when it creates the root node. This could be a definitive test for kunit tests that depend on devicetree support.

That is not always the case, including arm64. It is primarily set in unflatten_devicetree(), which is not called on arm64 unless acpi_is disabled (see above).

Quoted 2 lines

It is an exported symbol. drivers/of/base.c exports it.

Yes, checking if of_root is NULL and skipping the test in that case might help, but then there is the of_dtb_root_node_populates_of_root unit test which explicitly fails if of_root is NULL. The comment describing the test is

/*
* Test that the 'of_root' global variable is always populated when DT code is
* enabled. Remove this test once of_root is removed from global access. */

The devicetree unit test code explicitly assumes that of_root is set if CONFIG_OF_EARLY_FLATTREE is enabled, but that is not always the case (again, of_root is NULL on arm64 unless acpi is disabled).

Guenter

author maintainer
#27 lore raw

Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data

Quoting Guenter Roeck (2024-09-28 14:32:35)

Quoted 32 lines · Shuah Khan
Quoted 31 lines · Shuah Khan
Quoted 30 lines · Guenter Roeck
Quoted 29 lines · Guenter Roeck
Quoted 28 lines · Shuah Khan
Quoted 27 lines · Guenter Roeck
Quoted 26 lines

Copying devicetree maintainers.

Quoted 22 lines · Guenter Roeck
Quoted 7 lines · Guenter Roeck

Hi Stephen,

Quoted 3 lines · Stephen Boyd

Test that clks registered with 'struct clk_parent_data' work as intended and can find their parents.

Quoted 6 lines

When testing this on arm64, I see the error below. The error is only seen if I boot through efi, i.e., with "-bios QEMU_EFI-aarch64.fd" qemu parameter.

Any idea what might cause the problem ?

I noticed that the new overlay tests fail as well, also with "path '/' not found".

[Maybe] answering my own question: I think the problem may be that there is no devicetree file and thus no devicetree root when booting through efi (in other words, of_root is NULL). Would it make sense to skip the tests in that case ?

Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines

The problem is that of_root is not initialized in arm64 boots if ACPI is enabled.

 From arch/arm64/kernel/setup.c:setup_arch():

    if (acpi_disabled)
        unflatten_device_tree();        // initializes of_root

Oof I forgot that Rob didn't apply the patch that let an empty root live on ARM64 ACPI systems. See this thread[1] for all the details.

Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines
Quoted 5 lines

ACPI is enabled if the system boots from EFI. This also affects CONFIG_OF_KUNIT_TEST, which explicitly checks if of_root exists and fails the test if it doesn't.

Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines
Quoted 7 lines

I think those tests need to add a check for this condition, or affected machines won't be able to run those unit tests. The obvious solution would be to check if of_root is set, but then the associated test case in CONFIG_OF_KUNIT_TEST would not make sense.

Any suggestions ?

I think that's the best we can do for now. Basically add a check like

	if (IS_ENABLED(CONFIG_ARM64) && acpi_disabled)
		kunit_skip(test, "ARM64 + ACPI rejects DT overlays");

to the overlay application function and the DT test.

Quoted 53 lines
Quoted 36 lines
Quoted 27 lines
Quoted 27 lines
Quoted 26 lines
Quoted 11 lines

Would it work if these tests check if acpi_disabled and skip if it isn't disabled? It might be low overhead condition to check from these tests.

acpi_disabled is exported:

arch/arm64/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/loongarch/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/riscv/kernel/acpi.c:EXPORT_SYMBOL(acpi_disabled); arch/x86/kernel/acpi/boot.c:EXPORT_SYMBOL(acpi_disabled);

I don't think that would work. Looking through the use of acpi_init, I don't think that of_root is always NULL when acpi_init is false; that just happens to be the case on arm64 when booting through efi. However, even arm64 has the following code.

         if (acpi_disabled)
                 psci_dt_init();
         else
                 psci_acpi_init();

While psci_dt_init() doesn't set of_root, it does try to do a devicetree match. So there must be some other condition where acpi_disabled is set but of_root is set anyway. I just have not found that code path.

Quoted 8 lines
Quoted 7 lines

I ended up disabling all affected unit tests for arm64. I'll do the same for other architectures if I encounter the problem there as well.

Unfortunately that includes all clock unit tests because the tests requiring devicetree support can not be enabled/disabled separately, but that can't be helped and is still better than "mandatory" failures.

Quoted 4 lines

of_root is set in drivers/of/pdt.c when it creates the root node. This could be a definitive test for kunit tests that depend on devicetree support.

That is not always the case, including arm64. It is primarily set in unflatten_devicetree(), which is not called on arm64 unless acpi_is disabled (see above).

Quoted 2 lines

It is an exported symbol. drivers/of/base.c exports it.

Yes, checking if of_root is NULL and skipping the test in that case might help, but then there is the of_dtb_root_node_populates_of_root unit test which explicitly fails if of_root is NULL. The comment describing the test is

Quoted 9 lines

/*
* Test that the 'of_root' global variable is always populated when DT code is
* enabled. Remove this test once of_root is removed from global access. */

The devicetree unit test code explicitly assumes that of_root is set if CONFIG_OF_EARLY_FLATTREE is enabled, but that is not always the case (again, of_root is NULL on arm64 unless acpi is disabled).

That DT test has been there for a few releases. Is this the first time those tests have been run on arm64+acpi? I didn't try after sending the patches and forgot that the patch was dropped.

How are you running kunit tests? I installed the qemu-efi-aarch64 debian package to get QEMU_EFI.fd but passing that to the kunit.py run command with --qemu_args="-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd" didn't get me beyond the point that the EFI stub boots linux. I think the serial console must not be working and thus the kunit wrapper waits for something to show up but nothing ever does. I haven't dug any further though, so maybe you have a working command.

Here's my command that isn't working:

./tools/testing/kunit/kunit.py run --arch=arm64 --kunitconfig=drivers/of --qemu_args="-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd"

[1] https://lore.kernel.org/all/[email protected]/

#28 lore raw

Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data

On 10/3/24 16:46, Stephen Boyd wrote:
[ ... ]

Quoted 4 lines

That DT test has been there for a few releases. Is this the first time those tests have been run on arm64+acpi? I didn't try after sending the patches and forgot that the patch was dropped.

Previously I had the affected tests disabled and never tracked down the problem. Since the problem is now spreading to additional tests, I finally tracked it down, that is all.

Quoted 8 lines

How are you running kunit tests? I installed the qemu-efi-aarch64 debian package to get QEMU_EFI.fd but passing that to the kunit.py run command with --qemu_args="-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd" didn't get me beyond the point that the EFI stub boots linux. I think the serial console must not be working and thus the kunit wrapper waits for something to show up but nothing ever does. I haven't dug any further though, so maybe you have a working command.

I run all tests during boot, not from the command line. I also use the -bios command but don't recall any issues with the console. I specify the console on the qemu command line; depending on the qemu machine it is either ttyS0 or ttyAMA0. The init script then finds and selects the active console.

Quoted 4 lines

Here's my command that isn't working:

./tools/testing/kunit/kunit.py run --arch=arm64 --kunitconfig=drivers/of --qemu_args="-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd"

I can't really see what that command is actually doing ;-).

I'll just keep the affected tests disabled on arm64 for the time being.

Thanks,
Guenter

author maintainer
#29 lore raw

Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data

Quoting Guenter Roeck (2024-10-03 17:25:37)

Quoted 10 lines · Stephen Boyd

[ ... ]

Quoted 4 lines

That DT test has been there for a few releases. Is this the first time those tests have been run on arm64+acpi? I didn't try after sending the patches and forgot that the patch was dropped.

Previously I had the affected tests disabled and never tracked down the problem. Since the problem is now spreading to additional tests, I finally tracked it down, that is all.

Ok great. Good to know this isn't a new problem. Thanks for tracking it down.

Quoted 10 lines
Quoted 9 lines

How are you running kunit tests? I installed the qemu-efi-aarch64 debian package to get QEMU_EFI.fd but passing that to the kunit.py run command with --qemu_args="-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd" didn't get me beyond the point that the EFI stub boots linux. I think the serial console must not be working and thus the kunit wrapper waits for something to show up but nothing ever does. I haven't dug any further though, so maybe you have a working command.

Quoted 4 lines

I run all tests during boot, not from the command line. I also use the -bios command but don't recall any issues with the console. I specify the console on the qemu command line; depending on the qemu machine it is either ttyS0 or ttyAMA0. The init script then finds and selects the active console.

Can you please describe how you run the kunit test? And provide the qemu command you run to boot arm64 with acpi?

Quoted 7 lines
Quoted 5 lines

Here's my command that isn't working:

./tools/testing/kunit/kunit.py run --arch=arm64 --kunitconfig=drivers/of --qemu_args="-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd"

I can't really see what that command is actually doing ;-).

It eventually runs this qemu command

qemu-system-aarch64 -nodefaults -m 1024 -kernel .kunit/arch/arm64/boot/Image.gz -append 'kunit.enable=1 console=ttyAMA0 kunit_shutdown=reboot' -no-reboot -nographic -serial stdio -machine virt -cpu max,pauth-impdef=on -bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd

I see that it fails because the architected timer isn't there after I add an earlycon=pl011,0x9000000 to the kernel commandline. I suspect passing a bios like this is incorrect, but I rarely run qemu manually so I don't know what I'm doing wrong.

NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
rcu: srcu_init: Setting srcu_struct sizes based on contention.
timer_probe: no matching timers found

Kernel panic - not syncing: Unable to initialise architected timer.
CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Not tainted 6.11.0-rc1-00261-g497f7c30f184 #203
Call trace:
 dump_backtrace+0x94/0xec
 show_stack+0x18/0x24
 dump_stack_lvl+0x38/0x90
 dump_stack+0x18/0x24
 panic+0x36c/0x380
 early_brk64+0x0/0xa8
 start_kernel+0x27c/0x558
 __primary_switched+0x80/0x88
---[ end Kernel panic - not syncing: Unable to initialise architected timer. ]---
Quoted 2 lines

I'll just keep the affected tests disabled on arm64 for the time being.

We should skip the tests on arm64+acpi, which is similar to disabling but not exactly the same. There will likely be more DT overlay usage in kunit and so that will lead to more test disabling. Skipping properly is the better solution.

#30 lore raw

Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data

Quoted 25 lines · Stephen Boyd

Quoting Guenter Roeck (2024-10-03 17:25:37)

Quoted 10 lines · Stephen Boyd

[ ... ]

Quoted 4 lines

That DT test has been there for a few releases. Is this the first time those tests have been run on arm64+acpi? I didn't try after sending the patches and forgot that the patch was dropped.

Previously I had the affected tests disabled and never tracked down the problem. Since the problem is now spreading to additional tests, I finally tracked it down, that is all.

Ok great. Good to know this isn't a new problem. Thanks for tracking it down.

Quoted 10 lines
Quoted 9 lines

How are you running kunit tests? I installed the qemu-efi-aarch64 debian package to get QEMU_EFI.fd but passing that to the kunit.py run command with --qemu_args="-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd" didn't get me beyond the point that the EFI stub boots linux. I think the serial console must not be working and thus the kunit wrapper waits for something to show up but nothing ever does. I haven't dug any further though, so maybe you have a working command.

Quoted 8 lines
Quoted 4 lines

I run all tests during boot, not from the command line. I also use the -bios command but don't recall any issues with the console. I specify the console on the qemu command line; depending on the qemu machine it is either ttyS0 or ttyAMA0. The init script then finds and selects the active console.

Can you please describe how you run the kunit test? And provide the qemu command you run to boot arm64 with acpi?

Example command line:

qemu-system-aarch64 -M virt -m 512 \
     -kernel arch/arm64/boot/Image -no-reboot -nographic \
     -snapshot \
     -bios /opt/buildbot/rootfs/arm64/../firmware/QEMU_EFI-aarch64.fd \
     -device virtio-blk-device,drive=d0 \
     -drive file=rootfs.ext2,if=none,id=d0,format=raw \
     -cpu cortex-a57 -serial stdio -monitor none -no-reboot \
     --append "kunit.stats_enabled=2 kunit.filter=speed>slow root=/dev/vda rootwait earlycon=pl011,0x9000000 console=ttyAMA0"

That works fine for me. Configuration is arm64 defconfig plus various debug and kunit options. I built the efi image myself from sources. The root file system is from buildroot with modified init script. kunit tests are all built into the kernel and run during boot.

Quoted 7 lines
Quoted 2 lines

I'll just keep the affected tests disabled on arm64 for the time being.

We should skip the tests on arm64+acpi, which is similar to disabling but not exactly the same. There will likely be more DT overlay usage in kunit and so that will lead to more test disabling. Skipping properly is the better solution.

Sure, but having those tests fail all the time doesn't help either. I'll re-enable the tests if / when they are skipped.

Thanks,
Guenter

author maintainer
#31 lore raw

Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data

Quoting Guenter Roeck (2024-10-03 21:52:09)

Quoted 17 lines · Stephen Boyd
Quoted 4 lines

Can you please describe how you run the kunit test? And provide the qemu command you run to boot arm64 with acpi?

Example command line:

qemu-system-aarch64 -M virt -m 512 \
      -kernel arch/arm64/boot/Image -no-reboot -nographic \
      -snapshot \
      -bios /opt/buildbot/rootfs/arm64/../firmware/QEMU_EFI-aarch64.fd \
      -device virtio-blk-device,drive=d0 \
      -drive file=rootfs.ext2,if=none,id=d0,format=raw \
      -cpu cortex-a57 -serial stdio -monitor none -no-reboot \
      --append "kunit.stats_enabled=2 kunit.filter=speed>slow root=/dev/vda rootwait earlycon=pl011,0x9000000 console=ttyAMA0"
Quoted 4 lines

That works fine for me. Configuration is arm64 defconfig plus various debug and kunit options. I built the efi image myself from sources. The root file system is from buildroot with modified init script. kunit tests are all built into the kernel and run during boot.

Thanks. I figured out that I was missing enabling CONFIG_ACPI. Here's my commandline

./tools/testing/kunit/kunit.py run --arch=arm64 \
	--kunitconfig=drivers/of \
	--qemu_args="-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd -smp 2" \
	--kconfig_add="CONFIG_ACPI=y" \
	--kernel_args="earlycon=pl011,0x9000000"

Now I can boot and reproduce the failure, but there's another problem. ACPI disables itself when it fails to find tables.

ACPI: Unable to load the System Description Tables

This calls disable_acpi() which sets acpi_disabled to 1. This happens before the unit test runs, meaning we can't reliably use 'acpi_disabled' as a method to skip.

The best I can come up with then is to test for a NULL of_root when CONFIG_ARM64 and CONFIG_ACPI are enabled, because the tests intentionally don't work when both those configs are enabled and the 'of_root' isn't populated. In all other cases the 'of_root' missing is a bug. I'll probably make this into some sort of kunit helper function in of_private.h and send it to DT maintainers.

---8<----

drivers/of/of_kunit_helpers.c +3 -0
index 287d6c91bb37..a1330e183230 100644
@@ -36,6 +36,9 @@ int of_overlay_fdt_apply_kunit(struct kunit *test, void *overlay_fdt,
 	int ret;
 	int *copy_id;
 
+	if (IS_ENABLED(CONFIG_ARM64) && IS_ENABLED(CONFIG_ACPI) && !of_root)
+		kunit_skip(test, "arm64+acpi rejects overlays");
+
 	copy_id = kunit_kmalloc(test, sizeof(*copy_id), GFP_KERNEL);
 	if (!copy_id)
 		return -ENOMEM;
drivers/of/of_test.c +2 -0
index c85a258bc6ae..6cca43bf8029 100644
@@ -38,6 +38,8 @@ static int of_dtb_test_init(struct kunit *test)
 {
 	if (!IS_ENABLED(CONFIG_OF_EARLY_FLATTREE))
 		kunit_skip(test, "requires CONFIG_OF_EARLY_FLATTREE");
+	if (IS_ENABLED(CONFIG_ARM64) && IS_ENABLED(CONFIG_ACPI) && !of_root)
+		kunit_skip(test, "arm64+acpi doesn't populate a root node on ACPI systems");
 
 	return 0;
 }
drivers/of/overlay_test.c +2 -0
index 19a292cdeee3..3e7ac97a6796 100644
@@ -64,6 +64,8 @@ static void of_overlay_apply_kunit_cleanup(struct kunit *test)
 
 	if (!IS_ENABLED(CONFIG_OF_EARLY_FLATTREE))
 		kunit_skip(test, "requires CONFIG_OF_EARLY_FLATTREE for root node");
+	if (IS_ENABLED(CONFIG_ARM64) && IS_ENABLED(CONFIG_ACPI) && !of_root)
+		kunit_skip(test, "arm64+acpi rejects overlays");
 
 	kunit_init_test(&fake, "fake test", NULL);
 	KUNIT_ASSERT_EQ(test, fake.status, KUNIT_SUCCESS);
#32 lore raw

Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data

Quoted 41 lines · Stephen Boyd

Quoting Guenter Roeck (2024-10-03 21:52:09)

Quoted 17 lines · Stephen Boyd
Quoted 4 lines

Can you please describe how you run the kunit test? And provide the qemu command you run to boot arm64 with acpi?

Example command line:

qemu-system-aarch64 -M virt -m 512 \
       -kernel arch/arm64/boot/Image -no-reboot -nographic \
       -snapshot \
       -bios /opt/buildbot/rootfs/arm64/../firmware/QEMU_EFI-aarch64.fd \
       -device virtio-blk-device,drive=d0 \
       -drive file=rootfs.ext2,if=none,id=d0,format=raw \
       -cpu cortex-a57 -serial stdio -monitor none -no-reboot \
       --append "kunit.stats_enabled=2 kunit.filter=speed>slow root=/dev/vda rootwait earlycon=pl011,0x9000000 console=ttyAMA0"
Quoted 4 lines

That works fine for me. Configuration is arm64 defconfig plus various debug and kunit options. I built the efi image myself from sources. The root file system is from buildroot with modified init script. kunit tests are all built into the kernel and run during boot.

Thanks. I figured out that I was missing enabling CONFIG_ACPI. Here's my commandline

./tools/testing/kunit/kunit.py run --arch=arm64 \
	--kunitconfig=drivers/of \
	--qemu_args="-bios /usr/share/qemu-efi-aarch64/QEMU_EFI.fd -smp 2" \
	--kconfig_add="CONFIG_ACPI=y" \
	--kernel_args="earlycon=pl011,0x9000000"

Now I can boot and reproduce the failure, but there's another problem. ACPI disables itself when it fails to find tables.

ACPI: Unable to load the System Description Tables

This calls disable_acpi() which sets acpi_disabled to 1. This happens before the unit test runs, meaning we can't reliably use 'acpi_disabled' as a method to skip.

Quoted 6 lines

The best I can come up with then is to test for a NULL of_root when CONFIG_ARM64 and CONFIG_ACPI are enabled, because the tests intentionally don't work when both those configs are enabled and the 'of_root' isn't populated. In all other cases the 'of_root' missing is a bug. I'll probably make this into some sort of kunit helper function in of_private.h and send it to DT maintainers.

Sounds good. Thanks a lot for tracking this down.

That makes me wonder though why only arm64 has that restriction. Both riscv and loongarch have ACPI enabled in their defconfig files but call unflatten_device_tree() unconditionally.

Oh well ...

Thanks,
Guenter

author maintainer
#33 lore raw

Re: [PATCH v8 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data

Quoting Guenter Roeck (2024-10-08 16:27:37)

Quoted 9 lines · Stephen Boyd
Quoted 7 lines

The best I can come up with then is to test for a NULL of_root when CONFIG_ARM64 and CONFIG_ACPI are enabled, because the tests intentionally don't work when both those configs are enabled and the 'of_root' isn't populated. In all other cases the 'of_root' missing is a bug. I'll probably make this into some sort of kunit helper function in of_private.h and send it to DT maintainers.

Quoted 7 lines

Sounds good. Thanks a lot for tracking this down.

That makes me wonder though why only arm64 has that restriction. Both riscv and loongarch have ACPI enabled in their defconfig files but call unflatten_device_tree() unconditionally.

Oh well ...

Some of the reason is described in the thread I linked earlier. In particular, this email from Mark[1]. There's also more comments from Mark on an earlier patchset[2]. Maybe arm64 will allow it later, and then we'll be able to revert this skip patch.

[1] https://lore.kernel.org/all/[email protected]/
[2] https://lore.kernel.org/all/ZaZtbU9hre3YhZam@FVFF77S0Q05N/