Hi Bruce,

On 5/3/21 10:13 AM, Bruce Ashfield wrote:
In message: Re: [linux-yocto][linux-yocto 
v5.10/standard/sdkv5.4/xlnx-soc][PATCH 2/2] dmaengine: xilinx: dpdma: 
request_irq after initializing dma channels
on 29/04/2021 Michal Simek wrote:


On 4/29/21 9:46 AM, [email protected] wrote:
From: Quanyang Wang <[email protected]>

In some scenarios (kdump), dpdma hardware irqs has been enabled when
calling request_irq in probe function, and then the dpdma irq handler
xilinx_dpdma_irq_handler is invoked to access xdev->chan[i]. But at
this moment xdev->chan[i] hasn't been initialized. So let's call the
request_irq after initializing dma channels to avoid kdump kernel
crash as below:

[    3.696128] Unable to handle kernel NULL pointer dereference at virtual 
address 000000000000012c
[    3.696710] xilinx-zynqmp-dpdma fd4c0000.dma-controller: Xilinx DPDMA engine 
is probed
[    3.704900] Mem abort info:
[    3.704902]   ESR = 0x96000005
[    3.704905]   EC = 0x25: DABT (current EL), IL = 32 bits
[    3.704907]   SET = 0, FnV = 0
[    3.704912]   EA = 0, S1PTW = 0
[    3.713800] ahci-ceva fd0c0000.ahci: supply ahci not found, using dummy 
regulator
[    3.715585] Data abort info:
[    3.715587]   ISV = 0, ISS = 0x00000005
[    3.715589]   CM = 0, WnR = 0
[    3.715592] [000000000000012c] user address but active_mm is swapper
[    3.715596] Internal error: Oops: 96000005 [#1] SMP
[    3.715599] Modules linked in:
[    3.715608] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 
5.10.0-12170-g60894882155f-dirty #77
[    3.723937] Hardware name: ZynqMP ZCU102 Rev1.0 (DT)
[    3.723942] pstate: 80000085 (Nzcv daIf -PAN -UAO -TCO BTYPE=--)
[    3.723956] pc : xilinx_dpdma_irq_handler+0x418/0x560
[    3.793049] lr : xilinx_dpdma_irq_handler+0x3d8/0x560
[    3.798089] sp : ffffffc01186bdf0
[    3.801388] x29: ffffffc01186bdf0 x28: ffffffc011836f28
[    3.806692] x27: ffffff8023e0ac80 x26: 0000000000000080
[    3.811996] x25: 0000000008000408 x24: 0000000000000003
[    3.817300] x23: ffffffc01186be70 x22: ffffffc011291740
[    3.822604] x21: 0000000000000000 x20: 0000000008000408
[    3.827908] x19: 0000000000000000 x18: 0000000000000010
[    3.833212] x17: 0000000000000000 x16: 0000000000000000
[    3.838516] x15: 0000000000000000 x14: ffffffc011291740
[    3.843820] x13: ffffffc02eb4d000 x12: 0000000034d4d91d
[    3.849124] x11: 0000000000000040 x10: ffffffc0112d2d48
[    3.854428] x9 : ffffffc0112d2d40 x8 : ffffff8021c00268
[    3.859732] x7 : 0000000000000000 x6 : ffffffc011836000
[    3.865036] x5 : 0000000000000003 x4 : 0000000000000000
[    3.870340] x3 : 0000000000000001 x2 : 0000000000000000
[    3.875644] x1 : 0000000000000000 x0 : 000000000000012c
[    3.880948] Call trace:
[    3.883382]  xilinx_dpdma_irq_handler+0x418/0x560
[    3.888079]  __handle_irq_event_percpu+0x5c/0x178
[    3.892774]  handle_irq_event_percpu+0x34/0x98
[    3.897210]  handle_irq_event+0x44/0xb8
[    3.901030]  handle_fasteoi_irq+0xd0/0x190
[    3.905117]  generic_handle_irq+0x30/0x48
[    3.909111]  __handle_domain_irq+0x64/0xc0
[    3.913192]  gic_handle_irq+0x78/0xa0
[    3.916846]  el1_irq+0xc4/0x180
[    3.919982]  cpuidle_enter_state+0x134/0x2f8
[    3.924243]  cpuidle_enter+0x38/0x50
[    3.927810]  call_cpuidle+0x1c/0x40
[    3.931290]  do_idle+0x20c/0x270
[    3.934502]  cpu_startup_entry+0x28/0x58
[    3.938410]  rest_init+0xbc/0xcc
[    3.941631]  arch_call_rest_init+0x10/0x1c
[    3.945718]  start_kernel+0x51c/0x558

Fixes: 7cbb0c63de3f ("dmaengine: xilinx: dpdma: Add the Xilinx DisplayPort DMA 
engine driver")
Signed-off-by: Quanyang Wang <[email protected]>
---
  drivers/dma/xilinx/xilinx_dpdma.c | 30 +++++++++++++++---------------
  1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/drivers/dma/xilinx/xilinx_dpdma.c 
b/drivers/dma/xilinx/xilinx_dpdma.c
index c4808a56aee0..7f37e23ede28 100644
--- a/drivers/dma/xilinx/xilinx_dpdma.c
+++ b/drivers/dma/xilinx/xilinx_dpdma.c
@@ -1744,19 +1744,6 @@ static int xilinx_dpdma_probe(struct platform_device 
*pdev)
        if (IS_ERR(xdev->reg))
                return PTR_ERR(xdev->reg);
- xdev->irq = platform_get_irq(pdev, 0);
-       if (xdev->irq < 0) {
-               dev_err(xdev->dev, "failed to get platform irq\n");
-               return xdev->irq;
-       }
-
-       ret = request_irq(xdev->irq, xilinx_dpdma_irq_handler, IRQF_SHARED,
-                         dev_name(xdev->dev), xdev);
-       if (ret) {
-               dev_err(xdev->dev, "failed to request IRQ\n");
-               return ret;
-       }
-
        ddev = &xdev->common;
        ddev->dev = &pdev->dev;
@@ -1811,6 +1798,19 @@ static int xilinx_dpdma_probe(struct platform_device *pdev)
                goto error_of_dma;
        }
+ xdev->irq = platform_get_irq(pdev, 0);
+       if (xdev->irq < 0) {
+               dev_err(xdev->dev, "failed to get platform irq\n");
+               goto error_irq;
+       }
+
+       ret = request_irq(xdev->irq, xilinx_dpdma_irq_handler, IRQF_SHARED,
+                         dev_name(xdev->dev), xdev);
+       if (ret) {
+               dev_err(xdev->dev, "failed to request IRQ\n");
+               goto error_irq;
+       }
+
        xilinx_dpdma_enable_irq(xdev);
xilinx_dpdma_debugfs_init(xdev);
@@ -1819,6 +1819,8 @@ static int xilinx_dpdma_probe(struct platform_device 
*pdev)
return 0; +error_irq:
+       of_dma_controller_free(pdev->dev.of_node);
  error_of_dma:
        dma_async_device_unregister(ddev);
  error_dma_async:
@@ -1827,8 +1829,6 @@ static int xilinx_dpdma_probe(struct platform_device 
*pdev)
        for (i = 0; i < ARRAY_SIZE(xdev->chan); i++)
                xilinx_dpdma_chan_remove(xdev->chan[i]);
- free_irq(xdev->irq, xdev);
-
        return ret;
  }
I would wait reaction from Laurent and others on this. I expect it will
come soon but no problem from my side.
Was this also submitted to them ? I didn't notice it on the mailing lists,
but could have easily missed it.

Quanyang: follow up to this patch when you get the rest of the feedback,
so I'll know it is good to merge.

Got it. Now it's under review for mainline. When it's ready, I will send it to linux-yocto again. Please ignore this patch.

Thanks,

Quanyang


Bruce

Thanks,
Michal



-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#9840): 
https://lists.yoctoproject.org/g/linux-yocto/message/9840
Mute This Topic: https://lists.yoctoproject.org/mt/82450330/21656
Group Owner: [email protected]
Unsubscribe: https://lists.yoctoproject.org/g/linux-yocto/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to