diff options
Diffstat (limited to 'arch/x86/mm/ioremap.c')
| -rw-r--r-- | arch/x86/mm/ioremap.c | 30 | 
1 files changed, 27 insertions, 3 deletions
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index 71bb3159031..d1b867101e5 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c @@ -300,6 +300,29 @@ void __iomem *ioremap_cache(resource_size_t phys_addr, unsigned long size)  }  EXPORT_SYMBOL(ioremap_cache); +static void __iomem *ioremap_default(resource_size_t phys_addr, +					unsigned long size) +{ +	unsigned long flags; +	void *ret; +	int err; + +	/* +	 * - WB for WB-able memory and no other conflicting mappings +	 * - UC_MINUS for non-WB-able memory with no other conflicting mappings +	 * - Inherit from confliting mappings otherwise +	 */ +	err = reserve_memtype(phys_addr, phys_addr + size, -1, &flags); +	if (err < 0) +		return NULL; + +	ret = (void *) __ioremap_caller(phys_addr, size, flags, +					__builtin_return_address(0)); + +	free_memtype(phys_addr, phys_addr + size); +	return (void __iomem *)ret; +} +  /**   * iounmap - Free a IO remapping   * @addr: virtual address from ioremap_* @@ -365,7 +388,7 @@ void *xlate_dev_mem_ptr(unsigned long phys)  	if (page_is_ram(start >> PAGE_SHIFT))  		return __va(phys); -	addr = (void *)ioremap(start, PAGE_SIZE); +	addr = (void *)ioremap_default(start, PAGE_SIZE);  	if (addr)  		addr = (void *)((unsigned long)addr | (phys & ~PAGE_MASK)); @@ -593,10 +616,11 @@ void __init early_iounmap(void *addr, unsigned long size)  	unsigned long offset;  	unsigned int nrpages;  	enum fixed_addresses idx; -	unsigned int nesting; +	int nesting;  	nesting = --early_ioremap_nested; -	WARN_ON(nesting < 0); +	if (WARN_ON(nesting < 0)) +		return;  	if (early_ioremap_debug) {  		printk(KERN_INFO "early_iounmap(%p, %08lx) [%d]\n", addr,  |