[PATCH] of/platform: Initialise AMBA default DMA masks

Linus Walleij linus.walleij at linaro.org
Tue Aug 28 08:44:42 UTC 2018


commit a5516219b102 ("of/platform: Initialise default DMA masks")
sets up the coherent_dma_mask of platform devices created
from the device tree, but fails to do the same for AMBA
(PrimeCell) devices.

This leads to a regression in kernel v4.19-rc1 triggering the
WARN_ONCE() in kernel/dma/coherent.c, dma_alloc_attrs()
WARN_ON_ONCE(dev && !dev->coherent_dma_mask):

------------[ cut here ]------------
WARNING: CPU: 0 PID: 1 at ../include/linux/dma-mapping.h:522 drm_gem_cma_create+0x1dc/0x21c
Modules linked in:
CPU: 0 PID: 1 Comm: swapper Not tainted 4.19.0-rc1+ #15
Hardware name: ARM-Versatile (Device Tree Support)
[<c001c558>] (unwind_backtrace) from [<c00191f8>] (show_stack+0x10/0x14)
[<c00191f8>] (show_stack) from [<c00246a0>] (__warn+0xcc/0xf4)
[<c00246a0>] (__warn) from [<c00247dc>] (warn_slowpath_null+0x3c/0x48)
[<c00247dc>] (warn_slowpath_null) from [<c025cef0>] (drm_gem_cma_create+0x1dc/0x21c)
[<c025cef0>] (drm_gem_cma_create) from [<c025d3fc>] (drm_gem_cma_dumb_create+0x44/0x98)
[<c025d3fc>] (drm_gem_cma_dumb_create) from [<c025c648>] (drm_client_framebuffer_create+0x80/0x204)
[<c025c648>] (drm_client_framebuffer_create) from [<c0234a20>] (drm_fb_helper_generic_probe+0x4c/0x200)
[<c0234a20>] (drm_fb_helper_generic_probe) from [<c0235b14>] (__drm_fb_helper_initial_config_and_unlock+0x1cc/0x454)
[<c0235b14>] (__drm_fb_helper_initial_config_and_unlock) from [<c0235ea0>] (drm_fb_helper_fbdev_setup+0x104/0x218)
[<c0235ea0>] (drm_fb_helper_fbdev_setup) from [<c0236410>] (drm_fbdev_cma_init+0x7c/0xac)
[<c0236410>] (drm_fbdev_cma_init) from [<c0236448>] (drm_fb_cma_fbdev_init+0x8/0x14)
[<c0236448>] (drm_fb_cma_fbdev_init) from [<c0260d90>] (pl111_amba_probe+0x3c8/0x4a4)
[<c0260d90>] (pl111_amba_probe) from [<c01f479c>] (amba_probe+0xd8/0x154)
[<c01f479c>] (amba_probe) from [<c0267398>] (really_probe+0x200/0x2ac)
[<c0267398>] (really_probe) from [<c02675a4>] (driver_probe_device+0x5c/0x168)
[<c02675a4>] (driver_probe_device) from [<c0267780>] (__driver_attach+0xd0/0xd4)
[<c0267780>] (__driver_attach) from [<c02656c0>] (bus_for_each_dev+0x70/0xb4)
[<c02656c0>] (bus_for_each_dev) from [<c0266808>] (bus_add_driver+0x170/0x204)
[<c0266808>] (bus_add_driver) from [<c0268090>] (driver_register+0x74/0x108)
[<c0268090>] (driver_register) from [<c000ac20>] (do_one_initcall+0x48/0x1a0)
[<c000ac20>] (do_one_initcall) from [<c0507dc0>] (kernel_init_freeable+0x104/0x1c4)
[<c0507dc0>] (kernel_init_freeable) from [<c03e6ee4>] (kernel_init+0x8/0xf0)
[<c03e6ee4>] (kernel_init) from [<c00090e0>] (ret_from_fork+0x14/0x34)
Exception stack(0xc781ffb0 to 0xc781fff8)
ffa0:                                     00000000 00000000 00000000 00000000
ffc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
ffe0: 00000000 00000000 00000000 00000000 00000013 00000000
---[ end trace 2dc47eb796bde006 ]---

This regresses the PL111 DRM driver in drivers/gpu/drm/pl111
that uses the AMBA PrimeCell to instantiate the frame buffer
device, as it cannot allocate a chunk of coherent memory
anymore due to the missing mask.

Fixes: a5516219b102 ("of/platform: Initialise default DMA masks")
Cc: Robin Murphy <robin.murphy at arm.com>
Cc: Rob Herring <robh at kernel.org>
Cc: Christoph Hellwig <hch at lst.de>
Cc: Eric Anholt <eric at anholt.net>
Cc: Noralf Trønnes <noralf at tronnes.org>
Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
---
I don't know which tree Robins patch came in from, but I assume
Christoph's, so can you carry this patch as well?
---
 drivers/of/platform.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/of/platform.c b/drivers/of/platform.c
index 7ba90c290a42..7435c79ca56d 100644
--- a/drivers/of/platform.c
+++ b/drivers/of/platform.c
@@ -242,6 +242,9 @@ static struct amba_device *of_amba_device_create(struct device_node *node,
 		goto err_clear_flag;
 
 	/* setup generic device info */
+	dev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
+	if (!dev->dev.dma_mask)
+		dev->dev.dma_mask = &dev->dev.coherent_dma_mask;
 	dev->dev.of_node = of_node_get(node);
 	dev->dev.fwnode = &node->fwnode;
 	dev->dev.parent = parent ? : &platform_bus;
-- 
2.17.1



More information about the dri-devel mailing list