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 3 of 9] swiotlb: add hwdev to swiotlb_phys_to_bus

To: Ingo Molnar <mingo@xxxxxxx>
Subject: [Xen-devel] [PATCH 3 of 9] swiotlb: add hwdev to swiotlb_phys_to_bus
From: Jeremy Fitzhardinge <jeremy@xxxxxxxx>
Date: Mon, 22 Dec 2008 10:26:05 -0800
Cc: Xen-devel <xen-devel@xxxxxxxxxxxxxxxxxxx>, Ian Campbell <ian.campbell@xxxxxxxxxx>, Becky Bruce <beckyb@xxxxxxxxxxxxxxxxxxx>, the arch/x86 maintainers <x86@xxxxxxxxxx>, linux-kernel@xxxxxxxxxxxxxxx, FUJITA Tomonori <fujita.tomonori@xxxxxxxxxxxxx>
Delivery-date: Mon, 22 Dec 2008 10:34:24 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1229970362@xxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
Some architectures need it.

Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@xxxxxxxxxx>
---
 arch/x86/kernel/pci-swiotlb_64.c |    2 -
 include/linux/swiotlb.h          |    3 +-
 lib/swiotlb.c                    |   45 +++++++++++++++-----------------------
 3 files changed, 21 insertions(+), 29 deletions(-)

diff --git a/arch/x86/kernel/pci-swiotlb_64.c b/arch/x86/kernel/pci-swiotlb_64.c
--- a/arch/x86/kernel/pci-swiotlb_64.c
+++ b/arch/x86/kernel/pci-swiotlb_64.c
@@ -23,7 +23,7 @@
        return (void *)__get_free_pages(GFP_DMA | __GFP_NOWARN, order);
 }
 
-dma_addr_t swiotlb_phys_to_bus(phys_addr_t paddr)
+dma_addr_t swiotlb_phys_to_bus(struct device *hwdev, phys_addr_t paddr)
 {
        return paddr;
 }
diff --git a/include/linux/swiotlb.h b/include/linux/swiotlb.h
--- a/include/linux/swiotlb.h
+++ b/include/linux/swiotlb.h
@@ -27,7 +27,8 @@
 extern void *swiotlb_alloc_boot(size_t bytes, unsigned long nslabs);
 extern void *swiotlb_alloc(unsigned order, unsigned long nslabs);
 
-extern dma_addr_t swiotlb_phys_to_bus(phys_addr_t address);
+extern dma_addr_t swiotlb_phys_to_bus(struct device *hwdev,
+                                     phys_addr_t address);
 extern phys_addr_t swiotlb_bus_to_phys(dma_addr_t address);
 
 extern int swiotlb_arch_range_needs_mapping(void *ptr, size_t size);
diff --git a/lib/swiotlb.c b/lib/swiotlb.c
--- a/lib/swiotlb.c
+++ b/lib/swiotlb.c
@@ -125,7 +125,7 @@
        return (void *)__get_free_pages(GFP_DMA | __GFP_NOWARN, order);
 }
 
-dma_addr_t __weak swiotlb_phys_to_bus(phys_addr_t paddr)
+dma_addr_t __weak swiotlb_phys_to_bus(struct device *hwdev, phys_addr_t paddr)
 {
        return paddr;
 }
@@ -135,9 +135,10 @@
        return baddr;
 }
 
-static dma_addr_t swiotlb_virt_to_bus(volatile void *address)
+static dma_addr_t swiotlb_virt_to_bus(struct device *hwdev,
+                                     volatile void *address)
 {
-       return swiotlb_phys_to_bus(virt_to_phys(address));
+       return swiotlb_phys_to_bus(hwdev, virt_to_phys(address));
 }
 
 static void *swiotlb_bus_to_virt(dma_addr_t address)
@@ -153,27 +154,15 @@
 static void swiotlb_print_info(unsigned long bytes)
 {
        phys_addr_t pstart, pend;
-       dma_addr_t bstart, bend;
 
        pstart = virt_to_phys(io_tlb_start);
        pend = virt_to_phys(io_tlb_end);
 
-       bstart = swiotlb_phys_to_bus(pstart);
-       bend = swiotlb_phys_to_bus(pend);
-
        printk(KERN_INFO "Placing %luMB software IO TLB between %p - %p\n",
               bytes >> 20, io_tlb_start, io_tlb_end);
-       if (pstart != bstart || pend != bend)
-               printk(KERN_INFO "software IO TLB at phys %#llx - %#llx"
-                      " bus %#llx - %#llx\n",
-                      (unsigned long long)pstart,
-                      (unsigned long long)pend,
-                      (unsigned long long)bstart,
-                      (unsigned long long)bend);
-       else
-               printk(KERN_INFO "software IO TLB at phys %#llx - %#llx\n",
-                      (unsigned long long)pstart,
-                      (unsigned long long)pend);
+       printk(KERN_INFO "software IO TLB at phys %#llx - %#llx\n",
+              (unsigned long long)pstart,
+              (unsigned long long)pend);
 }
 
 /*
@@ -351,7 +340,7 @@
        unsigned long max_slots;
 
        mask = dma_get_seg_boundary(hwdev);
-       start_dma_addr = swiotlb_virt_to_bus(io_tlb_start) & mask;
+       start_dma_addr = swiotlb_virt_to_bus(hwdev, io_tlb_start) & mask;
 
        offset_slots = ALIGN(start_dma_addr, 1 << IO_TLB_SHIFT) >> IO_TLB_SHIFT;
 
@@ -528,7 +517,9 @@
                dma_mask = hwdev->coherent_dma_mask;
 
        ret = (void *)__get_free_pages(flags, order);
-       if (ret && !is_buffer_dma_capable(dma_mask, swiotlb_virt_to_bus(ret), 
size)) {
+       if (ret &&
+           !is_buffer_dma_capable(dma_mask, swiotlb_virt_to_bus(hwdev, ret),
+                                  size)) {
                /*
                 * The allocated memory isn't reachable by the device.
                 * Fall back on swiotlb_map_single().
@@ -549,7 +540,7 @@
        }
 
        memset(ret, 0, size);
-       dev_addr = swiotlb_virt_to_bus(ret);
+       dev_addr = swiotlb_virt_to_bus(hwdev, ret);
 
        /* Confirm address can be DMA'd by device */
        if (!is_buffer_dma_capable(dma_mask, dev_addr, size)) {
@@ -609,7 +600,7 @@
 swiotlb_map_single_attrs(struct device *hwdev, void *ptr, size_t size,
                         int dir, struct dma_attrs *attrs)
 {
-       dma_addr_t dev_addr = swiotlb_virt_to_bus(ptr);
+       dma_addr_t dev_addr = swiotlb_virt_to_bus(hwdev, ptr);
        void *map;
 
        BUG_ON(dir == DMA_NONE);
@@ -631,7 +622,7 @@
                map = io_tlb_overflow_buffer;
        }
 
-       dev_addr = swiotlb_virt_to_bus(map);
+       dev_addr = swiotlb_virt_to_bus(hwdev, map);
 
        /*
         * Ensure that the address returned is DMA'ble
@@ -778,7 +769,7 @@
 
        for_each_sg(sgl, sg, nelems, i) {
                addr = SG_ENT_VIRT_ADDRESS(sg);
-               dev_addr = swiotlb_virt_to_bus(addr);
+               dev_addr = swiotlb_virt_to_bus(hwdev, addr);
                if (range_needs_mapping(sg_virt(sg), sg->length) ||
                    address_needs_mapping(hwdev, dev_addr, sg->length)) {
                        void *map = map_single(hwdev, addr, sg->length, dir);
@@ -791,7 +782,7 @@
                                sgl[0].dma_length = 0;
                                return 0;
                        }
-                       sg->dma_address = swiotlb_virt_to_bus(map);
+                       sg->dma_address = swiotlb_virt_to_bus(hwdev, map);
                } else
                        sg->dma_address = dev_addr;
                sg->dma_length = sg->length;
@@ -879,7 +870,7 @@
 int
 swiotlb_dma_mapping_error(struct device *hwdev, dma_addr_t dma_addr)
 {
-       return (dma_addr == swiotlb_virt_to_bus(io_tlb_overflow_buffer));
+       return (dma_addr == swiotlb_virt_to_bus(hwdev, io_tlb_overflow_buffer));
 }
 
 /*
@@ -891,7 +882,7 @@
 int
 swiotlb_dma_supported(struct device *hwdev, u64 mask)
 {
-       return swiotlb_virt_to_bus(io_tlb_end - 1) <= mask;
+       return swiotlb_virt_to_bus(hwdev, io_tlb_end - 1) <= mask;
 }
 
 EXPORT_SYMBOL(swiotlb_map_single);



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

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