我在我的 linux 驱动程序中添加了 IOMMU 支持,并注意到 IOMMU 组在引导期间分配给了设备:
[0.942274] iommu:将设备 0000:03:00.0 添加到组 28
虽然,当我尝试iommu_attach_device()
进入驱动程序时,它失败了。我发现它在调用iommu_group_get()
我的设备时失败了。
如何为我的设备获取分配的组并在我的驱动程序中使用它?
我正在使用 Ubuntu 4.15.0-45-generic 内核。
编辑:
iommu_group_get()
当struct device
字段iommu_group
未初始化时失败。另外,我在启动后手动加载驱动程序。
Edit2: 我确实看到该设备已添加到 dmesg 输出中的第 28 组。我的驱动程序探测例程中有以下序列,这是通过引用现有内核驱动程序源获得的:
if iommu_present()
iommu_domain_alloc(&pci_bus_type)
iommu_set_fault_handler()
group = iommu_group_get();
// added group check since iommu_attach_device is failing
// group is NULL, was expecting group_28
iommu_attach_device()
init_iova_domain()
我已经调用 IOCTL 来固定用户空间虚拟地址 ( get_user_pages_fast
) 并执行iommu_map
. 这对于使用用户空间区域为设备启用 DMA 是否有效?