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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/479085.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot当中使用EMQX(MQTT协议)

本篇博客主要围绕EMQX是什么?、能干什么?、怎么用? 三点来进行整理。 1、MQTT协议 1.1、MQTT简介 在了解EMQX前首先了解一下MQTT协议,MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输&#xff0…

web基础及http协议 (二) apache

一、httpd 安装组成 http 服务基于 C/S 结构 1 .常见http 服务器程序 httpd apache,存在C10K(10K connections)问题 nginx 解决C10K问题lighttpd IIS .asp 应用程序服务器 tomcat .jsp 应用程序服务器 jetty 开源的servlet容器&#xf…

关于计算机专业必看的几部电影

一些电影推荐: 《黑客帝国》(The Matrix):这是一部科幻动作片,探讨了虚拟现实、人工智能和计算机破解等主题。 《源代码》(Source Code):这是一部科幻惊悚片,讲述了一位士兵通过一种计算机程序,进入了一名…

阿里云幻兽帕鲁Windows 服务器怎么下载存档?

阿里云幻兽帕鲁Windows 服务器怎么下载存档?通过远程连接window服务器桌面的方式。 远程连接到阿里云的 Windows 服务器后,可以将压缩后的存档文件,拖动到 workbench\Download 目录后,就会触发浏览器的文件下载,然后将…

C++:构造函数

构造函数 1、与类名同名; 2、不具有任何类型,无返回值; 3、可以重载。 功能:一般用于初始化对象成员变量。 构造函数初始化成员变量: 1、this->成员变量 值; 2、初始化列表 一、普通构造函数 1、调用:Stu…

Go 是否有三元运算符?Rust 和 Python 是怎么做的?

嗨,大家好!本文是系列文章 Go 技巧第十四篇,系列文章查看:Go 语言技巧。 今天来聊聊在 Go 语言中是否支持三元运算符。这个问题很简单,没有。 首先,什么是三元运算符? 在其他一些编程语言中&a…

【Go语言】Go语言中的变量和常量

Go语言中的变量和常量 1 变量 变量相当于是对一块数据存储空间的命名,程序可以通过定义一个变量来申请一块数据存储空间,之后可以通过引用变量名来使用这块存储空间。 Go 语言是强类型静态语言,所以变量的声明与赋值方式与 PHP/Python 等动…

智胜未来,新时代IT技术人风口攻略-第六版(弃稿)

文章目录 前言鸿蒙生态科普调研人员画像高校助力鸿蒙 - 掀起鸿蒙教育热潮高校鸿蒙课程开设占比 - 巨大需求背后是矛盾冲突教研力量并非唯一原因 - 看重教学成果复用与效率 企业布局规划 - 多元市场前瞻视野全盘接纳仍需一段时间 - 积极正向的一种严谨态度企业对鸿蒙的一些诉求 …

学习总结19

# 奶牛的耳语 ## 题目描述 在你的养牛场&#xff0c;所有的奶牛都养在一排呈直线的牛栏中。一共有 n 头奶牛&#xff0c;其中第 i 头牛在直线上所处的位置可以用一个整数坐标 pi(0< pi < 10^8) 来表示。在无聊的日子里&#xff0c;奶牛们常常在自己的牛栏里与其它奶牛交…

MyBatis--02-1- MybatisPlus----条件构造器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言AbstractWrapper 条件构造器官网文档https://baomidou.com/pages/10c804/#abstractwrapper](https://baomidou.com/pages/10c804/#abstractwrapper)![在这里插入…

npm ERR! code CERT_HAS_EXPIRED:解决证书过期问题

转载&#xff1a;npm ERR! code CERT_HAS_EXPIRED&#xff1a;解决证书过期问题_npm err! code cert_has_expired npm err! errno cert-CSDN博客 npm config set registry http://registry.cnpmjs.org npm config set registry http://registry.npm.taobao.org

【Day51】代码随想录之动态规划完全背包_139.单词拆分_背包总结

文章目录 动态规划理论基础动规五部曲&#xff1a;出现结果不正确&#xff1a; 139.单词拆分背包问题0-1背包完全背包 动态规划理论基础 动规五部曲&#xff1a; 确定dp数组 下标及dp[i] 的含义。递推公式&#xff1a;比如斐波那契数列 dp[i] dp[i-1] dp[i-2]。初始化dp数组…