Fuchsia.gpu.magma

Magma 是 Fuchsia 上 GPU/NPU 的驱动程序模型。

Magma 有两个驱动程序组件:一个是加载到每个应用地址空间的硬件专用库(“客户端驱动程序”,有时称为“可安装的客户端驱动程序”或“ICD”);以及一个与硬件进行交互的 Magma 系统驱动程序。此处定义了两个驱动程序部分之间的通信协议。

有些名称带有数字后缀(例如 BufferRangeOp2);数字后缀是协议演变过程的详细信息,可以忽略。

添加次数:9

协议

CombinedDevice

fuchsia.gpu.magma/magma.fidl 中定义

所有生产 |Device| 协议的组合。此协议在 Magma 服务端实现,客户端不应使用。

Connect2

创建与由两个 IPC 通道组成的设备连接。 主通道用于连接主要协议(见下文)。通知渠道用于仅以反向(服务器-客户端)方向的供应商特定消息,通常是在响应客户端命令完成时发送。

请求

名称类型
client_id uint64
primary_channel server_end<Primary>
notification_channel server_end<Notification>

DumpState

将驱动程序和硬件状态转储到日志。

请求

名称类型
dump_type uint32

GetIcdList

返回可与此 Magma 设备搭配使用的 ICD 列表。该列表按优先顺序降序排序。

请求

<EMPTY>

响应

名称类型
icd_list vector<IcdInfo>[8]

查询

如果成功,则以缓冲区或简单值的形式返回结果。

请求

名称类型
query_id QueryId

响应

名称类型
payload Device_Query_Result

DependencyInjection

fuchsia.gpu.magma/magma.fidl 中定义

此协议由 ZX_PROTOCOL_GPU_DEPENDENCY_INJECTION 设备实现。用于将其他服务的依赖项注入 MSD。它只能由特权进程使用。

SetMemoryPressureProvider

为 MSD 提供 fuchsia.memorypressure.Provider 实现。

请求

名称类型
provider fuchsia.memorypressure/Provider

设备

fuchsia.gpu.magma/magma.fidl 中定义

Magma 设备协议允许客户端通过进行查询(例如设备和供应商 ID)来了解硬件,以及设备的系统驱动程序支持哪些客户端驱动程序。
为了与设备进一步互动,客户端可以建立由通道对组成的连接:用于发出请求的主通道(请参阅下文的主要协议)和用于接收通知消息的辅助通道(请参阅下面的通知协议)。

Connect2

创建与由两个 IPC 通道组成的设备连接。 主通道用于连接主要协议(见下文)。通知渠道用于仅以反向(服务器-客户端)方向的供应商特定消息,通常是在响应客户端命令完成时发送。

请求

名称类型
client_id uint64
primary_channel server_end<Primary>
notification_channel server_end<Notification>

查询

如果成功,则以缓冲区或简单值的形式返回结果。

请求

名称类型
query_id QueryId

响应

名称类型
payload Device_Query_Result

DiagnosticDevice

fuchsia.gpu.magma/magma.fidl 中定义

用于公开 Magma 设备诊断的方法。

DumpState

将驱动程序和硬件状态转储到日志。

请求

名称类型
dump_type uint32

IcdLoaderDevice

fuchsia.gpu.magma/magma.fidl 中定义

由 MSD 实现,且可供使用 ICD 加载程序公开的方法。

GetIcdList

返回可与此 Magma 设备搭配使用的 ICD 列表。该列表按优先顺序降序排序。

请求

<EMPTY>

响应

名称类型
icd_list vector<IcdInfo>[8]

通知

fuchsia.gpu.magma/magma.fidl 中定义

此协议为空,因为消息内容取决于供应商。

PerformanceCounterAccess

fuchsia.gpu.magma/magma.fidl 中定义

此协议由 ZX_PROTOCOL_GPU_PERFORMANCE_COUNTERS 设备实现。

GetPerformanceCountToken

此访问令牌不用作事件,而是传递给 Primary.EnablePerformanceCounterAccess。

请求

<EMPTY>

响应

名称类型
access_token handle<event>

PerformanceCounterEvents

fuchsia.gpu.magma/magma.fidl 中定义

OnPerformanceCounterReadCompleted

表示性能计数器缓冲区有数据。这些数据将按照读取完成的顺序输出。

响应

名称类型
payload PerformanceCounterEventsOnPerformanceCounterReadCompletedRequest

主要

fuchsia.gpu.magma/magma.fidl 中定义

如果发生系统驱动程序错误,或者客户端发送一条消息表明客户端应已知无效,则连接将关闭并通过 epitaph 发送 zx.Status。

AddPerformanceCounterBufferOffsetsToPool

向池的缓冲区添加一组偏移量。|offsets[n].buffer_id| 是之前使用 ImportBuffer() 导入的缓冲区的 ID。相同的缓冲区可以添加到多个池中。即使在调用 ReleaseBuffer 之后,该池也会保留对缓冲区的引用。当转储到此条目时,计数器将从 |offsets[n].buffer_offset| 字节开始写入缓冲区,直到 |offsets[n].buffer_offset| + |offsets[n].buffer_size|。|offsets[n].buffer_size| 必须足够大,以容纳所有已启用的计数器。在调用此方法之前,必须使用 EnablePerformanceCounterAccess 启用性能计数器访问权限。

请求

名称类型
pool_id PerformanceCounterPoolId
offsets vector<BufferRange>[64]

BufferRangeOp2

对相应缓冲区范围执行操作。

请求

名称类型
op BufferOp
range BufferRange

ClearPerformanceCounters

将列出的所有性能计数器的值设置为 0。某些硬件可能不支持。在调用此方法之前,必须使用 EnablePerformanceCounterAccess 启用性能计数器访问权限。

请求

名称类型
counters PerformanceCounterSet

CreateContext

创建上下文 context_id,以便在命令执行中使用。上下文可能与硬件状态相关联。

请求

名称类型
context_id ContextId

CreatePerformanceCounterBufferPool

创建可将性能计数器转储到的缓冲区池。在调用此方法之前,必须使用 EnablePerformanceCounterAccess 启用性能计数器访问权限。

请求

名称类型
pool_id PerformanceCounterPoolId
event_channel server_end<PerformanceCounterEvents>

DestroyContext

销毁上下文 context_id

请求

名称类型
context_id ContextId

DumpPerformanceCounters

触发器将性能计数器转储到缓冲池。如果池中没有缓冲区,则可能会静默失败。|trigger_id| 是由客户端分配的任意 ID,可在 OnPerformanceCounterReadCompleted 中返回。在调用此方法之前,必须使用 EnablePerformanceCounterAccess 启用性能计数器访问权限。

请求

名称类型
pool_id PerformanceCounterPoolId
trigger_id PerformanceCounterTriggerId

EnableFlowControl

启用 OnNotificationsMessagesConsumed 和 OnNotificationsMemoryImported 事件。

请求

<EMPTY>

EnablePerformanceCounterAccess

尝试启用性能计数器 FIDL 消息。如要验证成功,PerformanceCounterAccess.GetPerformanceCountToken() 必须已从匹配设备返回 |access_token|。

请求

名称类型
access_token handle<event>

EnablePerformanceCounters

启用一组性能计数器。停用不在新集合中的已启用性能计数器。连接关闭时,性能计数器也将自动停用。在调用此方法之前,必须使用 EnablePerformanceCounterAccess 启用性能计数器访问权限。

请求

名称类型
counters PerformanceCounterSet

ExecuteCommand

通过关联的 resources 提交命令缓冲区以在硬件上执行。 resources 必须引用已导入的缓冲区。wait_semaphoressignal_semaphores 必须引用已导入的事件。wait_semaphores 在开始执行之前必须全部收到信号,然后重置。命令缓冲区完成后,signal_semaphores 将收到信号。

请求

名称类型
context_id ContextId
resources vector<BufferRange>
command_buffers vector<CommandBuffer>
wait_semaphores vector<uint64>
signal_semaphores vector<uint64>
flags CommandBufferFlags

ExecuteImmediateCommands

提交一系列命令,以便在不使用命令缓冲区的情况下在硬件上执行。 semaphores 必须引用已导入的事件,并且将在命令完成后收到信号。

请求

名称类型
context_id ContextId
command_data vector<uint8>[2048]
semaphores vector<uint64>

ExecuteInlineCommands

提交一系列命令,以便在不使用命令缓冲区的情况下在硬件上执行。 应计算发送的命令数,使总消息大小小于 MAX_INLINE_commandS_DATA_SIZE。

添加数量:15

请求

名称类型
context_id ContextId
commands vector<InlineCommand>

清空

引发到系统驱动程序的往返,用于确保所有先前的消息已被观察但不一定已完成。

请求

<EMPTY>

响应

<EMPTY>

ImportObject

导入要在系统驱动程序中使用的对象。

添加数量:13

请求

名称类型
payload PrimaryImportObjectRequest

ImportObject2

已移除:18 已弃用:17

请求

名称类型
object handle<handle>
object_type ObjectType
object_id ObjectId

IsPerformanceCounterAccessAllowed

如果任何 EnablePerformanceCounterAccess 消息成功,则返回 true。

请求

<EMPTY>

响应

名称类型
enabled bool

MapBuffer

将页面范围映射到硬件上的连接地址空间中(地址为 hw_va)。flags 是 MapFlags 中的一组标志,用于指定硬件如何访问缓冲区。

请求

名称类型
payload PrimaryMapBufferRequest

OnNotifyMemoryImported

表示服务器导入的给定缓冲区内存字节数。 调用方应限制传输中的 ImportBuffer 消息的内存量:(发送的字节数 - 服务器导入的字节数)<= MaxBytes(请参阅 QueryId::MAXIMUM_INFlight_PARAMS)。这是一个软性限制,旨在防止过多的内存消耗,但对于大型消息,客户端可能会超过该限制。服务器会尽快导入内存,但只有当已用字节数达到上限一半时,系统才会发送此事件;因此,如果客户端的传输字节数小于 max/2,客户端应发送 ImportBuffer 消息(无论其大小如何)。

响应

名称类型
bytes uint64

OnNotifyMessagesConsumed

表示服务器使用的指定数量的消息。 调用方应限制传输中消息的数量:(发送的消息 - 消耗的服务器)<= MaxMessages(请参阅 QueryId::MAXIMUM_INFlight_PARAMS)。实际上,消息会尽快被服务器使用,但只有在已使用的数量达到最大值的一半时,服务器才会发送此事件。

响应

名称类型
count uint64

ReleaseObject

在此连接内使用 object_id 销毁对象。

请求

名称类型
object_id ObjectId
object_type ObjectType

ReleasePerformanceCounterBufferPool

释放性能计数器缓冲区池。在调用此方法之前,必须使用 EnablePerformanceCounterAccess 启用性能计数器访问权限。

请求

名称类型
pool_id PerformanceCounterPoolId

RemovePerformanceCounterBufferFromPool

从池中移除缓冲区的每个偏移量。在服务器上完成此方法处理后,不会再将转储发送到此缓冲区。到此缓冲区的正在执行的转储可能会丢失。在调用此方法之前,必须使用 EnablePerformanceCounterAccess 启用性能计数器访问权限。

请求

名称类型
pool_id PerformanceCounterPoolId
buffer_id ObjectId

UnmapBuffer

针对给定 buffer_id 从硬件释放地址 hw_va 的映射。缓冲区在释放时也会隐式取消映射。

请求

名称类型
payload PrimaryUnmapBufferRequest

TestDevice

fuchsia.gpu.magma/magma.fidl 中定义

用于测试 MSD 的其他设备方法,不应供 ICD 使用。

Connect2

创建与由两个 IPC 通道组成的设备连接。 主通道用于连接主要协议(见下文)。通知渠道用于仅以反向(服务器-客户端)方向的供应商特定消息,通常是在响应客户端命令完成时发送。

请求

名称类型
client_id uint64
primary_channel server_end<Primary>
notification_channel server_end<Notification>

DumpState

将驱动程序和硬件状态转储到日志。

请求

名称类型
dump_type uint32

GetIcdList

返回可与此 Magma 设备搭配使用的 ICD 列表。该列表按优先顺序降序排序。

请求

<EMPTY>

响应

名称类型
icd_list vector<IcdInfo>[8]

GetUnitTestStatus

请求

<EMPTY>

响应

名称类型
status zx/Status

查询

如果成功,则以缓冲区或简单值的形式返回结果。

请求

名称类型
query_id QueryId

响应

名称类型
payload Device_Query_Result

结构

BufferRange

fuchsia.gpu.magma/magma.fidl 中定义

字段类型说明默认
buffer_id ObjectId 无默认取景方式
offset uint64 无默认取景方式
size uint64 无默认取景方式

CommandBuffer

fuchsia.gpu.magma/magma.fidl 中定义

命令缓冲区可用于在共享缓冲区 (VMO) 中传递硬件指令。

字段类型说明默认
resource_index uint32

包含启动命令缓冲区的指令的资源索引。

无默认取景方式
start_offset uint64

资源内的起始偏移量。

无默认取景方式

枚举

BufferOp 灵活

类型:uint32

fuchsia.gpu.magma/magma.fidl 中定义

名称说明
1

使用此范围内映射的页面填充硬件页面表格,根据需要提交页面。映射为 GROWABLE 的分配无需执行此操作,因为页面表格会按需填充。

2

正在取消填充此范围的网页表格映射。这样可以阻止硬件访问该范围内的页面,但页面会保留其内容。

ObjectType 灵活

类型:uint32

fuchsia.gpu.magma/magma.fidl 中定义

名称说明
10
已移除:18 已弃用:17
11

由 Zircon VMO 提供支持的内存对象。

12

由 Zircon 事件或 VMO 支持的同步对象。

添加数量:13

QueryId 灵活

类型:uint64

fuchsia.gpu.magma/magma.fidl 中定义

可通过 Magma 系统驱动程序查询的硬件和驱动程序相关信息类型。您也可以使用供应商特定的 ID 号,但这些 ID 会在其他位置列出。

名称说明
0

返回硬件供应商 ID(简单结果)- 如果可能,应为硬件供应商的 PCI ID,否则应为 Khronos 供应商 ID。

1

返回硬件设备 ID(简单结果)

2

返回系统驱动程序支持的供应商接口的版本。

添加数量:12
3

如果支持 MAGMA_QUERY_TOTAL_TIME,则返回 true(简单结果)

5

高 32 位:最大传输中消息数,低 32 位:最大动态内存 (MB)(简单结果)

500

返回结构体 magma_total_time_query_result(缓冲区结果);请参阅:src/graphics/lib/magma/include/magma/magma_common_defs.h

10000

供应商专用查询 ID 从此处开始

IcdInfo

fuchsia.gpu.magma/magma.fidl 中定义

可与 Magma 设备搭配使用的 ICD 实现的信息。

序数字段类型说明
component_url fuchsia.url/Url

提供 ICD 的组件实现的网址。

flags IcdFlags

用于描述 ICD 基本功能(包括其支持的 API)的标志。

InlineCommand

fuchsia.gpu.magma/magma.fidl 中定义

添加数量:15

序数字段类型说明
data vector<uint8>
semaphores vector<uint64>

PerformanceCounterEventsOnPerformanceCounterReadCompletedRequest

fuchsia.gpu.magma/magma.fidl 中定义

序数字段类型说明
trigger_id PerformanceCounterTriggerId

必选。

buffer_id ObjectId

必选。

buffer_offset uint32

必选。

timestamp zx/Time

必选。

flags ResultFlags

必选。

PrimaryImportObjectRequest 资源

fuchsia.gpu.magma/magma.fidl 中定义

序数字段类型说明
object Object

必选。

object_type ObjectType

必选。

object_id ObjectId

必选。

flags ImportFlags

可选

PrimaryMapBufferRequest

fuchsia.gpu.magma/magma.fidl 中定义

序数字段类型说明
hw_va uint64

必选。

range BufferRange

必选。

flags MapFlags

PrimaryUnmapBufferRequest

fuchsia.gpu.magma/magma.fidl 中定义

序数字段类型说明
hw_va uint64

必选。

buffer_id ObjectId

必选。

联合

Device_Query_Response 严格 资源

fuchsia.gpu.magma/magma.fidl 中定义

序数变体类型说明
simple_result uint64
buffer_result handle<vmo>

Device_Query_Result 严格 资源

fuchsia.gpu.magma/magma.fidl 中定义

序数变体类型说明
response Device_Query_Response
err zx/Status

对象灵活 资源

fuchsia.gpu.magma/magma.fidl 中定义

添加数量:13
序数变体类型说明
semaphore handle<event>
buffer handle<vmo>
vmo_semaphore handle<vmo>

BITS

CommandBufferFlags灵活

类型:uint64

fuchsia.gpu.magma/magma.fidl 中定义

名称说明
65536

供应商专用定义从这里开始

IcdFlags

类型:uint32

fuchsia.gpu.magma/magma.fidl 中定义

名称说明
1
2
4

ImportFlags 灵活

类型:uint64

fuchsia.gpu.magma/magma.fidl 中定义

添加数量:13

名称说明
1

MapFlags

类型:uint64

fuchsia.gpu.magma/magma.fidl 中定义

名称说明
1
2
4
8

出现硬件故障时可能会出现未提交的页面。如果未设置此标志,访问故障应该会导致错误。

65536

供应商专用定义从这里开始

ResultFlags 灵活

类型:uint32

fuchsia.gpu.magma/magma.fidl 中定义

名称说明
1

如果性能计数器遗漏了一些样本(例如,由于硬件在一段时间内处于保护模式),则会在 result_flags 中设置该位。

常量

名称类型说明
MAX_ICD_COUNT 8 uint64

Magma 系统驱动程序支持的 ICD 数量上限。

MAX_IMMEDIATE_COMMANDS_DATA_SIZE 2048 uint32

用于在单个消息中发送多个即时命令的批次大小。

MAX_INLINE_COMMANDS_DATA_SIZE 2048 uint32

用于在单个消息中发送多个内嵌命令的批次大小。

添加数量:15

别名

名称说明
ContextId uint32
ObjectId uint64
PerformanceCounterPoolId uint64

性能计数器池包含缓冲区的字节范围。每当触发性能计数器转储时,驱动程序就会从池中移除一个范围,将性能计数器值从硬件写入其中,然后使用 OnPerformanceCounterReadCompleted 向客户端发出信号。池 ID 是客户端分配的任意 uint64 值。

PerformanceCounterSet vector[64]

描述一组性能计数器。确切含义取决于特定驱动程序,但通常是一个位矢量,表示每个性能计数器是处于启用状态还是处于停用状态。

PerformanceCounterTriggerId uint32