diff options
Diffstat (limited to 'arch/arm/include/asm/domain.h')
-rw-r--r-- | arch/arm/include/asm/domain.h | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/arch/arm/include/asm/domain.h b/arch/arm/include/asm/domain.h new file mode 100644 index 000000000000..cc7ef4080711 --- /dev/null +++ b/arch/arm/include/asm/domain.h | |||
@@ -0,0 +1,78 @@ | |||
1 | /* | ||
2 | * arch/arm/include/asm/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 | isb(); \ | ||
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 | |||
72 | #else | ||
73 | #define set_domain(x) do { } while (0) | ||
74 | #define modify_domain(dom,type) do { } while (0) | ||
75 | #endif | ||
76 | |||
77 | #endif | ||
78 | #endif /* !__ASSEMBLY__ */ | ||