Lines Matching refs:mapping

3  *  linux/arch/arm/mm/dma-mapping.c
7 * DMA uncached mapping support.
290 * Clear previous low-memory mapping to ensure that the
603 * Free a buffer as defined by the above mapping.
677 * Use the driver DMA support - see dma-mapping.h (dma_sync_*)
754 static int extend_iommu_mapping(struct dma_iommu_mapping *mapping);
756 static inline dma_addr_t __alloc_iova(struct dma_iommu_mapping *mapping,
762 size_t mapping_size = mapping->bits << PAGE_SHIFT;
773 spin_lock_irqsave(&mapping->lock, flags);
774 for (i = 0; i < mapping->nr_bitmaps; i++) {
775 start = bitmap_find_next_zero_area(mapping->bitmaps[i],
776 mapping->bits, 0, count, align);
778 if (start > mapping->bits)
781 bitmap_set(mapping->bitmaps[i], start, count);
786 * No unused range found. Try to extend the existing mapping
790 if (i == mapping->nr_bitmaps) {
791 if (extend_iommu_mapping(mapping)) {
792 spin_unlock_irqrestore(&mapping->lock, flags);
796 start = bitmap_find_next_zero_area(mapping->bitmaps[i],
797 mapping->bits, 0, count, align);
799 if (start > mapping->bits) {
800 spin_unlock_irqrestore(&mapping->lock, flags);
804 bitmap_set(mapping->bitmaps[i], start, count);
806 spin_unlock_irqrestore(&mapping->lock, flags);
808 iova = mapping->base + (mapping_size * i);
814 static inline void __free_iova(struct dma_iommu_mapping *mapping,
818 size_t mapping_size = mapping->bits << PAGE_SHIFT;
826 bitmap_index = (u32) (addr - mapping->base) / (u32) mapping_size;
827 BUG_ON(addr < mapping->base || bitmap_index > mapping->extensions);
829 bitmap_base = mapping->base + mapping_size * bitmap_index;
844 spin_lock_irqsave(&mapping->lock, flags);
845 bitmap_clear(mapping->bitmaps[bitmap_index], start, count);
846 spin_unlock_irqrestore(&mapping->lock, flags);
962 * Create a mapping in device IO address space for specified pages
968 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev);
973 dma_addr = __alloc_iova(mapping, size);
990 ret = iommu_map(mapping->domain, iova, phys, len,
1000 iommu_unmap(mapping->domain, dma_addr, iova-dma_addr);
1001 __free_iova(mapping, dma_addr, size);
1007 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev);
1016 iommu_unmap(mapping->domain, iova, size);
1017 __free_iova(mapping, iova, size);
1143 * free a page as defined by the above mapping.
1192 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev);
1202 iova_base = iova = __alloc_iova(mapping, size);
1215 ret = iommu_map(mapping->domain, iova, phys, len, prot,
1226 iommu_unmap(mapping->domain, iova_base, count * PAGE_SIZE);
1227 __free_iova(mapping, iova_base, size);
1375 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev);
1382 dma_addr = __alloc_iova(mapping, len);
1388 ret = iommu_map(mapping->domain, dma_addr, page_to_phys(page), len,
1395 __free_iova(mapping, dma_addr, len);
1411 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev);
1421 page = phys_to_page(iommu_iova_to_phys(mapping->domain, iova));
1425 iommu_unmap(mapping->domain, iova, len);
1426 __free_iova(mapping, iova, len);
1440 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev);
1447 dma_addr = __alloc_iova(mapping, len);
1453 ret = iommu_map(mapping->domain, dma_addr, addr, len, prot, GFP_KERNEL);
1459 __free_iova(mapping, dma_addr, len);
1474 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev);
1482 iommu_unmap(mapping->domain, iova, len);
1483 __free_iova(mapping, iova, len);
1489 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev);
1497 page = phys_to_page(iommu_iova_to_phys(mapping->domain, iova));
1504 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev);
1512 page = phys_to_page(iommu_iova_to_phys(mapping->domain, iova));
1542 * Creates a mapping structure which holds information about used/unused
1544 * mapping with IOMMU aware functions.
1546 * The client device need to be attached to the mapping with
1554 struct dma_iommu_mapping *mapping;
1570 mapping = kzalloc(sizeof(struct dma_iommu_mapping), GFP_KERNEL);
1571 if (!mapping)
1574 mapping->bitmap_size = bitmap_size;
1575 mapping->bitmaps = kcalloc(extensions, sizeof(unsigned long *),
1577 if (!mapping->bitmaps)
1580 mapping->bitmaps[0] = kzalloc(bitmap_size, GFP_KERNEL);
1581 if (!mapping->bitmaps[0])
1584 mapping->nr_bitmaps = 1;
1585 mapping->extensions = extensions;
1586 mapping->base = base;
1587 mapping->bits = BITS_PER_BYTE * bitmap_size;
1589 spin_lock_init(&mapping->lock);
1591 mapping->domain = iommu_domain_alloc(bus);
1592 if (!mapping->domain)
1595 kref_init(&mapping->kref);
1596 return mapping;
1598 kfree(mapping->bitmaps[0]);
1600 kfree(mapping->bitmaps);
1602 kfree(mapping);
1611 struct dma_iommu_mapping *mapping =
1614 iommu_domain_free(mapping->domain);
1615 for (i = 0; i < mapping->nr_bitmaps; i++)
1616 kfree(mapping->bitmaps[i]);
1617 kfree(mapping->bitmaps);
1618 kfree(mapping);
1621 static int extend_iommu_mapping(struct dma_iommu_mapping *mapping)
1625 if (mapping->nr_bitmaps >= mapping->extensions)
1628 next_bitmap = mapping->nr_bitmaps;
1629 mapping->bitmaps[next_bitmap] = kzalloc(mapping->bitmap_size,
1631 if (!mapping->bitmaps[next_bitmap])
1634 mapping->nr_bitmaps++;
1639 void arm_iommu_release_mapping(struct dma_iommu_mapping *mapping)
1641 if (mapping)
1642 kref_put(&mapping->kref, release_iommu_mapping);
1647 struct dma_iommu_mapping *mapping)
1651 err = iommu_attach_device(mapping->domain, dev);
1655 kref_get(&mapping->kref);
1656 to_dma_iommu_mapping(dev) = mapping;
1665 * @mapping: io address space mapping structure (returned from
1668 * Attaches specified io address space mapping to the provided device.
1673 * mapping.
1676 struct dma_iommu_mapping *mapping)
1680 err = __arm_iommu_attach_device(dev, mapping);
1698 struct dma_iommu_mapping *mapping;
1700 mapping = to_dma_iommu_mapping(dev);
1701 if (!mapping) {
1706 iommu_detach_device(mapping->domain, dev);
1707 kref_put(&mapping->kref, release_iommu_mapping);
1718 struct dma_iommu_mapping *mapping;
1720 mapping = arm_iommu_create_mapping(dev->bus, dma_base, size);
1721 if (IS_ERR(mapping)) {
1722 pr_warn("Failed to create %llu-byte IOMMU mapping for device %s\n",
1727 if (__arm_iommu_attach_device(dev, mapping)) {
1730 arm_iommu_release_mapping(mapping);
1739 struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev);
1741 if (!mapping)
1745 arm_iommu_release_mapping(mapping);