本文翻译自内核文档:linux\Documentation\PCI\pcieaer-howto.txt

《 PCI Express高级错误报告驱动程序指南》 HOWTO

T.Long Nguyen <tom.l.nguyen@intel.com>

张衍民<yanmin.zhang@intel.com>

2006年7月29日

目录

1.概述

1.1关于本指南

1.2版权所有(C)英特尔公司2006。

1.3什么是PCI Express AER驱动程序?

2.用户指南

2.1将PCI Express AER根驱动程序包含到Linux内核中

2.2加载PCI Express AER根驱动程序

2.3 AER错误输出

3.开发人员指南

3.1配置AER capability structure

3.2 提供回调

3.2.1回调reset_link用于重置PCI Express链接

3.2.2 PCI错误恢复回调

3.3 助手功能

3.3.1 int pci_enable_pcie_error_reporting(struct pci_dev * dev);

3.3.2 int pci_disable_pcie_error_reporting(struct pci_dev * dev);

3.3.3 int pci_cleanup_aer_uncorrect_error_status(struct pci_dev * dev);

3.4常见问题

4.软件错误注入


1.概述

1.1关于本指南

本指南介绍了PCI Express Advanced错误的基础知识。

介绍报告(AER)的驱动程序,并提供有关如何使用它的信息,例如如何启动端点设备的驱动使其适用于PCI Express AER驱动程序。

1.2版权所有(C)英特尔公司2006。

1.3什么是PCI Express AER驱动程序?

PCI Express错误信号可能会在PCI Express链接本身上发生或链路上产生了某些指示错误的传输事务。

PCI Express定义了两个错误报告范例:基准capability和高级错误报告功能(AER capability)。基准能力是

所有PCI Express组件必选的,提供最低要求的一组错误报告。

高级错误报告(AER)可实现基准功能的扩展,提供了更强大的错误报告能力。

内核的PCI Express AER驱动程序提供了支持AER功能的基础软件架构。

PCI Express AER驱动程序提供以下三个基本功能

  • 如果发生错误,则收集全面的错误信息。
  • 向用户报告错误。
  • 执行错误恢复操作。

注意:AER驱动程序仅支持PCI-Express AER的根(RC)端口。

2.用户指南

2.1将PCI Express AER根驱动程序包含到Linux内核中

PCI Express AER根驱动程序是根端口驱动程序的一部分。如果用户想使用它,这部分驱动编译进内核。

选项CONFIG_PCIEAER支持此功能。它依赖于CONFIG_PCIEPORTBUS,所以请设置CONFIG_PCIEPORTBUS = y并

CONFIG_PCIEAER = y。

2.2加载PCI Express AER根驱动程序

某些系统在firmware中已经包含了对AER支持。同时启用Linux AER支持,可能会导致firmware处理AER的同时,产生不可预测的

行为。因此,除非固件通过ACPI _OSC方法将AER控制权授予OS,否则Linux不会处理AER事件。

参见PCI FW 3.0有关_OSC使用情况的详细信息规范。

2.3 AER错误输出

当捕获到PCIe AER错误时,错误消息将输出到console。

如果是可纠正的错误,则将其作为警告输出(warning)。

否则,将其打印为错误(error)。因此用户可以选择不同的日志级别以过滤出可纠正的错误消息。

下面显示了一个示例:

0000:50:00.0: PCIe Bus Error: severity=Uncorrected (Fatal), type=Transaction Layer, id=0500(Requester ID)
0000:50:00.0:   device [8086:0329] error status/mask=00100000/00000000
0000:50:00.0:    [20] Unsupported Request    (First)
0000:50:00.0:   TLP Header: 04000001 00200a03 05010000 00050100

在示例中,“RequesterID”是指发送信息到根端口的设备的ID。请请参阅PCI Express specs其他领域。

3.开发人员指南

要启用AER感知支持,需要使用软件驱动程序对AER capability structure进行配置并提供回调接口。

为了更好地支持AER,首先,开发人员需要了解AER的工作原理。

PCI Express错误分为两种类型:可纠正的错误不可纠正的错误

此分类的依据是基于这些错误中,是否会导致性能或功能下降。

可纠正的错误不会对功能接口造成影响。 PCI Express协议无需任何软件干预即可恢复,且不会有任何数据丢失。

完全由硬件检测到并纠正这些错误。与可纠正错误不同,不可纠正错误影响接口的功能。

无法纠正的错误可能导致特定的事务或链接变得不可靠。

根据这些错误情况,无法纠正错误进一步分为非致命错误致命错误

非致命错误会导致某些事务不可靠,但是PCI Express链接本身可以正常使用。

致命错误会导致链接不可靠。

启用AER后,PCI Express设备检测到错误产生后将把错误消息自动发送到其上方的PCIe根端口。

一根端口,在收到错误报告消息后,内部处理错误消息。并将其记录在其PCI Express capability中。

记录的错误信息包括:存储错误报告的请求者ID,并设置相应的根节点错误寄存器位。

如果在根端口的错误命令寄存器中启用了AER错误报告,当错误被检测到后会产生一个中断请求。

请注意,上述错误与PCI Express 架构和连接有关。

这些错误不包括任何特定于设备的错误,因为特定于设备的错误仍将直接发送到设备驱动程序。

3.1配置AER capability structure

PCI Express组件的AER感知驱动程序需要配置设备控制寄存器以启用AER支持。

驱动程序也会配置AER的capability 寄存器,包括掩码(mask)和严重性(severity)寄存器。

函数pci_enable_pcie_error_reporting可用于启用AER。具体参见第3.3节。

3.2 提供回调

3.2.1回调reset_link用于重置PCI Express链接

在发生致命错误的情况下,此回调用于重置pci express物理链接:

根端口aer服务驱动程序提供了一个默认的reset_link函数,但不同的RC控制器可能有不同的方式来重置PCI Express链接,因此所有上游端口应提供自己的reset_link函数。

在struct pcie_port_service_driver中,新的指针reset_link已经被添加(控制器驱动程序需要对其赋值)。

pci_ers_result_t(* reset_link)(struct pci_dev * dev);

第3.2.2.2节提供了有关reset_link何时被调用的更多详细信息。

3.2.2 PCI错误恢复回调

执行错误恢复操作时,PCI Express AER根驱动程序使用错误恢复回调对下游设备驱动程序进行协调。

数据结构pci_driver具有指向err_handler的指针

pci_error_handlers由几个回调函数组成的。

AER驱动程序遵循定义在pci-error-recovery.txt中的规则要求,除了pcie特定的部分(例如reset_link)。

详细信息,请参考pci-error-recovery.txt对回调的定义。

以下各节介绍何时调用错误回调函数。

3.2.2.1可纠正的错误

可纠正的错误不会对功能接口造成影响。 PCI Express协议无需任何软件干预即可恢复,且不会有任何数据丢失

这些错误不需要任何恢复操作。 AER驱动程序会清除设备的可纠正的错误状态,并相应地注册并记录这些错误。

3.2.2.2不可纠正(非致命和致命)错误

如果错误消息指示非致命错误,上游端口是不需要执行link reset的。

AER驱动程序会调用error_detected(dev,pci_channel_io_normal)到层次结构中关联的所有有问题的驱动程序。

例如,

端点<==>下游端口B <==>上游端口A <==>根端口。

如果上游端口A捕获AER错误,则层次结构包括下游端口B和EndPoint。

驱动程序可能会返回PCI_ERS_RESULT_CAN_RECOVER,

PCI_ERS_RESULT_DISCONNECT或PCI_ERS_RESULT_NEED_RESET,

具体取决于是否可以恢复还是AER​​驱动程序接下来调用mmio_enabled。

如果错误消息指示致命错误,则内核将广播error_detected(dev,pci_channel_io_frozen)到系统中所有有问题的驱动程序。

然后,在上游执行link reset是有必要的。由于不同类型的设备可能会使用不同的函数实现来重置链接,需要AER端口服务驱动程序提供重置链接的函数接口。首先,内核寻找上游组件具有aer的驱动程序。如果有,内核使用aer驱动程序的reset_link回调。

如果上游组件没有aer驱动程序并且该端口是下游端口,我们通过设置桥接器控制的次级总线复位位来将执行hot reset。

至于上游端口,他们应该使用自己的aer服务驱动程序提供reset_link函数。

如果error_detected返回PCI_ERS_RESULT_CAN_RECOVER和reset_link返回PCI_ERS_RESULT_RECOVERED,错误处理

将启用mmio_enabled。

3.3 助手功能

3.3.1 int pci_enable_pcie_error_reporting(struct pci_dev * dev);

pci_enable_pcie_error_reporting使设备能够发送错误

检测到错误时将消息发送到根端口。注意设备(ep device)默认情况下不启用错误报告,因此设备驱动程序需要

调用此功能将其启用。

3.3.2 int pci_disable_pcie_error_reporting(struct pci_dev * dev);

pci_disable_pcie_error_reporting禁止设备发送错误

检测到错误时将消息发送到根端口。

3.3.3 int pci_cleanup_aer_uncorrect_error_status(struct pci_dev * dev);

pci_cleanup_aer_uncorrect_error_status 清除无法纠正的错误状态寄存器。

3.4常见问题

问:如果PCI Express设备驱动程序不提供错误恢复处理程序(pci_driver-> err_handler等于NULL)会怎么样?

答:驱动程序附带的设备将无法恢复。如果错误是致命的,内核将打印出警告消息。请参阅第3节以获取更多信息。

问:如果上游端口服务驱动程序不提供回调reset_link会怎样?

答:如果错误是由服务驱动程序连接的上游端口报告的,则致命错误将无法恢复。

问:此基础架构如何处理非PCIe驱动程序?

答:发生错误时此基础架构会调用驱动程序的错误回调函数。

但是如果驱动不是用于PCI Express的,设备可能不会将自己的错误报告给root端口。

问:该驱动程序需要进行哪些修改才能使其兼容PCI Express AER根驱动程序?

答:它可以调用帮助程序函数以在设备中启用AER,并清理不可纠正的状态寄存器。请请参阅第3.3节。

4.软件错误注入

调试PCIe AER错误恢复代码非常困难,因为它很难触发真正的硬件错误。基于软件的错误注入可用于伪造各种PCIe错误。

首先,您应该在内核中启用PCIe AER软件错误注入

配置,即以下应位于您的.config中的项目。

CONFIG_PCIEAER_INJECT = y或CONFIG_PCIEAER_INJECT = m

使用新内核重新启动或insmod模块后,名为设备文件

/ dev / aer_inject 会被创建。

然后,您需要一个名为aer-inject的用户空间工具,

该工具可以从此获取: http://www.kernel.org/pub/linux/utils/pci/aer-inject/

有关aer-inject的更多信息可以在连接中的文档及其源代码中找到。

【PCIe】【翻译】AER 内核驱动 《pcieaer-howto》PCI Express高级错误报告驱动程序指南相关推荐

  1. PCIe扫盲——高级错误报告AER(一)

    转:http://blog.chinaaet.com/justlxy/p/5100057838 前面的文章提到过高级错误报告(Advanced Error Reporting,AER),接下来详细地介 ...

  2. pci-e串口卡linux 驱动下载,万能PCI串口卡驱动下载

    下面点击下载安装,最新更新的这个版本对于很多用户来说,体验感觉还是可以的.虽然有一些小问题没有解决,但是大体上还是符合用户使用需求.尤其是针对之前版本的修改,就比较OK的感觉. 万能PCI串口卡驱动官 ...

  3. PCIE AER Linux 驱动详解

    文章目录 Abstract 1. Introduction 2. PCIe Advanced Error Reportion Driver 2.1 PCIe AER Topology 2.2 PCIe ...

  4. linux kernel 配置(部分) 部分内容翻译自内核帮助文档

    linux kernel 2.6.13 在配置内核前,你应当对详细的了解运行内核的系统,根据自己的需要配置内核. 下面,我将解释内核的各个选项,并根据本人的机器作相应的配置. 在此之前,我把机器硬件参 ...

  5. 什么是 PCIe 卡?您需要了解的有关PCI Express卡的所有信息

    PCI Express(PCIe)标准的出现是为了满足网络设备对更高带宽.更大灵活性和更好性能的需求.PCIe在首次亮相后已经得到充分开发并广泛应用于许多网络设备,特别是对于PCIe卡.什么是PCI快 ...

  6. PCI Express解析——系列文章【1】:基本概述PCI、PCI-X与PCIe的最大区别

    PCI Express解析--系列文章[1]:基本概述PCI.PCI-X与PCIe的最大区别 1 PCIe概述 1 .1 基本简介 1.2 PCI.PCI-X和PCIe 1.3 PCIe发展版本 1. ...

  7. PCI Express

    PCI Express是新一代的总线接口,而采用此类接口的显卡产品,已经在2004年正式面世.早在2001年的春季"英特尔开发者论坛"上,英特尔公司就提出了要用新一代的技术取代PC ...

  8. CIE (PCI Express) 1x, 4x, 8x, 16x总线端子说明

    1.概述 PCI Express作为一种高带宽.低引脚数.串行.互连技术.它是为了取代旧的PCI和AGBus标准而设计的.PCIe比旧标准有许多改进,包括更高的最大系统总线吞吐量.更低的I/O引脚数和 ...

  9. PCIe扫盲——PCIe错误报告机制

    转载地址:http://blog.chinaaet.com/justlxy/p/5100057800 PCIe总线有三种错误报告方式,分别是: 1.     Completions:通过Complet ...

  10. Windows下PCIe接口的多串口卡驱动开发小结

    近期在64位Win7下开发一款PCIe接口的多串口卡驱动程序,做个小结: 1. 因为在Win下对WDF不熟悉,加上市面上DDK.WDM书籍较多,故选用WDM框架: 2. 多串口卡的硬件接口为PCIe, ...

最新文章

  1. Can't create table... error150
  2. speech codec (G.711, G.723, G.726, G.729, iLBC)
  3. 生物信息课程学习 --- 比对,BLAST,马尔可夫
  4. 周其对话农民丰收节交易会 乡村振兴不能单单从乡村着眼
  5. wchar_t * 与 char * 互相转换小记
  6. window环境下mysql配置参数_Window下mysql环境配置问题整理
  7. 【Oracle】锁表查询与解锁
  8. 根据输入的出生日期计算到今天之间的天数
  9. [leetcode] 7. 整数反转
  10. pygame 文字输入交互_如何在pygame中创建交互式对象?
  11. 表单验证 靠name获取
  12. 支付宝疯起来连自己都打
  13. IDEA 配置Java环境
  14. LVS 同网段搭建keeplive+lvs
  15. 广州大学锐捷认证协议安全性研究
  16. 【LuoguP4770】[NOI2018] 你的名字
  17. 文本特征提取和向量化
  18. php爬虫亚马逊,亚马逊爬虫(亚马逊 api)
  19. survival cutoff值
  20. 配置authorized_keys让服务器A免密登录服务器B

热门文章

  1. 这 9 个 Java 开源项目 yyds
  2. 多旋翼无人机控制之完整闭环控制设计
  3. html网页设计课程的思维导图,html思维导图
  4. Android开发:apk反编译及后续打包教程2022win11(亲测)
  5. JavaScript判断数组是否包含某元素
  6. vs2015如何安装vsix扩展工具
  7. 【UE·蓝图】UE4蓝图MediaPlayer注意事项
  8. linux中vim删除某个符号,在 Vim 中,删除 ^@ 符号的几种方法
  9. Blender2.9入门篇
  10. blender 常用快捷键