Linux内核PCIE
点击左上方蓝色“ 一口Linux ”,选择“ 设为星标 ”
作者: 小田BSP
本文主要是整理PCIE的基础知识。
一、PCI总线
在PC时代,为了解决CPU主频和外部设备访问速度的问题,发展了几代I/O总线:
1、第一代总线:ISA、EISA等
2、第二代总线:PCI、PCI-X等
3、第三代总线:PCIE、mPCIE、m.2等
PCI(Peripheral Component Interconnect),外部设备互联,Intel公司提出,主要功能是连接外部设备。PCI引脚如下:
PCI引脚
PCI总线特点如下:
1、PCI总线是并行总线,有32/64根地址线,地址和数据都是通过这32/64根地址线进行传输,分时复用
2、PCI总线上可同时挂载多个设备,设备分为主设备和从设备。主设备一般是主控芯片PCI控制器,需要负责PCI总线上的仲裁
3、PCI设备共享总线,通过片选引脚、地址范围、总线号、设备号、功能号等机制来确定当前和哪个设备通信。
4、PCI总线通信大致分为:配置阶段和地址访问阶段。
5、配置阶段:PCI总线控制器依次扫描连接在PCI总线上的所有设备,访问设备的配置空间,知道设备的类型、要申请的资源,然后给设备分配总线号、设备号、功能号、地址空间,并写进设备的配置空间。
6、地址访问阶段:在配置阶段,给每个PCI设备分配PCI地址范围,并写进设备寄存器,以后设备会监听地址线,当监听到地址线上传输的地址是自己的地址范围,就会处理。
7、PCI采用同步时序协议,信号线里有clk时钟线。
8、PCI有三个相互独立的物理地址空间:内存地址空间、I/O地址空间和配置空间。配置空间是PCI特有的一个物理空间,PCI设备支持即插即用。
9、PCI总线规范定义的配置空间总长度为256字节,前64字节的配置空间称为配置头,对于所有的设备都一样。配置头的主要功能是用来识别设备、定义主机访问PCI卡的访问方式(I/O访问或者存储器访问,还有中断信息),其余192字节称为本地配置空间(设备有关区),主要定义卡上局部总线的特性、本地空间基地址和范围等。
其中:
1)Vendor ID:厂商ID,FFFFh是一个非法厂商ID,根据它判断PCI设备是否存在。
2)Device ID:设备ID,某厂商生产设备的ID,驱动根据Vendor ID和Device ID找对应驱动程序。
3)Base Address0 ~ 5:简称BAR寄存器,保存PCI设备使用的PCI总线域的基地址。PCI设备复位后,BAR寄存器存放的是设备需要使用的地址空间大小、类型(I/O或MEM),如果是MEM则是否可预取(Prefectchable是否为1)
4)IRQ Line:IRQ 编号,支持管理24个中断。
5)IRQ Pin:中断引脚,PCI有4个中断引脚,该寄存器表示该设备连接的是哪个引脚。
PCI枚举过程:尝试所有的BUS/DEV/FUNC组合,判断厂商ID是否为FFFFh。
访问配置空间方法:
通过访问0xCF8h/0xCFCh端口实现。
1)0xCF8h:CONFIG_ADDRESS,PCI配置空间地址端口。CONFIG_ADDRESS寄存器格式:
31: Enable位
23~16:总线号
15~11:设备号
10~8:功能号
7~2:配置空间寄存器编号
1~0:0
2)0xCFCh:CONFIG_DATA,PCI配置空间数据端口。
二、PCIE介绍
PCIE(PCI Express)是在PCI的基础上发展而来,是目前PC和嵌入式系统中最常用的高速总线,PCIE与PCI是软件向后兼容,PCI的系统软件可以用在PCIe系统中。
PCIE采用的是树形拓扑结构,体系架构包括:root complex,switch、bridge和endpoint等类型的PCIE设备组成。PCIE总线拓扑结构如下:
Root Complex:根复合体,简称RC,CPU和PCIE之间的接口。RC位于PCIE倒立拓扑的根,并代表CPU与系统的其余部分进行通信。PCIE端口在配置空间中被标记为根端口。
Bridge:桥提供了与其他总线(如:PCI或PCI-X)的接口,允许旧的PCI或PCI-X卡插入新系统。反向桥接允许一个新的PCIE卡插入一个旧的PCI系统。
Switch:提供扩展或聚合能力,允许更多的设备连接到一个PCIE端口。充当包路由器,根据地址或其他路由信息识别给定包需要走哪条路径。是一种PCIE转PCIE的桥。
Endpoint:PCIE总线系统拓扑结构中的最末端,一般作为总线操作的发起者(initiator)或终结者(Completes)。Endpoint只能接受来自上级拓扑的数据包或向上级拓扑发送数据包。
PCIe插槽集中在PCIex1/x4/x8/x16四种上。
1)PCIex1插槽的长度是最短的,数据针脚14个。主要用途:独立网卡、独立声卡和USB3.0/3.1扩展卡。
2)PCIex4和x8插槽一样,现在多数做成PCIex16插槽,或扩展为M.2接口,用于安装M.2 SSD、M.2无线网卡。
3)PCIex8,为了兼容性PCIex8插槽通常做成PCIex16插槽的形式,但数据针脚只有一半是有效的。
4)PCIex16插槽主要用于显卡以及RAID阵列卡,向下兼容x1/x4/x8级别的设备。
在PCI总线中,所有需要提交中断请求的设备,必须能通过INTx引脚提交中断请求,MSI机制是一个可选机制。而PCIE总线中,PCIE设备必须支持MSI或MSI-X中断请求机制,而可以不支持INTx中断消息。
在PCIE总线中,MSI和MSI-X中断机制使用存储器写请求TLP向处理器提交中断请求。
三、PCIE地址空间
PCIE有三种主要的地址空间:memory-space,IO space和configuration space。
1)Memory space:数据存储内存空间(refetchable 和 Non-Prefetchable Memory Space)
2)IO Space:用于访问IO设备的内部寄存器/存储,已被MMIO机制代替,访问方式和Memory相同,且也分(refetchable 和 Non- Prefetchable Memory range)
3)Configuration Space:配置空间,通过bar寄存器控制Memory space映射
四、PCI和PCIE差异
1) 颜色
PCI接口通常是白色,PCIE接口一般用其他颜色。
2) 长度
PCIE接口要比PCI接口长。
3) 兼容性
PCIE在软件层面上兼容目前的PCI技术和设备。
4) 速度
PCI的工作频率:33MHZ和66MHZ,最大吞吐率264MB/s(66MHZ*32BIT/8)。
PCI-X的工作频率:66MHZ/100MHZ和133MHZ,最大吞吐率1064MB/s(133MHZ*64BIT/8)。
5) 传输方式
PCI是并行数据传输,一次传输4/8字节,半双工。
PCIE是串行数据传输,全双工。
6) 硬件
PCI信号是普通电平。
PCIE信号是差分电平。
7) 链路
PCI是总线的连接方式。
PCIE是点对点的连接方式。
8) 编码方式
PCIE gen1和gen2采用8bit/10bit编码方式,gen3以后采用128b/130b的编码方式。
9) Inbound和outbound
PCIE设备和系统内存相互访问时,outbound是指CPU到设备方向;inbound是指device到RC(CPU端)方向。CPU读写RC端的寄存器时,属于偏上系统的范围,不属于inbound或outbound。
10)PCI配置空间
PCI设备拥有256B的配置空间,PCIE还提供了另外4KB的扩展。256B的配置空间中前64B是规范的,其他是各厂商自己定义的。
PCI设备地址:
10.1)总线号:厂家ID
10.2)设备号:设备ID
10.3)功能号:设备类
11) PCIE配置空间
PCIE一共支持256条bus,32个dev和8个fun,和PCI相同。
PCIE设备发展向前兼容PCI,每个设备的配置空间前256B是PCI空间,后(4K-256)B的空间是PCIE控制空间。
Linux用同一套驱动代码处理PCI和PCIE驱动,只需要在配置、传输等底层操作去区分两种总线协议。
五、PCIE驱动
以RK3568 PCIE RC驱动为例。
1)compatible = "rockchip,rk3568-pcie", "snps,dw-pcie"
PCIE接口使用的是RC模式;EP模式
2)bus-range = <0x10 0x1f>
PCI bus地址范围从0x10到0x1f。
3)interrupts
中断号和中断名称。对应RK3568 中断号如下(-32):
4)interrupt-map-mask 和 interrupt-map
interrupt-map-mask 和 interrupt-map:标准PCI属性值,对应INTA ~ INTD(legacy 中断)
5)num-lanes = <1>
PCIE设备所使用的lane数量,默认不需要调整,软件自动探测并关闭不需要的lane以节省功耗。
6)max-link-speed = <3>
PCIE带宽版本,1表示Gen1;2表示Gen2;3表示Gen3,无需配置。
7)reset-gpios = <&gpio2 RK_PD6 GPIO_ACTIVE_HIGH>
PCIE接口的perst#复位信号,插槽和焊贴设备,都需要。必须配置。
8)msi-map = <0x1000 &its 0x1000 0x1000>
PCIE设备映射到MSI控制器,格式和介绍如下:
9)phys = <&pcie30phy>
使用的PCIE PHY。
10)power-domains = <&power RK3568_PD_PIPE>
PCIE电源域
11)reg 和 reg-names
PCIE-dbi(映射总线上设备的配置空间地址)和PCIE-apb(PCIE控制器地址)寄存器地址和范围
12)rangs
功能:设备将CPU域地址映射到PCIE域地址
格式:
<映射类型(第1个字段) PCIe基地址(第2~3字段)CPU域基地址(第4~5字段)映射区域大小(第6~7字段)>
0x81000000:表示IO空间
0x82000000:表示MEM空间 (non-prefetchable)
13)vpcie3v3-supply = <&pcie30_3v3>
PCIE外设的3V3供电。PCIE phy使用1.8V或0.9V供电。
Linux系统查看PCI设备的命令:lspci,PCI逻辑地址:XX:YY:Z分别表示总线号:设备号:功能号。一个PCI域能容纳256个总线,每个总线可支持32个PCI设备,每个PCI设备可容纳8个PCI功能。
lspci -t:显示树状结构
lspci -x:显示配置空间前64字节的内容
lspci -s:指定PCI设备
end
一口Linux
关注,回复【 1024 】海量Linux资料赠送
精彩文章合集
文章推荐