*参照元 [#q1367170]
#backlinks

*説明 [#wd97fdd0]
-パス: [[linux-4.4.1/drivers/iommu/dma-iommu.c]]

-FIXME: これは何?
--説明


**引数 [#nd4311e2]
-struct device *dev
--
--[[linux-4.4.1/device]]
-struct page *page
--
--[[linux-4.4.1/page]]
-unsigned long offset
--
-size_t size
--
-int prot
--


**返り値 [#s39b3b33]
-dma_addr_t
--
--[[linux-4.4.1/dma_addr_t]]


**参考 [#bea4ca1e]


*実装 [#z8579f48]
 dma_addr_t iommu_dma_map_page(struct device *dev, struct page *page,
 		unsigned long offset, size_t size, int prot)
 {
 	dma_addr_t dma_addr;
 	struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
 	struct iova_domain *iovad = domain->iova_cookie;
 	phys_addr_t phys = page_to_phys(page) + offset;
 	size_t iova_off = iova_offset(iovad, phys);
 	size_t len = iova_align(iovad, size + iova_off);
 	struct iova *iova = __alloc_iova(iovad, len, dma_get_mask(dev));
 
-
--[[linux-4.4.1/iommu_domain]]
--[[linux-4.4.1/iommu_get_domain_for_dev()]]
--[[linux-4.4.1/iova_domain]]
--[[linux-4.4.1/phys_addr_t]]
--[[linux-4.4.1/page_to_phys()]]
--[[linux-4.4.1/iova_align()]]
--[[linux-4.4.1/iova]]
--[[linux-4.4.1/__alloc_iova()]]
--[[linux-4.4.1/dma_get_mask()]]

 	if (!iova)
 		return DMA_ERROR_CODE;
 
 	dma_addr = iova_dma_addr(iovad, iova);
 	if (iommu_map(domain, dma_addr, phys - iova_off, len, prot)) {
 		__free_iova(iovad, iova);
 		return DMA_ERROR_CODE;
 	}
-
--[[linux-4.4.1/iova_dma_addr()]]
--[[linux-4.4.1/iommu_map()]]
--[[linux-4.4.1/__free_iova()]]

 	return dma_addr + iova_off;
 }


*コメント [#i8911c68]


トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS