~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to arch/arm/include/asm/domain.h

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
#ifdef CONFIG_CPU_USE_DOMAINS
 
49
#define DOMAIN_MANAGER  3
 
50
#else
 
51
#define DOMAIN_MANAGER  1
 
52
#endif
 
53
 
 
54
#define domain_val(dom,type)    ((type) << (2*(dom)))
 
55
 
 
56
#ifndef __ASSEMBLY__
 
57
 
 
58
#ifdef CONFIG_CPU_USE_DOMAINS
 
59
#define set_domain(x)                                   \
 
60
        do {                                            \
 
61
        __asm__ __volatile__(                           \
 
62
        "mcr    p15, 0, %0, c3, c0      @ set domain"   \
 
63
          : : "r" (x));                                 \
 
64
        isb();                                          \
 
65
        } while (0)
 
66
 
 
67
#define modify_domain(dom,type)                                 \
 
68
        do {                                                    \
 
69
        struct thread_info *thread = current_thread_info();     \
 
70
        unsigned int domain = thread->cpu_domain;               \
 
71
        domain &= ~domain_val(dom, DOMAIN_MANAGER);             \
 
72
        thread->cpu_domain = domain | domain_val(dom, type);    \
 
73
        set_domain(thread->cpu_domain);                         \
 
74
        } while (0)
 
75
 
 
76
#else
 
77
#define set_domain(x)           do { } while (0)
 
78
#define modify_domain(dom,type) do { } while (0)
 
79
#endif
 
80
 
 
81
/*
 
82
 * Generate the T (user) versions of the LDR/STR and related
 
83
 * instructions (inline assembly)
 
84
 */
 
85
#ifdef CONFIG_CPU_USE_DOMAINS
 
86
#define T(instr)        #instr "t"
 
87
#else
 
88
#define T(instr)        #instr
 
89
#endif
 
90
 
 
91
#else /* __ASSEMBLY__ */
 
92
 
 
93
/*
 
94
 * Generate the T (user) versions of the LDR/STR and related
 
95
 * instructions
 
96
 */
 
97
#ifdef CONFIG_CPU_USE_DOMAINS
 
98
#define T(instr)        instr ## t
 
99
#else
 
100
#define T(instr)        instr
 
101
#endif
 
102
 
 
103
#endif /* __ASSEMBLY__ */
 
104
 
 
105
#endif /* !__ASM_PROC_DOMAIN_H */