在Linux系统下支持多RC的PCIE设备动态扫描方法

文档序号:8498657阅读:2889来源:国知局
在Linux系统下支持多RC的PCIE设备动态扫描方法
【技术领域】
[0001]本发明涉及嵌入式系统应用技术领域,具体涉及在Linux系统下支持多RC(Rootcomplex,根组件)的 PCIE (Peripheral Component Interconnect Express,高速外设部件互连)设备动态扫描方法。
【背景技术】
[0002]目前,Linux系统被广泛适用于嵌入式产品开发中,随着嵌入式技术的发展,产品设计的集成度也越来越高,在高端通信设备中,嵌入式Linux系统需要支持多种类型的PCIE设备,有的PCIE设备需要在系统正常启动后再按照一定的时序配置好其电源、时钟才能正常工作;有的PCIE设备需要在系统正常运行时卸载。
[0003]通常Linux系统内核在启动时会自动扫描PCIE设备,并且为其配置和分配系统的总线号、地址、中断等资源;而Linux系统启动时一旦为PCIE设备分配了资源,那么即使在系统运行过程中添加或配置了新的PCIE设备,在系统不复位的情况下,这些已经被分配的资源也不会改变,以至于影响系统对动态加载的PCIE设备的支持,造成系统不能支持PCIE设备的动态加载,严重制约了系统的扩展性和实用性,尤其对于长期不能掉电需要在线扩展功能的设备而言影响跟为严重,例如骨干网通信节点设备。
[0004]为了能够支持PCIE设备的动态扫描,满足特殊设备节点高稳定性、可扩展性的要求,目前业界的做法是通过对Linux系统传统的sysfs文件子系统的访问实现对PCIE设备的动态扫描和卸载等操作,实现长期不间断业务站点的功能扩展或升级的功能,如图2所示,在上述方案中,在Linux内核初始化好PCI子系统后,用户通过sysfs文件子系统发送命令,内核对用户命令进行解析,然后执行相应的设备扫描或者卸载操,相关命令示例如下:
[0005]扫描PCIE设备命令示例:
[0006]echo l>/sys/bus/pci/slots/0001\:03\:00.0/power ;
[0007]卸载PCIE设备命令示例:
[0008]echo 0>/sys/bus/pci/slots/0001\:03\:00.0/powerο
[0009]如图1所示,在嵌入式Linux系统中,内核上电初始化时对PCIE总线采用深度优先的扫描算法,对于包含多个RC的系统,内核会依次为每个RC按照深度优先的算法分配总线号资源,系统首先深度优先遍历第一个RC,分配了总线号O和I ;接着深度优先遍历第二个RC,分配了总线号2和3 ;最后深度优先遍历第三个RC,分配了总线号4,5,6,7,8,9,10和11。
[0010]而该方案存在以下缺陷:
[0011](I)随着PCIE设备的广泛使用,如今的PCIE设备可能内含桥片,在对PCIE设备动态扫描过程中会产生多级总线,存在多个RC的处理器系统,由于上述方案没有考虑多个RC或者PCIE桥设备动态加入系统的应用场景,此时采用上述方案进行PCIE设备动态扫描方案会产生多级总线地址冲突,造成PCIE设备无法正常加载到系统的严重后果,可见,上述方案无法有效的应用于包含多个RC的系统和包含PCIE桥设备的复杂系统中,解决PCIE总线上的动态扫描或者热拔插之类的问题;
[0012](2)由于有些RC控制器对PCIE设备的访问有一定的约束条件,比如说要求PCIE外设存在且物理链路没问题或者上电时EP设备必须就绪,由于上述方案没有对RC主设备物理链路进行优化控制,当EP物理链路状态变化时,在通过sysfs文件子系统进行PCIE设备扫描时可能会扫描不到PCIE设备、或者导致系统崩溃,不仅致使稳定性较差,还对于嵌入式系统中需要动态配置上电时序、工作时钟的PCIE设备无法支持,只对在上电阶段就链接正常EP设备的动态扫描适用;无法适用于大多数的PCIE桥下行口设备的动态扫描,制约了上述方案的应用范围,使其应用范围变窄;
[0013](3)随着通信系统的高度集成化,动态扩展骨干核心节点的业务板卡应用越来越广泛,很多业务板卡都是以PCIE子卡的方式动态添加到系统中,有些子卡可能还带有多级PCIE桥片,上述PCIE设备动态扫描方案不能实现多级PCIE桥片的PCIE设备动态扫描;
[0014](4)上述方案没有对根总线进行有效防护,当卸载RC根总线后,在不复位的情况下无法恢复,安全性差。

【发明内容】

[0015]本发明所要解决的技术问题是现有PCIE设备的动态扫描和卸载技术可扩展性低、安全性和稳定性差的问题。
[0016]为了解决上述技术问题,本发明所采用的技术方案是提供一种在Linux系统下支持多RC的PCIE设备动态扫描方法,包括以下步骤:
[0017]在系统上电初始化时,遍历系统中存在的每个RC控制器,根据系统的RC控制器数目为每个RC控制器分配连续的总线号资源,记录每个RC控制器对应的总线号信息到全局数组,并删除系统中每个RC控制器下默认的PCIE设备或者PCIE桥设备,以释放系统默认分配的资源;
[0018]根据全局数组中记载的所对应的RC控制器总线号信息,并以RC控制器根总线为判断标准进行PCIE设备动态扫描或卸载。
[0019]在上述方法中,根据系统的RC控制器数目为每个RC控制器分配连续的总线号资源的具体方法为:
[0020]最后遍历的RC控制器下的总线号数目为256除以系统中RC控制器的数目之商的整数部分与余数部分之和;
[0021]其余每个RC控制器下的总线号数目为256除以系统中RC控制器的数目之商的整数部分。
[0022]在上述方法中,系统上电初始化具体包括以下步骤:
[0023]步骤AlOl、Linux系统内核初始化;
[0024]步骤A102、根据系统的RC控制器数目为每个RC控制器分配连续的总线号资源;
[0025]步骤A103、依次深度优化遍历系统中存在的每个RC控制器,并记录每个RC控制器对应的总线号信息到全局数组;
[0026]步骤A104、检测每个RC控制器下是否存在PCIE设备或者PCIE桥设备,如果存在,执行步骤A105 ;否则,执行步骤A106
[0027]步骤A105、删除系统中每个RC控制器下默认的PCIE设备或者PCIE桥设备,以释放系统默认分配的资源,然后执行步骤A106 ;
[0028]步骤A106、判断是否完成对所有RC控制器的遍历,如果是,则执行步骤A107 ;否贝Ij,执行步骤A103,遍历下一个RC控制器;
[0029]步骤A107、初始化结束。
[0030]在上述方法中,进行PCIE设备动态扫描具体包括以下步骤:
[0031]步骤A201、PCIE设备动态扫描开始;
[0032]步骤A202、检测扫描的PCIE设备是否直接挂在RC控制器下,如果是,执行步骤A203 ;否则执行步骤A205 ;
[0033]步骤A203、检查PCIE设备物理链路的连接状态是否正常,如果链路正常,执行步骤A204 ;否则,返回操作失败的错误信息;
[0034]步骤A204、修改内核该RC控制器主设备的内核结构体链接状态信息标记;
[0035]步骤A205、检测扫描的该PCIE设备是否为PCIE桥设备,如果是,则执行步骤A206 ;否则执行步骤A208 ;
[0036]步骤A206、根据全局数组中记载的所对应的RC控制器总线号信息,为PCIE桥设备每个下行口及其设备分配连续的总线号资源;
[0037]步骤A207、以深度优先算法扫描每个下行口及其设备,并记录每个下行口及其设备的总线号信息到全局数组,然后执行步骤A209 ;
[0038]步骤A208、扫描PCIE设备,并根据全局数组中记载的所对应的RC控制器总线号信息为其分配总线号资源;
[0039]步骤A209、PCIE设备动态扫描结束。
[0040]在上述方法中,在步骤A206中,为PCIE桥设备每个下行口及其设备分配连续的总线号资源的具体方法为:
[0041]PCIE桥设备对应的RC控制器下的总线号资源数目减去被RC控制器根总线占用的总线号数目、PCIE桥设备占用的总线号数目和PCIE桥设备上行口占用的总线号数目,再除以该PCIE桥设备下行口的数目商的整数部
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1