All of lore.kernel.org
 help / color / mirror / Atom feed
From: joelf@ti.com (Joel Fernandes)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 2/7] of: introduce of_dma_get_range() helper
Date: Mon, 21 Apr 2014 23:09:27 -0500	[thread overview]
Message-ID: <5355EB77.7000306@ti.com> (raw)
In-Reply-To: <1397917972-6293-3-git-send-email-santosh.shilimkar@ti.com>

On 04/19/2014 09:32 AM, Santosh Shilimkar wrote:
> From: Grygorii Strashko <grygorii.strashko@ti.com>
[..]
> + * Look in bottom up direction for the first "dma-range" property
> + * and parse it.
> + *  dma-ranges format:
> + *	DMA addr (dma_addr)	: naddr cells
> + *	CPU addr (phys_addr_t)	: pna cells
> + *	size			: nsize cells
> + *
> + * It returns -ENODEV if "dma-ranges" property was not found
> + * for this device in DT.
> + */
> +extern int of_dma_get_range(struct device_node *np, dma_addr_t *dma_addr,
> +		phys_addr_t *paddr, phys_addr_t *size)
> +{
> +	struct device_node *node = np;
> +	const u32 *ranges = NULL;
> +	int len, naddr, nsize, pna;
> +	int ret = 0;
> +
> +	if (!node)
> +		return -EINVAL;
> +
> +	while (1) {
> +		naddr = of_n_addr_cells(node);
> +		nsize = of_n_size_cells(node);
> +		node = of_get_next_parent(node);
> +		if (!node)
> +			break;
> +
> +		ranges = of_get_property(node, "dma-ranges", &len);
> +
> +		/* Ignore empty ranges, they imply no translation required */
> +		if (ranges && len > 0)
> +			break;
> +
> +		/*
> +		 * At least empty ranges has to be defined for parent node if
> +		 * DMA is supported
> +		 */
> +		if (!ranges)
> +			break;
> +	}
> +
> +	if (!ranges) {
> +		pr_debug("%s: no dma-ranges found for node(%s)\n",
> +			 __func__, np->full_name);
> +		ret = -ENODEV;
> +		goto out;
> +	}
> +
> +	len /= sizeof(u32);
> +
> +	pna = of_n_addr_cells(node);
> +
> +	/* dma-ranges format:
> +	 * DMA addr	: naddr cells
> +	 * CPU addr	: pna cells
> +	 * size		: nsize cells
> +	 */
> +	*dma_addr = of_read_number(ranges, naddr);
> +	*paddr = of_translate_dma_address(np, ranges);

I am probably missing something but I'm wondering the need for a
translate step here instead of doing something like:

*paddr = of_read_number(ranges + naddr, pna);

Perhaps there is a need to do a translate step of the DMA Address in
dma-ranges all the way to the parent, which can be different from the
CPU Address (second address in dma-ranges).

in which case the format of dma-ranges after parsing looks like
<DMA-Addr Translate(DMA-Addr) Size>
to the caller, and not, <DMA-Addr CPU-Addr Size>

But for keystone if something like the following is used,		
 dma-ranges = <0x80000000 0x8 0x00000000 0x80000000>;

Then, the above fragment I proposed would return 0x8 0x00000000 which is
sufficient?

thanks,
 -Joel



> +	if (*paddr == OF_BAD_ADDR) {
> +		pr_err("%s: translation of DMA address(%pad) to CPU address failed node(%s)\n",
> +		       __func__, dma_addr, np->full_name);
> +		ret = -EINVAL;
> +	}
> +
> +	*size = of_read_number(ranges + naddr + pna, nsize);
> +
> +	pr_debug("dma_addr(%pad) cpu_addr(%pa) size(%pa)\n",
> +		 dma_addr, paddr, size);
> +
> +out:
> +	of_node_put(node);
> +
> +	return ret;
> +}
> +EXPORT_SYMBOL_GPL(of_dma_get_range);
>  #endif /* CONFIG_OF_ADDRESS */
> diff --git a/include/linux/of_platform.h b/include/linux/of_platform.h
> index 05cb4a9..ba7d3dc 100644
> --- a/include/linux/of_platform.h
> +++ b/include/linux/of_platform.h
> @@ -72,6 +72,8 @@ extern int of_platform_populate(struct device_node *root,
>  				const struct of_device_id *matches,
>  				const struct of_dev_auxdata *lookup,
>  				struct device *parent);
> +extern int of_dma_get_range(struct device_node *np, dma_addr_t *dma_addr,
> +				phys_addr_t *paddr, phys_addr_t *size);
>  #else
>  static inline int of_platform_populate(struct device_node *root,
>  					const struct of_device_id *matches,
> @@ -80,6 +82,12 @@ static inline int of_platform_populate(struct device_node *root,
>  {
>  	return -ENODEV;
>  }
> +
> +static inline int of_dma_get_range(struct device_node *np, dma_addr_t *dma_addr,
> +					phys_addr_t *paddr, phys_addr_t *size)
> +{
> +	return -ENODEV;
> +}
>  #endif
>  
>  #endif	/* _LINUX_OF_PLATFORM_H */
> 

WARNING: multiple messages have this Message-ID (diff)
From: Joel Fernandes <joelf-l0cyMroinI0@public.gmane.org>
To: Santosh Shilimkar
	<santosh.shilimkar-l0cyMroinI0@public.gmane.org>,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
Cc: devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	Grygorii Strashko
	<grygorii.strashko-l0cyMroinI0@public.gmane.org>,
	Russell King <linux-lFZ/pmaqli7XmaaqVzeoHQ@public.gmane.org>,
	Arnd Bergmann <arnd-r2nGTMty4D4@public.gmane.org>,
	Greg Kroah-Hartman
	<gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org>,
	Linus Walleij
	<linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
	Grant Likely
	<grant.likely-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
	Rob Herring <robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
	Catalin Marinas <catalin.marinas-5wv7dgnIgG8@public.gmane.org>,
	Olof Johansson <olof-nZhT3qVonbNeoWH0uzbU5w@public.gmane.org>,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
Subject: Re: [PATCH v2 2/7] of: introduce of_dma_get_range() helper
Date: Mon, 21 Apr 2014 23:09:27 -0500	[thread overview]
Message-ID: <5355EB77.7000306@ti.com> (raw)
In-Reply-To: <1397917972-6293-3-git-send-email-santosh.shilimkar-l0cyMroinI0@public.gmane.org>

On 04/19/2014 09:32 AM, Santosh Shilimkar wrote:
> From: Grygorii Strashko <grygorii.strashko-l0cyMroinI0@public.gmane.org>
[..]
> + * Look in bottom up direction for the first "dma-range" property
> + * and parse it.
> + *  dma-ranges format:
> + *	DMA addr (dma_addr)	: naddr cells
> + *	CPU addr (phys_addr_t)	: pna cells
> + *	size			: nsize cells
> + *
> + * It returns -ENODEV if "dma-ranges" property was not found
> + * for this device in DT.
> + */
> +extern int of_dma_get_range(struct device_node *np, dma_addr_t *dma_addr,
> +		phys_addr_t *paddr, phys_addr_t *size)
> +{
> +	struct device_node *node = np;
> +	const u32 *ranges = NULL;
> +	int len, naddr, nsize, pna;
> +	int ret = 0;
> +
> +	if (!node)
> +		return -EINVAL;
> +
> +	while (1) {
> +		naddr = of_n_addr_cells(node);
> +		nsize = of_n_size_cells(node);
> +		node = of_get_next_parent(node);
> +		if (!node)
> +			break;
> +
> +		ranges = of_get_property(node, "dma-ranges", &len);
> +
> +		/* Ignore empty ranges, they imply no translation required */
> +		if (ranges && len > 0)
> +			break;
> +
> +		/*
> +		 * At least empty ranges has to be defined for parent node if
> +		 * DMA is supported
> +		 */
> +		if (!ranges)
> +			break;
> +	}
> +
> +	if (!ranges) {
> +		pr_debug("%s: no dma-ranges found for node(%s)\n",
> +			 __func__, np->full_name);
> +		ret = -ENODEV;
> +		goto out;
> +	}
> +
> +	len /= sizeof(u32);
> +
> +	pna = of_n_addr_cells(node);
> +
> +	/* dma-ranges format:
> +	 * DMA addr	: naddr cells
> +	 * CPU addr	: pna cells
> +	 * size		: nsize cells
> +	 */
> +	*dma_addr = of_read_number(ranges, naddr);
> +	*paddr = of_translate_dma_address(np, ranges);

I am probably missing something but I'm wondering the need for a
translate step here instead of doing something like:

*paddr = of_read_number(ranges + naddr, pna);

Perhaps there is a need to do a translate step of the DMA Address in
dma-ranges all the way to the parent, which can be different from the
CPU Address (second address in dma-ranges).

in which case the format of dma-ranges after parsing looks like
<DMA-Addr Translate(DMA-Addr) Size>
to the caller, and not, <DMA-Addr CPU-Addr Size>

But for keystone if something like the following is used,		
 dma-ranges = <0x80000000 0x8 0x00000000 0x80000000>;

Then, the above fragment I proposed would return 0x8 0x00000000 which is
sufficient?

thanks,
 -Joel



> +	if (*paddr == OF_BAD_ADDR) {
> +		pr_err("%s: translation of DMA address(%pad) to CPU address failed node(%s)\n",
> +		       __func__, dma_addr, np->full_name);
> +		ret = -EINVAL;
> +	}
> +
> +	*size = of_read_number(ranges + naddr + pna, nsize);
> +
> +	pr_debug("dma_addr(%pad) cpu_addr(%pa) size(%pa)\n",
> +		 dma_addr, paddr, size);
> +
> +out:
> +	of_node_put(node);
> +
> +	return ret;
> +}
> +EXPORT_SYMBOL_GPL(of_dma_get_range);
>  #endif /* CONFIG_OF_ADDRESS */
> diff --git a/include/linux/of_platform.h b/include/linux/of_platform.h
> index 05cb4a9..ba7d3dc 100644
> --- a/include/linux/of_platform.h
> +++ b/include/linux/of_platform.h
> @@ -72,6 +72,8 @@ extern int of_platform_populate(struct device_node *root,
>  				const struct of_device_id *matches,
>  				const struct of_dev_auxdata *lookup,
>  				struct device *parent);
> +extern int of_dma_get_range(struct device_node *np, dma_addr_t *dma_addr,
> +				phys_addr_t *paddr, phys_addr_t *size);
>  #else
>  static inline int of_platform_populate(struct device_node *root,
>  					const struct of_device_id *matches,
> @@ -80,6 +82,12 @@ static inline int of_platform_populate(struct device_node *root,
>  {
>  	return -ENODEV;
>  }
> +
> +static inline int of_dma_get_range(struct device_node *np, dma_addr_t *dma_addr,
> +					phys_addr_t *paddr, phys_addr_t *size)
> +{
> +	return -ENODEV;
> +}
>  #endif
>  
>  #endif	/* _LINUX_OF_PLATFORM_H */
> 

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

WARNING: multiple messages have this Message-ID (diff)
From: Joel Fernandes <joelf@ti.com>
To: Santosh Shilimkar <santosh.shilimkar@ti.com>,
	<linux-kernel@vger.kernel.org>
Cc: <devicetree@vger.kernel.org>,
	Grygorii Strashko <grygorii.strashko@ti.com>,
	Russell King <linux@arm.linux.org.uk>,
	Arnd Bergmann <arnd@arndb.de>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Linus Walleij <linus.walleij@linaro.org>,
	Grant Likely <grant.likely@linaro.org>,
	Rob Herring <robh+dt@kernel.org>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Olof Johansson <olof@lixom.net>,
	<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH v2 2/7] of: introduce of_dma_get_range() helper
Date: Mon, 21 Apr 2014 23:09:27 -0500	[thread overview]
Message-ID: <5355EB77.7000306@ti.com> (raw)
In-Reply-To: <1397917972-6293-3-git-send-email-santosh.shilimkar@ti.com>

On 04/19/2014 09:32 AM, Santosh Shilimkar wrote:
> From: Grygorii Strashko <grygorii.strashko@ti.com>
[..]
> + * Look in bottom up direction for the first "dma-range" property
> + * and parse it.
> + *  dma-ranges format:
> + *	DMA addr (dma_addr)	: naddr cells
> + *	CPU addr (phys_addr_t)	: pna cells
> + *	size			: nsize cells
> + *
> + * It returns -ENODEV if "dma-ranges" property was not found
> + * for this device in DT.
> + */
> +extern int of_dma_get_range(struct device_node *np, dma_addr_t *dma_addr,
> +		phys_addr_t *paddr, phys_addr_t *size)
> +{
> +	struct device_node *node = np;
> +	const u32 *ranges = NULL;
> +	int len, naddr, nsize, pna;
> +	int ret = 0;
> +
> +	if (!node)
> +		return -EINVAL;
> +
> +	while (1) {
> +		naddr = of_n_addr_cells(node);
> +		nsize = of_n_size_cells(node);
> +		node = of_get_next_parent(node);
> +		if (!node)
> +			break;
> +
> +		ranges = of_get_property(node, "dma-ranges", &len);
> +
> +		/* Ignore empty ranges, they imply no translation required */
> +		if (ranges && len > 0)
> +			break;
> +
> +		/*
> +		 * At least empty ranges has to be defined for parent node if
> +		 * DMA is supported
> +		 */
> +		if (!ranges)
> +			break;
> +	}
> +
> +	if (!ranges) {
> +		pr_debug("%s: no dma-ranges found for node(%s)\n",
> +			 __func__, np->full_name);
> +		ret = -ENODEV;
> +		goto out;
> +	}
> +
> +	len /= sizeof(u32);
> +
> +	pna = of_n_addr_cells(node);
> +
> +	/* dma-ranges format:
> +	 * DMA addr	: naddr cells
> +	 * CPU addr	: pna cells
> +	 * size		: nsize cells
> +	 */
> +	*dma_addr = of_read_number(ranges, naddr);
> +	*paddr = of_translate_dma_address(np, ranges);

I am probably missing something but I'm wondering the need for a
translate step here instead of doing something like:

*paddr = of_read_number(ranges + naddr, pna);

Perhaps there is a need to do a translate step of the DMA Address in
dma-ranges all the way to the parent, which can be different from the
CPU Address (second address in dma-ranges).

in which case the format of dma-ranges after parsing looks like
<DMA-Addr Translate(DMA-Addr) Size>
to the caller, and not, <DMA-Addr CPU-Addr Size>

But for keystone if something like the following is used,		
 dma-ranges = <0x80000000 0x8 0x00000000 0x80000000>;

Then, the above fragment I proposed would return 0x8 0x00000000 which is
sufficient?

thanks,
 -Joel



> +	if (*paddr == OF_BAD_ADDR) {
> +		pr_err("%s: translation of DMA address(%pad) to CPU address failed node(%s)\n",
> +		       __func__, dma_addr, np->full_name);
> +		ret = -EINVAL;
> +	}
> +
> +	*size = of_read_number(ranges + naddr + pna, nsize);
> +
> +	pr_debug("dma_addr(%pad) cpu_addr(%pa) size(%pa)\n",
> +		 dma_addr, paddr, size);
> +
> +out:
> +	of_node_put(node);
> +
> +	return ret;
> +}
> +EXPORT_SYMBOL_GPL(of_dma_get_range);
>  #endif /* CONFIG_OF_ADDRESS */
> diff --git a/include/linux/of_platform.h b/include/linux/of_platform.h
> index 05cb4a9..ba7d3dc 100644
> --- a/include/linux/of_platform.h
> +++ b/include/linux/of_platform.h
> @@ -72,6 +72,8 @@ extern int of_platform_populate(struct device_node *root,
>  				const struct of_device_id *matches,
>  				const struct of_dev_auxdata *lookup,
>  				struct device *parent);
> +extern int of_dma_get_range(struct device_node *np, dma_addr_t *dma_addr,
> +				phys_addr_t *paddr, phys_addr_t *size);
>  #else
>  static inline int of_platform_populate(struct device_node *root,
>  					const struct of_device_id *matches,
> @@ -80,6 +82,12 @@ static inline int of_platform_populate(struct device_node *root,
>  {
>  	return -ENODEV;
>  }
> +
> +static inline int of_dma_get_range(struct device_node *np, dma_addr_t *dma_addr,
> +					phys_addr_t *paddr, phys_addr_t *size)
> +{
> +	return -ENODEV;
> +}
>  #endif
>  
>  #endif	/* _LINUX_OF_PLATFORM_H */
> 


  parent reply	other threads:[~2014-04-22  4:09 UTC|newest]

Thread overview: 92+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-04-19 14:32 [PATCH v2 0/7] of: setup dma parameters using dma-ranges and dma-coherent Santosh Shilimkar
2014-04-19 14:32 ` Santosh Shilimkar
2014-04-19 14:32 ` Santosh Shilimkar
2014-04-19 14:32 ` [PATCH v2 1/7] device: introduce per device dma_pfn_offset Santosh Shilimkar
2014-04-19 14:32   ` Santosh Shilimkar
2014-04-19 14:32   ` Santosh Shilimkar
2014-04-19 14:32 ` [PATCH v2 2/7] of: introduce of_dma_get_range() helper Santosh Shilimkar
2014-04-19 14:32   ` Santosh Shilimkar
2014-04-19 14:32   ` Santosh Shilimkar
2014-04-21 15:29   ` Rob Herring
2014-04-21 15:29     ` Rob Herring
2014-04-21 15:29     ` Rob Herring
2014-04-22 14:56     ` Grygorii Strashko
2014-04-22 14:56       ` Grygorii Strashko
2014-04-22 14:56       ` Grygorii Strashko
2014-04-22  4:09   ` Joel Fernandes [this message]
2014-04-22  4:09     ` Joel Fernandes
2014-04-22  4:09     ` Joel Fernandes
2014-04-19 14:32 ` [PATCH v2 3/7] of: introduce of_dma_is_coherent() helper Santosh Shilimkar
2014-04-19 14:32   ` Santosh Shilimkar
2014-04-19 14:32   ` Santosh Shilimkar
2014-04-19 14:32 ` [PATCH v2 4/7] of: configure the platform device dma parameters Santosh Shilimkar
2014-04-19 14:32   ` Santosh Shilimkar
2014-04-19 14:32   ` Santosh Shilimkar
2014-04-21 14:58   ` Rob Herring
2014-04-21 14:58     ` Rob Herring
2014-04-21 14:58     ` Rob Herring
2014-04-22 15:09     ` Grygorii Strashko
2014-04-22 15:09       ` Grygorii Strashko
2014-04-22 15:09       ` Grygorii Strashko
2014-04-22 14:44       ` Rob Herring
2014-04-22 14:44         ` Rob Herring
2014-04-22 14:44         ` Rob Herring
2014-04-22 15:44         ` Grygorii Strashko
2014-04-22 15:44           ` Grygorii Strashko
2014-04-19 14:32 ` [PATCH v2 5/7] ARM: dma: Use dma_pfn_offset for dma address translation Santosh Shilimkar
2014-04-19 14:32   ` Santosh Shilimkar
2014-04-19 14:32   ` Santosh Shilimkar
2014-04-19 19:43   ` Russell King - ARM Linux
2014-04-19 19:43     ` Russell King - ARM Linux
2014-04-19 19:43     ` Russell King - ARM Linux
2014-04-21 13:38     ` Santosh Shilimkar
2014-04-21 13:38       ` Santosh Shilimkar
2014-04-21 13:38       ` Santosh Shilimkar
2014-04-19 14:32 ` [PATCH v2 6/7] ARM: dma: implement set_arch_dma_coherent_ops() Santosh Shilimkar
2014-04-19 14:32   ` Santosh Shilimkar
2014-04-19 14:32   ` Santosh Shilimkar
2014-04-19 14:32 ` [PATCH v2 7/7] ARM: mm: use phys_addr_t in __dma_page_[cpu_to_dev/dev_to_cpu] Santosh Shilimkar
2014-04-19 14:32   ` Santosh Shilimkar
2014-04-19 14:32   ` Santosh Shilimkar
2014-04-21 13:39   ` Santosh Shilimkar
2014-04-21 13:39     ` Santosh Shilimkar
2014-04-21 13:39     ` Santosh Shilimkar
2014-04-19 16:25 ` [PATCH v2 0/7] of: setup dma parameters using dma-ranges and dma-coherent Thomas Petazzoni
2014-04-19 16:25   ` Thomas Petazzoni
2014-04-19 16:25   ` Thomas Petazzoni
2014-04-21 13:35   ` Santosh Shilimkar
2014-04-21 13:35     ` Santosh Shilimkar
2014-04-21 13:35     ` Santosh Shilimkar
2014-04-21 18:19     ` Thomas Petazzoni
2014-04-21 18:19       ` Thomas Petazzoni
2014-04-21 19:17       ` Santosh Shilimkar
2014-04-21 19:17         ` Santosh Shilimkar
2014-04-21 19:17         ` Santosh Shilimkar
2014-04-22 14:54   ` Catalin Marinas
2014-04-22 14:54     ` Catalin Marinas
2014-04-22 15:02   ` Arnd Bergmann
2014-04-22 15:02     ` Arnd Bergmann
2014-04-22 15:02     ` Arnd Bergmann
2014-04-22 15:15     ` Santosh Shilimkar
2014-04-22 15:15       ` Santosh Shilimkar
2014-04-22 15:15       ` Santosh Shilimkar
2014-04-22 15:25     ` Catalin Marinas
2014-04-22 15:25       ` Catalin Marinas
2014-04-22 15:25       ` Catalin Marinas
2014-04-22 15:30       ` Rob Herring
2014-04-22 15:30         ` Rob Herring
2014-04-22 15:30         ` Rob Herring
2014-04-22 16:01         ` Catalin Marinas
2014-04-22 16:01           ` Catalin Marinas
2014-04-22 16:01           ` Catalin Marinas
2014-04-21 14:37 ` Rob Herring
2014-04-21 14:37   ` Rob Herring
2014-04-21 14:37   ` Rob Herring
2014-04-21 15:13   ` Santosh Shilimkar
2014-04-21 15:13     ` Santosh Shilimkar
2014-04-21 15:35     ` Rob Herring
2014-04-21 15:35       ` Rob Herring
2014-04-21 15:35       ` Rob Herring
2014-04-21 15:36       ` Santosh Shilimkar
2014-04-21 15:36         ` Santosh Shilimkar
2014-04-21 15:36         ` Santosh Shilimkar

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=5355EB77.7000306@ti.com \
    --to=joelf@ti.com \
    --cc=linux-arm-kernel@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 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.