基于Linux模块的IDT PCIe热插拔驱动程序

描述

在典型的基于PCIe的系统中,枚举PCIe总线,并在系统初始化期间将资源分配给每个PCIe端点设备。由于枚举和资源分配算法的局限性,PCIe拓扑一旦初始化,便已修复,这意味着不得将新的端点设备或交换机连接到系统。

PCIe

IDT PCIe热插拔驱动程序是一个可加载的Linux模块,采用IDT专有的枚举,资源分配和设备检测算法,允许PCIe端点设备和交换机在运行时连接到系统或与系统断开连接,而不会影响系统的运行状态。系统中的其他PCIe设备。以图1为参考,如果双GigE控制器与系统断开连接并随后重新连接至其他交换机上的端口,则光纤通道控制器和SATA / SAS控制器的操作状态将保持不变。这与PCIe热插拔的Windows Vista实施不同,后者必须禁用,重新枚举和重新分配资源给共享同一根端口的所有设备,然后新连接的设备才能运行。通过写入位于/ sysfs目录下的文件,可以简单地以任意方式或更舒适地将设备连接至系统或从系统断开连接。将0写入/sysfs/bus/pci/slots/0000:bb:dd.f/power文件(其中bb指定总线号,dd指定设备号,f指定下游端口的功能号)将禁用指定下游端口,同时将1写入同一文件将启用下游端口。禁用下游端口时,将从Linux内核中删除所有连接到该端口的设备,并且将调用PCI驱动程序remove()函数来执行所需的清除操作。同样,启用下游端口后,将发现与其连接的所有设备,添加到Linux内核中的PCI驱动程序probe()函数将被调用以执行设备初始化。下游端口也可以由第三方内核模式驱动程序通过使用标题为“启用和禁用下游端口”中描述的热插拔驱动程序API来启用或禁用。

下面的图2描述了可以与运行IDT PCIe热插拔驱动程序的系统连接或断开连接的设备类型的示例。

PCIe

实现这种热插拔功能的关键是能够为系统中的每个下游端口分配其他未使用的总线号和内存资源。当新设备连接到系统时,这些额外资源将用于使该设备进入运行状态,而不必损害共享同一根端口的其他设备的运行状态。

系统互连注意事项

图3中所示的IDT系统互连拓扑由一个基于x86的根联合处理器(RP)组成,该根复杂处理器通过IDT系统互连PCIe交换机连接到一个或多个基于智能x86的端点处理器(EP)。每个EP都使用IDT域内交换机将它们连接到系统互连PCIe交换机的下游端口。这种拓扑结构与IDT系统互连软件结合使用,可以在系统中任何两个对等方之间进行高速数据传输。

PCIe

当使用这种类型的拓扑将新的EP连接到系统或从系统断开连接时,热插拔驱动程序会将EP视为与任何普通端点设备相同。但是,当RP连接到系统或从系统断开时,处理RP的方式有所不同。

通常,当PCIe交换机的上游端口断开时,如图4所示,该交换机将对其所有下游端口进行热复位。此功能在系统互连拓扑中是不可取的,因为当RP与系统断开连接时,它将阻止EP相互通信。热插拔驱动程序通过检测IDT PCIe系统互连交换机并禁用其上游端口断开连接时生成热重置的能力,从而解决了此问题。通过将linkDownHotReset模块参数设置为非零值,可以在热插拔驱动程序中禁用此功能。

热插拔驱动程序还具有被动资源分配算法。该算法主要与IDT系统互连拓扑一起使用,该算法允许RP以最小的系统中断将其连接到操作系统。通常,当端点设备连接到根联合体时,是根联合体将内存资源分配给该设备。对于被动资源分配,是由根联合体将内存资源分配给设备。在被动资源分配的情况下,应该使用哪些内存资源的“根联合体”。默认情况下,热交换驱动程序中会启用此功能,但可以通过设置passiveAllocationDisable模块参数来禁用此功能。

编辑:hfy

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分