Commit 3abc48ae authored by Martyn Welch's avatar Martyn Welch Committed by Greg Kroah-Hartman

Staging: VME: Convert TSI148 to use dma_map_single

The DMA functionality fails to work on some Intel based platforms. Some
recent Intel platforms have an IOMMU. Transferring the DMA descriptors,
which were mapped using virt_to_phys(), failed. This patch updates the
driver to use dma_map_single().
Signed-off-by: default avatarMartyn Welch <martyn.welch@ge.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 59b2bbb6
...@@ -1614,7 +1614,6 @@ static int tsi148_dma_list_add(struct vme_dma_list *list, ...@@ -1614,7 +1614,6 @@ static int tsi148_dma_list_add(struct vme_dma_list *list,
struct vme_dma_pattern *pattern_attr; struct vme_dma_pattern *pattern_attr;
struct vme_dma_pci *pci_attr; struct vme_dma_pci *pci_attr;
struct vme_dma_vme *vme_attr; struct vme_dma_vme *vme_attr;
dma_addr_t desc_ptr;
int retval = 0; int retval = 0;
struct vme_bridge *tsi148_bridge; struct vme_bridge *tsi148_bridge;
...@@ -1739,9 +1738,12 @@ static int tsi148_dma_list_add(struct vme_dma_list *list, ...@@ -1739,9 +1738,12 @@ static int tsi148_dma_list_add(struct vme_dma_list *list,
prev = list_entry(entry->list.prev, struct tsi148_dma_entry, prev = list_entry(entry->list.prev, struct tsi148_dma_entry,
list); list);
/* We need the bus address for the pointer */ /* We need the bus address for the pointer */
desc_ptr = virt_to_bus(&entry->descriptor); entry->dma_handle = dma_map_single(tsi148_bridge->parent,
reg_split(desc_ptr, &prev->descriptor.dnlau, &entry->descriptor,
&prev->descriptor.dnlal); sizeof(struct tsi148_dma_descriptor), DMA_TO_DEVICE);
reg_split((unsigned long long)entry->dma_handle,
&prev->descriptor.dnlau, &prev->descriptor.dnlal);
} }
return 0; return 0;
...@@ -1784,7 +1786,6 @@ static int tsi148_dma_list_exec(struct vme_dma_list *list) ...@@ -1784,7 +1786,6 @@ static int tsi148_dma_list_exec(struct vme_dma_list *list)
struct vme_dma_resource *ctrlr; struct vme_dma_resource *ctrlr;
int channel, retval = 0; int channel, retval = 0;
struct tsi148_dma_entry *entry; struct tsi148_dma_entry *entry;
dma_addr_t bus_addr;
u32 bus_addr_high, bus_addr_low; u32 bus_addr_high, bus_addr_low;
u32 val, dctlreg = 0; u32 val, dctlreg = 0;
struct vme_bridge *tsi148_bridge; struct vme_bridge *tsi148_bridge;
...@@ -1817,11 +1818,13 @@ static int tsi148_dma_list_exec(struct vme_dma_list *list) ...@@ -1817,11 +1818,13 @@ static int tsi148_dma_list_exec(struct vme_dma_list *list)
entry = list_first_entry(&list->entries, struct tsi148_dma_entry, entry = list_first_entry(&list->entries, struct tsi148_dma_entry,
list); list);
bus_addr = virt_to_bus(&entry->descriptor); entry->dma_handle = dma_map_single(tsi148_bridge->parent,
&entry->descriptor,
sizeof(struct tsi148_dma_descriptor), DMA_TO_DEVICE);
mutex_unlock(&ctrlr->mtx); mutex_unlock(&ctrlr->mtx);
reg_split(bus_addr, &bus_addr_high, &bus_addr_low); reg_split(entry->dma_handle, &bus_addr_high, &bus_addr_low);
iowrite32be(bus_addr_high, bridge->base + iowrite32be(bus_addr_high, bridge->base +
TSI148_LCSR_DMA[channel] + TSI148_LCSR_OFFSET_DNLAU); TSI148_LCSR_DMA[channel] + TSI148_LCSR_OFFSET_DNLAU);
...@@ -1864,10 +1867,15 @@ static int tsi148_dma_list_empty(struct vme_dma_list *list) ...@@ -1864,10 +1867,15 @@ static int tsi148_dma_list_empty(struct vme_dma_list *list)
struct list_head *pos, *temp; struct list_head *pos, *temp;
struct tsi148_dma_entry *entry; struct tsi148_dma_entry *entry;
struct vme_bridge *tsi148_bridge = list->parent->parent;
/* detach and free each entry */ /* detach and free each entry */
list_for_each_safe(pos, temp, &list->entries) { list_for_each_safe(pos, temp, &list->entries) {
list_del(pos); list_del(pos);
entry = list_entry(pos, struct tsi148_dma_entry, list); entry = list_entry(pos, struct tsi148_dma_entry, list);
dma_unmap_single(tsi148_bridge->parent, entry->dma_handle,
sizeof(struct tsi148_dma_descriptor), DMA_TO_DEVICE);
kfree(entry); kfree(entry);
} }
......
...@@ -75,6 +75,7 @@ struct tsi148_dma_entry { ...@@ -75,6 +75,7 @@ struct tsi148_dma_entry {
*/ */
struct tsi148_dma_descriptor descriptor; struct tsi148_dma_descriptor descriptor;
struct list_head list; struct list_head list;
dma_addr_t dma_handle;
}; };
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment