主题:TPS65219 中讨论的其他器件
工具/软件:
尊敬的 Dear Expert:
当前的 SDK 版本为 Processor SDK 10.00.07.04。 此问题在 25 摄氏度下是正常现象。
转储堆栈消息:
[15166.525026]无法处理虚拟地址 ffff0080010fd828 的内核分页请求
[15166.533093]存储器中止信息:
[15166.535958] ESR = 0x0000000096000004
[15166.539773] EC = 0x25:DABT(电流 EL)、IL = 32 位
[15166.539787] SET = 0、FnV = 0
[15166.539792] EA = 0、S1PTW = 0
[15166.539796] FSC = 0x04:电平 0 转换故障
[15166.539801]数据中止信息:
[15166.539804] ISV = 0、ISS = 0x00000004、ISS2 = 0x00000000
[15166.539810] CM = 0、WNR = 0、TND = 0、TagAccess = 0
[15166.539815] GCS = 0、Overlay = 0、DirtyBit = 0、Xs = 0
[15166.539821]交换器 pgtable:4K 页、48 位 vas、pgdp=0000000082c43000
[15166.539836][ffff0080010fd828] PgD=000000000000、p4d=0000000000000000
[15166.539852]内部错误:oops: 0000000096000004 [#1] PREEME SMP
[15166.539860]链接的模块:iptable_filter iptable_nat xt_masquerade nf_sat nf_defrag_ipv6 nf_defrag_ipv4 libcrc32c ip_tables rpmsg_ctrpmsg_char rpmsg_char
[15166.594699] CPU:0 PID:1133 Comm:rx_thread tainted:g O 6.6.32-ti #1
[15166.594716]硬件名称:Texas Instruments AM62x LP SK (DT)
[15166.594722] pstate:800005 (Nzcv daif -pan -uAO -TCO -DIT -SSB BTYPE=--)
[15166.594732] PC : am65_cpsw_Nuss_rx_poll+0x164/0x994
[15166.594763] lr : am65_cpsw_Nuss_rx_poll+0x160/0x994
[15166.594774] sp : ffff800080003da0
[15166.594778] x29:ffffff800080003e30 x28:ffff00000b40ee00 x27:ffffff0080010fd800
[15166.659437] x26:ffff00000042e4c0 x25:000000000040 x24:ffffff0000007f7000
[15166.666575] x23:ff000001186080 x22:000000000000 x21:0000000000000027
[15166.680824] x20:ffff0000011875c8 x19:ffffff0000006b7810 x18:000000000036
[15166.680839] x17:ffff7fff9b1af000 x16:ffffff800080000000 x15:472fdd4e168924bf
[15166.687971] x14:c1cb1a37c6bd6673 x13:0000497b00021850:00000000000000000006
[15166.687984] x11:000000000000d780 x10:ffffff0000034207d8 x9:ffff0000091ff10e.
[15166.709348] x8 : ffff800080003e28 x7 : 007a0080810fd800 x6 : 007a0080810fd800
[15166.716483] x5 : ffff800080003de8 x4 : 00000000000001f4 x3 : 00000000006a.
[15166.723616] x2 : 00000000817a0000 x1 : 0000007fff95d800 x0 : ffff0080010fd800
[15166.730755]呼叫跟踪:
[15166.730762] am65_cpsw_Nuss_rx_poll+0x164/0x994
[15166.730778]_NAPI_POLL+0x38/0x178
[15166.741211] net_rx_action+0x128/0x270
[15166.744958]__do_softirq+0x100/0x26c
[15166.748618]___do_softirq+0x10/0x1c
[15166.752278] CALL_ON_IRQ_STACK+0x24/0x4c
[15166.756198] do_softirq_own_stack+0x1c/0x2C
[15166.760378] Do_softirq+0x54/0x6c
[15166.763692]__LOCAL_BH_ENABLE_IP+0x8c/0x98
[15166.767873] netiF_rx+0x6c/0x80
[15166.767888] kalRxIndicateOnePkt+0x120/0x3cc [WLAN_mt7961_SDIO]
[15166.776960] rx_thread+0x138/0x2c8 [WLAN_mt7961_SDIO]
[15166.782320] kthread+0x110/0x114
[15166.7855555] ret_from_fork+0x10/0x20
[15166.789139]代码:d65f03c0 f9400a80 97ffec46 aa0003fb (f9401405)
[15166.795228]--[结束跟踪 000000000000 ]-----
[156.81627532] pstore:后端 (ramoops) 写入错误(–28)
[15166.832962]内核紧急 — 未同步: oops:中断中的致命异常
[15166.839832] SMP:停止辅助 CPU
[15166.843760]内核偏移:已禁用
[15166.847242] CPU 特性:0x000000008,00020000,1000420b</s>008,000 20,000,100
[15166.852549]内存限制:无
[15166.883272]--[结束内核恐慌 — 未同步: oops:中断中的致命异常]---
a.从崩溃日志中查看的异常指令如下 (ti-am65-cpsw-nuss.S、k3-cppi-desc-polo.S)
k3-cppi-desc-pool.S:
16 00000000001c :
17 1c:b40000a1 CBZ x1、30
18 20:a9408002 LDP x2、x0、[x0、#8]
19 24:cb020021 sub x1、x1、x2
20 28:8b010000 添加 x0、x0、x1
21 2c:d65f03c0 ret
TI-am65-cpsw-Nuss.S:
1580593 ffffff8000805dde64: 97ffec46 BL ffff8000805d8f7c
1580594 ffffff8000805dde68: aa0003fb mov X27、x0
1580595 ffffff8000805dde6c: f9401405 LDR x5、[x0、#40]
B、对应于 C 代码问题、请参阅 include/linux/dma/ti-cppi5.h:中的第 2914 行
488 静态内联 void cppi5_hdesc_get_obuf (struct cppi5_host_desc_t *desc、
489 dma_addr_t *obuf、u32 *obuf_len)
490{
491 *obuf = desc->org_buf_ptr;
492 *obuf_len = desc->org_buf_len & CPPI5_OBUFINFO0_HDESC_BUF_LEN_mask;
493 }
c.调用栈:
static int am65_cpsw_Nuss_rx_poll (struct napi_struct *napi_rx、int budget)
--> static int am65_cpsw_nuss_rx_packets(结构 am65_cpsw_common*通用、
----- > RET = K3_UDMA_GLUE_POP_Rx_CHn (rx_CHn->rx_CHn、flow_idx、&desc_dma);
----- > desc_rx = k3_cppi_desc_pool_dma2virt (rx_chn->desc_pool、desc_dma);
----- > void * k3_cppi_desc_pool_dma2virt (struct k3_cppi_desc_pool *pool、dma_addr_t dma)
返回 DMA? pool->cpumem +(dma - pool->dma_addr):NULL;
DMA = 80810FD800、 pool->DMA_addr = 00000000817a0000
X1 = X1 - X2
0000007fff95d800 = 80810FD800 - 00000000817a0000
x0 = X0 + X1
ffffff0080010fd800 = FFFF0000017A0000 + 0000007fff95d800
----- > cppi5_hdesc_get_obuf (desc_rx、&buf_dma、&buf_dma_len);
从上面的分析可以看出、 DMA 太大、导致访问 pool->cpumem 指针的次数超出限制。
d.更多日志请参见附件。