Compute Engine 虛擬乙太網 (gve) 的 Linux 核心驅動程式:

支援的硬體

GVE 驅動程式繫結到 Compute Engine VM 中某些虛擬乙太網裝置使用的單個 PCI 裝置 ID。

欄位

註釋

供應商 ID

0x1AE0

Google

裝置 ID

0x0042

子供應商 ID

0x1AE0

Google

子裝置 ID

0x0058

修訂 ID

0x0

裝置類

0x200

乙太網

PCI Bar

gVNIC PCI 裝置公開三個 32 位記憶體 BAR: - Bar0 - 裝置配置和狀態暫存器。 - Bar1 - MSI-X 向量表 - Bar2 - IRQ、RX 和 TX 門鈴

裝置互動

驅動程式透過以下方式與裝置互動
  • 暫存器
    • 一個 MMIO 暫存器塊

    • 有關更多詳細資訊,請參見 gve_register.h

  • 管理佇列
    • 請參見以下描述

  • 重置
    • 裝置可以在任何時候重置

  • 中斷
    • 請參見以下支援的中斷

  • 傳輸和接收佇列
    • 請參見以下描述

描述符格式

GVE 支援兩種描述符格式:GQI 和 DQO。這兩種格式具有完全不同的描述符,將在下面描述。

定址模式

GVE 支援兩種定址模式:QPL 和 RDA。QPL(“佇列頁面列表”)模式透過一組預先註冊的頁面傳遞資料。

對於 RDA(“原始 DMA 定址”)模式,頁面集是動態的。因此,資料包緩衝區可以位於訪客記憶體中的任何位置。

暫存器

所有暫存器都是 MMIO。

這些暫存器用於初始化和配置裝置,以及查詢裝置狀態以響應管理中斷。

位元組序

  • 管理佇列訊息和暫存器都是大端位元組序。

  • GQI 描述符和資料路徑暫存器是大端位元組序。

  • DQO 描述符和資料路徑暫存器是小端位元組序。

管理佇列 (AQ)

管理佇列是一個 PAGE_SIZE 記憶體塊,被視為 AQ 命令的陣列,驅動程式使用它來向裝置發出命令並設定資源。驅動程式和裝置維護已提交和執行的命令計數。要發出 AQ 命令,驅動程式必須執行以下操作(使用適當的鎖定)

  1. 將新命令複製到 AQ 陣列中的下一個可用插槽

  2. 將其計數器增加新命令的數量

  3. 將計數器寫入 GVE_ADMIN_QUEUE_DOORBELL 暫存器

  4. 輪詢 ADMIN_QUEUE_EVENT_COUNTER 暫存器,直到它等於寫入門鈴的值,或直到超時。

裝置將更新每個 AQ 命令中的狀態欄位,並透過 ADMIN_QUEUE_EVENT_COUNTER 暫存器報告為已執行。

裝置重置

透過將 0x0 寫入 AQ PFN 暫存器來觸發裝置重置。 這會導致裝置釋放驅動程式分配的所有資源,包括 AQ 本身。

中斷

驅動程式支援以下中斷

管理中斷

裝置使用管理中斷來告訴驅動程式檢視 GVE_DEVICE_STATUS 暫存器。

管理 irq 的處理程式只是將服務任務排隊到工作佇列中,以檢查暫存器並確認 irq。

通知塊中斷

通知塊中斷用於告訴驅動程式輪詢與該中斷關聯的佇列。

這些 irq 的處理程式排程該塊的 napi 執行並輪詢佇列。

GQI 流量佇列

GQI 佇列由描述符環和緩衝區組成,並分配給通知塊。

描述符環是由固定大小描述符組成的二次冪大小的環形緩衝區。 它們使用位於 Bar2 中的 __be32 門鈴來推進其頭指標。 尾指標透過按順序消耗描述符並更新 __be32 計數器來推進。 門鈴和計數器都溢位為零。

每個佇列的緩衝區必須提前在裝置中註冊為佇列頁面列表,並且資料包資料只能放入這些頁面中。

傳送

gve 將用於傳輸環的緩衝區對映到 FIFO 中,並在將資料包傳送到 NIC 之前將資料包複製到 FIFO 中。

接收

用於接收環的緩衝區被放入資料環中,該資料環的長度與描述符環相同,並且頭指標和尾指標一起在環上前進。

DQO 流量佇列

  • 每個 TX 和 RX 佇列都分配有一個通知塊。

  • TX 和 RX 緩衝區佇列(將描述符傳送到裝置)使用 MMIO 門鈴來通知裝置有關新描述符。

  • RX 和 TX 完成佇列(從裝置接收描述符)使用“生成位”來了解裝置何時填充了描述符。 驅動程式使用“當前生成”初始化所有位。 裝置將使用與當前生成相反的“下一代”填充接收到的描述符。 當環迴繞時,當前/下一代會交換。

  • 驅動程式有責任確保 RX 和 TX 完成佇列不會溢位。 這可以透過限制釋出到 HW 的描述符數量來實現。

  • TX 資料包有一個 16 位 completion_tag,RX 緩衝區有一個 16 位 buffer_id。 這些將分別在 TX 完成佇列和 RX 佇列上返回,以讓驅動程式知道哪個資料包/緩衝區已完成。

傳送

在傳輸之前,資料包的緩衝區被 DMA 對映以供裝置訪問。 資料包成功傳輸後,緩衝區將被取消對映。

接收

驅動程式將固定大小的緩衝區釋出到 RX 緩衝區佇列上的 HW。 在關聯的 RX 佇列上接收到的資料包可能跨越多個描述符。