Merge tag 'arc-5.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc
[linux-2.6-microblaze.git] / arch / mips / jazz / jazzdma.c
index 014773f..eabddb8 100644 (file)
@@ -16,8 +16,7 @@
 #include <linux/memblock.h>
 #include <linux/spinlock.h>
 #include <linux/gfp.h>
-#include <linux/dma-direct.h>
-#include <linux/dma-noncoherent.h>
+#include <linux/dma-map-ops.h>
 #include <asm/mipsregs.h>
 #include <asm/jazz.h>
 #include <asm/io.h>
@@ -209,76 +208,6 @@ int vdma_free(unsigned long laddr)
 
 EXPORT_SYMBOL(vdma_free);
 
-/*
- * Map certain page(s) to another physical address.
- * Caller must have allocated the page(s) before.
- */
-int vdma_remap(unsigned long laddr, unsigned long paddr, unsigned long size)
-{
-       int first, pages;
-
-       if (laddr > 0xffffff) {
-               if (vdma_debug)
-                       printk
-                           ("vdma_map: Invalid logical address: %08lx\n",
-                            laddr);
-               return -EINVAL; /* invalid logical address */
-       }
-       if (paddr > 0x1fffffff) {
-               if (vdma_debug)
-                       printk
-                           ("vdma_map: Invalid physical address: %08lx\n",
-                            paddr);
-               return -EINVAL; /* invalid physical address */
-       }
-
-       pages = (((paddr & (VDMA_PAGESIZE - 1)) + size) >> 12) + 1;
-       first = laddr >> 12;
-       if (vdma_debug)
-               printk("vdma_remap: first=%x, pages=%x\n", first, pages);
-       if (first + pages > VDMA_PGTBL_ENTRIES) {
-               if (vdma_debug)
-                       printk("vdma_alloc: Invalid size: %08lx\n", size);
-               return -EINVAL;
-       }
-
-       paddr &= ~(VDMA_PAGESIZE - 1);
-       while (pages > 0 && first < VDMA_PGTBL_ENTRIES) {
-               if (pgtbl[first].owner != laddr) {
-                       if (vdma_debug)
-                               printk("Trying to remap other's pages.\n");
-                       return -EPERM;  /* not owner */
-               }
-               pgtbl[first].frame = paddr;
-               paddr += VDMA_PAGESIZE;
-               first++;
-               pages--;
-       }
-
-       /*
-        * Update translation table
-        */
-       r4030_write_reg32(JAZZ_R4030_TRSTBL_INV, 0);
-
-       if (vdma_debug > 2) {
-               int i;
-               pages = (((paddr & (VDMA_PAGESIZE - 1)) + size) >> 12) + 1;
-               first = laddr >> 12;
-               printk("LADDR: ");
-               for (i = first; i < first + pages; i++)
-                       printk("%08x ", i << 12);
-               printk("\nPADDR: ");
-               for (i = first; i < first + pages; i++)
-                       printk("%08x ", pgtbl[i].frame);
-               printk("\nOWNER: ");
-               for (i = first; i < first + pages; i++)
-                       printk("%08x ", pgtbl[i].owner);
-               printk("\n");
-       }
-
-       return 0;
-}
-
 /*
  * Translate a physical address to a logical address.
  * This will return the logical address of the first
@@ -562,26 +491,34 @@ int vdma_get_enable(int channel)
 static void *jazz_dma_alloc(struct device *dev, size_t size,
                dma_addr_t *dma_handle, gfp_t gfp, unsigned long attrs)
 {
+       struct page *page;
        void *ret;
 
-       ret = dma_direct_alloc_pages(dev, size, dma_handle, gfp, attrs);
-       if (!ret)
-               return NULL;
+       if (attrs & DMA_ATTR_NO_WARN)
+               gfp |= __GFP_NOWARN;
 
-       *dma_handle = vdma_alloc(virt_to_phys(ret), size);
-       if (*dma_handle == DMA_MAPPING_ERROR) {
-               dma_direct_free_pages(dev, size, ret, *dma_handle, attrs);
+       size = PAGE_ALIGN(size);
+       page = alloc_pages(gfp, get_order(size));
+       if (!page)
                return NULL;
-       }
-
-       return ret;
+       ret = page_address(page);
+       memset(ret, 0, size);
+       *dma_handle = vdma_alloc(virt_to_phys(ret), size);
+       if (*dma_handle == DMA_MAPPING_ERROR)
+               goto out_free_pages;
+       arch_dma_prep_coherent(page, size);
+       return (void *)(UNCAC_BASE + __pa(ret));
+
+out_free_pages:
+       __free_pages(page, get_order(size));
+       return NULL;
 }
 
 static void jazz_dma_free(struct device *dev, size_t size, void *vaddr,
                dma_addr_t dma_handle, unsigned long attrs)
 {
        vdma_free(dma_handle);
-       dma_direct_free_pages(dev, size, vaddr, dma_handle, attrs);
+       __free_pages(virt_to_page(vaddr), get_order(size));
 }
 
 static dma_addr_t jazz_dma_map_page(struct device *dev, struct page *page,
@@ -615,7 +552,7 @@ static int jazz_dma_map_sg(struct device *dev, struct scatterlist *sglist,
                                dir);
                sg->dma_address = vdma_alloc(sg_phys(sg), sg->length);
                if (sg->dma_address == DMA_MAPPING_ERROR)
-                       return 0;
+                       return -EIO;
                sg_dma_len(sg) = sg->length;
        }
 
@@ -678,9 +615,9 @@ const struct dma_map_ops jazz_dma_ops = {
        .sync_single_for_device = jazz_dma_sync_single_for_device,
        .sync_sg_for_cpu        = jazz_dma_sync_sg_for_cpu,
        .sync_sg_for_device     = jazz_dma_sync_sg_for_device,
-       .dma_supported          = dma_direct_supported,
-       .cache_sync             = arch_dma_cache_sync,
        .mmap                   = dma_common_mmap,
        .get_sgtable            = dma_common_get_sgtable,
+       .alloc_pages            = dma_common_alloc_pages,
+       .free_pages             = dma_common_free_pages,
 };
 EXPORT_SYMBOL(jazz_dma_ops);