天天看点

多功能PCIE交换机之四:非透明桥NTB

多功能PCIE交换机的一个重要组成部分就是非透明桥,正是因为有了非透明桥,使得它在现在的双活设计、高可用性方面成为了一个必不可少的器件。 为了让大家对PCIE非透明桥有个直观的了结,下面主要基于PLX87xx系列上 上的非透明桥进行说明。

8717用做两台或多台服务器的容错设计时,主要的有两种形式,一种是Active-Passive模式:两台服务器一端连接到Link Port,一端连接到virtual port, 这种配置直支持一次Failover.另外一种就是Active-Active,典型的应用场景就是两台机器通过两个8717形成背靠背的链接。由于有两个NTB,并且两侧机器都是对称的设计,上面的这种方式支持容错后的恢复:即在容错步骤启动之后,如果之前出现问题的主机得到修复,还能够让它接管现在的主控设备,成为主控,而另外一台主机继续充当从机的角色。只要Failover后出现问题的机器能得到及时的修复或者替换,这样的设计能够支持无限次数的Failover。

作为一个典型的支持多根节点的PCIE Switch,它既有自己的扩展配置空间,支持ECMA访问,同时也必须提供访问自身、端口和DMA通道相关的寄存器访问的方法。掌握了每个端口和子功能的访问方式,也就深入理解了8717的结构。

8717的基址寄存器(BAR)

8717的Bar0/Bar1用做ECAM,Bar4~Bar5和普通的Bar功能上没有区别,只是它们后来用在接受upstream端口发送来的memory access是否命中所在的窗口,在的话把它们发送到下级总线或设备。(根据virtual port或者link port对应的Bar进行地址高位的转化,并且转发给对侧节点。)

8717的ECMA

由于8717实现的功能很多,即便扩展的PCI配置空间也无法容下所有功能的寄存器,为了便于对所有功能的访问,根节点实现了memory access 到configuration access的转换,把那些功能的配置空间上的寄存器都映射到8717的BAR0所指定的内存空间(ECAM),转换后的配置空间地址如下表所示:

需要注意的是,上面并不是把所有的NT端口和DMA通道的配置空间都映射到8717 Root port(Upstream port)的[bar0]上,只是说8717upstream port、DMA、Virtual port、Link Port公享上面的示意图,但都需要配置自己的bar0/bar1.

NT Link Port 的配置空间和内存空间

先配置Bar0/Bar 1

NT1的Link Port配置空间位于[BAR0]+0x3_D000,mem空间在[bar2~bar5]

NT0的Link Port配置空间位于[BAR0]+0x3_F000,mem空间在[bar2~bar5]

Bar Setup寄存器:

BAR0/1 Setup寄存器:          offset E4H

BAR2/3 Setup寄存器:        offset E8H/ECH

BAR4/5 Setup寄存器:        offset F0H/F4H

对应的地址转换寄存器在:

BAR2地址转换寄存器低位:    offset C3CH

BAR2/3地址转换寄存器高位: offset C40H

BAR2地址转换寄存器低位:    offset C44H

BAR2/3地址转换寄存器高位: offset C48H

NT Virtual Port 的配置空间和内存空间

NT1的Virtual Port配置空间位于[BAR0]+0x3_C000,mem空间在[bar2~bar5]

NT0的Virtual Port配置空间位于[BAR0]+0x3_E000,mem空间在[bar2~bar5]

Ntx Virtual Port都有一组地址翻译寄存器,它的偏移在:

BAR0/1 Setup寄存器:          offset D0H

BAR2/3 Setup寄存器:        offset D4H/D8H

BAR4/5 Setup寄存器:        offset DCH/E0H

因为8717是用来连接不同的host,不同的host可能会有不同的地址空间,无论是Active-Active还是Active-Passive模式,都需要跨host域进行读写,为了保证读写到期望的地址,需要实现正确的地址转换。8717提供了两种地址转换方式:直接地址转换和基于查找表的地址转换。

直接地址转换就是根据设置地址转换寄存器的设置,把命中当前Bar的地址转换成设置的值,然后丢到对侧节点。

基于8717的bar2/3,实现了一个bar上对多个地址的转换,这些地址甚至可以映射到不同的host上去。当然实现对多个host上述地址转换和映射的前提是需要一个额外的PCIE桥:

根据PCIE规范,TLP报文中包含了Request ID,事务处理完之后会返回的TLP中包含期望的completion ID,用来确保一次PCIE事务的正确完成。由于NTB需要跨越多个host域,对侧host访 问本侧memory空间,依赖于NTB接管并继续发送TLP访问请求,但是对侧host和本侧NTB的Request ID显然不同,为此,除了实现Address Translate之外,还需要实现RequestID的转换。8717引入了ReqID-LUT来实现这一转换。因此除了设置上面的地址转换寄存器之外,还需要设置正确的ReqID。

本文转自存储之厨51CTO博客,原文链接: http://blog.51cto.com/xiamachao/1728715,如需转载请自行联系原作者

继续阅读