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