* [PATCH 1/1] dt: Add general DMA window parser
[not found] ` <20120418092613.GA8632-RM9K5IK7kjIQXX3q8xo1gnVAuStQJXxyR5q1nwbD4aMs9pC9oP6+/A@public.gmane.org>
@ 2012-04-18 10:19 ` Hiroshi Doyu
[not found] ` <20120418.131907.2172387798112620167.hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 11+ messages in thread
From: Hiroshi Doyu @ 2012-04-18 10:19 UTC (permalink / raw)
To: thierry.reding-RM9K5IK7kjKj5M59NBduVrNAH6kLmebB@public.gmane.org,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
arnd-r2nGTMty4D4@public.gmane.org
Cc: swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org,
joerg.roedel-5C7GfCeVMHo@public.gmane.org,
m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org,
linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
linaro-mm-sig-cunTk1MwBs8s++Sfvej+rw@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
Hi,
Try again with fixing Thierry's commnets, Thanks.
>From 9a632c24949e46df197a216ca95f684edd1db693 Mon Sep 17 00:00:00 2001
From: Hiroshi DOYU <hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
Date: Wed, 18 Apr 2012 12:09:03 +0300
Subject: [PATCH 1/1] dt: Add general DMA window parser
This code was stolen from:
"arch/microblaze/kernel/prom_parse.c"
"arch/powerpc/kernel/prom_parse.c"
Once "ibm," prefix is removed from dts file. This generic one could
replace the originals.
Signed-off-by: Hiroshi DOYU <hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
---
drivers/of/Kconfig | 4 ++++
drivers/of/Makefile | 1 +
drivers/of/of_dma.c | 35 +++++++++++++++++++++++++++++++++++
include/linux/of_address.h | 10 ++++++++++
4 files changed, 50 insertions(+), 0 deletions(-)
diff --git a/drivers/of/Kconfig b/drivers/of/Kconfig
index dfba3e6..3b0298b 100644
--- a/drivers/of/Kconfig
+++ b/drivers/of/Kconfig
@@ -83,4 +83,8 @@ config OF_MTD
depends on MTD
def_bool y
+config OF_DMA
+ depends on HAS_DMA
+ def_bool y
+
endmenu # OF
diff --git a/drivers/of/Makefile b/drivers/of/Makefile
index e027f44..711ff5b 100644
--- a/drivers/of/Makefile
+++ b/drivers/of/Makefile
@@ -11,3 +11,4 @@ obj-$(CONFIG_OF_MDIO) += of_mdio.o
obj-$(CONFIG_OF_PCI) += of_pci.o
obj-$(CONFIG_OF_PCI_IRQ) += of_pci_irq.o
obj-$(CONFIG_OF_MTD) += of_mtd.o
+obj-$(CONFIG_OF_DMA) += of_dma.o
diff --git a/drivers/of/of_dma.c b/drivers/of/of_dma.c
new file mode 100644
index 0000000..a34db5a
--- /dev/null
+++ b/drivers/of/of_dma.c
@@ -0,0 +1,35 @@
+/*
+ * Stolen from:
+ * "arch/microblaze/kernel/prom_parse.c"
+ * "arch/powerpc/kernel/prom_parse.c"
+ */
+
+#include <linux/of_address.h>
+
+void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop,
+ unsigned long *busno, unsigned long *phys, unsigned long *size)
+{
+ const __be32 *dma_window;
+ u32 cells;
+ const unsigned char *prop;
+
+ dma_window = dma_window_prop;
+
+ /* busno is always one cell */
+ if (busno)
+ *busno = be32_to_cpup(dma_window++);
+
+ prop = of_get_property(dn, "#dma-address-cells", NULL);
+ if (!prop)
+ prop = of_get_property(dn, "#address-cells", NULL);
+
+ cells = prop ? *(__be32 *)prop : of_n_addr_cells(dn);
+ *phys = of_read_number(dma_window, cells);
+
+ dma_window += cells;
+
+ prop = of_get_property(dn, "#dma-size-cells", NULL);
+ cells = prop ? *(__be32 *)prop : of_n_size_cells(dn);
+ *size = of_read_number(dma_window, cells);
+}
+
diff --git a/include/linux/of_address.h b/include/linux/of_address.h
index 01b925a..2a0f7c6 100644
--- a/include/linux/of_address.h
+++ b/include/linux/of_address.h
@@ -21,6 +21,10 @@ extern void __iomem *of_iomap(struct device_node *device, int index);
extern const u32 *of_get_address(struct device_node *dev, int index,
u64 *size, unsigned int *flags);
+extern void of_parse_dma_window(struct device_node *dn,
+ const void *dma_window_prop, unsigned long *busno,
+ unsigned long *phys, unsigned long *size);
+
#ifndef pci_address_to_pio
static inline unsigned long pci_address_to_pio(phys_addr_t addr) { return -1; }
#define pci_address_to_pio pci_address_to_pio
@@ -48,6 +52,12 @@ static inline const u32 *of_get_address(struct device_node *dev, int index,
{
return NULL;
}
+
+static inline void of_parse_dma_window(struct device_node *dn,
+ const void *dma_window_prop, unsigned long *busno,
+ unsigned long *phys, unsigned long *size)
+{
+}
#endif /* CONFIG_OF_ADDRESS */
--
1.7.5.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 1/1] dt: Add general DMA window parser
[not found] ` <20120418.131907.2172387798112620167.hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
@ 2012-04-18 10:26 ` Thierry Reding
[not found] ` <20120418102629.GA14533-RM9K5IK7kjIQXX3q8xo1gnVAuStQJXxyR5q1nwbD4aMs9pC9oP6+/A@public.gmane.org>
2012-04-18 17:27 ` Stephen Warren
1 sibling, 1 reply; 11+ messages in thread
From: Thierry Reding @ 2012-04-18 10:26 UTC (permalink / raw)
To: Hiroshi Doyu
Cc: arnd-r2nGTMty4D4@public.gmane.org,
swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
linaro-mm-sig-cunTk1MwBs8s++Sfvej+rw@public.gmane.org,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
[-- Attachment #1.1: Type: text/plain, Size: 367 bytes --]
* Hiroshi Doyu wrote:
> + cells = prop ? *(__be32 *)prop : of_n_addr_cells(dn);
I think this needs to be:
cells = prop ? be32_to_cpup(prop) : of_n_addr_cells(dn);
Only casting isn't enough, you need the bytes to be swapped.
> + cells = prop ? *(__be32 *)prop : of_n_size_cells(dn);
Similarly:
cells = prop ? be32_to_cpup(prop) : of_n_size_cells(dn);
Thierry
[-- Attachment #1.2: Type: application/pgp-signature, Size: 198 bytes --]
[-- Attachment #2: Type: text/plain, Size: 190 bytes --]
_______________________________________________
iommu mailing list
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/1] dt: Add general DMA window parser
[not found] ` <20120418102629.GA14533-RM9K5IK7kjIQXX3q8xo1gnVAuStQJXxyR5q1nwbD4aMs9pC9oP6+/A@public.gmane.org>
@ 2012-04-18 10:36 ` Hiroshi Doyu
[not found] ` <20120418.133629.1664781135413277375.hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
0 siblings, 1 reply; 11+ messages in thread
From: Hiroshi Doyu @ 2012-04-18 10:36 UTC (permalink / raw)
To: thierry.reding-RM9K5IK7kjKj5M59NBduVrNAH6kLmebB@public.gmane.org
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
arnd-r2nGTMty4D4@public.gmane.org,
swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org,
joerg.roedel-5C7GfCeVMHo@public.gmane.org,
m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org,
linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
linaro-mm-sig-cunTk1MwBs8s++Sfvej+rw@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
From: Thierry Reding <thierry.reding-RM9K5IK7kjKj5M59NBduVrNAH6kLmebB@public.gmane.org>
Subject: Re: [PATCH 1/1] dt: Add general DMA window parser
Date: Wed, 18 Apr 2012 12:26:29 +0200
Message-ID: <20120418102629.GA14533-RM9K5IK7kjIQXX3q8xo1gnVAuStQJXxyR5q1nwbD4aMs9pC9oP6+/A@public.gmane.org>
> * PGP Signed by an unknown key
>
> * Hiroshi Doyu wrote:
> > + cells = prop ? *(__be32 *)prop : of_n_addr_cells(dn);
>
> I think this needs to be:
>
> cells = prop ? be32_to_cpup(prop) : of_n_addr_cells(dn);
>
> Only casting isn't enough, you need the bytes to be swapped.
Right. Try again. Sorry for spamming.
>From 1ee8a9b3a839456b170af74b11a4304bfda965c4 Mon Sep 17 00:00:00 2001
From: Hiroshi DOYU <hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
Date: Wed, 18 Apr 2012 12:09:03 +0300
Subject: [PATCH 1/1] dt: Add general DMA window parser
This code was stolen from:
"arch/microblaze/kernel/prom_parse.c"
"arch/powerpc/kernel/prom_parse.c"
Once "ibm," prefix is removed from dts file. This generic one could
replace the originals.
Signed-off-by: Hiroshi DOYU <hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
---
drivers/of/Kconfig | 4 ++++
drivers/of/Makefile | 1 +
drivers/of/of_dma.c | 35 +++++++++++++++++++++++++++++++++++
include/linux/of_address.h | 10 ++++++++++
4 files changed, 50 insertions(+), 0 deletions(-)
diff --git a/drivers/of/Kconfig b/drivers/of/Kconfig
index dfba3e6..3b0298b 100644
--- a/drivers/of/Kconfig
+++ b/drivers/of/Kconfig
@@ -83,4 +83,8 @@ config OF_MTD
depends on MTD
def_bool y
+config OF_DMA
+ depends on HAS_DMA
+ def_bool y
+
endmenu # OF
diff --git a/drivers/of/Makefile b/drivers/of/Makefile
index e027f44..711ff5b 100644
--- a/drivers/of/Makefile
+++ b/drivers/of/Makefile
@@ -11,3 +11,4 @@ obj-$(CONFIG_OF_MDIO) += of_mdio.o
obj-$(CONFIG_OF_PCI) += of_pci.o
obj-$(CONFIG_OF_PCI_IRQ) += of_pci_irq.o
obj-$(CONFIG_OF_MTD) += of_mtd.o
+obj-$(CONFIG_OF_DMA) += of_dma.o
diff --git a/drivers/of/of_dma.c b/drivers/of/of_dma.c
new file mode 100644
index 0000000..45c9e88
--- /dev/null
+++ b/drivers/of/of_dma.c
@@ -0,0 +1,35 @@
+/*
+ * Stolen from:
+ * "arch/microblaze/kernel/prom_parse.c"
+ * "arch/powerpc/kernel/prom_parse.c"
+ */
+
+#include <linux/of_address.h>
+
+void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop,
+ unsigned long *busno, unsigned long *phys, unsigned long *size)
+{
+ const __be32 *dma_window;
+ u32 cells;
+ const unsigned char *prop;
+
+ dma_window = dma_window_prop;
+
+ /* busno is always one cell */
+ if (busno)
+ *busno = be32_to_cpup(dma_window++);
+
+ prop = of_get_property(dn, "#dma-address-cells", NULL);
+ if (!prop)
+ prop = of_get_property(dn, "#address-cells", NULL);
+
+ cells = prop ? be32_to_cpup(prop) : of_n_addr_cells(dn);
+ *phys = of_read_number(dma_window, cells);
+
+ dma_window += cells;
+
+ prop = of_get_property(dn, "#dma-size-cells", NULL);
+ cells = prop ? be32_to_cpup(prop) : of_n_size_cells(dn);
+ *size = of_read_number(dma_window, cells);
+}
+
diff --git a/include/linux/of_address.h b/include/linux/of_address.h
index 01b925a..2a0f7c6 100644
--- a/include/linux/of_address.h
+++ b/include/linux/of_address.h
@@ -21,6 +21,10 @@ extern void __iomem *of_iomap(struct device_node *device, int index);
extern const u32 *of_get_address(struct device_node *dev, int index,
u64 *size, unsigned int *flags);
+extern void of_parse_dma_window(struct device_node *dn,
+ const void *dma_window_prop, unsigned long *busno,
+ unsigned long *phys, unsigned long *size);
+
#ifndef pci_address_to_pio
static inline unsigned long pci_address_to_pio(phys_addr_t addr) { return -1; }
#define pci_address_to_pio pci_address_to_pio
@@ -48,6 +52,12 @@ static inline const u32 *of_get_address(struct device_node *dev, int index,
{
return NULL;
}
+
+static inline void of_parse_dma_window(struct device_node *dn,
+ const void *dma_window_prop, unsigned long *busno,
+ unsigned long *phys, unsigned long *size)
+{
+}
#endif /* CONFIG_OF_ADDRESS */
--
1.7.5.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH 1/1] dt: Add general DMA window parser
[not found] ` <20120418.133629.1664781135413277375.hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
@ 2012-04-18 10:54 ` Thierry Reding
[not found] ` <20120418105423.GA5667-RM9K5IK7kjIQXX3q8xo1gnVAuStQJXxyR5q1nwbD4aMs9pC9oP6+/A@public.gmane.org>
0 siblings, 1 reply; 11+ messages in thread
From: Thierry Reding @ 2012-04-18 10:54 UTC (permalink / raw)
To: Hiroshi Doyu
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
arnd-r2nGTMty4D4@public.gmane.org,
swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org,
joerg.roedel-5C7GfCeVMHo@public.gmane.org,
m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org,
linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
linaro-mm-sig-cunTk1MwBs8s++Sfvej+rw@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
[-- Attachment #1: Type: text/plain, Size: 1572 bytes --]
* Hiroshi Doyu wrote:
> diff --git a/drivers/of/of_dma.c b/drivers/of/of_dma.c
> new file mode 100644
> index 0000000..45c9e88
> --- /dev/null
> +++ b/drivers/of/of_dma.c
> @@ -0,0 +1,35 @@
> +/*
> + * Stolen from:
> + * "arch/microblaze/kernel/prom_parse.c"
> + * "arch/powerpc/kernel/prom_parse.c"
> + */
> +
> +#include <linux/of_address.h>
> +
> +void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop,
> + unsigned long *busno, unsigned long *phys, unsigned long *size)
> +{
> + const __be32 *dma_window;
> + u32 cells;
> + const unsigned char *prop;
There's no need for this to be const unsigned char *, const void * will do
just as well.
> +
> + dma_window = dma_window_prop;
> +
> + /* busno is always one cell */
> + if (busno)
> + *busno = be32_to_cpup(dma_window++);
> +
> + prop = of_get_property(dn, "#dma-address-cells", NULL);
> + if (!prop)
> + prop = of_get_property(dn, "#address-cells", NULL);
> +
> + cells = prop ? be32_to_cpup(prop) : of_n_addr_cells(dn);
> + *phys = of_read_number(dma_window, cells);
This should probably fail gracefully if phys == NULL, similar to what you do
for busno.
> +
> + dma_window += cells;
> +
> + prop = of_get_property(dn, "#dma-size-cells", NULL);
> + cells = prop ? be32_to_cpup(prop) : of_n_size_cells(dn);
> + *size = of_read_number(dma_window, cells);
Same here.
> +}
> +
And you might want to add a EXPORT_SYMBOL(of_parse_dma_window) here so the
function can be used from modules.
Sorry for having you go through another round. I should have looked more
closely before.
Thierry
[-- Attachment #2: Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/1] dt: Add general DMA window parser
[not found] ` <20120418105423.GA5667-RM9K5IK7kjIQXX3q8xo1gnVAuStQJXxyR5q1nwbD4aMs9pC9oP6+/A@public.gmane.org>
@ 2012-04-18 11:13 ` Hiroshi Doyu
0 siblings, 0 replies; 11+ messages in thread
From: Hiroshi Doyu @ 2012-04-18 11:13 UTC (permalink / raw)
To: thierry.reding-RM9K5IK7kjKj5M59NBduVrNAH6kLmebB@public.gmane.org
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
arnd-r2nGTMty4D4@public.gmane.org,
swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org,
joerg.roedel-5C7GfCeVMHo@public.gmane.org,
m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org,
linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
linaro-mm-sig-cunTk1MwBs8s++Sfvej+rw@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
From: Thierry Reding <thierry.reding-RM9K5IK7kjKj5M59NBduVrNAH6kLmebB@public.gmane.org>
Subject: Re: [PATCH 1/1] dt: Add general DMA window parser
Date: Wed, 18 Apr 2012 12:54:23 +0200
Message-ID: <20120418105423.GA5667-RM9K5IK7kjIQXX3q8xo1gnVAuStQJXxyR5q1nwbD4aMs9pC9oP6+/A@public.gmane.org>
> * PGP Signed by an unknown key
>
> * Hiroshi Doyu wrote:
> > diff --git a/drivers/of/of_dma.c b/drivers/of/of_dma.c
> > new file mode 100644
> > index 0000000..45c9e88
> > --- /dev/null
> > +++ b/drivers/of/of_dma.c
> > @@ -0,0 +1,35 @@
> > +/*
> > + * Stolen from:
> > + * "arch/microblaze/kernel/prom_parse.c"
> > + * "arch/powerpc/kernel/prom_parse.c"
> > + */
> > +
> > +#include <linux/of_address.h>
> > +
> > +void of_parse_dma_window(struct device_node *dn, const void *dma_window_prop,
> > + unsigned long *busno, unsigned long *phys, unsigned long *size)
> > +{
> > + const __be32 *dma_window;
> > + u32 cells;
> > + const unsigned char *prop;
>
> There's no need for this to be const unsigned char *, const void * will do
> just as well.
>
> > +
> > + dma_window = dma_window_prop;
> > +
> > + /* busno is always one cell */
> > + if (busno)
> > + *busno = be32_to_cpup(dma_window++);
> > +
> > + prop = of_get_property(dn, "#dma-address-cells", NULL);
> > + if (!prop)
> > + prop = of_get_property(dn, "#address-cells", NULL);
> > +
> > + cells = prop ? be32_to_cpup(prop) : of_n_addr_cells(dn);
> > + *phys = of_read_number(dma_window, cells);
>
> This should probably fail gracefully if phys == NULL, similar to what you do
> for busno.
>
> > +
> > + dma_window += cells;
> > +
> > + prop = of_get_property(dn, "#dma-size-cells", NULL);
> > + cells = prop ? be32_to_cpup(prop) : of_n_size_cells(dn);
> > + *size = of_read_number(dma_window, cells);
>
> Same here.
>
> > +}
> > +
>
> And you might want to add a EXPORT_SYMBOL(of_parse_dma_window) here so the
> function can be used from modules.
>
> Sorry for having you go through another round. I should have looked more
> closely before.
No problem, I'll wait for another comments, and post again later. Thank you for reivew.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/1] dt: Add general DMA window parser
[not found] ` <20120418.131907.2172387798112620167.hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-04-18 10:26 ` Thierry Reding
@ 2012-04-18 17:27 ` Stephen Warren
[not found] ` <4F8EF99E.3050709-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
1 sibling, 1 reply; 11+ messages in thread
From: Stephen Warren @ 2012-04-18 17:27 UTC (permalink / raw)
To: Hiroshi Doyu
Cc: thierry.reding-RM9K5IK7kjKj5M59NBduVrNAH6kLmebB@public.gmane.org,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
arnd-r2nGTMty4D4@public.gmane.org,
joerg.roedel-5C7GfCeVMHo@public.gmane.org,
m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org,
linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
linaro-mm-sig-cunTk1MwBs8s++Sfvej+rw@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
On 04/18/2012 04:19 AM, Hiroshi Doyu wrote:
> Subject: [PATCH 1/1] dt: Add general DMA window parser
>
> This code was stolen from:
> "arch/microblaze/kernel/prom_parse.c"
> "arch/powerpc/kernel/prom_parse.c"
>
> Once "ibm," prefix is removed from dts file. This generic one could
> replace the originals.
> +extern void of_parse_dma_window(struct device_node *dn,
> + const void *dma_window_prop, unsigned long *busno,
> + unsigned long *phys, unsigned long *size);
At least some other of_*() parsing functions take the property name
rather than the property pointer, and also take an index into the
property in order to support multiple entries in it. See for example
of_parse_phandle and of_get_named_gpio_flags. Should this new API be
similar? E.g.:
extern void of_parse_dma_window(struct device_node *np,
const char *propname, int index,
unsigned long *busno,
unsigned long *phys, unsigned long *size);
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/1] dt: Add general DMA window parser
[not found] ` <4F8EF99E.3050709-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
@ 2012-04-18 19:39 ` Thierry Reding
[not found] ` <20120418193945.GA17960-RM9K5IK7kjIQXX3q8xo1gnVAuStQJXxyR5q1nwbD4aMs9pC9oP6+/A@public.gmane.org>
2012-04-19 12:19 ` Hiroshi Doyu
1 sibling, 1 reply; 11+ messages in thread
From: Thierry Reding @ 2012-04-18 19:39 UTC (permalink / raw)
To: Stephen Warren
Cc: Hiroshi Doyu,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
arnd-r2nGTMty4D4@public.gmane.org,
joerg.roedel-5C7GfCeVMHo@public.gmane.org,
m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org,
linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
linaro-mm-sig-cunTk1MwBs8s++Sfvej+rw@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
[-- Attachment #1: Type: text/plain, Size: 1127 bytes --]
* Stephen Warren wrote:
> On 04/18/2012 04:19 AM, Hiroshi Doyu wrote:
>
> > Subject: [PATCH 1/1] dt: Add general DMA window parser
> >
> > This code was stolen from:
> > "arch/microblaze/kernel/prom_parse.c"
> > "arch/powerpc/kernel/prom_parse.c"
> >
> > Once "ibm," prefix is removed from dts file. This generic one could
> > replace the originals.
>
> > +extern void of_parse_dma_window(struct device_node *dn,
> > + const void *dma_window_prop, unsigned long *busno,
> > + unsigned long *phys, unsigned long *size);
>
> At least some other of_*() parsing functions take the property name
> rather than the property pointer, and also take an index into the
> property in order to support multiple entries in it. See for example
> of_parse_phandle and of_get_named_gpio_flags. Should this new API be
> similar? E.g.:
>
> extern void of_parse_dma_window(struct device_node *np,
> const char *propname, int index,
> unsigned long *busno,
> unsigned long *phys, unsigned long *size);
In that case the function should return int for proper error handling.
Thierry
[-- Attachment #2: Type: application/pgp-signature, Size: 198 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/1] dt: Add general DMA window parser
[not found] ` <4F8EF99E.3050709-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2012-04-18 19:39 ` Thierry Reding
@ 2012-04-19 12:19 ` Hiroshi Doyu
1 sibling, 0 replies; 11+ messages in thread
From: Hiroshi Doyu @ 2012-04-19 12:19 UTC (permalink / raw)
To: Stephen Warren
Cc: arnd-r2nGTMty4D4@public.gmane.org,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
thierry.reding-RM9K5IK7kjKj5M59NBduVrNAH6kLmebB@public.gmane.org,
linaro-mm-sig-cunTk1MwBs8s++Sfvej+rw@public.gmane.org,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
On Wed, 18 Apr 2012 19:27:58 +0200
Stephen Warren <swarren-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org> wrote:
> On 04/18/2012 04:19 AM, Hiroshi Doyu wrote:
>
> > Subject: [PATCH 1/1] dt: Add general DMA window parser
> >
> > This code was stolen from:
> > "arch/microblaze/kernel/prom_parse.c"
> > "arch/powerpc/kernel/prom_parse.c"
> >
> > Once "ibm," prefix is removed from dts file. This generic one could
> > replace the originals.
It seems that the "ibm," prefix is not used in .dts files, but it
comes from the PAPR compliant firmware and cannot be changed.
The easiest solution would be to make the function understand both
variants.
> > +extern void of_parse_dma_window(struct device_node *dn,
> > + const void *dma_window_prop, unsigned long *busno,
> > + unsigned long *phys, unsigned long *size);
>
> At least some other of_*() parsing functions take the property name
> rather than the property pointer, and also take an index into the
> property in order to support multiple entries in it. See for example
> of_parse_phandle and of_get_named_gpio_flags. Should this new API be
> similar? E.g.:
>
> extern void of_parse_dma_window(struct device_node *np,
> const char *propname, int index,
> unsigned long *busno,
> unsigned long *phys, unsigned long *size);
At least, I can add the code checking the return value of this
function, which won't change the existing code.
Does anyone know the format of "ibm,dma-window"?
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 1/1] dt: Add general DMA window parser
[not found] ` <20120418193945.GA17960-RM9K5IK7kjIQXX3q8xo1gnVAuStQJXxyR5q1nwbD4aMs9pC9oP6+/A@public.gmane.org>
@ 2012-04-19 12:32 ` Hiroshi Doyu
0 siblings, 0 replies; 11+ messages in thread
From: Hiroshi Doyu @ 2012-04-19 12:32 UTC (permalink / raw)
To: Thierry Reding
Cc: Stephen Warren,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
arnd-r2nGTMty4D4@public.gmane.org,
joerg.roedel-5C7GfCeVMHo@public.gmane.org,
m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org,
linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
linaro-mm-sig-cunTk1MwBs8s++Sfvej+rw@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
On Wed, 18 Apr 2012 21:39:45 +0200
Thierry Reding <thierry.reding-RM9K5IK7kjKj5M59NBduVrNAH6kLmebB@public.gmane.org> wrote:
> * PGP Signed by an unknown key
>
> * Stephen Warren wrote:
> > On 04/18/2012 04:19 AM, Hiroshi Doyu wrote:
> >
> > > Subject: [PATCH 1/1] dt: Add general DMA window parser
> > >
> > > This code was stolen from:
> > > "arch/microblaze/kernel/prom_parse.c"
> > > "arch/powerpc/kernel/prom_parse.c"
> > >
> > > Once "ibm," prefix is removed from dts file. This generic one could
> > > replace the originals.
> >
> > > +extern void of_parse_dma_window(struct device_node *dn,
> > > + const void *dma_window_prop, unsigned long *busno,
> > > + unsigned long *phys, unsigned long *size);
> >
> > At least some other of_*() parsing functions take the property name
> > rather than the property pointer, and also take an index into the
> > property in order to support multiple entries in it. See for example
> > of_parse_phandle and of_get_named_gpio_flags. Should this new API be
> > similar? E.g.:
> >
> > extern void of_parse_dma_window(struct device_node *np,
> > const char *propname, int index,
> > unsigned long *busno,
> > unsigned long *phys, unsigned long *size);
>
> In that case the function should return int for proper error handling.
Good point. I'll.
^ permalink raw reply [flat|nested] 11+ messages in thread
* [PATCH 1/1] dt: Add general DMA window parser
[not found] ` <1335270004-15652-1-git-send-email-hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
@ 2012-04-30 12:44 ` Hiroshi Doyu
0 siblings, 0 replies; 11+ messages in thread
From: Hiroshi Doyu @ 2012-04-30 12:44 UTC (permalink / raw)
To: Grant Likely,
devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org
Cc: linux-tegra-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Thierry Reding, Rob Herring,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
From: Hiroshi DOYU <hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
This code was based on:
"arch/microblaze/kernel/prom_parse.c"
"arch/powerpc/kernel/prom_parse.c"
"ibm," prefix could be supported with some modification.
Signed-off-by: Hiroshi DOYU <hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
Cc: Thierry Reding <thierry.reding-RM9K5IK7kjKj5M59NBduVrNAH6kLmebB@public.gmane.org>
---
drivers/of/Kconfig | 4 ++
drivers/of/Makefile | 1 +
drivers/of/of_dma.c | 70 ++++++++++++++++++++++++++++++++++++++++++++
include/linux/of_address.h | 13 ++++++++
4 files changed, 88 insertions(+), 0 deletions(-)
diff --git a/drivers/of/Kconfig b/drivers/of/Kconfig
index dfba3e6..3b0298b 100644
--- a/drivers/of/Kconfig
+++ b/drivers/of/Kconfig
@@ -83,4 +83,8 @@ config OF_MTD
depends on MTD
def_bool y
+config OF_DMA
+ depends on HAS_DMA
+ def_bool y
+
endmenu # OF
diff --git a/drivers/of/Makefile b/drivers/of/Makefile
index e027f44..711ff5b 100644
--- a/drivers/of/Makefile
+++ b/drivers/of/Makefile
@@ -11,3 +11,4 @@ obj-$(CONFIG_OF_MDIO) += of_mdio.o
obj-$(CONFIG_OF_PCI) += of_pci.o
obj-$(CONFIG_OF_PCI_IRQ) += of_pci_irq.o
obj-$(CONFIG_OF_MTD) += of_mtd.o
+obj-$(CONFIG_OF_DMA) += of_dma.o
diff --git a/drivers/of/of_dma.c b/drivers/of/of_dma.c
new file mode 100644
index 0000000..a89fe61
--- /dev/null
+++ b/drivers/of/of_dma.c
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
+ *
+ * Based on:
+ * "arch/microblaze/kernel/prom_parse.c"
+ * "arch/powerpc/kernel/prom_parse.c"
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ */
+
+#include <linux/export.h>
+#include <linux/of_address.h>
+
+int of_get_dma_window(struct device_node *dn,
+ const char *propname, int index,
+ unsigned long *busno,
+ dma_addr_t *addr, size_t *size)
+{
+ const __be32 *dma_window, *end;
+ int bytes, cur_index = 0;
+
+ if (!dn || !addr || !size)
+ return -EINVAL;
+
+ if (!propname)
+ propname = "dma-window";
+
+ dma_window = of_get_property(dn, propname, &bytes);
+ if (!dma_window)
+ return -ENODEV;
+ end = dma_window + bytes / sizeof(*dma_window);
+
+ while (dma_window < end) {
+ u32 cells;
+ const void *prop;
+
+ /* busno is always one cell */
+ if (busno)
+ *busno = be32_to_cpup(dma_window++);
+
+ prop = of_get_property(dn, "#dma-address-cells", NULL);
+ if (!prop)
+ prop = of_get_property(dn, "#address-cells", NULL);
+
+ cells = prop ? be32_to_cpup(prop) : of_n_addr_cells(dn);
+ if (!cells)
+ return -EINVAL;
+ *addr = of_read_number(dma_window, cells);
+ dma_window += cells;
+
+ prop = of_get_property(dn, "#dma-size-cells", NULL);
+ cells = prop ? be32_to_cpup(prop) : of_n_size_cells(dn);
+ if (!cells)
+ return -EINVAL;
+ *size = of_read_number(dma_window, cells);
+ dma_window += cells;
+
+ if (cur_index++ == index)
+ break;
+ }
+ return 0;
+}
+EXPORT_SYMBOL(of_get_dma_window);
diff --git a/include/linux/of_address.h b/include/linux/of_address.h
index 01b925a..9d9da9d 100644
--- a/include/linux/of_address.h
+++ b/include/linux/of_address.h
@@ -21,6 +21,11 @@ extern void __iomem *of_iomap(struct device_node *device, int index);
extern const u32 *of_get_address(struct device_node *dev, int index,
u64 *size, unsigned int *flags);
+extern int of_get_dma_window(struct device_node *dev,
+ const char *propname, int index,
+ unsigned long *busno,
+ dma_addr_t *phys, size_t *size);
+
#ifndef pci_address_to_pio
static inline unsigned long pci_address_to_pio(phys_addr_t addr) { return -1; }
#define pci_address_to_pio pci_address_to_pio
@@ -48,6 +53,14 @@ static inline const u32 *of_get_address(struct device_node *dev, int index,
{
return NULL;
}
+
+extern int of_get_dma_window(struct device_node *dev,
+ const char *propname, int index,
+ unsigned long *busno,
+ dma_addr_t *phys, size_t *size)
+{
+ return 0;
+}
#endif /* CONFIG_OF_ADDRESS */
--
1.7.5.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH 1/1] dt: Add general DMA window parser
@ 2012-05-11 5:07 Hiroshi DOYU
0 siblings, 0 replies; 11+ messages in thread
From: Hiroshi DOYU @ 2012-05-11 5:07 UTC (permalink / raw)
To: hdoyu-DDmLM1+adcrQT0dZR+AlfA
Cc: linux-tegra-u79uwXL29TY76Z2rM5mHXA, Thierry Reding, Grant Likely,
Rob Herring, devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ,
linux-kernel-u79uwXL29TY76Z2rM5mHXA
This code was based on:
"arch/microblaze/kernel/prom_parse.c"
"arch/powerpc/kernel/prom_parse.c"
"ibm," prefix could be supported with some modification.
Signed-off-by: Hiroshi DOYU <hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
Cc: Thierry Reding <thierry.reding-RM9K5IK7kjKj5M59NBduVrNAH6kLmebB@public.gmane.org>
---
drivers/of/Kconfig | 4 ++
drivers/of/Makefile | 1 +
drivers/of/of_dma.c | 70 ++++++++++++++++++++++++++++++++++++++++++++
include/linux/of_address.h | 13 ++++++++
4 files changed, 88 insertions(+), 0 deletions(-)
diff --git a/drivers/of/Kconfig b/drivers/of/Kconfig
index dfba3e6..3b0298b 100644
--- a/drivers/of/Kconfig
+++ b/drivers/of/Kconfig
@@ -83,4 +83,8 @@ config OF_MTD
depends on MTD
def_bool y
+config OF_DMA
+ depends on HAS_DMA
+ def_bool y
+
endmenu # OF
diff --git a/drivers/of/Makefile b/drivers/of/Makefile
index e027f44..711ff5b 100644
--- a/drivers/of/Makefile
+++ b/drivers/of/Makefile
@@ -11,3 +11,4 @@ obj-$(CONFIG_OF_MDIO) += of_mdio.o
obj-$(CONFIG_OF_PCI) += of_pci.o
obj-$(CONFIG_OF_PCI_IRQ) += of_pci_irq.o
obj-$(CONFIG_OF_MTD) += of_mtd.o
+obj-$(CONFIG_OF_DMA) += of_dma.o
diff --git a/drivers/of/of_dma.c b/drivers/of/of_dma.c
new file mode 100644
index 0000000..a89fe61
--- /dev/null
+++ b/drivers/of/of_dma.c
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
+ *
+ * Based on:
+ * "arch/microblaze/kernel/prom_parse.c"
+ * "arch/powerpc/kernel/prom_parse.c"
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ */
+
+#include <linux/export.h>
+#include <linux/of_address.h>
+
+int of_get_dma_window(struct device_node *dn,
+ const char *propname, int index,
+ unsigned long *busno,
+ dma_addr_t *addr, size_t *size)
+{
+ const __be32 *dma_window, *end;
+ int bytes, cur_index = 0;
+
+ if (!dn || !addr || !size)
+ return -EINVAL;
+
+ if (!propname)
+ propname = "dma-window";
+
+ dma_window = of_get_property(dn, propname, &bytes);
+ if (!dma_window)
+ return -ENODEV;
+ end = dma_window + bytes / sizeof(*dma_window);
+
+ while (dma_window < end) {
+ u32 cells;
+ const void *prop;
+
+ /* busno is always one cell */
+ if (busno)
+ *busno = be32_to_cpup(dma_window++);
+
+ prop = of_get_property(dn, "#dma-address-cells", NULL);
+ if (!prop)
+ prop = of_get_property(dn, "#address-cells", NULL);
+
+ cells = prop ? be32_to_cpup(prop) : of_n_addr_cells(dn);
+ if (!cells)
+ return -EINVAL;
+ *addr = of_read_number(dma_window, cells);
+ dma_window += cells;
+
+ prop = of_get_property(dn, "#dma-size-cells", NULL);
+ cells = prop ? be32_to_cpup(prop) : of_n_size_cells(dn);
+ if (!cells)
+ return -EINVAL;
+ *size = of_read_number(dma_window, cells);
+ dma_window += cells;
+
+ if (cur_index++ == index)
+ break;
+ }
+ return 0;
+}
+EXPORT_SYMBOL(of_get_dma_window);
diff --git a/include/linux/of_address.h b/include/linux/of_address.h
index 01b925a..9d9da9d 100644
--- a/include/linux/of_address.h
+++ b/include/linux/of_address.h
@@ -21,6 +21,11 @@ extern void __iomem *of_iomap(struct device_node *device, int index);
extern const u32 *of_get_address(struct device_node *dev, int index,
u64 *size, unsigned int *flags);
+extern int of_get_dma_window(struct device_node *dev,
+ const char *propname, int index,
+ unsigned long *busno,
+ dma_addr_t *phys, size_t *size);
+
#ifndef pci_address_to_pio
static inline unsigned long pci_address_to_pio(phys_addr_t addr) { return -1; }
#define pci_address_to_pio pci_address_to_pio
@@ -48,6 +53,14 @@ static inline const u32 *of_get_address(struct device_node *dev, int index,
{
return NULL;
}
+
+extern int of_get_dma_window(struct device_node *dev,
+ const char *propname, int index,
+ unsigned long *busno,
+ dma_addr_t *phys, size_t *size)
+{
+ return 0;
+}
#endif /* CONFIG_OF_ADDRESS */
--
1.7.5.4
^ permalink raw reply related [flat|nested] 11+ messages in thread
end of thread, other threads:[~2012-05-11 5:07 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-05-11 5:07 [PATCH 1/1] dt: Add general DMA window parser Hiroshi DOYU
-- strict thread matches above, loose matches on Subject: below --
2012-04-24 12:20 [PATCH v3 " Hiroshi DOYU
[not found] ` <1335270004-15652-1-git-send-email-hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-04-30 12:44 ` [PATCH " Hiroshi Doyu
2012-04-18 7:31 [PATCH 1/1] arm/dts: Tegra30: Add device tree support for SMMU Arnd Bergmann
2012-04-18 9:18 ` Hiroshi Doyu
2012-04-18 9:26 ` Thierry Reding
[not found] ` <20120418092613.GA8632-RM9K5IK7kjIQXX3q8xo1gnVAuStQJXxyR5q1nwbD4aMs9pC9oP6+/A@public.gmane.org>
2012-04-18 10:19 ` [PATCH 1/1] dt: Add general DMA window parser Hiroshi Doyu
[not found] ` <20120418.131907.2172387798112620167.hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-04-18 10:26 ` Thierry Reding
[not found] ` <20120418102629.GA14533-RM9K5IK7kjIQXX3q8xo1gnVAuStQJXxyR5q1nwbD4aMs9pC9oP6+/A@public.gmane.org>
2012-04-18 10:36 ` Hiroshi Doyu
[not found] ` <20120418.133629.1664781135413277375.hdoyu-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2012-04-18 10:54 ` Thierry Reding
[not found] ` <20120418105423.GA5667-RM9K5IK7kjIQXX3q8xo1gnVAuStQJXxyR5q1nwbD4aMs9pC9oP6+/A@public.gmane.org>
2012-04-18 11:13 ` Hiroshi Doyu
2012-04-18 17:27 ` Stephen Warren
[not found] ` <4F8EF99E.3050709-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2012-04-18 19:39 ` Thierry Reding
[not found] ` <20120418193945.GA17960-RM9K5IK7kjIQXX3q8xo1gnVAuStQJXxyR5q1nwbD4aMs9pC9oP6+/A@public.gmane.org>
2012-04-19 12:32 ` Hiroshi Doyu
2012-04-19 12:19 ` Hiroshi Doyu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).