Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c9d06962 authored by Franck Bui-Huu's avatar Franck Bui-Huu Committed by Ralf Baechle
Browse files

[MIPS] Always use virt_to_phys() when translating kernel addresses



This patch fixes two places where we used plain 'x - PAGE_OFFSET' to
achieve virtual to physical address convertions. This type of convertion
is no more allowed since commit 6f284a2c.

Reported-by: default avatarMaxime Bizon <mbizon@freebox.fr>
Signed-off-by: default avatarFranck Bui-Huu <fbuihuu@gmail.com>

[Build fixes for machines that don't use the generic dma-coherence.h]

Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent f33bc55c
Loading
Loading
Loading
Loading
+12 −5
Original line number Diff line number Diff line
@@ -19,6 +19,13 @@

#include <dma-coherence.h>

static inline unsigned long dma_addr_to_virt(dma_addr_t dma_addr)
{
	unsigned long addr = plat_dma_addr_to_phys(dma_addr);

	return (unsigned long)phys_to_virt(addr);
}

/*
 * Warning on the terminology - Linux calls an uncached area coherent;
 * MIPS terminology calls memory areas with hardware maintained coherency
@@ -140,7 +147,7 @@ void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
	enum dma_data_direction direction)
{
	if (cpu_is_noncoherent_r10000(dev))
		__dma_sync(plat_dma_addr_to_phys(dma_addr) + PAGE_OFFSET, size,
		__dma_sync(dma_addr_to_virt(dma_addr), size,
		           direction);

	plat_unmap_dma_mem(dma_addr);
@@ -234,7 +241,7 @@ void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle,
	if (cpu_is_noncoherent_r10000(dev)) {
		unsigned long addr;

		addr = PAGE_OFFSET + plat_dma_addr_to_phys(dma_handle);
		addr = dma_addr_to_virt(dma_handle);
		__dma_sync(addr, size, direction);
	}
}
@@ -249,7 +256,7 @@ void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle,
	if (!plat_device_is_coherent(dev)) {
		unsigned long addr;

		addr = PAGE_OFFSET + plat_dma_addr_to_phys(dma_handle);
		addr = dma_addr_to_virt(dma_handle);
		__dma_sync(addr, size, direction);
	}
}
@@ -264,7 +271,7 @@ void dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle,
	if (cpu_is_noncoherent_r10000(dev)) {
		unsigned long addr;

		addr = PAGE_OFFSET + plat_dma_addr_to_phys(dma_handle);
		addr = dma_addr_to_virt(dma_handle);
		__dma_sync(addr + offset, size, direction);
	}
}
@@ -279,7 +286,7 @@ void dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle,
	if (!plat_device_is_coherent(dev)) {
		unsigned long addr;

		addr = PAGE_OFFSET + plat_dma_addr_to_phys(dma_handle);
		addr = dma_addr_to_virt(dma_handle);
		__dma_sync(addr + offset, size, direction);
	}
}
+1 −1
Original line number Diff line number Diff line
@@ -199,7 +199,7 @@ static inline unsigned long pud_page_vaddr(pud_t pud)
{
	return pud_val(pud);
}
#define pud_phys(pud)		(pud_val(pud) - PAGE_OFFSET)
#define pud_phys(pud)		virt_to_phys((void *)pud_val(pud))
#define pud_page(pud)		(pfn_to_page(pud_phys(pud) >> PAGE_SHIFT))

/* Find an entry in the second-level page table.. */
+1 −1
Original line number Diff line number Diff line
@@ -75,7 +75,7 @@ extern void paging_init(void);
 * Conversion functions: convert a page and protection to a page entry,
 * and a page entry and page directory to the page they refer to.
 */
#define pmd_phys(pmd)		(pmd_val(pmd) - PAGE_OFFSET)
#define pmd_phys(pmd)		virt_to_phys((void *)pmd_val(pmd))
#define pmd_page(pmd)		(pfn_to_page(pmd_phys(pmd) >> PAGE_SHIFT))
#define pmd_page_vaddr(pmd)	pmd_val(pmd)