Message ID | 1351504796-24788-5-git-send-email-b.zolnierkie@samsung.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Mon, Oct 29, 2012 at 10:59 AM, Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> wrote: > * Add device tree (DT) property ("pl330,dma-memcpy") for DMA_MEMCPY > capability and instead of setting this capability unconditionally > in pl330_probe() do it only when property is present. > Perhaps we should pass the array of peripheral interfaces via DT, the lack of which could imply MEMCPY capability ? (while it works, I doubt if pl330 is supposed to have SLAVE and MEMCPY capabilities in any instance) That would also be a step towards discarding "struct dma_pl330_platdata".
Hi, On Monday 29 October 2012 22:45:48 Jassi Brar wrote: > On Mon, Oct 29, 2012 at 10:59 AM, Bartlomiej Zolnierkiewicz > <b.zolnierkie@samsung.com> wrote: > > * Add device tree (DT) property ("pl330,dma-memcpy") for DMA_MEMCPY > > capability and instead of setting this capability unconditionally > > in pl330_probe() do it only when property is present. > > > Perhaps we should pass the array of peripheral interfaces via DT, the > lack of which could imply MEMCPY capability ? (while it works, I doubt > if pl330 is supposed to have SLAVE and MEMCPY capabilities in any > instance) In case of PL330 on EXYNOS4 we have two interfaces with SLAVE capability and one interface with MEMCPY capability. Could you please explain more the idea of passing the array of peripherals through DT so we can detect which interface has MEMCPY capability? > That would also be a step towards discarding "struct dma_pl330_platdata". I don't know if getting rid of "struct dma_pl330_platdata" is possible but we still need to come up with some way to pass the needed information through DT. Do you have an idea how it could be done? Best regards, -- Bartlomiej Zolnierkiewicz Samsung Poland R&D Center
On 30 October 2012 14:51, Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> wrote: > > Hi, > > On Monday 29 October 2012 22:45:48 Jassi Brar wrote: >> On Mon, Oct 29, 2012 at 10:59 AM, Bartlomiej Zolnierkiewicz >> <b.zolnierkie@samsung.com> wrote: >> > * Add device tree (DT) property ("pl330,dma-memcpy") for DMA_MEMCPY >> > capability and instead of setting this capability unconditionally >> > in pl330_probe() do it only when property is present. >> > >> Perhaps we should pass the array of peripheral interfaces via DT, the >> lack of which could imply MEMCPY capability ? (while it works, I doubt >> if pl330 is supposed to have SLAVE and MEMCPY capabilities in any >> instance) > > In case of PL330 on EXYNOS4 we have two interfaces with SLAVE capability > and one interface with MEMCPY capability. Could you please explain more > the idea of passing the array of peripherals through DT so we can detect > which interface has MEMCPY capability? > The DT node of a 'pdma' should have the array of indices of peripherals it caters to (what is currently peri_id of 'struct dma_pl330_platdata'). The array would be missing in the DT node of 'mdma' since all channels are equal. During probe if the array, say as property 'peri_map', is missing from DT node of the dmac, that would imply the dmac is 'mdma' and hence the pl330.c sets DMA_MEMCPY in its cap_mask. Otherwise the peri_map implies a 'pdma' and hence SLAVE|CYCLIC is set. >> That would also be a step towards discarding "struct dma_pl330_platdata". > > I don't know if getting rid of "struct dma_pl330_platdata" is possible > but we still need to come up with some way to pass the needed information > through DT. Do you have an idea how it could be done? > struct dma_pl330_platdata { u8 nr_valid_peri; u8 *peri_id; As explain above, these two should move to DT node of the dma controller. dma_cap_mask_t cap_mask; Should be set in pl330.c : MEMCPY for mdma, SLAVE|CYCLIC for pdma unsigned mcbuf_sz; Currently unused and already safe enough default value set in driver. }
diff --git a/Documentation/devicetree/bindings/dma/arm-pl330.txt b/Documentation/devicetree/bindings/dma/arm-pl330.txt index 36e27d5..2661c7b 100644 --- a/Documentation/devicetree/bindings/dma/arm-pl330.txt +++ b/Documentation/devicetree/bindings/dma/arm-pl330.txt @@ -11,6 +11,7 @@ Required properties: Optional properties: - dma-coherent : Present if dma operations are coherent +- pl330,dma-memcpy : Present if controller has DMA_MEMCPY capability Example: diff --git a/arch/arm/boot/dts/exynos4.dtsi b/arch/arm/boot/dts/exynos4.dtsi index 96d4462..ce5b03f 100644 --- a/arch/arm/boot/dts/exynos4.dtsi +++ b/arch/arm/boot/dts/exynos4.dtsi @@ -249,6 +249,7 @@ compatible = "arm,pl330", "arm,primecell"; reg = <0x12850000 0x1000>; interrupts = <0 34 0>; + pl330,dma-memcpy; }; }; }; diff --git a/arch/arm/boot/dts/exynos5250.dtsi b/arch/arm/boot/dts/exynos5250.dtsi index 49546bc..d659e7b 100644 --- a/arch/arm/boot/dts/exynos5250.dtsi +++ b/arch/arm/boot/dts/exynos5250.dtsi @@ -247,12 +247,14 @@ compatible = "arm,pl330", "arm,primecell"; reg = <0x10800000 0x1000>; interrupts = <0 33 0>; + pl330,dma-memcpy; }; mdma1: mdma@11C10000 { compatible = "arm,pl330", "arm,primecell"; reg = <0x11C10000 0x1000>; interrupts = <0 124 0>; + pl330,dma-memcpy; }; }; diff --git a/arch/arm/boot/dts/highbank.dts b/arch/arm/boot/dts/highbank.dts index 0c6fc34..87f1d25 100644 --- a/arch/arm/boot/dts/highbank.dts +++ b/arch/arm/boot/dts/highbank.dts @@ -297,6 +297,7 @@ interrupts = <0 92 4>; clocks = <&pclk>; clock-names = "apb_pclk"; + pl330,dma-memcpy; }; ethernet@fff50000 { diff --git a/arch/arm/boot/dts/socfpga.dtsi b/arch/arm/boot/dts/socfpga.dtsi index 0772f57..2fe1697 100644 --- a/arch/arm/boot/dts/socfpga.dtsi +++ b/arch/arm/boot/dts/socfpga.dtsi @@ -71,6 +71,7 @@ compatible = "arm,pl330", "arm,primecell"; reg = <0xffe01000 0x1000>; interrupts = <0 180 4>; + pl330,dma-memcpy; }; }; diff --git a/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts b/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts index d12b34c..d82953c 100644 --- a/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts +++ b/arch/arm/boot/dts/vexpress-v2p-ca15-tc1.dts @@ -94,6 +94,7 @@ <0 89 4>, <0 90 4>, <0 91 4>; + pl330,dma-memcpy; }; timer { diff --git a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts index 4890a81..b9e6ba2 100644 --- a/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts +++ b/arch/arm/boot/dts/vexpress-v2p-ca15_a7.dts @@ -114,6 +114,7 @@ <0 89 4>, <0 90 4>, <0 91 4>; + pl330,dma-memcpy; }; timer { diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c index db7574b..e10290b 100644 --- a/drivers/dma/pl330.c +++ b/drivers/dma/pl330.c @@ -2860,6 +2860,7 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) struct pl330_info *pi; struct dma_device *pd; struct resource *res; + struct device_node *node; int i, ret, irq; int num_chan; @@ -2921,12 +2922,14 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) goto probe_err4; } + node = adev->dev.of_node; + for (i = 0; i < num_chan; i++) { pch = &pdmac->peripherals[i]; - if (!adev->dev.of_node) + if (!node) pch->chan.private = pdat ? &pdat->peri_id[i] : NULL; else - pch->chan.private = adev->dev.of_node; + pch->chan.private = node; INIT_LIST_HEAD(&pch->work_list); spin_lock_init(&pch->lock); @@ -2942,7 +2945,9 @@ pl330_probe(struct amba_device *adev, const struct amba_id *id) if (pdat) { pd->cap_mask = pdat->cap_mask; } else { - dma_cap_set(DMA_MEMCPY, pd->cap_mask); + if (adev->dev.of_node && + of_find_property(node, "pl330,dma-memcpy", NULL)) + dma_cap_set(DMA_MEMCPY, pd->cap_mask); if (pi->pcfg.num_peri) { dma_cap_set(DMA_SLAVE, pd->cap_mask); dma_cap_set(DMA_CYCLIC, pd->cap_mask);