首页 理论教育PCIExpress体系结构导读中的小结

PCIExpress体系结构导读中的小结

【摘要】:[1]本节出现的Switch指传统的Switch,在MR-IOV规范定义的Switch与此并不相同,详见第13.3.2节。[4]这种方式也可以被认为是SoC平台总线从共享总线结构升级到Switch结构。[10]该表存在于PCI Express Extended Capabilities结构中,详见第4.3.3节。[14]从体系结构的角度上看,MCH和ICH仅仅是一个称呼,实际上并不重要。[36]如图4-1所示,发送端和接收端都有相应的发送逻辑和接收逻辑。[39]在正常情况下,接收逻辑RX的DC共模电压为0,ZRX-DC虽然较小也不会影响其正常工作。

本章简单介绍了PCIe总线与虚拟化技术相关的内容。读者需要获得与处理器相关的虚拟化知识后,才能进一步理解这些内容。囿于篇幅,本章没有进一步介绍虚拟化技术的实现细节。

第II篇的内容到此告一段落,在本篇中较为详细地介绍了PCIe总线的层次结构,流量控制机制,电源管理、序和死锁以及虚拟化技术等一系列内容。本篇的内容并不局限于PCIe总线本身,希望读者可以从本篇中了解通用总线的设计与实现过程,以及值得注意的实现细节。

[1]本节出现的Switch指传统的Switch,在MR-IOV规范定义的Switch与此并不相同,详见第13.3.2节。

[2]所谓间接相连是指通过其他Switch再与RC相连。

[3]OCeaN是一个基于交叉矩阵的总线结构,连接在OCeaN中的外部设备可以直接通信,而不相互干扰。

[4]这种方式也可以被认为是SoC平台总线从共享总线结构升级到Switch结构。

[5]SRIO为串行RapidIO。

[6]PCIe端口之间的直接通信过程也称为Peer-to-Peer传送方式。

[7]PCIe总线中的Switch与网络应用的Switch的功能并不相同,而与网络应用中的Route功能接近。

[8]在PCIe体系结构中,RC和EP也需要处理QoS。

[9]有关多通路VC的详细说明见第9章。

[10]该表存在于PCI Express Extended Capabilities结构中,详见第4.3.3节。

[11]PCIe总线使用消息报文(PME Message)进行电源管理,PCIe设备不支持PME#信号。

[12]如果Data字段为0,也表示该PCIe设备不支持功耗的测量。

[13]在Montevina平台的数据手册中并没有提及这个FSB-to-PCI桥。

[14]从体系结构的角度上看,MCH和ICH仅仅是一个称呼,实际上并不重要。

[15]许多处理器和外部设备都使用了Microcode屏蔽CPU的实现细节,如Alpha处理器的PAL。

[16]x86处理器也将使用存储器映像寻址的寄存器称为MMIO(Memory Mapped I/O)。

[17]这段空间属于存储器域地址空间。

[18]该寄存器与PCI_CONFIG_ADDR寄存器类似,用来访问PCIe设备的配置空间。

[19]PowerPC处理器通过设置Inbound寄存器,也可以避免这个Cache一致性操作。

[20]FSB收到这类TLP后,不进行Cache一致性操作。

[21]存储器读请求TLP没有DataPayload字段,此时该TLP使用Length字段表示需要读取多少数据。

[22]当多个PCI设备共享一条PCI总线时,一个设备不会长时间占用PCI总线,这个设备在使用这条PCI总线一定的时间后,将让出PCI总线的使用权。

[23]PCIe总线实际上使用Transaction ID进行ID路由,有关Transaction ID的详细说明见第6.3.1节。

[24]PCIe链路采用端到端的通信方式,每一个链路只能挂接一个设备,因此在多数情况下,使用3位描述Device Number是多余的,因此PCIe总线提出了ARI格式,该格式的详细描述见第6.3.1节。

[25]智能设备中含有一个功能较强的处理器,目前高端显卡、网卡上都包含一个处理器,这类设备都可以被称为智能设备。

[26]MSI或者MSI-X中断请求使用存储器写请求TLP。

[27]这是流量控制Infinite FC Unit的要求,详见第9.3.2节。

[28]有些PCIe设备可能没有Link Control寄存器。

[29]PCIe规范将这个Replay Buffer称为Retry Buffer。

[30]数据链路层为提高PCIe链路的利用率,并不会每成功接收一个TLP后,都发送一个ACK DLLP。

[31]ACKNAK_LATENCY_TIMER计数器的阈值是REPLAY_TIMER阈值的1/3,可以保证接收端至少可以重发两次ACD DLLP给发送端。

[32]注意是重发ACK DLLP而不是NAK DLLP。

[33]参见基尔霍夫第一定律。

[34]使用单端数据总线进行长距离传递时,每两根单端信号线之间使用一根地线隔离。

[35]通常交流电压使用有效值表示。

[36]如图4-1所示,发送端和接收端都有相应的发送逻辑(TX)和接收逻辑(RX)。

[37]Elastic Buffer也被称为Elasticity Buffer或者Synchronization Buffer。

[38]因为本地时钟与“被恢复的”时钟间可能相差600ppm。

[39]在正常情况下,接收逻辑RX的DC共模电压为0,ZRX-DC虽然较小也不会影响其正常工作。

[40]不包括FLR方式,因为该复位并不影响LTSSM状态机

[41]upc onfigure_capable状态位在Configuration状态收到“Link Upconfigure Capability”为1的TS2序列后将设置为1,否则为0。

[42]Receiver Dete ction序列的发送方法见第8.1.3节。

[43]此时发送逻辑TX使用在Detect状态中,已经正确识别的Lane发送这些TS1序列。

[44]这些TS1序列将被链路对端设备回传,因为此时TS1序列使用的Loopback位为1。

[45]由于PCIe链路支持Polarity Inversin,因此也可能收到TS1序列的补码。

[46]PCIe设备不可能从Polling状态进入Loopback状态,因此接收逻辑RX收到Loopback位为1的TS1序列并不会进入到LTSSM的Loopback状态。

[47]此时Switch中包含2个LTSSM状态机,也相应具有2个物理层、链路层和事务层。

[48]前4个Lane的Link Number为0,而后4个Lane的Link Number为1。

[49]该PCIe链路可能由部分Lane组成,如与Device A连接的链路由Lane 0~3组成,与Device B连接的链路由Lane4~7组成。

[50]m≤n,因为下游设备可能只使用PCIe链路的部分Lane。

[51]PEX8518是PLX公司设计的Switch芯片

[52]如果PCIe设备需要改变数据传送率时,可以在Recovery状态中进行更改,但是在Configuration状态不能进行该操作。

[53]当空闲时间不大于7μs时,将进入L0s状态,但是PCIe总线并没有规定进入L0s状态的最小时间。

[54]对端没有提供足够的Credit时,发送端不能发送TLP。

[55]Beacon信号并不是实际信号,而是通过D+和D-信号发送的一个频率在30KHz~500MHz之间的脉冲信号,该信号可以唤醒PCIe设备。在许多PCIe设备中,并不含有WAKE#信号,此时需要使用Beacon机制唤醒PCIe设备。

[56]当前PCIe链路为2.5GT/s时发送1个EIOS序列,否则发送2个EIOS序列。(www.chuimin.cn)

[57]如果Link Control寄存器的Extended Sync位为1时,发送部件将向对端发送4096个FTS序列。

[58]PCIe规范规定这段延时为TTX-IDLE-MIN(最小值为20ns)。

[59]发送Credit的详细说明见第9章流量控制。

[60]在本节的实例中,5×MCR≤1。即所有VC使用的MCR之和小于或等于链路总带宽。

[61]在网络系统中,Current节点可能对应多个Downstream节点。

[62]多条VC可以复用N3缓冲,因为多条VC对应一条物理链路。但是必须提供独立的N2缓冲。

[63]如果RC支持Peer-to-Peer传送方式。

[64]PCIe总线规定每隔34μs发送一组InitFC报文。

[65]相当于N23算法的N3等于2[Field Size]/2,此时可以防止Current节点的Underrun。但是PCIe总线并没有规定发送Credit的频率。

[66]通过发送Assert_INTx和Deassert_INTx消息报文进行中断请求,即虚拟中断线方式。

[67]MSI机制提交中断请求的方式类似于边界触发方式,而使用边界触发方式时,处理器可能会丢失某些中断请求,因此在设备驱动程序的开发过程中,可能需要使用这两个字段。

[68]PowerPC处理器中含有许多模块,如千兆以太网、ATM等,这些模块包含在芯片内部,由这些内部模块发起的中断请求,被称为内部中断请求。

[69]该窗口的大小为1MB,其基地址由PEXCSRBAR寄存器确定。

[70]在Linux PowerPC中使用immr_base变量保存该寄存器。IMMR寄存器是PQ2处理器使用的寄存器,该寄存器在PQ3之后的处理器中升级为CCSRBAR。

[71]该函数来自Linux 2.6.30.5内核。

[72]P4080处理器也提供了一种类似于FSB Interrupt Message总线事务的中断请求方法。

[73]与I/O APIC的IRQX#引脚链接的外部设备。

[74]该寄存器在存储器域和PCI总线域中的地址都为0xFEC00020。

[75]其中xx表示APIC ID,而y为RH+DM。

[76]I/O和配置写总线事务使用DWR。

[77]不同的TC可能会共用一个VC,而一个TC只能使用一个VC。TC和VC的对应关系是多对一的关系。如TC1和TC2可以都可以使用VC1,而TC1不能在使用VC0的同时还使用VC1。

[78]该位在Device Capabilities 2寄存器中。

[79]假设设备A的Max_Read_Request_Size参数为256B,而设备B可以为RC也可以为普通的EP。

[80]TLP1~3使用的Requester ID不同,因此在IDO模型中,没有序的要求。

[81]PLX是PCIe Switch芯片的主要提供商。

[82]Capric卡可以使用Legacy INTx或者MSI方式进行中断请求。

[83]LogiCORE规定Max_Payload_Size为512B。

[84]LogiCORE规定Max_Read_Request_Size为512B。

[85]Capric卡也可以使用多个MSI报文(Multiple Message),其中DMA写完成和读完成分别对应一个MSI报文,而无需查询,目前Linux系统并不支持PCIe设备的Multiple Message功能。

[86]数据区域的大小为数据尾地址-数据首地址+1,即0xFFF0-0200-0xFFF0-0003+1=0x1FE。

[87]这段数据区域的有效长度小于等于0x80,即M≤0x20。

[88]如果B>Tail4096(A)时,表示当前数据区域超越4KB边界。

[89]在LogiCORE中该参数为512B。

[90]Cornus卡是一个基于PCIe总线的以太网卡,支持多通路DMA读写操作。

[91]因为tag_queue队列的长度为256。

[92]一个存储器读请求TLP可能对应若干个存储器读完成TLP。

[93]采用哪种对界方式与RCB参数相关,不同处理器使用的RCB参数并不相同。

[94]这些pci_dev结构在Linux系统对PCI总线枚举时建立。在加载Capric卡驱动程序之前,这些pci_dev结构已经存在。Linux系统对PCI总线的枚举过程见第14.3节。

[95]如果该PCI设备没有使用MSI或者MSI-X机制时,才进行这种操作。

[96]本书分别用Linux PowerPC和Linux x86代表基于PowerQUICC(32位)和x86处理器的Linux系统。

[97]该步骤如pmac_pci_enable_device_hook函数所示。

[98]Linux 2.6.31内核提供的pci_enable_msi_block函数也仅支持一个中断向量。

[99]VT-d是指Intel的Virtualization Technology for Directed I/O技术,而AMD将这一技术称为IOMMU。下文将这些技术都简称为IOMMU。

[100]有些处理器不支持硬件的Cache共享一致性,如一些低端的ARM处理器。

[101]目前大多数PCIe设备进行DMA操作时,No Snoop Attribute位都为0。

[102]以E500 V2内核为例。

[103]在SMP系统中,Cache行的状态转换更为复杂。

[104]该公式没有计算物理层和数据链路层报文头的开销。

[105]实际上LogiCORE只能使用100MHz或者250MHz的内部时钟,但是笔者没有无法在FPGA内部运行250 MHz的时钟频率。

[106]X可以被128整除。

[107]在Tylersburg EP平台中,这个系统延时大于250ns。

[108]X可以被64整除。

[109]包括SMP系统和更为复杂的NUMA结构处理器系统。

[110]本章出现的IA处理器是指Intel的x86-64处理器,而不是指Itanium处理器。

[111]ATPT相当于I/O页表,每一个Domin都具有独立的I/O页表。

[112]如果处理器系统有多个PCI总线树(Segment),则需要设备多个Root Entry Table。

[113]其中PCI设备使用Bus Number、Device Number和Function Number组成16位的Device ID,而HT设备使用HT Bus Number和Unit ID组成16位的Device ID。