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 - 如果指定,则等待特定的回复,并在返回给调用者之前丢弃该回复。