Фон
У меня есть система ZynqMP с четырьмя ядрами Cortex-A53 (PS) и логикой FPGA (PL). Они передают данные по шине AXI.
Я разместил в своем проекте несколько Xilinx AXI Quad SPI. Linux, который работает на PS, успешно проверяет их и запускает демонов, которые периодически (333 Гц) запрашивают MCU на SPI для ответа на их блок данных (примерно до 500 байт, разделенный на каждые 64 байта).
Некоторое время они прекрасно работают (в среднем 50 минут), но вдруг readl_relaxed() в драйвере SPI вызывает синхронное внешнее прерывание, которое приводит к панике ядра. Похоже, это ответ об ошибке AXI в соответствии с ARM TRM., и его можно восстановить, потому что он "синхронный", что означает, что регистры не повреждены (в моем понимании).
После некоторого поиска я нашел do_sea( ), которая обрабатывает SEA, и также обнаружила, что в соответствии с реализацией нет возможности восстановиться после него.
Я хочу, чтобы ошибка AXI обрабатывалась следующим образом: отбросить чтение, вернуть SIGBUS и привести к уничтожению процесса и т. д.
Конечно, я отлаживаю Abort и выясняю, почему это происходит, но в настоящее время я понятия не имею.
Вопрос
Итак, мои вопросы:
- Почему SEA не восстанавливаются в реализации Linux arm64?
- Если я могу «обработать» или «игнорировать» это, как мне изменить код ядра Linux (я знаю, что это глупо, но я хотел бы знать, есть ли способ).
- Что может ответить на ошибку в Quad SPI IP? Упомянутый выше readl_relaxed считывает данные Rx FIFO.