x86: remove virt_to_bus in pci-dma_64.c
virt_to_bus() is deprecated according to the docs, and moreover, won't return the right thing in i386 if we're dealing with high memory mappings. So we make our allocation function return a page, and then use page_address() (for virtual addr) and page_to_phys() (for physical addr) instead. Signed-off-by: Glauber Costa <gcosta@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
This commit is contained in:
parent
2e33e36118
commit
71848d687e
|
@ -28,13 +28,11 @@ struct device fallback_dev = {
|
||||||
noinline static void *
|
noinline static void *
|
||||||
dma_alloc_pages(struct device *dev, gfp_t gfp, unsigned order)
|
dma_alloc_pages(struct device *dev, gfp_t gfp, unsigned order)
|
||||||
{
|
{
|
||||||
struct page *page;
|
|
||||||
int node;
|
int node;
|
||||||
|
|
||||||
node = dev_to_node(dev);
|
node = dev_to_node(dev);
|
||||||
|
|
||||||
page = alloc_pages_node(node, gfp, order);
|
return alloc_pages_node(node, gfp, order);
|
||||||
return page ? page_address(page) : NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define dma_alloc_from_coherent_mem(dev, size, handle, ret) (0)
|
#define dma_alloc_from_coherent_mem(dev, size, handle, ret) (0)
|
||||||
|
@ -47,6 +45,7 @@ dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
|
||||||
gfp_t gfp)
|
gfp_t gfp)
|
||||||
{
|
{
|
||||||
void *memory;
|
void *memory;
|
||||||
|
struct page *page;
|
||||||
unsigned long dma_mask = 0;
|
unsigned long dma_mask = 0;
|
||||||
u64 bus;
|
u64 bus;
|
||||||
|
|
||||||
|
@ -79,13 +78,14 @@ dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
|
||||||
gfp |= GFP_DMA32;
|
gfp |= GFP_DMA32;
|
||||||
|
|
||||||
again:
|
again:
|
||||||
memory = dma_alloc_pages(dev, gfp, get_order(size));
|
page = dma_alloc_pages(dev, gfp, get_order(size));
|
||||||
if (memory == NULL)
|
if (page == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
{
|
{
|
||||||
int high, mmu;
|
int high, mmu;
|
||||||
bus = virt_to_bus(memory);
|
bus = page_to_phys(page);
|
||||||
|
memory = page_address(page);
|
||||||
high = (bus + size) >= dma_mask;
|
high = (bus + size) >= dma_mask;
|
||||||
mmu = high;
|
mmu = high;
|
||||||
if (force_iommu && !(gfp & GFP_DMA))
|
if (force_iommu && !(gfp & GFP_DMA))
|
||||||
|
@ -112,7 +112,7 @@ dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
|
||||||
|
|
||||||
memset(memory, 0, size);
|
memset(memory, 0, size);
|
||||||
if (!mmu) {
|
if (!mmu) {
|
||||||
*dma_handle = virt_to_bus(memory);
|
*dma_handle = bus;
|
||||||
return memory;
|
return memory;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue