diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2000-02-18 00:24:27 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2000-02-18 00:24:27 +0000 |
commit | b9558d5f86c471a125abf1fb3a3882fb053b1f8c (patch) | |
tree | 707b53ec64e740a7da87d5f36485e3cd9b1c794e /arch/mips/sni | |
parent | b3ac367c7a3e6047abe74817db27e34e759f279f (diff) |
Merge with Linux 2.3.41.
Diffstat (limited to 'arch/mips/sni')
-rw-r--r-- | arch/mips/sni/Makefile | 4 | ||||
-rw-r--r-- | arch/mips/sni/dma.c | 56 |
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)); +} |