AXI事务回复错误时,解除或处理数据中止



背景

我有一个ZynqMP系统,它有四个Cortex-A53内核(PS(和FPGA逻辑(PL(。它们通过AXI总线传输数据。

我在设计中放置了一些Xilinx AXI Quad SPI。在PS上运行的Linux成功地探测到了它们,并启动了一个守护进程,该守护进程周期性地(333 Hz(要求SPI上的MCU回复它们的数据块(大约500字节,每64字节分割一次。(

它们在一段时间内运行良好(平均50分钟(,但SPI驱动程序中的readl_related((突然导致同步外部中止,从而导致内核恐慌。根据ARM TRM,这似乎是AXI的错误回复,并且可能是可恢复的,因为它是"同步的",这意味着寄存器没有损坏(在我的理解中(

经过一番搜索,我找到了处理sea的do_sea((函数,还发现根据实现情况,没有机会从中恢复。

我希望AXI错误的处理方式如下:丢弃读取,返回SIGBUS并导致进程终止,等等。

当然,我正在调试Abort并找出它发生的原因,但目前我还不知道。

问题

所以我的问题是:

  1. 为什么SEA在Linux arm64实现中不可恢复
  2. 如果我可以"处理"或"忽略"它,我该如何修改Linux内核代码(我知道这很愚蠢,但我想知道是否有办法。(
  3. 什么可以在Quad SPI IP中回复错误?上面提到的readl_related读取Rx数据FIFO

1(我从未冒险走上这条路,但在我看来,如果inf->fn返回0,它们是可以恢复的;这意味着ghes_notify_sea((必须返回0;因此SEA错误源中的一个成功地报告了错误。

2( 我想你需要更多的信息。我会从改变开始drivers/acpi/apei/ghes.c:732

from:
rc = ghes_read_estatus(ghes, 0);
to:
rc = ghes_read_estatus(ghes, 1);

当错误发生时,它会为您提供更多信息。有了这些信息,你需要找出你是否有一个故障的处理程序,或者一个丢失的处理程序。无论哪种方式,这都是解决问题的地方。

3( 您正在处理ACPI的实施。内核中有155个kloc,固件和硬件中有未知数量。内核代码似乎无法处理您遇到的任何情况。首先,你需要确定这些嫌疑人中的哪一个参与其中,以及哪些互动失败,然后才能找出根本原因。

挖掘快乐!

最新更新