Linux PCI和PCIe总线

1 PCIe中断
- PCI/PCIe设备中断都是level触发,并且请求信号为低电平有效
- PCI总线一般只有INTA#到INTD#的4个中断引脚,所以PCI多功能设备的func一般不会超过4个,但是共享中断除外

2 IOMMU
2.1 ARM SMMU v2
Refer to my blog ARM SMMU v2.

2.2 x86 IOMMU
When a PCI device is assigned, KVM/QEMU call intel_iommu_page_mapping() to build VT-d DTE (Device Table Entry) to map the entire guest memory.

Kernel parameter intel_iommu=pt to set up pass through mode in context mapping entry. This disables DMAR in Linux kernel; but KVM still runs on VT-d and interrupt remapping still works.

In this mode, kernel uses swiotlb for DMA API functions but other VT-d functionalities are enabled for KVM. KVM always uses multi level translation page table in VT-d. By default, pass though mode is disabled in kernel.

PCIe PASID capability ID is equal to 0x1B (PCI_EXT_CAP_ID_PASID).

1)在虚拟化场景下,直通设备的中断是无法直接投递到Guest中的,而是由IOMMU截获中断,先将其中断映射到host的某个中断上,然后再重定向(由VMM写VMCS寄存器中的32 bits VM-entry interruption-information字段)到Guest内部。
2)IOMMU IRTE(Interrupt Remapping Table Entry,128bit)中的Destination ID字段指明中断要投递的CPU的APIC ID信息,vector字段指明中断号,VMM会为每个中断源分配一个IRTE,并且把guest分配的vector号填入到IRTE的vector域。
3)在进入guest执行前,kvm是关中断的,在VM-Exit完全恢复了host上下文后,才开中断。关中断是在vcpu_enter_guest函数中调用了local_irq_disable,开中断是在这个函数从kvm_x86_ops->run返回后(即VM-Exit后)调用local_irq_enable。
4)guest vcpu执行时,物理中断发生,导致VM-Exit,但是此时是关中断的,所以硬件不会响应中断,中断处于pending,在开中断后,硬件发现pending中断并开始响应,此时已经在host上下文中,IDT(Interrupt Descriptor Table)已经指向host的IDT,物理中断由host handler来处理。

3 Linux x86 PCIe调试
3.1 PCIe设备分类
- RC,BDF为00:00.0
- bridge就像hub,一般是个多功能的设备,传递数据需要仲裁,比较慢
- switch就像交换机,PCIe规范中引入,比较快
- endpoint,x86主板上内置设备的总线号一般为0,而外挂EP的总线号一般从1开始
Figure 3-1 Type0 Header

Figure 3-2 Type1 Header

3.2 基本概念
- PCIe QOS:TC(Traffic Class),TC的值从0到7,值越大,优先级越高,类似于支持AVB的EtherSwitch,因为PCIe设计之初主要是针对于音视频应用;一个TC对应一个VC buffer(Virtual Channel),如果只有一个VC buffer,那么设置的TC值无效
- PCIe超过256字节的配置空间需要找到基地址,在MMCFG中,偏移44字节(0x2c),长度为8个字节,而MCFG可以通过acpidump找到
- PCIe的domain在内核代码中叫segment,可以通过pci_domain_nr()获得
- dev号(也叫slot)和func号一般通过宏PCI_DEVFN()合并成一个字节
- 因为PCI规范允许单个系统拥有高达256个总线,所以总线编号是8位。但对于大型系统而言,这是不够的,所以,引入了域的概念,每个PCI域可以拥有最多256个总线,每个总线上可支持32个设备,所以设备号是5位,而每个设备上最多可有8种功能,所以功能号是3位
- I210一般连接在pcieport的Lane0

3.3 LTSSM状态的查询
- PCIESTS1 offset:328h
- PCIe的LTSSM控制寄存器一般位于bridge的配置空间中(x86或者synopsys)或者RC的私有的寄存器(qcom)
- 读取EP的上一级bridge的config space的0x328(假如EP直接连在RC的port上,读取RC私有的寄存器),就可以获得下一级EP的LTSSM状态。譬如读取bridge(00:13.0)的下一级EP状态:peeknpoke b r 0x00 13 0 328

CONFIG_PCI_MMCONFIG=y
MMCONFIG: PCIe Memory-Mapped Config

QNX读取桥配置空间0x328的方法:
pci-tool -D 0x5ada -vvvvv
pci-tool -d 0:19:2 --read=CFG:0x328

3.4 LTSSM链路训练结果
通过访问PCIe桥的配置寄存器获得
Link Capabilities:配置空间0x4c
Link Control and Link Status:配置空间0x50

3.5 Linux pcibios_init
x86 BIOS专门提供了针对PCI总线的操作,这些操作里就包括了总线枚举的整个过程,Linux kernel中的宏CONFIG_PCI_BIOS。在系统加电以后自检时,就会完成对PCI总线的枚举,之后Linux对PCI配置空间的访问都是通过BIOS调用的形式进行,提供有这些功能和服务的BIOS就称之为PCI BIOS 。需要注意的是Linux x86_64是不采用PCI BIOS访问PCI配置空间的,而是内核实现了直接访问PCI配置空间的函数(CONFIG_PCI_DIRECT)。

pcibios_init()的第一个功能是在内存中找到BIOS程序的代码(参考函数pci_find_bios),然后将调用BIOS例程的读写PCI配置空间的代码封装成函数赋值给pci_ops。

pci_ops里面的函数指针都是用来读写PCI配置空间的,把要读写的值和设备号告诉这些函数,在这些函数中调用了BIOS例程,并把这些值当作参数传给BIOS例程,BIOS再根据设备号和要读写的值来进行操作。所以Linux x86驱动程序中pci_read_config_byte()最终调用的是pci_bios_read_config_byte()。

zcat /proc/config.gz | grep PCI

3.6 PCIe Reset
- Cold Reset: PCI A15 pin RST
- Warm Reset (LTSSM)
- Hot Reset (LTSSM): PCIe Type1 Header config space offset 0x3E 16-bit Bridge Control register bit6 Secondary Bus Reset, bit6 can retrigger LTSSM Link Training from Rx.Detect
- FLR (Function Level Reset): find Synopsys PCIe Capability ID 0x10, read 12 bytes from Capability ID byte, index 8 and 9 is Device Control Register, bit15 is FLR, Linux FLR path is /sys/bus/pci/devices/BDF/reset

3.7 x86 MIPI60
Blackhawk USB560v2

4 ARM PCIe
4.1 MSM RC
drivers/pci/host/pci-msm.c
qcom平台上每个RC属于一个domain(PCIe规范叫segment),并且每个RC只连接一个EP。
Figure 4-1 qcom RC拓扑图

4.2 MSM ep_pcie
msm/ep_pcie
ep_pcie_enumeration()

5 PCI用户空间编程 - libpci
5.1 Android libpci库
external/pciutils

5.2 libpci判断一个PCI设备是不是PCIe
capability ID参考:include/uapi/linux/pci_regs.h
参数ptr是配置空间偏移地址0x34指向的一个字节(first capability list entry)。
static bool pci_is_pcie(struct pci_dev *pdev,
        unsigned char ptr)
{
    unsigned int value;
    unsigned int next_ptr;
    unsigned int cap_id;

    next_ptr = ptr;
    if (0 == ptr)
        return false;

    do {
        value = pci_read_long(pdev, next_ptr);
        next_ptr = (value >> 8) & 0xff;
        cap_id = value & 0xff;
        /* PCI Express Capability Structure */
        if (0x10 == cap_id)
            return true;
    } while (next_ptr);

    return false;
}

6 x86 GPIO
PCH(Platform Controller Hub)上大部分设备可以通过PCIe或IO方式访问,但PCH上部分设备需要访问PCH的私有空间,这部分空间通过P2SB(Primary to SideBand)的SBREG_BAR寄存器映射到内存空间,这段空间被称为PCR(PCH Private Configuration Space Register)。每个设备对应一个PortID,PortID表示设备在PCR空间的偏移量,在加上寄存器偏移就可以获取寄存器的地址。

x86 GPIO寄存器位于PCH的私有空间。GPIO被分组,每组对应一个PCR的PortID。GPIO community和PortID的对应关系如下所示。
SouthWest: 0xC0
NorthWest: 0xC4
North: 0xC5
West: 0xC7

7 Windows PCIe工具软件
Mindshare的Arbor
Teledyne LeCroy的TeleScan PE

8 Abbreviations
ATU:Address Translation Unit
BDF:Bus,Device,Function
MEI:Intel Management Engine Interface;一个独立的子系统,使用ARC处理器,OS是Minix 3,固件整合到BIOS中,通过PCI桥片在x86端访问ARC的local端
overhead:开销,包头包尾等由协议层而不是应用层添加的字节,也就是说,一个PCIe包中除了payload之外的附加字节(ACK、CRC等)都叫overhead
P2SB:x86 Primary to Sideband
PCIe bifurcation:分叉
RC:Root Complex,执行存储器域地址到PCIe域地址的翻译,ATU被配置好后,CPU将要访问的地址发给ATU,ATU翻译后生成TLP包发给对应的Endpoint
TLP:Transaction Layer Packet,TLP中包含BDF号或者要寻址的内存和IO地址及其范围
VMCS:Virtual Machine Control Structure

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

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

相关文章

【机器学习】重塑游戏世界:机器学习如何赋能游戏创新与体验升级

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀目录 🔍1. 引言:游戏世界的变革前夜📒2. 机器学习驱动的游戏创新🌞智能化游戏设计与开发&…

OJ-0807

题目 参考 import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);String input in.nextLine();String[] numStrs inp…

身体出现这5种异常,可能是甲状腺在求救,千万别扛着!

甲状腺,被誉为人体新陈代谢的“发动机”,是调节我们身体能量和代谢的重要器官。然而,当甲状腺出现问题时,它往往会通过身体的一些异常信号向我们求救。北京精诚博爱医院张维一主任提醒:以下是五种常见的甲状腺异常表现…

您知道Jmeter中Redirect Automatically 和 Follow Redirects的使用场景吗?

相信很多使用过jmeter的同学都没有关注过请求中的Redirect Automatically 和 Follow Redirects选项,如下图: 在 JMeter 中,Redirect Automatically 和 Follow Redirects 是与 HTTP 请求重定向相关的两个选项,它们之间是有很大区别…

速度规划之:起点速度和终点速度不为零的非对称梯形速度规划

起点速度和终点速度不为零的非对称梯形速度规划 一、引言二、理论基础1. 梯形速度规划概述2.数学建模- 变量定义- 约束关系- 公式推导 三、计算过程1.只存在减速段2.只存在加速段3.存在加速段和减速段4.存在加速度段、匀速段和减速段 四、仿真实现五、优缺点优点缺点 六、总结 …

亚马逊等跨境电商平台怎么找到好的测评资源?

如何找到好的测评资源呢? 目前常规卖家找测评资源主要通过以下途径: 联系自己在海外的亲友帮忙测评,不过海外的亲友会比较有限安排业务员在facebook等社交平台找老外测评,但社交平台找老外很难掌控留评时效,甚至会遇…

破解USB设备通讯协议实现自定义软件控制的步骤与方法

在设备和计算机之间通过USB进行通讯的情况下,厂家提供的软件可以控制设备,但没有提供任何其他资料和支持,这种情况下,若希望自行开发软件来实现同样的功能,可以通过以下步骤破解通讯协议并开发自定义程序。 1. 捕获US…

2-57 基于matlab 实现了气缸的充气和放气的仿真

基于matlab 实现了气缸的充气和放气的仿真,在等温情况和绝热两种情况下分别进行了仿真,并给多变过程下的理论计算公式。程序已调通,可直接运行。 2-57 matlab 气缸充气和放气仿真 - 小红书 (xiaohongshu.com)

【论文阅读】PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images

Q: 论文如何解决这个问题? A: 论文通过提出PETRv2框架来解决多相机图像的3D感知问题,具体方法包括以下几个关键点: 时间建模(Temporal Modeling): 通过3D坐标对齐(3D Coordinates Alignment&…

ASP.Net Core设置接口根路径的方法

使用asp.net core开发微服务项目,需要给每个服务设置不同的根路径,这样既能使用网关转发请求,又方便对单个服务进行测试,保证请求路径的统一。 设置方法需要使用中间件,在Program.cs添加如下代码 app.UsePathBase(&qu…

通过ZRender画一个大屏的顶部样式标题

介绍:通过ZRender画一个大屏项目的顶部样式,在其中放入大屏的标题。ZRender 是二维绘图引擎,它提供 Canvas、SVG、VML 等多种渲染方式。ZRender 也是 ECharts 的渲染器。 一、下载 npm install zrender终端输入以上命令下载包即可。 二、导…

记忆化搜索——1

目录 1.斐波那契数 2.不同路径 3.最长递增子序列 4.猜数字大小2 5.矩阵中的最长递增路径 1.斐波那契数 该题规律很明显,就直接放记忆化搜索的版本了 class Solution { public:int dfs(int n){if(n0||n1)//递归出口{return n;}if(f[n-1]-1)//检查是否已经记忆过…

JVM 加载阶段 Class对象加载位置是在 堆中还是方法区?

在JVM(Java虚拟机)的类加载过程中,Class对象的加载位置涉及到堆(Heap)和方法区(Method Area)两个关键区域。具体来说,类的加载阶段涉及到将类的.class文件中的二进制数据读入到内存中…

黑丝或者白丝,都可以用LoRA(Stable Diffusion进阶篇:ComfyUI 附加网络)

前言 在学习WebUI的那些基础知识点的时候,有一个东西是每一个初学者都绕不开的大山-附加网络。 这个东西对于每一个接触Stable Diffusion的小伙伴来说就像是小学门口小卖部卖的辣条、初中课本上的涂鸦、高中数学卷解不开的最后一道大题。 学习过WebUI里Stable Di…

揭秘亚马逊新手快速成长背后的秘密:从入门到精通

在亚马逊这个充满机遇与挑战的市场平台上,作为一名深耕多年的卖家,我积累了宝贵的经验和见解。随着市场环境的不断变化,我意识到,无论是新加入的创业者还是经验丰富的老手,都需要不断学习和适应,以在这个平…

游戏行业报告(一)| 中国占全球头部上市游戏企业34%,“智能NPC”竞争方向较受关注

近日,伽马数据发布了《2024中国上市/非上市游戏企业竞争力报告》,本篇文章仅采用《2024中国上市/非上市游戏企业竞争力报告》的部分数据。由于文章太长,所以分了下集,大家可以收藏关注~ 企业全球资本市场竞争现状 全球TOP50上市游…

Motionface ai工具有哪些?

Motionface Android/PC 用一张静态含有人脸相片来生成一个能说会唱的虚拟主播。使用简单便捷,极致的流畅度体验超乎您的想象。 免费下载 Respeak PC电脑软件 任意视频一键生成虚拟主播,匹配音频嘴型同步,保留原视频人物神态和动作&#xff0c…

什么是柔性生产?

柔性生产,是一种能够迅速调整生产流程、产品种类及产量,以低成本、高效率响应市场多样化需求的生产方式。它不仅仅是对生产线硬件的升级,更是对生产组织、管理模式及信息技术的全面革新。柔性生产的核心在于“灵活”二字,即企业能…

JVM(面试用)

目录 一、JVM运行时数据区 二、JVM类加载 类加载过程 1、加载(loading) 2、验证(Verification) 3、准备(Perparation) 4、解析(Resolution) 5、初始化(Initializ…

秒懂C++之deque及反向迭代器

目录 前言 一.deque的常用接口 二.deque的原理 2.1 vector与list的优缺点 2.2 deque的原理 三.反向迭代器 四.全部代码 前言 秒懂C之List-CSDN博客 秒懂C之vector(下)-CSDN博客 本文后面关于反向迭代器的操作会涉及到前面的文章~ 一.deque的常用接…