domain.h 2.69 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1
/*
2
 *  arch/arm/include/asm/domain.h
Linus Torvalds's avatar
Linus Torvalds committed
3
4
5
6
7
8
9
10
11
12
 *
 *  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

13
14
15
16
#ifndef __ASSEMBLY__
#include <asm/barrier.h>
#endif

Linus Torvalds's avatar
Linus Torvalds committed
17
18
19
20
21
22
/*
 * 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
23
24
25
26
27
28
29
30
31
32
33
 *
 * 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.
Linus Torvalds's avatar
Linus Torvalds committed
34
 */
35
#ifndef CONFIG_IO_36
Linus Torvalds's avatar
Linus Torvalds committed
36
37
38
39
#define DOMAIN_KERNEL	0
#define DOMAIN_TABLE	0
#define DOMAIN_USER	1
#define DOMAIN_IO	2
40
41
42
43
44
45
#else
#define DOMAIN_KERNEL	2
#define DOMAIN_TABLE	2
#define DOMAIN_USER	1
#define DOMAIN_IO	0
#endif
Linus Torvalds's avatar
Linus Torvalds committed
46
47
48
49
50
51

/*
 * Domain types
 */
#define DOMAIN_NOACCESS	0
#define DOMAIN_CLIENT	1
52
#ifdef CONFIG_CPU_USE_DOMAINS
Linus Torvalds's avatar
Linus Torvalds committed
53
#define DOMAIN_MANAGER	3
54
55
56
#else
#define DOMAIN_MANAGER	1
#endif
Linus Torvalds's avatar
Linus Torvalds committed
57
58
59
60

#define domain_val(dom,type)	((type) << (2*(dom)))

#ifndef __ASSEMBLY__
61

62
63
64
65
66
67
68
69
70
71
72
static inline unsigned int get_domain(void)
{
	unsigned int domain;

	asm(
	"mrc	p15, 0, %0, c3, c0	@ get domain"
	 : "=r" (domain));

	return domain;
}

73
#ifdef CONFIG_CPU_USE_DOMAINS
Russell King's avatar
Russell King committed
74
75
76
77
78
79
80
static inline void set_domain(unsigned val)
{
	asm volatile(
	"mcr	p15, 0, %0, c3, c0	@ set domain"
	  : : "r" (val));
	isb();
}
Linus Torvalds's avatar
Linus Torvalds committed
81
82
83

#define modify_domain(dom,type)					\
	do {							\
84
85
86
87
		unsigned int domain = get_domain();		\
		domain &= ~domain_val(dom, DOMAIN_MANAGER);	\
		domain = domain | domain_val(dom, type);	\
		set_domain(domain);				\
Linus Torvalds's avatar
Linus Torvalds committed
88
89
	} while (0)

90
#else
Russell King's avatar
Russell King committed
91
92
static inline void set_domain(unsigned val) { }
static inline void modify_domain(unsigned dom, unsigned type)	{ }
93
94
#endif

95
96
97
98
99
/*
 * Generate the T (user) versions of the LDR/STR and related
 * instructions (inline assembly)
 */
#ifdef CONFIG_CPU_USE_DOMAINS
100
#define TUSER(instr)	#instr "t"
101
#else
102
#define TUSER(instr)	#instr
Linus Torvalds's avatar
Linus Torvalds committed
103
#endif
104
105
106
107
108
109
110
111

#else /* __ASSEMBLY__ */

/*
 * Generate the T (user) versions of the LDR/STR and related
 * instructions
 */
#ifdef CONFIG_CPU_USE_DOMAINS
112
#define TUSER(instr)	instr ## t
113
#else
114
#define TUSER(instr)	instr
115
116
117
118
119
#endif

#endif /* __ASSEMBLY__ */

#endif /* !__ASM_PROC_DOMAIN_H */