我有一个 pci 设备驱动程序,目前用于dma_map_page
将用户空间地址映射到 dma 地址。这工作正常,但我正在尝试将其移植到 iommu api 以获得使用组和域提供的一些好处。
当前代码:这很好用
ret = get_user_pages_fast(user_addr, one_page, flags, page);
dma_addr = dma_map_page(dev, off, size, *page, DMA_BIDIRECTIONAL);
IOMMU 代码:这不起作用
ret = get_user_pages_fast(...);
pfn = page_to_pfn(*page);
group = iommu_group_get(dev);
domain = iommu_domain_alloc(dev->bus);
iommu_attach_device(domain, dev);
iommu_attach_group(domain, group);
iommu_map(domain, iova, pfn << PAGE_SHIFT, size, IOMMU_READ|IOMMU_WRITE);
所有功能都成功返回,但是当我将 iova 传递给设备时,设备无法使用它。有没有人以前使用过 iommu 并且知道我的问题在哪里或者我可以在哪里查看?我无法在任何地方找到关于 Linux 的 iommu 实现的太多信息。
编辑:我第一次错过了 dmesg 中的一些条目:
DEBUG: phys addr 0x7738de000
DEBUG: iova 0xdeadb000
DMAR: DRHD: handling fault status reg 2
DMAR: DMAR:[DMA Read] Request device [50:00.0] fault addr 1fdaee4000
DMAR:[fault reason 06] PTE Read access is not set