Home | History | Annotate | Download | only in asm-arm
      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
     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.
     30  */
     31 #ifndef CONFIG_IO_36
     32 #define DOMAIN_KERNEL	0
     33 #define DOMAIN_TABLE	0
     34 #define DOMAIN_USER	1
     35 #define DOMAIN_IO	2
     36 #else
     37 #define DOMAIN_KERNEL	2
     38 #define DOMAIN_TABLE	2
     39 #define DOMAIN_USER	1
     40 #define DOMAIN_IO	0
     41 #endif
     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__
     53 
     54 #ifdef CONFIG_MMU
     55 #define set_domain(x)					\
     56 	do {						\
     57 	__asm__ __volatile__(				\
     58 	"mcr	p15, 0, %0, c3, c0	@ set domain"	\
     59 	  : : "r" (x));					\
     60 	} while (0)
     61 
     62 #define modify_domain(dom,type)					\
     63 	do {							\
     64 	struct thread_info *thread = current_thread_info();	\
     65 	unsigned int domain = thread->cpu_domain;		\
     66 	domain &= ~domain_val(dom, DOMAIN_MANAGER);		\
     67 	thread->cpu_domain = domain | domain_val(dom, type);	\
     68 	set_domain(thread->cpu_domain);				\
     69 	} while (0)
     70 
     71 #else
     72 #define set_domain(x)		do { } while (0)
     73 #define modify_domain(dom,type)	do { } while (0)
     74 #endif
     75 
     76 #endif
     77 #endif /* !__ASSEMBLY__ */
     78