Skip to content

Commit 87a3907

Browse files
curtistkleinvinodkoul
authored andcommitted
dmaengine: fsl-qdma: init irq after reg initialization
Initialize the qDMA irqs after the registers are configured so that interrupts that may have been pending from a primary kernel don't get processed by the irq handler before it is ready to and cause panic with the following trace: Call trace: fsl_qdma_queue_handler+0xf8/0x3e8 __handle_irq_event_percpu+0x78/0x2b0 handle_irq_event_percpu+0x1c/0x68 handle_irq_event+0x44/0x78 handle_fasteoi_irq+0xc8/0x178 generic_handle_irq+0x24/0x38 __handle_domain_irq+0x90/0x100 gic_handle_irq+0x5c/0xb8 el1_irq+0xb8/0x180 _raw_spin_unlock_irqrestore+0x14/0x40 __setup_irq+0x4bc/0x798 request_threaded_irq+0xd8/0x190 devm_request_threaded_irq+0x74/0xe8 fsl_qdma_probe+0x4d4/0xca8 platform_drv_probe+0x50/0xa0 really_probe+0xe0/0x3f8 driver_probe_device+0x64/0x130 device_driver_attach+0x6c/0x78 __driver_attach+0xbc/0x158 bus_for_each_dev+0x5c/0x98 driver_attach+0x20/0x28 bus_add_driver+0x158/0x220 driver_register+0x60/0x110 __platform_driver_register+0x44/0x50 fsl_qdma_driver_init+0x18/0x20 do_one_initcall+0x48/0x258 kernel_init_freeable+0x1a4/0x23c kernel_init+0x10/0xf8 ret_from_fork+0x10/0x18 Cc: stable@vger.kernel.org Fixes: b092529 ("dmaengine: fsl-qdma: Add qDMA controller driver for Layerscape SoCs") Signed-off-by: Curtis Klein <curtis.klein@hpe.com> Signed-off-by: Yi Zhao <yi.zhao@nxp.com> Signed-off-by: Frank Li <Frank.Li@nxp.com> Link: https://lore.kernel.org/r/20240201220406.440145-1-Frank.Li@nxp.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
1 parent 9d739bc commit 87a3907

File tree

1 file changed

+8
-9
lines changed

1 file changed

+8
-9
lines changed

drivers/dma/fsl-qdma.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1198,10 +1198,6 @@ static int fsl_qdma_probe(struct platform_device *pdev)
11981198
if (!fsl_qdma->queue)
11991199
return -ENOMEM;
12001200

1201-
ret = fsl_qdma_irq_init(pdev, fsl_qdma);
1202-
if (ret)
1203-
return ret;
1204-
12051201
fsl_qdma->irq_base = platform_get_irq_byname(pdev, "qdma-queue0");
12061202
if (fsl_qdma->irq_base < 0)
12071203
return fsl_qdma->irq_base;
@@ -1240,16 +1236,19 @@ static int fsl_qdma_probe(struct platform_device *pdev)
12401236

12411237
platform_set_drvdata(pdev, fsl_qdma);
12421238

1243-
ret = dma_async_device_register(&fsl_qdma->dma_dev);
1239+
ret = fsl_qdma_reg_init(fsl_qdma);
12441240
if (ret) {
1245-
dev_err(&pdev->dev,
1246-
"Can't register NXP Layerscape qDMA engine.\n");
1241+
dev_err(&pdev->dev, "Can't Initialize the qDMA engine.\n");
12471242
return ret;
12481243
}
12491244

1250-
ret = fsl_qdma_reg_init(fsl_qdma);
1245+
ret = fsl_qdma_irq_init(pdev, fsl_qdma);
1246+
if (ret)
1247+
return ret;
1248+
1249+
ret = dma_async_device_register(&fsl_qdma->dma_dev);
12511250
if (ret) {
1252-
dev_err(&pdev->dev, "Can't Initialize the qDMA engine.\n");
1251+
dev_err(&pdev->dev, "Can't register NXP Layerscape qDMA engine.\n");
12531252
return ret;
12541253
}
12551254

0 commit comments

Comments
 (0)