2016-06-28 23 views
4

사용자 주소를 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 
+0

CPU 및 사우스 브리지 모델은 무엇입니까? 그들이 IOMMU를 가지고 있는지 확신합니까? 장치에 IOMMU가 활성화되어 있습니까 (Intel의 VT-d는 일부 포트에서만 활성화 될 수 있습니다)? – osgx

+0

장치에 부팅하는 동안 언젠가 할당 된 iommu 그룹이 있습니다. iommu가 장치에 대해 활성화되어 있는지 확인해야하는 다른 것이 있습니까? – Robert

+0

Robert, 아직도, 당신의 HW는 무엇입니까? 'drivers/iommu/iommu.c' 파일의 pd_debug를 활성화하는 것은 어떻습니까? 왜 'PFN_PHYS'가 아닌 < osgx

답변

0

이러한 작업은 페이지 테이블에 액세스하기 때문에 특권 또는 작업 구조 내부에 유지 데이터 구조 일 수도있다.

하이퍼 바이저가 어떻게 이러한 작업을 수행하는지 또는 가상 컴퓨터가 이러한 호출을 처리하는지 확인하십시오. 하이퍼 바이저를 통해 게스트 OS에서 IOMMU 페이징 장치를 설정하는 일부 드라이버 인터페이스가있을 수 있습니다.

하이퍼 바이저도 권한 모드로 실행됩니다.