사용자 주소를 dma 주소에 매핑하는 데 현재 dma_map_page
을 사용하는 pci 장치 드라이버가 있습니다. 이 잘 작동하지만 그룹 및 도메인 사용하여 몇 가지 이점을 얻으려면 iommu API이 이식하려면 노력하고있어.사용자 공간 주소가있는 Linux 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 코드를 작동 :이 모든 기능이 성공적으로 반환하지만이 장치에 장치를 iova을 통과 할 때 할 수
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);
작동하지 않습니다 ' 그것을 사용하지 마십시오. 전에 아무런 일을하지 않은 사람이 내 문제가 어디에 있는지, 어디서 볼 수 있는지 알고 있습니까? 나는 어디서나 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
CPU 및 사우스 브리지 모델은 무엇입니까? 그들이 IOMMU를 가지고 있는지 확신합니까? 장치에 IOMMU가 활성화되어 있습니까 (Intel의 VT-d는 일부 포트에서만 활성화 될 수 있습니다)? – osgx
장치에 부팅하는 동안 언젠가 할당 된 iommu 그룹이 있습니다. iommu가 장치에 대해 활성화되어 있는지 확인해야하는 다른 것이 있습니까? – Robert
Robert, 아직도, 당신의 HW는 무엇입니까? 'drivers/iommu/iommu.c' 파일의 pd_debug를 활성화하는 것은 어떻습니까? 왜 'PFN_PHYS'가 아닌 < – osgx