驱动开发基础 - PCI、PCIE基础知识

非常适合初学的pcie博客:

PCIE扫盲(第一阶段):http://blog.chinaaet.com/justlxy/p/5100053251

 


PCIe简介:http://blog.chinaaet.com/justlxy/p/5100053066

  •     这一章主要介绍PCIe的由来,在2001年的时候被提出,命名“PCI-Express”,主要优势就是传输速率高,另外还有传输距离远、功耗低、抗干扰能力强等。
  •     PCIe接口根据总线位宽不同,可以配置为x1、x2、x4、x8、x16、x32等,总线位宽越大对应传输速率越大。
  •     PCIe是在PCI/PCI-X的基础上发展而来的,因此完全兼容前面几种设备。

PCI总线基本概念:http://blog.chinaaet.com/justlxy/p/5100053077

  •     PCI是Peripheral Component Interconnect(外设部件互连标准)的缩写,曾经是个人电脑中最广泛的接口,主要用于连接声卡、显卡、网卡等,如今逐渐被PCIe取代。
  •     PCI被淘汰的主要原因是越来越不能满足日益增长的图吞吐量,虽然不断增加33MHz、66MHz、133MHz是在频率以提高传输速率,极限最大支持2G左右传输,但仍不满足。

一个典型的PCI总线周期:http://blog.chinaaet.com/justlxy/p/5100053078

  •     一次PCI传输周期所要用到的信号:CLK(时钟)、GNT(申请总线占用)、FRAME(表示数据传输的起始和持续)、AD(传输地址和数据)、C/BE(Command/Byte Enable)、IRDY(主设备准备好信号)、DESEL(片选)、TRDY(目标设备准备好信号)。
  •     一次传输流程:
  •         1、在第一个时钟上升沿,FRAME#和IRDY#都为inactive,表明总线当前处于空闲状态。与此同时,某个设备的GNT#信号处于active,表明总线总裁器已经选定当前设备为下一个initiator(可以理解为主机)。
  •         2、在第二个时钟上升沿,FRAME#被initiator拉低,表明新的事务(Transaction)已经开始。与此同时,地址和命令被依次发送到AD上,总线上面的所有其他设备(从机)都会锁存这些信息,并检查地址和命令是否与自己匹配
  •         3、在第三个时钟上升沿,IRDY#处于active状态,表明主机准备就绪,可以接收数据了。AD信号目前处于三态状态(处于输出和输入的转换状态),此时的TRDY#处于inactive状态,以保证Turn‐around cycle顺利进行。
  •         4、在第四个时钟上升沿,PCI总线上的某个从机确认身份,并依次将DEVSEL#信号和TRDY#拉低,并将相应的数据输出到AD上。此时,FRAME#信号为active状态,表明这并不是最后一个数据。
  •         5、在第五个时钟上升沿,TRDY#处于inactive状态,表明从机尚未就绪,因此所有的操作暂缓一个时钟周期(或者说插入了一个Wait State)。PCI总线最多允许8个这样的Wait State。
  •         6、在第六个时钟上升沿,从机向主机发送第二个数据。此时,FRAME#信号依旧为active状态,表明这并不是最后一个数据。
  •         7、在第七个时钟上升沿,IRDY#处于inactive状态,表明主机尚未就绪,再次插入一个Wait State。但是此时从机依旧可以向AD上发送数据。
  •         8、在第八个时钟上升沿,AD上的第三个数据被发送至主机,由于此时FRAME#信号被拉高,即inactive,表明这是本次事务(Transaction)的最后一个数据。此后,所有的控制信号均被拉高,处于inactive状态,AD、FRAME#和C/BE#处于三态状态(处于输出和输入的转换状态)。

PCI总线中的Reflected-Wave Signaling:http://blog.chinaaet.com/justlxy/p/5100053079

  •     这一章主要提到了,PCI使用了反射波信号技术,降低了功耗,但同时这种机制也限制了PCI总线频率的提高。
  •     虽然理论上一个PCI总线上最大可连接32个设备,实际一般只能连10~12个(如果使用插槽连接,则一个连接算两个PCI设备),如果需要连接更多设备,可以借助PCI桥。

PCI总线的三种传输模式:http://blog.chinaaet.com/justlxy/p/5100053095

  •     这一章主要介绍了PCI的三种传输模型:Programmed I/O(PIO),Peer-to-Peer和DMA。
  •     PIO传输模型其实就是通过CPU搬运数据,对于目前一些传输量特别大的设备,这是一种非常不好的办法。
  •     DMA传输模型是非常流行的传输方式,通过DMA搬运,几乎不需要CPU进行干预,应用很广泛。
  •     Peer-to-Peer这种方式仅针对PCI,因为PCI的主机身份不是固定的,如果两个设备需要进行传输,可以将其中一个设为主机,这种方式在实际应用中非常少。

PCI总线的中断和错误处理:http://blog.chinaaet.com/justlxy/p/5100053096

  •     PCI总线使用INTA#、INTB#、INTC#和INTD#信号向处理器发出中断请求。实际一般只使用INTA#信号。
  •     PCI总线通过PERR#或者SERR#报告错误。

PCI总线的地址空间分配:http://blog.chinaaet.com/justlxy/p/5100053219

  •     PCI总线具有32位数据/地址总线,所以存储地址空间为4GB,也就是所有PCI设备共同映射到这4GB上,每个PCI设备占用唯一的一段PCI地址,以便PCI总线统一寻址。
  •     PCI体系结构支持三种地址空间:Memory Address Space、I/O Address Space和Configuration Address Space。
  •     其中x86处理器可以直接访问的只有Memory Address Space和I/O Address Space。而访问Configuration Address Space则需要通过索引IO寄存器来完成。(在PCIe中,则引入了一种新的Configuration Address Space访问方式,直接映射到了Memory Address Space当中)
  •     虽然PCI支持32位的地址,但是由于x86的CPU只支持16位的I/O空间,这就限制了PCI的I/O Address Space最大只有64KB。
  •     每条PCI总线最多支持256个子总线(PCI桥)、每条PCI总线支持32个设备、每个PCI设备支持8种功能、每个功能都有256字节配置空间,因此计算出PCI总的配置空间大小:256*32*8*2565=16MB

PCI总线配置周期产生和配置寄存器:http://blog.chinaaet.com/justlxy/p/5100053220

  •     这一章主要讲了PCI的配置周期需要做的步骤:写入要操作的配置寄存器的地址(总线号、设备号、功能号、寄存器指针)、写入读或者写的数据。
  •     每一个PCI功能包含256字节配置空间,其中前64字节称为Header,剩余的192字节用于一些可选功能。
  •     PCI有两种类型的Header:Type0和Type1。Type1表示PCI桥(只有两个BAR),Type0表示普通的PCI设备(有6个BAR,一般只用2~3个BAR)。

66MHz的PCI总线与其技术瓶颈:http://blog.chinaaet.com/justlxy/p/5100053221

  •     这一章解释了PCI没落的原因和PCIe的强势崛起。
  •     为了能够支持更高的带宽,PCI将频率提高到了66MHz,带来的后果就是总线负载能力的降低,结果就是PCI总线只能支持一个PCI插卡设备。为了增加系统的PCI设备数,就需要额外的增加PCI桥。

PCI-X总线基本概念:http://blog.chinaaet.com/justlxy/p/5100053224

  •     这一章主要介绍了PCI-X,它在PCI的基础上发展而来,提高了PCI总线性能,时钟频率提高到133MHz,但是PCI-X很少得到应用(高功耗、高成本、引脚过多、复杂PCB设计...PCIe时代到来)

PCIe总线基本概念:http://blog.chinaaet.com/justlxy/p/5100053225

  •     这一章主要介绍了PCIe总线。其中,PCIe是高速串行总线。实际上,不仅是PCI总线到PCIe总线,高速串行总线取代传统并行总线是一个大的趋势。
  •     和很多的串行总线一样,PCIe采用了全双工的传输设计,即允许在同一时刻,同时进行发送和接收数据。
  •     与绝大部分的高速连接一样,PCIe采用了差分对进行收发,以提高总线的性能。
  •     除了差分总线,PCIe还引入了嵌入式时钟的技术(Embedded Clock),即发送端不再向接收端发送时钟,但是接收端可以通过8b/10b的编码从数据Lane中恢复出时钟。
  •     PCIe相对于PCI总线的另一个大的优势是其的Scalable Performance,即可以根据应用的需要来调整PCIe设备的带宽。
  •     和PCI-X总线一样,由于非常高的传输速度,PCIe是一种点对点连接的总线,而不像PCI那样的共享总线。但可以通过SWITCH连接多个PCIe设备,也可以通过PCIe桥连接PCI和PCI-X设备。

PCIe总线怎样做到在软件上兼容PCI总线:http://blog.chinaaet.com/justlxy/p/5100053245

  •     这一章主要解释了PCIe如何做到软件上的兼容PCI。
  •     PCIe总线完整的继承了PCI总线中的配置空间(Configuration Header)的概念。
  •     PCIe的Header基本上与PCI的Header是一致的,只有少许差别。但是这些差别并不影响PCIe对PCI的兼容性(还有PCIe到PCI桥对其进行处理)。
  •     需要特别说明的是,Root Complex(RC or Root)和Switch都是全新的PCIe中的概念,它们结构中的每一个端口(Port)都可以对应于PCI总线中的PCI-to-PCI桥的概念。

PCIe总线体系结构入门:http://blog.chinaaet.com/justlxy/p/5100053246

  •     PCIe体系结构包括应用层、事务层(Transaction Layer)、数据链路层(Data Link Layer)和物理层(Physical Layer)。
  •     事务层(Transaction Layer):接收端的事务层负责事务层包(Transaction Layer Packet,TLP)的解码与校检,发送端的事务层负责TLP的创建。此外,事务层还有QoS(Quality of Service)和流量控制(Flow Control)以及Transaction Ordering等功能。
  •     数据链路层(Data Link Layer):数据链路层负责数据链路层包(Data Link Layer Packet,DLLP)的创建,解码和校检。同时,本层还实现了Ack/Nak的应答机制。
  •     物理层(Physical Layer):物理层负责Ordered-Set Packet的创建于解码。同时负责发送与接收所有类型的包(TLPs、DLLPs和Ordered-Sets)。当前在发送之前,还需要对包进行一些列的处理,如Byte Striping、Scramble(扰码)和Encoder(8b/10b for Gen1&Gen2, 128b/130b for Gen3& Gen4)。对应的,在接收端就需要进行相反的处理。此外,物理层还实现了链路训练(Link Training)和链路初始化(Link Initialization)的功能,这一般是通过链路训练状态机(Link Training and Status State Machine,LTSSM)来完成的。

PCIe总线事务层入门(一):http://blog.chinaaet.com/justlxy/p/5100053247

  •     这一章介绍了TLP的几种类型以及TLP的包结构。
  •     PCIe总线的通信机制分为Posted和Non-Posted型。
  •     所谓Non-posted,就是Requester发送了一个包含Request的包之后,必须要得到一个包含Completion的包的应答,这次传输才算结束,否则会进行等待。所谓Posted,就是Requester的请求并不需要Completer通过发送包含Completion的包进行应答,当然也就不需要进行等待了。很显然,Posted类型的操作对总线的利用率(效率)要远高于Non-Posted型。但是这并不意味着Posted类型的操作不需要Completer进行应答,只是此时Completer采用了另一种应答机制——Ack/Nak的机制。
  •     那么为什么要分为Non-Posted和Posted两种类型呢?对于Memory Writes来说,对效率要求较高,因此采用了Posted的方式。
  •     介绍了TLP包结构。

PCIe总线事务层入门(二):http://blog.chinaaet.com/justlxy/p/5100053248

  •     这一章详细介绍了Posted和Non-Posted传输流程。

PCIe总线事务层入门(三):http://blog.chinaaet.com/justlxy/p/5100053249

  •     PCIe Spec中为每一个包都分配了一个优先级,通过TLP的Header中的3位(即TC,Traffic Class),TC值越大,表示优先级越高,对应的包也就会得到优先发送。
  •     Switch会先传输优先级高的数据包,Switch的这种判决操作叫做端口仲裁(Port Arbitration)
  •     PCIe总线中要求接收方必须经常(在特定时间)向发送方报告其VC Buffer的使用情况。而报告的方式是,接收方向发送方发送Flow Control的DLLP(数据链路层包),且这种DLLP的收发是由硬件层面上自动完成的,并不需要人为的干预。(这些VC Buffer的使用情况对于应用层(软件层)也是可见的)
  •     采用Flow Control机制的PCIe总线,相对于PCI总线获得了更高的总线利用率。虽然增加了Flow Control DLLP,但是这些DLLP对带宽的占用极小,几乎对总线利用率没有什么影响。

PCIe总线数据链路层入门:http://blog.chinaaet.com/justlxy/p/5100053250

  •     数据链路层(Data Link Layer)主要进行链路管理(Link Management)、TLP错误检测,Flow Control和Link功耗管理。
  •     数据链路层不仅可以转发来自事务层的包(TLP),还可以直接向另一个相邻设备的数据链路层直接发送DLLP,比如应用于Flow Control和Ack/Nak的DLLP。
  •     数据链路层实现了一种自动的错误校正功能,即Ack/Nak机制。发送方会对每一个TLP在Replay Buffer中做备份,直到其接收到来自接收方的Ack DLLP,确认该DLP已经成功的被接受,才会删除这个备份。如果接收方发现TLP存在错误,则会向发送发发送Nak DLLP,然后发送方会从Replay Buffer中取出数据,重新发送该TLP。

PCIe总线物理层入门:http://blog.chinaaet.com/justlxy/p/5100053261

  •     来自数据链路层的TLP和DLLP(这里所说的TLP和DLLP指的是包的原始发送者发的包)都会被临时放入物理层的Buffer中,并被加上起始字符(Start & End Characters),这些起始字符有的时候也被称为帧字符(Frame Characters)。
  •     物理层完成的一个重要的功能就是8b/10b编码和解码(Gen1 & Gen2),Gen3及之后的PCIe则采用了128b/130b的编码和解码机制。
  •     需要注意的是,PCIe物理层处理可以转发LTP和DLLP之外,还可以直接发送命令集(Ordered Sets)。

一个Memory Read操作的例子:http://blog.chinaaet.com/justlxy/p/5100053263

  •     简单描述一下PCIe传输的例子(对之前的事务层、链路层、物理层)
  •     RC侧的应用层会向事务层发送如下信息:32位(或者64位)的Memory地址,事务类型(Transaction Type),数据量(以DW为单位),TC(Traffic Class,即优先级),字节使能(Byte Enable)和属性信息(Attributes)等。
  •     RC侧的事务层使用这些信息创建了一个Mrd TLP(Memory Read的事务层包),并将RC侧的ID(BDF,Bus & Device & Function)写入到该TLP的Header中,以便EP侧根据这一BDF将Completion信息返回给RC。(然后这个TLP会根据其TC的值被放到对应的VC Buffer中,Flow Control逻辑便会检车接收端的对应的接收VC Buffer空间是否充足。一旦接收端的VC Buffer空间充足,TLP便会准备被向接收端发送。)
  •     RC侧的数据链路层(Data Link Layer)收到TLP包的时候,数据链路层会为其添加上12位的序列号(Sequence Number)和32位的LCRC。并将添加上这些信息之后的TLP(即DLLP)在Replay Buffer中做一个备份,并随后将其发送至物理层。
  •     RC侧的物理层收到DLLP后,为其添加上起始字符(Start & End Characters,又叫帧字符,Frame Characters),然后依次进行解字节(Strip Byte)、扰码(Scramble)、8b/10b编码并进行串行化,随后发送至相邻的PCIe设备的物理层。
  •     ---------------------------------------------
  •     EP侧的物理层接收到数据之后,依次执行与发送端相反的操作。并从数据中恢复出时钟,然后将恢复出来的DLLP发送至数据链路层。
  •     EP侧的数据链路层首先检查DLLP中的LCRC,如果存在错误,则向Requester发送一个Nak类型的DLLP,该DLLP包含了其接受到的DLLP中的序列号(Sequence Number)。Requester的数据链路层接收到来自Completer的Nak DLLP之后,从中找到序列号(Sequence Number),并根据序列号在Replay Buffer找到对应的DLLP,然后将其重新发送至Completer。如果Completer的数据链路层没有检查到LCRC的错误,也会向Requester发送一个Ack类型的DLLP,该DLLP同样包含了其接收到的DLLP中的序列号。Requester的数据链路层接收到之一Ack DLLP之后,便会根据其中的序列号在Replay Buffer中找到对应的DLLP的备份,并将其丢弃(Discard)。
  •     EP侧的数据链路层正确的接收到了来自Requester的DLLP(包含TLP的)时,随后将其进一步发送至事务层,事务层检查ECRC(可选的),并对TLP进行解析,然后将解析后的信息发送至应用层(软件层)。
  •     EP侧的应用层会根据接受到的信息进行相应的处理,处理完成后会将数据发送至事务层,事务层根据这一信息创建一个新的TLP(即CplD,Completion with data)。并根据先前接收到的TLP中的BDF信息,找到原来的Requester,然后将CplD发送至该Requester。这一发送过程与Requester向Completer发送TLP(Mrd Request)的过程基本是一致的。

 


整理的一部分PCI、PCIe基础知识

 

PCI基础知识:
    1.PCI总线的组成:HOST桥、PCI桥、PCI设备、
    2.PCI桥的作用可以隔离PCI设备,不影响各条总线的带宽
    3.总线x1上的通讯和总线x2上的通讯无关,同一条总线上的设备可以自由通讯;
    4.如果PCI桥出现问题,那么PCI桥下的设备之间可以自由通讯但是无法将数据发送到外面
    5.PCI的可扩展性指的是PCI总线上可以挂个PCI桥,然后PCI桥会推出另一条PCI总线,PCI总线上又可以挂载PCI桥,再推出PCI总线...(但是,PCI总线以HOST主桥为树根,连接的设备上限为256,其中包括HOST桥和PCI桥)
    6.PCI总线上的设备都有自己的设备地址,处理器空间地址和PCI总线地址通过HOST主桥进行隔离。(HOST主桥中有很多的寄存器,可以使得处理器工作的频率和总线工作的频率不一样,通过寄存器缓存数据,当处理器需要访问PCI设备时,需要通过HOST主桥进行地址转换,把处理器地址转换成PCI总线地址,然后才能访问PCI设备;同理,PCI设备中的数据要想往外走,也要通过HOST主桥进行地址转换。说到底,HOST主桥就是一个桥梁)
    7.提一个概念:上游总线就是PCI桥靠近HOST主桥的一端总线、下游总线就是另外一端总线了
    8.PCI设备的地址可以由系统软件动态分配,解决了地址冲突。(每个PCI设备有一个独立的配置空间,里面有设备在总线上的地址;注:PCI桥的配置空间中有其PCI子树使用的地址范围)
    9.PCI总线上有多个设备,当他们需要通信时,都必须向PCI总线仲裁器提出申请,当得到允许后才能在总线中发送数据
    10.PCI总线上的设备可以通过四根中断请求信号INTA  INTB  INTC INTD向处理器发出中断请求;其中INTA是单功能设备,其他的是多功能设备;
    11.同一HOST桥中的设备可以通讯(HOST主桥可以通过设置Inbound寄存器来让不同的PCI总线域中的设备进行通讯)
    12.HOST主桥是用来隔离处理器的存储器域与PCI总线域的特殊桥片,管理PCI总线域。在其所管理的PCI设备中所有设备的配置空间都由HOST主桥通过配置读写总线周期访问的
    13.PCI设备与存储器直接进行数据交换的过程也被称为DMA。PCI总线进行DMA操作时,需要得到数据的大小和目的地址(PCI总线域的物理地址,HOST主桥会负责地址转换);
    14.PCI采用的是树型拓扑结构,每一个PCI device相当于树的一个结点或者叶子,对整个PCI Bus的遍历可以采用遍历树的算法,在对树进行遍历之后,可以获得整个PCI Bus的资源需求情况,从而进行统一的分配。
    15.PCI总线操作的一具典型的特点就是支持BURST传输。什么是BURST传输呢?首先你得知道PCI的数据总线和地址总线是复用的。这就是说在同样的总线上,一段时间是地址,一段时间是传输数据。如果没有BURST传输,那么完成一次数据传输之前都得发一次地址,这就是总线有一半的时间都在传地址,这使得总线和利用率很低。有了BURST传输,可以先发一个起始地址和数据长度N, 之后传输数据0~N-1就可以直接发数据,不用再发地址了。
    16.第一个16位表示域,第二个8位表示一个总线编号,第三个5位表示一个设备号,最后是3位,表示功能号。
    17.在系统引导阶段,PCI硬件设备保持未激活状态,但每个PCI主板均配备有能够处理PCI的固件,固件通过读写PCI控制器中的寄存器,提供了对设备配置地址空间的访问。
    18.配置地址空间的前64字节是标准化的,它提供了厂商号,设备号,版本号等信息,唯一标识一个PCI设备。
    19.当PCI核心得到这个数组后,会拿数组中的每一项跟从PCI配置空间中读取到的数据进行比对,从而为该驱动程序找到正确的设备
    20.


PCIE基础知识:
    1.pcie分多版本的,x1、x2、x4、x8、x16...各级之间传输速率呈倍数增加,但价格也呈倍增加。PCI-E的接口根据总线位宽不同而有所差异,包括X1、X4、X8以及X16,而X2模式将用于内部接口而非插槽模式。
    2.pcie传输和网络类似封装成包,有协议栈。
    3.pcie使用端到端的连接方式,正常设备与设备之间只能连接一个,但通过pcie桥可以扩展。
    4.pcie物理链路采用两组差分信号,
    5.pcie全称叫做:Peripheral Component Interconnect(外围组件互联),属于局部总线,主要功能就是连接外围设备
    6.重要:pcie总线有独立的地址空间,所以CPU想要通过pcie访问外围设备,需要对pcie的地址空间进行映射
    7.pcie的组成有:RC(根节点)、siwtch(pcie桥)、end(设备)...
    8.PCI是并行总线;PCI-X是并行总线;PCIe是高速差分总线

你可能感兴趣的:(驱动开发基础)