Other Parts Discussed in Thread: AM3359
大家好
我们有一个使用 AM3359 SoC 和在该硬件上运行的 Linux 的定制板。
在该系统中、我们遇到了 DMTimer 2问题。 问题不经常发生,有时需要数天、数周甚至数月才能重现,但会定期发生。 我们的系统应该全天候运行、因此我们正因为这个问题而失去客户。
在对不同的补丁进行长时间的调查和测试后、我们认为现在我们已详细了解发生的情况、它看起来像是 AM3359 SoC 内部的芯片内部同步问题。
定时器以单次触发模式运行。 为了启动一个单次触发周期、软件首先向 TCRR 寄存器写入一个变量值、然后置位 TCLR 寄存器中的 ST 位来启动定时器。 当定时器溢出时、它会生成一个中断并自行停止。 之后、单次循环再次开始。
我们引入了一个补丁(详细信息见下文)、在软件写入 ST 位后立即回读 TCLR 寄存器、当我们的问题发生时、该位不会置位!! 由于计时器未启动、因此不会有中断且计时器完全停止。 我们可以通过手动设置 TCLR 寄存器中的 ST 位从这种错误情况中恢复。
在这种错误情况下、我们能够捕获寄存器值:
0x0 TIDR 标识寄存器 :1342116609
0x10 TIOCP_CFG 定时器 OCP 配置 :12.
0x20 IRQ_EOI 定时器 IRQ 中断结束 :0
0x24 IRQSTATUS_RAW 定时器状态原始 值:0
0x28 IRQSTATUS 定时器状态 :0
0x2C IRQENABLE_SET 定时器中断使能集 :2.
0x30 IRQENABLE_CLR 定时器中断使能清除 :2.
0x34 IRQWAKEEN 定时器 IRQ 唤醒使能 :2.
0x38 TCLR 定时器控制 :0
0x3C TCRR 定时器计数 器:4294852622
0x40 TLDR 定时器装载 :4294727296
0x44 TTGR 定时器触发 器:4294967295
0x48 TWPS 定时器写过帐位 :0
0x4C TMAR 计时器匹配 :0
0x50 TCAR1 定时器捕捉 :0
0x54 TSICR 定时器同步接口控制 :4.
0x58 TCAR2 定时器捕捉 :0
TRM 和勘误表中有几条关于 DMTimer 和 OCP 接口之间同步问题的注释、但没有一条注释说明我们观察到的情况。
由于我们正在使用布置的同步模式、软件在对定时器寄存器进行写入或读取访问之前确实会检查 TWPS 寄存器位。
这是我们用于调试的补丁:
主题:[PATCH]在写入后读回计时器启动标志
--
arch/arm/plat-omap/include/plat/dmtimer.h | 5 ++++
1个文件已更改、5个插入(+)
diff --git a/arch/arm/plat-omap/include/plat/dmtimer.h b/arch/arm/plat-omap/include/plat/dmtimer.h
索引 dd79f30.b021558 100644
--- a/arch/arm/plat-omap/include/plat/dmtimer.h
++ b/arch/arm/plat-omap/include/plat/dmtimer.h
@@-392、8 +392、13 @@静态内联 void __omap_dm_timer_load_start (struct omap_dm_timer *计时器,
u32 ctrl、unsigned int load、
内部已过帐)
{
+u32 ctrl_reg =0;
_omap_dm_timer_write (timer、omap_timer_counter_REG、load、布置);
_omap_dm_timer_write (timer、omap_timer_CTRL_REG、Ctrl、布置);
+
+ CTRL_reg =__omap_dm_timer_read (timer、omap_timer_CTRL_REG、已发布);
+ WARN ((!(Ctrl_reg & OMAP_TIMER_CTRL_ST))&&(Ctrl & OMAP_TIMER_CTRL_ST)&&(timer->id == 2)、
+ "_omap_dm_timer_load_start():计时器2未启动!!!\nload=0x%x;ctrl=0x%x;ctrl_reg=0x%x、发布=0x%x\n"、加载、 ctrl、ctrl_reg、布置);
}
静态内联 void __omap_dm_timer_int_enable (struct omap_dm_timer *计时器,
--
当错误发生时、该补丁会生成以下输出:
[361249.217197]警告:CPU:0 PID:4411、位于/Jenkins_data/wim-build-release/skyocto_build/tm/jork-shared/skyboard-evB/kernel-source/arch/arm/plat-omap/include/plat/dmtimer.h:OMAP2_gp_timer_0x403_next 0x4cb_event_set_event_event_set
[361249.217205]_omap_dm_timer_load_start ():计时器2未启动!!
[361249.217205] load=0xffffff400e;ctrl=0x1;ctrl_reg=0x0、布置=0x1
[361249.217209]链接的模块:skyboard_asyncevent (O) skyboard_FPGA (O) uio jiffies (O) ti_am335x_adc kfifo_buf industrialio spidev rtc_ds1307 ti_am335x_tscadc
[361249.217253] CPU:0 PID:4411 Comm:Pidof 被污染:G W O 4.10.17-Yocto 标准#1
[361249.217257]硬件名称:通用 AM33XX (平展器件树)
[361249.217289][ ](展开回扫)从[ ](show_stack+0x20/0x24)
[361249.217305][ ](show_stack)从[ ](dump_stack+0x20/0x28)
[361249.217323][ ](dump_stack)从[ ](_WARN+0xe0/0x10c)
[361249.217337] ](__warn)从[ ](WARN_RASPH_FMt+0x48/0x50)
[361249.217349][ ](warn_slowpath_fmt)、来自[ ](OMAP2_gp_timer_set_next _event+b0xcc)
[361249.217371][ ](OMAP2_gp_timer_set_next 事件)、来自[ ](clockevents_program_event+0x12c/0x160)
[361249.217387] ](clockevents_program_event)从[ ](tick_program_event+0x88/0x94)
[361249.217406][ ](tick_program_event)从[ ](hrtimer_interrupt+0xa4/0x188)
[361249.217420][ ](hrtimer_interrupt)、来自[ ](OMAP2_gp_timer_interrupt+0x30/0x40)
[361249.217434][ ](OMAP2_gp_timer_interrupt)、来自[ ](__Handle_IRQ_EVENT_perpu + 0x88/0x1b4)
[361249.217446][ ](_handle_irq_event_perpu)、来自[ ](handle_irq_event_perpu + 0x2C/0x68)
[361249.217457][ ](handle_irq_event_perpu)、来自[ ](handle_IRQ_EVENT_+0x38/0x4c)
[361249.217472][ ](handle_irq_event)从[ ](handle_level_IRQ+0xd0/0x104)
[361249.217496][ ](handle_level_IRQ)、来自[ ](generic_handle_IRQ+0x28/0x38)
[361249.217512][ ](generic_handle_IRQ)、来自[ ](_handle_domain_IRQ+0x90/0xb0)
[361249.217527][ ](_handle_domain_IRQ)、来自[ ](OMAP-INTC_Handle_IRQ+0x88/0xa0)
[361249.217545][ ](OMAP-INTC_Handle_IRQ)、来自[ ](_IRQ_Svc+0x6c/0x90)
[361249.217552]异常堆栈(0xcdf29ed0至0xcdf29f18)
[361249.217561] 9ec0: ccaaf840 00000000 ccaaf840 c023f3a0
[361249.217573] 9ee0:ccaaf840 cd50e890 cddd91190 cd501b28 c01080e8 cdf28000 00000000 cdf29f5c
[361249.217583] 9f00:cdf29f60 cdf29f20 c023f194 c0684554 a0030013 ffff
[361249.217608][ ](_IRQ_Svc)从[ ](_COND_RESPGE+0x0/0x50)
[361249.217626][ ](_COND_RESched)从[ ](___fput + 0x18/0x1c)
[361249.217646][ ](___fput)、来自[ ](Task_Work_run+0x88/0x9C)
[361249.217671][ ](task_work 运行)从[ ](do_work 挂起+b4 /0xd0)
[361249.217684][ ](Do_Work_Pending)、来自[ ](SLOW_work 挂起+ 0xc/0x20)
[361249.217692]--[结束线迹9a96982c011d5553]