drm/nouveau NVIDIA GPU 驅動程式

drm/nouveau 驅動程式為各種 NVIDIA GPU 提供支援,涵蓋 GeForce、Quadro 和 Tesla 系列,從 NV04 架構到最新的 Turing、Ampere、Ada 系列。

NVKM:NVIDIA 核心管理器

NVKM 元件是 nouveau 驅動程式中的核心抽象層,負責在核心級別管理 NVIDIA GPU 硬體。 NVKM 為處理各種 GPU 架構提供了一個統一的介面。

它支援資源管理、電源控制、記憶體處理和命令提交,這是 nouveau 驅動程式下 NVIDIA GPU 正常執行所必需的。

NVKM 在抽象硬體複雜性併為驅動程式堆疊的上層提供一致的 API 方面發揮著關鍵作用。

GSP 支援

https://github.com/NVIDIA/open-gpu-kernel-modules/blob/535/src/nvidia/inc/kernel/gpu/gsp/message_queue_priv.h

GSP 命令佇列和狀態佇列是軟體和 GSP 之間通訊的訊息佇列。 軟體透過 GSP 命令佇列提交 GSP RPC,GSP 將提交的 RPC 的狀態寫入狀態佇列。

一個 GSP 訊息佇列元素由三部分組成

  • 訊息元素頭(struct r535_gsp_msg),主要維護元素排隊的元資料。

  • RPC 訊息頭(struct nvfw_gsp_rpc),維護 RPC 的資訊。 例如,RPC 函式編號。

  • 有效負載,RPC 訊息駐留的地方。 例如,特定 RPC 函式的引數。 一些 RPC 函式在有效負載中也有它們的頭。 例如,rm_alloc、rm_control。

GSP 訊息元素的記憶體佈局可以如下圖所示

+------------------------+
| Message Element Header |
|    (r535_gsp_msg)      |
|                        |
| (r535_gsp_msg.data)    |
|          |             |
|----------V-------------|
|    GSP RPC Header      |
|    (nvfw_gsp_rpc)      |
|                        |
| (nvfw_gsp_rpc.data)    |
|          |             |
|----------V-------------|
|       Payload          |
|                        |
|   header(optional)     |
|        params          |
+------------------------+

訊息佇列元素的最大大小為 16 頁(包括標頭)。 當要傳送的 GSP 訊息大於 16 頁時,應將該訊息拆分為多個元素並相應地傳送。

在拆分的元素中,第一個元素具有預期的函式編號,而其餘元素則以函式編號 NV_VGPU_MSG_FUNCTION_CONTINUATION_RECORD 傳送。

GSP 從 cmdq 消耗元素,並且始終將結果寫回 msgq。 該結果也形成為拆分元素。

術語

  • gsp_msg(msg):GSP 訊息元素(元素頭 + GSP RPC 頭 + 有效負載)

  • gsp_rpc(rpc):GSP RPC(RPC 頭 + 有效負載)

  • gsp_rpc_buf:(GSP RPC 頭 + 有效負載) 的緩衝區

  • gsp_rpc_len:(GSP RPC 頭 + 有效負載) 的大小

  • params_size:有效負載中引數的大小

  • payload_size:有效負載中(如果存在,則包含標頭 + 引數)的大小

在傳送 GSP RPC 命令時,根據呼叫者的要求和 GSP RPC 命令的性質,可以有多種處理 GSP RPC 訊息(即 GSP RPC 命令的回覆)的情況。

NVKM_GSP_RPC_REPLY_NOWAIT - 如果指定,則在發出 GSP RPC 命令後立即返回到呼叫者。

NVKM_GSP_RPC_REPLY_RECV - 如果指定,則在發出 GSP RPC 命令後,等待並接收整個 GSP RPC 訊息。

NVKM_GSP_RPC_REPLY_POLL - 如果指定,則等待特定的回覆,並在返回給呼叫者之前丟棄該回復。