簡介¶
RapidIO 標準是一種基於資料包的結構互連標準,設計用於嵌入式系統。RapidIO 標準的開發由 RapidIO 貿易協會 (RTA) 指導。當前版本的 RapidIO 規範可從 RTA 網站 [1] 公開下載。
本文件描述了 Linux RapidIO 子系統的基本原理,並提供了有關其主要元件的資訊。
1 概述¶
由於 RapidIO 子系統遵循 Linux 裝置模型,因此它透過定義 RapidIO 特定的裝置和匯流排型別並在裝置模型中註冊它們,從而整合到核心中,與其他匯流排類似。
Linux RapidIO 子系統與體系結構無關,因此定義了體系結構特定的介面,這些介面為常見的 RapidIO 子系統操作提供支援。
2. 核心元件¶
典型的 RapidIO 網路是端點和交換機的組合。這些元件中的每一個都由子系統中關聯的資料結構表示。RapidIO 子系統的核心邏輯元件在 include/linux/rio.h 檔案中定義。
2.1 主埠¶
主埠(或 mport)是 RapidIO 介面控制器,它位於執行 Linux 程式碼的處理器本地。主埠生成和接收 RapidIO 資料包(事務)。在 RapidIO 子系統中,每個主埠由 rio_mport 資料結構表示。此結構包含主埠特定的資源,例如郵箱和門鈴。rio_mport 還包括一個唯一的主機裝置 ID,當主埠配置為列舉主機時,該 ID 有效。
RapidIO 主埠由子系統特定的 mport 裝置驅動程式提供服務,這些驅動程式為此子系統定義的功能。為了為 RapidIO 子系統操作提供與硬體無關的介面,rio_mport 結構包括 rio_ops 資料結構,該結構包含指向 RapidIO 函式的硬體特定實現的指標。
2.2 裝置¶
RapidIO 裝置是網路中的任何端點(mport 除外)或交換機。所有裝置都在 RapidIO 子系統中由相應的 rio_dev 資料結構表示。裝置形成一個全域性裝置列表和每個網路的裝置列表(取決於可用的 mport 和網路的數量)。
2.3 交換機¶
RapidIO 交換機是一種特殊型別的裝置,它將資料包在其埠之間路由到其最終目的地。交換機內的資料包目標埠由內部路由表定義。交換機在 RapidIO 子系統中由 rio_dev 資料結構擴充套件的 rio_switch 資料結構表示,該結構包含交換機特定資訊,例如路由表的副本和指向交換機特定函式的指標。
RapidIO 子系統定義了子系統特定交換機驅動程式的格式和初始化方法,這些驅動程式旨在提供通用交換機管理例程的硬體特定實現。
2.4 網路¶
RapidIO 網路是互連的端點和交換機裝置的組合。系統已知的每個 RapidIO 網路都由相應的 rio_net 資料結構表示。此結構包括形成同一網路的所有裝置和本地主埠的列表。它還包含指向用於與網路中的裝置通訊的預設主埠的指標。
2.5 裝置驅動程式¶
RapidIO 裝置特定的驅動程式遵循 Linux 核心驅動程式模型,旨在支援連線到 RapidIO 網路的特定 RapidIO 裝置。
2.6 子系統介面¶
RapidIO 互連規範定義了可用於為所有參與的 RapidIO 裝置提供一個或多個通用服務層的功能。這些通用服務可以獨立於裝置特定的驅動程式執行,也可以由裝置特定的驅動程式使用。此類服務提供商的示例是 RIONET 驅動程式,該驅動程式實現了基於乙太網的 RapidIO 介面。因為只能為一個設備註冊一個驅動程式,所以所有常見的 RapidIO 服務都必須註冊為子系統介面。這允許將多個通用服務附加到同一裝置,而不會阻止附加裝置特定的驅動程式。
3. 子系統初始化¶
為了初始化 RapidIO 子系統,平臺必須初始化並在 RapidIO 網路中註冊至少一個主埠。為了在子系統控制器驅動程式的初始化程式碼中註冊 mport,請為每個可用的主埠呼叫函式 rio_register_mport()。
在所有活動主埠都已註冊到 RapidIO 子系統後,可以自動或透過使用者空間命令呼叫列舉和/或發現例程。
RapidIO 子系統可以配置為核心的靜態連結或模組化元件(請參見下面的詳細資訊)。
4. 列舉和發現¶
4.1 概述¶
RapidIO 子系統配置選項允許使用者將列舉和發現方法構建為靜態連結的元件或可載入的模組。列舉/發現方法實現和可用的輸入引數定義瞭如何將任何給定的方法附加到可用的 RapidIO mport:簡單地附加到所有可用的 mport,或者單獨附加到指定 mport 裝置。
根據選擇的列舉/發現構建配置,有幾種方法可以啟動列舉和/或發現過程
(a) 靜態連結的列舉和發現過程可以在核心初始化期間使用相應的模組引數自動啟動。自從引入 RapidIO 子系統以來,這就是使用的原始方法。現在,此方法依賴於列舉器模組引數,對於現有的基本列舉/發現方法,該引數為“rio-scan.scan”。當使用列舉/發現的自動啟動時,使用者必須確保在列舉端點之前啟動所有發現端點,並且正在等待列舉完成。配置選項 CONFIG_RAPIDIO_DISC_TIMEOUT 定義了發現端點等待列舉完成的時間。如果指定的超時到期,則發現過程將終止,而不會獲得 RapidIO 網路資訊。注意:超時的發現過程稍後可以使用使用者空間命令重新啟動,如下所述(如果給定的端點已成功列舉)。
(b) 可以透過來自使用者空間的命令啟動靜態連結的列舉和發現過程。與上面的選項 (a) 相比,此啟動方法為系統啟動提供了更大的靈活性。在成功啟動所有參與端點之後,應首先透過發出使用者空間命令來啟動列舉過程,在列舉完成後,可以在所有剩餘端點上啟動發現過程。
(c) 可以透過來自使用者空間的命令啟動模組化列舉和發現過程。在載入列舉/發現模組後,可以透過發出使用者空間命令來啟動網路掃描過程。與上面的選項 (b) 類似,必須首先啟動列舉器。
(d) 可以透過模組初始化例程啟動模組化列舉和發現過程。在這種情況下,應首先載入列舉模組。
啟動網路掃描過程時,它會根據主埠的配置角色(主機或代理)呼叫列舉或發現例程。
如果透過分配大於或等於零的主機目標 ID 將主埠配置為主機埠,則列舉由主埠執行。可以使用各種方法將主機目標 ID 分配給主埠,具體取決於 RapidIO 子系統構建配置
(a) 對於靜態連結的 RapidIO 子系統核心,請使用命令列引數“rapidio.hdid=”,並按 mport 設備註冊的順序排列目標 ID 分配列表。例如,在具有兩個 RapidIO 控制器的系統中,命令列引數“rapidio.hdid=-1,7”將導致將主機目標 ID=7 分配給第二個 RapidIO 控制器,而第一個 RapidIO 控制器將被分配目標 ID=-1。
(b) 如果 RapidIO 子系統核心構建為可載入模組,除了上面顯示的方法之外,還可以使用傳統的傳遞模組引數“hdid=”的方法來指定主機目標 ID,
來自命令列:“modprobe rapidio hdid=-1,7”,或
來自 modprobe 配置檔案,使用配置命令“options”,如本示例所示:“options rapidio hdid=-1,7”。modprobe 配置檔案的示例在下面的部分中提供。
- 備註
(i) 如果省略“hdid=”引數,則所有可用的 mport 都將被分配目標 ID = -1;
(ii) 在具有多個 mport 的系統中,“hdid=”引數可以省略目標 ID 分配(預設 = -1)。
如果特定主埠的主機裝置 ID 設定為 -1,則將為其執行發現過程。
列舉和發現例程使用 RapidIO 維護事務來訪問裝置的配置空間。
注意:如果 RapidIO 交換機特定的裝置驅動程式構建為可載入模組,則必須在列舉/發現過程開始之前載入它們。此要求是由於列舉/發現方法在早期階段呼叫供應商特定的回撥。
4.2 自動啟動列舉和發現¶
自動列舉/發現啟動方法僅適用於內建列舉/發現 RapidIO 配置選擇。要透過現有的基本列舉器方法集啟用自動列舉/發現啟動,請使用引導命令列引數“rio-scan.scan=1”。
此配置需要同步啟動構成將被列舉/發現的網路的全部 RapidIO 端點。必須在列舉開始之前啟動發現端點,以確保所有 RapidIO 控制器都已初始化並準備好被發現。配置引數 CONFIG_RAPIDIO_DISC_TIMEOUT 定義了發現端點將等待列舉完成的時間(以秒為單位)。
當選擇自動列舉/發現啟動時,基本方法的初始化例程會呼叫 rio_init_mports() 來為所有已知的 mport 裝置執行列舉或發現。
根據 RapidIO 網路的大小和配置,由於需要同步啟動所有端點,因此這種自動列舉/發現啟動方法可能難以使用。
4.3 使用者空間啟動列舉和發現¶
使用者空間啟動列舉和發現可以與內建和模組化構建配置一起使用。對於使用者空間控制的啟動,RapidIO 子系統會建立 sysfs 只寫屬性檔案“/sys/bus/rapidio/scan”。要在特定的 mport 裝置上啟動列舉或發現過程,使用者需要將 mport_ID(不是 RapidIO 目標 ID)寫入該檔案。mport_ID 是在 mport 設備註冊期間分配的序列號 (0 ... RIO_MAX_MPORTS)。例如,對於具有單個 RapidIO 控制器的機器,該控制器的 mport_ID 始終為 0。
要在所有可用的 mport 上啟動 RapidIO 列舉/發現,使用者可以將“-1”(或 RIO_MPORT_ANY)寫入掃描屬性檔案。
4.4 基本列舉方法¶
這是自 RapidIO 子系統程式碼的首次釋出以來就可用的原始列舉/發現方法。列舉過程是根據 RapidIO 互連規範:附件 I [1] 中概述的列舉演算法實現的。
此方法可以配置為靜態連結或可載入模組。該方法的單個引數“scan”允許從模組初始化例程觸發列舉/發現過程。
如果此列舉/發現方法構建為模組,則只能啟動一次,並且不支援解除安裝。
列舉過程使用遞迴深度優先演算法遍歷網路。當找到新裝置時,列舉器透過寫入主機裝置 ID 鎖定 CSR 來獲取該裝置的所有權。這樣做是為了確保列舉器具有列舉該裝置的專有權。如果成功獲取裝置所有權,則列舉器會分配一個新的 rio_dev 結構,並根據裝置的功能對其進行初始化。
如果裝置是端點,則會為其分配唯一的裝置 ID,並將其值寫入裝置的基裝置 ID CSR。
如果裝置是交換機,則列舉器會分配一個額外的 rio_switch 結構來儲存交換機特定資訊。然後,針對已知的 RapidIO 交換機表查詢交換機的供應商 ID 和裝置 ID。每個交換機表條目都包含一個指向交換機特定初始化例程的指標,該例程初始化指向其餘交換機特定操作的指標,並在必要時執行硬體初始化。RapidIO 交換機沒有唯一的裝置 ID;如果需要訪問其配置暫存器,則它依靠跳數和路由來查詢附加端點的裝置 ID。如果交換機(或交換機鏈)沒有任何附加的端點(列舉器除外),則將分配一個偽裝置 ID 以配置到該交換機的路由。在沒有端點的交換機鏈的情況下,使用一個偽裝置 ID 來配置透過整個鏈的路由,並且透過其跳數值來區分交換機。
對於端點和交換機,列舉器都會將唯一的元件標記寫入裝置的元件標記 CSR。錯誤管理通知機制使用該唯一值來標識正在報告錯誤管理事件的裝置。
透過迭代該交換機的每個活動出口埠來完成交換機之外的列舉。對於每個活動連結,將暫時將到預設裝置 ID(對於 8 位系統為 0xFF,對於 16 位系統為 0xFFFF)的路由寫入路由表。該演算法透過呼叫自身並使用 hopcount + 1 和預設裝置 ID 來訪問活動埠上的裝置來遞迴呼叫自身。
在主機完成對整個網路的列舉後,它透過清除裝置 ID 鎖來釋放裝置(呼叫 rio_clear_locks())。對於系統中的每個端點,它都會設定埠通用控制 CSR 中的已發現位,以指示列舉已完成,並且允許代理執行網路的被動發現。
發現過程由代理執行,類似於上面描述的列舉過程。但是,發現過程的執行不會更改現有路由,因為代理僅收集有關 RapidIO 網路結構的資訊,並構建已發現裝置的內部對映。這樣,RapidIO 子系統的每個基於 Linux 的元件都具有網路的完整檢視。發現過程可以由多個代理同時執行。在初始化其 RapidIO 主埠後,每個代理都會等待主機完成列舉,等待配置的等待時間段。如果在列舉完成之前此等待時間段到期,則代理會跳過 RapidIO 發現並繼續進行剩餘的核心初始化。
4.5 新增新的列舉/發現方法¶
RapidIO 子系統程式碼組織允許新增新的列舉/發現方法作為新的配置選項,而不會對核心 RapidIO 程式碼產生重大影響。
在可以啟動列舉/發現過程之前,必須將新的列舉/發現方法附加到一個或多個 mport 裝置。通常,該方法的模組初始化例程會呼叫 rio_register_scan() 將列舉器附加到指定的 mport 裝置(或裝置)。基本列舉器實現演示了此過程。
4.6 使用可載入的 RapidIO 交換機驅動程式¶
如果 RapidIO 交換機驅動程式構建為可載入模組,則使用者必須確保在列舉/發現開始之前載入它們。可以透過在 RapidIO 特定的 modprobe 配置檔案中指定前置或後置依賴關係來自動執行此過程,如下例所示。
檔案 /etc/modprobe.d/rapidio.conf
# Configure RapidIO subsystem modules
# Set enumerator host destination ID (overrides kernel command line option)
options rapidio hdid=-1,2
# Load RapidIO switch drivers immediately after rapidio core module was loaded
softdep rapidio post: idt_gen2 idtcps tsi57x
# OR :
# Load RapidIO switch drivers just before rio-scan enumerator module is loaded
softdep rio-scan pre: idt_gen2 idtcps tsi57x
--------------------------
- 注意
在上面的示例中,必須刪除或註釋掉“softdep”命令之一,以保持所需的模組載入順序。
5. 參考¶
- [1] RapidIO 貿易協會。RapidIO 互連規範。
- [2] Rapidio TA。技術比較。
- [3] Linux 的 RapidIO 支援。
- [4] Matt Porter。Linux 的 RapidIO。渥太華 Linux 研討會,2005
https://kernel.linux.club.tw/doc/ols/2005/ols2005v2-pages-43-56.pdf