基于Linux實現PCIE設備熱插拔的方法及裝置的制造方法
【技術領域】
[0001]本發明涉及通信技術領域,具體涉及基于Linux實現PCIE設備熱插拔的方法及裝置。
【背景技術】
[0002]隨著處理器技術的發展,對外部設備的訪問速率和可靠性要求越來越高,目前,PCIE接口成為了處理器普遍支持的接口之一,PCIE的熱插拔技術包含了支持熱插拔的系統硬件和系統軟件,在硬件方面需要有熱插拔控制器、接口卡電源開關邏輯線、接口卡復位線、提不按鈕(Attent1n Button)、指不器(Power Indicator/Attent1n Indicator)和接口卡檢測腳(PRSNT1#、PRSNT2#信號)等,在軟件方面需要系統支持熱插拔的操作,能對設備的插拔作出相應的響應。
[0003]當要移除接口卡的時候,需要預先通知系統,包括兩種方式,通過提示按鈕或軟件程序的“用戶界面”來實現,當按下按鈕或操作軟件程序的“用戶界面”時,熱插拔控制器獲得該信息,并向PCIE控制器發出中斷信號,系統進行處理,中止驅動程序,關閉插槽電源,釋放接口卡所分配的系統資源等,當系統處理完成后,就會控制指示燈來指示操作者可以移除接口卡。
[0004]當要插入接口卡的時候,熱插拔控制器根據接口卡檢測管腳獲得該信息,向PCIE控制器發出中斷信號,系統進行處理,使能接口卡電源,掃描接口卡的PCIE設備,分配系統資源,加載驅動等。
[0005]雖然PCIE設備具有熱插拔功能,但是不同的處理器和系統對PCIE設備的熱插拔功能支持不同,例如對于PowerPc處理器,只能在Linux系統啟動過程中對整個PCIE控制器下的設備進行掃描時,對PowerPc處理器下掛的PCIE設備進行掃描,并分配地址空間,在Linux系統啟動后,無法單獨對PowerPc處理器下掛的PCIE設備進行掃描,并分配地址空間。
[0006]具體地,在Linux系統掃描PCIE設備的過程中,對于總線號的分配采用自上而下的順序分配,但是對于地址空間的分配采用自下而上的順序分配,如圖1所示,圖1為PCIE設備外設的結構圖,由PCIE控制器、PCIE SWITCH和PCIE設備組成,其中,PCIE控制器的總線號為0,PCIE SWITCH有一個上行口和四個下行口,在Linux系統掃描PCIE設備過程中,分配總線號由上往下依次分配,即PCIE SWITCH的上行口總線號為1,四個下行口的總線號為2,四個下行口下掛的四個PCIE設備的總線號從左往右依次為3、4、5、6,而地址空間的分配則由下往上依次分配,首先會訪問四個PCIE設備來確定四個PCIE設備所需地址空間的大小,然后通過四個PCIE設備所需地址空間的大小來決定PCIE SWITCH的四個下行口所需地址空間的大小,最終通過PCIE SWITCH的四個下行口所需地址空間的大小來決定PCIE控制器給PCIE SWITCH的上行口分配的地址空間的大小。
[0007]由上可知,PowerPc處理器無法在Linux系統啟動后實現PCIE設備熱插拔功能。
【發明內容】
[0008]本發明所要解決的技術問題是解決PowerPc處理器無法在Linux系統啟動后實現PCIE設備熱插拔功能的問題。
[0009]為了解決上述技術問題,本發明所采用的技術方案是提供一種基于Linux實現PCIE設備熱插拔的方法,包括以下步驟:
[0010]Linux系統啟動后,運行應用程序,加載具有掃描PCIE設備功能的驅動,初始化PCIE SWITCH,預先為PCIE SWITCH的每個下行口分配地址空間,然后掃描母卡上的FPGA ;
[0011]創建線程,通過輪詢FPGA的寄存器檢測到PCIE插槽有子卡插入后,為插入的子卡供電;
[0012]掃描插入的子卡,通過訪問插入的子卡的配置空間來獲取其所需地址空間,并為其分配地址空間;
[0013]加載插入的子卡的驅動,啟動訪問插入的子卡的程序,通過輪詢FPGA的寄存器檢測到PCIE插槽有子卡被拔出后,退出訪問程序,并卸載拔出的子卡的驅動,通過訪問FPGA的寄存器為相應的PCIE插槽斷電。
[0014]在上述技術方案中,在所述PCIE插槽斷電后,所述Linux系統刪除相應的子卡的總線號,同時釋放相應的地址空間。
[0015]在上述技術方案中,所述PCIE設備包括所述母卡和所述子卡。
[0016]本發明還提供了一種基于Linux實現PCIE設備熱插拔的裝置,包括:
[0017]PCIE SWITCH分配地址模塊,預先為PCIE SWITCH的每個下行口分配地址空間;
[0018]檢測PCIE設備插入模塊,通過輪詢母卡上的FPGA的寄存器來檢測PCIE插槽中子卡的插入;
[0019]PCIE設備供電模塊,檢測到子卡插入時,Linux系統通過訪問FPGA的寄存器為插入的子卡供電;
[0020]掃描PCIE設備模塊,掃描插入的子卡,通過訪問插入的子卡的配置空間,獲取插入的子卡所需地址空間,并為其分配地址空間;
[0021]加載PCIE設備驅動模塊,加載插入的子卡的驅動;
[0022]檢測PCIE設備拔出模塊,通過輪詢FPGA的寄存器來檢測PCIE插槽的狀態,判斷插入的子卡是否被拔出;
[0023]卸載PCIE設備驅動模塊,在檢測到PCIE插槽有子卡被拔出后,退出訪問拔出的子卡程序,并卸載拔出的子卡的驅動;
[0024]PCIE設備斷電模塊,卸載完拔出的子卡的驅動后,Linux系統通過訪問FPGA的寄存器為相應的PCIE插槽斷電。
[0025]在上述技術方案中,還包括刪除PCIE設備模塊,在所述PCIE插槽斷電后,所述Linux系統刪除相應的子卡的總線號,同時釋放相應的地址空間。
[0026]在上述技術方案中,所述PCIE設備包括所述母卡和所述子卡,所述FPGA連接所述PCIE SWITCH的第一下行口,兩個所述子卡分別通過兩個所述PCIE插槽連接所述PCIESWITCH的第二下行口和第三下行口,同時,兩個所述子卡分別通過兩個所述PCIE插槽與所述母卡相連。
[0027]本發明,在Linux系統啟動后,預先為PCIE SWITCH的每個下行口分配地址空間,在每次掃描插入的PCIE設備并為其分配地址空間時,由于PCIE SWITCH的下行口已有地址空間,可以直接為插入的PCIE設備分配地址空間,不需要將整個PCIE控制器下的設備重新掃描一次,避免了對正在訪問插入的PCIE設備的程序產生影響,實現了 PCIE設備的熱插拔功能。
【附圖說明】
[0028]圖1為本發明實施例提供的PCIE設備外設的結構圖;
[0029]圖2為本發明實施例提供的PCIE設備的熱插拔示意圖;
[0030]圖3為本發明實施例提供的基于Linux實現PCIE設備熱插拔的裝置結構圖;
[0031]圖4為本發明實施例提供的基于Linux實現PCIE設備熱插拔的方法流程圖。
【具體實施方式】
[0032]下面結合說明書附圖和【具體實施方式】對本發明做出詳細的說明。
[0033]本發明實施例提供了一種基于Linux實現PCIE設備熱插拔的裝置,本實施例針對其中一種應用場景進行說明,本實施例中處理器為FreeScale的P2020處理器,操作系統為Linux系統,本發明提供的PCIE設備的熱插拔示意圖如圖2所示,PCIE控制器(P2020處理器)通過PCIE SWITCH進行擴展,PCIE設備分為一個母卡和兩個子卡,母卡上設有FPGA,FPGA連接PCIE SWITCH的第一下行口,兩個PCIE插槽分別連接第二下行口和第三下行口,第四下行口未使用,并且兩個子卡分別通過PCIE插槽與母卡相連。PCIE插槽還與其它的控制信號線連接,這些控制信號線由FPGA控制,主要用來檢測PCIE插槽的狀態,以及控制子卡的電源。
[0034]同時,為實現PCIE設備可隨時插拔功能,對PCIE設備和處理器也有相關要求。與標準PCIE設備的熱插拔相比較,本裝置在拔掉子卡時,無需先按按鈕或操作應用程序的“用戶界面”,可以直接拔掉子卡。在拔掉子卡時,訪問子卡的程序并不會立即退出,還會繼續訪