diff options
Diffstat (limited to 'arch/powerpc/mm/pgtable_32.c')
| -rw-r--r-- | arch/powerpc/mm/pgtable_32.c | 24 | 
1 files changed, 19 insertions, 5 deletions
diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c index a87ead0138b..343a87fa78b 100644 --- a/arch/powerpc/mm/pgtable_32.c +++ b/arch/powerpc/mm/pgtable_32.c @@ -33,6 +33,7 @@  #include <asm/pgalloc.h>  #include <asm/fixmap.h>  #include <asm/io.h> +#include <asm/setup.h>  #include "mmu_decl.h" @@ -78,7 +79,7 @@ pgd_t *pgd_alloc(struct mm_struct *mm)  	/* pgdir take page or two with 4K pages and a page fraction otherwise */  #ifndef CONFIG_PPC_4K_PAGES -	ret = (pgd_t *)kzalloc(1 << PGDIR_ORDER, GFP_KERNEL); +	ret = kzalloc(1 << PGDIR_ORDER, GFP_KERNEL);  #else  	ret = (pgd_t *)__get_free_pages(GFP_KERNEL|__GFP_ZERO,  			PGDIR_ORDER - PAGE_SHIFT); @@ -120,7 +121,10 @@ pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address)  	ptepage = alloc_pages(flags, 0);  	if (!ptepage)  		return NULL; -	pgtable_page_ctor(ptepage); +	if (!pgtable_page_ctor(ptepage)) { +		__free_page(ptepage); +		return NULL; +	}  	return ptepage;  } @@ -133,7 +137,15 @@ ioremap(phys_addr_t addr, unsigned long size)  EXPORT_SYMBOL(ioremap);  void __iomem * -ioremap_flags(phys_addr_t addr, unsigned long size, unsigned long flags) +ioremap_wc(phys_addr_t addr, unsigned long size) +{ +	return __ioremap_caller(addr, size, _PAGE_NO_CACHE, +				__builtin_return_address(0)); +} +EXPORT_SYMBOL(ioremap_wc); + +void __iomem * +ioremap_prot(phys_addr_t addr, unsigned long size, unsigned long flags)  {  	/* writeable implies dirty for kernel addresses */  	if (flags & _PAGE_RW) @@ -152,7 +164,7 @@ ioremap_flags(phys_addr_t addr, unsigned long size, unsigned long flags)  	return __ioremap_caller(addr, size, flags, __builtin_return_address(0));  } -EXPORT_SYMBOL(ioremap_flags); +EXPORT_SYMBOL(ioremap_prot);  void __iomem *  __ioremap(phys_addr_t addr, unsigned long size, unsigned long flags) @@ -199,7 +211,7 @@ __ioremap_caller(phys_addr_t addr, unsigned long size, unsigned long flags,  	 */  	if (mem_init_done && (p < virt_to_phys(high_memory)) &&  	    !(__allow_ioremap_reserved && memblock_is_region_reserved(p, size))) { -		printk("__ioremap(): phys addr 0x%llx is RAM lr %p\n", +		printk("__ioremap(): phys addr 0x%llx is RAM lr %pf\n",  		       (unsigned long long)p, __builtin_return_address(0));  		return NULL;  	} @@ -230,6 +242,7 @@ __ioremap_caller(phys_addr_t addr, unsigned long size, unsigned long flags,  		area = get_vm_area_caller(size, VM_IOREMAP, caller);  		if (area == 0)  			return NULL; +		area->phys_addr = p;  		v = (unsigned long) area->addr;  	} else {  		v = (ioremap_bot -= size); @@ -286,6 +299,7 @@ int map_page(unsigned long va, phys_addr_t pa, int flags)  		set_pte_at(&init_mm, va, pg, pfn_pte(pa >> PAGE_SHIFT,  						     __pgprot(flags)));  	} +	smp_wmb();  	return err;  }  | 
