MPC8280 PCI桥实战:地址翻译与错误处理寄存器深度解析
1. 项目概述与核心价值
在嵌入式系统,尤其是通信处理器和工业控制领域,我们常常需要让一个高速的处理器核心(比如PowerPC 60x总线)与一个标准化的、扩展性强的外围总线(如PCI)进行高效、可靠的数据交换。这中间的关键角色,就是总线桥接器。它不是简单的电线连接,而是一个复杂的地址翻译官、流量调度员和错误哨兵。飞思卡尔的MPC8280 PowerQUICC II处理器内部集成的PCI桥,就是一个非常经典的实现案例。今天,我们不谈空洞的理论,直接深入到它的寄存器层面,特别是地址翻译和错误处理这两大核心机制,看看一个合格的嵌入式驱动或BSP工程师,在实际项目中是如何理解和配置这些硬件的。
为什么要把寄存器手册读“厚”?因为手册只告诉你每个比特位是什么,而实战中,你需要知道这些比特位组合起来能做什么、为什么要这么设置、以及配置错了会有什么后果。比如,POTAR和POBAR这对寄存器,手册上写它们定义了地址翻译窗口,但实战中,你需要考虑:如何为PCI网卡、显卡或自定义FPGA板卡划分合理的地址空间?窗口大小设置成4KB还是1MB?启用预取(Prefetchable)对DMA性能有多大提升?当系统出现一个PCI PERR(奇偶校验错误)时,ESR、EMR、ECR这一套错误寄存器如何协同工作,帮你快速定位是地址错误、数据错误,还是目标设备无响应?理解这些,你才能写出稳定、高效的底层驱动,而不是仅仅让设备“跑起来”。
这篇文章,我将结合手册内容和多年调试经验,为你拆解MPC8280 PCI桥的地址翻译窗口配置逻辑和错误处理流程。我会重点讲解那些容易混淆的细节,比如比较掩码寄存器(POCMR/PICMR)的位模式与实际窗口大小的换算关系,错误捕获寄存器(PCI_EACR/PCI_EDCR/PCI_ECCR)在锁定第一个错误后如何复位,以及主机模式(Host)与代理模式(Agent)下寄存器配置的根本区别。无论你是正在为MPC82xx系列处理器移植BSP,还是希望深入理解PCI桥接原理,这篇文章都能提供可直接参考的配置范例和避坑指南。
2. PCI桥地址翻译机制深度解析
地址翻译是PCI桥的核心功能,它解决了处理器(本地总线)与PCI设备地址空间不匹配的问题。MPC8280的PCI桥提供了双向的翻译窗口:出站(Outbound)和入站(Inbound)。
出站翻译处理的是本地主设备(如CPU、DMA控制器)发起的、目标为PCI空间的访问。本地地址经过桥接器,被翻译成PCI总线上的地址。入站翻译则相反,处理的是PCI总线上的主设备(如一个PCI网卡)发起的、目标为本地内存或寄存器的访问。PCI地址被翻译成本地总线地址。
这个翻译过程不是全局的,而是通过“窗口”机制实现的。你可以把它想象成邮局的分拣系统:只有落在特定邮编区间(地址窗口)内的信件,才会被贴上国际标签(地址翻译)并送往海外(PCI总线);其他信件则按本地邮件处理(直接转发或不予处理)。MPC8280为每个方向提供了多个可编程窗口(通常是3个出站窗口,2个入站窗口),每个窗口由一组寄存器独立控制。
2.1 出站翻译窗口寄存器组详解
一组完整的出站翻译窗口配置需要三个寄存器协同工作:POBARx (PCI Outbound Base Address Register)、POTARx (PCI Outbound Translation Address Register)和POCMRx (PCI Outbound Comparison Mask Register)。
POBARx (基地址寄存器):定义了本地地址空间的起始地址。当本地主设备发起一个访问,其地址会与POBARx中定义的基地址进行比较。注意,POBAR的位[19:0]对应本地地址的位[31:12]。这意味着它的粒度是4KB。如果你将POBAR0设置为0x8000_0000,意味着你定义了一个本地地址窗口,起始于0x8000_0000。
POCMRx (比较掩码寄存器):这是配置中最关键也最容易出错的部分。它有两个核心作用:
- 窗口使能与属性控制:位31(EN)是窗口使能位。位30(I/O)决定此窗口是映射到PCI内存空间还是PCI I/O空间。位29(PRE)决定该空间是否可预取,这对于支持突发传输的设备(如显卡显存)至关重要,能显著提升性能。
- 定义窗口大小:位[19:0]是比较掩码(CM)。它不是直接设置窗口大小,而是指定需要比较的地址高位。手册中的例子需要仔细理解:
POCMR = 0b1...1111_1111_1111_1111_1111(低20位全1):这意味着需要比较地址的位[31:12](20个比特)。当地址的这20位与POBAR的对应位完全匹配时,才算命中窗口。这实际上定义了一个4KB (2^12字节)的窗口,因为最低12位(位[11:0])不参与比较,它们作为窗口内的偏移量。POCMR = 0b1...1111_1111_1111_0000_0000(低12位为0):这意味着只比较地址的位[31:20](12个比特)。这定义了一个1MB (2^20字节)的窗口,因为低20位是偏移量。
避坑指南:窗口对齐与掩码连续性手册明确警告:“Non-contiguous comparison masks will exhibit unpredictable behavior.” 掩码位必须是连续的高位1和低位0。例如,
0b...1111_0000_1111_0000这种非连续的掩码会导致不可预测的行为。在编程时,务必确保你设置的掩码值符合(2^N - 1) << M的格式(N为掩码中1的个数,M为偏移量位数)。
POTARx (翻译地址寄存器):定义了PCI地址空间的起始地址。当一次本地访问命中了由POBAR和POCMR定义的窗口后,本地地址中的偏移量(即被掩码忽略的低位部分)会与POTAR中定义的起始地址拼接,形成最终的PCI地址。POTAR的位[19:0]对应PCI地址的位[31:12]。
配置流程示例:假设我们要将本地地址范围0x8000_0000 ~ 0x800F_FFFF(1MB) 映射到PCI内存空间的0x8100_0000起始处。
- 计算POBAR:本地基地址是
0x8000_0000。取位[31:12],即0x80000。所以POBAR = 0x0008_0000(注意寄存器高12位保留,通常为0)。 - 计算POCMR:窗口大小为1MB,即偏移量位宽为20位(位[19:0]不比较)。因此需要比较的地址高位是12位(位[31:20])。掩码值应为:使能位(1) + I/O位(0,内存空间) + 预取位(根据设备特性,假设为1) + 保留位(0) + 比较掩码(
0xFFF00000的低20位,即0xFFF00)。假设我们启用窗口、映射到内存、启用预取,则POCMR = 0xE000_FFF00(位31=1,位30=0,位29=1,位[19:0]=0xFFF00)。 - 计算POTAR:PCI目标基地址是
0x8100_0000。取位[31:12],即0x81000。所以POTAR = 0x0008_1000。 - 验证:本地访问
0x8001_2345。地址0x8001_2345与POBAR (0x80000) 在高12位(0x800)上匹配(因为掩码0xFFF00意味着比较0x8001_2345 & 0xFFF0_0000 == 0x8000_0000 & 0xFFF0_0000)。命中窗口。偏移量是低20位0x12345。最终PCI地址 = POTAR (0x81000) << 12 + 偏移量(0x12345) =0x8101_2345。
2.2 入站翻译窗口寄存器组详解
入站翻译的寄存器组与出站对称,包括:PIBARx (PCI Inbound Base Address Register)、PITARx (PCI Inbound Translation Address Register)和PICMRx (PCI Inbound Comparison Mask Register)。
其工作原理与出站窗口镜像相反:PIBARx定义了PCI地址空间的起始地址(即PCI设备发起访问的目标地址),PICMRx定义了窗口大小和属性(包含一个关键的NO_SNOOP_EN位,用于控制是否对PCI发来的内存访问发起60x总线侦听,关闭侦听可提升非一致性访问的性能),PITARx定义了对应的本地地址空间起始地址。
这里有一个非常重要的联动机制,手册中提到了但容易被忽略:PIBARx 与 GPLABARx (General Purpose Local Access Base Address Registers) 是联动的。在PCI代理模式下,系统主机(Host)通过配置PCI配置空间中的基地址寄存器(BAR)来分配资源给PCI设备。MPC8280作为代理设备,其PIBARx的内容会根据主机写入其PCI配置空间BAR的值而自动更新,反之亦然。这意味着,在代理模式下,你通常不应该直接去写PIBARx,而应该通过配置PCI配置空间来间接设置。直接写入可能会破坏与主机的配置协议。只有在MPC8280作为主机桥时,才可以直接配置PIBARx。
实战心得:主机模式 vs. 代理模式下的配置差异这是配置PCI桥时第一个要搞清楚的问题。模式通常由硬件复位时的配置引脚(如
HRESET后的CHYP信号)决定。
- 主机模式:MPC8280的PCI桥是PCI总线的主控者。它需要负责配置总线上的其他PCI设备。此时,你需要主动编程出站和入站窗口寄存器,并为PCI设备分配地址空间。PCI配置空间的命令寄存器(Command Register)的Bus Master位默认是置位的。
- 代理模式:MPC8280作为PCI总线上的一个设备。它会被上级PCI主机(如一个x86主机)发现和配置。此时,入站窗口的PIBARx应由主机通过PCI配置周期来配置(驱动或BIOS完成)。你的初始化代码主要设置好PICMRx(特别是窗口大小和NO_SNOOP_EN),并等待主机配置。出站窗口的配置则相对独立,由你决定本地CPU如何访问PCI总线。
3. 错误处理机制与寄存器实战
一个健壮的嵌入式系统必须能妥善处理总线错误。PCI桥的错误处理机制是系统稳定的最后防线。MPC8280的PCI桥提供了一套完整的错误检测、记录和上报机制,主要涉及三个状态寄存器:ESR (Error Status Register)、EMR (Error Mask Register)和ECR (Error Control Register),以及三个错误捕获寄存器:PCI_EACR、PCI_EDCR、PCI_ECCR。
3.1 错误状态与控制寄存器(ESR, EMR, ECR)
这三个寄存器是错误处理的核心,它们以比特位为单位,对应着具体的错误类型。
ESR (错误状态寄存器):这是一个“粘性”状态寄存器。当发生某种错误时,对应的比特位会被硬件自动置1。该位只能通过软件写1来清除(写0无效)。这是关键设计,保证了错误状态不会被后续操作覆盖,便于诊断。ESR包含的错误类型非常全面:
- PCI_ADDR_PAR / DATA_PAR_WR / DATA_PAR_RD:PCI地址/写数据/读数据奇偶校验错误。PERR#信号相关。
- PCI_SERR:系统错误(SERR#信号被断言),这是严重的错误。
- PCI_TAR_ABT:目标中止,PCI目标设备无法完成请求。
- PCI_NO_RSP:主设备中止,没有设备响应访问(DEVSEL#未断言)。
- I2O_相关错误*:与I2O消息单元相关的队列溢出等错误。
- NMI:一个通用的错误/中断指示位,在不同模式下触发源不同(如主机模式下60x总线TEA终止,代理模式下内部机器检查)。
EMR (错误掩码寄存器):决定哪些错误能够触发中断或机器检查。某位置1,表示允许该错误触发;置0,则屏蔽该错误。上电复位后,EMR的默认值通常是屏蔽大部分错误的(例如,手册中显示复位值为0x0FFF,即高4位为0,屏蔽了I2O_DBMC, NMI, IRA, I2O_IPQO, I2O_OFQO)。这意味着即使ESR中记录了错误,也不会立即产生中断打扰CPU。在系统初始化时,你需要根据系统需求,有选择地使能某些关键错误的报告。
ECR (错误控制寄存器):决定被EMR允许的错误,是触发一个普通中断还是机器检查(Machine Check)异常。某位置0,触发中断;置1,触发机器检查。机器检查通常用于处理严重的、不可恢复的硬件错误,而中断则用于处理可恢复的或需要软件干预的错误。例如,你可以将PCI_SERR(系统错误)配置为触发机器检查,而将PCI_DATA_PAR_RD(读数据奇偶错误)配置为触发中断,以便驱动尝试重试或记录。
配置流程与示例:假设我们希望PCI数据奇偶校验错误能产生中断,而系统错误产生机器检查。
- 使能错误检测:首先,需要配置PCI命令寄存器(PCI Configuration Space Offset 0x04)的Bit 6(Parity Error Response)为1,让PCI桥响应总线上的奇偶错误。
- 解除错误屏蔽:设置
EMR。将PCI_DATA_PAR_RD(Bit 2) 和PCI_DATA_PAR_WR(Bit 1) 对应的掩码位置1。同时,将PCI_SERR(Bit 5) 的掩码位也置1。EMR |= (1 << 5) | (1 << 2) | (1 << 1); - 设置错误响应类型:设置
ECR。将PCI_SERR对应的控制位置1(触发机器检查),将数据奇偶错误对应的控制位置0(触发中断)。ECR = (1 << 5); // Bit5=1 for Machine Check, Bits 2&1 default to 0 for Interrupt - 编写中断服务程序(ISR):在中断服务程序中,读取
ESR寄存器,判断是哪个错误位被置起。处理错误(例如,记录日志、重试操作),然后向该位写1以清除状态位。ESR = (1 << 2); // Clear PCI_DATA_PAR_RD status
注意事项:错误位清除的原子性
ESR是写1清除(Write-1-to-Clear)。在并发环境或多核系统中,清除错误位时最好使用读-修改-写序列,或者直接写入要清除的位对应的值,避免影响其他未处理的错误状态位。例如,使用ESR = read_ESR() | bitmask_to_clear;并不是正确的做法,这可能会设置其他位。正确做法是ESR = bitmask_to_clear;。
3.2 错误捕获寄存器(PCI_EACR, PCI_EDCR, PCI_ECCR)
当第一个PCI错误发生时,除了ESR中对应的状态位置位,桥接器还会自动将这次错误交易的关键信息锁存到三个捕获寄存器中。这对于调试偶发性错误(特别是时序相关的错误)至关重要。
- PCI_EACR (错误地址捕获寄存器):锁存出错交易的PCI地址。
- PCI_EDCR (错误数据捕获寄存器):锁存出错交易的相关数据(如果是数据错误)。
- PCI_ECCR (错误控制捕获寄存器):锁存交易的元数据,包含的信息极为宝贵:
- FET (First Error Type, Bits 30-28):错误类型索引,直接对应ESR中的位索引。例如,
0b101代表PCI_SERR。 - BN (Beat Number, Bits 27-24):对于数据奇偶错误,指示是32位数据节拍中的第几个节拍出错。
- TS (Transaction Size, Bits 21-20):交易大小(以双字计)。
- ES (Error Source, Bits 19-16):错误来源。
0000外部主设备,000160x主设备,0101DMA控制器。这能直接告诉你是谁发起的错误交易。 - CMD (Command, Bits 15-12):PCI命令(如内存读、内存写、I/O读等)。
- BE (Byte Enables, Bits 7-4):字节使能信号。
- VI (Valid Info, Bit 0):这是捕获寄存器的有效标志位。当该位为1时,表示捕获寄存器中的信息是有效的。软件在读取并处理完捕获信息后,必须通过向该位写0来释放锁存器,以便捕获下一次错误。
PCI_ECCR = 0x0; // 写0清除VI位,准备捕获新错误
- FET (First Error Type, Bits 30-28):错误类型索引,直接对应ESR中的位索引。例如,
调试技巧:利用捕获寄存器定位偶发错误在压力测试或现场出现偶发PCI错误时,仅仅知道ESR中有错误���是不够的。你应该在错误中断或异常处理程序中,第一时间检查
PCI_ECCR[VI]位。如果为1,立即将三个捕获寄存器的内容(地址、数据、控制信息)转储到日志或非易失存储器中。通过分析PCI_ECCR中的ES(错误源)和CMD(命令),你能迅速判断是CPU发起的访问出了问题,还是DMA操作,或是某个外设的主动访问。结合地址信息,甚至能定位到出错的具体驱动程序或内存区域。这是定位硬件兼容性问题和驱动缺陷的利器。
4. 其他关键控制寄存器精讲
除了地址翻译和错误处理,还有一些寄存器对系统行为和性能有重要影响。
4.1 丢弃定时器控制寄存器(PTCR)
这个寄存器用于管理PCI的延迟读事务(Delayed Read Transaction)。PCI总线允许目标设备对读请求进行延迟响应。PTCR中的预加载定时器值(PTV)设定了一个超时时间。如果一个对非预取(Non-prefetchable)内存空间的延迟读事务,在超时时间内主设备没有重复请求(以保持事务有效),PCI桥将丢弃这个未完成的延迟读。这可以防止挂起的读事务无限期占用桥接器资源。
计算示例:手册给出的例子非常典型。假设PCI总线时钟为33MHz,内部时钟是PCI时钟的2倍(66MHz),我们希望超时时间为2^15个PCI时钟周期。
- 超时时间
n = 2^15PCI clocks。 - 内部时钟周期数 =
n * 2 = 2^16internal clocks。 - 24位定时器的预加载值 =
2^24 - 2^16 = 0x1000000 - 0x10000 = 0xFF0000。 因此,设置PTCR = 0x8000FF0000(Bit 31 EN=1, Bits 23:0 PTV=0xFF0000)。
注意事项:预取与非预取空间此定时器仅对非预取空间有效。对于在POCMR/PICMR中标记为预取(Prefetchable)的空间,PCI桥可以进行更激进的读操作(如预读多个数据),不受此定时器限制。因此,在配置窗口时,正确设置PRE位对性能有直接影响。
4.2 通用控制寄存器(GPCR)
这个寄存器包含几个杂项控制位,其中两个尤为重要:
- DMABC (DMA 60x Bandwidth Control, Bits 19-18):DMA带宽控制。这是一个非常实用的性能调优旋钮。当DMA控制器通过PCI桥访问60x总线时,它可能以很高的优先级占用总线,导致CPU或其他主设备(如另一个总线主控)被“饿死”。这个字段允许你插入一些“中断”,让出总线使用权。
00: DMA使用低带宽(默认)。插入较多中断。01: DMA使用高带宽。10: DMA使用最大带宽(可能饿死其他主设备)。11: DMA使用最小带宽。手册的建议很中肯:“用户应通过测试找到最佳设置”。在集成第三方IP或运行复杂多任务系统时,如果发现DMA传输期间系统响应变慢,可以尝试调整此设置。
- LE_MODE (Bit 0):字节序模式。控制60x总线与PCI总线之间的字节序转换。PCI总线通常是Little-Endian,而PowerPC通常是Big-Endian。此位置1启用小端模式,桥接器会自动进行字节交换。绝大多数情况下,当PCI设备是小端设备时,此位应设置为1。否则,你需要在软件中手动进行字节序转换,既麻烦又低效。
4.3 PCI通用控制寄存器(PCI_GCR)与软复位
PCI_GCR寄存器在主机模式下有一个关键位:SPRST (Soft PCI Reset, Bit 0)。当MPC8280作为PCI主机时,置位此位可以主动驱动PCI总线的复位信号(PCI_RST)为高电平,清零则驱动为低电平。这为软件控制PCI总线上的设备复位提供了可能,例如在热插拔或设备恢复场景中。在代理模式下,此位无效。
5. 配置流程总结与常见问题排查
5.1 典型初始化流程(主机模式)
- 确定工作模式:根据硬件设计,确认PCI桥处于主机模式(通过复位配置)。
- 配置PCI全局设置:
- 设置
GPCR[LE_MODE](通常为1)。 - 根据系统需求,配置
PTCR(丢弃定时器)。 - 配置
GPCR[DMABC](初始可用默认值,后期调优)。
- 设置
- 配置出站翻译窗口:
- 规划本地地址到PCI地址的映射。
- 为每个需要使用的窗口计算并设置
POBARx,POTARx,POCMRx(注意使能EN位、I/O空间选择、预取属性PRE和窗口大小掩码CM)。
- 配置入站翻译窗口:
- 规划PCI地址到本地地址(通常是内存或特定寄存器区域)的映射。
- 计算并设置
PITARx,PICMRx(注意使能EN位、NO_SNOOP_EN位、预取属性PRE和窗口大小掩码CM)。在主机模式下,PIBARx通常也在此步骤设置。
- 配置错误处理:
- 初始化
EMR,使能需要监控的错误类型(如奇偶错误、系统错误)。 - 初始化
ECR,决定各错误类型触发中断还是机器检查。 - 清除
ESR中的任何残留状态位(通过写1清除)。 - 清除错误捕获寄存器有效位
PCI_ECCR[VI] = 0。
- 初始化
- 使能PCI桥主控功能:通过PCI配置空间命令寄存器(Offset 0x04)的Bit 2(Bus Master)置1,使能PCI桥作为总线主设备发起交易的能力。
- 使能PCI内存空间响应:通过PCI配置空间命令寄存器的Bit 1(Memory Space)置1,使PCI桥作为目标响应PCI内存访问。
5.2 常见问题与排查表
| 现象 | 可能原因 | 排查步骤与解决方法 |
|---|---|---|
| CPU访问PCI设备地址时产生总线错误(如60x总线TEA)或无响应。 | 1. 出站窗口未使能(POCMRx[EN]=0)。 2. 访问地址未落在任何出站窗口内(与POBARx不匹配)。 3. 窗口大小设置错误(POCMRx[CM]掩码计算错误)。 4. PCI设备不存在或未正确初始化。 | 1. 检查目标地址,确认其应落在哪个出站窗口。 2. 读取并核对 POBARx,POCMRx,POTARx的值,验证EN位、地址匹配和窗口大小。3. 使用逻辑分析仪或PCI总线分析工具,确认PCI总线上是否有预期的交易产生。 |
| PCI设备无法访问MPC8280的本地内存。 | 1. 入站窗口未使能(PICMRx[EN]=0)。 2. PCI设备发起的地址未落在任何入站窗口内(与PIBARx不匹配)。 3. 在代理模式下,PIBARx未被主机正确配置。 4. PCI配置空间命令寄存器的Memory Space位未使能。 | 1. 检查PCI设备试图访问的地址。 2. 读取并核对 PIBARx,PICMRx,PITARx的值。3.在代理模式下,确认主机(如x86 BIOS/OS)已为MPC8280的PCI功能分配了足够的内存空间,并读取其BAR值确认。 4. 检查PCI配置空间Offset 0x04的Bit 1是否为1。 |
| 系统频繁产生PCI奇偶校验错误中断。 | 1. 硬件连接问题(时钟、信号完整性)。 2. PCI设备本身故障。 3. 总线负载过重,时序裕量不足。 4. 地址翻译窗口配置在PCI设备不支持的地址区域(如映射到了设备内部寄存器区而非数据缓冲区)。 | 1. 检查ESR和PCI_ECCR,确定是地址错误、读数据错误还是写数据错误,以及错误来源(ES字段)。2. 检查错误地址( PCI_EACR),看是否指向特定设备或地址范围。3. 降低PCI总线时钟频率(如果支持)或优化PCB布局以改善信号质量。 4. 确认地址映射符合PCI设备数据手册的要求。 |
| DMA传输期间系统(CPU)响应极慢。 | DMA控制器占用60x总线带宽过高,导致CPU或其他主设备被阻塞。 | 调整GPCR[DMABC]字段,从00(低带宽)开始测试,逐步提高(01,10),观察系统响应和DMA吞吐量的平衡点。 |
| 读取PCI配置空间寄存器值不正确(如Vendor ID/Device ID错误)。 | 1. 字节序问题(GPCR[LE_MODE]设置错误)。2. 访问方式错误(配置空间访问需要通过特定的间接寄存器 PCI_CFG_ADDR和PCI_CFG_DATA)。 | 1. 确认GPCR[LE_MODE]设置正确��通常为1)。2.严格遵循手册第9.11.2.26节“PCI Configuration Register Access from the Core”描述的流程:先设置 PCI_CFG_ADDR,再读写PCI_CFG_DATA。 |
5.3 调试心得:寄存器查看与脚本化配置
在uboot或早期内核启动阶段调试PCI时,最直接的方法就是通过MD(Memory Display)和MM(Memory Modify)命令查看和修改这些内部寄存器。它们的地址都在IMMR(Internal Memory Map)空间内,例如POTAR0在0x10800。我习惯将一套完整的、经过验证的窗口配置参数写成C语言宏或数组,在初始化函数中循环写入。对于错误处理,一定要在初始化后期使能中断,并编写一个健壮的错误ISR,至少要把ESR和错误捕获寄存器的内容打印出来。
最后,牢记手册是你的第一参考资料,但实践中的问题往往需要结合具体硬件(你的底板设计、连接的PCI设备)和软件场景来分析。理解每个寄存器位背后的硬件行为,而不仅仅是它的名字,才能让你在遇到问题时游刃有余。MPC8280的PCI桥虽然是一个较老的IP,但其设计思想非常经典,透彻理解它,对于掌握其他更复杂的互连技术(如PCIe)也有莫大的帮助。
