zx_msi_create

摘要

从消息信号中断 (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 一次只能创建一个中断对象,但相同的 vmovmo_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_BOUNDmsi_id 对应的中断对象已存在。

另请参阅