diff options
author | FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> | 2008-09-24 07:48:35 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-09-25 05:02:25 -0400 |
commit | 9f6ac57729724b58df81ca5dc005326759a806fe (patch) | |
tree | d9ee77c4518d83582bf1de1acf43e1834932f5f3 /arch/x86/kernel/pci-nommu.c | |
parent | afa9fdc2f5f8e4d98f3e77bfa204412cbc181346 (diff) |
x86: export pci-nommu's alloc_coherent
This patch exports nommu_alloc_coherent (renamed
dma_generic_alloc_coherent). GART needs this function.
Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/kernel/pci-nommu.c')
-rw-r--r-- | arch/x86/kernel/pci-nommu.c | 39 |
1 files changed, 1 insertions, 38 deletions
diff --git a/arch/x86/kernel/pci-nommu.c b/arch/x86/kernel/pci-nommu.c index 1c1c98a31d57..c70ab5a5d4c8 100644 --- a/arch/x86/kernel/pci-nommu.c +++ b/arch/x86/kernel/pci-nommu.c | |||
@@ -72,43 +72,6 @@ static int nommu_map_sg(struct device *hwdev, struct scatterlist *sg, | |||
72 | return nents; | 72 | return nents; |
73 | } | 73 | } |
74 | 74 | ||
75 | static void * | ||
76 | nommu_alloc_coherent(struct device *hwdev, size_t size, | ||
77 | dma_addr_t *dma_addr, gfp_t gfp) | ||
78 | { | ||
79 | unsigned long dma_mask; | ||
80 | int node; | ||
81 | struct page *page; | ||
82 | dma_addr_t addr; | ||
83 | |||
84 | dma_mask = dma_alloc_coherent_mask(hwdev, gfp); | ||
85 | |||
86 | gfp |= __GFP_ZERO; | ||
87 | |||
88 | node = dev_to_node(hwdev); | ||
89 | again: | ||
90 | page = alloc_pages_node(node, gfp, get_order(size)); | ||
91 | if (!page) | ||
92 | return NULL; | ||
93 | |||
94 | addr = page_to_phys(page); | ||
95 | if (!is_buffer_dma_capable(dma_mask, addr, size) && !(gfp & GFP_DMA)) { | ||
96 | free_pages((unsigned long)page_address(page), get_order(size)); | ||
97 | gfp |= GFP_DMA; | ||
98 | goto again; | ||
99 | } | ||
100 | |||
101 | if (check_addr("alloc_coherent", hwdev, addr, size)) { | ||
102 | *dma_addr = addr; | ||
103 | flush_write_buffers(); | ||
104 | return page_address(page); | ||
105 | } | ||
106 | |||
107 | free_pages((unsigned long)page_address(page), get_order(size)); | ||
108 | |||
109 | return NULL; | ||
110 | } | ||
111 | |||
112 | static void nommu_free_coherent(struct device *dev, size_t size, void *vaddr, | 75 | static void nommu_free_coherent(struct device *dev, size_t size, void *vaddr, |
113 | dma_addr_t dma_addr) | 76 | dma_addr_t dma_addr) |
114 | { | 77 | { |
@@ -116,7 +79,7 @@ static void nommu_free_coherent(struct device *dev, size_t size, void *vaddr, | |||
116 | } | 79 | } |
117 | 80 | ||
118 | struct dma_mapping_ops nommu_dma_ops = { | 81 | struct dma_mapping_ops nommu_dma_ops = { |
119 | .alloc_coherent = nommu_alloc_coherent, | 82 | .alloc_coherent = dma_generic_alloc_coherent, |
120 | .free_coherent = nommu_free_coherent, | 83 | .free_coherent = nommu_free_coherent, |
121 | .map_single = nommu_map_single, | 84 | .map_single = nommu_map_single, |
122 | .map_sg = nommu_map_sg, | 85 | .map_sg = nommu_map_sg, |