Merge branch 'akpm' (patches from Andrew)
[linux-2.6-microblaze.git] / include / linux / swiotlb.h
index 5857a93..216854a 100644 (file)
@@ -6,6 +6,7 @@
 #include <linux/init.h>
 #include <linux/types.h>
 #include <linux/limits.h>
+#include <linux/spinlock.h>
 
 struct device;
 struct page;
@@ -36,20 +37,11 @@ enum swiotlb_force {
 
 extern void swiotlb_init(int verbose);
 int swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose);
-extern unsigned long swiotlb_nr_tbl(void);
 unsigned long swiotlb_size_or_default(void);
 extern int swiotlb_late_init_with_tbl(char *tlb, unsigned long nslabs);
 extern int swiotlb_late_init_with_default_size(size_t default_size);
 extern void __init swiotlb_update_mem_attributes(void);
 
-/*
- * Enumeration for sync targets
- */
-enum dma_sync_target {
-       SYNC_FOR_CPU = 0,
-       SYNC_FOR_DEVICE = 1,
-};
-
 phys_addr_t swiotlb_tbl_map_single(struct device *hwdev, phys_addr_t phys,
                size_t mapping_size, size_t alloc_size,
                enum dma_data_direction dir, unsigned long attrs);
@@ -57,32 +49,70 @@ phys_addr_t swiotlb_tbl_map_single(struct device *hwdev, phys_addr_t phys,
 extern void swiotlb_tbl_unmap_single(struct device *hwdev,
                                     phys_addr_t tlb_addr,
                                     size_t mapping_size,
-                                    size_t alloc_size,
                                     enum dma_data_direction dir,
                                     unsigned long attrs);
 
-extern void swiotlb_tbl_sync_single(struct device *hwdev,
-                                   phys_addr_t tlb_addr,
-                                   size_t size, enum dma_data_direction dir,
-                                   enum dma_sync_target target);
-
+void swiotlb_sync_single_for_device(struct device *dev, phys_addr_t tlb_addr,
+               size_t size, enum dma_data_direction dir);
+void swiotlb_sync_single_for_cpu(struct device *dev, phys_addr_t tlb_addr,
+               size_t size, enum dma_data_direction dir);
 dma_addr_t swiotlb_map(struct device *dev, phys_addr_t phys,
                size_t size, enum dma_data_direction dir, unsigned long attrs);
 
 #ifdef CONFIG_SWIOTLB
 extern enum swiotlb_force swiotlb_force;
-extern phys_addr_t io_tlb_start, io_tlb_end;
+
+/**
+ * struct io_tlb_mem - IO TLB Memory Pool Descriptor
+ *
+ * @start:     The start address of the swiotlb memory pool. Used to do a quick
+ *             range check to see if the memory was in fact allocated by this
+ *             API.
+ * @end:       The end address of the swiotlb memory pool. Used to do a quick
+ *             range check to see if the memory was in fact allocated by this
+ *             API.
+ * @nslabs:    The number of IO TLB blocks (in groups of 64) between @start and
+ *             @end. This is command line adjustable via setup_io_tlb_npages.
+ * @used:      The number of used IO TLB block.
+ * @list:      The free list describing the number of free entries available
+ *             from each index.
+ * @index:     The index to start searching in the next round.
+ * @orig_addr: The original address corresponding to a mapped entry.
+ * @alloc_size:        Size of the allocated buffer.
+ * @lock:      The lock to protect the above data structures in the map and
+ *             unmap calls.
+ * @debugfs:   The dentry to debugfs.
+ * @late_alloc:        %true if allocated using the page allocator
+ */
+struct io_tlb_mem {
+       phys_addr_t start;
+       phys_addr_t end;
+       unsigned long nslabs;
+       unsigned long used;
+       unsigned int index;
+       spinlock_t lock;
+       struct dentry *debugfs;
+       bool late_alloc;
+       struct io_tlb_slot {
+               phys_addr_t orig_addr;
+               size_t alloc_size;
+               unsigned int list;
+       } slots[];
+};
+extern struct io_tlb_mem *io_tlb_default_mem;
 
 static inline bool is_swiotlb_buffer(phys_addr_t paddr)
 {
-       return paddr >= io_tlb_start && paddr < io_tlb_end;
+       struct io_tlb_mem *mem = io_tlb_default_mem;
+
+       return mem && paddr >= mem->start && paddr < mem->end;
 }
 
 void __init swiotlb_exit(void);
 unsigned int swiotlb_max_segment(void);
 size_t swiotlb_max_mapping_size(struct device *dev);
 bool is_swiotlb_active(void);
-void __init swiotlb_adjust_size(unsigned long new_size);
+void __init swiotlb_adjust_size(unsigned long size);
 #else
 #define swiotlb_force SWIOTLB_NO_FORCE
 static inline bool is_swiotlb_buffer(phys_addr_t paddr)
@@ -106,7 +136,7 @@ static inline bool is_swiotlb_active(void)
        return false;
 }
 
-static inline void swiotlb_adjust_size(unsigned long new_size)
+static inline void swiotlb_adjust_size(unsigned long size)
 {
 }
 #endif /* CONFIG_SWIOTLB */