of: Add OF_DMA_DEFAULT_COHERENT & select it on powerpc
authorMichael Ellerman <mpe@ellerman.id.au>
Sun, 26 Jan 2020 11:52:47 +0000 (22:52 +1100)
committerRob Herring <robh@kernel.org>
Tue, 28 Jan 2020 14:26:20 +0000 (08:26 -0600)
There's an OF helper called of_dma_is_coherent(), which checks if a
device has a "dma-coherent" property to see if the device is coherent
for DMA.

But on some platforms devices are coherent by default, and on some
platforms it's not possible to update existing device trees to add the
"dma-coherent" property.

So add a Kconfig symbol to allow arch code to tell
of_dma_is_coherent() that devices are coherent by default, regardless
of the presence of the property.

Select that symbol on powerpc when NOT_COHERENT_CACHE is not set, ie.
when the system has a coherent cache.

Fixes: 92ea637edea3 ("of: introduce of_dma_is_coherent() helper")
Cc: stable@vger.kernel.org # v3.16+
Reported-by: Christian Zigotzky <chzigotzky@xenosoft.de>
Tested-by: Christian Zigotzky <chzigotzky@xenosoft.de>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: Rob Herring <robh@kernel.org>
arch/powerpc/Kconfig
drivers/of/Kconfig
drivers/of/address.c

index 1ec34e16ed65d38c1e7a7d0c44e11c01a1fa7a71..19f5aa8ac9a3729992a02d0a5a4c7b35795e46b2 100644 (file)
@@ -238,6 +238,7 @@ config PPC
        select NEED_DMA_MAP_STATE               if PPC64 || NOT_COHERENT_CACHE
        select NEED_SG_DMA_LENGTH
        select OF
+       select OF_DMA_DEFAULT_COHERENT          if !NOT_COHERENT_CACHE
        select OF_EARLY_FLATTREE
        select OLD_SIGACTION                    if PPC32
        select OLD_SIGSUSPEND
index 37c2ccbefecdcea72bbaee39a9ea9859d12a32e1..d91618641be693bb7448ccda99799c7bf37d193e 100644 (file)
@@ -103,4 +103,8 @@ config OF_OVERLAY
 config OF_NUMA
        bool
 
+config OF_DMA_DEFAULT_COHERENT
+       # arches should select this if DMA is coherent by default for OF devices
+       bool
+
 endif # OF
index 99c1b8058559e67b937550d47cbcab3f7dc80ebb..e8a39c3ec4d4f75e49f73f18e2e71852c02433c1 100644 (file)
@@ -995,12 +995,16 @@ out:
  * @np:        device node
  *
  * It returns true if "dma-coherent" property was found
- * for this device in DT.
+ * for this device in the DT, or if DMA is coherent by
+ * default for OF devices on the current platform.
  */
 bool of_dma_is_coherent(struct device_node *np)
 {
        struct device_node *node = of_node_get(np);
 
+       if (IS_ENABLED(CONFIG_OF_DMA_DEFAULT_COHERENT))
+               return true;
+
        while (node) {
                if (of_property_read_bool(node, "dma-coherent")) {
                        of_node_put(node);