clk: Add kunit tests for fixed rate and parent data
Subsystems (8)
Stephen Boyd
maintainerv7 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 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/clk/.kunitconfig | 2 + drivers/clk/Kconfig | 11 + drivers/clk/Makefile | 9 +- drivers/clk/clk-fixed-rate_test.c | 380 +++++++++++++++ drivers/clk/clk-fixed-rate_test.h | 8 + drivers/clk/clk_kunit_helpers.c | 204 ++++++++ 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 | 2 + drivers/of/kunit_overlay_test.dtso | 9 + drivers/of/of_kunit_helpers.c | 74 +++ 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 ++++++++++++ 28 files changed, 2087 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
Stephen Boyd
maintainerPATCH v7 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
@@ -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
Re: [PATCH v7 1/8] of/platform: Allow overlays to create platform devices from the root node
Quoting Stephen Boyd (2024-07-10 13:12:37)
Quoted 10 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 withOF_POPULATED_BUSbyof_platform_default_populate_init()callingof_platform_default_populate()with NULL as the first argument.
Quoted 8 lines
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.
Reviewed-by Rob Herring (Arm) <[email protected]>Cc Saravana Kannan <[email protected]>Signed-off-by Stephen Boyd <[email protected]>---
Applied to clk-next
Re: [PATCH v7 1/8] of/platform: Allow overlays to create platform devices from the root node
In reply to Stephen BoydHi Stephen,
Quoted 10 lines · Stephen Boyd
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 withOF_POPULATED_BUSbyof_platform_default_populate_init()callingof_platform_default_populate()with NULL as the first argument.
Quoted 7 lines
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.
Reviewed-by Rob Herring (Arm) <[email protected]>Cc Saravana Kannan <[email protected]>Signed-off-by Stephen Boyd <[email protected]>
Thanks for your patch, which is now commit 98290f295fbcf18f ("of/platform: Allow overlays to create platform devices from the root node") in clk/clk-next.
This causes i2c-demux-pinctrl to fail on the Koelsch development board:
i2c-demux-pinctrl i2c-mux1: failed to setup demux-adapter 0 (-19) i2c-demux-pinctrl i2c-mux2: failed to setup demux-adapter 0 (-19) i2c-demux-pinctrl i2c-mux3: failed to setup demux-adapter 0 (-19) i2c-demux-pinctrl i2c-mux2: Failed to create device link
(0x180) with e6ef0000.video
i2c-demux-pinctrl i2c-mux2: Failed to create device link
(0x180) with e6ef1000.video
i2c-demux-pinctrl i2c-mux2: Failed to create device link
(0x180) with hdmi-in
i2c-demux-pinctrl i2c-mux2: Failed to create device link
(0x180) with hdmi-out
and anything relying on I2C connected to these muxes fails, too.
Also, loading the 25LC040 DT overlay[1] on Ebisu using the out-of-tree of-configfs now fails, too.
Quoted 5 lines
drivers/of/platform.c +0
-0@@ -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;
drivers/of/platform.c static int of_platform_notify(struct notifier_block *nb, · line 741
Quoted 10 lines
drivers/of/platform.c +4
-2bool 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) &&
Parent = /soc, so this returns early. Hence of_changeset_apply() [2] didn't add the I2C mux bus, causing of_get_i2c_adapter_by_node() [3] to fail.
drivers/of/platform.c static int of_platform_notify(struct notifier_block *nb, · line 742
Quoted 1 line
drivers/of/platform.c +1
-0+ of_node_check_flag(parent, OF_POPULATED_BUS))
Oh, you inverted the check for of_node_check_flag(); was that intentional? Re-adding the "!" fixes all issues for me.
drivers/of/platform.c static int of_platform_notify(struct notifier_block *nb, · line 758
Quoted 12 lines
drivers/of/platform.c +1
-1return 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);
[1] https://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers.git/tree/arch/arm64/boot/dts/renesas/r8a77990-ebisu-cn41-msiof0-25lc040.dtso?h=topic/renesas-overlays
[2] https://elixir.bootlin.com/linux/latest/source/drivers/i2c/muxes/i2c-demux-pinctrl.c#L60
[3] https://elixir.bootlin.com/linux/latest/source/drivers/i2c/muxes/i2c-demux-pinctrl.c#L64
Gr{oetje,eeting}s,
Geert
Signature · 5 lines
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected] In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds
Re: [PATCH v7 1/8] of/platform: Allow overlays to create platform devices from the root node
Quoted 27 lines · Geert Uytterhoeven
Quoted 26 lines · Stephen Boyd
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 withOF_POPULATED_BUSbyof_platform_default_populate_init()callingof_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.
Reviewed-by Rob Herring (Arm) <[email protected]>Cc Saravana Kannan <[email protected]>Signed-off-by Stephen Boyd <[email protected]>drivers/of/platform.c +1
-0@@ -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;
Quoted 11 lines
drivers/of/platform.c static int of_platform_notify(struct notifier_block *nb, · line 742
Quoted 8 lines
drivers/of/platform.c +4
-2switch (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 ))Oh, you inverted the check for
of_node_check_flag(); was that intentional? Re-adding the "!" fixes all issues for me.
I have sent a fix.
https://lore.kernel.org/a9ada686e1f1c6f496e423deaf108f1bcfd94d7d.1721123679.git.geert+renesas@glider.be/
Gr{oetje,eeting}s,
Geert
Signature · 5 lines
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected] In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds
Stephen Boyd
maintainerPATCH v7 2/8 of: Add test managed wrappers for of_overlay_apply()/of_node_put()
In reply to Stephen BoydAdd 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 | 74 +++++++++++++ include/kunit/of.h | 115 ++++++++++++++++++++ 5 files changed, 214 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
@@ -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
@@ -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
@@ -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 +74 -0
74 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
Re: [PATCH v7 2/8] of: Add test managed wrappers for of_overlay_apply()/of_node_put()
Quoting Stephen Boyd (2024-07-10 13:12:38)
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
Suggested-by Rob Herring <[email protected]>Cc Rob Herring <[email protected]>Cc Saravana Kannan <[email protected]>Reviewed-by Rob Herring (Arm) <[email protected]>Reviewed-by David Gow <[email protected]>Signed-off-by Stephen Boyd <[email protected]>---
Applied to clk-next
Stephen Boyd
maintainerPATCH v7 3/8 dt-bindings: vendor-prefixes: Add "test" vendor for KUnit and friends
In reply to Stephen BoydAdd 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
@@ -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
Re: [PATCH v7 3/8] dt-bindings: vendor-prefixes: Add "test" vendor for KUnit and friends
Quoting Stephen Boyd (2024-07-10 13:12:39)
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.
Reviewed-by Rob Herring <[email protected]>Reviewed-by David Gow <[email protected]>Cc Krzysztof Kozlowski <[email protected]>Cc Conor Dooley <[email protected]>Signed-off-by Stephen Boyd <[email protected]>---
Applied to clk-next
Stephen Boyd
maintainerPATCH v7 4/8 of: Add a KUnit test for overlays and test managed APIs
In reply to Stephen BoydTest 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.
--- drivers/of/.kunitconfig | 1 + drivers/of/Kconfig | 10 +++ drivers/of/Makefile | 1 + drivers/of/kunit_overlay_test.dtso | 9 +++ drivers/of/overlay_test.c | 115 +++++++++++++++++++++++++++++ 5 files changed, 136 insertions(+) create mode 100644 drivers/of/kunit_overlay_test.dtso create mode 100644 drivers/of/overlay_test.c
drivers/of/.kunitconfig +1 -0
@@ -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
@@ -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 +1 -0
@@ -21,5 +21,6 @@ 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 kunit_overlay_test.dtbo.o obj-$(CONFIG_OF_UNITTEST) += unittest-data/
drivers/of/kunit_overlay_test.dtso new file +9 -0
@@ -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
Re: [PATCH v7 4/8] of: Add a KUnit test for overlays and test managed APIs
Quoting Stephen Boyd (2024-07-10 13:12:40)
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]>Reviewed-by David Gow <[email protected]>Cc Rae Moar <[email protected]>Reviewed-by Rob Herring (Arm) <[email protected]>Signed-off-by Stephen Boyd <[email protected]>
Quoted 1 line
---
Applied to clk-next
Stephen Boyd
maintainerPATCH v7 5/8 platform: Add test managed platform_device/driver APIs
In reply to Stephen BoydIntroduce 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 + include/kunit/platform_device.h | 20 ++ lib/kunit/Makefile | 4 +- lib/kunit/platform-test.c | 224 +++++++++++++ lib/kunit/platform.c | 302 ++++++++++++++++++ 6 files changed, 564 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
@@ -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
@@ -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:
include/kunit/platform_device.h new file +20 -0
@@ -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
@@ -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
Re: [PATCH v7 5/8] platform: Add test managed platform_device/driver APIs
Quoting Stephen Boyd (2024-07-10 13:12:41)
Quoted 9 lines
Introduce KUnit resource wrappers around
platform_driver_register(),platform_device_alloc(), andplatform_device_add()so that test authors can register platformdrivers/devicesfrom their tests and have thedrivers/devicesautomatically 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
Cc Brendan Higgins <[email protected]>Reviewed-by David Gow <[email protected]>Cc Rae Moar <[email protected]>Reviewed-by Greg Kroah-Hartman <[email protected]>Cc "Rafael J. Wysocki" <[email protected]>Signed-off-by Stephen Boyd <[email protected]>---
Applied to clk-next
Stephen Boyd
maintainerPATCH v7 6/8 clk: Add test managed clk provider/consumer APIs
In reply to Stephen BoydUnit 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.
--- 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 | 204 ++++++++++++++++++++ include/kunit/clk.h | 28 +++ 5 files changed, 252 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
@@ -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
@@ -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
@@ -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 +204 -0
204 lines not on this page · raw message
include/kunit/clk.h new file +28 -0
@@ -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
Re: [PATCH v7 6/8] clk: Add test managed clk provider/consumer APIs
Quoting Stephen Boyd (2024-07-10 13:12:42)
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]>Signed-off-by Stephen Boyd <[email protected]>---
Applied to clk-next
Stephen Boyd
maintainerPATCH v7 7/8 clk: Add KUnit tests for clk fixed rate basic type
In reply to Stephen BoydTest that the fixed rate basic type clk works as intended.
--- drivers/clk/.kunitconfig | 2 + drivers/clk/Kconfig | 9 + drivers/clk/Makefile | 1 + 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, 419 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
@@ -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
@@ -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 +1 -0
@@ -6,6 +6,7 @@ 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 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
@@ -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
@@ -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
Re: [PATCH v7 7/8] clk: Add KUnit tests for clk fixed rate basic type
Quoting Stephen Boyd (2024-07-10 13:12:43)
Quoted 7 lines
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]>Signed-off-by Stephen Boyd <[email protected]>---
Applied to clk-next
Stephen Boyd
maintainerPATCH v7 8/8 clk: Add KUnit tests for clks registered with struct clk_parent_data
In reply to Stephen BoydTest that clks registered with 'struct clk_parent_data' work as intended and can find their parents.
--- drivers/clk/Kconfig | 2 + drivers/clk/Makefile | 3 +- 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, 494 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
@@ -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 +2 -1
@@ -2,7 +2,8 @@ # 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 \ + 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
@@ -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
@@ -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
Re: [PATCH v7 8/8] clk: Add KUnit tests for clks registered with struct clk_parent_data
Quoting Stephen Boyd (2024-07-10 13:12:44)
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]>Reviewed-by David Gow <[email protected]>Cc Rae Moar <[email protected]>Signed-off-by Stephen Boyd <[email protected]>---
Applied to clk-next