Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 91037
b: refs/heads/master
c: 5fa78ca
h: refs/heads/master
i:
  91035: 1d777df
v: v3
  • Loading branch information
Glauber Costa authored and Ingo Molnar committed Apr 19, 2008
1 parent 42b3758 commit e5d1c92
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 6 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 8779f2fc3b84ebb6c5181fb13d702e9944c16069
refs/heads/master: 5fa78ca75d8e67063948a01b51594a0904af5710
34 changes: 29 additions & 5 deletions trunk/arch/x86/kernel/pci-dma_32.c
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,8 @@ void *dma_alloc_coherent(struct device *dev, size_t size,
struct page *page;
dma_addr_t bus;
int order = get_order(size);
unsigned long dma_mask = 0;

/* ignore region specifiers */
gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);

Expand All @@ -85,15 +87,37 @@ void *dma_alloc_coherent(struct device *dev, size_t size,
if (!dev)
dev = &fallback_dev;

dma_mask = dev->coherent_dma_mask;
if (dma_mask == 0)
dma_mask = DMA_32BIT_MASK;

again:
page = dma_alloc_pages(dev, gfp, order);
if (page == NULL)
return NULL;

ret = page_address(page);
bus = page_to_phys(page);

memset(ret, 0, size);
*dma_handle = bus;
{
int high, mmu;
bus = page_to_phys(page);
ret = page_address(page);
high = (bus + size) >= dma_mask;
mmu = high;
if (force_iommu && !(gfp & GFP_DMA))
mmu = 1;
else if (high) {
free_pages((unsigned long)ret,
get_order(size));

/* Don't use the 16MB ZONE_DMA unless absolutely
needed. It's better to use remapping first. */
if (dma_mask < DMA_32BIT_MASK && !(gfp & GFP_DMA)) {
gfp = (gfp & ~GFP_DMA32) | GFP_DMA;
goto again;
}
}
memset(ret, 0, size);
*dma_handle = bus;
}

return ret;
}
Expand Down

0 comments on commit e5d1c92

Please sign in to comment.