小编Rob*_*ert的帖子

将Linux IOMMU API与用户空间地址一起使用

我有一个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);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

所有功能都成功返回,但是当我将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
Run Code Online (Sandbox Code Playgroud)

c linux linux-device-driver dma iommu

5
推荐指数
1
解决办法
1029
查看次数

必须在任务中投入价值

我有一些c ++代码要求我在赋值语句中立即转换.该演员使代码更难以阅读,我希望有一种解决方法.

uint64_t shifted_val = (uint64_t)1 << 50;
Run Code Online (Sandbox Code Playgroud)

如果我在没有强制转换的情况下编写此代码,shifted_val则将其设置为0,我假设因为它将1立即数视为32位值.有什么我想念的东西,所以我可以写没有铸造吗?

c c++ casting

3
推荐指数
2
解决办法
95
查看次数

标签 统计

c ×2

c++ ×1

casting ×1

dma ×1

iommu ×1

linux ×1

linux-device-driver ×1