本文总结了AER错误处理流程
AER 英文简称 Advanced Error Reporting 翻译中文是高级错误报告,是PCIE异常信息处理机制,用于报告PCIe 错误信息
错误信息主要分为两种 Correctable Errors 和Uncorrectable errors
其中 Correctable Errors包含非致命的错误和致命的错误
a.ERR_FATAL:致命错误,此错误类型影响了PCIe link链路。
b.ERR_NONFATAL:指影响了设备功能,但是PCIe link还是稳定的
Correctable Errors:可纠正错误是指错误发生后,硬件可以自动恢复。
Uncorrectable errors:错误发生后,影响设备功能,硬件不能自动恢复。
如下列表所述,注意如果是链路出现了错误需要需要Upstream设备向Root来报告错误进行重新训练
AER错误需要EP和RC端同时打开才能使用
这些错误信息可以通过设备控制器进行使能或者禁止
设备可以通过设备状态寄存器查询AER探测状态
RC寄存器中可以控制是否enable AER功能
ERROR Message通过port端口上报给Root Complex 最后通过中断方式通知CPU进行处理
PCIe Correctable Errors处理流程
AER Driver同时获取RC和EP的错误状态信息, 此时Errors已经被物理层或者数据链路层给修复,AER仅仅获取错误的状态
PCIE Uncorrectable errors处理流程
AER可以同时获取RC和EP的状态,并行recovery强制热复位修复,复位会重新训练链路,影响系统数据的传输
linux内核通过aerdrv.c进行驱动管理,分为驱动层drv.c和核心层core.c
系统运行的时候会注册aerdriver设备驱动驱动,AER注册成功需要支持以下2个条件
1.kernel中需要开启AER功能配置
2.需要支持MSI中断
static int __init aer_service_init(void)
{if (!pci_aer_available() || aer_acpi_firmware_first())return -ENXIO;return pcie_port_service_register(&aerdriver);
}
device_initcall(aer_service_init);
aerdriver是设备驱动结构体
static struct pcie_port_service_driver aerdriver = {.name = "aer",.port_type = PCI_EXP_TYPE_ROOT_PORT,.service = PCIE_PORT_SERVICE_AER,.probe = aer_probe,.remove = aer_remove,.error_resume = aer_error_resume,.reset_link = aer_root_reset,
};
调用aer_probe 填充pcie_dev资源,注册中断进行aer错误收集与处理,使能root aer功能
static int aer_probe(struct pcie_device *dev)
{int status;struct aer_rpc *rpc;struct device *device = &dev->port->dev;/* Alloc rpc data structure */rpc = aer_alloc_rpc(dev);if (!rpc)
本文发布于:2024-02-01 06:31:00,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170674026034564.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |