1.单NTB设置

NTB有多种使用方式,一种常使用的模式是单NT Active-Passive模式,整体结构如下图:


wKiom1hT_hiR2kKYAACXfqXR1ZM288.png

为了实现这种模式,具体到EEPROM设置上,它要求保证节点0上的EEPROM里使能NT0,并且保证bar4/5的窗口是大小不小于目的地址空间的大小。而在节点1上的NTB都disable 掉.


考虑到fail-over和上电重启,这种设置会造成下面的问题:


在每次两个节点同时上电的情况下,如果Passive节点先于Active节点启动,Passive节点的BIOS和内核启动时无法探测到NTB设备,更无法为它分配PCI memory和IO地址空间。如果此时仲裁确定的双控master 节点刚好是Passive节点,那么在后续有IO的时候,它无法通过NTB把数据同步到远端节点。


在之前作为双控master节点被新的master节点杀死后的重启的过程当中,新的双控master节点此时也无法看到PLX NTB物理设备,此时NTB通道无法传递数据。


2. 实现双NT的改动

虽然可以通过每次上电时保证让active节点先启动的方式来确保上电后的NTB通路可用,但是这种方式显然对客户不太友好,而且会延长系统启动时间。为了从根本上解决这个问题,有必实现双NTB,通过完全对称的方式来使用NTB,彻底避免单NT对启动顺序的限制。


基于单NT的实现原理,以及参考设计和NTB芯片手册,我们可以实现下图所示意的双NT:


wKiom1k44PvjLODJAACY5Zy1-iU265.png


具体而言,可以通过下面的几个步骤来实现:

a.更新之前NT被禁止一侧的NTB eeprom, 把它配置成和NT使能一侧同样的设置:

b.设置本地和远端的地址转换寄存器


master 端virtual port 的地址转换寄存器设置成salve端NTB link port bar2/3或者bar4/5的mem 起始地址;


slave端 virtual port bar2/3或者bar4/5的地址转换寄存器设置成目的地址的总线地址;


这样做的目的是把远端的目的地址映射到远端bar2/3或bar4/5的PCI memory地址,把远端bar2/3或bar4/5的PCI memory地址映射到本地bar2/3或bar4/5的PCI memory地址。


在做master-slave Fail-over切换的时候,新的master/slave节点相关地址转换寄存器的值依旧依据上面的规则进行设置。


为了支持这种模式下更平滑的的fail-over,找到两组bar,比如一组是bar4/5,它用在节点0根据上面的规则访问节点1的时候,另外一组是bar2/3,它用在节点1根据上面的规则来访问节点0的时候,在此设置的情况下,即便发生系统级别的fail-over,也不需要更改任何地址转换寄存器的设置.


c . 设置ReqID

根据PLX Ethan Wan的证实,ReqID的设置和之前单NT一样。