提交 c9d06962 编写于 作者: F Franck Bui-Huu 提交者: Ralf Baechle

[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: NMaxime Bizon <mbizon@freebox.fr>
Signed-off-by: NFranck Bui-Huu <fbuihuu@gmail.com>

[Build fixes for machines that don't use the generic dma-coherence.h]
Signed-off-by: NRalf Baechle <ralf@linux-mips.org>
上级 f33bc55c
...@@ -19,6 +19,13 @@ ...@@ -19,6 +19,13 @@
#include <dma-coherence.h> #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; * Warning on the terminology - Linux calls an uncached area coherent;
* MIPS terminology calls memory areas with hardware maintained coherency * 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, ...@@ -140,7 +147,7 @@ void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
enum dma_data_direction direction) enum dma_data_direction direction)
{ {
if (cpu_is_noncoherent_r10000(dev)) 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); direction);
plat_unmap_dma_mem(dma_addr); plat_unmap_dma_mem(dma_addr);
...@@ -234,7 +241,7 @@ void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, ...@@ -234,7 +241,7 @@ void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle,
if (cpu_is_noncoherent_r10000(dev)) { if (cpu_is_noncoherent_r10000(dev)) {
unsigned long addr; 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); __dma_sync(addr, size, direction);
} }
} }
...@@ -249,7 +256,7 @@ void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, ...@@ -249,7 +256,7 @@ void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle,
if (!plat_device_is_coherent(dev)) { if (!plat_device_is_coherent(dev)) {
unsigned long addr; 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); __dma_sync(addr, size, direction);
} }
} }
...@@ -264,7 +271,7 @@ void dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle, ...@@ -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)) { if (cpu_is_noncoherent_r10000(dev)) {
unsigned long addr; 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); __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, ...@@ -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)) { if (!plat_device_is_coherent(dev)) {
unsigned long addr; 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); __dma_sync(addr + offset, size, direction);
} }
} }
......
...@@ -199,7 +199,7 @@ static inline unsigned long pud_page_vaddr(pud_t pud) ...@@ -199,7 +199,7 @@ static inline unsigned long pud_page_vaddr(pud_t pud)
{ {
return pud_val(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)) #define pud_page(pud) (pfn_to_page(pud_phys(pud) >> PAGE_SHIFT))
/* Find an entry in the second-level page table.. */ /* Find an entry in the second-level page table.. */
......
...@@ -75,7 +75,7 @@ extern void paging_init(void); ...@@ -75,7 +75,7 @@ extern void paging_init(void);
* Conversion functions: convert a page and protection to a page entry, * Conversion functions: convert a page and protection to a page entry,
* and a page entry and page directory to the page they refer to. * 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(pmd) (pfn_to_page(pmd_phys(pmd) >> PAGE_SHIFT))
#define pmd_page_vaddr(pmd) pmd_val(pmd) #define pmd_page_vaddr(pmd) pmd_val(pmd)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册