找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 197|回复: 0

PCIe错误的Firmware first model和OS native model

[复制链接]

18

主题

0

回帖

217

积分

管理员

积分
217
发表于 2025-11-28 21:22:28 | 显示全部楼层 |阅读模式 来自 LAN
            
  • PCIe错误的Firmware first model和OS native model


    • Firmware first model
错误通过SMI中断到CPU,CPU进入SMM mode,并调用BIOS/firmware注册handler,BIOS/firmware先收集故障信息,把错误信息填写到APEI表,然后通过SCI或者NMI通知OS。详细流程可以参考APCI spec。


    • OS native model
错误通过MSI或者NMI方式直接报告给OS。


      • NMI方式上报错误

传统的PCI设备检测到address phase parity error,会assert SERR#,检测到data phase error,会assert PERR#。PERR#和SERR#信号连接到南桥(现在叫PCH)里的error logic。错误发生时,error logic会assert NMI信号通知CPU。

PCH(之前的南桥)内部设备或者PCH下面的设备的错误会触发SERR#,error logic会assert NMI信号,产生NMI中断到CPU,通知OS处理错误。



      • MSI方式上报错误
PCIe设备出现错误时会产生对应的error message,error message路由到Root port,Root Port产生MSI中断到CPU,通知OS处理错误。

  • 选择那种模式呢
Linux PCIEAER service的作者在《Enable PCI Express Advanced Error Reporting in the Kernel》进行了一些说明。
在2.6.18之前的kernel,linux kernel没有root port AER service的驱动。BIOS提供了一些基础的错误机制,但是这种机制不能配合相应设备获取更详细的错误信息,更重要的没有recovery的功能,因此linux kernel引入的AER driver。

至于选择哪种模式,我们来对比一下各种上报机制有什么不同。
2.1 SMI上报错误
如果在日志中发现下面打印,就是使用firmware first model。可以看到对于correctable的错误,只能看到Root port接收到了correct错误,至于是什么错误,哪个设备出错了。新版本的linux对这个流程有优化,会调用PCIeAer service的接口把错误打印出来。具体实现见ghes_proc-> ghes_do_proc-> ghes_handle_aer-> aer_recover_queue->
aer_recover_work_func-> cper_print_aer

至于uncorrectable error会导致系统panic。Linux kernel中具体实现见ghes_proc-> __ghes_panic。


2.1 NMI上报
如果在日志中发现下面打印,就是使用了NMI上报。这个是里面没有任何定位信息,PCH内部PCI设备及其PCH下面的PCIe设备出现错误都有触发该流程。具体实现见default_do_nmi->pci_serr_error。



2.2 MSI上报
如果在日志中发现下面打印,就是使用了MSI上报。具体流程见aer_irq -> aer_isr-> aer_isr_one_error-> aer_process_err_devices-> aer_print_error。



  • 怎么禁止firmware first model
禁止firmware first model涉及到芯片厂商特有的寄存器,每家厂商实现方式不同,这里说一下intel和AMD相关的寄存器。

Intel的架构图和芯片手册比较清楚地说明了miscctrlsts_1和miscctrlsts_0对应bit可以覆盖PCIe标准配置空间的寄存器。miscctrlsts_1的bit3-1清零,防止miscctrlsts_1覆盖了root ctrl reg对应bit。miscctrlsts_0的bit4也需要清零,防止MSI和INTx中断被disable。
至于PCIe标准配置空间的寄存器,只要加载AER service,驱动会使能对应的寄存器。



AMD是没有架构框图说明哪些寄存器可以禁止firmware first model,经过试验发现下面的寄存器清零可以禁止firmware first model。
IOHCRASx0000017C (IOHC:CIE0PortASerr_ACTION_CONTROL)
到IOHCRASx00000378 (IOHC:CIE1PortHParityErr_ACTION_CONTROL)清零






            

        

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|PCIe技术圈-专注PCIe技术的中文社区 ( 皖ICP备17021150号-5 )|网站地图

GMT+8, 2025-12-30 22:05 , Processed in 0.038817 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表