| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  *  linux/include/asm-arm/domain.h | 
 | 3 |  * | 
 | 4 |  *  Copyright (C) 1999 Russell King. | 
 | 5 |  * | 
 | 6 |  * This program is free software; you can redistribute it and/or modify | 
 | 7 |  * it under the terms of the GNU General Public License version 2 as | 
 | 8 |  * published by the Free Software Foundation. | 
 | 9 |  */ | 
 | 10 | #ifndef __ASM_PROC_DOMAIN_H | 
 | 11 | #define __ASM_PROC_DOMAIN_H | 
 | 12 |  | 
 | 13 | /* | 
 | 14 |  * Domain numbers | 
 | 15 |  * | 
 | 16 |  *  DOMAIN_IO     - domain 2 includes all IO only | 
 | 17 |  *  DOMAIN_USER   - domain 1 includes all user memory only | 
 | 18 |  *  DOMAIN_KERNEL - domain 0 includes all kernel memory only | 
| Lennert Buytenhek | 23bdf86 | 2006-03-28 21:00:40 +0100 | [diff] [blame] | 19 |  * | 
 | 20 |  * The domain numbering depends on whether we support 36 physical | 
 | 21 |  * address for I/O or not.  Addresses above the 32 bit boundary can | 
 | 22 |  * only be mapped using supersections and supersections can only | 
 | 23 |  * be set for domain 0.  We could just default to DOMAIN_IO as zero, | 
 | 24 |  * but there may be systems with supersection support and no 36-bit | 
 | 25 |  * addressing.  In such cases, we want to map system memory with | 
 | 26 |  * supersections to reduce TLB misses and footprint. | 
 | 27 |  * | 
 | 28 |  * 36-bit addressing and supersections are only available on | 
 | 29 |  * CPUs based on ARMv6+ or the Intel XSC3 core. | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 30 |  */ | 
| Lennert Buytenhek | 23bdf86 | 2006-03-28 21:00:40 +0100 | [diff] [blame] | 31 | #ifndef CONFIG_IO_36 | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 32 | #define DOMAIN_KERNEL	0 | 
 | 33 | #define DOMAIN_TABLE	0 | 
 | 34 | #define DOMAIN_USER	1 | 
 | 35 | #define DOMAIN_IO	2 | 
| Lennert Buytenhek | 23bdf86 | 2006-03-28 21:00:40 +0100 | [diff] [blame] | 36 | #else | 
 | 37 | #define DOMAIN_KERNEL	2 | 
 | 38 | #define DOMAIN_TABLE	2 | 
 | 39 | #define DOMAIN_USER	1 | 
 | 40 | #define DOMAIN_IO	0 | 
 | 41 | #endif | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 42 |  | 
 | 43 | /* | 
 | 44 |  * Domain types | 
 | 45 |  */ | 
 | 46 | #define DOMAIN_NOACCESS	0 | 
 | 47 | #define DOMAIN_CLIENT	1 | 
 | 48 | #define DOMAIN_MANAGER	3 | 
 | 49 |  | 
 | 50 | #define domain_val(dom,type)	((type) << (2*(dom))) | 
 | 51 |  | 
 | 52 | #ifndef __ASSEMBLY__ | 
| Russell King | 002547b | 2006-06-20 20:46:52 +0100 | [diff] [blame] | 53 |  | 
 | 54 | #ifdef CONFIG_MMU | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 55 | #define set_domain(x)					\ | 
 | 56 | 	do {						\ | 
 | 57 | 	__asm__ __volatile__(				\ | 
 | 58 | 	"mcr	p15, 0, %0, c3, c0	@ set domain"	\ | 
 | 59 | 	  : : "r" (x));					\ | 
| Catalin Marinas | 620879c | 2007-02-05 14:47:46 +0100 | [diff] [blame] | 60 | 	isb();						\ | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 61 | 	} while (0) | 
 | 62 |  | 
 | 63 | #define modify_domain(dom,type)					\ | 
 | 64 | 	do {							\ | 
 | 65 | 	struct thread_info *thread = current_thread_info();	\ | 
 | 66 | 	unsigned int domain = thread->cpu_domain;		\ | 
 | 67 | 	domain &= ~domain_val(dom, DOMAIN_MANAGER);		\ | 
 | 68 | 	thread->cpu_domain = domain | domain_val(dom, type);	\ | 
 | 69 | 	set_domain(thread->cpu_domain);				\ | 
 | 70 | 	} while (0) | 
 | 71 |  | 
| Russell King | 002547b | 2006-06-20 20:46:52 +0100 | [diff] [blame] | 72 | #else | 
 | 73 | #define set_domain(x)		do { } while (0) | 
 | 74 | #define modify_domain(dom,type)	do { } while (0) | 
 | 75 | #endif | 
 | 76 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 77 | #endif | 
 | 78 | #endif /* !__ASSEMBLY__ */ |