Linux Switchtec 支援

Microsemi 的 “Switchtec” 系列 PCI 交換機裝置已經透過標準 PCI 交換機驅動程式得到核心支援。 但是,Switchtec 裝置公佈了一個特殊的管理端點,可以啟用一些額外的功能。 這包括

  • 資料包和位元組計數器

  • 韌體升級

  • 事件和錯誤日誌

  • 查詢埠連結狀態

  • 自定義使用者韌體命令

switchtec 核心模組實現了此功能。

介面

與 Switchtec 管理韌體通訊的主要方式是透過記憶體對映遠端過程呼叫 (MRPC) 介面。 命令透過 4 位元組命令識別符號和最多 1KB 的命令特定資料提交到該介面。 韌體將以 4 位元組返回程式碼和最多 1KB 的命令特定資料響應。 該介面一次只處理一個命令。

使用者空間介面

MRPC 介面將透過一個簡單的字元裝置暴露給使用者空間:/dev/switchtec#,系統中的每個管理端點都有一個。

字元裝置具有以下語義

  • 寫入必須包含至少 4 個位元組,最多 1028 個位元組。 前 4 個位元組將被解釋為命令 ID,其餘位元組將用作輸入資料。 寫入會將命令傳送到韌體以開始處理。

  • 每次寫入後必須準確跟隨一次讀取。 任何雙重寫入都會產生錯誤,任何不跟隨寫入的讀取都會產生錯誤。

  • 讀取將阻塞,直到韌體完成命令並返回 4 位元組命令返回值加上最多 1024 位元組的輸出資料。 (長度將由讀取呼叫的 size 引數指定 - 讀取少於 4 個位元組將產生錯誤。)

  • poll 呼叫也將被使用者空間應用程式支援,這些應用程式需要在等待命令完成時執行其他操作。

該裝置還支援以下 IOCTL

  • SWITCHTEC_IOCTL_FLASH_INFO - 檢索韌體長度和裝置中的分割槽數。

  • SWITCHTEC_IOCTL_FLASH_PART_INFO - 檢索快閃記憶體中任何指定分割槽的地址和長度。

  • SWITCHTEC_IOCTL_EVENT_SUMMARY - 讀取指示所有未清除事件的點陣圖結構。

  • SWITCHTEC_IOCTL_EVENT_CTL - 獲取當前計數,清除和設定任何事件的標誌。 此 ioctl 接受一個 switchtec_ioctl_event_ctl 結構,其中設定了 event_id、index 和 flags(index 是非全域性事件的分割槽或 PFF 編號)。 它返回事件是否已發生、發生的次數以及任何事件特定資料。 這些標誌可用於清除計數或啟用和停用事件發生時要執行的操作。 透過使用 SWITCHTEC_IOCTL_EVENT_FLAG_EN_POLL 標誌,您可以設定一個事件以觸發 poll 命令以返回 POLLPRI。 透過這種方式,使用者空間可以等待事件發生。

  • SWITCHTEC_IOCTL_PFF_TO_PORT 和 SWITCHTEC_IOCTL_PORT_TO_PFF 在 PCI 功能框架編號(由事件系統使用)和 Switchtec 邏輯埠 ID 和分割槽編號(對使用者更友好)之間進行轉換。

非透明橋 (NTB) 驅動程式

ntb_hw_switchtec 中為 Switchtec 硬體提供了一個 NTB 硬體驅動程式。 目前,它僅支援配置為正好 2 個 NT 分割槽和零個或多個非 NT 分割槽的交換機。 它還需要以下配置設定

  • 兩個 NT 分割槽必須能夠訪問彼此的 GAS 空間。 因此,管理設定下的 GAS 訪問向量中的位必須設定為支援此功能。

  • 核心配置必須包含對 NTB 的支援(需要設定 CONFIG_NTB)

NT EP BAR 2 將被動態配置為直接視窗,配置檔案不需要顯式配置它。

有關 Linux NTB 堆疊的總體瞭解,請參閱 Linux 原始碼樹中的 NTB 驅動程式。 ntb_hw_switchtec 在此堆疊中充當 NTB 硬體驅動程式。