x86: PAT add ioremap_wc() interface
Introduce ioremap_wc for wc remap. (generic wrapper is in a later patch) Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> Signed-off-by: Suresh Siddha <suresh.b.siddha@intel.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
		
							parent
							
								
									ef354af462
								
							
						
					
					
						commit
						b310f381d2
					
				| @ -97,6 +97,9 @@ int ioremap_change_attr(unsigned long vaddr, unsigned long size, | ||||
| 	default: | ||||
| 		err = _set_memory_uc(vaddr, nrpages); | ||||
| 		break; | ||||
| 	case _PAGE_CACHE_WC: | ||||
| 		err = _set_memory_wc(vaddr, nrpages); | ||||
| 		break; | ||||
| 	case _PAGE_CACHE_WB: | ||||
| 		err = _set_memory_wb(vaddr, nrpages); | ||||
| 		break; | ||||
| @ -166,8 +169,13 @@ static void __iomem *__ioremap(resource_size_t phys_addr, unsigned long size, | ||||
| 		 * Do not fallback to certain memory types with certain | ||||
| 		 * requested type: | ||||
| 		 * - request is uncached, return cannot be write-back | ||||
| 		 * - request is uncached, return cannot be write-combine | ||||
| 		 * - request is write-combine, return cannot be write-back | ||||
| 		 */ | ||||
| 		if ((prot_val == _PAGE_CACHE_UC && | ||||
| 		     (new_prot_val == _PAGE_CACHE_WB || | ||||
| 		      new_prot_val == _PAGE_CACHE_WC)) || | ||||
| 		    (prot_val == _PAGE_CACHE_WC && | ||||
| 		     new_prot_val == _PAGE_CACHE_WB)) { | ||||
| 			free_memtype(phys_addr, phys_addr + size); | ||||
| 			return NULL; | ||||
| @ -180,6 +188,9 @@ static void __iomem *__ioremap(resource_size_t phys_addr, unsigned long size, | ||||
| 	default: | ||||
| 		prot = PAGE_KERNEL_NOCACHE; | ||||
| 		break; | ||||
| 	case _PAGE_CACHE_WC: | ||||
| 		prot = PAGE_KERNEL_WC; | ||||
| 		break; | ||||
| 	case _PAGE_CACHE_WB: | ||||
| 		prot = PAGE_KERNEL; | ||||
| 		break; | ||||
| @ -235,6 +246,25 @@ void __iomem *ioremap_nocache(resource_size_t phys_addr, unsigned long size) | ||||
| } | ||||
| EXPORT_SYMBOL(ioremap_nocache); | ||||
| 
 | ||||
| /**
 | ||||
|  * ioremap_wc	-	map memory into CPU space write combined | ||||
|  * @offset:	bus address of the memory | ||||
|  * @size:	size of the resource to map | ||||
|  * | ||||
|  * This version of ioremap ensures that the memory is marked write combining. | ||||
|  * Write combining allows faster writes to some hardware devices. | ||||
|  * | ||||
|  * Must be freed with iounmap. | ||||
|  */ | ||||
| void __iomem *ioremap_wc(unsigned long phys_addr, unsigned long size) | ||||
| { | ||||
| 	if (pat_wc_enabled) | ||||
| 		return __ioremap(phys_addr, size, _PAGE_CACHE_WC); | ||||
| 	else | ||||
| 		return ioremap_nocache(phys_addr, size); | ||||
| } | ||||
| EXPORT_SYMBOL(ioremap_wc); | ||||
| 
 | ||||
| void __iomem *ioremap_cache(resource_size_t phys_addr, unsigned long size) | ||||
| { | ||||
| 	return __ioremap(phys_addr, size, _PAGE_CACHE_WB); | ||||
|  | ||||
| @ -1,3 +1,5 @@ | ||||
| #define ARCH_HAS_IOREMAP_WC | ||||
| 
 | ||||
| #ifdef CONFIG_X86_32 | ||||
| # include "io_32.h" | ||||
| #else | ||||
| @ -5,4 +7,5 @@ | ||||
| #endif | ||||
| extern int ioremap_change_attr(unsigned long vaddr, unsigned long size, | ||||
| 				unsigned long prot_val); | ||||
| extern void __iomem * ioremap_wc(unsigned long offset, unsigned long size); | ||||
| 
 | ||||
|  | ||||
| @ -90,6 +90,7 @@ extern pteval_t __PAGE_KERNEL, __PAGE_KERNEL_EXEC; | ||||
| #define __PAGE_KERNEL_RO		(__PAGE_KERNEL & ~_PAGE_RW) | ||||
| #define __PAGE_KERNEL_RX		(__PAGE_KERNEL_EXEC & ~_PAGE_RW) | ||||
| #define __PAGE_KERNEL_EXEC_NOCACHE	(__PAGE_KERNEL_EXEC | _PAGE_PCD | _PAGE_PWT) | ||||
| #define __PAGE_KERNEL_WC		(__PAGE_KERNEL | _PAGE_CACHE_WC) | ||||
| #define __PAGE_KERNEL_NOCACHE		(__PAGE_KERNEL | _PAGE_PCD | _PAGE_PWT) | ||||
| #define __PAGE_KERNEL_UC_MINUS		(__PAGE_KERNEL | _PAGE_PCD) | ||||
| #define __PAGE_KERNEL_VSYSCALL		(__PAGE_KERNEL_RX | _PAGE_USER) | ||||
| @ -107,6 +108,7 @@ extern pteval_t __PAGE_KERNEL, __PAGE_KERNEL_EXEC; | ||||
| #define PAGE_KERNEL_RO			MAKE_GLOBAL(__PAGE_KERNEL_RO) | ||||
| #define PAGE_KERNEL_EXEC		MAKE_GLOBAL(__PAGE_KERNEL_EXEC) | ||||
| #define PAGE_KERNEL_RX			MAKE_GLOBAL(__PAGE_KERNEL_RX) | ||||
| #define PAGE_KERNEL_WC			MAKE_GLOBAL(__PAGE_KERNEL_WC) | ||||
| #define PAGE_KERNEL_NOCACHE		MAKE_GLOBAL(__PAGE_KERNEL_NOCACHE) | ||||
| #define PAGE_KERNEL_UC_MINUS		MAKE_GLOBAL(__PAGE_KERNEL_UC_MINUS) | ||||
| #define PAGE_KERNEL_EXEC_NOCACHE	MAKE_GLOBAL(__PAGE_KERNEL_EXEC_NOCACHE) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user