summaryrefslogtreecommitdiffstats
path: root/arch/mips/sni
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-02-18 00:24:27 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-02-18 00:24:27 +0000
commitb9558d5f86c471a125abf1fb3a3882fb053b1f8c (patch)
tree707b53ec64e740a7da87d5f36485e3cd9b1c794e /arch/mips/sni
parentb3ac367c7a3e6047abe74817db27e34e759f279f (diff)
Merge with Linux 2.3.41.
Diffstat (limited to 'arch/mips/sni')
-rw-r--r--arch/mips/sni/Makefile4
-rw-r--r--arch/mips/sni/dma.c56
2 files changed, 58 insertions, 2 deletions
diff --git a/arch/mips/sni/Makefile b/arch/mips/sni/Makefile
index f3bb81704..b5091e159 100644
--- a/arch/mips/sni/Makefile
+++ b/arch/mips/sni/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.3 1998/10/28 12:38:16 ralf Exp $
+# $Id: Makefile,v 1.3 1999/01/04 16:03:57 ralf Exp $
#
# Makefile for the SNI specific part of the kernel
#
@@ -14,7 +14,7 @@
all: sni.o
O_TARGET := sni.o
-O_OBJS := int-handler.o io.o pci.o pcimt_scache.o reset.o setup.o
+O_OBJS := dma.o int-handler.o io.o pci.o pcimt_scache.o reset.o setup.o
int-handler.o: int-handler.S
diff --git a/arch/mips/sni/dma.c b/arch/mips/sni/dma.c
new file mode 100644
index 000000000..26a7c0f0b
--- /dev/null
+++ b/arch/mips/sni/dma.c
@@ -0,0 +1,56 @@
+/* $Id: dma.c,v 1.1 2000/02/16 21:21:58 ralf Exp $
+ *
+ * Dynamic DMA mapping support.
+ *
+ * On RM200 there is no hardware dynamic DMA address translation,
+ * so consistent alloc/free are merely page allocation/freeing.
+ * The rest of the dynamic DMA mapping interface is implemented
+ * in <asm/pci.h>.
+ *
+ * These routines assume that the RM has all it's memory at physical
+ * addresses of < 512mb.
+ */
+#include <linux/types.h>
+#include <linux/mm.h>
+#include <linux/string.h>
+#include <linux/pci.h>
+#include <asm/io.h>
+
+/* Pure 2^n version of get_order */
+extern __inline__ int __get_order(unsigned long size)
+{
+ int order;
+
+ size = (size-1) >> (PAGE_SHIFT-1);
+ order = -1;
+ do {
+ size >>= 1;
+ order++;
+ } while (size);
+ return order;
+}
+
+void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size,
+ dma_addr_t *dma_handle)
+{
+ void *ret;
+ int gfp = GFP_ATOMIC;
+ int order = __get_order(size);
+
+ if (hwdev == NULL || hwdev->dma_mask != 0xffffffff)
+ gfp |= GFP_DMA;
+ ret = (void *)__get_free_pages(gfp, order);
+
+ if (ret != NULL) {
+ memset(ret, 0, size);
+ *dma_handle = virt_to_bus(ret);
+ }
+ dma_cache_wback_inv(ret, PAGE_SIZE << order);
+ return KSEG1ADDR(ret);
+}
+
+void pci_free_consistent(struct pci_dev *hwdev, size_t size,
+ void *vaddr, dma_addr_t dma_handle)
+{
+ free_pages((unsigned long)vaddr, __get_order(size));
+}