All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaud POULIQUEN <arnaud.pouliquen@foss.st.com>
To: "Rob Herring (Arm)" <robh@kernel.org>,
	Saravana Kannan <saravanak@google.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	"Bjorn Andersson" <andersson@kernel.org>,
	Mathieu Poirier <mathieu.poirier@linaro.org>,
	Shawn Guo <shawnguo@kernel.org>,
	Sascha Hauer <s.hauer@pengutronix.de>,
	Pengutronix Kernel Team <kernel@pengutronix.de>,
	Fabio Estevam <festevam@gmail.com>,
	Patrice Chotard <patrice.chotard@foss.st.com>,
	Maxime Coquelin <mcoquelin.stm32@gmail.com>,
	Alexandre Torgue <alexandre.torgue@foss.st.com>,
	Chen-Yu Tsai <wens@kernel.org>
Cc: <devicetree@vger.kernel.org>, <linux-kernel@vger.kernel.org>,
	<linux-remoteproc@vger.kernel.org>, <imx@lists.linux.dev>,
	<linux-arm-kernel@lists.infradead.org>,
	<linux-arm-msm@vger.kernel.org>,
	<linux-stm32@st-md-mailman.stormreply.com>,
	Daniel Baluta <daniel.baluta@nxp.com>
Subject: Re: [PATCH v2 1/4] of: reserved_mem: Add functions to parse "memory-region"
Date: Mon, 28 Apr 2025 10:07:51 +0200	[thread overview]
Message-ID: <4e6840e5-34a7-4f15-a13a-1ff1ea5eff85@foss.st.com> (raw)
In-Reply-To: <20250423-dt-memory-region-v2-v2-1-2fbd6ebd3c88@kernel.org>

Hello Rob,

On 4/23/25 21:42, Rob Herring (Arm) wrote:
> Drivers with "memory-region" properties currently have to do their own
> parsing of "memory-region" properties. The result is all the drivers
> have similar patterns of a call to parse "memory-region" and then get
> the region's address and size. As this is a standard property, it should
> have common functions for drivers to use. Add new functions to count the
> number of regions and retrieve the region's address as a resource.
> 
> Reviewed-by: Daniel Baluta <daniel.baluta@nxp.com>
> Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
> ---
> v2:
>  - Wrap function parameters
> ---
>  drivers/of/of_reserved_mem.c    | 80 +++++++++++++++++++++++++++++++++++++++++
>  include/linux/of_reserved_mem.h | 26 ++++++++++++++
>  2 files changed, 106 insertions(+)
> 
> diff --git a/drivers/of/of_reserved_mem.c b/drivers/of/of_reserved_mem.c
> index ee2e31522d7e..f87915cce961 100644
> --- a/drivers/of/of_reserved_mem.c
> +++ b/drivers/of/of_reserved_mem.c
> @@ -12,6 +12,7 @@
>  #define pr_fmt(fmt)	"OF: reserved mem: " fmt
>  
>  #include <linux/err.h>
> +#include <linux/ioport.h>
>  #include <linux/libfdt.h>
>  #include <linux/of.h>
>  #include <linux/of_fdt.h>
> @@ -740,3 +741,82 @@ struct reserved_mem *of_reserved_mem_lookup(struct device_node *np)
>  	return NULL;
>  }
>  EXPORT_SYMBOL_GPL(of_reserved_mem_lookup);
> +
> +/**
> + * of_reserved_mem_region_to_resource() - Get a reserved memory region as a resource
> + * @np:		node containing 'memory-region' property
> + * @idx:	index of 'memory-region' property to lookup
> + * @res:	Pointer to a struct resource to fill in with reserved region
> + *
> + * This function allows drivers to lookup a node's 'memory-region' property
> + * entries by index and return a struct resource for the entry.
> + *
> + * Returns 0 on success with @res filled in. Returns -ENODEV if 'memory-region'
> + * is missing or unavailable, -EINVAL for any other error.
> + */
> +int of_reserved_mem_region_to_resource(const struct device_node *np,
> +				       unsigned int idx, struct resource *res)
> +{
> +	struct reserved_mem *rmem;
> +
> +	if (!np)
> +		return -EINVAL;
> +
> +	struct device_node __free(device_node) *target = of_parse_phandle(np, "memory-region", idx);
> +	if (!target || !of_device_is_available(target))
> +		return -ENODEV;
> +
> +	rmem = of_reserved_mem_lookup(target);
> +	if (!rmem)
> +		return -EINVAL;
> +
> +	resource_set_range(res, rmem->base, rmem->size);
> +	res->name = rmem->name;
> +	return 0;
> +}
> +EXPORT_SYMBOL_GPL(of_reserved_mem_region_to_resource);
> +
> +/**
> + * of_reserved_mem_region_to_resource_byname() - Get a reserved memory region as a resource
> + * @np:		node containing 'memory-region' property
> + * @name:	name of 'memory-region' property entry to lookup
> + * @res:	Pointer to a struct resource to fill in with reserved region
> + *
> + * This function allows drivers to lookup a node's 'memory-region' property
> + * entries by name and return a struct resource for the entry.
> + *
> + * Returns 0 on success with @res filled in. Returns -ENODEV if 'memory-region'
> + * is missing or unavailable, -EINVAL for any other error.

of_property_match_string() can return some other error values.

Thanks,
Arnaud

> + */
> +int of_reserved_mem_region_to_resource_byname(const struct device_node *np,
> +					      const char *name,
> +					      struct resource *res)
> +{
> +	int idx;
> +
> +	if (!name)
> +		return -EINVAL;
> +
> +	idx = of_property_match_string(np, "memory-region-names", name);
> +	if (idx < 0)
> +		return idx;
> +
> +	return of_reserved_mem_region_to_resource(np, idx, res);
> +}
> +EXPORT_SYMBOL_GPL(of_reserved_mem_region_to_resource_byname);
> +
> +/**
> + * of_reserved_mem_region_count() - Return the number of 'memory-region' entries
> + * @np:		node containing 'memory-region' property
> + *
> + * This function allows drivers to retrieve the number of entries for a node's
> + * 'memory-region' property.
> + *
> + * Returns the number of entries on success, or negative error code on a
> + * malformed property.
> + */
> +int of_reserved_mem_region_count(const struct device_node *np)
> +{
> +	return of_count_phandle_with_args(np, "memory-region", NULL);
> +}
> +EXPORT_SYMBOL_GPL(of_reserved_mem_region_count);
> diff --git a/include/linux/of_reserved_mem.h b/include/linux/of_reserved_mem.h
> index e338282da652..f573423359f4 100644
> --- a/include/linux/of_reserved_mem.h
> +++ b/include/linux/of_reserved_mem.h
> @@ -7,6 +7,7 @@
>  
>  struct of_phandle_args;
>  struct reserved_mem_ops;
> +struct resource;
>  
>  struct reserved_mem {
>  	const char			*name;
> @@ -39,6 +40,12 @@ int of_reserved_mem_device_init_by_name(struct device *dev,
>  void of_reserved_mem_device_release(struct device *dev);
>  
>  struct reserved_mem *of_reserved_mem_lookup(struct device_node *np);
> +int of_reserved_mem_region_to_resource(const struct device_node *np,
> +				       unsigned int idx, struct resource *res);
> +int of_reserved_mem_region_to_resource_byname(const struct device_node *np,
> +					      const char *name, struct resource *res);
> +int of_reserved_mem_region_count(const struct device_node *np);
> +
>  #else
>  
>  #define RESERVEDMEM_OF_DECLARE(name, compat, init)			\
> @@ -63,6 +70,25 @@ static inline struct reserved_mem *of_reserved_mem_lookup(struct device_node *np
>  {
>  	return NULL;
>  }
> +
> +static inline int of_reserved_mem_region_to_resource(const struct device_node *np,
> +						     unsigned int idx,
> +						     struct resource *res)
> +{
> +	return -ENOSYS;
> +}
> +
> +static inline int of_reserved_mem_region_to_resource_byname(const struct device_node *np,
> +							    const char *name,
> +							    struct resource *res)
> +{
> +	return -ENOSYS;
> +}
> +
> +static inline int of_reserved_mem_region_count(const struct device_node *np)
> +{
> +	return 0;
> +}
>  #endif
>  
>  /**
> 

  reply	other threads:[~2025-04-28  8:11 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-23 19:42 [PATCH v2 0/4] of: Common "memory-region" parsing Rob Herring (Arm)
2025-04-23 19:42 ` [PATCH v2 1/4] of: reserved_mem: Add functions to parse "memory-region" Rob Herring (Arm)
2025-04-28  8:07   ` Arnaud POULIQUEN [this message]
2025-04-23 19:42 ` [PATCH v2 2/4] of: Simplify of_dma_set_restricted_buffer() to use of_for_each_phandle() Rob Herring (Arm)
2025-04-23 19:42 ` [PATCH v2 3/4] devres: Export devm_ioremap_resource_wc() Rob Herring (Arm)
2025-04-23 19:42 ` [PATCH v2 4/4] remoteproc: Use of_reserved_mem_region_* functions for "memory-region" Rob Herring (Arm)
2025-05-02 15:40   ` Tanmay Shah
2025-05-02 20:33     ` Rob Herring
2025-04-24 14:14 ` [PATCH v2 0/4] of: Common "memory-region" parsing Mathieu Poirier
2025-04-25 23:34   ` Iuliana Prodan
2025-04-28 12:23     ` Rob Herring
2025-04-28 21:40       ` Iuliana Prodan
2025-05-01 15:44   ` Tanmay Shah
2025-05-01 23:56     ` Tanmay Shah
2025-04-28  8:16 ` Arnaud POULIQUEN
2025-05-07  4:42 ` Peng Fan

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=4e6840e5-34a7-4f15-a13a-1ff1ea5eff85@foss.st.com \
    --to=arnaud.pouliquen@foss.st.com \
    --cc=akpm@linux-foundation.org \
    --cc=alexandre.torgue@foss.st.com \
    --cc=andersson@kernel.org \
    --cc=daniel.baluta@nxp.com \
    --cc=devicetree@vger.kernel.org \
    --cc=festevam@gmail.com \
    --cc=imx@lists.linux.dev \
    --cc=kernel@pengutronix.de \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-remoteproc@vger.kernel.org \
    --cc=linux-stm32@st-md-mailman.stormreply.com \
    --cc=mathieu.poirier@linaro.org \
    --cc=mcoquelin.stm32@gmail.com \
    --cc=patrice.chotard@foss.st.com \
    --cc=robh@kernel.org \
    --cc=s.hauer@pengutronix.de \
    --cc=saravanak@google.com \
    --cc=shawnguo@kernel.org \
    --cc=wens@kernel.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.