From: Marco Felsch <m.felsch@pengutronix.de>
To: Ahmad Fatoum <a.fatoum@barebox.org>
Cc: barebox@lists.infradead.org
Subject: Re: [PATCH 2/5] common: deep-probe: support specifying support in DT
Date: Wed, 28 May 2025 17:24:31 +0200 [thread overview]
Message-ID: <20250528152431.db7nmbovzxkllf2u@pengutronix.de> (raw)
In-Reply-To: <20250528131411.935668-2-a.fatoum@barebox.org>
Hi Ahmad,
On 25-05-28, Ahmad Fatoum wrote:
> New boards should be deep probe enabled by default, which is currently
> done via board code. We want to support second stage boot on new boards
> without board code however, which means we need the possibility to make
> deep probe opt-out instead of opt-in.
>
> Signed-off-by: Ahmad Fatoum <a.fatoum@barebox.org>
> ---
> .../bindings/barebox/barebox,deep-probe.rst | 39 +++++++++++++++++++
> common/deep-probe.c | 26 +++++++++++--
> drivers/base/Kconfig | 22 +++++++++++
> 3 files changed, 84 insertions(+), 3 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/barebox/barebox,deep-probe.rst
>
> diff --git a/Documentation/devicetree/bindings/barebox/barebox,deep-probe.rst b/Documentation/devicetree/bindings/barebox/barebox,deep-probe.rst
> new file mode 100644
> index 000000000000..bfc28ac9d1ca
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/barebox/barebox,deep-probe.rst
> @@ -0,0 +1,39 @@
> +Deep probe properties
> +=====================
> +
> +A ``barebox,deep-probe`` property in the top-level node indicates to barebox
> +that the barebox board and device drivers support recursively probing devices
> +on demand (deep probe).
> +
> +For drivers to support deep probe, they must not rely on initcall ordering.
> +Resources needed by drivers should be referenced via device tree, e.g.,
> +instead of direct use of hardcoded GPIO numbers, GPIOs must either be:
> +
> +* described in the device's device tree node and requested using API that
> + that takes the device or the device tree node as argument
> +
> +* probe of the GPIO controller be ensured via ``of_device_ensure_probed``,
> + e.g., ``of_devices_ensure_probed_by_property("gpio-controller");``
> +
> +The inverted flag is ``barebox,disable-deep-probe``, which means that the
> +board is not deep probe capable (or tested) yet.
> +
> +The ``barebox,disable-deep-probe`` property takes precedence over
> +``barebox,deep-probe``, but not over ``BAREBOX_DEEP_PROBE_ENABLE``
> +in the board code.
> +
> +If neither property exists, the default deep probe behavior depends on
> +the ``CONFIG_DEEP_PROBE_DEFAULT`` variable.
> +
> +.. code-block:: none
> +
> + / { /* SoM Device Tree */
> + barebox,deep-probe;
> + };
> +
> + / { /* Board Device Tree */
> + /* FIXME: While the SoM supports deep probe, our board code is broken
> + * currently, so override until it's fixed
> + */
> + barebox,disable-deep-probe;
> + };
> diff --git a/common/deep-probe.c b/common/deep-probe.c
> index ab1da87b626b..0a7f2f3769ae 100644
> --- a/common/deep-probe.c
> +++ b/common/deep-probe.c
> @@ -20,11 +20,18 @@ static enum deep_probe_state boardstate = DEEP_PROBE_UNKNOWN;
>
> bool deep_probe_is_supported(void)
> {
> + bool deep_probe_default = IS_ENABLED(CONFIG_DEEP_PROBE_DEFAULT);
> struct deep_probe_entry *board;
> + struct device_node *root;
>
> if (boardstate > DEEP_PROBE_UNKNOWN)
> return boardstate;
>
> + /* deep probe requires resources to be described in DT */
> + root = of_get_root_node();
> + if (!root)
> + return false;
if (!root) {
boardstate = DEEP_PROBE_NOT_SUPPORTED;
return false;
}
> +
> /* determine boardstate */
> for (board = __barebox_deep_probe_start;
> board != __barebox_deep_probe_end; board++) {
> @@ -39,8 +46,21 @@ bool deep_probe_is_supported(void)
> }
> }
>
> - boardstate = DEEP_PROBE_NOT_SUPPORTED;
> - pr_info("not activated\n");
> - return false;
Can we please add a comment about the below if-else, e.g. referencing
the barebox,deep-probe.rst as well?
> + if (of_property_read_bool(root, "barebox,disable-deep-probe")) {
> + boardstate = DEEP_PROBE_NOT_SUPPORTED;
> + pr_info("disabled in device tree\n");
> + } else if (of_property_read_bool(root, "barebox,deep-probe")) {
> + boardstate = DEEP_PROBE_SUPPORTED;
> + pr_debug("enabled in device tree\n");
> + } else if (deep_probe_default) {
> + boardstate = DEEP_PROBE_SUPPORTED;
> + pr_debug("activated by default\n");
> + } else {
> + boardstate = DEEP_PROBE_NOT_SUPPORTED;
> + pr_warn("DT missing barebox,deep-probe or barebox,disable-deep-probe property\n");
> + pr_info("not activated by default\n");
> + }
> +
> + return boardstate;
> }
> EXPORT_SYMBOL_GPL(deep_probe_is_supported);
> diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig
> index 21a4793cfa47..5766e2afda9a 100644
> --- a/drivers/base/Kconfig
> +++ b/drivers/base/Kconfig
> @@ -1,5 +1,27 @@
> # SPDX-License-Identifier: GPL-2.0-only
>
> +config DEEP_PROBE_DEFAULT
> + bool "Probe devices recursively on-demand"
> + help
> + The barebox 'deep probe' or 'probe on demand' mechanism gets
> + rid of the EPROBE_DEFER error code from probes by reordering
> + the device population and the driver registration.
> + All drivers are registered first and afterwards devices are
> + populated. When a device probing requires a resource that's
> + not yet available, the device providing that resource is probed
> + recursively, hence the probe callstack gets deeper until all
> + resources are available.
> +
> + This changes the order in which drivers are initialized, which
> + can unearth bugs in drivers. Board code that makes use of
> + different initcall levels to interleave with driver probes
> + will behave differently.
> +
> + If unsure and you want to fix implicit assumptions that may
> + break your startup, say 'y'.
> + If unsure and you want deep probe to only be enabled
> + explicitly per top-level machine compatible, say 'n'.
> +
> config PM_GENERIC_DOMAINS
> bool
>
> --
> 2.39.5
>
>
>
next prev parent reply other threads:[~2025-05-28 16:28 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-28 13:14 [PATCH 1/5] common: deep-probe: inform only about lack of deep-probe support Ahmad Fatoum
2025-05-28 13:14 ` [PATCH 2/5] common: deep-probe: support specifying support in DT Ahmad Fatoum
2025-05-28 15:24 ` Marco Felsch [this message]
2025-05-28 15:40 ` Ahmad Fatoum
2025-05-28 15:46 ` Marco Felsch
2025-05-28 13:14 ` [PATCH 3/5] treewide: dts: describe deep probe support in device tree Ahmad Fatoum
2025-05-28 15:26 ` Marco Felsch
2025-05-28 13:14 ` [PATCH 4/5] ARM: configs: enable deep probe for the most popular configs Ahmad Fatoum
2025-05-28 15:26 ` Marco Felsch
2025-05-28 13:14 ` [PATCH 5/5] Documentation: migration-2025.07.0: document CONFIG_DEEP_PROBE_DEFAULT Ahmad Fatoum
2025-05-28 15:28 ` Marco Felsch
2025-05-28 14:59 ` [PATCH 1/5] common: deep-probe: inform only about lack of deep-probe support Marco Felsch
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250528152431.db7nmbovzxkllf2u@pengutronix.de \
--to=m.felsch@pengutronix.de \
--cc=a.fatoum@barebox.org \
--cc=barebox@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox