大家好,欢迎来到IT知识分享网。
一、PCI/PCIE
1.1 PCI/PCIe简介
PCI(Peripheral Component Interface,PCI)的中文为外围组件互联,所谓的外围组件指的是CPU、内存和芯片组以外的设备,这些设备通常通过各种接口连接到计算机的主板上,以扩展计算机的功能和性能,例如磁盘、网卡、声卡、显卡等。其主要目的是连接周边设备,将低速的设备与高速的处理器结合起来,以解决用户对数据传输速率越来越高的要求。PCIe (PCI Express),PCI扩展是在PCI的基础上发展而来的,最大的区别在于PCI采用并行传输,PCIE采用串行。
Link:两个PCIe设备之间的物理连接,一个link由多条lane组成,lane的数量决定了Link的宽度,即x值,例如8x Link表示包含8各lane 16x包含16个lane
PCIe采用双单工模式进行连接,即每条lane中有一条单路发送路径,一条单路接收路径。
1.2 PCIe 拓扑结构
PCie的拓扑如下图所示:
PCIe拓扑结构是一个树形拓扑,主要包含 Root Complex、PCIe BUS、Endpoint、Port and Bridge、Switch
Root Complex:是PCIe设备树的根节点,CPU通过它与PCIe的总线相连,并最终连接到所有的PCIe设备上。(现在基本上集成在CPU中)虽然是设备树的根节点,但Root Complex并不是只有一个。
PCIe总线(Bus):PCIe上的设备通过PCIe总线互相连接,PCIe Bus是一个点对点的网络,当Root Complex或者PCIe上的设备之间需要通信的时候,它们会与对方直接连接或者通过交换电路进行点对点的信号传输。
Endpoint:端点就是PCIe拓扑中的设备,不是交换机、桥接器,而是起作用的设备
Switch:交换机,作用就是拓展PCIe端口,并为挂在它上面的设备提供路由和转发功能。
Port and Bridge:
PCIe设备具有两种类型:type0表示最终端的设备,例如我们常见的显卡、网卡、声卡;type1表示switch或Root port,用来连接其它PCIe设备
1.3 BDF
BNF(Bus Number,Device Number,Function Number),PCIe上的所有设备,无论是type0还是type1,在系统启动的时候,都会分配一个唯一的地址,它由三部分组成:
Bus Number:8bits,也就是最多256条总线
Device Number:5bits,最多32个设备
Function Number:3bits,最多8个功能
二、UEFI环境下访问PCI/PCIe设备
2.1 与PCI/PCIe设备通信的机制
在这里主要讨论的是在UEFI环境下访问PCi和PCIe设备。站在软件工程师的角度,在访问PCI/PCIe设备时,只需要回答两个问题就行了。
(1)如何在系统中找到要访问的设备
(2)找到设备以后,如何访问设备内的寄存器或其它资源
2.1.1 如何找到PCIe设备呢?
在UEFI规范中,抽象了PCI的系统结构,典型的桌面系统的PCI架构如图所示:
一般的桌面系统只有一个PCI Host Bus(PCI主机总线),用于完成CPU和PCI设备之间的数据交换。PCI Root Bridge(PCI根桥)一般也只有一个,它管理一个局域总线,下挂一个PCI总线树。我们要访问的PCI设备,就挂在这颗总线树上,它们属于同一总线空间。如下所示:
PCI总线树上包含PCI总线、PCI桥和PCI设备。系统通过三段编码的方式进行编码,即通过Bus Number(总线号),Device Number(设备号)、Function(功能号)来编码,这种编码一般简称为 BDF码。BDF码在BIOS进行PCI总线扫描和枚举过程中确定,可以用来作为查找PCI设备的索引。
找到PCI设备后,如何确定此设备就是自己要找的设备呢?每个PCI设备,除了主总线桥外,都会实现配置空间(PCIe configuration space),在配置空间中,包含了设备厂商用来标识自身的Vendor ID(供应商ID)和Device ID(设备ID)。通过对比PCI设备的Vendor ID和Device ID可以确定所找的设备是否为目标设备。
以X86平台为例,可通过CONFG_ADDR寄存器(0xCF8)和CONFG_DATA寄存器(0xCFC),以BDF码的形式访问PCI设备,以得到设备的配置空间。
PCI设备的基本配置空间由64字节组成,地址范围为0x00~0x3F,主要用来识别设备、定义主机访问PCI卡的方式。 还包含了6个基地址寄存器,这组寄存器被称为BAR,保存了PCI设备使用的地址空间的基地址,也就是该设备在PCI总线域中的地址。每个设备最多有6个基址空间,但不一定全用。
BAR可寻址IO地址空间或者内存地址空间,其最低位为只读位,显示了可以访问哪种地址空间。
2.1.2 如何访问PCI设备内的寄存器和其他资源呢?
通过BAR寄存器,加上内部寄存器相对于BAR的偏移地址就可以得到PCIe设备内的各种寄存器或其他资源的位置了。在芯片手册中会提供内部资源的使用说明。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/129164.html