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 支援¶
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 - 如果指定,則等待特定的回覆,並在返回給呼叫者之前丟棄該回復。