PCIe总线

时间:2024-03-15 17:03:07

1 PCIe中断
- PCI/PCIe设备中断都是level触发

2 IOMMU和SMMU
2.1 x86 IOMMU
(1)Native时将PCIe总线地址(ARM叫IPA地址)转换成存储器物理地址
(2)Hypervisor时根据来的BDF(DMA源或目的ID)将DMA GPA转换成HPA(DRAM物理地址)
(3)Hypervisor时物理中断投送给pCPU的LAPIC(读作ei pik),然后pCPU根据BDF将物理中断翻译成虚拟中断,再注入(inject)在其上运行的vCPU的vLAPIC
(4)获取vm-exit的退出原因:exit_qualification = vmcs_readl(EXIT_QUALIFICATION)
Figure 2-1 IOMMU

PCIe总线

2.2 ARM中断虚拟化
(1)在虚拟化系统中,physical CPU interface 和hypervisor interface属于VMM控制
(2)VMM通过physical CPU inteface接收物理中断
(3)VMM通过hypervisor interface 配置virtual CPU interface 向虚拟机注入(inject)虚拟中断
(4)GuestOS 通过virtual CPU interface 接收虚拟中断并处理
Figure 2-2 SMMU

PCIe总线

3 x86 MIPI60
- Blackhawk USB560v2

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

Figure 4-1 Type 0 Header和Type 1 Header的区别

PCIe总线

4.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

4.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
arch/i386/pci/init.c
arch/i386/pci/mmconfig.c
pci_access_init()

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

4.4 re-enumeration
echo 1 > /sys/bus/pci/devices/0000:00:00.0/remove
echo 1 > /sys/bus/pci/rescan
echo 1 > /sys/bus/pci/drivers/pcieport/0000:00:13.0/rescan

4.5 libpci
external/pciutils
setpci

4.6 procfs
proc_create()
remove_proc_entry()

4.7 URLs
PCIe 配置空间读写内核实现
https://blog.csdn.net/yuzhihui_no1/article/details/47278995

PCIE issue in C6A816xEVM board
http://e2e.ti.com/support/processors/f/791/t/106374

C6678通过PCIe与windows xp主机连接及设备资源分配的问题!!!
https://e2echina.ti.com/question_answer/dsp_arm/c6000_multicore/f/53/t/14413

5 ARM PCIe
5.1 MSM RC
drivers/pci/host/pci-msm.c
qcom平台上每个RC属于一个domain(PCIe规范叫segment),并且每个RC只连接一个EP

Figure 5-1 qcom RC拓扑图

PCIe总线

5.2 MSM ep_pcie
msm/ep_pcie
ep_pcie_enumeration()

6 URLs
Intel VT-d实现概述
http://m.blog.chinaunix.net/uid-28541347-id-5826594.html

DEEP IN ARM VIRTUALIZATION
https://yomostatic.oss-cn-shenzhen.aliyuncs.com/courses/10_arm_virtualization/chapter_4_Deep_in_Arm_Virtualization.pdf

老男孩读PCIe之六:配置和地址空间
https://www.jianshu.com/p/574e9a2cbc4e

老男孩读PCIe之七:TLP的路由 
https://www.jianshu.com/p/85b63c6520ec?utm_campaign=maleskine

7 Abbreviations
ATU:Address Translation Unit
BDF:Bus,Device,Function
overhead:开销,包头包尾等由协议层而不是应用层添加的字节,也就是说,一个PCIe包中除了payload之外的附加字节(ACK、CRC等)都叫overhead
RC:Root Complex,执行存储器域地址到PCIe域地址的翻译,ATU被配置好后,CPU将要访问的地址发给ATU,ATU翻译后生成TLP包发给对应的Endpoint
TLP:Transaction Layer Packet,TLP中包含BDF号或者要寻址的内存和IO地址及其范围
VMCS:Virtual Machine Control Structure