之前两篇介绍PCI的文章都没有仔细看下去,感觉介绍的视角不适合我,偏PCI规范本身。要从处理器的角度了解PCIE总线,现在来看这本强哥推荐的《PCIE体系结构导读》
前言
1)深入理解处理器体系结构是理解PCI总线的重要基础,超越PCI自身,去理解系统的局部总线。
2004年开始PCIE取代PCI和AGP,成为局部总线工业标准。
PCI 并行共享架构, PCIE串行
刚刚接触PCI不要去读规范文档,规范文档适合查阅,不便于学习。
2)第一篇,PCI总线基础知识
第二篇,PCIE相关概念
第1章, posted,non-posed, split 数据传送方式,很重要
第2章,PCI桥,PCI的精华
第3章,数据传送方式,与cache相关和预读机制
第4,5章,PCIE通述,x86的RC
第6,7章,PCIE的事务层,链路层,物理层,物理层是核心,中国工程师最没机会接触的内容
第9章,流控的管理和策略
第10章,MSI和MSI-X中断机制,X86架构多用MSI-X,许多嵌入式处理器仍用MSI
第11章,PCIE中的序
第12章,linux驱动实现过程, capric和cornus卡
第13章,PCI与虚拟化技术
第三篇,linux系统中PCI的使用
-----------------------
第1章 PCI基本知识
1)PCI (peripheral componet interconnect), 属于局部总线(local bus),主要功能是连接外部设备。由intel提出。
ISA->PCI->PCIE, PCIE继承PCI的设计思路;
还有各种相关规范:PCMCIA、PC Card、miniPCI 、 compactPCI(用于有背板的大型系统)、PCI-to-PCI桥规范、PCI-X(频率更高)
PCI-to-PCI桥 (PCI桥)、PCIE-to-PCI桥(PCIe桥)、Host-to-PCI主桥(HOST主桥,PCI主桥,PCI总线控制器)
2)PCI总线空间和处理器空间隔离
通过HOST主桥隔离,其中有许多缓冲,使得他们工作在各自的时钟频率
主桥的作用是将处理器访问的存储器地址转换为PCI总线地址 (重要)
以freescale的power PC和intel的x86处理器为例说明HOST主桥的实现方式。
3)可扩展
HOST主桥引出PCI总线,PCI通过PCI桥扩展,形成PCI总线树,1课树最多256个PCI设备
PCI 桥的配置空间有管理其子树的配置寄存器
4)动态配置
PCI设备的地址可由系统软件动态分配,解决地址冲突,实现“即插即用”; ISA还需要跳线
每个PCI设备都有独立的配置空间,其中有设备在总线中使用的基地址(物理地址)。
5)总线带宽
PCI,32位、33MHZ的为132MB/s, EISA为33MB/s
6) 共享总线机制
PCI设备通过仲裁后获得PCI总线使用,才能传输,不需要处理器干预。
7)中断机制
PCI设备通过四根中断请求信号 INTA~D#向处理器提交中断请求。配置空间中有这四根信号的信息。还有MSI机制
X86,PowerPC, MIPS, ARM都把PCI作为标准局部总线,PCI设备:网卡,声卡,硬盘控制器等
ARM使用SoC平台总线,即AMBA总线,连接片内设备,但还是有AMBA-to-PCI桥
1.1 PCI总线组成结构
1)HOST主桥
PCI设备通过HOST主桥访问主存,即DMA操作,cache一致性模块会监听,然后改变cache状态。
数据交换:处理器访问PCI设备的地址空间; PCI使用DMA访问主存
PowerPC处理器和主桥在一个芯片,x86主桥在北桥中;
2)PCI设备
三类:PCI主设备、从设备、桥设备
PCI设备可以是主也可以是从,统称PCI Agent, PCI网卡、显卡、声卡都是。
3)HOST处理器
HOST主桥中有许多寄存器,x86中有0xCF8和0xCFC两个I/O端口 访问PCI设备的配置空间;
powerPC中则是CFG_ADDR和CFG_DATA来访问;
4)PCI总线的负载,一个插槽相当于2个负载,即PCI最多10个负载
1.2 PCI的信号定义
1)PCI设备通过一些信号与PCI总线相连:地址/数据信号,控制信号,仲裁信号,中断信号等
每个设备都有CLK信号,用于同步数据传递
2)地址和数据信号
a. AD[31:0]信号,复用地址和数据信号,先传地址,再传数据;
突发传输,一个地址周期后,多个数据周期
b. PAR信号,为地址数据信号线提供奇偶校验位
c. C/BE[3:0]#信号
地址周期,该信号表PCI总线的信号
数据周期,表示字节选通信号
目前多数PCI设备不支持I/O地址空间,仅支持存储器地址空间
3)控制信号,作用是保证数据的正常传递
a. FRAME#信号, 指示一个PCI总线事务的开始和结束。低有效
b. IRDY#信号, 由主设备驱动,表主设备的数据准备好了
c. TRDY#信号,由目标设备驱动,表目标设备数据准备完毕;
d. STOP#信号,目标设备请求主设备停止当前事务
e. IDSEL信号,配置读写总线事务时,选择PCI目标设备
f. DEVSEL#信号,目标设备准备好
g. LOCK#信号, 将目标设备的存储器和IO资源锁定,禁止其他主设备访问。避免使用,因为影响传送效率
4)仲裁信号, REQ#和GNT#
每条PCI总线都有一个总线仲裁器(PCI桥中). 先是主设备发REQ#给仲裁,然后GNT#会有效就获得了使用权
5)中断请求
INTA#, INTB#, INTC#, INTD# , 低有效,PCI设备向处理器提交中断请求,驱动的ISR清除中断后,PCI设备将信号置高,结束中断。
通过一个规则(中断路由表)得知来自不同PCI设备的中断请求
1.3 PCI总线的存储器读写总线事务
1)PCI设备只有在系统软件初始化配置空间后,才能被访问
2)配置空间初始化后,该设备就拥有一个独立的PCI总线地址空间,即BAR(base address register) 中描述的空间
3)Posted和Non-Posted数据传送方式
Posted方式:主设备传数,到PCI桥时,由桥来接管下发。减少阻塞。
Non-Posted: 数据必须到达目的地才能结束总线事务。PCI总线使用Delayed总线缓解这种方式的拥塞。
只有存储器写(PMW)可以采用posted事务,而存储器读,IO读写,配置读写只能Non-posted事务
4)HOST处理器访问PCI设备
包括两方面: HOST处理器向PCI设备发起存储器和IO读写请求
HOST处理器对PCI设备进行配置读写
a. PCI设备的配置空间中,共6个BAR,可以存放I/O地址空间,存储器地址空间,等PCI总线地址空间,是PCI总线域的物理地址。
b. x86有独立的IO空间,可以把PCI的IO地址映射到存储器域的IO地址空间,通过IN,OUT对存储器域IO访问,
HOST主桥又转换为PCI域的IO地址,最后访问到PCI设备的IO. 两个域的I/O地址相同;
而PowerPC则把PCI设备的IO映射到存储器地址
5)PCI设备读写主存
PCI设备与主存进行数据交换的过程被称为DMA. 按照我们的9056驱动来看,处理器读写PCI设备也可以DMA
6)Delayed方式
用于缓解non-posted拥塞,分为delay读写请求和delay读写完成
处理器传给主桥后,启用retry周期,就释放总线了。delayed读请求DRR,读完成DRC
虽然有提升,但重试周期也会消耗PCI总线,所以PCI-X和PCIE升级为split事务,发送端将non-posted发给接收端
然后接收端主动将数据传递给发送端
1.4 中断机制
两种:INTA/B/D#信号和MSI
1) x86使用APIC中断控制器,powerPC使用MPIC中断控制器
中断控制器有外部中断请求引脚IRQ_PINx#, BIOS的中断路由表记录INTx信号和中断控制器的连接关系
多数设备仅使用INTA,PCI配置空间interrupt pin寄存器记录了该设备究竟用哪个INTx信号。
INTx属于边带信号,即这些信号在PCI总线中是可选信号,只能在处理系统内部使用,PCI桥不会处理这些边带信号
中断路由表:由BIOS保存两者间的映射关系
2)中断的同步
INTx与CLK信号无关,涉及异步
如当设备DMA写主存,ISR中收到INTx时,并不意味着数据已经写入主存,因为数据传递需要通过HOST主桥和PCI桥,才能到主存。
(即两个路径,无法确定哪个信息率先到达)
所以ISR中要先读中断状态寄存器,这个读保证了数据已经到达主存,(利用了PCI总线的“序”机制)
3) MSI中断机制
实际上是存储器写事务,是某段存储器地址范围,数据事先安排好的,含有中断向量号。HOST主桥会翻译这个写事务为中断请求给处理器
PCI-X和PCIE必须支持MSI,PCI不一定
1.5 PCI-X总线简介
1) 频率可达533MHZ
2)split事务,requester和completer,和delayed比,数据是由completer主动传递的,而不是通过requester通过多次重试得到的。
3)目标设备可以将主设备发的命令锁存,在下一个时钟周期进行译码操作。提高了效率
很少有基于PCI-X的设备