摘要
从消息信号中断 (MSI) 分配创建中断对象。
声明
#include <zircon/syscalls.h>
zx_status_t zx_msi_create(zx_handle_t handle,
uint32_t options,
uint32_t msi_id,
zx_handle_t vmo,
size_t vmo_offset,
zx_handle_t* out_interrupt);
说明
zx_msi_create() 在由 zx_msi_allocate() 创建的 MSI 分配句柄内,创建与给定 MSI 对应的中断对象。此对象可与各种中断系统调用搭配使用,就像使用 zx_interrupt_create() 返回的 Interrupt 对象一样。每个 msi_id 一次只能创建一个中断对象,但相同的 vmo 和 vmo_offset 可用于从同一 MSI 分配对象创建的多个 MSI。这样一来,根资源的持有者既可以从系统分配向量和 MSI,也可以创建与这些向量对应的中断对象,以供设备驱动程序使用。
vmo 应当是引用具有缓存政策 ZX_CACHE_POLICY_UNCACHED_DEVICE 的物理 vmo(通过 zx_vmo_create_physical() 创建)的句柄。出于测试目的,可以使用连续的 *zx_vmo_create_contiguous() vmo。
msi_id 对应于给定 MSI 分配中的向量,用于创建中断对象。msi_id 必须介于 0 和分配大小减 1 之间(含 0 和分配大小减 1)。
vmo_offset 对应于 vmo 中 MSI 功能结构开始的偏移量。有关此结构的详细信息,请参阅 PCI Local Bus Specification v3.0 的第 6.8 节。
选项应为 0。
权限
句柄必须是 ZX_OBJ_TYPE_MSI 类型。
vmo 必须是 ZX_OBJ_TYPE_VMO 类型。
vmo 必须具有 ZX_RIGHT_MAP。
返回值
如果成功,zx_msi_create() 会返回 ZX_OK。如果失败,则返回负错误值。
错误
ZX_ERR_BAD_HANDLE 句柄无效。
ZX_ERR_WRONG_TYPE 句柄的类型不合适。
ZX_ERR_INVALID_ARGS msi_id 不是 handle 所指分配中的有效 MSI ID,vmo 的大小不是 ZX_PAGE_SIZE,vmo 不是物理或连续的,vmo 的缓存政策未设置为 ZX_CACHE_POLICY_UNCACHED_DEVICE,vmo 似乎不包含受支持的 MSI/MSI-X 功能,vmo_offset 超出 vmo 的范围,vmo_offset 对于找到的功能结构类型无效,options 不为 0,或者 out_interrupt 为 NULL。
ZX_ERR_ALREADY_BOUND 与 msi_id 对应的中断对象已存在。