[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 02/15] [swiotlb] Add swiotlb_engine structure for tracking multiple software IO TLBs.



The structure contains all of the existing variables used in
software IO TLB (swiotlb.c) collected within a structure.

Additionally a name variable and a deconstructor (release) function
variable is defined for API usages.

The other set of functions: is_swiotlb_buffer, dma_capable, phys_to_bus,
bus_to_phys, virt_to_bus, and bus_to_virt server as a method to abstract
them out of the SWIOTLB library.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
---
 include/linux/swiotlb.h |   94 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 94 insertions(+), 0 deletions(-)

diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h
index febedcf..781c3aa 100644
--- a/include/linux/swiotlb.h
+++ b/include/linux/swiotlb.h
@@ -24,6 +24,100 @@ extern int swiotlb_force;
 
 extern void swiotlb_init(int verbose);
 
+struct swiotlb_engine {
+
+       /*
+        * Name of the engine (ie: "Software IO TLB")
+        */
+       const char      *name;
+
+       /*
+        * Used to do a quick range check in unmap_single and
+        * sync_single_*, to see if the memory was in fact allocated by this
+        * API.
+        */
+       char *start;
+       char *end;
+
+       /*
+        * The number of IO TLB blocks (in groups of 64) betweeen start and
+        * end.  This is command line adjustable via setup_io_tlb_npages.
+        */
+       unsigned long nslabs;
+
+       /*
+        * When the IOMMU overflows we return a fallback buffer.
+        * This sets the size.
+        */
+       unsigned long overflow;
+
+       void *overflow_buffer;
+
+       /*
+        * This is a free list describing the number of free entries available
+        * from each index
+        */
+       unsigned int *list;
+
+       /*
+        * Current marker in the start through end location. Is incremented
+        * on each map and wraps around.
+        */
+       unsigned int index;
+
+       /*
+        * We need to save away the original address corresponding to a mapped
+        * entry for the sync operations.
+        */
+       phys_addr_t *orig_addr;
+
+       /*
+        * IOMMU private data.
+        */
+       void *priv;
+       /*
+        * The API call to free a SWIOTLB engine if another wants to register
+        * (or if want to turn SWIOTLB off altogether).
+        * It is imperative that this function checks for existing DMA maps
+        * and not release the IOTLB if there are out-standing maps.
+        */
+       int (*release)(struct swiotlb_engine *);
+
+       /*
+        * Is the DMA (Bus) address within our bounce buffer (start and end).
+        */
+       int (*is_swiotlb_buffer)(struct swiotlb_engine *, dma_addr_t dev_addr,
+                                phys_addr_t phys);
+
+       /*
+        * Is the DMA (Bus) address reachable by the PCI device?.
+        */
+       bool (*dma_capable)(struct device *, dma_addr_t, phys_addr_t, size_t);
+       /*
+        *  Physical to bus (DMA) address translation. On
+        *  most platforms this is an equivalent function.
+        */
+       dma_addr_t (*phys_to_bus)(struct device *hwdev, phys_addr_t paddr);
+
+       /*
+        * Bus (DMA) to physical address translation. On most
+        * platforms this is an equivalant function.
+        */
+       phys_addr_t (*bus_to_phys)(struct device *hwdev, dma_addr_t baddr);
+
+       /*
+        * Virtual to bus (DMA) address translation. On most platforms
+        * this is a call to __pa(address).
+        */
+       dma_addr_t (*virt_to_bus)(struct device *hwdev, void *address);
+
+       /*
+       * Bus (DMA) to virtual address translation. On most platforms
+       * this is a call to __va(address).
+       */
+       void* (*bus_to_virt)(struct device *hwdev, dma_addr_t address);
+};
+
 extern void
 *swiotlb_alloc_coherent(struct device *hwdev, size_t size,
                        dma_addr_t *dma_handle, gfp_t flags);
-- 
1.6.2.5


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.