Commit
f6f2421c0a1c removed pl330_info structure by embedding it into
pl330_dmac structure, but did not ensure that the dmac->ddma.dev
pointer gets initialised before use. When dma_alloc_coherent() gets
called on arm64 a WARN() gets triggered due to dev being NULL.
------------[ cut here ]------------
WARNING: CPU: 1 PID: 1 at arch/arm64/mm/dma-mapping.c:49 __dma_alloc_coherent+0xd0/0xe0()
Use an actual device structure for DMA allocation
Modules linked in:
CPU: 1 PID: 1 Comm: swapper/0 Not tainted 3.17.0+ #5
Call trace:
[<
ffffffc000087f24>] dump_backtrace+0x0/0x130
[<
ffffffc000088064>] show_stack+0x10/0x1c
[<
ffffffc0004e8af8>] dump_stack+0x74/0xb8
[<
ffffffc0000aa444>] warn_slowpath_common+0x8c/0xb4
[<
ffffffc0000aa4b8>] warn_slowpath_fmt+0x4c/0x58
[<
ffffffc000092580>] __dma_alloc_coherent+0xcc/0xe0
[<
ffffffc000092734>] __dma_alloc_noncoherent+0x64/0x158
[<
ffffffc000312cd8>] pl330_probe+0x650/0x8f0
[<
ffffffc00030e1d4>] amba_probe+0xa0/0xc8
[<
ffffffc000350240>] really_probe+0xc4/0x22c
[<
ffffffc0003504b4>] __driver_attach+0xa0/0xa8
[<
ffffffc00034e5fc>] bus_for_each_dev+0x54/0x98
[<
ffffffc00034fd8c>] driver_attach+0x1c/0x28
[<
ffffffc00034fa08>] bus_add_driver+0x14c/0x204
[<
ffffffc000350b84>] driver_register+0x64/0x130
[<
ffffffc00030dcf8>] amba_driver_register+0x50/0x5c
[<
ffffffc0006a60d0>] pl330_driver_init+0x10/0x1c
[<
ffffffc0000814ac>] do_one_initcall+0x88/0x19c
[<
ffffffc00068dab8>] kernel_init_freeable+0x140/0x1e0
[<
ffffffc0004e5e18>] kernel_init+0x10/0xd4
---[ end trace
76f2d47a444e523e ]---
(NULL device *): dmac_alloc_resources:1821 Can't allocate memory!
(NULL device *): Unable to create channels for DMAC
This patch will also ensure that any dev_err messages are printed
with the appropriate device name.
Signed-off-by: Liviu Dudau <Liviu.Dudau@arm.com>
Signed-off-by: Andrew Jackson <Andrew.Jackson@arm.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
return -ENOMEM;
}
+ pd = &pl330->ddma;
+ pd->dev = &adev->dev;
+
pl330->mcbufsz = pdat ? pdat->mcbuf_sz : 0;
res = &adev->res;
if (!add_desc(pl330, GFP_KERNEL, NR_DEFAULT_DESC))
dev_warn(&adev->dev, "unable to allocate desc\n");
- pd = &pl330->ddma;
INIT_LIST_HEAD(&pd->channels);
/* Initialize channel parameters */
list_add_tail(&pch->chan.device_node, &pd->channels);
}
- pd->dev = &adev->dev;
if (pdat) {
pd->cap_mask = pdat->cap_mask;
} else {