zx_msi_create

总结

从 Messaged-Signaled Interrupt (MSI) 分配创建 Interrupt 对象。

声明

#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 对应的 Interrupt 对象。此对象可以与各种中断系统调用一起使用,方式与使用由 zx_interrupt_create() 返回的 Interrupt 对象相同。每个 msi_id 一次只能创建一个 Interrupt 对象,但相同的 vmovmo_offset 可用于基于同一 MSI 分配对象创建的多个 MSI。这样,根资源持有者就可以从系统分配矢量和 MSI,以及创建与这些矢量对应的 Interrupt 对象,以便在设备驱动程序中使用。

vmo 应该是引用物理 vmo 的句柄(通过 *zx_vmo_create_physical() 创建),采用缓存政策 *ZX_CACHE_POLICY_UNCACHED_DEVICE。出于测试目的,可以使用连续的 *zx_vmo_create_contiguous() vmo。

msi_id 对应于给定 MSI 分配中的矢量,以便为其创建 Interrupt 对象。msi_id 必须介于 0 和分配大小减去 1(含)之间。

vmo_offset 对应于 vmo 内 MSI 功能结构开始的偏移量。有关此结构的详细信息,请参阅 PCI 本地总线规范 v3.0 第 6.8 节。

options 应为 0。

权限

handle 的类型必须为 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;handle 所引用的分配中的有效 MSI ID;vmo 不是 ZX_PAGE_SIZE 的大小;vmo 不是物理或连续的大小;vmo 没有将缓存政策设为 ZX_CACHE_POLICY_UNCACHED_DEVICE;vmo 不支持包含 MSIoff:vmo 未包含

ZX_ERR_ALREADY_BOUNDmsi_id 对应的 Interrupt 对象已*存在。

另请参阅