Linux内核PCIE 原标题:Linux内核PCIE 作者:小田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字段)> 0x:表示IO空间 0x:表示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设备 标题可跳转 1、图解 IPSec 2、为什么魂斗罗只有128KB却可以实现那么长的剧情? 3、eMMC之分区管理、总线协议和工作模式(太硬了)返回搜狐,查看更多 责任编辑:
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/55934.html