All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rob Herring <robh@kernel.org>
To: Kevin Hilman <khilman@baylibre.com>
Cc: Ulf Hansson <ulf.hansson@linaro.org>,
	Krzysztof Kozlowski <krzk+dt@kernel.org>,
	Conor Dooley <conor+dt@kernel.org>,
	"Rafael J. Wysocki" <rjw@rjwysocki.net>,
	linux-pm@vger.kernel.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org, arm-scmi@vger.kernel.org
Subject: Re: [PATCH RFC v2 2/2] pmdomain: core: use DT map to support hierarchy
Date: Fri, 30 May 2025 08:57:41 -0500	[thread overview]
Message-ID: <20250530135741.GA1598718-robh@kernel.org> (raw)
In-Reply-To: <20250528-pmdomain-hierarchy-onecell-v2-2-7885ae45e59c@baylibre.com>

On Wed, May 28, 2025 at 02:58:52PM -0700, Kevin Hilman wrote:
> Currently, PM domains can only support hierarchy for simple
> providers (e.g. ones with #power-domain-cells = 0).
> 
> Add support for oncell providers as well by adding support for a nexus
> node map, as described in section 2.5.1 of the DT spec.
> 
> For example, an SCMI PM domain provider might be a subdomain of
> multiple parent domains. In this example, the parent domains are
> MAIN_PD and WKUP_PD:
> 
>     scmi_pds: protocol@11 {
>         reg = <0x11>;
>         #power-domain-cells = <1>;
>         power-domain-map = <15 &MAIN_PD>,
>                            <19 &WKUP_PD>;
>     };
> 
> With the new map, child domain 15 (scmi_pds 15) becomes a
> subdomain of MAIN_PD, and child domain 19 (scmi_pds 19) becomes a
> subdomain of WKUP_PD.
> 
> Signed-off-by: Kevin Hilman <khilman@baylibre.com>
> ---
>  drivers/pmdomain/core.c | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 166 insertions(+)
> 
> diff --git a/drivers/pmdomain/core.c b/drivers/pmdomain/core.c
> index d6c1ddb807b2..b8e505516f3d 100644
> --- a/drivers/pmdomain/core.c
> +++ b/drivers/pmdomain/core.c
> @@ -2441,6 +2441,9 @@ static LIST_HEAD(of_genpd_providers);
>  /* Mutex to protect the list above. */
>  static DEFINE_MUTEX(of_genpd_mutex);
>  
> +static int of_genpd_parse_domains_map(struct device_node *np,
> +				      struct genpd_onecell_data *data);
> +
>  /**
>   * genpd_xlate_simple() - Xlate function for direct node-domain mapping
>   * @genpdspec: OF phandle args to map into a PM domain
> @@ -2635,6 +2638,14 @@ int of_genpd_add_provider_onecell(struct device_node *np,
>  	if (ret < 0)
>  		goto error;
>  
> +	/* Parse power-domains-map property for Nexus node mapping */
> +	ret = of_genpd_parse_domains_map(np, data);
> +	if (ret < 0 && ret != -ENOENT) {
> +		pr_err("Failed to parse power-domains-map for %pOF: %d\n", np, ret);
> +		of_genpd_del_provider(np);
> +		goto error;
> +	}
> +
>  	return 0;
>  
>  error:
> @@ -2734,6 +2745,161 @@ static struct generic_pm_domain *genpd_get_from_provider(
>  	return genpd;
>  }
>  
> +/**
> + * of_genpd_parse_domains_map() - Parse power-domains-map property for Nexus mapping
> + * @np: Device node pointer associated with the PM domain provider.
> + * @data: Pointer to the onecell data associated with the PM domain provider.
> + *
> + * Parse the power-domains-map property to establish parent-child relationships
> + * for PM domains using Nexus node mapping as defined in the device tree
> + * specification section v2.5.1.
> + *
> + * The power-domains-map property format is:
> + * power-domains-map = <child_specifier target_phandle [target_specifier]>, ...;
> + *
> + * Where:
> + * - child_specifier: The child domain ID that should be mapped
> + * - target_phandle: Phandle to the parent PM domain provider
> + * - target_specifier: Optional arguments for the parent provider (if it has #power-domain-cells > 0)
> + *
> + * Returns 0 on success, -ENOENT if property doesn't exist, or negative error code.
> + */
> +static int of_genpd_parse_domains_map(struct device_node *np,
> +				      struct genpd_onecell_data *data)
> +{
> +	struct of_phandle_args parent_args;
> +	struct generic_pm_domain *parent_genpd, *child_genpd;
> +	u32 *map_entries;
> +	int map_len, child_cells, i, ret;
> +	u32 child_id;
> +
> +	/* Check if power-domains-map property exists */
> +	map_len = of_property_count_u32_elems(np, "power-domains-map");
> +	if (map_len <= 0)
> +		return -ENOENT;

Don't implement your own map parsing. Use or extend 
of_parse_phandle_with_args_map().

Rob

  reply	other threads:[~2025-05-30 13:57 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-05-28 21:58 [PATCH RFC v2 0/2] pmdomains: core: add support for domain hierarchies in DT Kevin Hilman
2025-05-28 21:58 ` [PATCH RFC v2 1/2] dt-bindings: power: add nexus map for power-domains Kevin Hilman
2025-05-28 23:32   ` Rob Herring (Arm)
2025-05-30  9:31   ` Ulf Hansson
2025-05-28 21:58 ` [PATCH RFC v2 2/2] pmdomain: core: use DT map to support hierarchy Kevin Hilman
2025-05-30 13:57   ` Rob Herring [this message]
2025-06-06 22:24     ` Kevin Hilman
2025-06-13 22:43       ` Kevin Hilman
2025-06-02 10:04   ` Ulf Hansson

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=20250530135741.GA1598718-robh@kernel.org \
    --to=robh@kernel.org \
    --cc=arm-scmi@vger.kernel.org \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=khilman@baylibre.com \
    --cc=krzk+dt@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=rjw@rjwysocki.net \
    --cc=ulf.hansson@linaro.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.