import of ftp.dlink.com/GPL/DSMG-600_reB/ppclinux.tar.gz
[linux-2.4.21-pre4.git] / arch / ppc / kernel / pci-dma.c
1 /*
2  * BK Id: SCCS/s.pci-dma.c 1.10 06/13/02 14:57:36 trini
3  */
4 /*
5  * Copyright (C) 2000   Ani Joshi <ajoshi@unixbox.com>
6  *
7  *
8  * Dynamic DMA mapping support.
9  *
10  * swiped from i386
11  *
12  */
13
14 #include <linux/types.h>
15 #include <linux/mm.h>
16 #include <linux/string.h>
17 #include <linux/pci.h>
18 #include <asm/io.h>
19
20 void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size,
21                            dma_addr_t *dma_handle)
22 {
23         void *ret;
24         int gfp = GFP_ATOMIC;
25
26         if (hwdev == NULL || hwdev->dma_mask != 0xffffffff)
27                 gfp |= GFP_DMA;
28
29 #ifdef CONFIG_NOT_COHERENT_CACHE
30         ret = consistent_alloc(gfp, size, dma_handle);
31 #else
32         ret = (void *)__get_free_pages(gfp, get_order(size));
33 #endif
34
35         if (ret != NULL) {
36                 memset(ret, 0, size);
37 #ifndef CONFIG_NOT_COHERENT_CACHE
38                 *dma_handle = virt_to_bus(ret);
39 #endif
40         }
41         return ret;
42 }
43
44 void pci_free_consistent(struct pci_dev *hwdev, size_t size,
45                          void *vaddr, dma_addr_t dma_handle)
46 {
47 #ifdef CONFIG_NOT_COHERENT_CACHE
48         consistent_free(vaddr);
49 #else
50         free_pages((unsigned long)vaddr, get_order(size));
51 #endif
52 }