| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2008-08-02 10:55:55 +01:00
										 |  |  |  *  arch/arm/include/asm/domain.h | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  * | 
					
						
							|  |  |  |  *  Copyright (C) 1999 Russell King. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU General Public License version 2 as | 
					
						
							|  |  |  |  * published by the Free Software Foundation. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #ifndef __ASM_PROC_DOMAIN_H
 | 
					
						
							|  |  |  | #define __ASM_PROC_DOMAIN_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-28 18:30:01 +01:00
										 |  |  | #ifndef __ASSEMBLY__
 | 
					
						
							|  |  |  | #include <asm/barrier.h>
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Domain numbers | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  DOMAIN_IO     - domain 2 includes all IO only | 
					
						
							|  |  |  |  *  DOMAIN_USER   - domain 1 includes all user memory only | 
					
						
							|  |  |  |  *  DOMAIN_KERNEL - domain 0 includes all kernel memory only | 
					
						
							| 
									
										
										
										
											2006-03-28 21:00:40 +01:00
										 |  |  |  * | 
					
						
							|  |  |  |  * The domain numbering depends on whether we support 36 physical | 
					
						
							|  |  |  |  * address for I/O or not.  Addresses above the 32 bit boundary can | 
					
						
							|  |  |  |  * only be mapped using supersections and supersections can only | 
					
						
							|  |  |  |  * be set for domain 0.  We could just default to DOMAIN_IO as zero, | 
					
						
							|  |  |  |  * but there may be systems with supersection support and no 36-bit | 
					
						
							|  |  |  |  * addressing.  In such cases, we want to map system memory with | 
					
						
							|  |  |  |  * supersections to reduce TLB misses and footprint. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 36-bit addressing and supersections are only available on | 
					
						
							|  |  |  |  * CPUs based on ARMv6+ or the Intel XSC3 core. | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2006-03-28 21:00:40 +01:00
										 |  |  | #ifndef CONFIG_IO_36
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #define DOMAIN_KERNEL	0
 | 
					
						
							|  |  |  | #define DOMAIN_TABLE	0
 | 
					
						
							|  |  |  | #define DOMAIN_USER	1
 | 
					
						
							|  |  |  | #define DOMAIN_IO	2
 | 
					
						
							| 
									
										
										
										
											2006-03-28 21:00:40 +01:00
										 |  |  | #else
 | 
					
						
							|  |  |  | #define DOMAIN_KERNEL	2
 | 
					
						
							|  |  |  | #define DOMAIN_TABLE	2
 | 
					
						
							|  |  |  | #define DOMAIN_USER	1
 | 
					
						
							|  |  |  | #define DOMAIN_IO	0
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Domain types | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #define DOMAIN_NOACCESS	0
 | 
					
						
							|  |  |  | #define DOMAIN_CLIENT	1
 | 
					
						
							| 
									
										
										
										
											2010-09-13 16:03:21 +01:00
										 |  |  | #ifdef CONFIG_CPU_USE_DOMAINS
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #define DOMAIN_MANAGER	3
 | 
					
						
							| 
									
										
										
										
											2010-09-13 16:03:21 +01:00
										 |  |  | #else
 | 
					
						
							|  |  |  | #define DOMAIN_MANAGER	1
 | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define domain_val(dom,type)	((type) << (2*(dom)))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef __ASSEMBLY__
 | 
					
						
							| 
									
										
										
										
											2006-06-20 20:46:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-13 16:03:21 +01:00
										 |  |  | #ifdef CONFIG_CPU_USE_DOMAINS
 | 
					
						
							| 
									
										
										
										
											2012-07-04 17:05:28 +01:00
										 |  |  | static inline void set_domain(unsigned val) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	asm volatile( | 
					
						
							|  |  |  | 	"mcr	p15, 0, %0, c3, c0	@ set domain" | 
					
						
							|  |  |  | 	  : : "r" (val)); | 
					
						
							|  |  |  | 	isb(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define modify_domain(dom,type)					\
 | 
					
						
							|  |  |  | 	do {							\ | 
					
						
							|  |  |  | 	struct thread_info *thread = current_thread_info();	\ | 
					
						
							|  |  |  | 	unsigned int domain = thread->cpu_domain;		\ | 
					
						
							|  |  |  | 	domain &= ~domain_val(dom, DOMAIN_MANAGER);		\ | 
					
						
							|  |  |  | 	thread->cpu_domain = domain | domain_val(dom, type);	\ | 
					
						
							|  |  |  | 	set_domain(thread->cpu_domain);				\ | 
					
						
							|  |  |  | 	} while (0) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-06-20 20:46:52 +01:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2012-07-04 17:05:28 +01:00
										 |  |  | static inline void set_domain(unsigned val) { } | 
					
						
							|  |  |  | static inline void modify_domain(unsigned dom, unsigned type)	{ } | 
					
						
							| 
									
										
										
										
											2006-06-20 20:46:52 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-13 16:03:21 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Generate the T (user) versions of the LDR/STR and related | 
					
						
							|  |  |  |  * instructions (inline assembly) | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #ifdef CONFIG_CPU_USE_DOMAINS
 | 
					
						
							| 
									
										
										
										
											2012-01-25 11:38:13 +01:00
										 |  |  | #define TUSER(instr)	#instr "t"
 | 
					
						
							| 
									
										
										
										
											2010-09-13 16:03:21 +01:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2012-01-25 11:38:13 +01:00
										 |  |  | #define TUSER(instr)	#instr
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-09-13 16:03:21 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #else /* __ASSEMBLY__ */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Generate the T (user) versions of the LDR/STR and related | 
					
						
							|  |  |  |  * instructions | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #ifdef CONFIG_CPU_USE_DOMAINS
 | 
					
						
							| 
									
										
										
										
											2012-01-25 11:38:13 +01:00
										 |  |  | #define TUSER(instr)	instr ## t
 | 
					
						
							| 
									
										
										
										
											2010-09-13 16:03:21 +01:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2012-01-25 11:38:13 +01:00
										 |  |  | #define TUSER(instr)	instr
 | 
					
						
							| 
									
										
										
										
											2010-09-13 16:03:21 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* __ASSEMBLY__ */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #endif /* !__ASM_PROC_DOMAIN_H */
 |