*参照元 [#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]