WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 03/15] [swiotlb] Add swiotlb_register_engine function

We set the internal iommu_sw pointer to the passed in swiotlb_engine
structure. Obviously we also check if the existing iommu_sw is
set and if so, call iommu_sw->release before the switch-over.

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

diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h
index 781c3aa..3bc3c42 100644
--- a/include/linux/swiotlb.h
+++ b/include/linux/swiotlb.h
@@ -118,6 +118,8 @@ struct swiotlb_engine {
        void* (*bus_to_virt)(struct device *hwdev, dma_addr_t address);
 };
 
+int swiotlb_register_engine(struct swiotlb_engine *iommu);
+
 extern void
 *swiotlb_alloc_coherent(struct device *hwdev, size_t size,
                        dma_addr_t *dma_handle, gfp_t flags);
diff --git a/lib/swiotlb.c b/lib/swiotlb.c
index e6d9e32..e84f269 100644
--- a/lib/swiotlb.c
+++ b/lib/swiotlb.c
@@ -97,6 +97,12 @@ static phys_addr_t *io_tlb_orig_addr;
  */
 static DEFINE_SPINLOCK(io_tlb_lock);
 
+/*
+ * The software IOMMU this library will utilize.
+ */
+struct swiotlb_engine *iommu_sw;
+EXPORT_SYMBOL(iommu_sw);
+
 static int late_alloc;
 
 static int __init
@@ -126,6 +132,48 @@ static dma_addr_t swiotlb_virt_to_bus(struct device *hwdev,
        return phys_to_dma(hwdev, virt_to_phys(address));
 }
 
+/*
+ * Register a software IO TLB engine.
+ *
+ * The registration allows the software IO TLB functions in the
+ * swiotlb library to function properly.
+ *
+ * All the values in the iotlb structure must be set.
+ *
+ * If the registration fails, it is assumed that the caller will free
+ * all of the resources allocated in the swiotlb_engine structure.
+ */
+int swiotlb_register_engine(struct swiotlb_engine *iommu)
+{
+       if (!iommu || !iommu->name || !iommu->release) {
+               printk(KERN_ERR "DMA: Trying to register a SWIOTLB engine" \
+                               " improperly!");
+               return -EINVAL;
+       }
+
+       if (iommu_sw && iommu_sw->name) {
+               int retval = -EINVAL;
+
+               /* 'release' must check for out-standing DMAs and flush them
+                *  out or fail. */
+               if (iommu_sw->release)
+                       retval = iommu_sw->release(iommu_sw);
+
+               if (retval) {
+                       printk(KERN_ERR "DMA: %s cannot be released!\n",
+                               iommu_sw->name);
+                       return retval;
+               }
+               printk(KERN_INFO "DMA: Replacing [%s] with [%s]\n",
+                       iommu_sw->name, iommu->name);
+       }
+
+       iommu_sw = iommu;
+
+       return 0;
+}
+EXPORT_SYMBOL(swiotlb_register_engine);
+
 void swiotlb_print_info(void)
 {
        unsigned long bytes = io_tlb_nslabs << IO_TLB_SHIFT;
-- 
1.6.2.5


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

<Prev in Thread] Current Thread [Next in Thread>