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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 11 Feb 2020 12:34:03 +0000 (04:34 -0800)
commit dabf6b36b83a18d57e3d4b9d50544ed040d86255 upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/powerpc/Kconfig
drivers/of/Kconfig
drivers/of/address.c

index a80669209155383343ba8adbb90b3e8427e2afdb..6f475dc5829b65d8c2886c0424201349cab24a8d 100644 (file)
@@ -230,6 +230,7 @@ config PPC
        select NEED_SG_DMA_LENGTH
        select NO_BOOTMEM
        select OF
+       select OF_DMA_DEFAULT_COHERENT          if !NOT_COHERENT_CACHE
        select OF_EARLY_FLATTREE
        select OF_RESERVED_MEM
        select OLD_SIGACTION                    if PPC32
index ad3fcad4d75b8b12a0d6ecbe4d199ad78fc91a11..5e131590056230cb82c54ddaacd771c4195149ac 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 7ddbf0a1ab8675508b798b322ba5e8f6414d14c7..c42aebba35ab8248cf297bedd603de321929e988 100644 (file)
@@ -970,12 +970,16 @@ EXPORT_SYMBOL_GPL(of_dma_get_range);
  * @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);