From b9558d5f86c471a125abf1fb3a3882fb053b1f8c Mon Sep 17 00:00:00 2001 From: Ralf Baechle Date: Fri, 18 Feb 2000 00:24:27 +0000 Subject: Merge with Linux 2.3.41. --- arch/mips/sni/Makefile | 4 ++-- arch/mips/sni/dma.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 arch/mips/sni/dma.c (limited to 'arch/mips/sni') 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 . + * + * These routines assume that the RM has all it's memory at physical + * addresses of < 512mb. + */ +#include +#include +#include +#include +#include + +/* 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)); +} -- cgit v1.2.3