软件深化设计是什么 (软件篇-深化PCI与PCIe之二)

文章编号:8973 更新时间:2024-01-03 分类:互联网资讯 阅读次数:

资讯内容

PCI/PCIe软件界面

软件深化设计是什么软件篇深化PCI与PC

1。性能空间

PCIspec规则了PCI设施必定提供的独自地址空间:性能空间(configurationspace),前64个字节(其地址范畴为0x00~0x3F)是一切PCI设施必定允许的(有不少繁难的设施也仅允许这些),此外PCI/PCI-X还裁减了0x40~0xFF这段性能空间,在这段空间关键寄存一些与MSI或许MSI-X终止机制和电源治理相关的Capability结构。

前文提到过,PCI性能空间和内存空间是分别的,那么如何访问这段空间呢?咱们首先要对一切的PCI设施启动编码以防止抵触,理论咱们是以三段编码来区分PCI设施,即BusNumber,DeviceNumber和FunctionNumber,以后咱们简称他们为BDF。有了BDF咱们既可以惟一确定某一PCI设施。不同的芯片厂商访问性能空间的方法略有不同,咱们以Intel的芯片组为例,其经常使用IO空间的CF8h/CFCh地址来访问PCI设施的性能寄存器:

CF8h:CONFIG_ADDRESS。PCI性能空间地址端口。

CFCh:CONFIG_DATA。PCI性能空间数据端口。

CONFIG_ADDRESS寄存器格局:

31位:Enabled位。

23:16位:总线编号。

15:11位:设施编号。

10:8位:性能编号。

7:2位:性能空间寄存器编号。

1:0位:恒为00。这是由于CF8h、CFCh端口是32位端口。

如上,在CONFIG_ADDRESS端口填入BDF,即可以在CONFIG_DATA上写入或许读出PCI性能空间的内容。

PCIe规范在PCI规范的基础上,将性能空间裁减到4KB。原来的CF8/CFC方法依然可以访问一切PCIe设施性能空间的头255B,然而该方法访问不了剩下的(4K-255)性能空间。怎样办呢?Intel提供了另外一种PCIe性能空间访问方法:经过将性能空间映射到MemorymapIO(MMIO)空间,对PCIe性能空间可以像对内存一样启动读写访问了。如图

这样再加上PCI板子上的RAM或许ROM,整个PCIeDevice空间如下图:

MMIO这段空间有256MB,由于依照PCIe规范,允许最多256个buses,每个Bus允许最多32个PCIdevices,每个device允许最多8个function,也就是说:占用内存的最大值为:256*32*8*4K=256MB。在台式机上咱们很多时刻感觉占用256MB空间太糜费(形成4G以下memory可用空间变少,只管实践memory可以映射到4G以上,但对32位OS影响很大),PCIBus也没有那么多,所以可以设置成最低64MB,即最多64个Bus。那么这个256MB的MMIO空间在在哪里呢?咱们以Intel的Haswell平台为例:

其中PCIEXBAR就是这个MMIO的起始位置,在4G上方占据64MB/128MB/256MB空间(4G以上局部不在本文范畴内,咱们今后会详细引见固件中的内存规划),其详细位置可以由平台启动设置,设置寄存器普通在Rootcomplex(下文简称RC)中。

假设大家遗记RC,可以参考前文配件局部的典型PCIe框图。

RC是PCIe体系结构的一个关键组成部件,也是一个较为凌乱的概念。RC的提出与x86解决器系统亲密相关,PCIe总线规范中触及的RC也以x86解决器为例启动说明,而且一些在PCIe总线规范中出现的最新性能也在Intel的x86解决器系统中率先成功。理想上,只要x86解决器才存在PCIe总线规范定义的规范RC,而在少数解决器系统,并不含有在PCIe总线规范中触及的,与RC相关的所有概念。

在x86解决器系统中,RC外部集成了一些PCI设施、RCRB(RCRegisterBlock)和EventCollector等组成部件。其中RCRB由一系列的寄存器组成的大杂烩,而仅存在于x86解决器中;而EventCollector用来解决来自PCIe设施的失误信息报文和PME信息报文。RCRB的访问基地址普通在LPC设施寄存器上设置。

假设将RC中的RCRB、内置的PCI设施和EventCollector去除,该RC的关键性能与PCI总线中的HostBridge相似,其关键作用是成功存储器域到PCI总线域的地址转换。然而随着虚构化技术的引入,尤其是引入MR-IOV技术之后,RC的成功变自得外复杂。

2。BAR空间

如今咱们来看看在性能空间里详细有些什么。咱们以一个普通的type0(非Bridge)设施为例:

其中DeviceID和VendorID是区分不同设施的关键,OS和UEFI在很多时刻就是经过婚配他们来找到不同的设施驱动(ClassCode有时也起必定作用)。为了保障其惟一性,VendorID应当向PCI特意兴味小组(PCISIG)放开而获取。

咱们重点来了解一下这些BaseAddressRegisters(BAR)。BAR是PCI性能空间中从0x10到0x24的6个register,用来定义PCI须要的性能空间大小以及性能PCI设施占用的地址空间。

每个PCI设施在BAR中形容自己须要占用多少地址空间,UEFI经过一切设施的这些信息构建一张完整的相关图,形容系统中资源的调配状况,而后在正当的将地址空间性能给每个PCI设施。

BAR在bit0来示意该设施是映射到memory还是IO,bar的bit0是readonly的,也就是说,设施寄存器是映射到memory还是IO是由设施制作商选择的,其他人不可修正

下图是BAR寄存器的结构,区分是Memory和IO:

BAR经过将某些位设置为只读,且0来示意须要的地址空间大小,比如一个PCI设施须要占用1MB的地址空间,那么这个BAR就须要成功高12bit是可读写的,而20-4bit是只读且位0。地址空间大小的计算方法如下:

向BAR寄存器写全1

读回寄存器外面的值,而后clear上图中不凡编码的值,(IO中bit0,bit1,memory中bit0-3)。

对读回来的值去反,加一就获取了该设施须要占用的地址内存空间。

这样咱们就可以在构建一张大表,用于记载一切PCI设施所须要的空间。这也是PCI枚举的关键义务之一。另外别遗记设置Command寄存器enable这些BARs。

3。PCI桥设施

PCI桥在PCI设施树中起到呈上起下的作用。一个PCI-to-PCI桥它的性能空间如下:

留意其中的三组绿色的BUSNumber和多组黄色的BASE/Limit对,它选择了桥和桥上方的PCI设施子树相应/被调配的Bus和各种资源大小和位置。这些值都是由PCI枚举程序来设置的。

4。Capabilities结构

PCI-X和PCIe总线规范要求其设施必定允许Capabilities结构。在PCI总线的基本色能空间中,蕴含一个CapabilitiesPointer寄存器,该寄存器寄存Capabilities结构链表的头指针。在一个PCIe设施中,或许含有多个Capability结构,这些寄存器组成一个链表,其结构如图:

PCIe的各种个性如MaxPayload、CompleteTimeout(CTO)等等都经过这个链表链接在一同,CapabilitiesID由PCIespec规则。链表的好处是假设你不关心这个Capabilities(或不知道怎样解决),间接跳过,解决关心的即可,兼容性比拟好。另外裁减性也强,新加的性能不会固定放在某个位置,淘汰的性能删掉即好。

5。PCI枚举

PCI枚举是个始终递归调用发现新设施的环节,PCI枚举繁难来说关键包括上方几个步骤

应用深度优先算法遍历整个PCI设施树。从RootComplex登程,寻觅设施和桥。发现桥后设置Bus,会发现一个PCI设施子树,递归回到A)

递归的环节中经过读取BARs,记载一切MMIO和IO的需求状况并予以满足。

设置必要的Capabilities

在整个环节完结后,一颗完整的资源调配终了的树就建设好了。

6。地址译码

在PCI总线中定义了两种地址译码方式,一个是正向译码,一个是负向译码。当访问BusN时,其下的一切PCI设施都将对出如今地址周期中的PCI总线地址启动译码。假设这个地址在某个PCI设施的BAR空间中命中时,这个PCI设施将接纳这个PCI总线恳求。这个环节也被称为PCI总线的正向译码,这种方式也是大少数PCI设施所驳回的译码方式。

然而在PCI总线上的某些设施,如PCI-to-(E)ISA桥(或LPC)并不经常使用正向译码接纳来自PCI总线的恳求,PCIBUSN上的总线事务在三个时钟周期后,没有获取任何PCI设施照应时(即总线恳求的PCI总线地址不在这些设施的BAR空间中),PCI-to-ISA桥将主动地接纳这个数据恳求。这个环节被称为PCI总线的负向译码。可以启动负向译码的设施也被称为负向译码设施。

在PCI总线中,除了PCI-to-(E)ISA桥可以作为负向译码设施,PCI桥也可以作为负向译码设施,然而PCI桥并不是在任何时刻都可以作为负向译码设施。在绝大少数状况下,PCI桥无论是解决来自抢先总线(upstream),还是解决来自下游总线(downstream)的总线事务时,都经常使用正向译码方式。如图:

在某些不凡运行中,PCI桥也可以作为负向译码设施。PCI总线规则经常使用负向译码的PCI桥,其BaseClassCode寄存器为0x06,SubClassCode寄存器为0x04,而Interface寄存器为0x01;经常使用正向译码方式的PCI桥的Interface寄存器为0x00。

如笔记本在衔接Dock插座时,也经常使用了PCI桥。由于在大少数状况下,笔记本与Dock插座是分别经常使用的,而且Dock插座上衔接的设施多为慢速设施,此时用于衔接Dock插座的PCI桥经常使用负向译码。在该桥治理的设施并不介入解决器系统对PCI总线的枚举环节。当笔记本拔出到Dock之后,系统软件并不须要从新枚举Dock中的设施并为这些设施调配系统资源,而仅须要经常使用负向译码PCI桥治理好其下的设施即可,从而极大降落了Dock对系统软件的影响。

UEFI对PCI/PCIe的允许

UEFI关于PCI总线的允许包括以下三个方面:

1)提供调配PCI设施资源的协定(Protocol)。

2)提供访问PCI设施的协定(Protocol)。

3)提供PCI枚举器,枚举PCI总线上的设施以及调配设施所需的资源。

4)提供各种Lib,繁难驱动程序访问PCI/PCIe性能空间或许MMIO/IO空间。

1.PCI驱动

UEFIBIOS提供了两个关键的模块来允许PCI总线,一个是PCIHostBridge控制器驱动,另一个是PCI总线驱动。

PCIHostBridge控制器驱动是跟特定的平台配件绑定的。依据系统实践I/O空间和memorymap,为PCI设施指定I/O空间和Memory空间的范畴,并且发生PCIHostBridgeResourceAllocation协定(Protocol)供PCI总线驱动经常使用。该驱动还对HostBridge控制器下一切RootBridge设施发生句柄(Handle),该句柄上装置了PciRootBridgeIoProtocol。PCI总线驱动则应用PciRootBridgeIoProtocol枚举系统中一切PCI设施,发现并取得PCI设施的OptionRom,并且调用PCIHostBridgeResourceAllocation协定(Protocol)调配PCI设施资源。PCIHostBridgeResourceAllocation协定的成功是跟特定的芯敌对台相联合的,毕竟只要平台一切者才知道资源从哪里来和有多少。每一个PCIHostBridgeController上方可以接一个或许多个PCIrootbridges,PCIRootBridge会发生PCIlocalBus。正如咱们前文举得例子,如Intel志强第三代四路主机,共四颗CPU,每个CPU都被划分了共享但区隔的Bus,PCII/O,PCIMemory范畴,其形成可以示意成如下图:

其余状况可见上文。PCI设施驱动不会经常使用PCIRootBridgeI/O协定访问PCI设施,而是会经常使用PCI总线驱动为PCI设施发生的PCIIOProtocol来访问PCI设施的IO/MEMORY空间和性能空间。PCIRootBridgeI/O协定(Protocol)是装置在RootBridge设施的句柄上(handle),同时在该handle上也会有标明RootBridge设施的DevicePath协定(Protocol),如下图所示

PCI总线驱动在BDS阶段会枚举整个PCI设施树并调配资源(BUS,MMIO和IO等),它还会在不同的枚举点调用Notifyevent通知平台,平台的Hook可以挂接在这些点上做些不凡的举措。详细各种点的定义请参阅UEFIspec。

PCIbus驱动在这里:tianocore/edk2

在MdePackage下有很多PCIlib。有Cf8/CFC方式访问性能空间的,有PCIe方式访问的。都有些许不同。留意Cf8/CFC只能访问255以内的,而PCIe方式访问的要性能正确PCIebaseaddressPCD。

结语

本篇没有引见下列内容,以后无时机再补。

1.Non-transparentbridge

3.各种PCIe的feature

4.MSI终止解决

假设你还感觉意犹未尽,细心理考一下上方这些疑问并找找资料有助于你更深化了解PCI/PCIe

1.前文说过,PCIe的速度和Lane的数目是在Training的时刻由RootPort和EndPoint协调获取的。那这个Training的环节出当初什么时刻呢?(揭示,HardStrap,SoftStrap,WaitforBIOS/Bifurcation)。

2.UEFIPCIBus枚举出当初BDS阶段,很靠后。那咱们假设在芯片初始化阶段须要对PCI设施MMIO空间的寄存器甚至Bridge前面的设施做些设置,该怎样办呢?

BIOS培训云课堂

欢迎大家关注本专栏和用微信扫描下方二维码添加微信群众号"UEFIBlog",在那里有最新的文章。

用微信扫描二维码添加UEFIBlog群众号
标签: UEFI计算机技术计算机组成原理

本文地址: https://yihaiquanyi.com/article/8eb8235691cbb7827f2d.html

上一篇:l2cacheverilogL2Cache终究在哪里L3L1...
下一篇:ueficsmUEFI面前的历史...

发表评论