多功能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 的配置空间和内存空间
先配置Bar0/Bar 1
NT1的Virtual Port配置空间位于[BAR0]+0x3_C000,mem空间在[bar2~bar5]
NT0的Virtual Port配置空间位于[BAR0]+0x3_E000,mem空间在[bar2~bar5]
Ntx Virtual Port都有一组地址翻译寄存器,它的偏移在:
Bar Setup寄存器:
BAR0/1 Setup寄存器: offset D0H
BAR2/3 Setup寄存器: offset D4H/D8H
BAR4/5 Setup寄存器: offset DCH/E0H
对应的地址转换寄存器在:
BAR2地址转换寄存器低位: offset C3CH
BAR2/3地址转换寄存器高位: offset C40H
BAR2地址转换寄存器低位: offset C44H
BAR2/3地址转换寄存器高位: offset C48H
因为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。
本文出自 “存储之厨” 博客,转载请与作者联系!