看门狗监控方案
==================

HardLockup监控
------------------
J6X HardLockup监控基于Watchdog模块实现，使用Watchdog
1配置成窗口模式，在驱动中实现监控逻辑。当系统正常运行时监控逻辑如下图：

.. image:: ./media/image2.png
   :align: center
   :alt:

1. 初始化Watchdog硬件。

2. 开始Watchdog定时。

3. 当第一次Timeout到来时产生一个中断，Watchdog重新开始计数，某个core响应中断后给其它core发送IPI，记录一张此时在线的CPU位图，每当一个core收到IPI中断或者下线时，会将位图对应的bit清除，当整个位图为empty时，说明本次监控任务完成，则允许喂狗。

4. 喂狗后，Watchdog重新开始下一个周期的计数。

当有core出现响应IRQ的异常情况时的工作流程如下图：

.. image:: ./media/image3.png
   :align: center
   :alt:

1. 初始化Watchdog硬件。

2. 开始Watchdog定时。

3. 当第一次Timeout到来产生一个中断，Watchdog重新开始计数，某个core响应中断后给其它core发送IPI，若cpu位图不为empty，说明有core无法正常响应IRQ中断，不允许喂狗。

4. Watchdog计数器继续递减，当第二次Timeout到来产生两个中断，一个中断发送到Acore的GIC中断，在中断中进行打栈，另一个为FCHM中断发送至MCU，由MCU控制重启。

SoftLockup监控
------------------
J6X SoftLockup监控基于Watchdog模块实现，使用Watchdog
2配置成窗口模式，在驱动中实现监控逻辑，整体监控思路与HardLockup监控一致。

1. 初始化Watchdog硬件。

2. 初始化Per-CPU的watchdog监控kthread线程，即每个CPU上都跑一个watchdog监控kthread线程。

3. 开始Watchdog定时。

4. 当第一次Timeout到来产生一个中断，Watchdog重新开始计数，某个core响应中断后将置起一个标志位，跑在其上的Watchdog监控kthread线程检测到标志位置起后中将自己对应的CPU位图中的bit清零，并给其它core发送IPI，让其他核执行相同的逻辑，记录一张此时在线的CPU位图，每当一个核收到IPI执行该逻辑或者下线时，会将位图对应的bit清除，当整个位图为empty时，说明本次监控任务完成，则允许喂狗。

5. 若在第二次Timeout之前cpu位图仍不为empty，则当第二次Timeout到来产生两个中断，一个中断发送到Acore的GIC中断，在中断中进行打栈，另一个为FCHM中断发送至MCU，由MCU控制重启。
