| From dabf6b36b83a18d57e3d4b9d50544ed040d86255 Mon Sep 17 00:00:00 2001 |
| From: Michael Ellerman <mpe@ellerman.id.au> |
| Date: Sun, 26 Jan 2020 22:52:47 +1100 |
| Subject: of: Add OF_DMA_DEFAULT_COHERENT & select it on powerpc |
| |
| From: Michael Ellerman <mpe@ellerman.id.au> |
| |
| 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 | 1 + |
| drivers/of/Kconfig | 4 ++++ |
| drivers/of/address.c | 6 +++++- |
| 3 files changed, 10 insertions(+), 1 deletion(-) |
| |
| --- a/arch/powerpc/Kconfig |
| +++ b/arch/powerpc/Kconfig |
| @@ -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 |
| --- a/drivers/of/Kconfig |
| +++ b/drivers/of/Kconfig |
| @@ -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 |
| --- a/drivers/of/address.c |
| +++ b/drivers/of/address.c |
| @@ -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); |