• Home
  • Raw
  • Download

Lines Matching refs:mapping

1201 static int extend_iommu_mapping(struct dma_iommu_mapping *mapping);
1203 static inline dma_addr_t __alloc_iova(struct dma_iommu_mapping *mapping, in __alloc_iova() argument
1209 size_t mapping_size = mapping->bits << PAGE_SHIFT; in __alloc_iova()
1220 spin_lock_irqsave(&mapping->lock, flags); in __alloc_iova()
1221 for (i = 0; i < mapping->nr_bitmaps; i++) { in __alloc_iova()
1222 start = bitmap_find_next_zero_area(mapping->bitmaps[i], in __alloc_iova()
1223 mapping->bits, 0, count, align); in __alloc_iova()
1225 if (start > mapping->bits) in __alloc_iova()
1228 bitmap_set(mapping->bitmaps[i], start, count); in __alloc_iova()
1237 if (i == mapping->nr_bitmaps) { in __alloc_iova()
1238 if (extend_iommu_mapping(mapping)) { in __alloc_iova()
1239 spin_unlock_irqrestore(&mapping->lock, flags); in __alloc_iova()
1243 start = bitmap_find_next_zero_area(mapping->bitmaps[i], in __alloc_iova()
1244 mapping->bits, 0, count, align); in __alloc_iova()
1246 if (start > mapping->bits) { in __alloc_iova()
1247 spin_unlock_irqrestore(&mapping->lock, flags); in __alloc_iova()
1251 bitmap_set(mapping->bitmaps[i], start, count); in __alloc_iova()
1253 spin_unlock_irqrestore(&mapping->lock, flags); in __alloc_iova()
1255 iova = mapping->base + (mapping_size * i); in __alloc_iova()
1261 static inline void __free_iova(struct dma_iommu_mapping *mapping, in __free_iova() argument
1265 size_t mapping_size = mapping->bits << PAGE_SHIFT; in __free_iova()
1273 bitmap_index = (u32) (addr - mapping->base) / (u32) mapping_size; in __free_iova()
1274 BUG_ON(addr < mapping->base || bitmap_index > mapping->extensions); in __free_iova()
1276 bitmap_base = mapping->base + mapping_size * bitmap_index; in __free_iova()
1291 spin_lock_irqsave(&mapping->lock, flags); in __free_iova()
1292 bitmap_clear(mapping->bitmaps[bitmap_index], start, count); in __free_iova()
1293 spin_unlock_irqrestore(&mapping->lock, flags); in __free_iova()
1425 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); in __iommu_create_mapping() local
1430 dma_addr = __alloc_iova(mapping, size); in __iommu_create_mapping()
1447 ret = iommu_map(mapping->domain, iova, phys, len, in __iommu_create_mapping()
1456 iommu_unmap(mapping->domain, dma_addr, iova-dma_addr); in __iommu_create_mapping()
1457 __free_iova(mapping, dma_addr, size); in __iommu_create_mapping()
1463 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); in __iommu_remove_mapping() local
1472 iommu_unmap(mapping->domain, iova, size); in __iommu_remove_mapping()
1473 __free_iova(mapping, iova, size); in __iommu_remove_mapping()
1710 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); in __map_sg_chunk() local
1720 iova_base = iova = __alloc_iova(mapping, size); in __map_sg_chunk()
1733 ret = iommu_map(mapping->domain, iova, phys, len, prot); in __map_sg_chunk()
1743 iommu_unmap(mapping->domain, iova_base, count * PAGE_SIZE); in __map_sg_chunk()
1744 __free_iova(mapping, iova_base, size); in __map_sg_chunk()
1931 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); in arm_coherent_iommu_map_page() local
1935 dma_addr = __alloc_iova(mapping, len); in arm_coherent_iommu_map_page()
1941 ret = iommu_map(mapping->domain, dma_addr, page_to_phys(page), len, prot); in arm_coherent_iommu_map_page()
1947 __free_iova(mapping, dma_addr, len); in arm_coherent_iommu_map_page()
1983 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); in arm_coherent_iommu_unmap_page() local
1991 iommu_unmap(mapping->domain, iova, len); in arm_coherent_iommu_unmap_page()
1992 __free_iova(mapping, iova, len); in arm_coherent_iommu_unmap_page()
2007 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); in arm_iommu_unmap_page() local
2009 struct page *page = phys_to_page(iommu_iova_to_phys(mapping->domain, iova)); in arm_iommu_unmap_page()
2019 iommu_unmap(mapping->domain, iova, len); in arm_iommu_unmap_page()
2020 __free_iova(mapping, iova, len); in arm_iommu_unmap_page()
2034 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); in arm_iommu_map_resource() local
2041 dma_addr = __alloc_iova(mapping, len); in arm_iommu_map_resource()
2047 ret = iommu_map(mapping->domain, dma_addr, addr, len, prot); in arm_iommu_map_resource()
2053 __free_iova(mapping, dma_addr, len); in arm_iommu_map_resource()
2068 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); in arm_iommu_unmap_resource() local
2076 iommu_unmap(mapping->domain, iova, len); in arm_iommu_unmap_resource()
2077 __free_iova(mapping, iova, len); in arm_iommu_unmap_resource()
2083 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); in arm_iommu_sync_single_for_cpu() local
2085 struct page *page = phys_to_page(iommu_iova_to_phys(mapping->domain, iova)); in arm_iommu_sync_single_for_cpu()
2097 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); in arm_iommu_sync_single_for_device() local
2099 struct page *page = phys_to_page(iommu_iova_to_phys(mapping->domain, iova)); in arm_iommu_sync_single_for_device()
2168 struct dma_iommu_mapping *mapping; in arm_iommu_create_mapping() local
2184 mapping = kzalloc(sizeof(struct dma_iommu_mapping), GFP_KERNEL); in arm_iommu_create_mapping()
2185 if (!mapping) in arm_iommu_create_mapping()
2188 mapping->bitmap_size = bitmap_size; in arm_iommu_create_mapping()
2189 mapping->bitmaps = kzalloc(extensions * sizeof(unsigned long *), in arm_iommu_create_mapping()
2191 if (!mapping->bitmaps) in arm_iommu_create_mapping()
2194 mapping->bitmaps[0] = kzalloc(bitmap_size, GFP_KERNEL); in arm_iommu_create_mapping()
2195 if (!mapping->bitmaps[0]) in arm_iommu_create_mapping()
2198 mapping->nr_bitmaps = 1; in arm_iommu_create_mapping()
2199 mapping->extensions = extensions; in arm_iommu_create_mapping()
2200 mapping->base = base; in arm_iommu_create_mapping()
2201 mapping->bits = BITS_PER_BYTE * bitmap_size; in arm_iommu_create_mapping()
2203 spin_lock_init(&mapping->lock); in arm_iommu_create_mapping()
2205 mapping->domain = iommu_domain_alloc(bus); in arm_iommu_create_mapping()
2206 if (!mapping->domain) in arm_iommu_create_mapping()
2209 kref_init(&mapping->kref); in arm_iommu_create_mapping()
2210 return mapping; in arm_iommu_create_mapping()
2212 kfree(mapping->bitmaps[0]); in arm_iommu_create_mapping()
2214 kfree(mapping->bitmaps); in arm_iommu_create_mapping()
2216 kfree(mapping); in arm_iommu_create_mapping()
2225 struct dma_iommu_mapping *mapping = in release_iommu_mapping() local
2228 iommu_domain_free(mapping->domain); in release_iommu_mapping()
2229 for (i = 0; i < mapping->nr_bitmaps; i++) in release_iommu_mapping()
2230 kfree(mapping->bitmaps[i]); in release_iommu_mapping()
2231 kfree(mapping->bitmaps); in release_iommu_mapping()
2232 kfree(mapping); in release_iommu_mapping()
2235 static int extend_iommu_mapping(struct dma_iommu_mapping *mapping) in extend_iommu_mapping() argument
2239 if (mapping->nr_bitmaps >= mapping->extensions) in extend_iommu_mapping()
2242 next_bitmap = mapping->nr_bitmaps; in extend_iommu_mapping()
2243 mapping->bitmaps[next_bitmap] = kzalloc(mapping->bitmap_size, in extend_iommu_mapping()
2245 if (!mapping->bitmaps[next_bitmap]) in extend_iommu_mapping()
2248 mapping->nr_bitmaps++; in extend_iommu_mapping()
2253 void arm_iommu_release_mapping(struct dma_iommu_mapping *mapping) in arm_iommu_release_mapping() argument
2255 if (mapping) in arm_iommu_release_mapping()
2256 kref_put(&mapping->kref, release_iommu_mapping); in arm_iommu_release_mapping()
2261 struct dma_iommu_mapping *mapping) in __arm_iommu_attach_device() argument
2265 err = iommu_attach_device(mapping->domain, dev); in __arm_iommu_attach_device()
2269 kref_get(&mapping->kref); in __arm_iommu_attach_device()
2270 to_dma_iommu_mapping(dev) = mapping; in __arm_iommu_attach_device()
2290 struct dma_iommu_mapping *mapping) in arm_iommu_attach_device() argument
2294 err = __arm_iommu_attach_device(dev, mapping); in arm_iommu_attach_device()
2312 struct dma_iommu_mapping *mapping; in arm_iommu_detach_device() local
2314 mapping = to_dma_iommu_mapping(dev); in arm_iommu_detach_device()
2315 if (!mapping) { in arm_iommu_detach_device()
2320 iommu_detach_device(mapping->domain, dev); in arm_iommu_detach_device()
2321 kref_put(&mapping->kref, release_iommu_mapping); in arm_iommu_detach_device()
2337 struct dma_iommu_mapping *mapping; in arm_setup_iommu_dma_ops() local
2342 mapping = arm_iommu_create_mapping(dev->bus, dma_base, size); in arm_setup_iommu_dma_ops()
2343 if (IS_ERR(mapping)) { in arm_setup_iommu_dma_ops()
2349 if (__arm_iommu_attach_device(dev, mapping)) { in arm_setup_iommu_dma_ops()
2352 arm_iommu_release_mapping(mapping); in arm_setup_iommu_dma_ops()
2361 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev); in arm_teardown_iommu_dma_ops() local
2363 if (!mapping) in arm_teardown_iommu_dma_ops()
2367 arm_iommu_release_mapping(mapping); in arm_teardown_iommu_dma_ops()