Fix io_remap_page_range for 36-bit phys platforms
PATCH 1/1 Fix io_remap_page_range for 36-bit phys platforms
Fixes io_remap_page_range() to use the 32-bit address translator similar to ioremap(). Someday u64 start/end resources should make this unnecessary. Fixes set_pte() to handle a long long pte_t properly.
Signed-off-by Matt Porter <[email protected]>
arch/ppc/Kconfig +5 -0
@@ -97,6 +97,11 @@ depends on 44x default y +config PHYS_64BIT + bool + depends on 44x + default y + config ALTIVEC bool "AltiVec Support" depends on 6xx || POWER4
arch/ppc/syslib/ibm44x_common.c +2 -0
@@ -19,6 +19,7 @@#include <linux/time.h> #include <linux/types.h> #include <linux/serial.h> +#include <linux/module.h> #include <asm/ibm44x.h> #include <asm/mmu.h>
@@ -47,6 +48,7 @@return (page_4gb | addr); }; +EXPORT_SYMBOL (fixup_bigphys_addr);void __init ibm44x_calibrate_decr (unsigned int freq) {
include/asm-ppc/pgtable.h +15 -1
@@ -431,7 +431,7 @@#define pte_pfn (x) (pte_val(x) >> PAGE_SHIFT)#define pte_page (x) pfn_to_page(pte_pfn(x)) -#define pfn_pte (pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) +#define pfn_pte (pfn, prot) __pte(((pte_t)(pfn) << PAGE_SHIFT) | pgprot_val(prot))#define mk_pte (page, prot) pfn_pte(page_to_pfn(page), prot)/*
@@ -714,8 +714,22 @@/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ #define kern_addr_valid (addr) (1) +#ifdef CONFIG_PHYS_64BIT +extern int remap_pfn_range (struct vm_area_struct *vma,unsigned long from, +unsigned long paddr,unsigned long size,pgprot_t prot); +static inline int io_remap_page_range (struct vm_area_struct *vma, +unsigned long vaddr, +unsigned long paddr, +unsigned long size, +pgprot_t prot) +{ +phys_addr_t paddr64 =fixup_bigphys_addr (paddr, size); +return remap_pfn_range (vma, vaddr, paddr64 >>PAGE_SHIFT , size, prot); +} +#else #define io_remap_page_range (vma, vaddr, paddr, size, prot) \ remap_pfn_range(vma, vaddr, (paddr) >> PAGE_SHIFT, size, prot) +#endif /* * No page table caches to initialise