【74】PCIe错误的Firmware first model和OS native model

之前写过一篇怎么禁止Firmware first model的文章,感觉内容组织得有点混乱,本来想删了重新,看到有人收藏了,索性新写一篇吧。

  1. PCIe错误的Firmware first model和OS native model

【74】PCIe错误的Firmware first model和OS native model

    1. Firmware first model

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

【74】PCIe错误的Firmware first model和OS native model

    1. OS native model

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

      1. NMI方式上报错误

【74】PCIe错误的Firmware first model和OS native model

对应传统的PCI设备检测到address phase parity error,会assert SERR#,检测到data phase error,会assert PERR#。PERR#和SERR#信号连接到南桥里的error logic,error logic会assert NMI信号。

【74】PCIe错误的Firmware first model和OS native model

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

【74】PCIe错误的Firmware first model和OS native model

 

      1. MSI方式上报错误

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

【74】PCIe错误的Firmware first model和OS native model

  1. 选择那种模式呢

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。

【74】PCIe错误的Firmware first model和OS native model

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

【74】PCIe错误的Firmware first model和OS native model

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

【74】PCIe错误的Firmware first model和OS native model

【74】PCIe错误的Firmware first model和OS native model

2.1 NMI上报

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

【74】PCIe错误的Firmware first model和OS native model

【74】PCIe错误的Firmware first model和OS native model

【74】PCIe错误的Firmware first model和OS native model

2.2 MSI上报

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

【74】PCIe错误的Firmware first model和OS native model

【74】PCIe错误的Firmware first model和OS native model

【74】PCIe错误的Firmware first model和OS native model

 

  1. 怎么禁止firmware first model

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

【74】PCIe错误的Firmware first model和OS native model

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,驱动会使能的。

【74】PCIe错误的Firmware first model和OS native model

【74】PCIe错误的Firmware first model和OS native model

【74】PCIe错误的Firmware first model和OS native model

AMD是没有架构框图说明哪些寄存器可以禁止firmware first model,试验发现下面的寄存器清零可以禁止firmware first model。

IOHCRASx0000017C (IOHC::PCIE0PortASerr_ACTION_CONTROL)

到IOHCRASx00000378 (IOHC::PCIE1PortHParityErr_ACTION_CONTROL)清零

【74】PCIe错误的Firmware first model和OS native model

上一篇:js-- es6 新增 Set 和 Map ( WeakSet 和 WeakMap) 相关知识点总结


下一篇:微信打开网页不能下载的解决