พื้นหลัง
ฉันมีระบบ ZynqMP ซึ่งมี Cortex-A53 คอร์ (PS) สี่คอร์พร้อมกับตรรกะ FPGA (PL) พวกเขาถ่ายโอนข้อมูลผ่าน AXI บัส
ฉันได้วาง Xilinx AXI Quad SPI ไว้ในการออกแบบของฉัน Linux ที่ทำงานบน PS สามารถตรวจสอบพวกมันได้สำเร็จ และสตาร์ท daemons ซึ่งขอให้ MCU บน SPI ตอบกลับก้อนข้อมูลเป็นระยะ (~ สูงสุดประมาณ 500 ไบต์ โดยแบ่งออกเป็นทุกๆ 64 ไบต์)
มันทำงานได้ดีสักพัก (ค่ามัธยฐาน 50 นาที) แต่ทันใดนั้น readl_relaxed() ในไดรเวอร์ SPI ทำให้เกิด Synchronous External Abort ซึ่งทำให้เกิด Kernel Panic ดูเหมือนว่าจะเป็นการตอบกลับข้อผิดพลาดของ AXI ตาม ARM TRM และอาจกู้คืนได้เนื่องจากเป็นแบบ "ซิงโครนัส" ซึ่งหมายความว่าการลงทะเบียนไม่เสียหาย (ในความเข้าใจของฉัน)
หลังจากการค้นหาบางอย่าง ฉันพบ do_sea( ) func ที่จัดการ SEA และยังพบว่าไม่มีโอกาสที่จะฟื้นตัวตามการใช้งาน
ฉันต้องการให้จัดการข้อผิดพลาดของ AXI เช่น: ละทิ้งการอ่าน, ส่งคืน SIGBUS และนำไปสู่กระบวนการที่ถูกฆ่า ฯลฯ
แน่นอนว่าฉันกำลังแก้ไขข้อบกพร่องของ Abort และค้นหาสาเหตุว่าทำไมมันถึงเกิดขึ้น แต่ปัจจุบันฉันยังไม่มีเบาะแส
คำถาม
ดังนั้นคำถามของฉันคือ:
- เหตุใด SEA จึงไม่สามารถกู้คืนได้ในการใช้งาน Linux arm64
- หากฉันสามารถ "จัดการ" หรือ "เพิกเฉย" ได้ ฉันจะแก้ไขโค้ดเคอร์เนล Linux ได้อย่างไร (ฉันรู้ว่ามันโง่ แต่ฉันอยากรู้ว่ามีวิธีใดบ้าง)
- ข้อผิดพลาดในการตอบกลับใน Quad SPI IP สามารถทำอะไรได้บ้าง readl_relaxed ที่ฉันกล่าวถึงข้างต้นอ่าน Rx data FIFO