Latar belakang
Saya memiliki sistem ZynqMP yang memiliki empat core Cortex-A53 (PS) bersama dengan logika FPGA (PL). Mereka mentransfer data melalui bus AXI.
Saya telah menempatkan beberapa Xilinx AXI Quad SPI dalam desain saya. Linux yang berjalan pada PS berhasil menyelidikinya, dan memulai daemon yang secara berkala (333 Hz) meminta MCU pada SPI untuk membalas potongan datanya (~ hingga sekitar 500 byte, dibagi setiap 64 byte.)
Mereka berfungsi dengan baik untuk sementara waktu (median 50 menit) tetapi tiba-tiba readl_relaxed() di driver SPI menyebabkan Pembatalan Eksternal Sinkron yang menyebabkan Kepanikan Kernel. Tampaknya ini adalah balasan kesalahan AXI menurut ARM TRM, dan mungkin dapat dipulihkan karena "sinkron" yang berarti register tidak rusak (menurut pemahaman saya.)
Setelah beberapa pencarian saya menemukan do_sea( ) fungsi yang menangani KLHS dan juga menemukan bahwa tidak ada peluang untuk pulih sesuai dengan implementasinya.
Saya ingin kesalahan AXI ditangani seperti: membuang pembacaan, mengembalikan SIGBUS dan mematikan proses, dll.
Tentu saja saya sedang men-debug Pembatalan dan mencari tahu mengapa hal itu terjadi tetapi saat ini saya tidak tahu.
Pertanyaan
Jadi pertanyaan saya adalah:
- Mengapa SEA tidak dapat dipulihkan dalam implementasi Linux arm64?
- Jika saya bisa "menangani" atau "mengabaikannya", bagaimana cara memodifikasi kode kernel Linux (Saya tahu ini bodoh tapi saya ingin tahu apakah ada caranya.)
- Apa yang bisa membalas error di Quad SPI IP? Readl_relaxed yang saya sebutkan di atas membaca data Rx FIFO.