摘要
从 Messaged-Signaled Interrupt (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()
会创建与给定 MSI 对应的中断对象
zx_msi_allocate()
创建的 MSI 分配句柄中。这个
对象可与各种中断系统调用一起使用,就像
将使用 zx_interrupt_create()
返回的 Interrupt 对象。仅一个
一次只能根据 msi_id 创建中断对象,但相同的 vmo 和
vmo_offset 适用于通过同一 MSI 分配创建的多个 MSI
对象。这样一来,根资源的持有者就可以同时分配矢量
和 MSI 文件,并创建与
以便在设备驱动程序中使用这些矢量。
vmo 应是一个句柄,用于指代实体 vmo(通过
*zx_vmo_create_physical()
)与缓存政策搭配使用
*ZX_CACHE_POLICY_UNCACHED_DEVICE.出于测试目的,
*可以使用 zx_vmo_create_contiguous()
个行动号召视频广告系列。
msi_id 与给定 MSI 分配中的矢量相对应,以创建中断 对象。msi_id 必须介于 0 和分配大小减 1 之间(含 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
handle 不是适当的类型。
ZX_ERR_INVALID_ARGS
msi_id 不是分配范围内的有效 MSI ID
由 handle 引用,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 对应的中断对象
*存在。
另请参阅
zx_interrupt_wait()
zx_msi_allocate()
zx_vmo_create_contiguous()
zx_vmo_create_physical()
zx_vmo_set_cache_policy()