This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM62L:AM62L3 UART DMA — 负载问题

Guru**** 2976890 points

Other Parts Discussed in Thread: AM62L

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1660916/am62l-am62l3-uart-dma---problems-under-load

器件型号: AM62L

我们正在使用具有 UDMA 支持的 TI 内核 12.01.00.03。
我们发现、对于 UART4 端口、我们必须在 uart4 器件树节点上添加以下内容来为 DMA 进行设置:

DMA =<&main_pktdma 0x4404 0>、
<&main_pktdma 0xc404 0>;
dma-names =“rx“、“TX“;

此外、我们还为 OMAP 串行驱动程序激活了 DMA 功能、因为非 DMA 模式没有显示预期的吞吐率。

对于我们的测试、我们将 UART4 接口设置为原始模式、波特率为 230400、无流控制(远程器件上的 UART 不支持流控制)。
然后、我们开始从远程器件连续发送数据、从而完全加载 UART4 的 RX 引脚。

远程器件会持续传输递增计数的值。 在 AM62L3 上、应用程序读取接收到的字节并检查顺序。

这在前几秒钟内正常工作、但随后出现内核的第一个错误:

“omap8250 2840000.serial:拆卸不完整“

由于控制台锁、随后出现“警告:可能检测到循环锁定依赖关系“。 似乎 teardown 消息不应该打印在 dma 处理程序__dma_rx_do_complete() 中。

因此、我们禁用了 8250_OMAP-Lc 驱动程序“dev_err(p->port.dev,“teardown incomplete\n“);“中的消息、以继续测试。

现在这看起来可行、但在停止 AM62L3 上的接收应用程序后、每次我们都会看到消息“ti-UDMA-v2 485c0000.dma-controller:chan0 teardown timeout!“。

然后,我们可以重新启动并停止应用程序几次(每次出现相同的消息),但在第 4 次或第 5 次重新启动后,应用程序挂起,短时间后内核继续显示消息:

[130.699837] RCU:INFO:RCU_PREEME 在 CPU 上自动检测到停止
[130.705686] RCU:  0-...!:(6500 个 tick this GP) idle=ca54/1/0x4000000000000000 softirq=1351/1351 fqs=0
[130.715270] RCU:  (T=6500 Jiffies g=1749 q=3 ncpus=2)
[130.720322] RCU:在 6499 个 Jiffies! g1749 f0x0 Rcu_GP_WAIT_FQS (5)->state=0x402
[ 130.731612] RCU:  CPU=0 timer-softirq=1315 上可能出现的计时器处理问题
[130.738565] RCU: RCU_prepempt kthread 渴望获得 6506 个 jiffies! g1749 f0x0 RCU_GP_WAIT_FQS (5)->state=0x402 ->cpu=0
[ 130.748902] RCU:  除非 RCU_PREEMPT kthread 获得足够的 CPU 时间、否则 OOM 现在是预期行为。
[130.758020] RCU:RCU grace-period kthread 堆栈转储:
[130.763066] task:RCU_prept  state:I stack:0    pid:14 tgid:14 PPID:2 task_flags:0x208040     flags:0x00000010
[ 130.774110]呼叫跟踪:
[130.776557]  __SWITCH_TO+0xb8/0xd8 (T)
[ 130.780326] __schedule+0x4bc/0x9c4
[ 130.783822] schedule+0x48/0x12c
[ 130.787056] SCHEDULE_TIMEOUT+0x8c/0x120
[130.790986]  Rcu_gp_fqs_loop+0x150/0x894
[ 130.794918] Rcu_gp_kthread+0x250/0x2d4
[130.798759]  kthread+0x140/0x228
[ 130.801993] ret_from_fork+0x10/0x20
[ 130.805607] CPU:0 UID:0 PID:198 Comm:UART_RECEIVE_FI 未污染 6.18.32 #70 PREEME
[ 130.805618]硬件名称:OurBoard (DT)
[130.805622] pstate:600005 (nZCv daif -pan -uAO -TCO -DIT -SSB BTYPE=--)
[ 130.805629] pc : handle_softirqs+0xe4/0x494
[ 130.805644] lr : handle_softirqs+0xe0/0x494
[130.805654] sp : ffff80008180bf30
[130.805656] x29:ffffff80008180bf30 x28:ffffff800080a63000 x27:ffffff800080bc60c0
[ 130.805666] x26:000000000000 x25:ffffff0000050ca4e0 x24:ffffff0000050ca5f8
[ 130.805675] x23:00000000600005 x22:0000000000000280 x21:ffffff8000800100bc
[130.805684] x20:000000000000 x19:ffffff80008180bf30 x18:00000000ffffff
[130.805693] x17:ffff7fff8f497000 x16:ffffff800081808000 x15:000000000000
[ 130.805702] x14:ffffffffffffffffff X13:0000000e4000 x12:0000000000000000
[130.805711] x11: ffffff800080a63384 x10: ffffff800081443000 x9 : 0000000000c0
[130.805720] x8 : ffffff80008180be58 x7 : ffffff80008180bf40 x6 : ffff80008180bf00
[ 130.805729] x5 : ffff80008180be88 x4 : 000000000005 x3 : 000000000000
[ 130.805737] x2 : 0000000000000001 x1 : ffff800080a63380 x0 : 0000000003b6.
[130.805746] 呼叫跟踪:
[ 130.805748] handle_softirqs+0xe4/0x494 (P)
[ 130.805760] _do_softirq+0x10/0x18
[ 130.805769] ___do_softirq+0xc/0x14
[ 130.805779] CALL_ON_IRQ_STACK+0x30/0x4c
[ 130.805789] Do_softirq_own_stack+0x18/0x20  
[130.805798]  __IRQ_EXIT_RCU+0x160/0x19c
[ 130.805810] IRQ_EXIT_RCU+0xc/0x30
[ 130.805820] el1_interrupt+0x3c/0x58
[ 130.805829] el1h_64_IRQ_HANDLER+0x14/0x1c
[ 130.805838] el1h_64_IRQ+0x6c/0x70
[130.805846]  _RAW_SPIN_UNLOCK_irqrestore+0x34/0x68 (P)
[ 130.805857] __setup_IRQ+0x4e8/0x67c
[ 130.805869] Request_threading_IRQ+0xc4/0x1a0
[ 130.805878] devm_request_threaded_irq+0x7c/0x128
[ 130.805891] pktdma_v2_alloc_chan_resources+0x164/0x338
[ 130.805908] DMA_CHAN_GET+0x84/0xf8
[ 130.805919] find_access+0xa4/0x1b8
[ 130.805930]__DMA_REQUEST_CHANNEL+0x80/0xf8  
[ 130.805941] UDMA_v2_of_xlate+0x8c/0x108
[ 130.805952] of_dma_request_slave_channel+0x17c/0x258
[ 130.805964] DMA_REQUEST_CHAN+0x244/0x298
[ 130.805975] serial8250_Request_DMA+0xb0/0x340
[130.805986]  OMAP-L8250_STARTUP+0xac/0x378
[ 130.805996] serial8250_startup+0x14/0x28
[ 130.806004] UART_STARTUP+0x150/0x428
[ 130.806016] uart_port_activate+0x40/0x8c
[ 130.806027] tty_port_open+0xa8/0x13c
[130.806035]  UART_OPEN + 0x18/0x28
[ 130.806044] tty_open+0x110/0x66c
[ 130.806056] chrDEV_open+0x80/0x1b4  
[ 130.806066] do_dentry_open+0x180/0x43c
[ 130.806076] vfs_open+0x28/0xe0
[ 130.806086] path_openat+0x6dc/0x9e4
[ 130.806099] do_filp_open+0xa4/0x15c
[ 130.806110] do_sys_openat2+0x88/0xf0
[ 130.806119] __arm64_sys_openat+0x60/0xa8
[ 130.806129] invok_syscall.constprop.0+0x48/0xb0
[130.806141]  Do_el0_Svc+0x3c/0xac
[ 130.806150] el0_Svc+0x38/0x1f8
[130.806158]  el0t_64_SYNC_HANDLER+0x98/0xdc
[ 130.806167] el0t_64_sync+0x154/0x158

和系统无法使用。 似乎 UDMA 驱动程序无法干净地拆卸器件。
我们尝试在每次在“drivers/dma/ti/k3-UDMA-v2.c“驱动程序中指示断电时设置强制断电位 (UDMA_CHAN_RT_CTL_FTDOWN)、但这没有帮助。

似乎 UART 驱动程序中缺少了一些东西、它首先在 DMA 模式下停止接收 IRQ、可能还缺少 UDMA 驱动程序中的一些其他内容、以确保对 DMA 通道进行干净复位/刷新。


提前感谢您的帮助!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Fabian:

    该 DMA 尚未针对 AM62L UART 进行验证、因此不受支持。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的。 是否计划在不久的将来支持 AM62L 上的 UART DMA?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Fabian:

    支持 DMA 模式需要在内核 UART 驱动程序中进行特殊开发。 它不是计划在不久的将来。