Always use virt_to_phys() when translating kernel addresses
PATCH 1/1 Always use virt_to_phys() when translating kernel addresses
From: Franck Bui-Huu <[email protected]>
This patch fixes two places where we used plain 'x - PAGE_OFFSET' to achieve virtual to physical address convertion. This type of convertion is no more allowed since commit 6f284a2ce7b8bc49cb8455b1763357897a899abb.
---
Ralf,
Could you apply this patch. Unfortunately I failed to report back these changes when submitting the original patch, and without it, platforms which are using (or trying to use) PHYS_OFFSET will break.
Thanks,
Franck
include/asm-mips/pgtable-64.h | 2 +- include/asm-mips/pgtable.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
include/asm-mips/pgtable-64.h +1 -1
@@ -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.. */
include/asm-mips/pgtable.h +1 -1
@@ -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)
Signature · 1 line
1.4.4.3.ge6d4
On Mon, 2007-03-19 at 10:41 +0100, Franck Bui-Huu wrote:
Hi Franck,
Quoted 3 lines
This patch fixes two places where we used plain 'x -
PAGE_OFFSET' to achieve virtual to physical address convertion. This type of convertion is no more allowed since commit6f284a2ce7b8bc49cb8455b1763357897a899abb.
I think you should also review arch/mips/mm/dma-noncoherent.c, it seems to use PAGE_OFFSET directly in dma_unmap_single. I'm using OWN_DMA so this code is not used on my board.
Regards,
Signature · 1 line
Maxime
Quoted 10 lines · Maxime Bizon
On Mon, 2007-03-19 at 10:41 +0100, Franck Bui-Huu wrote:
Hi Franck,
Quoted 3 lines
This patch fixes two places where we used plain 'x -
PAGE_OFFSET' to achieve virtual to physical address convertion. This type of convertion is no more allowed since commit6f284a2ce7b8bc49cb8455b1763357897a899abb.I think you should also review
arch/mips/mm/dma-noncoherent.c, it seems
dma-noncoherent.c has been removed since commit 9a88cbb5227970757881b1a65be01dea61fe2584. But you're right the new 'dma-default.c' still needs to be fixed...
Signature · 1 line
Franck
PATCH 1/1 Always use virt_to_phys() when translating kernel addresses [take #2]
From: Franck Bui-Huu <[email protected]>
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 6f284a2ce7b8bc49cb8455b1763357897a899abb.
--- arch/mips/mm/dma-default.c | 10 +++++----- include/asm-mips/mach-generic/dma-coherence.h | 7 +++++++ include/asm-mips/pgtable-64.h | 2 +- include/asm-mips/pgtable.h | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-)
arch/mips/mm/dma-default.c +5 -5
@@ -140,7 +140,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 (plat_dma_addr_to_virt (dma_addr), size, direction);plat_unmap_dma_mem (dma_addr);
@@ -234,7 +234,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 =plat_dma_addr_to_virt (dma_handle);__dma_sync (addr, size, direction); } }
@@ -249,7 +249,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 =plat_dma_addr_to_virt (dma_handle);__dma_sync (addr, size, direction); } }
@@ -264,7 +264,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 =plat_dma_addr_to_virt (dma_handle);__dma_sync (addr + offset, size, direction); } }
@@ -279,7 +279,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 =plat_dma_addr_to_virt (dma_handle);__dma_sync (addr + offset, size, direction); } }
include/asm-mips/mach-generic/dma-coherence.h +7 -0
@@ -28,6 +28,13 @@ static inline unsigned long plat_dma_addr_to_phys(dma_addr_t dma_addr)return dma_addr; } +static inline unsigned long plat_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); +} +static inline void plat_unmap_dma_mem (dma_addr_t dma_addr) { }
include/asm-mips/pgtable-64.h +1 -1
@@ -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.. */
include/asm-mips/pgtable.h +1 -1
@@ -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)
Signature · 1 line
1.4.4.3.ge6d4
Re: [PATCH] Always use virt_to_phys() when translating kernel addresses [take #2]
Quoted 5 lines · Franck Bui-Huu
include/asm-mips/mach-generic/dma-coherence.h +0
-0
include/asm-mips/mach-generic/dma-coherence.h static inline unsigned long plat_dma_addr_to_phys(dma_addr_t dma_addr) · line 37
Quoted 10 lines
include/asm-mips/mach-generic/dma-coherence.h +7
-0@@ -28,6 +28,13 @@ static inline unsigned long plat_dma_addr_to_phys(dma_addr_t dma_addr)return dma_addr; } +static inline unsigned long plat_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); +} +
Putting this function into include/asm-mips/mach-generic/dma-coherence.h breaks the build for all machines that don't include this header. I applied your patch with this issue fixed.
Ralf