SRIO系统初始化过程和路由配置

简介: SRIO系统初始化过程和路由配置

host初始化


直接看RapidIO的初始化,一些底层的比如物理层链路层之类的不需要关心,用到了再去看,毕竟都是基于芯片或者IP来开发,从顶层了解这个过程。


系统启动过程概述


host CPU获取引导代码,启动,如果有两个host,则两者是同时启动的。

开始执行系统探测和枚举算法。

枚举所有器件并将相关器件信息记录到器件数据库,建立host和所有endpoint之间的路由。

计算并配置host和所有endpoint之间的最优路径。

用最优路径信息配置switch。

更新路由表。

映射地址空间。

上面提到的最优路径,就是所谓的枚举算法的目的,可以是最短路径同时包含一些用户约束,。


启动要求

系统初始化之后,所有器件都会拥有一个ID,在系统初始化之前,按照下面设置。RapidIO系统应该只有一个引导代码器件。

设置endpoint ID为0xFF(0xFFFF)。

设置引导代码器件ID为0xFE(0x00FE)。

设置host ID为0x00(0x0000)。



枚举

枚举过程中,将给每个endpoint分配唯一的器件ID,为了增强容错性,RapidIO系统可以有两个host,经过竞争,最终只有一个host来完成枚举,如果主机枚举过程失败并发生超时事件,则另一主机重新枚举。枚举算法根据器件ID大小设置优先级,ID大的host竞争获胜,在枚举同一个endpoint时会发生竞争,失败host主动退出枚举,枚举结束之后,其他主机可以通过被动发现(passively discovery)收集网络中的路由拓扑信息。所以host的ID可以设置为0x00(0x0000)和0x01(0x0001),其中0x01的优先级更高。host应当将自己的主机使能位置1,switch没有这个位,当host释放对失败主机的锁定时,枚举完成,失败host自己检测是否被锁定和释放锁定。在开放式(open)8位器件ID系统中,如果host枚举失败,那么失败主机重新枚举时,必须等待15秒。在闭合式(closed)或者16位器件ID系统中,超时等待时间需要设计。


SRIO系统初始化过程

以Xilinx zynq说明,


使能host模式。

配置ID。

配置CPS1848路由,使能端口收发(手册默认是打开的)。

锁定host。

搜索系统拓扑。



锁定host

1读取Lock ID CSR,如果寄存器值等于host ID,则判定已经锁定,退出,否则进入2。

2写入host ID,再读取host ID,如果寄存器值大于host ID则进入退避状态,如果小于host ID,则已经被锁定(但和另一个host冲突),进入等待退避状态,等待另一个host退避。如果等于host ID,则锁定成功。

搜索系统拓扑

这里只考虑Switch是CPS1848的情况,TSI578原理是一致。


如果这个CPS1848是直接与host zynq相连的switch。

搜索CPS1848,设置0x13c寄存器Port General Control CSR的DISCV位,表示这个switch已经被发现,设置Component Tag CSR,它是一个设备的身份标识。

读0x14寄存器Switch Port Information CAR得到port数量,就是18。

循环搜索每个port,如果是host port则使能端口收发,如果是其他port,读取链路状态,如果正常,用默认ID 0xFF配置路由,使能端口收发,然后尝试锁定该端口设备(Endpoint或Switch),锁定过程和锁定host是一样的。

如果锁定成功,读取Processing Elements Features CAR寄存器,等到Function,判断设备类型,决定下一步拓扑方式。如果是Endpoint类型,关闭Master Enable,置位Discovered,分配ID号,配置该port的路由表。如果是Switch类型,则递归调用Switch枚举过程。

如果是已经锁定状态(存在环路),直接更新拓扑,不做任何配置。

如果这个CPS1848不和host直接相连。

设置DISCV位,得到与上级Switch相连的端口号,设置host的路由,设置默认路由为到host的端口。

同上。

同上。

现在拓扑关系已经搜索出来了。下面就是配置路由,因为上述搜索过程的路由配置不一定是最优配置,也不满足用户的需求。 所以现在需要按照设计需求,生成路由表然后写到各个Switch。


目录
相关文章
|
7月前
|
缓存
node中的优先从缓存中加载模块与模块的加载规则
node中的优先从缓存中加载模块与模块的加载规则
|
1月前
|
缓存 监控 前端开发
如何确保动态导入的模块被正确加载?
通过以上这些方法的综合运用,可以有效地确保动态导入的模块被正确加载,提高应用的稳定性、性能和用户体验。在实际开发过程中,要根据项目的具体情况和需求,灵活运用这些方法,并不断进行测试和优化。
32 4
|
2月前
|
监控 开发者
确保动态导入模块按正确顺序加载
【10月更文挑战第12天】 在复杂应用开发中,确保动态导入模块按正确顺序加载至关重要,直接影响应用性能、功能和稳定性。本文深入探讨了动态模块加载顺序的影响因素、解决方案及实践案例,提供了详细的策略和方法,帮助开发者有效管理模块加载顺序,提升应用质量。
|
2月前
|
JavaScript 容器
子路由的配置方法?
子路由的配置方法?
|
5月前
|
前端开发 JavaScript Linux
若依修改之后,无法访问前端项目如何解决,只能访问后端的接口,我的接口8083,端不显示咋解决?在vue.config.js文件中的映射路径要跟后端匹配,到软件商店里找到Ngnix配置代理,设80不用加
若依修改之后,无法访问前端项目如何解决,只能访问后端的接口,我的接口8083,端不显示咋解决?在vue.config.js文件中的映射路径要跟后端匹配,到软件商店里找到Ngnix配置代理,设80不用加
|
7月前
|
网络架构
怎么定义vue-router的动态路由?怎么获取传过来的动态参数?
怎么定义vue-router的动态路由?怎么获取传过来的动态参数?
|
7月前
|
安全 Python
全局代理IP的工作原理和实现方法
全局代理IP的工作原理和实现方法
142 7
|
7月前
|
安全 定位技术 数据安全/隐私保护
探究局部代理IP和全局代理IP的区别
探究局部代理IP和全局代理IP的区别
|
7月前
|
网络架构
定义vue-router的动态路由以及如何获取传过来的动态参数
定义vue-router的动态路由以及如何获取传过来的动态参数
276 1
|
7月前
|
前端开发
子路由的配置方法
子路由的配置方法
50 0

相关实验场景

更多