PCIe学习笔记(2)错误处理和AER/DPC功能

2024-02-20 12:20

本文主要是介绍PCIe学习笔记(2)错误处理和AER/DPC功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • PCIe Error
  • AER (Advanced Error Reporting)
  • DPC (Downstream Port Containment)

处理器上错误通常可分为detected和undetected error。Undetected errors可能变得良性(benign),也可能导致系统故障如silent data corruptions (SDC)。Detected errors则又可分为correctable errors (CE) 和uncorrectable errors (UCE)。
PCIe定义了两种错误报告范式:基线功能和高级错误报告功能(AER)。本文介绍PCIe错误定义及AER/DPC功能。

PCIe Error

PCIe错误分类为Uncorrectable errors和Correctable errors。Uncorrectable错误严重性可以进一步分为fatal和nonfatal。
在这里插入图片描述
有3种错误信号机制:

  1. CPL status

  2. in-band error message:
    Routed-to-RC, reqid标识错误设备BDF,CPL通常返回UR/CA指示uncorrectable error,AER发出error message,RP支持AER记录到Root Error Status寄存器。
    在这里插入图片描述

  3. error forwarding (data poisoning)
    EP位指示,non-fatal和fatal error需要启用command.SERR#ENABLE,error message发送由device control bit[3:0]控制。

AER (Advanced Error Reporting)

PCIe AER扩展的功能结构提供更强大的错误报告。可将uncorrectable error编程为fatal或non-fatal。若severity置位,则为faral error,否则为non-fatal error。仅报告最重要错误,遵循优先级列表。

Controller接收TLP detect到错误后的步骤如下:

  1. Discard TLP
  2. Generate a CA/UR Cpl (for NP)
  3. Set status in PCI-compatible status register
  4. Set status in AER registers (when enable AER)
  5. Generate an error MSG (USP only)
  6. For malformed TLPs credit is returned based on the buffer space which has been consumed by the TLP

AER初始化需要启用以下域段:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

AER driver用于在发生错误时收集全面的错误信息,报告错误并执行错误恢复操作。

static irqreturn_t aer_irq(int irq, void *context)
{struct pcie_device *pdev = (struct pcie_device *)context;struct aer_rpc *rpc = get_service_data(pdev);struct pci_dev *rp = rpc->rpd;int aer = rp->aer_cap;struct aer_err_source e_src = {};pci_read_config_dword(rp, aer + PCI_ERR_ROOT_STATUS, &e_src.status);if (!(e_src.status & AER_ERR_STATUS_MASK))return IRQ_NONE;pci_read_config_dword(rp, aer + PCI_ERR_ROOT_ERR_SRC, &e_src.id);pci_write_config_dword(rp, aer + PCI_ERR_ROOT_STATUS, e_src.status);if (!kfifo_put(&rpc->aer_fifo, e_src))return IRQ_HANDLED;return IRQ_WAKE_THREAD;
}

aer_isr()继续根据severity读取status和mask,并把status和id等信息输出。

static irqreturn_t aer_isr(int irq, void *context)
{struct pcie_device *dev = (struct pcie_device *)context;struct aer_rpc *rpc = get_service_data(dev);struct aer_err_source e_src;if (kfifo_is_empty(&rpc->aer_fifo))return IRQ_NONE;while (kfifo_get(&rpc->aer_fifo, &e_src))aer_isr_one_error(rpc, &e_src);return IRQ_HANDLED;
}static void aer_isr_one_error(struct aer_rpc *rpc,struct aer_err_source *e_src)
{struct pci_dev *pdev = rpc->rpd;struct aer_err_info e_info;pci_rootport_aer_stats_incr(pdev, e_src);/** There is a possibility that both correctable error and* uncorrectable error being logged. Report correctable error first.*/if (e_src->status & PCI_ERR_ROOT_COR_RCV) {e_info.id = ERR_COR_ID(e_src->id);e_info.severity = AER_CORRECTABLE;if (e_src->status & PCI_ERR_ROOT_MULTI_COR_RCV)e_info.multi_error_valid = 1;elsee_info.multi_error_valid = 0;aer_print_port_info(pdev, &e_info);if (find_source_device(pdev, &e_info))aer_process_err_devices(&e_info);}if (e_src->status & PCI_ERR_ROOT_UNCOR_RCV) {e_info.id = ERR_UNCOR_ID(e_src->id);if (e_src->status & PCI_ERR_ROOT_FATAL_RCV)e_info.severity = AER_FATAL;elsee_info.severity = AER_NONFATAL;if (e_src->status & PCI_ERR_ROOT_MULTI_UNCOR_RCV)e_info.multi_error_valid = 1;elsee_info.multi_error_valid = 0;aer_print_port_info(pdev, &e_info);if (find_source_device(pdev, &e_info))aer_process_err_devices(&e_info);}
}

DPC (Downstream Port Containment)

在Downstream Port检测到unmasked uncorrectable error后停止流量,避免数据损坏潜在扩散,并支持CER (Containment Error Recovery)。DPC触发不会被视为错误,但可将其视为correctable error。DPC触发时支持发起中断或ERR_COR消息,流程如下:
DPC trig -> DPC interrupt & DPC trig status/reason -> disable LTSSM
SW clear DPC status -> LTSSM to Detect state -> link retrain
在这里插入图片描述
DPC Trigger Enable

  • 00b: 默认关闭
  • 01b: 启用并在ERR_FATAL触发;
  • 10b: 启用并在ERR_NONFATAL/ERR_FATAL触发

DCP Completion Control: 0-CA, 1-UR
DPC Interrupt: DPC触发时发起INTx/MSI/MSI-X
DPC ERR_COR: DPC触发时发起ERR_COR msg,独立于中断
Poisoned TLP Egress Blocking: 不得传输TLP,若未触发DPC返回UR Cpl,否则DPC期间不再接收并丢弃TLP
Software Trigger: 写1触发DPC,读恒为0,可用于disable link,优先于MSI/MSI-X
DL_Active ERR_COR: DL转换为DL_Active时,DSP发起ERR_COR,不会作为错误处理

在这里插入图片描述
DPC RC busy: 指示软件RP需保持在DPC揭制状态
AER Uncorrectable Error Status 会根据 DPC Trigger Enable/Status和更新

Root Port Programmed I/O (RP PIO) Error Controls (eDPC)
用于精细管理RP NP遇到的错误 (CFG/IO/Mem UR/CA/CTO),建议与AER配置同步。若severity置位,作为UCE处理,触发DPC。

static irqreturn_t dpc_irq(int irq, void *context)
{struct pci_dev *pdev = context;u16 cap = pdev->dpc_cap, status;pci_read_config_word(pdev, cap + PCI_EXP_DPC_STATUS, &status);if (!(status & PCI_EXP_DPC_STATUS_INTERRUPT) || PCI_POSSIBLE_ERROR(status))return IRQ_NONE;pci_write_config_word(pdev, cap + PCI_EXP_DPC_STATUS,PCI_EXP_DPC_STATUS_INTERRUPT);if (status & PCI_EXP_DPC_STATUS_TRIGGER)return IRQ_WAKE_THREAD;return IRQ_HANDLED;
}

Linux Reference:
drivers/pci/pcie/aer.c
drivers/pci/pcie/dpc.c

这篇关于PCIe学习笔记(2)错误处理和AER/DPC功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/728196

相关文章

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java使用Mail构建邮件功能的完整指南

《Java使用Mail构建邮件功能的完整指南》JavaMailAPI是一个功能强大的工具,它可以帮助开发者轻松实现邮件的发送与接收功能,本文将介绍如何使用JavaMail发送和接收邮件,希望对大家有所... 目录1、简述2、主要特点3、发送样例3.1 发送纯文本邮件3.2 发送 html 邮件3.3 发送带

Java实现数据库图片上传功能详解

《Java实现数据库图片上传功能详解》这篇文章主要为大家详细介绍了如何使用Java实现数据库图片上传功能,包含从数据库拿图片传递前端渲染,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、数据库搭建&nbsChina编程p; 3、后端实现将图片存储进数据库4、后端实现从数据库取出图片给前端5、前端拿到

Python使用DeepSeek进行联网搜索功能详解

《Python使用DeepSeek进行联网搜索功能详解》Python作为一种非常流行的编程语言,结合DeepSeek这一高性能的深度学习工具包,可以方便地处理各种深度学习任务,本文将介绍一下如何使用P... 目录一、环境准备与依赖安装二、DeepSeek简介三、联网搜索与数据集准备四、实践示例:图像分类1.

如何关闭 Mac 触发角功能或设置修饰键? mac电脑防止误触设置技巧

《如何关闭Mac触发角功能或设置修饰键?mac电脑防止误触设置技巧》从Windows换到iOS大半年来,触发角是我觉得值得吹爆的MacBook效率神器,成为一大说服理由,下面我们就来看看mac电... MAC 的「触发角」功能虽然提高了效率,但过于灵敏也让不少用户感到头疼。特别是在关键时刻,一不小心就可能触

MobaXterm远程登录工具功能与应用小结

《MobaXterm远程登录工具功能与应用小结》MobaXterm是一款功能强大的远程终端软件,主要支持SSH登录,拥有多种远程协议,实现跨平台访问,它包括多会话管理、本地命令行执行、图形化界面集成和... 目录1. 远程终端软件概述1.1 远程终端软件的定义与用途1.2 远程终端软件的关键特性2. 支持的

Java中实现订单超时自动取消功能(最新推荐)

《Java中实现订单超时自动取消功能(最新推荐)》本文介绍了Java中实现订单超时自动取消功能的几种方法,包括定时任务、JDK延迟队列、Redis过期监听、Redisson分布式延迟队列、Rocket... 目录1、定时任务2、JDK延迟队列 DelayQueue(1)定义实现Delayed接口的实体类 (

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

SpringBoot整合DeepSeek实现AI对话功能

《SpringBoot整合DeepSeek实现AI对话功能》本文介绍了如何在SpringBoot项目中整合DeepSeekAPI和本地私有化部署DeepSeekR1模型,通过SpringAI框架简化了... 目录Spring AI版本依赖整合DeepSeek API key整合本地化部署的DeepSeek

Python实现多路视频多窗口播放功能

《Python实现多路视频多窗口播放功能》这篇文章主要为大家详细介绍了Python实现多路视频多窗口播放功能的相关知识,文中的示例代码讲解详细,有需要的小伙伴可以跟随小编一起学习一下... 目录一、python实现多路视频播放功能二、代码实现三、打包代码实现总结一、python实现多路视频播放功能服务端开