PCIE和板卡
点对点的方式连接两个设备。
FPGA中的PCIE享有独立的IO,BANK,因为其配置复杂。
A7系列支持2.0
KU部分支持3.0
KU+部分支持4.0
通过高速BANK可以引出能连接高速设备的IO(GTX和GTH);
在XILINX 7Z035 FGG676中有两个这样的BANK,每个BANK提供四对高速收发器,所以总的来说是8对高速收发器;
我所使用的开发板:
光口两个各用一对;
PCIEX4用了四对;
SATA两个各用了一对;
https://docs.amd.com/v/u/en-US/ug476_7Series_Transceivers
根端口
https://blog.csdn.net/u013253075/article/details/119045277
可见PCIE设备写入设备并不需要直接通过CPU(DMA);
PCIe拓扑特征:图的顶部是一个CPU。这里要说明的一点是,CPU被认为是PCle层次结构的顶层。PCle只允许简单的树结构,这意味着不允许循环或其他复杂的拓扑结构。这样做是为了保持与PCI软件的向后兼容性,PCI软件使用一个简单的配置方案来跟踪拓扑,不支持复杂的环境。为了保持这种兼容性,软件必须能够与以前相同的方式生成配置周期,总线拓扑也必须与以前相同。因此,软件期望找到的所有配置寄存器仍然在那里,并且以它们始终具有的方式运行。
在上图PCIe系统中有几种设备类型,Root Complex、Switch、Bridge、Endpoint等,下面分别介绍其概念。
Root Complex:
简称RC(根端口),CPU和PCle总线之间的接口,可能包含几个组件(处理器接口、DRAM接口等),甚至可能包含几个芯片。RC位于PCI倒立树拓扑的“根”,并代表CPU与系统的其余部分进行通信。但是,规范并没有仔细定义它,而是给出了必需和可选功能的列表。从广义上讲,RC可以理解为系统CPU和PCle拓扑之间的接口,PCle端口在配置空间中被标记为“根端口”。
Bridge:
桥提供了与其他总线(如PCI或PCI- x,甚至是另一个PCle总线)的接口。如图中显示的桥接有时被称为“转发桥接”,它允许旧的PCI或PCIX卡插入新系统。相反的类型或“反向桥接”允许一个新的PCle卡插入一个旧的PCI系统。
Switch:ID和路由
http://www.ssdfans.com/?p=8216
https://www.pcietech.com/186.html/
提供扩展或聚合能力,并允许更多的设备连接到一个PCle端口。它们充当包路由器,根据地址、ID或其他路由信息(隐含路由数据包)识别给定包需要走哪条路径。是一种PCIe转PCIe的桥。
Switch有一个上游端口(靠近RC)和若干个下游端口,每个端口其实是一个Bridge,都是有一个Configuration的,每个Configuration描述了其下面连接设备空间映射的范围,分别由Memory Base和Memory Limit来表示。对上游端口,其Configuration描述的地址范围是它下游所有设备的映射空间范围,而对每个下游端口的Configuration,描述了连接它端口设备的映射空间范围。
ID路由,故名思意,是依靠目标设备的ID来作为目标地址的。即用Bus Number、Device Number和Function Number进行路由寻址。基于ID的路由方式主要用于配置读写请求,以及完成报文。
地址路由:选择地址写入具体的数据;
隐含路由:根据驱动里的要求读取标志以知晓写到具体的哪个设备中;
Endpoint:
网卡,显卡,声卡;可以被主板连接火挂载;支持Type0配置空间;
处于PCIe总线系统拓扑结构中的最末端,一般作为总线操作的发起者(initiator,类似于PCI总线中的主机)或者终结者(Completers,类似于PCI总线中的从机)。
显然,Endpoint只能接受来自上级拓扑的数据包或者向上级拓扑发送数据包。细分Endpoint类型的话,分为Lagacy PCIe Endpoint和Native PCIe Endpoint,Lagacy PCIe Endpoint是指那些原本准备设计为PCI-X总线接口的设备,但是却被改为PCIe接口的设备。
而Native PCIe Endpoint则是标准的PCIe设备。
其中,Lagacy PCIe Endpoint可以使用一些在Native PCIe Endpoint禁止使用的操作,如IO Space和Locked Request等。
Native PCIe Endpoint则全部通过Memory Map来进行操作,因此,Native PCIe Endpoint也被称为Memory Mapped Devices(MMIO Devices)
配置空间:Type0和Type1
https://blog.csdn.net/yhb1047818384/article/details/106676528
PCI标准配置空间分type0和type1两种。type0主要是针对PCI的endpoint设备,type1主要是针对PCI bridge, switch。
如上图所示,type0和type1有一些共同的寄存器描述。
Device ID: 设备ID, 表示该PCI设备的设备号,只读。
Vendor ID: 厂商ID, 表示生产该设备的厂商的编号,只读。
Status: pci设备状态寄存器,用于保存pci设备的状态,如中断状态或运行产生错误时的状态。
Class Code:设备类型(大类),决定使用什么驱动去访问这个设备;设备分类信息, 表示pci设备属于哪一种类别,如网卡,存储卡,显卡等。需要重点关注的一个寄存器,之前定位过一个问题,pci设备资源分配失败,就是因为将class code设置为0, 而那张卡是pcie 网卡, class code应该设置为2。
Revision ID: 设备版本ID, 表示PCI设备的版本号。该寄存器可以被认为是Device ID寄存器的扩展。 只读。
BIST: 可选,用于内部自检。
Header type: PCI设备头类型寄存器,表示该设备时pci EP设备还是PCI 桥设备。PCI配置空间时type0还是type1就是由该寄存器定义。
Lantency Timer: 在PCI总线中,多个设备共享同一条总线带宽,该寄存器用来控制PCI设备占用PCI总线的时间。PCIe设备不需要使用该寄存器,该寄存器的值必须为0。因为PCIe总线的仲裁方法与PCI总线不同,使用的连接方法也与PCI总线不同。
Cache line size: cache缓存大小。对于PCIe设备,该寄存器的值无意义。
Expansion Rom Base Address: 扩展ROM映射基地址寄存器。分配给ROM使用,用于PCI设备在处理器还没有运行操作系统之前,完成基本的初始化设置。
Base Address register: BAR地址寄存器负责PCI设备内部空间的映射。用于计算机与主板的通信。
BAR空间:通过TLP包和BAR交互是慢速交互,用于设置配置信息,而数据交互主要还是DMA
https://blog.csdn.net/u013253075/article/details/119361574
32位:六个BAR空间
64位:三个BAR空间
BAR(Base Address Register)空间是在PCIe设备中的。BAR是一组特殊的寄存器,用于定义设备的内存和I/O地址空间。这些地址是设备和主机系统通信的基础。
当PCIe设备被系统初始化时,主机的操作系统会读取设备的配置空间,其中包括多个BAR字段。这些字段被操作系统用来映射到主机的地址空间中,从而操作系统和CPU可以通过这些映射的地址访问PCIe设备的内存或I/O端口。这使得主机能够读取或写入设备的特定区域,进行数据交换或控制设备操作。
总结来说,BAR空间被定义在PCIe设备中,但是它通过配置过程被映射到上位机的地址空间中,使得上位机可以通过这些映射的地址与设备进行交互。
只要上位机希望往这部分地址范围写入数据的时候都会使用TLP包进行交互。
TLP包:位于传输层事务部分。
总之:BAR地址寄存器负责PCI设备内部空间的映射, 有了这个映射,CPU可以做到对pcie设备空间的访问。
为什么需要BAR?
系统中的每个设备中,对地址空间的大小和访问方式可能有不同的需求,例如,一个设备可能有256字节的内部寄存器/存储,应该可以通过IO地址空间访问,而另一个设备可能有16KB的内部寄存器/存储,应该可以通过基于MMIO的设备访问。哪些地址应该使用哪种方式(IO或Memory)来访问它们的内部位置,这是系统软件(即BIOS和OS内核)的工作。因此设备必须为系统软件提供一种方法来确定设备的地址空间需求。这种需求就是是通过配置空间头部中的Base Address register (BAR)实现的。
一旦系统软件知道设备在地址空间方面的需求,系统软件将分配一个适当类型(IO, NP-MMIO或P-MMIO)的可用地址范围给该设备。
如下图所示,Type 0报头有6个bar可用(每个bar的大小为32位),而Type 1头只有2个bar可用。Type 1报头在所有网桥设备中都可以找到,这意味着每个switch端口都有Type 1报头。Type 0报头在非网桥设备中,比如end point。
DMA传递:
需要操作的基地址+包长度+读写标志 由此组成包发送给下位机(FPGA),
FPGA接收后解析,讲地址,所需长度的数据打包(TLP),传给根端口,根端口将其写入某个位置;
CPL包:响应读指令包含数据的包。
如果申请的BAR空间过大,将可能注册失败,需要考虑具体的配核驱动。
蓝屏:访问了不该访问的地址。
PCIe 事务简介
物理层~数据链路层~数据层‘
通过解析事务层的包可以实现更底层的操作,以更好地实现应用层。
https://blog.csdn.net/qq_31799983/article/details/104733490
PCIE 事务可以分为4大类:
存储器事务、IO事务、配置事务、消息事务。这些事务可以分成非报告事务(non-posted transaction)和报告事务(posted transaction)。
存储器:DMA
IO:PIO操作,配置寄存器触发某些信号
配置:操作配置空间
信息:传递错误报告,标志信息等
标准PCIE设备要求使用消息中断;
TLP帧结构:
https://blog.csdn.net/qq_39815222/article/details/121732888
PCIE发展历史
PCIE术语
标签:PCIe,基本知识,总线,学习,PCIE,地址,PCI,寄存器,设备 From: https://www.cnblogs.com/VerweileDoch/p/18181069