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