ARM平台ioremap是否生效?Zynq-7010 FPGA中断触发0x1406异常
Zynq-7010 FPGA上Linux 5.10内核多连续中断触发0x1406外部中止异常排查求助
在Zynq-7010 FPGA平台测试Linux 5.10内核时,处理多连续中断过程中,中断处理程序触发Unhandled fault: imprecise external abort (0x1406)异常,完整异常日志如下:
[ 267.634250] 8<--- cut here --- [ 267.635983] Unhandled fault: imprecise external abort (0x1406) at 0xb418b000 [ 267.641733] pgd = 1945ea2d [ 267.643116] [b418b000] *pgd=00000000 [ 267.645383] Internal error: : 1406 [#1] PREEMPT SMP ARM [ 267.649291] Modules linked in: snd_soc_hdmi_codec snd_soc_adi_axi_spdif adi_axi_hdmi clk_axi_clkgen isl9305 adv7511 epiphany(O) [ 267.659502] CPU: 0 PID: 5 Comm: kworker/0:0 Tainted: G O 5.10.0-parallella #1 [ 267.666617] Hardware name: Xilinx Zynq Platform [ 267.669898] Workqueue: events elink_mailbox_irq_handler_bh [epiphany] [ 267.675040] PC is at elink_mailbox_irq_handler_bh+0x2c/0x10c [epiphany] [ 267.680367] LR is at elink_mailbox_irq_handler_bh+0x14/0x10c [epiphany] [ 267.685676] pc : [<bf0006c8>] lr : [<bf0006b0>] psr: 600f0013 [ 267.690634] sp : c1075f10 ip : 00007374 fp : ef80e940 [ 267.694542] r10: 00000000 r9 : 00000000 r8 : 00000000 [ 267.698449] r7 : ef811a00 r6 : ef80e780 r5 : c1bda2a8 r4 : deadbeef [ 267.703665] r3 : f0af0738 r2 : f0a00000 r1 : 00000000 r0 : bf0083c8 [ 267.708900] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none [ 267.714706] Control: 18c5387d Table: 01a7404a DAC: 00000051 [ 267.719148] Process kworker/0:0 (pid: 5, stack limit = 0x29a50684) [ 267.724015] Stack: (0xc1075f10 to 0xc1076000) [ 267.727074] 5f00: 00000000 00000000 c1bda2a8 c1bda2a8 [ 267.733931] 5f20: c100db80 ef80e780 ef811a00 c0137e30 ef80e798 c0f02d00 c100db80 ef80e780 [ 267.740806] 5f40: c100db94 ef80e798 c0f02d00 00000008 c1074000 c01380ec c0f5dc0c c0f54bd5 [ 267.747681] 5f60: c1075f74 c1039d40 00000000 c1074000 c101c700 c0138090 c100db80 c106dea4 [ 267.754557] 5f80: c1039d64 c013e0cc 00000000 c101c700 c013df4c 00000000 00000000 00000000 [ 267.761413] 5fa0: 00000000 00000000 00000000 c0100148 00000000 00000000 00000000 00000000 [ 267.768289] 5fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [ 267.775145] 5fe0: 00000000 00000000 00000000 00000000 00000013 00000000 00000000 00000000 [ 267.782057] [<bf0006c8>] (elink_mailbox_irq_handler_bh [epiphany]) from [<c0137e30>] (process_one_work+0x1c4/0x424) [ 267.791181] [<c0137e30>] (process_one_work) from [<c01380ec>] (worker_thread+0x5c/0x568) [ 267.797964] [<c01380ec>] (worker_thread) from [<c013e0cc>] (kthread+0x180/0x184) [ 267.804065] [<c013e0cc>] (kthread) from [<c0100148>] (ret_from_fork+0x14/0x2c) [ 267.809982] Exception stack(0xc1075fb0 to 0xc1075ff8) [ 267.813724] 5fa0: 00000000 00000000 00000000 00000000 [ 267.820599] 5fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [ 267.827456] 5fe0: 00000000 00000000 00000000 00000000 00000013 00000000 [ 267.832764] Code: e340300f e0823003 e5934000 f57ff04f (e1a03004) [ 267.837557] ---[ end trace 081e716931792d8f ]---
异常发生在elink_mailbox_irq_handler_bh()函数中,目前怀疑异常由提供IO寄存器的FPGA硬件代码问题导致,已找到两种临时规避方法:
- 方法1:在首次寄存器访问前添加调试打印
pr_info("adding delay works!\n"); empty = elink_mailbox_empty_p(elink); if (!empty) { elink_mailbox_irq_disable(elink); atomic_set(&elink->mailbox_maybe_not_empty, 1); }
- 方法2:移除不必要的寄存器访问
//pr_info("adding delay works!\n"); //empty = elink_mailbox_empty_p(elink); //if (!empty) { elink_mailbox_irq_disable(elink); atomic_set(&elink->mailbox_maybe_not_empty, 1); //}
方法2生效的原因推测是减少了中断处理程序中的寄存器访问次数,避免了与主驱动代码的寄存器访问冲突。
另外,异常现场r4寄存器值为deadbeef,疑似FPGA读取问题的标识。在深入硬件调试前,寻求其他排查思路或见解。
内容的提问来源于stack exchange,提问作者Pete
相关产品推荐
相关产品推荐

