aboutsummaryrefslogtreecommitdiffstats
path: root/arch/tile/include/asm
diff options
context:
space:
mode:
Diffstat (limited to 'arch/tile/include/asm')
-rw-r--r--arch/tile/include/asm/Kbuild3
-rw-r--r--arch/tile/include/asm/asm-offsets.h1
-rw-r--r--arch/tile/include/asm/atomic.h159
-rw-r--r--arch/tile/include/asm/atomic_32.h353
-rw-r--r--arch/tile/include/asm/auxvec.h20
-rw-r--r--arch/tile/include/asm/backtrace.h193
-rw-r--r--arch/tile/include/asm/bitops.h126
-rw-r--r--arch/tile/include/asm/bitops_32.h132
-rw-r--r--arch/tile/include/asm/bitsperlong.h26
-rw-r--r--arch/tile/include/asm/bug.h1
-rw-r--r--arch/tile/include/asm/bugs.h1
-rw-r--r--arch/tile/include/asm/byteorder.h1
-rw-r--r--arch/tile/include/asm/cache.h50
-rw-r--r--arch/tile/include/asm/cacheflush.h145
-rw-r--r--arch/tile/include/asm/checksum.h24
-rw-r--r--arch/tile/include/asm/compat.h308
-rw-r--r--arch/tile/include/asm/cputime.h1
-rw-r--r--arch/tile/include/asm/current.h31
-rw-r--r--arch/tile/include/asm/delay.h34
-rw-r--r--arch/tile/include/asm/device.h1
-rw-r--r--arch/tile/include/asm/div64.h1
-rw-r--r--arch/tile/include/asm/dma-mapping.h102
-rw-r--r--arch/tile/include/asm/dma.h25
-rw-r--r--arch/tile/include/asm/elf.h169
-rw-r--r--arch/tile/include/asm/emergency-restart.h1
-rw-r--r--arch/tile/include/asm/errno.h1
-rw-r--r--arch/tile/include/asm/fcntl.h1
-rw-r--r--arch/tile/include/asm/fixmap.h124
-rw-r--r--arch/tile/include/asm/ftrace.h20
-rw-r--r--arch/tile/include/asm/futex.h136
-rw-r--r--arch/tile/include/asm/hardirq.h47
-rw-r--r--arch/tile/include/asm/highmem.h73
-rw-r--r--arch/tile/include/asm/homecache.h125
-rw-r--r--arch/tile/include/asm/hugetlb.h109
-rw-r--r--arch/tile/include/asm/hv_driver.h60
-rw-r--r--arch/tile/include/asm/hw_irq.h18
-rw-r--r--arch/tile/include/asm/ide.h25
-rw-r--r--arch/tile/include/asm/io.h279
-rw-r--r--arch/tile/include/asm/ioctl.h1
-rw-r--r--arch/tile/include/asm/ioctls.h1
-rw-r--r--arch/tile/include/asm/ipc.h1
-rw-r--r--arch/tile/include/asm/ipcbuf.h1
-rw-r--r--arch/tile/include/asm/irq.h37
-rw-r--r--arch/tile/include/asm/irq_regs.h1
-rw-r--r--arch/tile/include/asm/irqflags.h267
-rw-r--r--arch/tile/include/asm/kdebug.h1
-rw-r--r--arch/tile/include/asm/kexec.h53
-rw-r--r--arch/tile/include/asm/kmap_types.h43
-rw-r--r--arch/tile/include/asm/linkage.h51
-rw-r--r--arch/tile/include/asm/local.h1
-rw-r--r--arch/tile/include/asm/memprof.h33
-rw-r--r--arch/tile/include/asm/mman.h40
-rw-r--r--arch/tile/include/asm/mmu.h31
-rw-r--r--arch/tile/include/asm/mmu_context.h131
-rw-r--r--arch/tile/include/asm/mmzone.h81
-rw-r--r--arch/tile/include/asm/module.h1
-rw-r--r--arch/tile/include/asm/msgbuf.h1
-rw-r--r--arch/tile/include/asm/mutex.h1
-rw-r--r--arch/tile/include/asm/opcode-tile.h30
-rw-r--r--arch/tile/include/asm/opcode-tile_32.h1597
-rw-r--r--arch/tile/include/asm/opcode-tile_64.h1597
-rw-r--r--arch/tile/include/asm/opcode_constants.h26
-rw-r--r--arch/tile/include/asm/opcode_constants_32.h480
-rw-r--r--arch/tile/include/asm/opcode_constants_64.h480
-rw-r--r--arch/tile/include/asm/page.h334
-rw-r--r--arch/tile/include/asm/param.h1
-rw-r--r--arch/tile/include/asm/pci-bridge.h117
-rw-r--r--arch/tile/include/asm/pci.h128
-rw-r--r--arch/tile/include/asm/percpu.h24
-rw-r--r--arch/tile/include/asm/pgalloc.h119
-rw-r--r--arch/tile/include/asm/pgtable.h475
-rw-r--r--arch/tile/include/asm/pgtable_32.h117
-rw-r--r--arch/tile/include/asm/poll.h1
-rw-r--r--arch/tile/include/asm/posix_types.h1
-rw-r--r--arch/tile/include/asm/processor.h339
-rw-r--r--arch/tile/include/asm/ptrace.h163
-rw-r--r--arch/tile/include/asm/resource.h1
-rw-r--r--arch/tile/include/asm/scatterlist.h22
-rw-r--r--arch/tile/include/asm/sections.h37
-rw-r--r--arch/tile/include/asm/sembuf.h1
-rw-r--r--arch/tile/include/asm/setup.h32
-rw-r--r--arch/tile/include/asm/shmbuf.h1
-rw-r--r--arch/tile/include/asm/shmparam.h1
-rw-r--r--arch/tile/include/asm/sigcontext.h27
-rw-r--r--arch/tile/include/asm/sigframe.h33
-rw-r--r--arch/tile/include/asm/siginfo.h30
-rw-r--r--arch/tile/include/asm/signal.h31
-rw-r--r--arch/tile/include/asm/smp.h126
-rw-r--r--arch/tile/include/asm/socket.h1
-rw-r--r--arch/tile/include/asm/sockios.h1
-rw-r--r--arch/tile/include/asm/spinlock.h24
-rw-r--r--arch/tile/include/asm/spinlock_32.h200
-rw-r--r--arch/tile/include/asm/spinlock_types.h60
-rw-r--r--arch/tile/include/asm/stack.h68
-rw-r--r--arch/tile/include/asm/stat.h1
-rw-r--r--arch/tile/include/asm/statfs.h1
-rw-r--r--arch/tile/include/asm/string.h32
-rw-r--r--arch/tile/include/asm/swab.h29
-rw-r--r--arch/tile/include/asm/syscall.h79
-rw-r--r--arch/tile/include/asm/syscalls.h60
-rw-r--r--arch/tile/include/asm/system.h220
-rw-r--r--arch/tile/include/asm/termbits.h1
-rw-r--r--arch/tile/include/asm/termios.h1
-rw-r--r--arch/tile/include/asm/thread_info.h165
-rw-r--r--arch/tile/include/asm/timex.h47
-rw-r--r--arch/tile/include/asm/tlb.h25
-rw-r--r--arch/tile/include/asm/tlbflush.h128
-rw-r--r--arch/tile/include/asm/topology.h85
-rw-r--r--arch/tile/include/asm/traps.h36
-rw-r--r--arch/tile/include/asm/types.h1
-rw-r--r--arch/tile/include/asm/uaccess.h578
-rw-r--r--arch/tile/include/asm/ucontext.h1
-rw-r--r--arch/tile/include/asm/unaligned.h24
-rw-r--r--arch/tile/include/asm/unistd.h47
-rw-r--r--arch/tile/include/asm/user.h21
-rw-r--r--arch/tile/include/asm/xor.h1
116 files changed, 12011 insertions, 0 deletions
diff --git a/arch/tile/include/asm/Kbuild b/arch/tile/include/asm/Kbuild
new file mode 100644
index 000000000000..3b8f55b82dee
--- /dev/null
+++ b/arch/tile/include/asm/Kbuild
@@ -0,0 +1,3 @@
1include include/asm-generic/Kbuild.asm
2
3header-y += ucontext.h
diff --git a/arch/tile/include/asm/asm-offsets.h b/arch/tile/include/asm/asm-offsets.h
new file mode 100644
index 000000000000..d370ee36a182
--- /dev/null
+++ b/arch/tile/include/asm/asm-offsets.h
@@ -0,0 +1 @@
#include <generated/asm-offsets.h>
diff --git a/arch/tile/include/asm/atomic.h b/arch/tile/include/asm/atomic.h
new file mode 100644
index 000000000000..b8c49f98a44c
--- /dev/null
+++ b/arch/tile/include/asm/atomic.h
@@ -0,0 +1,159 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 *
14 * Atomic primitives.
15 */
16
17#ifndef _ASM_TILE_ATOMIC_H
18#define _ASM_TILE_ATOMIC_H
19
20#ifndef __ASSEMBLY__
21
22#include <linux/compiler.h>
23#include <asm/system.h>
24
25#define ATOMIC_INIT(i) { (i) }
26
27/**
28 * atomic_read - read atomic variable
29 * @v: pointer of type atomic_t
30 *
31 * Atomically reads the value of @v.
32 */
33static inline int atomic_read(const atomic_t *v)
34{
35 return v->counter;
36}
37
38/**
39 * atomic_sub_return - subtract integer and return
40 * @v: pointer of type atomic_t
41 * @i: integer value to subtract
42 *
43 * Atomically subtracts @i from @v and returns @v - @i
44 */
45#define atomic_sub_return(i, v) atomic_add_return((int)(-(i)), (v))
46
47/**
48 * atomic_sub - subtract integer from atomic variable
49 * @i: integer value to subtract
50 * @v: pointer of type atomic_t
51 *
52 * Atomically subtracts @i from @v.
53 */
54#define atomic_sub(i, v) atomic_add((int)(-(i)), (v))
55
56/**
57 * atomic_sub_and_test - subtract value from variable and test result
58 * @i: integer value to subtract
59 * @v: pointer of type atomic_t
60 *
61 * Atomically subtracts @i from @v and returns true if the result is
62 * zero, or false for all other cases.
63 */
64#define atomic_sub_and_test(i, v) (atomic_sub_return((i), (v)) == 0)
65
66/**
67 * atomic_inc_return - increment memory and return
68 * @v: pointer of type atomic_t
69 *
70 * Atomically increments @v by 1 and returns the new value.
71 */
72#define atomic_inc_return(v) atomic_add_return(1, (v))
73
74/**
75 * atomic_dec_return - decrement memory and return
76 * @v: pointer of type atomic_t
77 *
78 * Atomically decrements @v by 1 and returns the new value.
79 */
80#define atomic_dec_return(v) atomic_sub_return(1, (v))
81
82/**
83 * atomic_inc - increment atomic variable
84 * @v: pointer of type atomic_t
85 *
86 * Atomically increments @v by 1.
87 */
88#define atomic_inc(v) atomic_add(1, (v))
89
90/**
91 * atomic_dec - decrement atomic variable
92 * @v: pointer of type atomic_t
93 *
94 * Atomically decrements @v by 1.
95 */
96#define atomic_dec(v) atomic_sub(1, (v))
97
98/**
99 * atomic_dec_and_test - decrement and test
100 * @v: pointer of type atomic_t
101 *
102 * Atomically decrements @v by 1 and returns true if the result is 0.
103 */
104#define atomic_dec_and_test(v) (atomic_dec_return(v) == 0)
105
106/**
107 * atomic_inc_and_test - increment and test
108 * @v: pointer of type atomic_t
109 *
110 * Atomically increments @v by 1 and returns true if the result is 0.
111 */
112#define atomic_inc_and_test(v) (atomic_inc_return(v) == 0)
113
114/**
115 * atomic_add_negative - add and test if negative
116 * @v: pointer of type atomic_t
117 * @i: integer value to add
118 *
119 * Atomically adds @i to @v and returns true if the result is
120 * negative, or false when result is greater than or equal to zero.
121 */
122#define atomic_add_negative(i, v) (atomic_add_return((i), (v)) < 0)
123
124/**
125 * atomic_inc_not_zero - increment unless the number is zero
126 * @v: pointer of type atomic_t
127 *
128 * Atomically increments @v by 1, so long as @v is non-zero.
129 * Returns non-zero if @v was non-zero, and zero otherwise.
130 */
131#define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0)
132
133
134/*
135 * We define xchg() and cmpxchg() in the included headers.
136 * Note that we do not define __HAVE_ARCH_CMPXCHG, since that would imply
137 * that cmpxchg() is an efficient operation, which is not particularly true.
138 */
139
140/* Nonexistent functions intended to cause link errors. */
141extern unsigned long __xchg_called_with_bad_pointer(void);
142extern unsigned long __cmpxchg_called_with_bad_pointer(void);
143
144#define tas(ptr) (xchg((ptr), 1))
145
146#endif /* __ASSEMBLY__ */
147
148#ifndef __tilegx__
149#include <asm/atomic_32.h>
150#else
151#include <asm/atomic_64.h>
152#endif
153
154/* Provide the appropriate atomic_long_t definitions. */
155#ifndef __ASSEMBLY__
156#include <asm-generic/atomic-long.h>
157#endif
158
159#endif /* _ASM_TILE_ATOMIC_H */
diff --git a/arch/tile/include/asm/atomic_32.h b/arch/tile/include/asm/atomic_32.h
new file mode 100644
index 000000000000..e4f8b4f04895
--- /dev/null
+++ b/arch/tile/include/asm/atomic_32.h
@@ -0,0 +1,353 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 *
14 * Do not include directly; use <asm/atomic.h>.
15 */
16
17#ifndef _ASM_TILE_ATOMIC_32_H
18#define _ASM_TILE_ATOMIC_32_H
19
20#include <arch/chip.h>
21
22#ifndef __ASSEMBLY__
23
24/* Tile-specific routines to support <asm/atomic.h>. */
25int _atomic_xchg(atomic_t *v, int n);
26int _atomic_xchg_add(atomic_t *v, int i);
27int _atomic_xchg_add_unless(atomic_t *v, int a, int u);
28int _atomic_cmpxchg(atomic_t *v, int o, int n);
29
30/**
31 * atomic_xchg - atomically exchange contents of memory with a new value
32 * @v: pointer of type atomic_t
33 * @i: integer value to store in memory
34 *
35 * Atomically sets @v to @i and returns old @v
36 */
37static inline int atomic_xchg(atomic_t *v, int n)
38{
39 smp_mb(); /* barrier for proper semantics */
40 return _atomic_xchg(v, n);
41}
42
43/**
44 * atomic_cmpxchg - atomically exchange contents of memory if it matches
45 * @v: pointer of type atomic_t
46 * @o: old value that memory should have
47 * @n: new value to write to memory if it matches
48 *
49 * Atomically checks if @v holds @o and replaces it with @n if so.
50 * Returns the old value at @v.
51 */
52static inline int atomic_cmpxchg(atomic_t *v, int o, int n)
53{
54 smp_mb(); /* barrier for proper semantics */
55 return _atomic_cmpxchg(v, o, n);
56}
57
58/**
59 * atomic_add - add integer to atomic variable
60 * @i: integer value to add
61 * @v: pointer of type atomic_t
62 *
63 * Atomically adds @i to @v.
64 */
65static inline void atomic_add(int i, atomic_t *v)
66{
67 _atomic_xchg_add(v, i);
68}
69
70/**
71 * atomic_add_return - add integer and return
72 * @v: pointer of type atomic_t
73 * @i: integer value to add
74 *
75 * Atomically adds @i to @v and returns @i + @v
76 */
77static inline int atomic_add_return(int i, atomic_t *v)
78{
79 smp_mb(); /* barrier for proper semantics */
80 return _atomic_xchg_add(v, i) + i;
81}
82
83/**
84 * atomic_add_unless - add unless the number is already a given value
85 * @v: pointer of type atomic_t
86 * @a: the amount to add to v...
87 * @u: ...unless v is equal to u.
88 *
89 * Atomically adds @a to @v, so long as @v was not already @u.
90 * Returns non-zero if @v was not @u, and zero otherwise.
91 */
92static inline int atomic_add_unless(atomic_t *v, int a, int u)
93{
94 smp_mb(); /* barrier for proper semantics */
95 return _atomic_xchg_add_unless(v, a, u) != u;
96}
97
98/**
99 * atomic_set - set atomic variable
100 * @v: pointer of type atomic_t
101 * @i: required value
102 *
103 * Atomically sets the value of @v to @i.
104 *
105 * atomic_set() can't be just a raw store, since it would be lost if it
106 * fell between the load and store of one of the other atomic ops.
107 */
108static inline void atomic_set(atomic_t *v, int n)
109{
110 _atomic_xchg(v, n);
111}
112
113#define xchg(ptr, x) ((typeof(*(ptr))) \
114 ((sizeof(*(ptr)) == sizeof(atomic_t)) ? \
115 atomic_xchg((atomic_t *)(ptr), (long)(x)) : \
116 __xchg_called_with_bad_pointer()))
117
118#define cmpxchg(ptr, o, n) ((typeof(*(ptr))) \
119 ((sizeof(*(ptr)) == sizeof(atomic_t)) ? \
120 atomic_cmpxchg((atomic_t *)(ptr), (long)(o), (long)(n)) : \
121 __cmpxchg_called_with_bad_pointer()))
122
123/* A 64bit atomic type */
124
125typedef struct {
126 u64 __aligned(8) counter;
127} atomic64_t;
128
129#define ATOMIC64_INIT(val) { (val) }
130
131u64 _atomic64_xchg(atomic64_t *v, u64 n);
132u64 _atomic64_xchg_add(atomic64_t *v, u64 i);
133u64 _atomic64_xchg_add_unless(atomic64_t *v, u64 a, u64 u);
134u64 _atomic64_cmpxchg(atomic64_t *v, u64 o, u64 n);
135
136/**
137 * atomic64_read - read atomic variable
138 * @v: pointer of type atomic64_t
139 *
140 * Atomically reads the value of @v.
141 */
142static inline u64 atomic64_read(const atomic64_t *v)
143{
144 /*
145 * Requires an atomic op to read both 32-bit parts consistently.
146 * Casting away const is safe since the atomic support routines
147 * do not write to memory if the value has not been modified.
148 */
149 return _atomic64_xchg_add((atomic64_t *)v, 0);
150}
151
152/**
153 * atomic64_xchg - atomically exchange contents of memory with a new value
154 * @v: pointer of type atomic64_t
155 * @i: integer value to store in memory
156 *
157 * Atomically sets @v to @i and returns old @v
158 */
159static inline u64 atomic64_xchg(atomic64_t *v, u64 n)
160{
161 smp_mb(); /* barrier for proper semantics */
162 return _atomic64_xchg(v, n);
163}
164
165/**
166 * atomic64_cmpxchg - atomically exchange contents of memory if it matches
167 * @v: pointer of type atomic64_t
168 * @o: old value that memory should have
169 * @n: new value to write to memory if it matches
170 *
171 * Atomically checks if @v holds @o and replaces it with @n if so.
172 * Returns the old value at @v.
173 */
174static inline u64 atomic64_cmpxchg(atomic64_t *v, u64 o, u64 n)
175{
176 smp_mb(); /* barrier for proper semantics */
177 return _atomic64_cmpxchg(v, o, n);
178}
179
180/**
181 * atomic64_add - add integer to atomic variable
182 * @i: integer value to add
183 * @v: pointer of type atomic64_t
184 *
185 * Atomically adds @i to @v.
186 */
187static inline void atomic64_add(u64 i, atomic64_t *v)
188{
189 _atomic64_xchg_add(v, i);
190}
191
192/**
193 * atomic64_add_return - add integer and return
194 * @v: pointer of type atomic64_t
195 * @i: integer value to add
196 *
197 * Atomically adds @i to @v and returns @i + @v
198 */
199static inline u64 atomic64_add_return(u64 i, atomic64_t *v)
200{
201 smp_mb(); /* barrier for proper semantics */
202 return _atomic64_xchg_add(v, i) + i;
203}
204
205/**
206 * atomic64_add_unless - add unless the number is already a given value
207 * @v: pointer of type atomic64_t
208 * @a: the amount to add to v...
209 * @u: ...unless v is equal to u.
210 *
211 * Atomically adds @a to @v, so long as @v was not already @u.
212 * Returns non-zero if @v was not @u, and zero otherwise.
213 */
214static inline u64 atomic64_add_unless(atomic64_t *v, u64 a, u64 u)
215{
216 smp_mb(); /* barrier for proper semantics */
217 return _atomic64_xchg_add_unless(v, a, u) != u;
218}
219
220/**
221 * atomic64_set - set atomic variable
222 * @v: pointer of type atomic64_t
223 * @i: required value
224 *
225 * Atomically sets the value of @v to @i.
226 *
227 * atomic64_set() can't be just a raw store, since it would be lost if it
228 * fell between the load and store of one of the other atomic ops.
229 */
230static inline void atomic64_set(atomic64_t *v, u64 n)
231{
232 _atomic64_xchg(v, n);
233}
234
235#define atomic64_add_negative(a, v) (atomic64_add_return((a), (v)) < 0)
236#define atomic64_inc(v) atomic64_add(1LL, (v))
237#define atomic64_inc_return(v) atomic64_add_return(1LL, (v))
238#define atomic64_inc_and_test(v) (atomic64_inc_return(v) == 0)
239#define atomic64_sub_return(i, v) atomic64_add_return(-(i), (v))
240#define atomic64_sub_and_test(a, v) (atomic64_sub_return((a), (v)) == 0)
241#define atomic64_sub(i, v) atomic64_add(-(i), (v))
242#define atomic64_dec(v) atomic64_sub(1LL, (v))
243#define atomic64_dec_return(v) atomic64_sub_return(1LL, (v))
244#define atomic64_dec_and_test(v) (atomic64_dec_return((v)) == 0)
245#define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1LL, 0LL)
246
247/*
248 * We need to barrier before modifying the word, since the _atomic_xxx()
249 * routines just tns the lock and then read/modify/write of the word.
250 * But after the word is updated, the routine issues an "mf" before returning,
251 * and since it's a function call, we don't even need a compiler barrier.
252 */
253#define smp_mb__before_atomic_dec() smp_mb()
254#define smp_mb__before_atomic_inc() smp_mb()
255#define smp_mb__after_atomic_dec() do { } while (0)
256#define smp_mb__after_atomic_inc() do { } while (0)
257
258
259/*
260 * Support "tns" atomic integers. These are atomic integers that can
261 * hold any value but "1". They are more efficient than regular atomic
262 * operations because the "lock" (aka acquire) step is a single "tns"
263 * in the uncontended case, and the "unlock" (aka release) step is a
264 * single "store" without an mf. (However, note that on tilepro the
265 * "tns" will evict the local cache line, so it's not all upside.)
266 *
267 * Note that you can ONLY observe the value stored in the pointer
268 * using these operations; a direct read of the value may confusingly
269 * return the special value "1".
270 */
271
272int __tns_atomic_acquire(atomic_t *);
273void __tns_atomic_release(atomic_t *p, int v);
274
275static inline void tns_atomic_set(atomic_t *v, int i)
276{
277 __tns_atomic_acquire(v);
278 __tns_atomic_release(v, i);
279}
280
281static inline int tns_atomic_cmpxchg(atomic_t *v, int o, int n)
282{
283 int ret = __tns_atomic_acquire(v);
284 __tns_atomic_release(v, (ret == o) ? n : ret);
285 return ret;
286}
287
288static inline int tns_atomic_xchg(atomic_t *v, int n)
289{
290 int ret = __tns_atomic_acquire(v);
291 __tns_atomic_release(v, n);
292 return ret;
293}
294
295#endif /* !__ASSEMBLY__ */
296
297/*
298 * Internal definitions only beyond this point.
299 */
300
301#define ATOMIC_LOCKS_FOUND_VIA_TABLE() \
302 (!CHIP_HAS_CBOX_HOME_MAP() && defined(CONFIG_SMP))
303
304#if ATOMIC_LOCKS_FOUND_VIA_TABLE()
305
306/* Number of entries in atomic_lock_ptr[]. */
307#define ATOMIC_HASH_L1_SHIFT 6
308#define ATOMIC_HASH_L1_SIZE (1 << ATOMIC_HASH_L1_SHIFT)
309
310/* Number of locks in each struct pointed to by atomic_lock_ptr[]. */
311#define ATOMIC_HASH_L2_SHIFT (CHIP_L2_LOG_LINE_SIZE() - 2)
312#define ATOMIC_HASH_L2_SIZE (1 << ATOMIC_HASH_L2_SHIFT)
313
314#else /* ATOMIC_LOCKS_FOUND_VIA_TABLE() */
315
316/*
317 * Number of atomic locks in atomic_locks[]. Must be a power of two.
318 * There is no reason for more than PAGE_SIZE / 8 entries, since that
319 * is the maximum number of pointer bits we can use to index this.
320 * And we cannot have more than PAGE_SIZE / 4, since this has to
321 * fit on a single page and each entry takes 4 bytes.
322 */
323#define ATOMIC_HASH_SHIFT (PAGE_SHIFT - 3)
324#define ATOMIC_HASH_SIZE (1 << ATOMIC_HASH_SHIFT)
325
326#ifndef __ASSEMBLY__
327extern int atomic_locks[];
328#endif
329
330#endif /* ATOMIC_LOCKS_FOUND_VIA_TABLE() */
331
332/*
333 * All the code that may fault while holding an atomic lock must
334 * place the pointer to the lock in ATOMIC_LOCK_REG so the fault code
335 * can correctly release and reacquire the lock. Note that we
336 * mention the register number in a comment in "lib/atomic_asm.S" to help
337 * assembly coders from using this register by mistake, so if it
338 * is changed here, change that comment as well.
339 */
340#define ATOMIC_LOCK_REG 20
341#define ATOMIC_LOCK_REG_NAME r20
342
343#ifndef __ASSEMBLY__
344/* Called from setup to initialize a hash table to point to per_cpu locks. */
345void __init_atomic_per_cpu(void);
346
347#ifdef CONFIG_SMP
348/* Support releasing the atomic lock in do_page_fault_ics(). */
349void __atomic_fault_unlock(int *lock_ptr);
350#endif
351#endif /* !__ASSEMBLY__ */
352
353#endif /* _ASM_TILE_ATOMIC_32_H */
diff --git a/arch/tile/include/asm/auxvec.h b/arch/tile/include/asm/auxvec.h
new file mode 100644
index 000000000000..1d393edb0641
--- /dev/null
+++ b/arch/tile/include/asm/auxvec.h
@@ -0,0 +1,20 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_AUXVEC_H
16#define _ASM_TILE_AUXVEC_H
17
18/* No extensions to auxvec */
19
20#endif /* _ASM_TILE_AUXVEC_H */
diff --git a/arch/tile/include/asm/backtrace.h b/arch/tile/include/asm/backtrace.h
new file mode 100644
index 000000000000..6970bfcad549
--- /dev/null
+++ b/arch/tile/include/asm/backtrace.h
@@ -0,0 +1,193 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _TILE_BACKTRACE_H
16#define _TILE_BACKTRACE_H
17
18
19
20#include <linux/types.h>
21
22#include <arch/chip.h>
23
24#if CHIP_VA_WIDTH() > 32
25typedef unsigned long long VirtualAddress;
26#else
27typedef unsigned int VirtualAddress;
28#endif
29
30
31/** Reads 'size' bytes from 'address' and writes the data to 'result'.
32 * Returns true if successful, else false (e.g. memory not readable).
33 */
34typedef bool (*BacktraceMemoryReader)(void *result,
35 VirtualAddress address,
36 unsigned int size,
37 void *extra);
38
39typedef struct {
40 /** Current PC. */
41 VirtualAddress pc;
42
43 /** Current stack pointer value. */
44 VirtualAddress sp;
45
46 /** Current frame pointer value (i.e. caller's stack pointer) */
47 VirtualAddress fp;
48
49 /** Internal use only: caller's PC for first frame. */
50 VirtualAddress initial_frame_caller_pc;
51
52 /** Internal use only: callback to read memory. */
53 BacktraceMemoryReader read_memory_func;
54
55 /** Internal use only: arbitrary argument to read_memory_func. */
56 void *read_memory_func_extra;
57
58} BacktraceIterator;
59
60
61/** Initializes a backtracer to start from the given location.
62 *
63 * If the frame pointer cannot be determined it is set to -1.
64 *
65 * @param state The state to be filled in.
66 * @param read_memory_func A callback that reads memory. If NULL, a default
67 * value is provided.
68 * @param read_memory_func_extra An arbitrary argument to read_memory_func.
69 * @param pc The current PC.
70 * @param lr The current value of the 'lr' register.
71 * @param sp The current value of the 'sp' register.
72 * @param r52 The current value of the 'r52' register.
73 */
74extern void backtrace_init(BacktraceIterator *state,
75 BacktraceMemoryReader read_memory_func,
76 void *read_memory_func_extra,
77 VirtualAddress pc, VirtualAddress lr,
78 VirtualAddress sp, VirtualAddress r52);
79
80
81/** Advances the backtracing state to the calling frame, returning
82 * true iff successful.
83 */
84extern bool backtrace_next(BacktraceIterator *state);
85
86
87typedef enum {
88
89 /* We have no idea what the caller's pc is. */
90 PC_LOC_UNKNOWN,
91
92 /* The caller's pc is currently in lr. */
93 PC_LOC_IN_LR,
94
95 /* The caller's pc can be found by dereferencing the caller's sp. */
96 PC_LOC_ON_STACK
97
98} CallerPCLocation;
99
100
101typedef enum {
102
103 /* We have no idea what the caller's sp is. */
104 SP_LOC_UNKNOWN,
105
106 /* The caller's sp is currently in r52. */
107 SP_LOC_IN_R52,
108
109 /* The caller's sp can be found by adding a certain constant
110 * to the current value of sp.
111 */
112 SP_LOC_OFFSET
113
114} CallerSPLocation;
115
116
117/* Bit values ORed into CALLER_* values for info ops. */
118enum {
119 /* Setting the low bit on any of these values means the info op
120 * applies only to one bundle ago.
121 */
122 ONE_BUNDLE_AGO_FLAG = 1,
123
124 /* Setting this bit on a CALLER_SP_* value means the PC is in LR.
125 * If not set, PC is on the stack.
126 */
127 PC_IN_LR_FLAG = 2,
128
129 /* This many of the low bits of a CALLER_SP_* value are for the
130 * flag bits above.
131 */
132 NUM_INFO_OP_FLAGS = 2,
133
134 /* We cannot have one in the memory pipe so this is the maximum. */
135 MAX_INFO_OPS_PER_BUNDLE = 2
136};
137
138
139/** Internal constants used to define 'info' operands. */
140enum {
141 /* 0 and 1 are reserved, as are all negative numbers. */
142
143 CALLER_UNKNOWN_BASE = 2,
144
145 CALLER_SP_IN_R52_BASE = 4,
146
147 CALLER_SP_OFFSET_BASE = 8
148};
149
150
151/** Current backtracer state describing where it thinks the caller is. */
152typedef struct {
153 /*
154 * Public fields
155 */
156
157 /* How do we find the caller's PC? */
158 CallerPCLocation pc_location : 8;
159
160 /* How do we find the caller's SP? */
161 CallerSPLocation sp_location : 8;
162
163 /* If sp_location == SP_LOC_OFFSET, then caller_sp == sp +
164 * loc->sp_offset. Else this field is undefined.
165 */
166 uint16_t sp_offset;
167
168 /* In the most recently visited bundle a terminating bundle? */
169 bool at_terminating_bundle;
170
171 /*
172 * Private fields
173 */
174
175 /* Will the forward scanner see someone clobbering sp
176 * (i.e. changing it with something other than addi sp, sp, N?)
177 */
178 bool sp_clobber_follows;
179
180 /* Operand to next "visible" info op (no more than one bundle past
181 * the next terminating bundle), or -32768 if none.
182 */
183 int16_t next_info_operand;
184
185 /* Is the info of in next_info_op in the very next bundle? */
186 bool is_next_info_operand_adjacent;
187
188} CallerLocation;
189
190
191
192
193#endif /* _TILE_BACKTRACE_H */
diff --git a/arch/tile/include/asm/bitops.h b/arch/tile/include/asm/bitops.h
new file mode 100644
index 000000000000..84600f3514da
--- /dev/null
+++ b/arch/tile/include/asm/bitops.h
@@ -0,0 +1,126 @@
1/*
2 * Copyright 1992, Linus Torvalds.
3 * Copyright 2010 Tilera Corporation. All Rights Reserved.
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation, version 2.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
12 * NON INFRINGEMENT. See the GNU General Public License for
13 * more details.
14 */
15
16#ifndef _ASM_TILE_BITOPS_H
17#define _ASM_TILE_BITOPS_H
18
19#include <linux/types.h>
20
21#ifndef _LINUX_BITOPS_H
22#error only <linux/bitops.h> can be included directly
23#endif
24
25#ifdef __tilegx__
26#include <asm/bitops_64.h>
27#else
28#include <asm/bitops_32.h>
29#endif
30
31/**
32 * __ffs - find first set bit in word
33 * @word: The word to search
34 *
35 * Undefined if no set bit exists, so code should check against 0 first.
36 */
37static inline unsigned long __ffs(unsigned long word)
38{
39 return __builtin_ctzl(word);
40}
41
42/**
43 * ffz - find first zero bit in word
44 * @word: The word to search
45 *
46 * Undefined if no zero exists, so code should check against ~0UL first.
47 */
48static inline unsigned long ffz(unsigned long word)
49{
50 return __builtin_ctzl(~word);
51}
52
53/**
54 * __fls - find last set bit in word
55 * @word: The word to search
56 *
57 * Undefined if no set bit exists, so code should check against 0 first.
58 */
59static inline unsigned long __fls(unsigned long word)
60{
61 return (sizeof(word) * 8) - 1 - __builtin_clzl(word);
62}
63
64/**
65 * ffs - find first set bit in word
66 * @x: the word to search
67 *
68 * This is defined the same way as the libc and compiler builtin ffs
69 * routines, therefore differs in spirit from the other bitops.
70 *
71 * ffs(value) returns 0 if value is 0 or the position of the first
72 * set bit if value is nonzero. The first (least significant) bit
73 * is at position 1.
74 */
75static inline int ffs(int x)
76{
77 return __builtin_ffs(x);
78}
79
80/**
81 * fls - find last set bit in word
82 * @x: the word to search
83 *
84 * This is defined in a similar way as the libc and compiler builtin
85 * ffs, but returns the position of the most significant set bit.
86 *
87 * fls(value) returns 0 if value is 0 or the position of the last
88 * set bit if value is nonzero. The last (most significant) bit is
89 * at position 32.
90 */
91static inline int fls(int x)
92{
93 return (sizeof(int) * 8) - __builtin_clz(x);
94}
95
96static inline int fls64(__u64 w)
97{
98 return (sizeof(__u64) * 8) - __builtin_clzll(w);
99}
100
101static inline unsigned int hweight32(unsigned int w)
102{
103 return __builtin_popcount(w);
104}
105
106static inline unsigned int hweight16(unsigned int w)
107{
108 return __builtin_popcount(w & 0xffff);
109}
110
111static inline unsigned int hweight8(unsigned int w)
112{
113 return __builtin_popcount(w & 0xff);
114}
115
116static inline unsigned long hweight64(__u64 w)
117{
118 return __builtin_popcountll(w);
119}
120
121#include <asm-generic/bitops/lock.h>
122#include <asm-generic/bitops/sched.h>
123#include <asm-generic/bitops/ext2-non-atomic.h>
124#include <asm-generic/bitops/minix.h>
125
126#endif /* _ASM_TILE_BITOPS_H */
diff --git a/arch/tile/include/asm/bitops_32.h b/arch/tile/include/asm/bitops_32.h
new file mode 100644
index 000000000000..7a93c001ac19
--- /dev/null
+++ b/arch/tile/include/asm/bitops_32.h
@@ -0,0 +1,132 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_BITOPS_32_H
16#define _ASM_TILE_BITOPS_32_H
17
18#include <linux/compiler.h>
19#include <asm/atomic.h>
20#include <asm/system.h>
21
22/* Tile-specific routines to support <asm/bitops.h>. */
23unsigned long _atomic_or(volatile unsigned long *p, unsigned long mask);
24unsigned long _atomic_andn(volatile unsigned long *p, unsigned long mask);
25unsigned long _atomic_xor(volatile unsigned long *p, unsigned long mask);
26
27/**
28 * set_bit - Atomically set a bit in memory
29 * @nr: the bit to set
30 * @addr: the address to start counting from
31 *
32 * This function is atomic and may not be reordered.
33 * See __set_bit() if you do not require the atomic guarantees.
34 * Note that @nr may be almost arbitrarily large; this function is not
35 * restricted to acting on a single-word quantity.
36 */
37static inline void set_bit(unsigned nr, volatile unsigned long *addr)
38{
39 _atomic_or(addr + BIT_WORD(nr), BIT_MASK(nr));
40}
41
42/**
43 * clear_bit - Clears a bit in memory
44 * @nr: Bit to clear
45 * @addr: Address to start counting from
46 *
47 * clear_bit() is atomic and may not be reordered.
48 * See __clear_bit() if you do not require the atomic guarantees.
49 * Note that @nr may be almost arbitrarily large; this function is not
50 * restricted to acting on a single-word quantity.
51 *
52 * clear_bit() may not contain a memory barrier, so if it is used for
53 * locking purposes, you should call smp_mb__before_clear_bit() and/or
54 * smp_mb__after_clear_bit() to ensure changes are visible on other cpus.
55 */
56static inline void clear_bit(unsigned nr, volatile unsigned long *addr)
57{
58 _atomic_andn(addr + BIT_WORD(nr), BIT_MASK(nr));
59}
60
61/**
62 * change_bit - Toggle a bit in memory
63 * @nr: Bit to change
64 * @addr: Address to start counting from
65 *
66 * change_bit() is atomic and may not be reordered.
67 * See __change_bit() if you do not require the atomic guarantees.
68 * Note that @nr may be almost arbitrarily large; this function is not
69 * restricted to acting on a single-word quantity.
70 */
71static inline void change_bit(unsigned nr, volatile unsigned long *addr)
72{
73 _atomic_xor(addr + BIT_WORD(nr), BIT_MASK(nr));
74}
75
76/**
77 * test_and_set_bit - Set a bit and return its old value
78 * @nr: Bit to set
79 * @addr: Address to count from
80 *
81 * This operation is atomic and cannot be reordered.
82 * It also implies a memory barrier.
83 */
84static inline int test_and_set_bit(unsigned nr, volatile unsigned long *addr)
85{
86 unsigned long mask = BIT_MASK(nr);
87 addr += BIT_WORD(nr);
88 smp_mb(); /* barrier for proper semantics */
89 return (_atomic_or(addr, mask) & mask) != 0;
90}
91
92/**
93 * test_and_clear_bit - Clear a bit and return its old value
94 * @nr: Bit to clear
95 * @addr: Address to count from
96 *
97 * This operation is atomic and cannot be reordered.
98 * It also implies a memory barrier.
99 */
100static inline int test_and_clear_bit(unsigned nr, volatile unsigned long *addr)
101{
102 unsigned long mask = BIT_MASK(nr);
103 addr += BIT_WORD(nr);
104 smp_mb(); /* barrier for proper semantics */
105 return (_atomic_andn(addr, mask) & mask) != 0;
106}
107
108/**
109 * test_and_change_bit - Change a bit and return its old value
110 * @nr: Bit to change
111 * @addr: Address to count from
112 *
113 * This operation is atomic and cannot be reordered.
114 * It also implies a memory barrier.
115 */
116static inline int test_and_change_bit(unsigned nr,
117 volatile unsigned long *addr)
118{
119 unsigned long mask = BIT_MASK(nr);
120 addr += BIT_WORD(nr);
121 smp_mb(); /* barrier for proper semantics */
122 return (_atomic_xor(addr, mask) & mask) != 0;
123}
124
125/* See discussion at smp_mb__before_atomic_dec() in <asm/atomic.h>. */
126#define smp_mb__before_clear_bit() smp_mb()
127#define smp_mb__after_clear_bit() do {} while (0)
128
129#include <asm-generic/bitops/non-atomic.h>
130#include <asm-generic/bitops/ext2-atomic.h>
131
132#endif /* _ASM_TILE_BITOPS_32_H */
diff --git a/arch/tile/include/asm/bitsperlong.h b/arch/tile/include/asm/bitsperlong.h
new file mode 100644
index 000000000000..58c771f2af2f
--- /dev/null
+++ b/arch/tile/include/asm/bitsperlong.h
@@ -0,0 +1,26 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_BITSPERLONG_H
16#define _ASM_TILE_BITSPERLONG_H
17
18#ifdef __LP64__
19# define __BITS_PER_LONG 64
20#else
21# define __BITS_PER_LONG 32
22#endif
23
24#include <asm-generic/bitsperlong.h>
25
26#endif /* _ASM_TILE_BITSPERLONG_H */
diff --git a/arch/tile/include/asm/bug.h b/arch/tile/include/asm/bug.h
new file mode 100644
index 000000000000..b12fd89e42e9
--- /dev/null
+++ b/arch/tile/include/asm/bug.h
@@ -0,0 +1 @@
#include <asm-generic/bug.h>
diff --git a/arch/tile/include/asm/bugs.h b/arch/tile/include/asm/bugs.h
new file mode 100644
index 000000000000..61791e1ad9f5
--- /dev/null
+++ b/arch/tile/include/asm/bugs.h
@@ -0,0 +1 @@
#include <asm-generic/bugs.h>
diff --git a/arch/tile/include/asm/byteorder.h b/arch/tile/include/asm/byteorder.h
new file mode 100644
index 000000000000..9558416d578b
--- /dev/null
+++ b/arch/tile/include/asm/byteorder.h
@@ -0,0 +1 @@
#include <linux/byteorder/little_endian.h>
diff --git a/arch/tile/include/asm/cache.h b/arch/tile/include/asm/cache.h
new file mode 100644
index 000000000000..c2b7dcfe5327
--- /dev/null
+++ b/arch/tile/include/asm/cache.h
@@ -0,0 +1,50 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_CACHE_H
16#define _ASM_TILE_CACHE_H
17
18#include <arch/chip.h>
19
20/* bytes per L1 data cache line */
21#define L1_CACHE_SHIFT CHIP_L1D_LOG_LINE_SIZE()
22#define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT)
23#define L1_CACHE_ALIGN(x) (((x)+(L1_CACHE_BYTES-1)) & -L1_CACHE_BYTES)
24
25/* bytes per L1 instruction cache line */
26#define L1I_CACHE_SHIFT CHIP_L1I_LOG_LINE_SIZE()
27#define L1I_CACHE_BYTES (1 << L1I_CACHE_SHIFT)
28#define L1I_CACHE_ALIGN(x) (((x)+(L1I_CACHE_BYTES-1)) & -L1I_CACHE_BYTES)
29
30/* bytes per L2 cache line */
31#define L2_CACHE_SHIFT CHIP_L2_LOG_LINE_SIZE()
32#define L2_CACHE_BYTES (1 << L2_CACHE_SHIFT)
33#define L2_CACHE_ALIGN(x) (((x)+(L2_CACHE_BYTES-1)) & -L2_CACHE_BYTES)
34
35/* use the cache line size for the L2, which is where it counts */
36#define SMP_CACHE_BYTES_SHIFT L2_CACHE_SHIFT
37#define SMP_CACHE_BYTES L2_CACHE_BYTES
38#define INTERNODE_CACHE_SHIFT L2_CACHE_SHIFT
39#define INTERNODE_CACHE_BYTES L2_CACHE_BYTES
40
41/* Group together read-mostly things to avoid cache false sharing */
42#define __read_mostly __attribute__((__section__(".data.read_mostly")))
43
44/*
45 * Attribute for data that is kept read/write coherent until the end of
46 * initialization, then bumped to read/only incoherent for performance.
47 */
48#define __write_once __attribute__((__section__(".w1data")))
49
50#endif /* _ASM_TILE_CACHE_H */
diff --git a/arch/tile/include/asm/cacheflush.h b/arch/tile/include/asm/cacheflush.h
new file mode 100644
index 000000000000..7e2096a4ef7d
--- /dev/null
+++ b/arch/tile/include/asm/cacheflush.h
@@ -0,0 +1,145 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_CACHEFLUSH_H
16#define _ASM_TILE_CACHEFLUSH_H
17
18#include <arch/chip.h>
19
20/* Keep includes the same across arches. */
21#include <linux/mm.h>
22#include <linux/cache.h>
23#include <asm/system.h>
24
25/* Caches are physically-indexed and so don't need special treatment */
26#define flush_cache_all() do { } while (0)
27#define flush_cache_mm(mm) do { } while (0)
28#define flush_cache_dup_mm(mm) do { } while (0)
29#define flush_cache_range(vma, start, end) do { } while (0)
30#define flush_cache_page(vma, vmaddr, pfn) do { } while (0)
31#define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 0
32#define flush_dcache_page(page) do { } while (0)
33#define flush_dcache_mmap_lock(mapping) do { } while (0)
34#define flush_dcache_mmap_unlock(mapping) do { } while (0)
35#define flush_cache_vmap(start, end) do { } while (0)
36#define flush_cache_vunmap(start, end) do { } while (0)
37#define flush_icache_page(vma, pg) do { } while (0)
38#define flush_icache_user_range(vma, pg, adr, len) do { } while (0)
39
40/* See "arch/tile/lib/__invalidate_icache.S". */
41extern void __invalidate_icache(unsigned long start, unsigned long size);
42
43/* Flush the icache just on this cpu */
44static inline void __flush_icache_range(unsigned long start, unsigned long end)
45{
46 __invalidate_icache(start, end - start);
47}
48
49/* Flush the entire icache on this cpu. */
50#define __flush_icache() __flush_icache_range(0, CHIP_L1I_CACHE_SIZE())
51
52#ifdef CONFIG_SMP
53/*
54 * When the kernel writes to its own text we need to do an SMP
55 * broadcast to make the L1I coherent everywhere. This includes
56 * module load and single step.
57 */
58extern void flush_icache_range(unsigned long start, unsigned long end);
59#else
60#define flush_icache_range __flush_icache_range
61#endif
62
63/*
64 * An update to an executable user page requires icache flushing.
65 * We could carefully update only tiles that are running this process,
66 * and rely on the fact that we flush the icache on every context
67 * switch to avoid doing extra work here. But for now, I'll be
68 * conservative and just do a global icache flush.
69 */
70static inline void copy_to_user_page(struct vm_area_struct *vma,
71 struct page *page, unsigned long vaddr,
72 void *dst, void *src, int len)
73{
74 memcpy(dst, src, len);
75 if (vma->vm_flags & VM_EXEC) {
76 flush_icache_range((unsigned long) dst,
77 (unsigned long) dst + len);
78 }
79}
80
81#define copy_from_user_page(vma, page, vaddr, dst, src, len) \
82 memcpy((dst), (src), (len))
83
84/*
85 * Invalidate a VA range; pads to L2 cacheline boundaries.
86 *
87 * Note that on TILE64, __inv_buffer() actually flushes modified
88 * cache lines in addition to invalidating them, i.e., it's the
89 * same as __finv_buffer().
90 */
91static inline void __inv_buffer(void *buffer, size_t size)
92{
93 char *next = (char *)((long)buffer & -L2_CACHE_BYTES);
94 char *finish = (char *)L2_CACHE_ALIGN((long)buffer + size);
95 while (next < finish) {
96 __insn_inv(next);
97 next += CHIP_INV_STRIDE();
98 }
99}
100
101/* Flush a VA range; pads to L2 cacheline boundaries. */
102static inline void __flush_buffer(void *buffer, size_t size)
103{
104 char *next = (char *)((long)buffer & -L2_CACHE_BYTES);
105 char *finish = (char *)L2_CACHE_ALIGN((long)buffer + size);
106 while (next < finish) {
107 __insn_flush(next);
108 next += CHIP_FLUSH_STRIDE();
109 }
110}
111
112/* Flush & invalidate a VA range; pads to L2 cacheline boundaries. */
113static inline void __finv_buffer(void *buffer, size_t size)
114{
115 char *next = (char *)((long)buffer & -L2_CACHE_BYTES);
116 char *finish = (char *)L2_CACHE_ALIGN((long)buffer + size);
117 while (next < finish) {
118 __insn_finv(next);
119 next += CHIP_FINV_STRIDE();
120 }
121}
122
123
124/* Invalidate a VA range, then memory fence. */
125static inline void inv_buffer(void *buffer, size_t size)
126{
127 __inv_buffer(buffer, size);
128 mb_incoherent();
129}
130
131/* Flush a VA range, then memory fence. */
132static inline void flush_buffer(void *buffer, size_t size)
133{
134 __flush_buffer(buffer, size);
135 mb_incoherent();
136}
137
138/* Flush & invalidate a VA range, then memory fence. */
139static inline void finv_buffer(void *buffer, size_t size)
140{
141 __finv_buffer(buffer, size);
142 mb_incoherent();
143}
144
145#endif /* _ASM_TILE_CACHEFLUSH_H */
diff --git a/arch/tile/include/asm/checksum.h b/arch/tile/include/asm/checksum.h
new file mode 100644
index 000000000000..a120766c7264
--- /dev/null
+++ b/arch/tile/include/asm/checksum.h
@@ -0,0 +1,24 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_CHECKSUM_H
16#define _ASM_TILE_CHECKSUM_H
17
18#include <asm-generic/checksum.h>
19
20/* Allow us to provide a more optimized do_csum(). */
21__wsum do_csum(const unsigned char *buff, int len);
22#define do_csum do_csum
23
24#endif /* _ASM_TILE_CHECKSUM_H */
diff --git a/arch/tile/include/asm/compat.h b/arch/tile/include/asm/compat.h
new file mode 100644
index 000000000000..e133c53f6c4f
--- /dev/null
+++ b/arch/tile/include/asm/compat.h
@@ -0,0 +1,308 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_COMPAT_H
16#define _ASM_TILE_COMPAT_H
17
18/*
19 * Architecture specific compatibility types
20 */
21#include <linux/types.h>
22#include <linux/sched.h>
23
24#define COMPAT_USER_HZ 100
25
26/* "long" and pointer-based types are different. */
27typedef s32 compat_long_t;
28typedef u32 compat_ulong_t;
29typedef u32 compat_size_t;
30typedef s32 compat_ssize_t;
31typedef s32 compat_off_t;
32typedef s32 compat_time_t;
33typedef s32 compat_clock_t;
34typedef u32 compat_ino_t;
35typedef u32 compat_caddr_t;
36typedef u32 compat_uptr_t;
37
38/* Many types are "int" or otherwise the same. */
39typedef __kernel_pid_t compat_pid_t;
40typedef __kernel_uid_t __compat_uid_t;
41typedef __kernel_gid_t __compat_gid_t;
42typedef __kernel_uid32_t __compat_uid32_t;
43typedef __kernel_uid32_t __compat_gid32_t;
44typedef __kernel_mode_t compat_mode_t;
45typedef __kernel_dev_t compat_dev_t;
46typedef __kernel_loff_t compat_loff_t;
47typedef __kernel_nlink_t compat_nlink_t;
48typedef __kernel_ipc_pid_t compat_ipc_pid_t;
49typedef __kernel_daddr_t compat_daddr_t;
50typedef __kernel_fsid_t compat_fsid_t;
51typedef __kernel_timer_t compat_timer_t;
52typedef __kernel_key_t compat_key_t;
53typedef int compat_int_t;
54typedef s64 compat_s64;
55typedef uint compat_uint_t;
56typedef u64 compat_u64;
57
58/* We use the same register dump format in 32-bit images. */
59typedef unsigned long compat_elf_greg_t;
60#define COMPAT_ELF_NGREG (sizeof(struct pt_regs) / sizeof(compat_elf_greg_t))
61typedef compat_elf_greg_t compat_elf_gregset_t[COMPAT_ELF_NGREG];
62
63struct compat_timespec {
64 compat_time_t tv_sec;
65 s32 tv_nsec;
66};
67
68struct compat_timeval {
69 compat_time_t tv_sec;
70 s32 tv_usec;
71};
72
73struct compat_stat {
74 unsigned int st_dev;
75 unsigned int st_ino;
76 unsigned int st_mode;
77 unsigned int st_nlink;
78 unsigned int st_uid;
79 unsigned int st_gid;
80 unsigned int st_rdev;
81 unsigned int __pad1;
82 int st_size;
83 int st_blksize;
84 int __pad2;
85 int st_blocks;
86 int st_atime;
87 unsigned int st_atime_nsec;
88 int st_mtime;
89 unsigned int st_mtime_nsec;
90 int st_ctime;
91 unsigned int st_ctime_nsec;
92 unsigned int __unused[2];
93};
94
95struct compat_stat64 {
96 unsigned long st_dev;
97 unsigned long st_ino;
98 unsigned int st_mode;
99 unsigned int st_nlink;
100 unsigned int st_uid;
101 unsigned int st_gid;
102 unsigned long st_rdev;
103 long st_size;
104 unsigned int st_blksize;
105 unsigned long st_blocks __attribute__((packed));
106 unsigned int st_atime;
107 unsigned int st_atime_nsec;
108 unsigned int st_mtime;
109 unsigned int st_mtime_nsec;
110 unsigned int st_ctime;
111 unsigned int st_ctime_nsec;
112 unsigned int __unused8;
113};
114
115#define compat_statfs statfs
116
117struct compat_sysctl {
118 unsigned int name;
119 int nlen;
120 unsigned int oldval;
121 unsigned int oldlenp;
122 unsigned int newval;
123 unsigned int newlen;
124 unsigned int __unused[4];
125};
126
127
128struct compat_flock {
129 short l_type;
130 short l_whence;
131 compat_off_t l_start;
132 compat_off_t l_len;
133 compat_pid_t l_pid;
134};
135
136#define F_GETLK64 12 /* using 'struct flock64' */
137#define F_SETLK64 13
138#define F_SETLKW64 14
139
140struct compat_flock64 {
141 short l_type;
142 short l_whence;
143 compat_loff_t l_start;
144 compat_loff_t l_len;
145 compat_pid_t l_pid;
146};
147
148#define COMPAT_RLIM_INFINITY 0xffffffff
149
150#define _COMPAT_NSIG 64
151#define _COMPAT_NSIG_BPW 32
152
153typedef u32 compat_sigset_word;
154
155#define COMPAT_OFF_T_MAX 0x7fffffff
156#define COMPAT_LOFF_T_MAX 0x7fffffffffffffffL
157
158struct compat_ipc64_perm {
159 compat_key_t key;
160 __compat_uid32_t uid;
161 __compat_gid32_t gid;
162 __compat_uid32_t cuid;
163 __compat_gid32_t cgid;
164 unsigned short mode;
165 unsigned short __pad1;
166 unsigned short seq;
167 unsigned short __pad2;
168 compat_ulong_t unused1;
169 compat_ulong_t unused2;
170};
171
172struct compat_semid64_ds {
173 struct compat_ipc64_perm sem_perm;
174 compat_time_t sem_otime;
175 compat_ulong_t __unused1;
176 compat_time_t sem_ctime;
177 compat_ulong_t __unused2;
178 compat_ulong_t sem_nsems;
179 compat_ulong_t __unused3;
180 compat_ulong_t __unused4;
181};
182
183struct compat_msqid64_ds {
184 struct compat_ipc64_perm msg_perm;
185 compat_time_t msg_stime;
186 compat_ulong_t __unused1;
187 compat_time_t msg_rtime;
188 compat_ulong_t __unused2;
189 compat_time_t msg_ctime;
190 compat_ulong_t __unused3;
191 compat_ulong_t msg_cbytes;
192 compat_ulong_t msg_qnum;
193 compat_ulong_t msg_qbytes;
194 compat_pid_t msg_lspid;
195 compat_pid_t msg_lrpid;
196 compat_ulong_t __unused4;
197 compat_ulong_t __unused5;
198};
199
200struct compat_shmid64_ds {
201 struct compat_ipc64_perm shm_perm;
202 compat_size_t shm_segsz;
203 compat_time_t shm_atime;
204 compat_ulong_t __unused1;
205 compat_time_t shm_dtime;
206 compat_ulong_t __unused2;
207 compat_time_t shm_ctime;
208 compat_ulong_t __unused3;
209 compat_pid_t shm_cpid;
210 compat_pid_t shm_lpid;
211 compat_ulong_t shm_nattch;
212 compat_ulong_t __unused4;
213 compat_ulong_t __unused5;
214};
215
216/*
217 * A pointer passed in from user mode. This should not
218 * be used for syscall parameters, just declare them
219 * as pointers because the syscall entry code will have
220 * appropriately converted them already.
221 */
222
223static inline void __user *compat_ptr(compat_uptr_t uptr)
224{
225 return (void __user *)(unsigned long)uptr;
226}
227
228static inline compat_uptr_t ptr_to_compat(void __user *uptr)
229{
230 return (u32)(unsigned long)uptr;
231}
232
233/* Sign-extend when storing a kernel pointer to a user's ptregs. */
234static inline unsigned long ptr_to_compat_reg(void __user *uptr)
235{
236 return (long)(int)(long)uptr;
237}
238
239static inline void __user *compat_alloc_user_space(long len)
240{
241 struct pt_regs *regs = task_pt_regs(current);
242 return (void __user *)regs->sp - len;
243}
244
245static inline int is_compat_task(void)
246{
247 return current_thread_info()->status & TS_COMPAT;
248}
249
250extern int compat_setup_rt_frame(int sig, struct k_sigaction *ka,
251 siginfo_t *info, sigset_t *set,
252 struct pt_regs *regs);
253
254/* Compat syscalls. */
255struct compat_sigaction;
256struct compat_siginfo;
257struct compat_sigaltstack;
258long compat_sys_execve(char __user *path, compat_uptr_t __user *argv,
259 compat_uptr_t __user *envp);
260long compat_sys_rt_sigaction(int sig, struct compat_sigaction __user *act,
261 struct compat_sigaction __user *oact,
262 size_t sigsetsize);
263long compat_sys_rt_sigqueueinfo(int pid, int sig,
264 struct compat_siginfo __user *uinfo);
265long compat_sys_rt_sigreturn(void);
266long compat_sys_sigaltstack(const struct compat_sigaltstack __user *uss_ptr,
267 struct compat_sigaltstack __user *uoss_ptr);
268long compat_sys_truncate64(char __user *filename, u32 dummy, u32 low, u32 high);
269long compat_sys_ftruncate64(unsigned int fd, u32 dummy, u32 low, u32 high);
270long compat_sys_pread64(unsigned int fd, char __user *ubuf, size_t count,
271 u32 dummy, u32 low, u32 high);
272long compat_sys_pwrite64(unsigned int fd, char __user *ubuf, size_t count,
273 u32 dummy, u32 low, u32 high);
274long compat_sys_lookup_dcookie(u32 low, u32 high, char __user *buf, size_t len);
275long compat_sys_sync_file_range2(int fd, unsigned int flags,
276 u32 offset_lo, u32 offset_hi,
277 u32 nbytes_lo, u32 nbytes_hi);
278long compat_sys_fallocate(int fd, int mode,
279 u32 offset_lo, u32 offset_hi,
280 u32 len_lo, u32 len_hi);
281long compat_sys_stat64(char __user *filename,
282 struct compat_stat64 __user *statbuf);
283long compat_sys_lstat64(char __user *filename,
284 struct compat_stat64 __user *statbuf);
285long compat_sys_fstat64(unsigned int fd, struct compat_stat64 __user *statbuf);
286long compat_sys_fstatat64(int dfd, char __user *filename,
287 struct compat_stat64 __user *statbuf, int flag);
288long compat_sys_sched_rr_get_interval(compat_pid_t pid,
289 struct compat_timespec __user *interval);
290ssize_t compat_sys_sendfile(int out_fd, int in_fd, compat_off_t __user *offset,
291 size_t count);
292
293/* Versions of compat functions that differ from generic Linux. */
294struct compat_msgbuf;
295long tile_compat_sys_msgsnd(int msqid,
296 struct compat_msgbuf __user *msgp,
297 size_t msgsz, int msgflg);
298long tile_compat_sys_msgrcv(int msqid,
299 struct compat_msgbuf __user *msgp,
300 size_t msgsz, long msgtyp, int msgflg);
301long tile_compat_sys_ptrace(compat_long_t request, compat_long_t pid,
302 compat_long_t addr, compat_long_t data);
303
304/* Tilera Linux syscalls that don't have "compat" versions. */
305#define compat_sys_raise_fpe sys_raise_fpe
306#define compat_sys_flush_cache sys_flush_cache
307
308#endif /* _ASM_TILE_COMPAT_H */
diff --git a/arch/tile/include/asm/cputime.h b/arch/tile/include/asm/cputime.h
new file mode 100644
index 000000000000..6d68ad7e0ea3
--- /dev/null
+++ b/arch/tile/include/asm/cputime.h
@@ -0,0 +1 @@
#include <asm-generic/cputime.h>
diff --git a/arch/tile/include/asm/current.h b/arch/tile/include/asm/current.h
new file mode 100644
index 000000000000..da21acf020d3
--- /dev/null
+++ b/arch/tile/include/asm/current.h
@@ -0,0 +1,31 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_CURRENT_H
16#define _ASM_TILE_CURRENT_H
17
18#include <linux/thread_info.h>
19
20struct task_struct;
21
22static inline struct task_struct *get_current(void)
23{
24 return current_thread_info()->task;
25}
26#define current get_current()
27
28/* Return a usable "task_struct" pointer even if the real one is corrupt. */
29struct task_struct *validate_current(void);
30
31#endif /* _ASM_TILE_CURRENT_H */
diff --git a/arch/tile/include/asm/delay.h b/arch/tile/include/asm/delay.h
new file mode 100644
index 000000000000..97b0e69e704e
--- /dev/null
+++ b/arch/tile/include/asm/delay.h
@@ -0,0 +1,34 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_DELAY_H
16#define _ASM_TILE_DELAY_H
17
18/* Undefined functions to get compile-time errors. */
19extern void __bad_udelay(void);
20extern void __bad_ndelay(void);
21
22extern void __udelay(unsigned long usecs);
23extern void __ndelay(unsigned long nsecs);
24extern void __delay(unsigned long loops);
25
26#define udelay(n) (__builtin_constant_p(n) ? \
27 ((n) > 20000 ? __bad_udelay() : __ndelay((n) * 1000)) : \
28 __udelay(n))
29
30#define ndelay(n) (__builtin_constant_p(n) ? \
31 ((n) > 20000 ? __bad_ndelay() : __ndelay(n)) : \
32 __ndelay(n))
33
34#endif /* _ASM_TILE_DELAY_H */
diff --git a/arch/tile/include/asm/device.h b/arch/tile/include/asm/device.h
new file mode 100644
index 000000000000..f0a4c256403b
--- /dev/null
+++ b/arch/tile/include/asm/device.h
@@ -0,0 +1 @@
#include <asm-generic/device.h>
diff --git a/arch/tile/include/asm/div64.h b/arch/tile/include/asm/div64.h
new file mode 100644
index 000000000000..6cd978cefb28
--- /dev/null
+++ b/arch/tile/include/asm/div64.h
@@ -0,0 +1 @@
#include <asm-generic/div64.h>
diff --git a/arch/tile/include/asm/dma-mapping.h b/arch/tile/include/asm/dma-mapping.h
new file mode 100644
index 000000000000..cf466b39aa13
--- /dev/null
+++ b/arch/tile/include/asm/dma-mapping.h
@@ -0,0 +1,102 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_DMA_MAPPING_H
16#define _ASM_TILE_DMA_MAPPING_H
17
18#include <linux/mm.h>
19#include <linux/scatterlist.h>
20#include <linux/cache.h>
21#include <linux/io.h>
22
23/*
24 * Note that on x86 and powerpc, there is a "struct dma_mapping_ops"
25 * that is used for all the DMA operations. For now, we don't have an
26 * equivalent on tile, because we only have a single way of doing DMA.
27 * (Tilera bug 7994 to use dma_mapping_ops.)
28 */
29
30#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
31#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
32
33extern dma_addr_t dma_map_single(struct device *dev, void *ptr, size_t size,
34 enum dma_data_direction);
35extern void dma_unmap_single(struct device *dev, dma_addr_t dma_addr,
36 size_t size, enum dma_data_direction);
37extern int dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
38 enum dma_data_direction);
39extern void dma_unmap_sg(struct device *dev, struct scatterlist *sg,
40 int nhwentries, enum dma_data_direction);
41extern dma_addr_t dma_map_page(struct device *dev, struct page *page,
42 unsigned long offset, size_t size,
43 enum dma_data_direction);
44extern void dma_unmap_page(struct device *dev, dma_addr_t dma_address,
45 size_t size, enum dma_data_direction);
46extern void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg,
47 int nelems, enum dma_data_direction);
48extern void dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg,
49 int nelems, enum dma_data_direction);
50
51
52void *dma_alloc_coherent(struct device *dev, size_t size,
53 dma_addr_t *dma_handle, gfp_t flag);
54
55void dma_free_coherent(struct device *dev, size_t size,
56 void *vaddr, dma_addr_t dma_handle);
57
58extern void dma_sync_single_for_cpu(struct device *, dma_addr_t, size_t,
59 enum dma_data_direction);
60extern void dma_sync_single_for_device(struct device *, dma_addr_t,
61 size_t, enum dma_data_direction);
62extern void dma_sync_single_range_for_cpu(struct device *, dma_addr_t,
63 unsigned long offset, size_t,
64 enum dma_data_direction);
65extern void dma_sync_single_range_for_device(struct device *, dma_addr_t,
66 unsigned long offset, size_t,
67 enum dma_data_direction);
68extern void dma_cache_sync(void *vaddr, size_t, enum dma_data_direction);
69
70static inline int
71dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
72{
73 return 0;
74}
75
76static inline int
77dma_supported(struct device *dev, u64 mask)
78{
79 return 1;
80}
81
82static inline int
83dma_set_mask(struct device *dev, u64 mask)
84{
85 if (!dev->dma_mask || !dma_supported(dev, mask))
86 return -EIO;
87
88 *dev->dma_mask = mask;
89
90 return 0;
91}
92
93static inline int
94dma_get_cache_alignment(void)
95{
96 return L2_CACHE_BYTES;
97}
98
99#define dma_is_consistent(d, h) (1)
100
101
102#endif /* _ASM_TILE_DMA_MAPPING_H */
diff --git a/arch/tile/include/asm/dma.h b/arch/tile/include/asm/dma.h
new file mode 100644
index 000000000000..12a7ca16d164
--- /dev/null
+++ b/arch/tile/include/asm/dma.h
@@ -0,0 +1,25 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_DMA_H
16#define _ASM_TILE_DMA_H
17
18#include <asm-generic/dma.h>
19
20/* Needed by drivers/pci/quirks.c */
21#ifdef CONFIG_PCI
22extern int isa_dma_bridge_buggy;
23#endif
24
25#endif /* _ASM_TILE_DMA_H */
diff --git a/arch/tile/include/asm/elf.h b/arch/tile/include/asm/elf.h
new file mode 100644
index 000000000000..1bca0debdb0f
--- /dev/null
+++ b/arch/tile/include/asm/elf.h
@@ -0,0 +1,169 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_ELF_H
16#define _ASM_TILE_ELF_H
17
18/*
19 * ELF register definitions.
20 */
21
22#include <arch/chip.h>
23
24#include <linux/ptrace.h>
25#include <asm/byteorder.h>
26#include <asm/page.h>
27
28typedef unsigned long elf_greg_t;
29
30#define ELF_NGREG (sizeof(struct pt_regs) / sizeof(elf_greg_t))
31typedef elf_greg_t elf_gregset_t[ELF_NGREG];
32
33#define EM_TILE64 187
34#define EM_TILEPRO 188
35#define EM_TILEGX 191
36
37/* Provide a nominal data structure. */
38#define ELF_NFPREG 0
39typedef double elf_fpreg_t;
40typedef elf_fpreg_t elf_fpregset_t[ELF_NFPREG];
41
42#ifdef __tilegx__
43#define ELF_CLASS ELFCLASS64
44#else
45#define ELF_CLASS ELFCLASS32
46#endif
47#define ELF_DATA ELFDATA2LSB
48
49/*
50 * There seems to be a bug in how compat_binfmt_elf.c works: it
51 * #undefs ELF_ARCH, but it is then used in binfmt_elf.c for fill_note_info().
52 * Hack around this by providing an enum value of ELF_ARCH.
53 */
54enum { ELF_ARCH = CHIP_ELF_TYPE() };
55#define ELF_ARCH ELF_ARCH
56
57/*
58 * This is used to ensure we don't load something for the wrong architecture.
59 */
60#define elf_check_arch(x) \
61 ((x)->e_ident[EI_CLASS] == ELF_CLASS && \
62 ((x)->e_machine == CHIP_ELF_TYPE() || \
63 (x)->e_machine == CHIP_COMPAT_ELF_TYPE()))
64
65/* The module loader only handles a few relocation types. */
66#ifndef __tilegx__
67#define R_TILE_32 1
68#define R_TILE_JOFFLONG_X1 15
69#define R_TILE_IMM16_X0_LO 25
70#define R_TILE_IMM16_X1_LO 26
71#define R_TILE_IMM16_X0_HA 29
72#define R_TILE_IMM16_X1_HA 30
73#else
74#define R_TILEGX_64 1
75#define R_TILEGX_JUMPOFF_X1 21
76#define R_TILEGX_IMM16_X0_HW0 36
77#define R_TILEGX_IMM16_X1_HW0 37
78#define R_TILEGX_IMM16_X0_HW1 38
79#define R_TILEGX_IMM16_X1_HW1 39
80#define R_TILEGX_IMM16_X0_HW2_LAST 48
81#define R_TILEGX_IMM16_X1_HW2_LAST 49
82#endif
83
84/* Use standard page size for core dumps. */
85#define ELF_EXEC_PAGESIZE PAGE_SIZE
86
87/*
88 * This is the location that an ET_DYN program is loaded if exec'ed. Typical
89 * use of this is to invoke "./ld.so someprog" to test out a new version of
90 * the loader. We need to make sure that it is out of the way of the program
91 * that it will "exec", and that there is sufficient room for the brk.
92 */
93#define ELF_ET_DYN_BASE (TASK_SIZE / 3 * 2)
94
95#define ELF_CORE_COPY_REGS(_dest, _regs) \
96 memcpy((char *) &_dest, (char *) _regs, \
97 sizeof(struct pt_regs));
98
99/* No additional FP registers to copy. */
100#define ELF_CORE_COPY_FPREGS(t, fpu) 0
101
102/*
103 * This yields a mask that user programs can use to figure out what
104 * instruction set this CPU supports. This could be done in user space,
105 * but it's not easy, and we've already done it here.
106 */
107#define ELF_HWCAP (0)
108
109/*
110 * This yields a string that ld.so will use to load implementation
111 * specific libraries for optimization. This is more specific in
112 * intent than poking at uname or /proc/cpuinfo.
113 */
114#define ELF_PLATFORM (NULL)
115
116extern void elf_plat_init(struct pt_regs *regs, unsigned long load_addr);
117
118#define ELF_PLAT_INIT(_r, load_addr) elf_plat_init(_r, load_addr)
119
120extern int dump_task_regs(struct task_struct *, elf_gregset_t *);
121#define ELF_CORE_COPY_TASK_REGS(tsk, elf_regs) dump_task_regs(tsk, elf_regs)
122
123/* Tilera Linux has no personalities currently, so no need to do anything. */
124#define SET_PERSONALITY(ex) do { } while (0)
125
126#define ARCH_HAS_SETUP_ADDITIONAL_PAGES
127/* Support auto-mapping of the user interrupt vectors. */
128struct linux_binprm;
129extern int arch_setup_additional_pages(struct linux_binprm *bprm,
130 int executable_stack);
131#ifdef CONFIG_COMPAT
132
133#define COMPAT_ELF_PLATFORM "tilegx-m32"
134
135/*
136 * "Compat" binaries have the same machine type, but 32-bit class,
137 * since they're not a separate machine type, but just a 32-bit
138 * variant of the standard 64-bit architecture.
139 */
140#define compat_elf_check_arch(x) \
141 ((x)->e_ident[EI_CLASS] == ELFCLASS32 && \
142 ((x)->e_machine == CHIP_ELF_TYPE() || \
143 (x)->e_machine == CHIP_COMPAT_ELF_TYPE()))
144
145#define compat_start_thread(regs, ip, usp) do { \
146 regs->pc = ptr_to_compat_reg((void *)(ip)); \
147 regs->sp = ptr_to_compat_reg((void *)(usp)); \
148 } while (0)
149
150/*
151 * Use SET_PERSONALITY to indicate compatibility via TS_COMPAT.
152 */
153#undef SET_PERSONALITY
154#define SET_PERSONALITY(ex) \
155do { \
156 current->personality = PER_LINUX; \
157 current_thread_info()->status &= ~TS_COMPAT; \
158} while (0)
159#define COMPAT_SET_PERSONALITY(ex) \
160do { \
161 current->personality = PER_LINUX_32BIT; \
162 current_thread_info()->status |= TS_COMPAT; \
163} while (0)
164
165#define COMPAT_ELF_ET_DYN_BASE (0xffffffff / 3 * 2)
166
167#endif /* CONFIG_COMPAT */
168
169#endif /* _ASM_TILE_ELF_H */
diff --git a/arch/tile/include/asm/emergency-restart.h b/arch/tile/include/asm/emergency-restart.h
new file mode 100644
index 000000000000..3711bd9d50bd
--- /dev/null
+++ b/arch/tile/include/asm/emergency-restart.h
@@ -0,0 +1 @@
#include <asm-generic/emergency-restart.h>
diff --git a/arch/tile/include/asm/errno.h b/arch/tile/include/asm/errno.h
new file mode 100644
index 000000000000..4c82b503d92f
--- /dev/null
+++ b/arch/tile/include/asm/errno.h
@@ -0,0 +1 @@
#include <asm-generic/errno.h>
diff --git a/arch/tile/include/asm/fcntl.h b/arch/tile/include/asm/fcntl.h
new file mode 100644
index 000000000000..46ab12db5739
--- /dev/null
+++ b/arch/tile/include/asm/fcntl.h
@@ -0,0 +1 @@
#include <asm-generic/fcntl.h>
diff --git a/arch/tile/include/asm/fixmap.h b/arch/tile/include/asm/fixmap.h
new file mode 100644
index 000000000000..51537ff9265a
--- /dev/null
+++ b/arch/tile/include/asm/fixmap.h
@@ -0,0 +1,124 @@
1/*
2 * Copyright (C) 1998 Ingo Molnar
3 * Copyright 2010 Tilera Corporation. All Rights Reserved.
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation, version 2.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
12 * NON INFRINGEMENT. See the GNU General Public License for
13 * more details.
14 */
15
16#ifndef _ASM_TILE_FIXMAP_H
17#define _ASM_TILE_FIXMAP_H
18
19#include <asm/page.h>
20
21#ifndef __ASSEMBLY__
22#include <linux/kernel.h>
23#ifdef CONFIG_HIGHMEM
24#include <linux/threads.h>
25#include <asm/kmap_types.h>
26#endif
27
28#define __fix_to_virt(x) (FIXADDR_TOP - ((x) << PAGE_SHIFT))
29#define __virt_to_fix(x) ((FIXADDR_TOP - ((x)&PAGE_MASK)) >> PAGE_SHIFT)
30
31/*
32 * Here we define all the compile-time 'special' virtual
33 * addresses. The point is to have a constant address at
34 * compile time, but to set the physical address only
35 * in the boot process. We allocate these special addresses
36 * from the end of supervisor virtual memory backwards.
37 * Also this lets us do fail-safe vmalloc(), we
38 * can guarantee that these special addresses and
39 * vmalloc()-ed addresses never overlap.
40 *
41 * these 'compile-time allocated' memory buffers are
42 * fixed-size 4k pages. (or larger if used with an increment
43 * higher than 1) use fixmap_set(idx,phys) to associate
44 * physical memory with fixmap indices.
45 *
46 * TLB entries of such buffers will not be flushed across
47 * task switches.
48 *
49 * We don't bother with a FIX_HOLE since above the fixmaps
50 * is unmapped memory in any case.
51 */
52enum fixed_addresses {
53#ifdef CONFIG_HIGHMEM
54 FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */
55 FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
56#endif
57 __end_of_permanent_fixed_addresses,
58
59 /*
60 * Temporary boot-time mappings, used before ioremap() is functional.
61 * Not currently needed by the Tile architecture.
62 */
63#define NR_FIX_BTMAPS 0
64#if NR_FIX_BTMAPS
65 FIX_BTMAP_END = __end_of_permanent_fixed_addresses,
66 FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS - 1,
67 __end_of_fixed_addresses
68#else
69 __end_of_fixed_addresses = __end_of_permanent_fixed_addresses
70#endif
71};
72
73extern void __set_fixmap(enum fixed_addresses idx,
74 unsigned long phys, pgprot_t flags);
75
76#define set_fixmap(idx, phys) \
77 __set_fixmap(idx, phys, PAGE_KERNEL)
78/*
79 * Some hardware wants to get fixmapped without caching.
80 */
81#define set_fixmap_nocache(idx, phys) \
82 __set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
83
84#define clear_fixmap(idx) \
85 __set_fixmap(idx, 0, __pgprot(0))
86
87#define __FIXADDR_SIZE (__end_of_permanent_fixed_addresses << PAGE_SHIFT)
88#define __FIXADDR_BOOT_SIZE (__end_of_fixed_addresses << PAGE_SHIFT)
89#define FIXADDR_START (FIXADDR_TOP + PAGE_SIZE - __FIXADDR_SIZE)
90#define FIXADDR_BOOT_START (FIXADDR_TOP + PAGE_SIZE - __FIXADDR_BOOT_SIZE)
91
92extern void __this_fixmap_does_not_exist(void);
93
94/*
95 * 'index to address' translation. If anyone tries to use the idx
96 * directly without tranlation, we catch the bug with a NULL-deference
97 * kernel oops. Illegal ranges of incoming indices are caught too.
98 */
99static __always_inline unsigned long fix_to_virt(const unsigned int idx)
100{
101 /*
102 * this branch gets completely eliminated after inlining,
103 * except when someone tries to use fixaddr indices in an
104 * illegal way. (such as mixing up address types or using
105 * out-of-range indices).
106 *
107 * If it doesn't get removed, the linker will complain
108 * loudly with a reasonably clear error message..
109 */
110 if (idx >= __end_of_fixed_addresses)
111 __this_fixmap_does_not_exist();
112
113 return __fix_to_virt(idx);
114}
115
116static inline unsigned long virt_to_fix(const unsigned long vaddr)
117{
118 BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START);
119 return __virt_to_fix(vaddr);
120}
121
122#endif /* !__ASSEMBLY__ */
123
124#endif /* _ASM_TILE_FIXMAP_H */
diff --git a/arch/tile/include/asm/ftrace.h b/arch/tile/include/asm/ftrace.h
new file mode 100644
index 000000000000..461459b06d98
--- /dev/null
+++ b/arch/tile/include/asm/ftrace.h
@@ -0,0 +1,20 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_FTRACE_H
16#define _ASM_TILE_FTRACE_H
17
18/* empty */
19
20#endif /* _ASM_TILE_FTRACE_H */
diff --git a/arch/tile/include/asm/futex.h b/arch/tile/include/asm/futex.h
new file mode 100644
index 000000000000..9eaeb3c08786
--- /dev/null
+++ b/arch/tile/include/asm/futex.h
@@ -0,0 +1,136 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 *
14 * These routines make two important assumptions:
15 *
16 * 1. atomic_t is really an int and can be freely cast back and forth
17 * (validated in __init_atomic_per_cpu).
18 *
19 * 2. userspace uses sys_cmpxchg() for all atomic operations, thus using
20 * the same locking convention that all the kernel atomic routines use.
21 */
22
23#ifndef _ASM_TILE_FUTEX_H
24#define _ASM_TILE_FUTEX_H
25
26#ifndef __ASSEMBLY__
27
28#include <linux/futex.h>
29#include <linux/uaccess.h>
30#include <linux/errno.h>
31
32extern struct __get_user futex_set(int *v, int i);
33extern struct __get_user futex_add(int *v, int n);
34extern struct __get_user futex_or(int *v, int n);
35extern struct __get_user futex_andn(int *v, int n);
36extern struct __get_user futex_cmpxchg(int *v, int o, int n);
37
38#ifndef __tilegx__
39extern struct __get_user futex_xor(int *v, int n);
40#else
41static inline struct __get_user futex_xor(int __user *uaddr, int n)
42{
43 struct __get_user asm_ret = __get_user_4(uaddr);
44 if (!asm_ret.err) {
45 int oldval, newval;
46 do {
47 oldval = asm_ret.val;
48 newval = oldval ^ n;
49 asm_ret = futex_cmpxchg(uaddr, oldval, newval);
50 } while (asm_ret.err == 0 && oldval != asm_ret.val);
51 }
52 return asm_ret;
53}
54#endif
55
56static inline int futex_atomic_op_inuser(int encoded_op, int __user *uaddr)
57{
58 int op = (encoded_op >> 28) & 7;
59 int cmp = (encoded_op >> 24) & 15;
60 int oparg = (encoded_op << 8) >> 20;
61 int cmparg = (encoded_op << 20) >> 20;
62 int ret;
63 struct __get_user asm_ret;
64
65 if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28))
66 oparg = 1 << oparg;
67
68 if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
69 return -EFAULT;
70
71 pagefault_disable();
72 switch (op) {
73 case FUTEX_OP_SET:
74 asm_ret = futex_set(uaddr, oparg);
75 break;
76 case FUTEX_OP_ADD:
77 asm_ret = futex_add(uaddr, oparg);
78 break;
79 case FUTEX_OP_OR:
80 asm_ret = futex_or(uaddr, oparg);
81 break;
82 case FUTEX_OP_ANDN:
83 asm_ret = futex_andn(uaddr, oparg);
84 break;
85 case FUTEX_OP_XOR:
86 asm_ret = futex_xor(uaddr, oparg);
87 break;
88 default:
89 asm_ret.err = -ENOSYS;
90 }
91 pagefault_enable();
92
93 ret = asm_ret.err;
94
95 if (!ret) {
96 switch (cmp) {
97 case FUTEX_OP_CMP_EQ:
98 ret = (asm_ret.val == cmparg);
99 break;
100 case FUTEX_OP_CMP_NE:
101 ret = (asm_ret.val != cmparg);
102 break;
103 case FUTEX_OP_CMP_LT:
104 ret = (asm_ret.val < cmparg);
105 break;
106 case FUTEX_OP_CMP_GE:
107 ret = (asm_ret.val >= cmparg);
108 break;
109 case FUTEX_OP_CMP_LE:
110 ret = (asm_ret.val <= cmparg);
111 break;
112 case FUTEX_OP_CMP_GT:
113 ret = (asm_ret.val > cmparg);
114 break;
115 default:
116 ret = -ENOSYS;
117 }
118 }
119 return ret;
120}
121
122static inline int futex_atomic_cmpxchg_inatomic(int __user *uaddr, int oldval,
123 int newval)
124{
125 struct __get_user asm_ret;
126
127 if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
128 return -EFAULT;
129
130 asm_ret = futex_cmpxchg(uaddr, oldval, newval);
131 return asm_ret.err ? asm_ret.err : asm_ret.val;
132}
133
134#endif /* !__ASSEMBLY__ */
135
136#endif /* _ASM_TILE_FUTEX_H */
diff --git a/arch/tile/include/asm/hardirq.h b/arch/tile/include/asm/hardirq.h
new file mode 100644
index 000000000000..822390f9a154
--- /dev/null
+++ b/arch/tile/include/asm/hardirq.h
@@ -0,0 +1,47 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_HARDIRQ_H
16#define _ASM_TILE_HARDIRQ_H
17
18#include <linux/threads.h>
19#include <linux/cache.h>
20
21#include <asm/irq.h>
22
23typedef struct {
24 unsigned int __softirq_pending;
25 long idle_timestamp;
26
27 /* Hard interrupt statistics. */
28 unsigned int irq_timer_count;
29 unsigned int irq_syscall_count;
30 unsigned int irq_resched_count;
31 unsigned int irq_hv_flush_count;
32 unsigned int irq_call_count;
33 unsigned int irq_hv_msg_count;
34 unsigned int irq_dev_intr_count;
35
36} ____cacheline_aligned irq_cpustat_t;
37
38DECLARE_PER_CPU(irq_cpustat_t, irq_stat);
39
40#define __ARCH_IRQ_STAT
41#define __IRQ_STAT(cpu, member) (per_cpu(irq_stat, cpu).member)
42
43#include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */
44
45#define HARDIRQ_BITS 8
46
47#endif /* _ASM_TILE_HARDIRQ_H */
diff --git a/arch/tile/include/asm/highmem.h b/arch/tile/include/asm/highmem.h
new file mode 100644
index 000000000000..efdd12e91020
--- /dev/null
+++ b/arch/tile/include/asm/highmem.h
@@ -0,0 +1,73 @@
1/*
2 * Copyright (C) 1999 Gerhard Wichert, Siemens AG
3 * Gerhard.Wichert@pdb.siemens.de
4 * Copyright 2010 Tilera Corporation. All Rights Reserved.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation, version 2.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
13 * NON INFRINGEMENT. See the GNU General Public License for
14 * more details.
15 *
16 * Used in CONFIG_HIGHMEM systems for memory pages which
17 * are not addressable by direct kernel virtual addresses.
18 *
19 */
20
21#ifndef _ASM_TILE_HIGHMEM_H
22#define _ASM_TILE_HIGHMEM_H
23
24#include <linux/interrupt.h>
25#include <linux/threads.h>
26#include <asm/kmap_types.h>
27#include <asm/tlbflush.h>
28#include <asm/homecache.h>
29
30/* declarations for highmem.c */
31extern unsigned long highstart_pfn, highend_pfn;
32
33extern pte_t *pkmap_page_table;
34
35/*
36 * Ordering is:
37 *
38 * FIXADDR_TOP
39 * fixed_addresses
40 * FIXADDR_START
41 * temp fixed addresses
42 * FIXADDR_BOOT_START
43 * Persistent kmap area
44 * PKMAP_BASE
45 * VMALLOC_END
46 * Vmalloc area
47 * VMALLOC_START
48 * high_memory
49 */
50#define LAST_PKMAP_MASK (LAST_PKMAP-1)
51#define PKMAP_NR(virt) ((virt-PKMAP_BASE) >> PAGE_SHIFT)
52#define PKMAP_ADDR(nr) (PKMAP_BASE + ((nr) << PAGE_SHIFT))
53
54void *kmap_high(struct page *page);
55void kunmap_high(struct page *page);
56void *kmap(struct page *page);
57void kunmap(struct page *page);
58void *kmap_fix_kpte(struct page *page, int finished);
59
60/* This macro is used only in map_new_virtual() to map "page". */
61#define kmap_prot page_to_kpgprot(page)
62
63void kunmap_atomic(void *kvaddr, enum km_type type);
64void *kmap_atomic_pfn(unsigned long pfn, enum km_type type);
65void *kmap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot);
66struct page *kmap_atomic_to_page(void *ptr);
67void *kmap_atomic_prot(struct page *page, enum km_type type, pgprot_t prot);
68void *kmap_atomic(struct page *page, enum km_type type);
69void kmap_atomic_fix_kpte(struct page *page, int finished);
70
71#define flush_cache_kmaps() do { } while (0)
72
73#endif /* _ASM_TILE_HIGHMEM_H */
diff --git a/arch/tile/include/asm/homecache.h b/arch/tile/include/asm/homecache.h
new file mode 100644
index 000000000000..a8243865d49e
--- /dev/null
+++ b/arch/tile/include/asm/homecache.h
@@ -0,0 +1,125 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 *
14 * Handle issues around the Tile "home cache" model of coherence.
15 */
16
17#ifndef _ASM_TILE_HOMECACHE_H
18#define _ASM_TILE_HOMECACHE_H
19
20#include <asm/page.h>
21#include <linux/cpumask.h>
22
23struct page;
24struct task_struct;
25struct vm_area_struct;
26struct zone;
27
28/*
29 * Coherence point for the page is its memory controller.
30 * It is not present in any cache (L1 or L2).
31 */
32#define PAGE_HOME_UNCACHED -1
33
34/*
35 * Is this page immutable (unwritable) and thus able to be cached more
36 * widely than would otherwise be possible? On tile64 this means we
37 * mark the PTE to cache locally; on tilepro it means we have "nc" set.
38 */
39#define PAGE_HOME_IMMUTABLE -2
40
41/*
42 * Each cpu considers its own cache to be the home for the page,
43 * which makes it incoherent.
44 */
45#define PAGE_HOME_INCOHERENT -3
46
47#if CHIP_HAS_CBOX_HOME_MAP()
48/* Home for the page is distributed via hash-for-home. */
49#define PAGE_HOME_HASH -4
50#endif
51
52/* Homing is unknown or unspecified. Not valid for page_home(). */
53#define PAGE_HOME_UNKNOWN -5
54
55/* Home on the current cpu. Not valid for page_home(). */
56#define PAGE_HOME_HERE -6
57
58/* Support wrapper to use instead of explicit hv_flush_remote(). */
59extern void flush_remote(unsigned long cache_pfn, unsigned long cache_length,
60 const struct cpumask *cache_cpumask,
61 HV_VirtAddr tlb_va, unsigned long tlb_length,
62 unsigned long tlb_pgsize,
63 const struct cpumask *tlb_cpumask,
64 HV_Remote_ASID *asids, int asidcount);
65
66/* Set homing-related bits in a PTE (can also pass a pgprot_t). */
67extern pte_t pte_set_home(pte_t pte, int home);
68
69/* Do a cache eviction on the specified cpus. */
70extern void homecache_evict(const struct cpumask *mask);
71
72/*
73 * Change a kernel page's homecache. It must not be mapped in user space.
74 * If !CONFIG_HOMECACHE, only usable on LOWMEM, and can only be called when
75 * no other cpu can reference the page, and causes a full-chip cache/TLB flush.
76 */
77extern void homecache_change_page_home(struct page *, int order, int home);
78
79/*
80 * Flush a page out of whatever cache(s) it is in.
81 * This is more than just finv, since it properly handles waiting
82 * for the data to reach memory on tilepro, but it can be quite
83 * heavyweight, particularly on hash-for-home memory.
84 */
85extern void homecache_flush_cache(struct page *, int order);
86
87/*
88 * Allocate a page with the given GFP flags, home, and optionally
89 * node. These routines are actually just wrappers around the normal
90 * alloc_pages() / alloc_pages_node() functions, which set and clear
91 * a per-cpu variable to communicate with homecache_new_kernel_page().
92 * If !CONFIG_HOMECACHE, uses homecache_change_page_home().
93 */
94extern struct page *homecache_alloc_pages(gfp_t gfp_mask,
95 unsigned int order, int home);
96extern struct page *homecache_alloc_pages_node(int nid, gfp_t gfp_mask,
97 unsigned int order, int home);
98#define homecache_alloc_page(gfp_mask, home) \
99 homecache_alloc_pages(gfp_mask, 0, home)
100
101/*
102 * These routines are just pass-throughs to free_pages() when
103 * we support full homecaching. If !CONFIG_HOMECACHE, then these
104 * routines use homecache_change_page_home() to reset the home
105 * back to the default before returning the page to the allocator.
106 */
107void homecache_free_pages(unsigned long addr, unsigned int order);
108#define homecache_free_page(page) \
109 homecache_free_pages((page), 0)
110
111
112
113/*
114 * Report the page home for LOWMEM pages by examining their kernel PTE,
115 * or for highmem pages as the default home.
116 */
117extern int page_home(struct page *);
118
119#define homecache_migrate_kthread() do {} while (0)
120
121#define homecache_kpte_lock() 0
122#define homecache_kpte_unlock(flags) do {} while (0)
123
124
125#endif /* _ASM_TILE_HOMECACHE_H */
diff --git a/arch/tile/include/asm/hugetlb.h b/arch/tile/include/asm/hugetlb.h
new file mode 100644
index 000000000000..0521c277bbde
--- /dev/null
+++ b/arch/tile/include/asm/hugetlb.h
@@ -0,0 +1,109 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_HUGETLB_H
16#define _ASM_TILE_HUGETLB_H
17
18#include <asm/page.h>
19
20
21static inline int is_hugepage_only_range(struct mm_struct *mm,
22 unsigned long addr,
23 unsigned long len) {
24 return 0;
25}
26
27/*
28 * If the arch doesn't supply something else, assume that hugepage
29 * size aligned regions are ok without further preparation.
30 */
31static inline int prepare_hugepage_range(struct file *file,
32 unsigned long addr, unsigned long len)
33{
34 struct hstate *h = hstate_file(file);
35 if (len & ~huge_page_mask(h))
36 return -EINVAL;
37 if (addr & ~huge_page_mask(h))
38 return -EINVAL;
39 return 0;
40}
41
42static inline void hugetlb_prefault_arch_hook(struct mm_struct *mm)
43{
44}
45
46static inline void hugetlb_free_pgd_range(struct mmu_gather *tlb,
47 unsigned long addr, unsigned long end,
48 unsigned long floor,
49 unsigned long ceiling)
50{
51 free_pgd_range(tlb, addr, end, floor, ceiling);
52}
53
54static inline void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
55 pte_t *ptep, pte_t pte)
56{
57 set_pte_order(ptep, pte, HUGETLB_PAGE_ORDER);
58}
59
60static inline pte_t huge_ptep_get_and_clear(struct mm_struct *mm,
61 unsigned long addr, pte_t *ptep)
62{
63 return ptep_get_and_clear(mm, addr, ptep);
64}
65
66static inline void huge_ptep_clear_flush(struct vm_area_struct *vma,
67 unsigned long addr, pte_t *ptep)
68{
69 ptep_clear_flush(vma, addr, ptep);
70}
71
72static inline int huge_pte_none(pte_t pte)
73{
74 return pte_none(pte);
75}
76
77static inline pte_t huge_pte_wrprotect(pte_t pte)
78{
79 return pte_wrprotect(pte);
80}
81
82static inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
83 unsigned long addr, pte_t *ptep)
84{
85 ptep_set_wrprotect(mm, addr, ptep);
86}
87
88static inline int huge_ptep_set_access_flags(struct vm_area_struct *vma,
89 unsigned long addr, pte_t *ptep,
90 pte_t pte, int dirty)
91{
92 return ptep_set_access_flags(vma, addr, ptep, pte, dirty);
93}
94
95static inline pte_t huge_ptep_get(pte_t *ptep)
96{
97 return *ptep;
98}
99
100static inline int arch_prepare_hugepage(struct page *page)
101{
102 return 0;
103}
104
105static inline void arch_release_hugepage(struct page *page)
106{
107}
108
109#endif /* _ASM_TILE_HUGETLB_H */
diff --git a/arch/tile/include/asm/hv_driver.h b/arch/tile/include/asm/hv_driver.h
new file mode 100644
index 000000000000..ad614de899b3
--- /dev/null
+++ b/arch/tile/include/asm/hv_driver.h
@@ -0,0 +1,60 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 *
14 * This header defines a wrapper interface for managing hypervisor
15 * device calls that will result in an interrupt at some later time.
16 * In particular, this provides wrappers for hv_preada() and
17 * hv_pwritea().
18 */
19
20#ifndef _ASM_TILE_HV_DRIVER_H
21#define _ASM_TILE_HV_DRIVER_H
22
23#include <hv/hypervisor.h>
24
25struct hv_driver_cb;
26
27/* A callback to be invoked when an operation completes. */
28typedef void hv_driver_callback_t(struct hv_driver_cb *cb, __hv32 result);
29
30/*
31 * A structure to hold information about an outstanding call.
32 * The driver must allocate a separate structure for each call.
33 */
34struct hv_driver_cb {
35 hv_driver_callback_t *callback; /* Function to call on interrupt. */
36 void *dev; /* Driver-specific state variable. */
37};
38
39/* Wrapper for invoking hv_dev_preada(). */
40static inline int
41tile_hv_dev_preada(int devhdl, __hv32 flags, __hv32 sgl_len,
42 HV_SGL sgl[/* sgl_len */], __hv64 offset,
43 struct hv_driver_cb *callback)
44{
45 return hv_dev_preada(devhdl, flags, sgl_len, sgl,
46 offset, (HV_IntArg)callback);
47}
48
49/* Wrapper for invoking hv_dev_pwritea(). */
50static inline int
51tile_hv_dev_pwritea(int devhdl, __hv32 flags, __hv32 sgl_len,
52 HV_SGL sgl[/* sgl_len */], __hv64 offset,
53 struct hv_driver_cb *callback)
54{
55 return hv_dev_pwritea(devhdl, flags, sgl_len, sgl,
56 offset, (HV_IntArg)callback);
57}
58
59
60#endif /* _ASM_TILE_HV_DRIVER_H */
diff --git a/arch/tile/include/asm/hw_irq.h b/arch/tile/include/asm/hw_irq.h
new file mode 100644
index 000000000000..4fac5fbf333e
--- /dev/null
+++ b/arch/tile/include/asm/hw_irq.h
@@ -0,0 +1,18 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_HW_IRQ_H
16#define _ASM_TILE_HW_IRQ_H
17
18#endif /* _ASM_TILE_HW_IRQ_H */
diff --git a/arch/tile/include/asm/ide.h b/arch/tile/include/asm/ide.h
new file mode 100644
index 000000000000..3c6f2ed894ce
--- /dev/null
+++ b/arch/tile/include/asm/ide.h
@@ -0,0 +1,25 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_IDE_H
16#define _ASM_TILE_IDE_H
17
18/* For IDE on PCI */
19#define MAX_HWIFS 10
20
21#define ide_default_io_ctl(base) (0)
22
23#include <asm-generic/ide_iops.h>
24
25#endif /* _ASM_TILE_IDE_H */
diff --git a/arch/tile/include/asm/io.h b/arch/tile/include/asm/io.h
new file mode 100644
index 000000000000..8c95bef3fa45
--- /dev/null
+++ b/arch/tile/include/asm/io.h
@@ -0,0 +1,279 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_IO_H
16#define _ASM_TILE_IO_H
17
18#include <linux/kernel.h>
19#include <linux/bug.h>
20#include <asm/page.h>
21
22#define IO_SPACE_LIMIT 0xfffffffful
23
24/*
25 * Convert a physical pointer to a virtual kernel pointer for /dev/mem
26 * access.
27 */
28#define xlate_dev_mem_ptr(p) __va(p)
29
30/*
31 * Convert a virtual cached pointer to an uncached pointer.
32 */
33#define xlate_dev_kmem_ptr(p) p
34
35/*
36 * Change "struct page" to physical address.
37 */
38#define page_to_phys(page) ((dma_addr_t)page_to_pfn(page) << PAGE_SHIFT)
39
40/*
41 * Some places try to pass in an loff_t for PHYSADDR (?!), so we cast it to
42 * long before casting it to a pointer to avoid compiler warnings.
43 */
44#if CHIP_HAS_MMIO()
45extern void __iomem *ioremap(resource_size_t offset, unsigned long size);
46extern void __iomem *ioremap_prot(resource_size_t offset, unsigned long size,
47 pgprot_t pgprot);
48extern void iounmap(volatile void __iomem *addr);
49#else
50#define ioremap(physaddr, size) ((void __iomem *)(unsigned long)(physaddr))
51#define iounmap(addr) ((void)0)
52#endif
53
54#define ioremap_nocache(physaddr, size) ioremap(physaddr, size)
55#define ioremap_writethrough(physaddr, size) ioremap(physaddr, size)
56#define ioremap_fullcache(physaddr, size) ioremap(physaddr, size)
57
58void __iomem *ioport_map(unsigned long port, unsigned int len);
59extern inline void ioport_unmap(void __iomem *addr) {}
60
61#define mmiowb()
62
63/* Conversion between virtual and physical mappings. */
64#define mm_ptov(addr) ((void *)phys_to_virt(addr))
65#define mm_vtop(addr) ((unsigned long)virt_to_phys(addr))
66
67#ifdef CONFIG_PCI
68
69extern u8 _tile_readb(unsigned long addr);
70extern u16 _tile_readw(unsigned long addr);
71extern u32 _tile_readl(unsigned long addr);
72extern u64 _tile_readq(unsigned long addr);
73extern void _tile_writeb(u8 val, unsigned long addr);
74extern void _tile_writew(u16 val, unsigned long addr);
75extern void _tile_writel(u32 val, unsigned long addr);
76extern void _tile_writeq(u64 val, unsigned long addr);
77
78#else
79
80/*
81 * The Tile architecture does not support IOMEM unless PCI is enabled.
82 * Unfortunately we can't yet simply not declare these methods,
83 * since some generic code that compiles into the kernel, but
84 * we never run, uses them unconditionally.
85 */
86
87static inline int iomem_panic(void)
88{
89 panic("readb/writeb and friends do not exist on tile without PCI");
90 return 0;
91}
92
93static inline u8 _tile_readb(unsigned long addr)
94{
95 return iomem_panic();
96}
97
98static inline u16 _tile_readw(unsigned long addr)
99{
100 return iomem_panic();
101}
102
103static inline u32 _tile_readl(unsigned long addr)
104{
105 return iomem_panic();
106}
107
108static inline u64 _tile_readq(unsigned long addr)
109{
110 return iomem_panic();
111}
112
113static inline void _tile_writeb(u8 val, unsigned long addr)
114{
115 iomem_panic();
116}
117
118static inline void _tile_writew(u16 val, unsigned long addr)
119{
120 iomem_panic();
121}
122
123static inline void _tile_writel(u32 val, unsigned long addr)
124{
125 iomem_panic();
126}
127
128static inline void _tile_writeq(u64 val, unsigned long addr)
129{
130 iomem_panic();
131}
132
133#endif
134
135#define readb(addr) _tile_readb((unsigned long)addr)
136#define readw(addr) _tile_readw((unsigned long)addr)
137#define readl(addr) _tile_readl((unsigned long)addr)
138#define readq(addr) _tile_readq((unsigned long)addr)
139#define writeb(val, addr) _tile_writeb(val, (unsigned long)addr)
140#define writew(val, addr) _tile_writew(val, (unsigned long)addr)
141#define writel(val, addr) _tile_writel(val, (unsigned long)addr)
142#define writeq(val, addr) _tile_writeq(val, (unsigned long)addr)
143
144#define __raw_readb readb
145#define __raw_readw readw
146#define __raw_readl readl
147#define __raw_readq readq
148#define __raw_writeb writeb
149#define __raw_writew writew
150#define __raw_writel writel
151#define __raw_writeq writeq
152
153#define readb_relaxed readb
154#define readw_relaxed readw
155#define readl_relaxed readl
156#define readq_relaxed readq
157
158#define ioread8 readb
159#define ioread16 readw
160#define ioread32 readl
161#define ioread64 readq
162#define iowrite8 writeb
163#define iowrite16 writew
164#define iowrite32 writel
165#define iowrite64 writeq
166
167static inline void *memcpy_fromio(void *dst, void *src, int len)
168{
169 int x;
170 BUG_ON((unsigned long)src & 0x3);
171 for (x = 0; x < len; x += 4)
172 *(u32 *)(dst + x) = readl(src + x);
173 return dst;
174}
175
176static inline void *memcpy_toio(void *dst, void *src, int len)
177{
178 int x;
179 BUG_ON((unsigned long)dst & 0x3);
180 for (x = 0; x < len; x += 4)
181 writel(*(u32 *)(src + x), dst + x);
182 return dst;
183}
184
185/*
186 * The Tile architecture does not support IOPORT, even with PCI.
187 * Unfortunately we can't yet simply not declare these methods,
188 * since some generic code that compiles into the kernel, but
189 * we never run, uses them unconditionally.
190 */
191
192static inline int ioport_panic(void)
193{
194 panic("inb/outb and friends do not exist on tile");
195 return 0;
196}
197
198static inline u8 inb(unsigned long addr)
199{
200 return ioport_panic();
201}
202
203static inline u16 inw(unsigned long addr)
204{
205 return ioport_panic();
206}
207
208static inline u32 inl(unsigned long addr)
209{
210 return ioport_panic();
211}
212
213static inline void outb(u8 b, unsigned long addr)
214{
215 ioport_panic();
216}
217
218static inline void outw(u16 b, unsigned long addr)
219{
220 ioport_panic();
221}
222
223static inline void outl(u32 b, unsigned long addr)
224{
225 ioport_panic();
226}
227
228#define inb_p(addr) inb(addr)
229#define inw_p(addr) inw(addr)
230#define inl_p(addr) inl(addr)
231#define outb_p(x, addr) outb((x), (addr))
232#define outw_p(x, addr) outw((x), (addr))
233#define outl_p(x, addr) outl((x), (addr))
234
235static inline void insb(unsigned long addr, void *buffer, int count)
236{
237 ioport_panic();
238}
239
240static inline void insw(unsigned long addr, void *buffer, int count)
241{
242 ioport_panic();
243}
244
245static inline void insl(unsigned long addr, void *buffer, int count)
246{
247 ioport_panic();
248}
249
250static inline void outsb(unsigned long addr, const void *buffer, int count)
251{
252 ioport_panic();
253}
254
255static inline void outsw(unsigned long addr, const void *buffer, int count)
256{
257 ioport_panic();
258}
259
260static inline void outsl(unsigned long addr, const void *buffer, int count)
261{
262 ioport_panic();
263}
264
265#define ioread8_rep(p, dst, count) \
266 insb((unsigned long) (p), (dst), (count))
267#define ioread16_rep(p, dst, count) \
268 insw((unsigned long) (p), (dst), (count))
269#define ioread32_rep(p, dst, count) \
270 insl((unsigned long) (p), (dst), (count))
271
272#define iowrite8_rep(p, src, count) \
273 outsb((unsigned long) (p), (src), (count))
274#define iowrite16_rep(p, src, count) \
275 outsw((unsigned long) (p), (src), (count))
276#define iowrite32_rep(p, src, count) \
277 outsl((unsigned long) (p), (src), (count))
278
279#endif /* _ASM_TILE_IO_H */
diff --git a/arch/tile/include/asm/ioctl.h b/arch/tile/include/asm/ioctl.h
new file mode 100644
index 000000000000..b279fe06dfe5
--- /dev/null
+++ b/arch/tile/include/asm/ioctl.h
@@ -0,0 +1 @@
#include <asm-generic/ioctl.h>
diff --git a/arch/tile/include/asm/ioctls.h b/arch/tile/include/asm/ioctls.h
new file mode 100644
index 000000000000..ec34c760665e
--- /dev/null
+++ b/arch/tile/include/asm/ioctls.h
@@ -0,0 +1 @@
#include <asm-generic/ioctls.h>
diff --git a/arch/tile/include/asm/ipc.h b/arch/tile/include/asm/ipc.h
new file mode 100644
index 000000000000..a46e3d9c2a3f
--- /dev/null
+++ b/arch/tile/include/asm/ipc.h
@@ -0,0 +1 @@
#include <asm-generic/ipc.h>
diff --git a/arch/tile/include/asm/ipcbuf.h b/arch/tile/include/asm/ipcbuf.h
new file mode 100644
index 000000000000..84c7e51cb6d0
--- /dev/null
+++ b/arch/tile/include/asm/ipcbuf.h
@@ -0,0 +1 @@
#include <asm-generic/ipcbuf.h>
diff --git a/arch/tile/include/asm/irq.h b/arch/tile/include/asm/irq.h
new file mode 100644
index 000000000000..9be1f849fac9
--- /dev/null
+++ b/arch/tile/include/asm/irq.h
@@ -0,0 +1,37 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_IRQ_H
16#define _ASM_TILE_IRQ_H
17
18#include <linux/hardirq.h>
19
20/* The hypervisor interface provides 32 IRQs. */
21#define NR_IRQS 32
22
23/* IRQ numbers used for linux IPIs. */
24#define IRQ_RESCHEDULE 1
25
26/* The HV interrupt state object. */
27DECLARE_PER_CPU(HV_IntrState, dev_intr_state);
28
29void ack_bad_irq(unsigned int irq);
30
31/*
32 * Paravirtualized drivers should call this when their init calls
33 * discover a valid HV IRQ.
34 */
35void tile_irq_activate(unsigned int irq);
36
37#endif /* _ASM_TILE_IRQ_H */
diff --git a/arch/tile/include/asm/irq_regs.h b/arch/tile/include/asm/irq_regs.h
new file mode 100644
index 000000000000..3dd9c0b70270
--- /dev/null
+++ b/arch/tile/include/asm/irq_regs.h
@@ -0,0 +1 @@
#include <asm-generic/irq_regs.h>
diff --git a/arch/tile/include/asm/irqflags.h b/arch/tile/include/asm/irqflags.h
new file mode 100644
index 000000000000..cf5bffd00fef
--- /dev/null
+++ b/arch/tile/include/asm/irqflags.h
@@ -0,0 +1,267 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_IRQFLAGS_H
16#define _ASM_TILE_IRQFLAGS_H
17
18#include <asm/processor.h>
19#include <arch/interrupts.h>
20#include <arch/chip.h>
21
22/*
23 * The set of interrupts we want to allow when interrupts are nominally
24 * disabled. The remainder are effectively "NMI" interrupts from
25 * the point of view of the generic Linux code. Note that synchronous
26 * interrupts (aka "non-queued") are not blocked by the mask in any case.
27 */
28#if CHIP_HAS_AUX_PERF_COUNTERS()
29#define LINUX_MASKABLE_INTERRUPTS \
30 (~(INT_MASK(INT_PERF_COUNT) | INT_MASK(INT_AUX_PERF_COUNT)))
31#else
32#define LINUX_MASKABLE_INTERRUPTS \
33 (~(INT_MASK(INT_PERF_COUNT)))
34#endif
35
36#ifndef __ASSEMBLY__
37
38/* NOTE: we can't include <linux/percpu.h> due to #include dependencies. */
39#include <asm/percpu.h>
40#include <arch/spr_def.h>
41
42/* Set and clear kernel interrupt masks. */
43#if CHIP_HAS_SPLIT_INTR_MASK()
44#if INT_PERF_COUNT < 32 || INT_AUX_PERF_COUNT < 32 || INT_MEM_ERROR >= 32
45# error Fix assumptions about which word various interrupts are in
46#endif
47#define interrupt_mask_set(n) do { \
48 int __n = (n); \
49 int __mask = 1 << (__n & 0x1f); \
50 if (__n < 32) \
51 __insn_mtspr(SPR_INTERRUPT_MASK_SET_1_0, __mask); \
52 else \
53 __insn_mtspr(SPR_INTERRUPT_MASK_SET_1_1, __mask); \
54} while (0)
55#define interrupt_mask_reset(n) do { \
56 int __n = (n); \
57 int __mask = 1 << (__n & 0x1f); \
58 if (__n < 32) \
59 __insn_mtspr(SPR_INTERRUPT_MASK_RESET_1_0, __mask); \
60 else \
61 __insn_mtspr(SPR_INTERRUPT_MASK_RESET_1_1, __mask); \
62} while (0)
63#define interrupt_mask_check(n) ({ \
64 int __n = (n); \
65 (((__n < 32) ? \
66 __insn_mfspr(SPR_INTERRUPT_MASK_1_0) : \
67 __insn_mfspr(SPR_INTERRUPT_MASK_1_1)) \
68 >> (__n & 0x1f)) & 1; \
69})
70#define interrupt_mask_set_mask(mask) do { \
71 unsigned long long __m = (mask); \
72 __insn_mtspr(SPR_INTERRUPT_MASK_SET_1_0, (unsigned long)(__m)); \
73 __insn_mtspr(SPR_INTERRUPT_MASK_SET_1_1, (unsigned long)(__m>>32)); \
74} while (0)
75#define interrupt_mask_reset_mask(mask) do { \
76 unsigned long long __m = (mask); \
77 __insn_mtspr(SPR_INTERRUPT_MASK_RESET_1_0, (unsigned long)(__m)); \
78 __insn_mtspr(SPR_INTERRUPT_MASK_RESET_1_1, (unsigned long)(__m>>32)); \
79} while (0)
80#else
81#define interrupt_mask_set(n) \
82 __insn_mtspr(SPR_INTERRUPT_MASK_SET_1, (1UL << (n)))
83#define interrupt_mask_reset(n) \
84 __insn_mtspr(SPR_INTERRUPT_MASK_RESET_1, (1UL << (n)))
85#define interrupt_mask_check(n) \
86 ((__insn_mfspr(SPR_INTERRUPT_MASK_1) >> (n)) & 1)
87#define interrupt_mask_set_mask(mask) \
88 __insn_mtspr(SPR_INTERRUPT_MASK_SET_1, (mask))
89#define interrupt_mask_reset_mask(mask) \
90 __insn_mtspr(SPR_INTERRUPT_MASK_RESET_1, (mask))
91#endif
92
93/*
94 * The set of interrupts we want active if irqs are enabled.
95 * Note that in particular, the tile timer interrupt comes and goes
96 * from this set, since we have no other way to turn off the timer.
97 * Likewise, INTCTRL_1 is removed and re-added during device
98 * interrupts, as is the the hardwall UDN_FIREWALL interrupt.
99 * We use a low bit (MEM_ERROR) as our sentinel value and make sure it
100 * is always claimed as an "active interrupt" so we can query that bit
101 * to know our current state.
102 */
103DECLARE_PER_CPU(unsigned long long, interrupts_enabled_mask);
104#define INITIAL_INTERRUPTS_ENABLED INT_MASK(INT_MEM_ERROR)
105
106/* Disable interrupts. */
107#define raw_local_irq_disable() \
108 interrupt_mask_set_mask(LINUX_MASKABLE_INTERRUPTS)
109
110/* Disable all interrupts, including NMIs. */
111#define raw_local_irq_disable_all() \
112 interrupt_mask_set_mask(-1UL)
113
114/* Re-enable all maskable interrupts. */
115#define raw_local_irq_enable() \
116 interrupt_mask_reset_mask(__get_cpu_var(interrupts_enabled_mask))
117
118/* Disable or enable interrupts based on flag argument. */
119#define raw_local_irq_restore(disabled) do { \
120 if (disabled) \
121 raw_local_irq_disable(); \
122 else \
123 raw_local_irq_enable(); \
124} while (0)
125
126/* Return true if "flags" argument means interrupts are disabled. */
127#define raw_irqs_disabled_flags(flags) ((flags) != 0)
128
129/* Return true if interrupts are currently disabled. */
130#define raw_irqs_disabled() interrupt_mask_check(INT_MEM_ERROR)
131
132/* Save whether interrupts are currently disabled. */
133#define raw_local_save_flags(flags) ((flags) = raw_irqs_disabled())
134
135/* Save whether interrupts are currently disabled, then disable them. */
136#define raw_local_irq_save(flags) \
137 do { raw_local_save_flags(flags); raw_local_irq_disable(); } while (0)
138
139/* Prevent the given interrupt from being enabled next time we enable irqs. */
140#define raw_local_irq_mask(interrupt) \
141 (__get_cpu_var(interrupts_enabled_mask) &= ~INT_MASK(interrupt))
142
143/* Prevent the given interrupt from being enabled immediately. */
144#define raw_local_irq_mask_now(interrupt) do { \
145 raw_local_irq_mask(interrupt); \
146 interrupt_mask_set(interrupt); \
147} while (0)
148
149/* Allow the given interrupt to be enabled next time we enable irqs. */
150#define raw_local_irq_unmask(interrupt) \
151 (__get_cpu_var(interrupts_enabled_mask) |= INT_MASK(interrupt))
152
153/* Allow the given interrupt to be enabled immediately, if !irqs_disabled. */
154#define raw_local_irq_unmask_now(interrupt) do { \
155 raw_local_irq_unmask(interrupt); \
156 if (!irqs_disabled()) \
157 interrupt_mask_reset(interrupt); \
158} while (0)
159
160#else /* __ASSEMBLY__ */
161
162/* We provide a somewhat more restricted set for assembly. */
163
164#ifdef __tilegx__
165
166#if INT_MEM_ERROR != 0
167# error Fix IRQ_DISABLED() macro
168#endif
169
170/* Return 0 or 1 to indicate whether interrupts are currently disabled. */
171#define IRQS_DISABLED(tmp) \
172 mfspr tmp, INTERRUPT_MASK_1; \
173 andi tmp, tmp, 1
174
175/* Load up a pointer to &interrupts_enabled_mask. */
176#define GET_INTERRUPTS_ENABLED_MASK_PTR(reg) \
177 moveli reg, hw2_last(interrupts_enabled_mask); \
178 shl16insli reg, reg, hw1(interrupts_enabled_mask); \
179 shl16insli reg, reg, hw0(interrupts_enabled_mask); \
180 add reg, reg, tp
181
182/* Disable interrupts. */
183#define IRQ_DISABLE(tmp0, tmp1) \
184 moveli tmp0, hw2_last(LINUX_MASKABLE_INTERRUPTS); \
185 shl16insli tmp0, tmp0, hw1(LINUX_MASKABLE_INTERRUPTS); \
186 shl16insli tmp0, tmp0, hw0(LINUX_MASKABLE_INTERRUPTS); \
187 mtspr INTERRUPT_MASK_SET_1, tmp0
188
189/* Disable ALL synchronous interrupts (used by NMI entry). */
190#define IRQ_DISABLE_ALL(tmp) \
191 movei tmp, -1; \
192 mtspr INTERRUPT_MASK_SET_1, tmp
193
194/* Enable interrupts. */
195#define IRQ_ENABLE(tmp0, tmp1) \
196 GET_INTERRUPTS_ENABLED_MASK_PTR(tmp0); \
197 ld tmp0, tmp0; \
198 mtspr INTERRUPT_MASK_RESET_1, tmp0
199
200#else /* !__tilegx__ */
201
202/*
203 * Return 0 or 1 to indicate whether interrupts are currently disabled.
204 * Note that it's important that we use a bit from the "low" mask word,
205 * since when we are enabling, that is the word we write first, so if we
206 * are interrupted after only writing half of the mask, the interrupt
207 * handler will correctly observe that we have interrupts enabled, and
208 * will enable interrupts itself on return from the interrupt handler
209 * (making the original code's write of the "high" mask word idempotent).
210 */
211#define IRQS_DISABLED(tmp) \
212 mfspr tmp, INTERRUPT_MASK_1_0; \
213 shri tmp, tmp, INT_MEM_ERROR; \
214 andi tmp, tmp, 1
215
216/* Load up a pointer to &interrupts_enabled_mask. */
217#define GET_INTERRUPTS_ENABLED_MASK_PTR(reg) \
218 moveli reg, lo16(interrupts_enabled_mask); \
219 auli reg, reg, ha16(interrupts_enabled_mask);\
220 add reg, reg, tp
221
222/* Disable interrupts. */
223#define IRQ_DISABLE(tmp0, tmp1) \
224 { \
225 movei tmp0, -1; \
226 moveli tmp1, lo16(LINUX_MASKABLE_INTERRUPTS) \
227 }; \
228 { \
229 mtspr INTERRUPT_MASK_SET_1_0, tmp0; \
230 auli tmp1, tmp1, ha16(LINUX_MASKABLE_INTERRUPTS) \
231 }; \
232 mtspr INTERRUPT_MASK_SET_1_1, tmp1
233
234/* Disable ALL synchronous interrupts (used by NMI entry). */
235#define IRQ_DISABLE_ALL(tmp) \
236 movei tmp, -1; \
237 mtspr INTERRUPT_MASK_SET_1_0, tmp; \
238 mtspr INTERRUPT_MASK_SET_1_1, tmp
239
240/* Enable interrupts. */
241#define IRQ_ENABLE(tmp0, tmp1) \
242 GET_INTERRUPTS_ENABLED_MASK_PTR(tmp0); \
243 { \
244 lw tmp0, tmp0; \
245 addi tmp1, tmp0, 4 \
246 }; \
247 lw tmp1, tmp1; \
248 mtspr INTERRUPT_MASK_RESET_1_0, tmp0; \
249 mtspr INTERRUPT_MASK_RESET_1_1, tmp1
250#endif
251
252/*
253 * Do the CPU's IRQ-state tracing from assembly code. We call a
254 * C function, but almost everywhere we do, we don't mind clobbering
255 * all the caller-saved registers.
256 */
257#ifdef CONFIG_TRACE_IRQFLAGS
258# define TRACE_IRQS_ON jal trace_hardirqs_on
259# define TRACE_IRQS_OFF jal trace_hardirqs_off
260#else
261# define TRACE_IRQS_ON
262# define TRACE_IRQS_OFF
263#endif
264
265#endif /* __ASSEMBLY__ */
266
267#endif /* _ASM_TILE_IRQFLAGS_H */
diff --git a/arch/tile/include/asm/kdebug.h b/arch/tile/include/asm/kdebug.h
new file mode 100644
index 000000000000..6ece1b037665
--- /dev/null
+++ b/arch/tile/include/asm/kdebug.h
@@ -0,0 +1 @@
#include <asm-generic/kdebug.h>
diff --git a/arch/tile/include/asm/kexec.h b/arch/tile/include/asm/kexec.h
new file mode 100644
index 000000000000..c11a6cc73bb8
--- /dev/null
+++ b/arch/tile/include/asm/kexec.h
@@ -0,0 +1,53 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 *
14 * based on kexec.h from other architectures in linux-2.6.18
15 */
16
17#ifndef _ASM_TILE_KEXEC_H
18#define _ASM_TILE_KEXEC_H
19
20#include <asm/page.h>
21
22/* Maximum physical address we can use pages from. */
23#define KEXEC_SOURCE_MEMORY_LIMIT TASK_SIZE
24/* Maximum address we can reach in physical address mode. */
25#define KEXEC_DESTINATION_MEMORY_LIMIT TASK_SIZE
26/* Maximum address we can use for the control code buffer. */
27#define KEXEC_CONTROL_MEMORY_LIMIT TASK_SIZE
28
29#define KEXEC_CONTROL_PAGE_SIZE PAGE_SIZE
30
31/*
32 * We don't bother to provide a unique identifier, since we can only
33 * reboot with a single type of kernel image anyway.
34 */
35#define KEXEC_ARCH KEXEC_ARCH_DEFAULT
36
37/* Use the tile override for the page allocator. */
38struct page *kimage_alloc_pages_arch(gfp_t gfp_mask, unsigned int order);
39#define kimage_alloc_pages_arch kimage_alloc_pages_arch
40
41#define MAX_NOTE_BYTES 1024
42
43/* Defined in arch/tile/kernel/relocate_kernel.S */
44extern const unsigned char relocate_new_kernel[];
45extern const unsigned long relocate_new_kernel_size;
46extern void relocate_new_kernel_end(void);
47
48/* Provide a dummy definition to avoid build failures. */
49static inline void crash_setup_regs(struct pt_regs *n, struct pt_regs *o)
50{
51}
52
53#endif /* _ASM_TILE_KEXEC_H */
diff --git a/arch/tile/include/asm/kmap_types.h b/arch/tile/include/asm/kmap_types.h
new file mode 100644
index 000000000000..1480106d1c05
--- /dev/null
+++ b/arch/tile/include/asm/kmap_types.h
@@ -0,0 +1,43 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_KMAP_TYPES_H
16#define _ASM_TILE_KMAP_TYPES_H
17
18/*
19 * In TILE Linux each set of four of these uses another 16MB chunk of
20 * address space, given 64 tiles and 64KB pages, so we only enable
21 * ones that are required by the kernel configuration.
22 */
23enum km_type {
24 KM_BOUNCE_READ,
25 KM_SKB_SUNRPC_DATA,
26 KM_SKB_DATA_SOFTIRQ,
27 KM_USER0,
28 KM_USER1,
29 KM_BIO_SRC_IRQ,
30 KM_IRQ0,
31 KM_IRQ1,
32 KM_SOFTIRQ0,
33 KM_SOFTIRQ1,
34 KM_MEMCPY0,
35 KM_MEMCPY1,
36#if defined(CONFIG_HIGHPTE)
37 KM_PTE0,
38 KM_PTE1,
39#endif
40 KM_TYPE_NR
41};
42
43#endif /* _ASM_TILE_KMAP_TYPES_H */
diff --git a/arch/tile/include/asm/linkage.h b/arch/tile/include/asm/linkage.h
new file mode 100644
index 000000000000..e121c39751a7
--- /dev/null
+++ b/arch/tile/include/asm/linkage.h
@@ -0,0 +1,51 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_LINKAGE_H
16#define _ASM_TILE_LINKAGE_H
17
18#include <feedback.h>
19
20#define __ALIGN .align 8
21
22/*
23 * The STD_ENTRY and STD_ENDPROC macros put the function in a
24 * self-named .text.foo section, and if linker feedback collection
25 * is enabled, add a suitable call to the feedback collection code.
26 * STD_ENTRY_SECTION lets you specify a non-standard section name.
27 */
28
29#define STD_ENTRY(name) \
30 .pushsection .text.##name, "ax"; \
31 ENTRY(name); \
32 FEEDBACK_ENTER(name)
33
34#define STD_ENTRY_SECTION(name, section) \
35 .pushsection section, "ax"; \
36 ENTRY(name); \
37 FEEDBACK_ENTER_EXPLICIT(name, section, .Lend_##name - name)
38
39#define STD_ENDPROC(name) \
40 ENDPROC(name); \
41 .Lend_##name:; \
42 .popsection
43
44/* Create a file-static function entry set up for feedback gathering. */
45#define STD_ENTRY_LOCAL(name) \
46 .pushsection .text.##name, "ax"; \
47 ALIGN; \
48 name:; \
49 FEEDBACK_ENTER(name)
50
51#endif /* _ASM_TILE_LINKAGE_H */
diff --git a/arch/tile/include/asm/local.h b/arch/tile/include/asm/local.h
new file mode 100644
index 000000000000..c11c530f74d0
--- /dev/null
+++ b/arch/tile/include/asm/local.h
@@ -0,0 +1 @@
#include <asm-generic/local.h>
diff --git a/arch/tile/include/asm/memprof.h b/arch/tile/include/asm/memprof.h
new file mode 100644
index 000000000000..359949be28c1
--- /dev/null
+++ b/arch/tile/include/asm/memprof.h
@@ -0,0 +1,33 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 *
14 * The hypervisor's memory controller profiling infrastructure allows
15 * the programmer to find out what fraction of the available memory
16 * bandwidth is being consumed at each memory controller. The
17 * profiler provides start, stop, and clear operations to allows
18 * profiling over a specific time window, as well as an interface for
19 * reading the most recent profile values.
20 *
21 * This header declares IOCTL codes necessary to control memprof.
22 */
23#ifndef _ASM_TILE_MEMPROF_H
24#define _ASM_TILE_MEMPROF_H
25
26#include <linux/ioctl.h>
27
28#define MEMPROF_IOCTL_TYPE 0xB4
29#define MEMPROF_IOCTL_START _IO(MEMPROF_IOCTL_TYPE, 0)
30#define MEMPROF_IOCTL_STOP _IO(MEMPROF_IOCTL_TYPE, 1)
31#define MEMPROF_IOCTL_CLEAR _IO(MEMPROF_IOCTL_TYPE, 2)
32
33#endif /* _ASM_TILE_MEMPROF_H */
diff --git a/arch/tile/include/asm/mman.h b/arch/tile/include/asm/mman.h
new file mode 100644
index 000000000000..4c6811e3e8dc
--- /dev/null
+++ b/arch/tile/include/asm/mman.h
@@ -0,0 +1,40 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_MMAN_H
16#define _ASM_TILE_MMAN_H
17
18#include <asm-generic/mman-common.h>
19#include <arch/chip.h>
20
21/* Standard Linux flags */
22
23#define MAP_POPULATE 0x0040 /* populate (prefault) pagetables */
24#define MAP_NONBLOCK 0x0080 /* do not block on IO */
25#define MAP_GROWSDOWN 0x0100 /* stack-like segment */
26#define MAP_LOCKED 0x0200 /* pages are locked */
27#define MAP_NORESERVE 0x0400 /* don't check for reservations */
28#define MAP_DENYWRITE 0x0800 /* ETXTBSY */
29#define MAP_EXECUTABLE 0x1000 /* mark it as an executable */
30#define MAP_HUGETLB 0x4000 /* create a huge page mapping */
31
32
33/*
34 * Flags for mlockall
35 */
36#define MCL_CURRENT 1 /* lock all current mappings */
37#define MCL_FUTURE 2 /* lock all future mappings */
38
39
40#endif /* _ASM_TILE_MMAN_H */
diff --git a/arch/tile/include/asm/mmu.h b/arch/tile/include/asm/mmu.h
new file mode 100644
index 000000000000..92f94c77b6e4
--- /dev/null
+++ b/arch/tile/include/asm/mmu.h
@@ -0,0 +1,31 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_MMU_H
16#define _ASM_TILE_MMU_H
17
18/* Capture any arch- and mm-specific information. */
19struct mm_context {
20 /*
21 * Written under the mmap_sem semaphore; read without the
22 * semaphore but atomically, but it is conservatively set.
23 */
24 unsigned int priority_cached;
25};
26
27typedef struct mm_context mm_context_t;
28
29void leave_mm(int cpu);
30
31#endif /* _ASM_TILE_MMU_H */
diff --git a/arch/tile/include/asm/mmu_context.h b/arch/tile/include/asm/mmu_context.h
new file mode 100644
index 000000000000..9bc0d0725c28
--- /dev/null
+++ b/arch/tile/include/asm/mmu_context.h
@@ -0,0 +1,131 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_MMU_CONTEXT_H
16#define _ASM_TILE_MMU_CONTEXT_H
17
18#include <linux/smp.h>
19#include <asm/setup.h>
20#include <asm/page.h>
21#include <asm/pgalloc.h>
22#include <asm/pgtable.h>
23#include <asm/tlbflush.h>
24#include <asm/homecache.h>
25#include <asm-generic/mm_hooks.h>
26
27static inline int
28init_new_context(struct task_struct *tsk, struct mm_struct *mm)
29{
30 return 0;
31}
32
33/* Note that arch/tile/kernel/head.S also calls hv_install_context() */
34static inline void __install_page_table(pgd_t *pgdir, int asid, pgprot_t prot)
35{
36 /* FIXME: DIRECTIO should not always be set. FIXME. */
37 int rc = hv_install_context(__pa(pgdir), prot, asid, HV_CTX_DIRECTIO);
38 if (rc < 0)
39 panic("hv_install_context failed: %d", rc);
40}
41
42static inline void install_page_table(pgd_t *pgdir, int asid)
43{
44 pte_t *ptep = virt_to_pte(NULL, (unsigned long)pgdir);
45 __install_page_table(pgdir, asid, *ptep);
46}
47
48/*
49 * "Lazy" TLB mode is entered when we are switching to a kernel task,
50 * which borrows the mm of the previous task. The goal of this
51 * optimization is to avoid having to install a new page table. On
52 * early x86 machines (where the concept originated) you couldn't do
53 * anything short of a full page table install for invalidation, so
54 * handling a remote TLB invalidate required doing a page table
55 * re-install. Someone clearly decided that it was silly to keep
56 * doing this while in "lazy" TLB mode, so the optimization involves
57 * installing the swapper page table instead the first time one
58 * occurs, and clearing the cpu out of cpu_vm_mask, so the cpu running
59 * the kernel task doesn't need to take any more interrupts. At that
60 * point it's then necessary to explicitly reinstall it when context
61 * switching back to the original mm.
62 *
63 * On Tile, we have to do a page-table install whenever DMA is enabled,
64 * so in that case lazy mode doesn't help anyway. And more generally,
65 * we have efficient per-page TLB shootdown, and don't expect to spend
66 * that much time in kernel tasks in general, so just leaving the
67 * kernel task borrowing the old page table, but handling TLB
68 * shootdowns, is a reasonable thing to do. And importantly, this
69 * lets us use the hypervisor's internal APIs for TLB shootdown, which
70 * means we don't have to worry about having TLB shootdowns blocked
71 * when Linux is disabling interrupts; see the page migration code for
72 * an example of where it's important for TLB shootdowns to complete
73 * even when interrupts are disabled at the Linux level.
74 */
75static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *t)
76{
77#if CHIP_HAS_TILE_DMA()
78 /*
79 * We have to do an "identity" page table switch in order to
80 * clear any pending DMA interrupts.
81 */
82 if (current->thread.tile_dma_state.enabled)
83 install_page_table(mm->pgd, __get_cpu_var(current_asid));
84#endif
85}
86
87static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
88 struct task_struct *tsk)
89{
90 if (likely(prev != next)) {
91
92 int cpu = smp_processor_id();
93
94 /* Pick new ASID. */
95 int asid = __get_cpu_var(current_asid) + 1;
96 if (asid > max_asid) {
97 asid = min_asid;
98 local_flush_tlb();
99 }
100 __get_cpu_var(current_asid) = asid;
101
102 /* Clear cpu from the old mm, and set it in the new one. */
103 cpumask_clear_cpu(cpu, &prev->cpu_vm_mask);
104 cpumask_set_cpu(cpu, &next->cpu_vm_mask);
105
106 /* Re-load page tables */
107 install_page_table(next->pgd, asid);
108
109 /* See how we should set the red/black cache info */
110 check_mm_caching(prev, next);
111
112 /*
113 * Since we're changing to a new mm, we have to flush
114 * the icache in case some physical page now being mapped
115 * has subsequently been repurposed and has new code.
116 */
117 __flush_icache();
118
119 }
120}
121
122static inline void activate_mm(struct mm_struct *prev_mm,
123 struct mm_struct *next_mm)
124{
125 switch_mm(prev_mm, next_mm, NULL);
126}
127
128#define destroy_context(mm) do { } while (0)
129#define deactivate_mm(tsk, mm) do { } while (0)
130
131#endif /* _ASM_TILE_MMU_CONTEXT_H */
diff --git a/arch/tile/include/asm/mmzone.h b/arch/tile/include/asm/mmzone.h
new file mode 100644
index 000000000000..c6344c4f32ac
--- /dev/null
+++ b/arch/tile/include/asm/mmzone.h
@@ -0,0 +1,81 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_MMZONE_H
16#define _ASM_TILE_MMZONE_H
17
18extern struct pglist_data node_data[];
19#define NODE_DATA(nid) (&node_data[nid])
20
21extern void get_memcfg_numa(void);
22
23#ifdef CONFIG_DISCONTIGMEM
24
25#include <asm/page.h>
26
27/*
28 * Generally, memory ranges are always doled out by the hypervisor in
29 * fixed-size, power-of-two increments. That would make computing the node
30 * very easy. We could just take a couple high bits of the PA, which
31 * denote the memory shim, and we'd be done. However, when we're doing
32 * memory striping, this may not be true; PAs with different high bit
33 * values might be in the same node. Thus, we keep a lookup table to
34 * translate the high bits of the PFN to the node number.
35 */
36extern int highbits_to_node[];
37
38static inline int pfn_to_nid(unsigned long pfn)
39{
40 return highbits_to_node[__pfn_to_highbits(pfn)];
41}
42
43/*
44 * Following are macros that each numa implmentation must define.
45 */
46
47#define node_start_pfn(nid) (NODE_DATA(nid)->node_start_pfn)
48#define node_end_pfn(nid) \
49({ \
50 pg_data_t *__pgdat = NODE_DATA(nid); \
51 __pgdat->node_start_pfn + __pgdat->node_spanned_pages; \
52})
53
54#define kern_addr_valid(kaddr) virt_addr_valid((void *)kaddr)
55
56static inline int pfn_valid(int pfn)
57{
58 int nid = pfn_to_nid(pfn);
59
60 if (nid >= 0)
61 return (pfn < node_end_pfn(nid));
62 return 0;
63}
64
65/* Information on the NUMA nodes that we compute early */
66extern unsigned long node_start_pfn[];
67extern unsigned long node_end_pfn[];
68extern unsigned long node_memmap_pfn[];
69extern unsigned long node_percpu_pfn[];
70extern unsigned long node_free_pfn[];
71#ifdef CONFIG_HIGHMEM
72extern unsigned long node_lowmem_end_pfn[];
73#endif
74#ifdef CONFIG_PCI
75extern unsigned long pci_reserve_start_pfn;
76extern unsigned long pci_reserve_end_pfn;
77#endif
78
79#endif /* CONFIG_DISCONTIGMEM */
80
81#endif /* _ASM_TILE_MMZONE_H */
diff --git a/arch/tile/include/asm/module.h b/arch/tile/include/asm/module.h
new file mode 100644
index 000000000000..1e4b79fe8584
--- /dev/null
+++ b/arch/tile/include/asm/module.h
@@ -0,0 +1 @@
#include <asm-generic/module.h>
diff --git a/arch/tile/include/asm/msgbuf.h b/arch/tile/include/asm/msgbuf.h
new file mode 100644
index 000000000000..809134c644a6
--- /dev/null
+++ b/arch/tile/include/asm/msgbuf.h
@@ -0,0 +1 @@
#include <asm-generic/msgbuf.h>
diff --git a/arch/tile/include/asm/mutex.h b/arch/tile/include/asm/mutex.h
new file mode 100644
index 000000000000..ff6101aa2c71
--- /dev/null
+++ b/arch/tile/include/asm/mutex.h
@@ -0,0 +1 @@
#include <asm-generic/mutex-dec.h>
diff --git a/arch/tile/include/asm/opcode-tile.h b/arch/tile/include/asm/opcode-tile.h
new file mode 100644
index 000000000000..ba38959137d7
--- /dev/null
+++ b/arch/tile/include/asm/opcode-tile.h
@@ -0,0 +1,30 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_OPCODE_TILE_H
16#define _ASM_TILE_OPCODE_TILE_H
17
18#include <arch/chip.h>
19
20#if CHIP_WORD_SIZE() == 64
21#include <asm/opcode-tile_64.h>
22#else
23#include <asm/opcode-tile_32.h>
24#endif
25
26/* These definitions are not correct for TILE64, so just avoid them. */
27#undef TILE_ELF_MACHINE_CODE
28#undef TILE_ELF_NAME
29
30#endif /* _ASM_TILE_OPCODE_TILE_H */
diff --git a/arch/tile/include/asm/opcode-tile_32.h b/arch/tile/include/asm/opcode-tile_32.h
new file mode 100644
index 000000000000..90f8dd372531
--- /dev/null
+++ b/arch/tile/include/asm/opcode-tile_32.h
@@ -0,0 +1,1597 @@
1/* tile.h -- Header file for TILE opcode table
2 Copyright (C) 2005 Free Software Foundation, Inc.
3 Contributed by Tilera Corp. */
4
5#ifndef opcode_tile_h
6#define opcode_tile_h
7
8typedef unsigned long long tile_bundle_bits;
9
10
11enum
12{
13 TILE_MAX_OPERANDS = 5 /* mm */
14};
15
16typedef enum
17{
18 TILE_OPC_BPT,
19 TILE_OPC_INFO,
20 TILE_OPC_INFOL,
21 TILE_OPC_J,
22 TILE_OPC_JAL,
23 TILE_OPC_MOVE,
24 TILE_OPC_MOVE_SN,
25 TILE_OPC_MOVEI,
26 TILE_OPC_MOVEI_SN,
27 TILE_OPC_MOVELI,
28 TILE_OPC_MOVELI_SN,
29 TILE_OPC_MOVELIS,
30 TILE_OPC_PREFETCH,
31 TILE_OPC_ADD,
32 TILE_OPC_ADD_SN,
33 TILE_OPC_ADDB,
34 TILE_OPC_ADDB_SN,
35 TILE_OPC_ADDBS_U,
36 TILE_OPC_ADDBS_U_SN,
37 TILE_OPC_ADDH,
38 TILE_OPC_ADDH_SN,
39 TILE_OPC_ADDHS,
40 TILE_OPC_ADDHS_SN,
41 TILE_OPC_ADDI,
42 TILE_OPC_ADDI_SN,
43 TILE_OPC_ADDIB,
44 TILE_OPC_ADDIB_SN,
45 TILE_OPC_ADDIH,
46 TILE_OPC_ADDIH_SN,
47 TILE_OPC_ADDLI,
48 TILE_OPC_ADDLI_SN,
49 TILE_OPC_ADDLIS,
50 TILE_OPC_ADDS,
51 TILE_OPC_ADDS_SN,
52 TILE_OPC_ADIFFB_U,
53 TILE_OPC_ADIFFB_U_SN,
54 TILE_OPC_ADIFFH,
55 TILE_OPC_ADIFFH_SN,
56 TILE_OPC_AND,
57 TILE_OPC_AND_SN,
58 TILE_OPC_ANDI,
59 TILE_OPC_ANDI_SN,
60 TILE_OPC_AULI,
61 TILE_OPC_AVGB_U,
62 TILE_OPC_AVGB_U_SN,
63 TILE_OPC_AVGH,
64 TILE_OPC_AVGH_SN,
65 TILE_OPC_BBNS,
66 TILE_OPC_BBNS_SN,
67 TILE_OPC_BBNST,
68 TILE_OPC_BBNST_SN,
69 TILE_OPC_BBS,
70 TILE_OPC_BBS_SN,
71 TILE_OPC_BBST,
72 TILE_OPC_BBST_SN,
73 TILE_OPC_BGEZ,
74 TILE_OPC_BGEZ_SN,
75 TILE_OPC_BGEZT,
76 TILE_OPC_BGEZT_SN,
77 TILE_OPC_BGZ,
78 TILE_OPC_BGZ_SN,
79 TILE_OPC_BGZT,
80 TILE_OPC_BGZT_SN,
81 TILE_OPC_BITX,
82 TILE_OPC_BITX_SN,
83 TILE_OPC_BLEZ,
84 TILE_OPC_BLEZ_SN,
85 TILE_OPC_BLEZT,
86 TILE_OPC_BLEZT_SN,
87 TILE_OPC_BLZ,
88 TILE_OPC_BLZ_SN,
89 TILE_OPC_BLZT,
90 TILE_OPC_BLZT_SN,
91 TILE_OPC_BNZ,
92 TILE_OPC_BNZ_SN,
93 TILE_OPC_BNZT,
94 TILE_OPC_BNZT_SN,
95 TILE_OPC_BYTEX,
96 TILE_OPC_BYTEX_SN,
97 TILE_OPC_BZ,
98 TILE_OPC_BZ_SN,
99 TILE_OPC_BZT,
100 TILE_OPC_BZT_SN,
101 TILE_OPC_CLZ,
102 TILE_OPC_CLZ_SN,
103 TILE_OPC_CRC32_32,
104 TILE_OPC_CRC32_32_SN,
105 TILE_OPC_CRC32_8,
106 TILE_OPC_CRC32_8_SN,
107 TILE_OPC_CTZ,
108 TILE_OPC_CTZ_SN,
109 TILE_OPC_DRAIN,
110 TILE_OPC_DTLBPR,
111 TILE_OPC_DWORD_ALIGN,
112 TILE_OPC_DWORD_ALIGN_SN,
113 TILE_OPC_FINV,
114 TILE_OPC_FLUSH,
115 TILE_OPC_FNOP,
116 TILE_OPC_ICOH,
117 TILE_OPC_ILL,
118 TILE_OPC_INTHB,
119 TILE_OPC_INTHB_SN,
120 TILE_OPC_INTHH,
121 TILE_OPC_INTHH_SN,
122 TILE_OPC_INTLB,
123 TILE_OPC_INTLB_SN,
124 TILE_OPC_INTLH,
125 TILE_OPC_INTLH_SN,
126 TILE_OPC_INV,
127 TILE_OPC_IRET,
128 TILE_OPC_JALB,
129 TILE_OPC_JALF,
130 TILE_OPC_JALR,
131 TILE_OPC_JALRP,
132 TILE_OPC_JB,
133 TILE_OPC_JF,
134 TILE_OPC_JR,
135 TILE_OPC_JRP,
136 TILE_OPC_LB,
137 TILE_OPC_LB_SN,
138 TILE_OPC_LB_U,
139 TILE_OPC_LB_U_SN,
140 TILE_OPC_LBADD,
141 TILE_OPC_LBADD_SN,
142 TILE_OPC_LBADD_U,
143 TILE_OPC_LBADD_U_SN,
144 TILE_OPC_LH,
145 TILE_OPC_LH_SN,
146 TILE_OPC_LH_U,
147 TILE_OPC_LH_U_SN,
148 TILE_OPC_LHADD,
149 TILE_OPC_LHADD_SN,
150 TILE_OPC_LHADD_U,
151 TILE_OPC_LHADD_U_SN,
152 TILE_OPC_LNK,
153 TILE_OPC_LNK_SN,
154 TILE_OPC_LW,
155 TILE_OPC_LW_SN,
156 TILE_OPC_LW_NA,
157 TILE_OPC_LW_NA_SN,
158 TILE_OPC_LWADD,
159 TILE_OPC_LWADD_SN,
160 TILE_OPC_LWADD_NA,
161 TILE_OPC_LWADD_NA_SN,
162 TILE_OPC_MAXB_U,
163 TILE_OPC_MAXB_U_SN,
164 TILE_OPC_MAXH,
165 TILE_OPC_MAXH_SN,
166 TILE_OPC_MAXIB_U,
167 TILE_OPC_MAXIB_U_SN,
168 TILE_OPC_MAXIH,
169 TILE_OPC_MAXIH_SN,
170 TILE_OPC_MF,
171 TILE_OPC_MFSPR,
172 TILE_OPC_MINB_U,
173 TILE_OPC_MINB_U_SN,
174 TILE_OPC_MINH,
175 TILE_OPC_MINH_SN,
176 TILE_OPC_MINIB_U,
177 TILE_OPC_MINIB_U_SN,
178 TILE_OPC_MINIH,
179 TILE_OPC_MINIH_SN,
180 TILE_OPC_MM,
181 TILE_OPC_MNZ,
182 TILE_OPC_MNZ_SN,
183 TILE_OPC_MNZB,
184 TILE_OPC_MNZB_SN,
185 TILE_OPC_MNZH,
186 TILE_OPC_MNZH_SN,
187 TILE_OPC_MTSPR,
188 TILE_OPC_MULHH_SS,
189 TILE_OPC_MULHH_SS_SN,
190 TILE_OPC_MULHH_SU,
191 TILE_OPC_MULHH_SU_SN,
192 TILE_OPC_MULHH_UU,
193 TILE_OPC_MULHH_UU_SN,
194 TILE_OPC_MULHHA_SS,
195 TILE_OPC_MULHHA_SS_SN,
196 TILE_OPC_MULHHA_SU,
197 TILE_OPC_MULHHA_SU_SN,
198 TILE_OPC_MULHHA_UU,
199 TILE_OPC_MULHHA_UU_SN,
200 TILE_OPC_MULHHSA_UU,
201 TILE_OPC_MULHHSA_UU_SN,
202 TILE_OPC_MULHL_SS,
203 TILE_OPC_MULHL_SS_SN,
204 TILE_OPC_MULHL_SU,
205 TILE_OPC_MULHL_SU_SN,
206 TILE_OPC_MULHL_US,
207 TILE_OPC_MULHL_US_SN,
208 TILE_OPC_MULHL_UU,
209 TILE_OPC_MULHL_UU_SN,
210 TILE_OPC_MULHLA_SS,
211 TILE_OPC_MULHLA_SS_SN,
212 TILE_OPC_MULHLA_SU,
213 TILE_OPC_MULHLA_SU_SN,
214 TILE_OPC_MULHLA_US,
215 TILE_OPC_MULHLA_US_SN,
216 TILE_OPC_MULHLA_UU,
217 TILE_OPC_MULHLA_UU_SN,
218 TILE_OPC_MULHLSA_UU,
219 TILE_OPC_MULHLSA_UU_SN,
220 TILE_OPC_MULLL_SS,
221 TILE_OPC_MULLL_SS_SN,
222 TILE_OPC_MULLL_SU,
223 TILE_OPC_MULLL_SU_SN,
224 TILE_OPC_MULLL_UU,
225 TILE_OPC_MULLL_UU_SN,
226 TILE_OPC_MULLLA_SS,
227 TILE_OPC_MULLLA_SS_SN,
228 TILE_OPC_MULLLA_SU,
229 TILE_OPC_MULLLA_SU_SN,
230 TILE_OPC_MULLLA_UU,
231 TILE_OPC_MULLLA_UU_SN,
232 TILE_OPC_MULLLSA_UU,
233 TILE_OPC_MULLLSA_UU_SN,
234 TILE_OPC_MVNZ,
235 TILE_OPC_MVNZ_SN,
236 TILE_OPC_MVZ,
237 TILE_OPC_MVZ_SN,
238 TILE_OPC_MZ,
239 TILE_OPC_MZ_SN,
240 TILE_OPC_MZB,
241 TILE_OPC_MZB_SN,
242 TILE_OPC_MZH,
243 TILE_OPC_MZH_SN,
244 TILE_OPC_NAP,
245 TILE_OPC_NOP,
246 TILE_OPC_NOR,
247 TILE_OPC_NOR_SN,
248 TILE_OPC_OR,
249 TILE_OPC_OR_SN,
250 TILE_OPC_ORI,
251 TILE_OPC_ORI_SN,
252 TILE_OPC_PACKBS_U,
253 TILE_OPC_PACKBS_U_SN,
254 TILE_OPC_PACKHB,
255 TILE_OPC_PACKHB_SN,
256 TILE_OPC_PACKHS,
257 TILE_OPC_PACKHS_SN,
258 TILE_OPC_PACKLB,
259 TILE_OPC_PACKLB_SN,
260 TILE_OPC_PCNT,
261 TILE_OPC_PCNT_SN,
262 TILE_OPC_RL,
263 TILE_OPC_RL_SN,
264 TILE_OPC_RLI,
265 TILE_OPC_RLI_SN,
266 TILE_OPC_S1A,
267 TILE_OPC_S1A_SN,
268 TILE_OPC_S2A,
269 TILE_OPC_S2A_SN,
270 TILE_OPC_S3A,
271 TILE_OPC_S3A_SN,
272 TILE_OPC_SADAB_U,
273 TILE_OPC_SADAB_U_SN,
274 TILE_OPC_SADAH,
275 TILE_OPC_SADAH_SN,
276 TILE_OPC_SADAH_U,
277 TILE_OPC_SADAH_U_SN,
278 TILE_OPC_SADB_U,
279 TILE_OPC_SADB_U_SN,
280 TILE_OPC_SADH,
281 TILE_OPC_SADH_SN,
282 TILE_OPC_SADH_U,
283 TILE_OPC_SADH_U_SN,
284 TILE_OPC_SB,
285 TILE_OPC_SBADD,
286 TILE_OPC_SEQ,
287 TILE_OPC_SEQ_SN,
288 TILE_OPC_SEQB,
289 TILE_OPC_SEQB_SN,
290 TILE_OPC_SEQH,
291 TILE_OPC_SEQH_SN,
292 TILE_OPC_SEQI,
293 TILE_OPC_SEQI_SN,
294 TILE_OPC_SEQIB,
295 TILE_OPC_SEQIB_SN,
296 TILE_OPC_SEQIH,
297 TILE_OPC_SEQIH_SN,
298 TILE_OPC_SH,
299 TILE_OPC_SHADD,
300 TILE_OPC_SHL,
301 TILE_OPC_SHL_SN,
302 TILE_OPC_SHLB,
303 TILE_OPC_SHLB_SN,
304 TILE_OPC_SHLH,
305 TILE_OPC_SHLH_SN,
306 TILE_OPC_SHLI,
307 TILE_OPC_SHLI_SN,
308 TILE_OPC_SHLIB,
309 TILE_OPC_SHLIB_SN,
310 TILE_OPC_SHLIH,
311 TILE_OPC_SHLIH_SN,
312 TILE_OPC_SHR,
313 TILE_OPC_SHR_SN,
314 TILE_OPC_SHRB,
315 TILE_OPC_SHRB_SN,
316 TILE_OPC_SHRH,
317 TILE_OPC_SHRH_SN,
318 TILE_OPC_SHRI,
319 TILE_OPC_SHRI_SN,
320 TILE_OPC_SHRIB,
321 TILE_OPC_SHRIB_SN,
322 TILE_OPC_SHRIH,
323 TILE_OPC_SHRIH_SN,
324 TILE_OPC_SLT,
325 TILE_OPC_SLT_SN,
326 TILE_OPC_SLT_U,
327 TILE_OPC_SLT_U_SN,
328 TILE_OPC_SLTB,
329 TILE_OPC_SLTB_SN,
330 TILE_OPC_SLTB_U,
331 TILE_OPC_SLTB_U_SN,
332 TILE_OPC_SLTE,
333 TILE_OPC_SLTE_SN,
334 TILE_OPC_SLTE_U,
335 TILE_OPC_SLTE_U_SN,
336 TILE_OPC_SLTEB,
337 TILE_OPC_SLTEB_SN,
338 TILE_OPC_SLTEB_U,
339 TILE_OPC_SLTEB_U_SN,
340 TILE_OPC_SLTEH,
341 TILE_OPC_SLTEH_SN,
342 TILE_OPC_SLTEH_U,
343 TILE_OPC_SLTEH_U_SN,
344 TILE_OPC_SLTH,
345 TILE_OPC_SLTH_SN,
346 TILE_OPC_SLTH_U,
347 TILE_OPC_SLTH_U_SN,
348 TILE_OPC_SLTI,
349 TILE_OPC_SLTI_SN,
350 TILE_OPC_SLTI_U,
351 TILE_OPC_SLTI_U_SN,
352 TILE_OPC_SLTIB,
353 TILE_OPC_SLTIB_SN,
354 TILE_OPC_SLTIB_U,
355 TILE_OPC_SLTIB_U_SN,
356 TILE_OPC_SLTIH,
357 TILE_OPC_SLTIH_SN,
358 TILE_OPC_SLTIH_U,
359 TILE_OPC_SLTIH_U_SN,
360 TILE_OPC_SNE,
361 TILE_OPC_SNE_SN,
362 TILE_OPC_SNEB,
363 TILE_OPC_SNEB_SN,
364 TILE_OPC_SNEH,
365 TILE_OPC_SNEH_SN,
366 TILE_OPC_SRA,
367 TILE_OPC_SRA_SN,
368 TILE_OPC_SRAB,
369 TILE_OPC_SRAB_SN,
370 TILE_OPC_SRAH,
371 TILE_OPC_SRAH_SN,
372 TILE_OPC_SRAI,
373 TILE_OPC_SRAI_SN,
374 TILE_OPC_SRAIB,
375 TILE_OPC_SRAIB_SN,
376 TILE_OPC_SRAIH,
377 TILE_OPC_SRAIH_SN,
378 TILE_OPC_SUB,
379 TILE_OPC_SUB_SN,
380 TILE_OPC_SUBB,
381 TILE_OPC_SUBB_SN,
382 TILE_OPC_SUBBS_U,
383 TILE_OPC_SUBBS_U_SN,
384 TILE_OPC_SUBH,
385 TILE_OPC_SUBH_SN,
386 TILE_OPC_SUBHS,
387 TILE_OPC_SUBHS_SN,
388 TILE_OPC_SUBS,
389 TILE_OPC_SUBS_SN,
390 TILE_OPC_SW,
391 TILE_OPC_SWADD,
392 TILE_OPC_SWINT0,
393 TILE_OPC_SWINT1,
394 TILE_OPC_SWINT2,
395 TILE_OPC_SWINT3,
396 TILE_OPC_TBLIDXB0,
397 TILE_OPC_TBLIDXB0_SN,
398 TILE_OPC_TBLIDXB1,
399 TILE_OPC_TBLIDXB1_SN,
400 TILE_OPC_TBLIDXB2,
401 TILE_OPC_TBLIDXB2_SN,
402 TILE_OPC_TBLIDXB3,
403 TILE_OPC_TBLIDXB3_SN,
404 TILE_OPC_TNS,
405 TILE_OPC_TNS_SN,
406 TILE_OPC_WH64,
407 TILE_OPC_XOR,
408 TILE_OPC_XOR_SN,
409 TILE_OPC_XORI,
410 TILE_OPC_XORI_SN,
411 TILE_OPC_NONE
412} tile_mnemonic;
413
414/* 64-bit pattern for a { bpt ; nop } bundle. */
415#define TILE_BPT_BUNDLE 0x400b3cae70166000ULL
416
417
418#define TILE_ELF_MACHINE_CODE EM_TILEPRO
419
420#define TILE_ELF_NAME "elf32-tilepro"
421
422enum
423{
424 TILE_SN_MAX_OPERANDS = 6 /* route */
425};
426
427typedef enum
428{
429 TILE_SN_OPC_BZ,
430 TILE_SN_OPC_BNZ,
431 TILE_SN_OPC_JRR,
432 TILE_SN_OPC_FNOP,
433 TILE_SN_OPC_BLZ,
434 TILE_SN_OPC_NOP,
435 TILE_SN_OPC_MOVEI,
436 TILE_SN_OPC_MOVE,
437 TILE_SN_OPC_BGEZ,
438 TILE_SN_OPC_JR,
439 TILE_SN_OPC_BLEZ,
440 TILE_SN_OPC_BBNS,
441 TILE_SN_OPC_JALRR,
442 TILE_SN_OPC_BPT,
443 TILE_SN_OPC_JALR,
444 TILE_SN_OPC_SHR1,
445 TILE_SN_OPC_BGZ,
446 TILE_SN_OPC_BBS,
447 TILE_SN_OPC_SHL8II,
448 TILE_SN_OPC_ADDI,
449 TILE_SN_OPC_HALT,
450 TILE_SN_OPC_ROUTE,
451 TILE_SN_OPC_NONE
452} tile_sn_mnemonic;
453
454extern const unsigned char tile_sn_route_encode[6 * 6 * 6];
455extern const signed char tile_sn_route_decode[256][3];
456extern const char tile_sn_direction_names[6][5];
457extern const signed char tile_sn_dest_map[6][6];
458
459
460static __inline unsigned int
461get_BrOff_SN(tile_bundle_bits num)
462{
463 const unsigned int n = (unsigned int)num;
464 return (((n >> 0)) & 0x3ff);
465}
466
467static __inline unsigned int
468get_BrOff_X1(tile_bundle_bits n)
469{
470 return (((unsigned int)(n >> 43)) & 0x00007fff) |
471 (((unsigned int)(n >> 20)) & 0x00018000);
472}
473
474static __inline unsigned int
475get_BrType_X1(tile_bundle_bits n)
476{
477 return (((unsigned int)(n >> 31)) & 0xf);
478}
479
480static __inline unsigned int
481get_Dest_Imm8_X1(tile_bundle_bits n)
482{
483 return (((unsigned int)(n >> 31)) & 0x0000003f) |
484 (((unsigned int)(n >> 43)) & 0x000000c0);
485}
486
487static __inline unsigned int
488get_Dest_SN(tile_bundle_bits num)
489{
490 const unsigned int n = (unsigned int)num;
491 return (((n >> 2)) & 0x3);
492}
493
494static __inline unsigned int
495get_Dest_X0(tile_bundle_bits num)
496{
497 const unsigned int n = (unsigned int)num;
498 return (((n >> 0)) & 0x3f);
499}
500
501static __inline unsigned int
502get_Dest_X1(tile_bundle_bits n)
503{
504 return (((unsigned int)(n >> 31)) & 0x3f);
505}
506
507static __inline unsigned int
508get_Dest_Y0(tile_bundle_bits num)
509{
510 const unsigned int n = (unsigned int)num;
511 return (((n >> 0)) & 0x3f);
512}
513
514static __inline unsigned int
515get_Dest_Y1(tile_bundle_bits n)
516{
517 return (((unsigned int)(n >> 31)) & 0x3f);
518}
519
520static __inline unsigned int
521get_Imm16_X0(tile_bundle_bits num)
522{
523 const unsigned int n = (unsigned int)num;
524 return (((n >> 12)) & 0xffff);
525}
526
527static __inline unsigned int
528get_Imm16_X1(tile_bundle_bits n)
529{
530 return (((unsigned int)(n >> 43)) & 0xffff);
531}
532
533static __inline unsigned int
534get_Imm8_SN(tile_bundle_bits num)
535{
536 const unsigned int n = (unsigned int)num;
537 return (((n >> 0)) & 0xff);
538}
539
540static __inline unsigned int
541get_Imm8_X0(tile_bundle_bits num)
542{
543 const unsigned int n = (unsigned int)num;
544 return (((n >> 12)) & 0xff);
545}
546
547static __inline unsigned int
548get_Imm8_X1(tile_bundle_bits n)
549{
550 return (((unsigned int)(n >> 43)) & 0xff);
551}
552
553static __inline unsigned int
554get_Imm8_Y0(tile_bundle_bits num)
555{
556 const unsigned int n = (unsigned int)num;
557 return (((n >> 12)) & 0xff);
558}
559
560static __inline unsigned int
561get_Imm8_Y1(tile_bundle_bits n)
562{
563 return (((unsigned int)(n >> 43)) & 0xff);
564}
565
566static __inline unsigned int
567get_ImmOpcodeExtension_X0(tile_bundle_bits num)
568{
569 const unsigned int n = (unsigned int)num;
570 return (((n >> 20)) & 0x7f);
571}
572
573static __inline unsigned int
574get_ImmOpcodeExtension_X1(tile_bundle_bits n)
575{
576 return (((unsigned int)(n >> 51)) & 0x7f);
577}
578
579static __inline unsigned int
580get_ImmRROpcodeExtension_SN(tile_bundle_bits num)
581{
582 const unsigned int n = (unsigned int)num;
583 return (((n >> 8)) & 0x3);
584}
585
586static __inline unsigned int
587get_JOffLong_X1(tile_bundle_bits n)
588{
589 return (((unsigned int)(n >> 43)) & 0x00007fff) |
590 (((unsigned int)(n >> 20)) & 0x00018000) |
591 (((unsigned int)(n >> 14)) & 0x001e0000) |
592 (((unsigned int)(n >> 16)) & 0x07e00000) |
593 (((unsigned int)(n >> 31)) & 0x18000000);
594}
595
596static __inline unsigned int
597get_JOff_X1(tile_bundle_bits n)
598{
599 return (((unsigned int)(n >> 43)) & 0x00007fff) |
600 (((unsigned int)(n >> 20)) & 0x00018000) |
601 (((unsigned int)(n >> 14)) & 0x001e0000) |
602 (((unsigned int)(n >> 16)) & 0x07e00000) |
603 (((unsigned int)(n >> 31)) & 0x08000000);
604}
605
606static __inline unsigned int
607get_MF_Imm15_X1(tile_bundle_bits n)
608{
609 return (((unsigned int)(n >> 37)) & 0x00003fff) |
610 (((unsigned int)(n >> 44)) & 0x00004000);
611}
612
613static __inline unsigned int
614get_MMEnd_X0(tile_bundle_bits num)
615{
616 const unsigned int n = (unsigned int)num;
617 return (((n >> 18)) & 0x1f);
618}
619
620static __inline unsigned int
621get_MMEnd_X1(tile_bundle_bits n)
622{
623 return (((unsigned int)(n >> 49)) & 0x1f);
624}
625
626static __inline unsigned int
627get_MMStart_X0(tile_bundle_bits num)
628{
629 const unsigned int n = (unsigned int)num;
630 return (((n >> 23)) & 0x1f);
631}
632
633static __inline unsigned int
634get_MMStart_X1(tile_bundle_bits n)
635{
636 return (((unsigned int)(n >> 54)) & 0x1f);
637}
638
639static __inline unsigned int
640get_MT_Imm15_X1(tile_bundle_bits n)
641{
642 return (((unsigned int)(n >> 31)) & 0x0000003f) |
643 (((unsigned int)(n >> 37)) & 0x00003fc0) |
644 (((unsigned int)(n >> 44)) & 0x00004000);
645}
646
647static __inline unsigned int
648get_Mode(tile_bundle_bits n)
649{
650 return (((unsigned int)(n >> 63)) & 0x1);
651}
652
653static __inline unsigned int
654get_NoRegOpcodeExtension_SN(tile_bundle_bits num)
655{
656 const unsigned int n = (unsigned int)num;
657 return (((n >> 0)) & 0xf);
658}
659
660static __inline unsigned int
661get_Opcode_SN(tile_bundle_bits num)
662{
663 const unsigned int n = (unsigned int)num;
664 return (((n >> 10)) & 0x3f);
665}
666
667static __inline unsigned int
668get_Opcode_X0(tile_bundle_bits num)
669{
670 const unsigned int n = (unsigned int)num;
671 return (((n >> 28)) & 0x7);
672}
673
674static __inline unsigned int
675get_Opcode_X1(tile_bundle_bits n)
676{
677 return (((unsigned int)(n >> 59)) & 0xf);
678}
679
680static __inline unsigned int
681get_Opcode_Y0(tile_bundle_bits num)
682{
683 const unsigned int n = (unsigned int)num;
684 return (((n >> 27)) & 0xf);
685}
686
687static __inline unsigned int
688get_Opcode_Y1(tile_bundle_bits n)
689{
690 return (((unsigned int)(n >> 59)) & 0xf);
691}
692
693static __inline unsigned int
694get_Opcode_Y2(tile_bundle_bits n)
695{
696 return (((unsigned int)(n >> 56)) & 0x7);
697}
698
699static __inline unsigned int
700get_RROpcodeExtension_SN(tile_bundle_bits num)
701{
702 const unsigned int n = (unsigned int)num;
703 return (((n >> 4)) & 0xf);
704}
705
706static __inline unsigned int
707get_RRROpcodeExtension_X0(tile_bundle_bits num)
708{
709 const unsigned int n = (unsigned int)num;
710 return (((n >> 18)) & 0x1ff);
711}
712
713static __inline unsigned int
714get_RRROpcodeExtension_X1(tile_bundle_bits n)
715{
716 return (((unsigned int)(n >> 49)) & 0x1ff);
717}
718
719static __inline unsigned int
720get_RRROpcodeExtension_Y0(tile_bundle_bits num)
721{
722 const unsigned int n = (unsigned int)num;
723 return (((n >> 18)) & 0x3);
724}
725
726static __inline unsigned int
727get_RRROpcodeExtension_Y1(tile_bundle_bits n)
728{
729 return (((unsigned int)(n >> 49)) & 0x3);
730}
731
732static __inline unsigned int
733get_RouteOpcodeExtension_SN(tile_bundle_bits num)
734{
735 const unsigned int n = (unsigned int)num;
736 return (((n >> 0)) & 0x3ff);
737}
738
739static __inline unsigned int
740get_S_X0(tile_bundle_bits num)
741{
742 const unsigned int n = (unsigned int)num;
743 return (((n >> 27)) & 0x1);
744}
745
746static __inline unsigned int
747get_S_X1(tile_bundle_bits n)
748{
749 return (((unsigned int)(n >> 58)) & 0x1);
750}
751
752static __inline unsigned int
753get_ShAmt_X0(tile_bundle_bits num)
754{
755 const unsigned int n = (unsigned int)num;
756 return (((n >> 12)) & 0x1f);
757}
758
759static __inline unsigned int
760get_ShAmt_X1(tile_bundle_bits n)
761{
762 return (((unsigned int)(n >> 43)) & 0x1f);
763}
764
765static __inline unsigned int
766get_ShAmt_Y0(tile_bundle_bits num)
767{
768 const unsigned int n = (unsigned int)num;
769 return (((n >> 12)) & 0x1f);
770}
771
772static __inline unsigned int
773get_ShAmt_Y1(tile_bundle_bits n)
774{
775 return (((unsigned int)(n >> 43)) & 0x1f);
776}
777
778static __inline unsigned int
779get_SrcA_X0(tile_bundle_bits num)
780{
781 const unsigned int n = (unsigned int)num;
782 return (((n >> 6)) & 0x3f);
783}
784
785static __inline unsigned int
786get_SrcA_X1(tile_bundle_bits n)
787{
788 return (((unsigned int)(n >> 37)) & 0x3f);
789}
790
791static __inline unsigned int
792get_SrcA_Y0(tile_bundle_bits num)
793{
794 const unsigned int n = (unsigned int)num;
795 return (((n >> 6)) & 0x3f);
796}
797
798static __inline unsigned int
799get_SrcA_Y1(tile_bundle_bits n)
800{
801 return (((unsigned int)(n >> 37)) & 0x3f);
802}
803
804static __inline unsigned int
805get_SrcA_Y2(tile_bundle_bits n)
806{
807 return (((n >> 26)) & 0x00000001) |
808 (((unsigned int)(n >> 50)) & 0x0000003e);
809}
810
811static __inline unsigned int
812get_SrcBDest_Y2(tile_bundle_bits num)
813{
814 const unsigned int n = (unsigned int)num;
815 return (((n >> 20)) & 0x3f);
816}
817
818static __inline unsigned int
819get_SrcB_X0(tile_bundle_bits num)
820{
821 const unsigned int n = (unsigned int)num;
822 return (((n >> 12)) & 0x3f);
823}
824
825static __inline unsigned int
826get_SrcB_X1(tile_bundle_bits n)
827{
828 return (((unsigned int)(n >> 43)) & 0x3f);
829}
830
831static __inline unsigned int
832get_SrcB_Y0(tile_bundle_bits num)
833{
834 const unsigned int n = (unsigned int)num;
835 return (((n >> 12)) & 0x3f);
836}
837
838static __inline unsigned int
839get_SrcB_Y1(tile_bundle_bits n)
840{
841 return (((unsigned int)(n >> 43)) & 0x3f);
842}
843
844static __inline unsigned int
845get_Src_SN(tile_bundle_bits num)
846{
847 const unsigned int n = (unsigned int)num;
848 return (((n >> 0)) & 0x3);
849}
850
851static __inline unsigned int
852get_UnOpcodeExtension_X0(tile_bundle_bits num)
853{
854 const unsigned int n = (unsigned int)num;
855 return (((n >> 12)) & 0x1f);
856}
857
858static __inline unsigned int
859get_UnOpcodeExtension_X1(tile_bundle_bits n)
860{
861 return (((unsigned int)(n >> 43)) & 0x1f);
862}
863
864static __inline unsigned int
865get_UnOpcodeExtension_Y0(tile_bundle_bits num)
866{
867 const unsigned int n = (unsigned int)num;
868 return (((n >> 12)) & 0x1f);
869}
870
871static __inline unsigned int
872get_UnOpcodeExtension_Y1(tile_bundle_bits n)
873{
874 return (((unsigned int)(n >> 43)) & 0x1f);
875}
876
877static __inline unsigned int
878get_UnShOpcodeExtension_X0(tile_bundle_bits num)
879{
880 const unsigned int n = (unsigned int)num;
881 return (((n >> 17)) & 0x3ff);
882}
883
884static __inline unsigned int
885get_UnShOpcodeExtension_X1(tile_bundle_bits n)
886{
887 return (((unsigned int)(n >> 48)) & 0x3ff);
888}
889
890static __inline unsigned int
891get_UnShOpcodeExtension_Y0(tile_bundle_bits num)
892{
893 const unsigned int n = (unsigned int)num;
894 return (((n >> 17)) & 0x7);
895}
896
897static __inline unsigned int
898get_UnShOpcodeExtension_Y1(tile_bundle_bits n)
899{
900 return (((unsigned int)(n >> 48)) & 0x7);
901}
902
903
904static __inline int
905sign_extend(int n, int num_bits)
906{
907 int shift = (int)(sizeof(int) * 8 - num_bits);
908 return (n << shift) >> shift;
909}
910
911
912
913static __inline tile_bundle_bits
914create_BrOff_SN(int num)
915{
916 const unsigned int n = (unsigned int)num;
917 return ((n & 0x3ff) << 0);
918}
919
920static __inline tile_bundle_bits
921create_BrOff_X1(int num)
922{
923 const unsigned int n = (unsigned int)num;
924 return (((tile_bundle_bits)(n & 0x00007fff)) << 43) |
925 (((tile_bundle_bits)(n & 0x00018000)) << 20);
926}
927
928static __inline tile_bundle_bits
929create_BrType_X1(int num)
930{
931 const unsigned int n = (unsigned int)num;
932 return (((tile_bundle_bits)(n & 0xf)) << 31);
933}
934
935static __inline tile_bundle_bits
936create_Dest_Imm8_X1(int num)
937{
938 const unsigned int n = (unsigned int)num;
939 return (((tile_bundle_bits)(n & 0x0000003f)) << 31) |
940 (((tile_bundle_bits)(n & 0x000000c0)) << 43);
941}
942
943static __inline tile_bundle_bits
944create_Dest_SN(int num)
945{
946 const unsigned int n = (unsigned int)num;
947 return ((n & 0x3) << 2);
948}
949
950static __inline tile_bundle_bits
951create_Dest_X0(int num)
952{
953 const unsigned int n = (unsigned int)num;
954 return ((n & 0x3f) << 0);
955}
956
957static __inline tile_bundle_bits
958create_Dest_X1(int num)
959{
960 const unsigned int n = (unsigned int)num;
961 return (((tile_bundle_bits)(n & 0x3f)) << 31);
962}
963
964static __inline tile_bundle_bits
965create_Dest_Y0(int num)
966{
967 const unsigned int n = (unsigned int)num;
968 return ((n & 0x3f) << 0);
969}
970
971static __inline tile_bundle_bits
972create_Dest_Y1(int num)
973{
974 const unsigned int n = (unsigned int)num;
975 return (((tile_bundle_bits)(n & 0x3f)) << 31);
976}
977
978static __inline tile_bundle_bits
979create_Imm16_X0(int num)
980{
981 const unsigned int n = (unsigned int)num;
982 return ((n & 0xffff) << 12);
983}
984
985static __inline tile_bundle_bits
986create_Imm16_X1(int num)
987{
988 const unsigned int n = (unsigned int)num;
989 return (((tile_bundle_bits)(n & 0xffff)) << 43);
990}
991
992static __inline tile_bundle_bits
993create_Imm8_SN(int num)
994{
995 const unsigned int n = (unsigned int)num;
996 return ((n & 0xff) << 0);
997}
998
999static __inline tile_bundle_bits
1000create_Imm8_X0(int num)
1001{
1002 const unsigned int n = (unsigned int)num;
1003 return ((n & 0xff) << 12);
1004}
1005
1006static __inline tile_bundle_bits
1007create_Imm8_X1(int num)
1008{
1009 const unsigned int n = (unsigned int)num;
1010 return (((tile_bundle_bits)(n & 0xff)) << 43);
1011}
1012
1013static __inline tile_bundle_bits
1014create_Imm8_Y0(int num)
1015{
1016 const unsigned int n = (unsigned int)num;
1017 return ((n & 0xff) << 12);
1018}
1019
1020static __inline tile_bundle_bits
1021create_Imm8_Y1(int num)
1022{
1023 const unsigned int n = (unsigned int)num;
1024 return (((tile_bundle_bits)(n & 0xff)) << 43);
1025}
1026
1027static __inline tile_bundle_bits
1028create_ImmOpcodeExtension_X0(int num)
1029{
1030 const unsigned int n = (unsigned int)num;
1031 return ((n & 0x7f) << 20);
1032}
1033
1034static __inline tile_bundle_bits
1035create_ImmOpcodeExtension_X1(int num)
1036{
1037 const unsigned int n = (unsigned int)num;
1038 return (((tile_bundle_bits)(n & 0x7f)) << 51);
1039}
1040
1041static __inline tile_bundle_bits
1042create_ImmRROpcodeExtension_SN(int num)
1043{
1044 const unsigned int n = (unsigned int)num;
1045 return ((n & 0x3) << 8);
1046}
1047
1048static __inline tile_bundle_bits
1049create_JOffLong_X1(int num)
1050{
1051 const unsigned int n = (unsigned int)num;
1052 return (((tile_bundle_bits)(n & 0x00007fff)) << 43) |
1053 (((tile_bundle_bits)(n & 0x00018000)) << 20) |
1054 (((tile_bundle_bits)(n & 0x001e0000)) << 14) |
1055 (((tile_bundle_bits)(n & 0x07e00000)) << 16) |
1056 (((tile_bundle_bits)(n & 0x18000000)) << 31);
1057}
1058
1059static __inline tile_bundle_bits
1060create_JOff_X1(int num)
1061{
1062 const unsigned int n = (unsigned int)num;
1063 return (((tile_bundle_bits)(n & 0x00007fff)) << 43) |
1064 (((tile_bundle_bits)(n & 0x00018000)) << 20) |
1065 (((tile_bundle_bits)(n & 0x001e0000)) << 14) |
1066 (((tile_bundle_bits)(n & 0x07e00000)) << 16) |
1067 (((tile_bundle_bits)(n & 0x08000000)) << 31);
1068}
1069
1070static __inline tile_bundle_bits
1071create_MF_Imm15_X1(int num)
1072{
1073 const unsigned int n = (unsigned int)num;
1074 return (((tile_bundle_bits)(n & 0x00003fff)) << 37) |
1075 (((tile_bundle_bits)(n & 0x00004000)) << 44);
1076}
1077
1078static __inline tile_bundle_bits
1079create_MMEnd_X0(int num)
1080{
1081 const unsigned int n = (unsigned int)num;
1082 return ((n & 0x1f) << 18);
1083}
1084
1085static __inline tile_bundle_bits
1086create_MMEnd_X1(int num)
1087{
1088 const unsigned int n = (unsigned int)num;
1089 return (((tile_bundle_bits)(n & 0x1f)) << 49);
1090}
1091
1092static __inline tile_bundle_bits
1093create_MMStart_X0(int num)
1094{
1095 const unsigned int n = (unsigned int)num;
1096 return ((n & 0x1f) << 23);
1097}
1098
1099static __inline tile_bundle_bits
1100create_MMStart_X1(int num)
1101{
1102 const unsigned int n = (unsigned int)num;
1103 return (((tile_bundle_bits)(n & 0x1f)) << 54);
1104}
1105
1106static __inline tile_bundle_bits
1107create_MT_Imm15_X1(int num)
1108{
1109 const unsigned int n = (unsigned int)num;
1110 return (((tile_bundle_bits)(n & 0x0000003f)) << 31) |
1111 (((tile_bundle_bits)(n & 0x00003fc0)) << 37) |
1112 (((tile_bundle_bits)(n & 0x00004000)) << 44);
1113}
1114
1115static __inline tile_bundle_bits
1116create_Mode(int num)
1117{
1118 const unsigned int n = (unsigned int)num;
1119 return (((tile_bundle_bits)(n & 0x1)) << 63);
1120}
1121
1122static __inline tile_bundle_bits
1123create_NoRegOpcodeExtension_SN(int num)
1124{
1125 const unsigned int n = (unsigned int)num;
1126 return ((n & 0xf) << 0);
1127}
1128
1129static __inline tile_bundle_bits
1130create_Opcode_SN(int num)
1131{
1132 const unsigned int n = (unsigned int)num;
1133 return ((n & 0x3f) << 10);
1134}
1135
1136static __inline tile_bundle_bits
1137create_Opcode_X0(int num)
1138{
1139 const unsigned int n = (unsigned int)num;
1140 return ((n & 0x7) << 28);
1141}
1142
1143static __inline tile_bundle_bits
1144create_Opcode_X1(int num)
1145{
1146 const unsigned int n = (unsigned int)num;
1147 return (((tile_bundle_bits)(n & 0xf)) << 59);
1148}
1149
1150static __inline tile_bundle_bits
1151create_Opcode_Y0(int num)
1152{
1153 const unsigned int n = (unsigned int)num;
1154 return ((n & 0xf) << 27);
1155}
1156
1157static __inline tile_bundle_bits
1158create_Opcode_Y1(int num)
1159{
1160 const unsigned int n = (unsigned int)num;
1161 return (((tile_bundle_bits)(n & 0xf)) << 59);
1162}
1163
1164static __inline tile_bundle_bits
1165create_Opcode_Y2(int num)
1166{
1167 const unsigned int n = (unsigned int)num;
1168 return (((tile_bundle_bits)(n & 0x7)) << 56);
1169}
1170
1171static __inline tile_bundle_bits
1172create_RROpcodeExtension_SN(int num)
1173{
1174 const unsigned int n = (unsigned int)num;
1175 return ((n & 0xf) << 4);
1176}
1177
1178static __inline tile_bundle_bits
1179create_RRROpcodeExtension_X0(int num)
1180{
1181 const unsigned int n = (unsigned int)num;
1182 return ((n & 0x1ff) << 18);
1183}
1184
1185static __inline tile_bundle_bits
1186create_RRROpcodeExtension_X1(int num)
1187{
1188 const unsigned int n = (unsigned int)num;
1189 return (((tile_bundle_bits)(n & 0x1ff)) << 49);
1190}
1191
1192static __inline tile_bundle_bits
1193create_RRROpcodeExtension_Y0(int num)
1194{
1195 const unsigned int n = (unsigned int)num;
1196 return ((n & 0x3) << 18);
1197}
1198
1199static __inline tile_bundle_bits
1200create_RRROpcodeExtension_Y1(int num)
1201{
1202 const unsigned int n = (unsigned int)num;
1203 return (((tile_bundle_bits)(n & 0x3)) << 49);
1204}
1205
1206static __inline tile_bundle_bits
1207create_RouteOpcodeExtension_SN(int num)
1208{
1209 const unsigned int n = (unsigned int)num;
1210 return ((n & 0x3ff) << 0);
1211}
1212
1213static __inline tile_bundle_bits
1214create_S_X0(int num)
1215{
1216 const unsigned int n = (unsigned int)num;
1217 return ((n & 0x1) << 27);
1218}
1219
1220static __inline tile_bundle_bits
1221create_S_X1(int num)
1222{
1223 const unsigned int n = (unsigned int)num;
1224 return (((tile_bundle_bits)(n & 0x1)) << 58);
1225}
1226
1227static __inline tile_bundle_bits
1228create_ShAmt_X0(int num)
1229{
1230 const unsigned int n = (unsigned int)num;
1231 return ((n & 0x1f) << 12);
1232}
1233
1234static __inline tile_bundle_bits
1235create_ShAmt_X1(int num)
1236{
1237 const unsigned int n = (unsigned int)num;
1238 return (((tile_bundle_bits)(n & 0x1f)) << 43);
1239}
1240
1241static __inline tile_bundle_bits
1242create_ShAmt_Y0(int num)
1243{
1244 const unsigned int n = (unsigned int)num;
1245 return ((n & 0x1f) << 12);
1246}
1247
1248static __inline tile_bundle_bits
1249create_ShAmt_Y1(int num)
1250{
1251 const unsigned int n = (unsigned int)num;
1252 return (((tile_bundle_bits)(n & 0x1f)) << 43);
1253}
1254
1255static __inline tile_bundle_bits
1256create_SrcA_X0(int num)
1257{
1258 const unsigned int n = (unsigned int)num;
1259 return ((n & 0x3f) << 6);
1260}
1261
1262static __inline tile_bundle_bits
1263create_SrcA_X1(int num)
1264{
1265 const unsigned int n = (unsigned int)num;
1266 return (((tile_bundle_bits)(n & 0x3f)) << 37);
1267}
1268
1269static __inline tile_bundle_bits
1270create_SrcA_Y0(int num)
1271{
1272 const unsigned int n = (unsigned int)num;
1273 return ((n & 0x3f) << 6);
1274}
1275
1276static __inline tile_bundle_bits
1277create_SrcA_Y1(int num)
1278{
1279 const unsigned int n = (unsigned int)num;
1280 return (((tile_bundle_bits)(n & 0x3f)) << 37);
1281}
1282
1283static __inline tile_bundle_bits
1284create_SrcA_Y2(int num)
1285{
1286 const unsigned int n = (unsigned int)num;
1287 return ((n & 0x00000001) << 26) |
1288 (((tile_bundle_bits)(n & 0x0000003e)) << 50);
1289}
1290
1291static __inline tile_bundle_bits
1292create_SrcBDest_Y2(int num)
1293{
1294 const unsigned int n = (unsigned int)num;
1295 return ((n & 0x3f) << 20);
1296}
1297
1298static __inline tile_bundle_bits
1299create_SrcB_X0(int num)
1300{
1301 const unsigned int n = (unsigned int)num;
1302 return ((n & 0x3f) << 12);
1303}
1304
1305static __inline tile_bundle_bits
1306create_SrcB_X1(int num)
1307{
1308 const unsigned int n = (unsigned int)num;
1309 return (((tile_bundle_bits)(n & 0x3f)) << 43);
1310}
1311
1312static __inline tile_bundle_bits
1313create_SrcB_Y0(int num)
1314{
1315 const unsigned int n = (unsigned int)num;
1316 return ((n & 0x3f) << 12);
1317}
1318
1319static __inline tile_bundle_bits
1320create_SrcB_Y1(int num)
1321{
1322 const unsigned int n = (unsigned int)num;
1323 return (((tile_bundle_bits)(n & 0x3f)) << 43);
1324}
1325
1326static __inline tile_bundle_bits
1327create_Src_SN(int num)
1328{
1329 const unsigned int n = (unsigned int)num;
1330 return ((n & 0x3) << 0);
1331}
1332
1333static __inline tile_bundle_bits
1334create_UnOpcodeExtension_X0(int num)
1335{
1336 const unsigned int n = (unsigned int)num;
1337 return ((n & 0x1f) << 12);
1338}
1339
1340static __inline tile_bundle_bits
1341create_UnOpcodeExtension_X1(int num)
1342{
1343 const unsigned int n = (unsigned int)num;
1344 return (((tile_bundle_bits)(n & 0x1f)) << 43);
1345}
1346
1347static __inline tile_bundle_bits
1348create_UnOpcodeExtension_Y0(int num)
1349{
1350 const unsigned int n = (unsigned int)num;
1351 return ((n & 0x1f) << 12);
1352}
1353
1354static __inline tile_bundle_bits
1355create_UnOpcodeExtension_Y1(int num)
1356{
1357 const unsigned int n = (unsigned int)num;
1358 return (((tile_bundle_bits)(n & 0x1f)) << 43);
1359}
1360
1361static __inline tile_bundle_bits
1362create_UnShOpcodeExtension_X0(int num)
1363{
1364 const unsigned int n = (unsigned int)num;
1365 return ((n & 0x3ff) << 17);
1366}
1367
1368static __inline tile_bundle_bits
1369create_UnShOpcodeExtension_X1(int num)
1370{
1371 const unsigned int n = (unsigned int)num;
1372 return (((tile_bundle_bits)(n & 0x3ff)) << 48);
1373}
1374
1375static __inline tile_bundle_bits
1376create_UnShOpcodeExtension_Y0(int num)
1377{
1378 const unsigned int n = (unsigned int)num;
1379 return ((n & 0x7) << 17);
1380}
1381
1382static __inline tile_bundle_bits
1383create_UnShOpcodeExtension_Y1(int num)
1384{
1385 const unsigned int n = (unsigned int)num;
1386 return (((tile_bundle_bits)(n & 0x7)) << 48);
1387}
1388
1389
1390typedef unsigned short tile_sn_instruction_bits;
1391
1392
1393typedef enum
1394{
1395 TILE_PIPELINE_X0,
1396 TILE_PIPELINE_X1,
1397 TILE_PIPELINE_Y0,
1398 TILE_PIPELINE_Y1,
1399 TILE_PIPELINE_Y2,
1400} tile_pipeline;
1401
1402#define tile_is_x_pipeline(p) ((int)(p) <= (int)TILE_PIPELINE_X1)
1403
1404typedef enum
1405{
1406 TILE_OP_TYPE_REGISTER,
1407 TILE_OP_TYPE_IMMEDIATE,
1408 TILE_OP_TYPE_ADDRESS,
1409 TILE_OP_TYPE_SPR
1410} tile_operand_type;
1411
1412/* This is the bit that determines if a bundle is in the Y encoding. */
1413#define TILE_BUNDLE_Y_ENCODING_MASK ((tile_bundle_bits)1 << 63)
1414
1415enum
1416{
1417 /* Maximum number of instructions in a bundle (2 for X, 3 for Y). */
1418 TILE_MAX_INSTRUCTIONS_PER_BUNDLE = 3,
1419
1420 /* How many different pipeline encodings are there? X0, X1, Y0, Y1, Y2. */
1421 TILE_NUM_PIPELINE_ENCODINGS = 5,
1422
1423 /* Log base 2 of TILE_BUNDLE_SIZE_IN_BYTES. */
1424 TILE_LOG2_BUNDLE_SIZE_IN_BYTES = 3,
1425
1426 /* Instructions take this many bytes. */
1427 TILE_BUNDLE_SIZE_IN_BYTES = 1 << TILE_LOG2_BUNDLE_SIZE_IN_BYTES,
1428
1429 /* Log base 2 of TILE_BUNDLE_ALIGNMENT_IN_BYTES. */
1430 TILE_LOG2_BUNDLE_ALIGNMENT_IN_BYTES = 3,
1431
1432 /* Bundles should be aligned modulo this number of bytes. */
1433 TILE_BUNDLE_ALIGNMENT_IN_BYTES =
1434 (1 << TILE_LOG2_BUNDLE_ALIGNMENT_IN_BYTES),
1435
1436 /* Log base 2 of TILE_SN_INSTRUCTION_SIZE_IN_BYTES. */
1437 TILE_LOG2_SN_INSTRUCTION_SIZE_IN_BYTES = 1,
1438
1439 /* Static network instructions take this many bytes. */
1440 TILE_SN_INSTRUCTION_SIZE_IN_BYTES =
1441 (1 << TILE_LOG2_SN_INSTRUCTION_SIZE_IN_BYTES),
1442
1443 /* Number of registers (some are magic, such as network I/O). */
1444 TILE_NUM_REGISTERS = 64,
1445
1446 /* Number of static network registers. */
1447 TILE_NUM_SN_REGISTERS = 4
1448};
1449
1450
1451struct tile_operand
1452{
1453 /* Is this operand a register, immediate or address? */
1454 tile_operand_type type;
1455
1456 /* The default relocation type for this operand. */
1457 signed int default_reloc : 16;
1458
1459 /* How many bits is this value? (used for range checking) */
1460 unsigned int num_bits : 5;
1461
1462 /* Is the value signed? (used for range checking) */
1463 unsigned int is_signed : 1;
1464
1465 /* Is this operand a source register? */
1466 unsigned int is_src_reg : 1;
1467
1468 /* Is this operand written? (i.e. is it a destination register) */
1469 unsigned int is_dest_reg : 1;
1470
1471 /* Is this operand PC-relative? */
1472 unsigned int is_pc_relative : 1;
1473
1474 /* By how many bits do we right shift the value before inserting? */
1475 unsigned int rightshift : 2;
1476
1477 /* Return the bits for this operand to be ORed into an existing bundle. */
1478 tile_bundle_bits (*insert) (int op);
1479
1480 /* Extract this operand and return it. */
1481 unsigned int (*extract) (tile_bundle_bits bundle);
1482};
1483
1484
1485extern const struct tile_operand tile_operands[];
1486
1487/* One finite-state machine per pipe for rapid instruction decoding. */
1488extern const unsigned short * const
1489tile_bundle_decoder_fsms[TILE_NUM_PIPELINE_ENCODINGS];
1490
1491
1492struct tile_opcode
1493{
1494 /* The opcode mnemonic, e.g. "add" */
1495 const char *name;
1496
1497 /* The enum value for this mnemonic. */
1498 tile_mnemonic mnemonic;
1499
1500 /* A bit mask of which of the five pipes this instruction
1501 is compatible with:
1502 X0 0x01
1503 X1 0x02
1504 Y0 0x04
1505 Y1 0x08
1506 Y2 0x10 */
1507 unsigned char pipes;
1508
1509 /* How many operands are there? */
1510 unsigned char num_operands;
1511
1512 /* Which register does this write implicitly, or TREG_ZERO if none? */
1513 unsigned char implicitly_written_register;
1514
1515 /* Can this be bundled with other instructions (almost always true). */
1516 unsigned char can_bundle;
1517
1518 /* The description of the operands. Each of these is an
1519 * index into the tile_operands[] table. */
1520 unsigned char operands[TILE_NUM_PIPELINE_ENCODINGS][TILE_MAX_OPERANDS];
1521
1522 /* A mask of which bits have predefined values for each pipeline.
1523 * This is useful for disassembly. */
1524 tile_bundle_bits fixed_bit_masks[TILE_NUM_PIPELINE_ENCODINGS];
1525
1526 /* For each bit set in fixed_bit_masks, what the value is for this
1527 * instruction. */
1528 tile_bundle_bits fixed_bit_values[TILE_NUM_PIPELINE_ENCODINGS];
1529};
1530
1531extern const struct tile_opcode tile_opcodes[];
1532
1533struct tile_sn_opcode
1534{
1535 /* The opcode mnemonic, e.g. "add" */
1536 const char *name;
1537
1538 /* The enum value for this mnemonic. */
1539 tile_sn_mnemonic mnemonic;
1540
1541 /* How many operands are there? */
1542 unsigned char num_operands;
1543
1544 /* The description of the operands. Each of these is an
1545 * index into the tile_operands[] table. */
1546 unsigned char operands[TILE_SN_MAX_OPERANDS];
1547
1548 /* A mask of which bits have predefined values.
1549 * This is useful for disassembly. */
1550 tile_sn_instruction_bits fixed_bit_mask;
1551
1552 /* For each bit set in fixed_bit_masks, what its value is. */
1553 tile_sn_instruction_bits fixed_bit_values;
1554};
1555
1556extern const struct tile_sn_opcode tile_sn_opcodes[];
1557
1558/* Used for non-textual disassembly into structs. */
1559struct tile_decoded_instruction
1560{
1561 const struct tile_opcode *opcode;
1562 const struct tile_operand *operands[TILE_MAX_OPERANDS];
1563 int operand_values[TILE_MAX_OPERANDS];
1564};
1565
1566
1567/* Disassemble a bundle into a struct for machine processing. */
1568extern int parse_insn_tile(tile_bundle_bits bits,
1569 unsigned int pc,
1570 struct tile_decoded_instruction
1571 decoded[TILE_MAX_INSTRUCTIONS_PER_BUNDLE]);
1572
1573
1574/* Canonical names of all the registers. */
1575/* ISSUE: This table lives in "tile-dis.c" */
1576extern const char * const tile_register_names[];
1577
1578/* Descriptor for a special-purpose register. */
1579struct tile_spr
1580{
1581 /* The number */
1582 int number;
1583
1584 /* The name */
1585 const char *name;
1586};
1587
1588/* List of all the SPRs; ordered by increasing number. */
1589extern const struct tile_spr tile_sprs[];
1590
1591/* Number of special-purpose registers. */
1592extern const int tile_num_sprs;
1593
1594extern const char *
1595get_tile_spr_name (int num);
1596
1597#endif /* opcode_tile_h */
diff --git a/arch/tile/include/asm/opcode-tile_64.h b/arch/tile/include/asm/opcode-tile_64.h
new file mode 100644
index 000000000000..90f8dd372531
--- /dev/null
+++ b/arch/tile/include/asm/opcode-tile_64.h
@@ -0,0 +1,1597 @@
1/* tile.h -- Header file for TILE opcode table
2 Copyright (C) 2005 Free Software Foundation, Inc.
3 Contributed by Tilera Corp. */
4
5#ifndef opcode_tile_h
6#define opcode_tile_h
7
8typedef unsigned long long tile_bundle_bits;
9
10
11enum
12{
13 TILE_MAX_OPERANDS = 5 /* mm */
14};
15
16typedef enum
17{
18 TILE_OPC_BPT,
19 TILE_OPC_INFO,
20 TILE_OPC_INFOL,
21 TILE_OPC_J,
22 TILE_OPC_JAL,
23 TILE_OPC_MOVE,
24 TILE_OPC_MOVE_SN,
25 TILE_OPC_MOVEI,
26 TILE_OPC_MOVEI_SN,
27 TILE_OPC_MOVELI,
28 TILE_OPC_MOVELI_SN,
29 TILE_OPC_MOVELIS,
30 TILE_OPC_PREFETCH,
31 TILE_OPC_ADD,
32 TILE_OPC_ADD_SN,
33 TILE_OPC_ADDB,
34 TILE_OPC_ADDB_SN,
35 TILE_OPC_ADDBS_U,
36 TILE_OPC_ADDBS_U_SN,
37 TILE_OPC_ADDH,
38 TILE_OPC_ADDH_SN,
39 TILE_OPC_ADDHS,
40 TILE_OPC_ADDHS_SN,
41 TILE_OPC_ADDI,
42 TILE_OPC_ADDI_SN,
43 TILE_OPC_ADDIB,
44 TILE_OPC_ADDIB_SN,
45 TILE_OPC_ADDIH,
46 TILE_OPC_ADDIH_SN,
47 TILE_OPC_ADDLI,
48 TILE_OPC_ADDLI_SN,
49 TILE_OPC_ADDLIS,
50 TILE_OPC_ADDS,
51 TILE_OPC_ADDS_SN,
52 TILE_OPC_ADIFFB_U,
53 TILE_OPC_ADIFFB_U_SN,
54 TILE_OPC_ADIFFH,
55 TILE_OPC_ADIFFH_SN,
56 TILE_OPC_AND,
57 TILE_OPC_AND_SN,
58 TILE_OPC_ANDI,
59 TILE_OPC_ANDI_SN,
60 TILE_OPC_AULI,
61 TILE_OPC_AVGB_U,
62 TILE_OPC_AVGB_U_SN,
63 TILE_OPC_AVGH,
64 TILE_OPC_AVGH_SN,
65 TILE_OPC_BBNS,
66 TILE_OPC_BBNS_SN,
67 TILE_OPC_BBNST,
68 TILE_OPC_BBNST_SN,
69 TILE_OPC_BBS,
70 TILE_OPC_BBS_SN,
71 TILE_OPC_BBST,
72 TILE_OPC_BBST_SN,
73 TILE_OPC_BGEZ,
74 TILE_OPC_BGEZ_SN,
75 TILE_OPC_BGEZT,
76 TILE_OPC_BGEZT_SN,
77 TILE_OPC_BGZ,
78 TILE_OPC_BGZ_SN,
79 TILE_OPC_BGZT,
80 TILE_OPC_BGZT_SN,
81 TILE_OPC_BITX,
82 TILE_OPC_BITX_SN,
83 TILE_OPC_BLEZ,
84 TILE_OPC_BLEZ_SN,
85 TILE_OPC_BLEZT,
86 TILE_OPC_BLEZT_SN,
87 TILE_OPC_BLZ,
88 TILE_OPC_BLZ_SN,
89 TILE_OPC_BLZT,
90 TILE_OPC_BLZT_SN,
91 TILE_OPC_BNZ,
92 TILE_OPC_BNZ_SN,
93 TILE_OPC_BNZT,
94 TILE_OPC_BNZT_SN,
95 TILE_OPC_BYTEX,
96 TILE_OPC_BYTEX_SN,
97 TILE_OPC_BZ,
98 TILE_OPC_BZ_SN,
99 TILE_OPC_BZT,
100 TILE_OPC_BZT_SN,
101 TILE_OPC_CLZ,
102 TILE_OPC_CLZ_SN,
103 TILE_OPC_CRC32_32,
104 TILE_OPC_CRC32_32_SN,
105 TILE_OPC_CRC32_8,
106 TILE_OPC_CRC32_8_SN,
107 TILE_OPC_CTZ,
108 TILE_OPC_CTZ_SN,
109 TILE_OPC_DRAIN,
110 TILE_OPC_DTLBPR,
111 TILE_OPC_DWORD_ALIGN,
112 TILE_OPC_DWORD_ALIGN_SN,
113 TILE_OPC_FINV,
114 TILE_OPC_FLUSH,
115 TILE_OPC_FNOP,
116 TILE_OPC_ICOH,
117 TILE_OPC_ILL,
118 TILE_OPC_INTHB,
119 TILE_OPC_INTHB_SN,
120 TILE_OPC_INTHH,
121 TILE_OPC_INTHH_SN,
122 TILE_OPC_INTLB,
123 TILE_OPC_INTLB_SN,
124 TILE_OPC_INTLH,
125 TILE_OPC_INTLH_SN,
126 TILE_OPC_INV,
127 TILE_OPC_IRET,
128 TILE_OPC_JALB,
129 TILE_OPC_JALF,
130 TILE_OPC_JALR,
131 TILE_OPC_JALRP,
132 TILE_OPC_JB,
133 TILE_OPC_JF,
134 TILE_OPC_JR,
135 TILE_OPC_JRP,
136 TILE_OPC_LB,
137 TILE_OPC_LB_SN,
138 TILE_OPC_LB_U,
139 TILE_OPC_LB_U_SN,
140 TILE_OPC_LBADD,
141 TILE_OPC_LBADD_SN,
142 TILE_OPC_LBADD_U,
143 TILE_OPC_LBADD_U_SN,
144 TILE_OPC_LH,
145 TILE_OPC_LH_SN,
146 TILE_OPC_LH_U,
147 TILE_OPC_LH_U_SN,
148 TILE_OPC_LHADD,
149 TILE_OPC_LHADD_SN,
150 TILE_OPC_LHADD_U,
151 TILE_OPC_LHADD_U_SN,
152 TILE_OPC_LNK,
153 TILE_OPC_LNK_SN,
154 TILE_OPC_LW,
155 TILE_OPC_LW_SN,
156 TILE_OPC_LW_NA,
157 TILE_OPC_LW_NA_SN,
158 TILE_OPC_LWADD,
159 TILE_OPC_LWADD_SN,
160 TILE_OPC_LWADD_NA,
161 TILE_OPC_LWADD_NA_SN,
162 TILE_OPC_MAXB_U,
163 TILE_OPC_MAXB_U_SN,
164 TILE_OPC_MAXH,
165 TILE_OPC_MAXH_SN,
166 TILE_OPC_MAXIB_U,
167 TILE_OPC_MAXIB_U_SN,
168 TILE_OPC_MAXIH,
169 TILE_OPC_MAXIH_SN,
170 TILE_OPC_MF,
171 TILE_OPC_MFSPR,
172 TILE_OPC_MINB_U,
173 TILE_OPC_MINB_U_SN,
174 TILE_OPC_MINH,
175 TILE_OPC_MINH_SN,
176 TILE_OPC_MINIB_U,
177 TILE_OPC_MINIB_U_SN,
178 TILE_OPC_MINIH,
179 TILE_OPC_MINIH_SN,
180 TILE_OPC_MM,
181 TILE_OPC_MNZ,
182 TILE_OPC_MNZ_SN,
183 TILE_OPC_MNZB,
184 TILE_OPC_MNZB_SN,
185 TILE_OPC_MNZH,
186 TILE_OPC_MNZH_SN,
187 TILE_OPC_MTSPR,
188 TILE_OPC_MULHH_SS,
189 TILE_OPC_MULHH_SS_SN,
190 TILE_OPC_MULHH_SU,
191 TILE_OPC_MULHH_SU_SN,
192 TILE_OPC_MULHH_UU,
193 TILE_OPC_MULHH_UU_SN,
194 TILE_OPC_MULHHA_SS,
195 TILE_OPC_MULHHA_SS_SN,
196 TILE_OPC_MULHHA_SU,
197 TILE_OPC_MULHHA_SU_SN,
198 TILE_OPC_MULHHA_UU,
199 TILE_OPC_MULHHA_UU_SN,
200 TILE_OPC_MULHHSA_UU,
201 TILE_OPC_MULHHSA_UU_SN,
202 TILE_OPC_MULHL_SS,
203 TILE_OPC_MULHL_SS_SN,
204 TILE_OPC_MULHL_SU,
205 TILE_OPC_MULHL_SU_SN,
206 TILE_OPC_MULHL_US,
207 TILE_OPC_MULHL_US_SN,
208 TILE_OPC_MULHL_UU,
209 TILE_OPC_MULHL_UU_SN,
210 TILE_OPC_MULHLA_SS,
211 TILE_OPC_MULHLA_SS_SN,
212 TILE_OPC_MULHLA_SU,
213 TILE_OPC_MULHLA_SU_SN,
214 TILE_OPC_MULHLA_US,
215 TILE_OPC_MULHLA_US_SN,
216 TILE_OPC_MULHLA_UU,
217 TILE_OPC_MULHLA_UU_SN,
218 TILE_OPC_MULHLSA_UU,
219 TILE_OPC_MULHLSA_UU_SN,
220 TILE_OPC_MULLL_SS,
221 TILE_OPC_MULLL_SS_SN,
222 TILE_OPC_MULLL_SU,
223 TILE_OPC_MULLL_SU_SN,
224 TILE_OPC_MULLL_UU,
225 TILE_OPC_MULLL_UU_SN,
226 TILE_OPC_MULLLA_SS,
227 TILE_OPC_MULLLA_SS_SN,
228 TILE_OPC_MULLLA_SU,
229 TILE_OPC_MULLLA_SU_SN,
230 TILE_OPC_MULLLA_UU,
231 TILE_OPC_MULLLA_UU_SN,
232 TILE_OPC_MULLLSA_UU,
233 TILE_OPC_MULLLSA_UU_SN,
234 TILE_OPC_MVNZ,
235 TILE_OPC_MVNZ_SN,
236 TILE_OPC_MVZ,
237 TILE_OPC_MVZ_SN,
238 TILE_OPC_MZ,
239 TILE_OPC_MZ_SN,
240 TILE_OPC_MZB,
241 TILE_OPC_MZB_SN,
242 TILE_OPC_MZH,
243 TILE_OPC_MZH_SN,
244 TILE_OPC_NAP,
245 TILE_OPC_NOP,
246 TILE_OPC_NOR,
247 TILE_OPC_NOR_SN,
248 TILE_OPC_OR,
249 TILE_OPC_OR_SN,
250 TILE_OPC_ORI,
251 TILE_OPC_ORI_SN,
252 TILE_OPC_PACKBS_U,
253 TILE_OPC_PACKBS_U_SN,
254 TILE_OPC_PACKHB,
255 TILE_OPC_PACKHB_SN,
256 TILE_OPC_PACKHS,
257 TILE_OPC_PACKHS_SN,
258 TILE_OPC_PACKLB,
259 TILE_OPC_PACKLB_SN,
260 TILE_OPC_PCNT,
261 TILE_OPC_PCNT_SN,
262 TILE_OPC_RL,
263 TILE_OPC_RL_SN,
264 TILE_OPC_RLI,
265 TILE_OPC_RLI_SN,
266 TILE_OPC_S1A,
267 TILE_OPC_S1A_SN,
268 TILE_OPC_S2A,
269 TILE_OPC_S2A_SN,
270 TILE_OPC_S3A,
271 TILE_OPC_S3A_SN,
272 TILE_OPC_SADAB_U,
273 TILE_OPC_SADAB_U_SN,
274 TILE_OPC_SADAH,
275 TILE_OPC_SADAH_SN,
276 TILE_OPC_SADAH_U,
277 TILE_OPC_SADAH_U_SN,
278 TILE_OPC_SADB_U,
279 TILE_OPC_SADB_U_SN,
280 TILE_OPC_SADH,
281 TILE_OPC_SADH_SN,
282 TILE_OPC_SADH_U,
283 TILE_OPC_SADH_U_SN,
284 TILE_OPC_SB,
285 TILE_OPC_SBADD,
286 TILE_OPC_SEQ,
287 TILE_OPC_SEQ_SN,
288 TILE_OPC_SEQB,
289 TILE_OPC_SEQB_SN,
290 TILE_OPC_SEQH,
291 TILE_OPC_SEQH_SN,
292 TILE_OPC_SEQI,
293 TILE_OPC_SEQI_SN,
294 TILE_OPC_SEQIB,
295 TILE_OPC_SEQIB_SN,
296 TILE_OPC_SEQIH,
297 TILE_OPC_SEQIH_SN,
298 TILE_OPC_SH,
299 TILE_OPC_SHADD,
300 TILE_OPC_SHL,
301 TILE_OPC_SHL_SN,
302 TILE_OPC_SHLB,
303 TILE_OPC_SHLB_SN,
304 TILE_OPC_SHLH,
305 TILE_OPC_SHLH_SN,
306 TILE_OPC_SHLI,
307 TILE_OPC_SHLI_SN,
308 TILE_OPC_SHLIB,
309 TILE_OPC_SHLIB_SN,
310 TILE_OPC_SHLIH,
311 TILE_OPC_SHLIH_SN,
312 TILE_OPC_SHR,
313 TILE_OPC_SHR_SN,
314 TILE_OPC_SHRB,
315 TILE_OPC_SHRB_SN,
316 TILE_OPC_SHRH,
317 TILE_OPC_SHRH_SN,
318 TILE_OPC_SHRI,
319 TILE_OPC_SHRI_SN,
320 TILE_OPC_SHRIB,
321 TILE_OPC_SHRIB_SN,
322 TILE_OPC_SHRIH,
323 TILE_OPC_SHRIH_SN,
324 TILE_OPC_SLT,
325 TILE_OPC_SLT_SN,
326 TILE_OPC_SLT_U,
327 TILE_OPC_SLT_U_SN,
328 TILE_OPC_SLTB,
329 TILE_OPC_SLTB_SN,
330 TILE_OPC_SLTB_U,
331 TILE_OPC_SLTB_U_SN,
332 TILE_OPC_SLTE,
333 TILE_OPC_SLTE_SN,
334 TILE_OPC_SLTE_U,
335 TILE_OPC_SLTE_U_SN,
336 TILE_OPC_SLTEB,
337 TILE_OPC_SLTEB_SN,
338 TILE_OPC_SLTEB_U,
339 TILE_OPC_SLTEB_U_SN,
340 TILE_OPC_SLTEH,
341 TILE_OPC_SLTEH_SN,
342 TILE_OPC_SLTEH_U,
343 TILE_OPC_SLTEH_U_SN,
344 TILE_OPC_SLTH,
345 TILE_OPC_SLTH_SN,
346 TILE_OPC_SLTH_U,
347 TILE_OPC_SLTH_U_SN,
348 TILE_OPC_SLTI,
349 TILE_OPC_SLTI_SN,
350 TILE_OPC_SLTI_U,
351 TILE_OPC_SLTI_U_SN,
352 TILE_OPC_SLTIB,
353 TILE_OPC_SLTIB_SN,
354 TILE_OPC_SLTIB_U,
355 TILE_OPC_SLTIB_U_SN,
356 TILE_OPC_SLTIH,
357 TILE_OPC_SLTIH_SN,
358 TILE_OPC_SLTIH_U,
359 TILE_OPC_SLTIH_U_SN,
360 TILE_OPC_SNE,
361 TILE_OPC_SNE_SN,
362 TILE_OPC_SNEB,
363 TILE_OPC_SNEB_SN,
364 TILE_OPC_SNEH,
365 TILE_OPC_SNEH_SN,
366 TILE_OPC_SRA,
367 TILE_OPC_SRA_SN,
368 TILE_OPC_SRAB,
369 TILE_OPC_SRAB_SN,
370 TILE_OPC_SRAH,
371 TILE_OPC_SRAH_SN,
372 TILE_OPC_SRAI,
373 TILE_OPC_SRAI_SN,
374 TILE_OPC_SRAIB,
375 TILE_OPC_SRAIB_SN,
376 TILE_OPC_SRAIH,
377 TILE_OPC_SRAIH_SN,
378 TILE_OPC_SUB,
379 TILE_OPC_SUB_SN,
380 TILE_OPC_SUBB,
381 TILE_OPC_SUBB_SN,
382 TILE_OPC_SUBBS_U,
383 TILE_OPC_SUBBS_U_SN,
384 TILE_OPC_SUBH,
385 TILE_OPC_SUBH_SN,
386 TILE_OPC_SUBHS,
387 TILE_OPC_SUBHS_SN,
388 TILE_OPC_SUBS,
389 TILE_OPC_SUBS_SN,
390 TILE_OPC_SW,
391 TILE_OPC_SWADD,
392 TILE_OPC_SWINT0,
393 TILE_OPC_SWINT1,
394 TILE_OPC_SWINT2,
395 TILE_OPC_SWINT3,
396 TILE_OPC_TBLIDXB0,
397 TILE_OPC_TBLIDXB0_SN,
398 TILE_OPC_TBLIDXB1,
399 TILE_OPC_TBLIDXB1_SN,
400 TILE_OPC_TBLIDXB2,
401 TILE_OPC_TBLIDXB2_SN,
402 TILE_OPC_TBLIDXB3,
403 TILE_OPC_TBLIDXB3_SN,
404 TILE_OPC_TNS,
405 TILE_OPC_TNS_SN,
406 TILE_OPC_WH64,
407 TILE_OPC_XOR,
408 TILE_OPC_XOR_SN,
409 TILE_OPC_XORI,
410 TILE_OPC_XORI_SN,
411 TILE_OPC_NONE
412} tile_mnemonic;
413
414/* 64-bit pattern for a { bpt ; nop } bundle. */
415#define TILE_BPT_BUNDLE 0x400b3cae70166000ULL
416
417
418#define TILE_ELF_MACHINE_CODE EM_TILEPRO
419
420#define TILE_ELF_NAME "elf32-tilepro"
421
422enum
423{
424 TILE_SN_MAX_OPERANDS = 6 /* route */
425};
426
427typedef enum
428{
429 TILE_SN_OPC_BZ,
430 TILE_SN_OPC_BNZ,
431 TILE_SN_OPC_JRR,
432 TILE_SN_OPC_FNOP,
433 TILE_SN_OPC_BLZ,
434 TILE_SN_OPC_NOP,
435 TILE_SN_OPC_MOVEI,
436 TILE_SN_OPC_MOVE,
437 TILE_SN_OPC_BGEZ,
438 TILE_SN_OPC_JR,
439 TILE_SN_OPC_BLEZ,
440 TILE_SN_OPC_BBNS,
441 TILE_SN_OPC_JALRR,
442 TILE_SN_OPC_BPT,
443 TILE_SN_OPC_JALR,
444 TILE_SN_OPC_SHR1,
445 TILE_SN_OPC_BGZ,
446 TILE_SN_OPC_BBS,
447 TILE_SN_OPC_SHL8II,
448 TILE_SN_OPC_ADDI,
449 TILE_SN_OPC_HALT,
450 TILE_SN_OPC_ROUTE,
451 TILE_SN_OPC_NONE
452} tile_sn_mnemonic;
453
454extern const unsigned char tile_sn_route_encode[6 * 6 * 6];
455extern const signed char tile_sn_route_decode[256][3];
456extern const char tile_sn_direction_names[6][5];
457extern const signed char tile_sn_dest_map[6][6];
458
459
460static __inline unsigned int
461get_BrOff_SN(tile_bundle_bits num)
462{
463 const unsigned int n = (unsigned int)num;
464 return (((n >> 0)) & 0x3ff);
465}
466
467static __inline unsigned int
468get_BrOff_X1(tile_bundle_bits n)
469{
470 return (((unsigned int)(n >> 43)) & 0x00007fff) |
471 (((unsigned int)(n >> 20)) & 0x00018000);
472}
473
474static __inline unsigned int
475get_BrType_X1(tile_bundle_bits n)
476{
477 return (((unsigned int)(n >> 31)) & 0xf);
478}
479
480static __inline unsigned int
481get_Dest_Imm8_X1(tile_bundle_bits n)
482{
483 return (((unsigned int)(n >> 31)) & 0x0000003f) |
484 (((unsigned int)(n >> 43)) & 0x000000c0);
485}
486
487static __inline unsigned int
488get_Dest_SN(tile_bundle_bits num)
489{
490 const unsigned int n = (unsigned int)num;
491 return (((n >> 2)) & 0x3);
492}
493
494static __inline unsigned int
495get_Dest_X0(tile_bundle_bits num)
496{
497 const unsigned int n = (unsigned int)num;
498 return (((n >> 0)) & 0x3f);
499}
500
501static __inline unsigned int
502get_Dest_X1(tile_bundle_bits n)
503{
504 return (((unsigned int)(n >> 31)) & 0x3f);
505}
506
507static __inline unsigned int
508get_Dest_Y0(tile_bundle_bits num)
509{
510 const unsigned int n = (unsigned int)num;
511 return (((n >> 0)) & 0x3f);
512}
513
514static __inline unsigned int
515get_Dest_Y1(tile_bundle_bits n)
516{
517 return (((unsigned int)(n >> 31)) & 0x3f);
518}
519
520static __inline unsigned int
521get_Imm16_X0(tile_bundle_bits num)
522{
523 const unsigned int n = (unsigned int)num;
524 return (((n >> 12)) & 0xffff);
525}
526
527static __inline unsigned int
528get_Imm16_X1(tile_bundle_bits n)
529{
530 return (((unsigned int)(n >> 43)) & 0xffff);
531}
532
533static __inline unsigned int
534get_Imm8_SN(tile_bundle_bits num)
535{
536 const unsigned int n = (unsigned int)num;
537 return (((n >> 0)) & 0xff);
538}
539
540static __inline unsigned int
541get_Imm8_X0(tile_bundle_bits num)
542{
543 const unsigned int n = (unsigned int)num;
544 return (((n >> 12)) & 0xff);
545}
546
547static __inline unsigned int
548get_Imm8_X1(tile_bundle_bits n)
549{
550 return (((unsigned int)(n >> 43)) & 0xff);
551}
552
553static __inline unsigned int
554get_Imm8_Y0(tile_bundle_bits num)
555{
556 const unsigned int n = (unsigned int)num;
557 return (((n >> 12)) & 0xff);
558}
559
560static __inline unsigned int
561get_Imm8_Y1(tile_bundle_bits n)
562{
563 return (((unsigned int)(n >> 43)) & 0xff);
564}
565
566static __inline unsigned int
567get_ImmOpcodeExtension_X0(tile_bundle_bits num)
568{
569 const unsigned int n = (unsigned int)num;
570 return (((n >> 20)) & 0x7f);
571}
572
573static __inline unsigned int
574get_ImmOpcodeExtension_X1(tile_bundle_bits n)
575{
576 return (((unsigned int)(n >> 51)) & 0x7f);
577}
578
579static __inline unsigned int
580get_ImmRROpcodeExtension_SN(tile_bundle_bits num)
581{
582 const unsigned int n = (unsigned int)num;
583 return (((n >> 8)) & 0x3);
584}
585
586static __inline unsigned int
587get_JOffLong_X1(tile_bundle_bits n)
588{
589 return (((unsigned int)(n >> 43)) & 0x00007fff) |
590 (((unsigned int)(n >> 20)) & 0x00018000) |
591 (((unsigned int)(n >> 14)) & 0x001e0000) |
592 (((unsigned int)(n >> 16)) & 0x07e00000) |
593 (((unsigned int)(n >> 31)) & 0x18000000);
594}
595
596static __inline unsigned int
597get_JOff_X1(tile_bundle_bits n)
598{
599 return (((unsigned int)(n >> 43)) & 0x00007fff) |
600 (((unsigned int)(n >> 20)) & 0x00018000) |
601 (((unsigned int)(n >> 14)) & 0x001e0000) |
602 (((unsigned int)(n >> 16)) & 0x07e00000) |
603 (((unsigned int)(n >> 31)) & 0x08000000);
604}
605
606static __inline unsigned int
607get_MF_Imm15_X1(tile_bundle_bits n)
608{
609 return (((unsigned int)(n >> 37)) & 0x00003fff) |
610 (((unsigned int)(n >> 44)) & 0x00004000);
611}
612
613static __inline unsigned int
614get_MMEnd_X0(tile_bundle_bits num)
615{
616 const unsigned int n = (unsigned int)num;
617 return (((n >> 18)) & 0x1f);
618}
619
620static __inline unsigned int
621get_MMEnd_X1(tile_bundle_bits n)
622{
623 return (((unsigned int)(n >> 49)) & 0x1f);
624}
625
626static __inline unsigned int
627get_MMStart_X0(tile_bundle_bits num)
628{
629 const unsigned int n = (unsigned int)num;
630 return (((n >> 23)) & 0x1f);
631}
632
633static __inline unsigned int
634get_MMStart_X1(tile_bundle_bits n)
635{
636 return (((unsigned int)(n >> 54)) & 0x1f);
637}
638
639static __inline unsigned int
640get_MT_Imm15_X1(tile_bundle_bits n)
641{
642 return (((unsigned int)(n >> 31)) & 0x0000003f) |
643 (((unsigned int)(n >> 37)) & 0x00003fc0) |
644 (((unsigned int)(n >> 44)) & 0x00004000);
645}
646
647static __inline unsigned int
648get_Mode(tile_bundle_bits n)
649{
650 return (((unsigned int)(n >> 63)) & 0x1);
651}
652
653static __inline unsigned int
654get_NoRegOpcodeExtension_SN(tile_bundle_bits num)
655{
656 const unsigned int n = (unsigned int)num;
657 return (((n >> 0)) & 0xf);
658}
659
660static __inline unsigned int
661get_Opcode_SN(tile_bundle_bits num)
662{
663 const unsigned int n = (unsigned int)num;
664 return (((n >> 10)) & 0x3f);
665}
666
667static __inline unsigned int
668get_Opcode_X0(tile_bundle_bits num)
669{
670 const unsigned int n = (unsigned int)num;
671 return (((n >> 28)) & 0x7);
672}
673
674static __inline unsigned int
675get_Opcode_X1(tile_bundle_bits n)
676{
677 return (((unsigned int)(n >> 59)) & 0xf);
678}
679
680static __inline unsigned int
681get_Opcode_Y0(tile_bundle_bits num)
682{
683 const unsigned int n = (unsigned int)num;
684 return (((n >> 27)) & 0xf);
685}
686
687static __inline unsigned int
688get_Opcode_Y1(tile_bundle_bits n)
689{
690 return (((unsigned int)(n >> 59)) & 0xf);
691}
692
693static __inline unsigned int
694get_Opcode_Y2(tile_bundle_bits n)
695{
696 return (((unsigned int)(n >> 56)) & 0x7);
697}
698
699static __inline unsigned int
700get_RROpcodeExtension_SN(tile_bundle_bits num)
701{
702 const unsigned int n = (unsigned int)num;
703 return (((n >> 4)) & 0xf);
704}
705
706static __inline unsigned int
707get_RRROpcodeExtension_X0(tile_bundle_bits num)
708{
709 const unsigned int n = (unsigned int)num;
710 return (((n >> 18)) & 0x1ff);
711}
712
713static __inline unsigned int
714get_RRROpcodeExtension_X1(tile_bundle_bits n)
715{
716 return (((unsigned int)(n >> 49)) & 0x1ff);
717}
718
719static __inline unsigned int
720get_RRROpcodeExtension_Y0(tile_bundle_bits num)
721{
722 const unsigned int n = (unsigned int)num;
723 return (((n >> 18)) & 0x3);
724}
725
726static __inline unsigned int
727get_RRROpcodeExtension_Y1(tile_bundle_bits n)
728{
729 return (((unsigned int)(n >> 49)) & 0x3);
730}
731
732static __inline unsigned int
733get_RouteOpcodeExtension_SN(tile_bundle_bits num)
734{
735 const unsigned int n = (unsigned int)num;
736 return (((n >> 0)) & 0x3ff);
737}
738
739static __inline unsigned int
740get_S_X0(tile_bundle_bits num)
741{
742 const unsigned int n = (unsigned int)num;
743 return (((n >> 27)) & 0x1);
744}
745
746static __inline unsigned int
747get_S_X1(tile_bundle_bits n)
748{
749 return (((unsigned int)(n >> 58)) & 0x1);
750}
751
752static __inline unsigned int
753get_ShAmt_X0(tile_bundle_bits num)
754{
755 const unsigned int n = (unsigned int)num;
756 return (((n >> 12)) & 0x1f);
757}
758
759static __inline unsigned int
760get_ShAmt_X1(tile_bundle_bits n)
761{
762 return (((unsigned int)(n >> 43)) & 0x1f);
763}
764
765static __inline unsigned int
766get_ShAmt_Y0(tile_bundle_bits num)
767{
768 const unsigned int n = (unsigned int)num;
769 return (((n >> 12)) & 0x1f);
770}
771
772static __inline unsigned int
773get_ShAmt_Y1(tile_bundle_bits n)
774{
775 return (((unsigned int)(n >> 43)) & 0x1f);
776}
777
778static __inline unsigned int
779get_SrcA_X0(tile_bundle_bits num)
780{
781 const unsigned int n = (unsigned int)num;
782 return (((n >> 6)) & 0x3f);
783}
784
785static __inline unsigned int
786get_SrcA_X1(tile_bundle_bits n)
787{
788 return (((unsigned int)(n >> 37)) & 0x3f);
789}
790
791static __inline unsigned int
792get_SrcA_Y0(tile_bundle_bits num)
793{
794 const unsigned int n = (unsigned int)num;
795 return (((n >> 6)) & 0x3f);
796}
797
798static __inline unsigned int
799get_SrcA_Y1(tile_bundle_bits n)
800{
801 return (((unsigned int)(n >> 37)) & 0x3f);
802}
803
804static __inline unsigned int
805get_SrcA_Y2(tile_bundle_bits n)
806{
807 return (((n >> 26)) & 0x00000001) |
808 (((unsigned int)(n >> 50)) & 0x0000003e);
809}
810
811static __inline unsigned int
812get_SrcBDest_Y2(tile_bundle_bits num)
813{
814 const unsigned int n = (unsigned int)num;
815 return (((n >> 20)) & 0x3f);
816}
817
818static __inline unsigned int
819get_SrcB_X0(tile_bundle_bits num)
820{
821 const unsigned int n = (unsigned int)num;
822 return (((n >> 12)) & 0x3f);
823}
824
825static __inline unsigned int
826get_SrcB_X1(tile_bundle_bits n)
827{
828 return (((unsigned int)(n >> 43)) & 0x3f);
829}
830
831static __inline unsigned int
832get_SrcB_Y0(tile_bundle_bits num)
833{
834 const unsigned int n = (unsigned int)num;
835 return (((n >> 12)) & 0x3f);
836}
837
838static __inline unsigned int
839get_SrcB_Y1(tile_bundle_bits n)
840{
841 return (((unsigned int)(n >> 43)) & 0x3f);
842}
843
844static __inline unsigned int
845get_Src_SN(tile_bundle_bits num)
846{
847 const unsigned int n = (unsigned int)num;
848 return (((n >> 0)) & 0x3);
849}
850
851static __inline unsigned int
852get_UnOpcodeExtension_X0(tile_bundle_bits num)
853{
854 const unsigned int n = (unsigned int)num;
855 return (((n >> 12)) & 0x1f);
856}
857
858static __inline unsigned int
859get_UnOpcodeExtension_X1(tile_bundle_bits n)
860{
861 return (((unsigned int)(n >> 43)) & 0x1f);
862}
863
864static __inline unsigned int
865get_UnOpcodeExtension_Y0(tile_bundle_bits num)
866{
867 const unsigned int n = (unsigned int)num;
868 return (((n >> 12)) & 0x1f);
869}
870
871static __inline unsigned int
872get_UnOpcodeExtension_Y1(tile_bundle_bits n)
873{
874 return (((unsigned int)(n >> 43)) & 0x1f);
875}
876
877static __inline unsigned int
878get_UnShOpcodeExtension_X0(tile_bundle_bits num)
879{
880 const unsigned int n = (unsigned int)num;
881 return (((n >> 17)) & 0x3ff);
882}
883
884static __inline unsigned int
885get_UnShOpcodeExtension_X1(tile_bundle_bits n)
886{
887 return (((unsigned int)(n >> 48)) & 0x3ff);
888}
889
890static __inline unsigned int
891get_UnShOpcodeExtension_Y0(tile_bundle_bits num)
892{
893 const unsigned int n = (unsigned int)num;
894 return (((n >> 17)) & 0x7);
895}
896
897static __inline unsigned int
898get_UnShOpcodeExtension_Y1(tile_bundle_bits n)
899{
900 return (((unsigned int)(n >> 48)) & 0x7);
901}
902
903
904static __inline int
905sign_extend(int n, int num_bits)
906{
907 int shift = (int)(sizeof(int) * 8 - num_bits);
908 return (n << shift) >> shift;
909}
910
911
912
913static __inline tile_bundle_bits
914create_BrOff_SN(int num)
915{
916 const unsigned int n = (unsigned int)num;
917 return ((n & 0x3ff) << 0);
918}
919
920static __inline tile_bundle_bits
921create_BrOff_X1(int num)
922{
923 const unsigned int n = (unsigned int)num;
924 return (((tile_bundle_bits)(n & 0x00007fff)) << 43) |
925 (((tile_bundle_bits)(n & 0x00018000)) << 20);
926}
927
928static __inline tile_bundle_bits
929create_BrType_X1(int num)
930{
931 const unsigned int n = (unsigned int)num;
932 return (((tile_bundle_bits)(n & 0xf)) << 31);
933}
934
935static __inline tile_bundle_bits
936create_Dest_Imm8_X1(int num)
937{
938 const unsigned int n = (unsigned int)num;
939 return (((tile_bundle_bits)(n & 0x0000003f)) << 31) |
940 (((tile_bundle_bits)(n & 0x000000c0)) << 43);
941}
942
943static __inline tile_bundle_bits
944create_Dest_SN(int num)
945{
946 const unsigned int n = (unsigned int)num;
947 return ((n & 0x3) << 2);
948}
949
950static __inline tile_bundle_bits
951create_Dest_X0(int num)
952{
953 const unsigned int n = (unsigned int)num;
954 return ((n & 0x3f) << 0);
955}
956
957static __inline tile_bundle_bits
958create_Dest_X1(int num)
959{
960 const unsigned int n = (unsigned int)num;
961 return (((tile_bundle_bits)(n & 0x3f)) << 31);
962}
963
964static __inline tile_bundle_bits
965create_Dest_Y0(int num)
966{
967 const unsigned int n = (unsigned int)num;
968 return ((n & 0x3f) << 0);
969}
970
971static __inline tile_bundle_bits
972create_Dest_Y1(int num)
973{
974 const unsigned int n = (unsigned int)num;
975 return (((tile_bundle_bits)(n & 0x3f)) << 31);
976}
977
978static __inline tile_bundle_bits
979create_Imm16_X0(int num)
980{
981 const unsigned int n = (unsigned int)num;
982 return ((n & 0xffff) << 12);
983}
984
985static __inline tile_bundle_bits
986create_Imm16_X1(int num)
987{
988 const unsigned int n = (unsigned int)num;
989 return (((tile_bundle_bits)(n & 0xffff)) << 43);
990}
991
992static __inline tile_bundle_bits
993create_Imm8_SN(int num)
994{
995 const unsigned int n = (unsigned int)num;
996 return ((n & 0xff) << 0);
997}
998
999static __inline tile_bundle_bits
1000create_Imm8_X0(int num)
1001{
1002 const unsigned int n = (unsigned int)num;
1003 return ((n & 0xff) << 12);
1004}
1005
1006static __inline tile_bundle_bits
1007create_Imm8_X1(int num)
1008{
1009 const unsigned int n = (unsigned int)num;
1010 return (((tile_bundle_bits)(n & 0xff)) << 43);
1011}
1012
1013static __inline tile_bundle_bits
1014create_Imm8_Y0(int num)
1015{
1016 const unsigned int n = (unsigned int)num;
1017 return ((n & 0xff) << 12);
1018}
1019
1020static __inline tile_bundle_bits
1021create_Imm8_Y1(int num)
1022{
1023 const unsigned int n = (unsigned int)num;
1024 return (((tile_bundle_bits)(n & 0xff)) << 43);
1025}
1026
1027static __inline tile_bundle_bits
1028create_ImmOpcodeExtension_X0(int num)
1029{
1030 const unsigned int n = (unsigned int)num;
1031 return ((n & 0x7f) << 20);
1032}
1033
1034static __inline tile_bundle_bits
1035create_ImmOpcodeExtension_X1(int num)
1036{
1037 const unsigned int n = (unsigned int)num;
1038 return (((tile_bundle_bits)(n & 0x7f)) << 51);
1039}
1040
1041static __inline tile_bundle_bits
1042create_ImmRROpcodeExtension_SN(int num)
1043{
1044 const unsigned int n = (unsigned int)num;
1045 return ((n & 0x3) << 8);
1046}
1047
1048static __inline tile_bundle_bits
1049create_JOffLong_X1(int num)
1050{
1051 const unsigned int n = (unsigned int)num;
1052 return (((tile_bundle_bits)(n & 0x00007fff)) << 43) |
1053 (((tile_bundle_bits)(n & 0x00018000)) << 20) |
1054 (((tile_bundle_bits)(n & 0x001e0000)) << 14) |
1055 (((tile_bundle_bits)(n & 0x07e00000)) << 16) |
1056 (((tile_bundle_bits)(n & 0x18000000)) << 31);
1057}
1058
1059static __inline tile_bundle_bits
1060create_JOff_X1(int num)
1061{
1062 const unsigned int n = (unsigned int)num;
1063 return (((tile_bundle_bits)(n & 0x00007fff)) << 43) |
1064 (((tile_bundle_bits)(n & 0x00018000)) << 20) |
1065 (((tile_bundle_bits)(n & 0x001e0000)) << 14) |
1066 (((tile_bundle_bits)(n & 0x07e00000)) << 16) |
1067 (((tile_bundle_bits)(n & 0x08000000)) << 31);
1068}
1069
1070static __inline tile_bundle_bits
1071create_MF_Imm15_X1(int num)
1072{
1073 const unsigned int n = (unsigned int)num;
1074 return (((tile_bundle_bits)(n & 0x00003fff)) << 37) |
1075 (((tile_bundle_bits)(n & 0x00004000)) << 44);
1076}
1077
1078static __inline tile_bundle_bits
1079create_MMEnd_X0(int num)
1080{
1081 const unsigned int n = (unsigned int)num;
1082 return ((n & 0x1f) << 18);
1083}
1084
1085static __inline tile_bundle_bits
1086create_MMEnd_X1(int num)
1087{
1088 const unsigned int n = (unsigned int)num;
1089 return (((tile_bundle_bits)(n & 0x1f)) << 49);
1090}
1091
1092static __inline tile_bundle_bits
1093create_MMStart_X0(int num)
1094{
1095 const unsigned int n = (unsigned int)num;
1096 return ((n & 0x1f) << 23);
1097}
1098
1099static __inline tile_bundle_bits
1100create_MMStart_X1(int num)
1101{
1102 const unsigned int n = (unsigned int)num;
1103 return (((tile_bundle_bits)(n & 0x1f)) << 54);
1104}
1105
1106static __inline tile_bundle_bits
1107create_MT_Imm15_X1(int num)
1108{
1109 const unsigned int n = (unsigned int)num;
1110 return (((tile_bundle_bits)(n & 0x0000003f)) << 31) |
1111 (((tile_bundle_bits)(n & 0x00003fc0)) << 37) |
1112 (((tile_bundle_bits)(n & 0x00004000)) << 44);
1113}
1114
1115static __inline tile_bundle_bits
1116create_Mode(int num)
1117{
1118 const unsigned int n = (unsigned int)num;
1119 return (((tile_bundle_bits)(n & 0x1)) << 63);
1120}
1121
1122static __inline tile_bundle_bits
1123create_NoRegOpcodeExtension_SN(int num)
1124{
1125 const unsigned int n = (unsigned int)num;
1126 return ((n & 0xf) << 0);
1127}
1128
1129static __inline tile_bundle_bits
1130create_Opcode_SN(int num)
1131{
1132 const unsigned int n = (unsigned int)num;
1133 return ((n & 0x3f) << 10);
1134}
1135
1136static __inline tile_bundle_bits
1137create_Opcode_X0(int num)
1138{
1139 const unsigned int n = (unsigned int)num;
1140 return ((n & 0x7) << 28);
1141}
1142
1143static __inline tile_bundle_bits
1144create_Opcode_X1(int num)
1145{
1146 const unsigned int n = (unsigned int)num;
1147 return (((tile_bundle_bits)(n & 0xf)) << 59);
1148}
1149
1150static __inline tile_bundle_bits
1151create_Opcode_Y0(int num)
1152{
1153 const unsigned int n = (unsigned int)num;
1154 return ((n & 0xf) << 27);
1155}
1156
1157static __inline tile_bundle_bits
1158create_Opcode_Y1(int num)
1159{
1160 const unsigned int n = (unsigned int)num;
1161 return (((tile_bundle_bits)(n & 0xf)) << 59);
1162}
1163
1164static __inline tile_bundle_bits
1165create_Opcode_Y2(int num)
1166{
1167 const unsigned int n = (unsigned int)num;
1168 return (((tile_bundle_bits)(n & 0x7)) << 56);
1169}
1170
1171static __inline tile_bundle_bits
1172create_RROpcodeExtension_SN(int num)
1173{
1174 const unsigned int n = (unsigned int)num;
1175 return ((n & 0xf) << 4);
1176}
1177
1178static __inline tile_bundle_bits
1179create_RRROpcodeExtension_X0(int num)
1180{
1181 const unsigned int n = (unsigned int)num;
1182 return ((n & 0x1ff) << 18);
1183}
1184
1185static __inline tile_bundle_bits
1186create_RRROpcodeExtension_X1(int num)
1187{
1188 const unsigned int n = (unsigned int)num;
1189 return (((tile_bundle_bits)(n & 0x1ff)) << 49);
1190}
1191
1192static __inline tile_bundle_bits
1193create_RRROpcodeExtension_Y0(int num)
1194{
1195 const unsigned int n = (unsigned int)num;
1196 return ((n & 0x3) << 18);
1197}
1198
1199static __inline tile_bundle_bits
1200create_RRROpcodeExtension_Y1(int num)
1201{
1202 const unsigned int n = (unsigned int)num;
1203 return (((tile_bundle_bits)(n & 0x3)) << 49);
1204}
1205
1206static __inline tile_bundle_bits
1207create_RouteOpcodeExtension_SN(int num)
1208{
1209 const unsigned int n = (unsigned int)num;
1210 return ((n & 0x3ff) << 0);
1211}
1212
1213static __inline tile_bundle_bits
1214create_S_X0(int num)
1215{
1216 const unsigned int n = (unsigned int)num;
1217 return ((n & 0x1) << 27);
1218}
1219
1220static __inline tile_bundle_bits
1221create_S_X1(int num)
1222{
1223 const unsigned int n = (unsigned int)num;
1224 return (((tile_bundle_bits)(n & 0x1)) << 58);
1225}
1226
1227static __inline tile_bundle_bits
1228create_ShAmt_X0(int num)
1229{
1230 const unsigned int n = (unsigned int)num;
1231 return ((n & 0x1f) << 12);
1232}
1233
1234static __inline tile_bundle_bits
1235create_ShAmt_X1(int num)
1236{
1237 const unsigned int n = (unsigned int)num;
1238 return (((tile_bundle_bits)(n & 0x1f)) << 43);
1239}
1240
1241static __inline tile_bundle_bits
1242create_ShAmt_Y0(int num)
1243{
1244 const unsigned int n = (unsigned int)num;
1245 return ((n & 0x1f) << 12);
1246}
1247
1248static __inline tile_bundle_bits
1249create_ShAmt_Y1(int num)
1250{
1251 const unsigned int n = (unsigned int)num;
1252 return (((tile_bundle_bits)(n & 0x1f)) << 43);
1253}
1254
1255static __inline tile_bundle_bits
1256create_SrcA_X0(int num)
1257{
1258 const unsigned int n = (unsigned int)num;
1259 return ((n & 0x3f) << 6);
1260}
1261
1262static __inline tile_bundle_bits
1263create_SrcA_X1(int num)
1264{
1265 const unsigned int n = (unsigned int)num;
1266 return (((tile_bundle_bits)(n & 0x3f)) << 37);
1267}
1268
1269static __inline tile_bundle_bits
1270create_SrcA_Y0(int num)
1271{
1272 const unsigned int n = (unsigned int)num;
1273 return ((n & 0x3f) << 6);
1274}
1275
1276static __inline tile_bundle_bits
1277create_SrcA_Y1(int num)
1278{
1279 const unsigned int n = (unsigned int)num;
1280 return (((tile_bundle_bits)(n & 0x3f)) << 37);
1281}
1282
1283static __inline tile_bundle_bits
1284create_SrcA_Y2(int num)
1285{
1286 const unsigned int n = (unsigned int)num;
1287 return ((n & 0x00000001) << 26) |
1288 (((tile_bundle_bits)(n & 0x0000003e)) << 50);
1289}
1290
1291static __inline tile_bundle_bits
1292create_SrcBDest_Y2(int num)
1293{
1294 const unsigned int n = (unsigned int)num;
1295 return ((n & 0x3f) << 20);
1296}
1297
1298static __inline tile_bundle_bits
1299create_SrcB_X0(int num)
1300{
1301 const unsigned int n = (unsigned int)num;
1302 return ((n & 0x3f) << 12);
1303}
1304
1305static __inline tile_bundle_bits
1306create_SrcB_X1(int num)
1307{
1308 const unsigned int n = (unsigned int)num;
1309 return (((tile_bundle_bits)(n & 0x3f)) << 43);
1310}
1311
1312static __inline tile_bundle_bits
1313create_SrcB_Y0(int num)
1314{
1315 const unsigned int n = (unsigned int)num;
1316 return ((n & 0x3f) << 12);
1317}
1318
1319static __inline tile_bundle_bits
1320create_SrcB_Y1(int num)
1321{
1322 const unsigned int n = (unsigned int)num;
1323 return (((tile_bundle_bits)(n & 0x3f)) << 43);
1324}
1325
1326static __inline tile_bundle_bits
1327create_Src_SN(int num)
1328{
1329 const unsigned int n = (unsigned int)num;
1330 return ((n & 0x3) << 0);
1331}
1332
1333static __inline tile_bundle_bits
1334create_UnOpcodeExtension_X0(int num)
1335{
1336 const unsigned int n = (unsigned int)num;
1337 return ((n & 0x1f) << 12);
1338}
1339
1340static __inline tile_bundle_bits
1341create_UnOpcodeExtension_X1(int num)
1342{
1343 const unsigned int n = (unsigned int)num;
1344 return (((tile_bundle_bits)(n & 0x1f)) << 43);
1345}
1346
1347static __inline tile_bundle_bits
1348create_UnOpcodeExtension_Y0(int num)
1349{
1350 const unsigned int n = (unsigned int)num;
1351 return ((n & 0x1f) << 12);
1352}
1353
1354static __inline tile_bundle_bits
1355create_UnOpcodeExtension_Y1(int num)
1356{
1357 const unsigned int n = (unsigned int)num;
1358 return (((tile_bundle_bits)(n & 0x1f)) << 43);
1359}
1360
1361static __inline tile_bundle_bits
1362create_UnShOpcodeExtension_X0(int num)
1363{
1364 const unsigned int n = (unsigned int)num;
1365 return ((n & 0x3ff) << 17);
1366}
1367
1368static __inline tile_bundle_bits
1369create_UnShOpcodeExtension_X1(int num)
1370{
1371 const unsigned int n = (unsigned int)num;
1372 return (((tile_bundle_bits)(n & 0x3ff)) << 48);
1373}
1374
1375static __inline tile_bundle_bits
1376create_UnShOpcodeExtension_Y0(int num)
1377{
1378 const unsigned int n = (unsigned int)num;
1379 return ((n & 0x7) << 17);
1380}
1381
1382static __inline tile_bundle_bits
1383create_UnShOpcodeExtension_Y1(int num)
1384{
1385 const unsigned int n = (unsigned int)num;
1386 return (((tile_bundle_bits)(n & 0x7)) << 48);
1387}
1388
1389
1390typedef unsigned short tile_sn_instruction_bits;
1391
1392
1393typedef enum
1394{
1395 TILE_PIPELINE_X0,
1396 TILE_PIPELINE_X1,
1397 TILE_PIPELINE_Y0,
1398 TILE_PIPELINE_Y1,
1399 TILE_PIPELINE_Y2,
1400} tile_pipeline;
1401
1402#define tile_is_x_pipeline(p) ((int)(p) <= (int)TILE_PIPELINE_X1)
1403
1404typedef enum
1405{
1406 TILE_OP_TYPE_REGISTER,
1407 TILE_OP_TYPE_IMMEDIATE,
1408 TILE_OP_TYPE_ADDRESS,
1409 TILE_OP_TYPE_SPR
1410} tile_operand_type;
1411
1412/* This is the bit that determines if a bundle is in the Y encoding. */
1413#define TILE_BUNDLE_Y_ENCODING_MASK ((tile_bundle_bits)1 << 63)
1414
1415enum
1416{
1417 /* Maximum number of instructions in a bundle (2 for X, 3 for Y). */
1418 TILE_MAX_INSTRUCTIONS_PER_BUNDLE = 3,
1419
1420 /* How many different pipeline encodings are there? X0, X1, Y0, Y1, Y2. */
1421 TILE_NUM_PIPELINE_ENCODINGS = 5,
1422
1423 /* Log base 2 of TILE_BUNDLE_SIZE_IN_BYTES. */
1424 TILE_LOG2_BUNDLE_SIZE_IN_BYTES = 3,
1425
1426 /* Instructions take this many bytes. */
1427 TILE_BUNDLE_SIZE_IN_BYTES = 1 << TILE_LOG2_BUNDLE_SIZE_IN_BYTES,
1428
1429 /* Log base 2 of TILE_BUNDLE_ALIGNMENT_IN_BYTES. */
1430 TILE_LOG2_BUNDLE_ALIGNMENT_IN_BYTES = 3,
1431
1432 /* Bundles should be aligned modulo this number of bytes. */
1433 TILE_BUNDLE_ALIGNMENT_IN_BYTES =
1434 (1 << TILE_LOG2_BUNDLE_ALIGNMENT_IN_BYTES),
1435
1436 /* Log base 2 of TILE_SN_INSTRUCTION_SIZE_IN_BYTES. */
1437 TILE_LOG2_SN_INSTRUCTION_SIZE_IN_BYTES = 1,
1438
1439 /* Static network instructions take this many bytes. */
1440 TILE_SN_INSTRUCTION_SIZE_IN_BYTES =
1441 (1 << TILE_LOG2_SN_INSTRUCTION_SIZE_IN_BYTES),
1442
1443 /* Number of registers (some are magic, such as network I/O). */
1444 TILE_NUM_REGISTERS = 64,
1445
1446 /* Number of static network registers. */
1447 TILE_NUM_SN_REGISTERS = 4
1448};
1449
1450
1451struct tile_operand
1452{
1453 /* Is this operand a register, immediate or address? */
1454 tile_operand_type type;
1455
1456 /* The default relocation type for this operand. */
1457 signed int default_reloc : 16;
1458
1459 /* How many bits is this value? (used for range checking) */
1460 unsigned int num_bits : 5;
1461
1462 /* Is the value signed? (used for range checking) */
1463 unsigned int is_signed : 1;
1464
1465 /* Is this operand a source register? */
1466 unsigned int is_src_reg : 1;
1467
1468 /* Is this operand written? (i.e. is it a destination register) */
1469 unsigned int is_dest_reg : 1;
1470
1471 /* Is this operand PC-relative? */
1472 unsigned int is_pc_relative : 1;
1473
1474 /* By how many bits do we right shift the value before inserting? */
1475 unsigned int rightshift : 2;
1476
1477 /* Return the bits for this operand to be ORed into an existing bundle. */
1478 tile_bundle_bits (*insert) (int op);
1479
1480 /* Extract this operand and return it. */
1481 unsigned int (*extract) (tile_bundle_bits bundle);
1482};
1483
1484
1485extern const struct tile_operand tile_operands[];
1486
1487/* One finite-state machine per pipe for rapid instruction decoding. */
1488extern const unsigned short * const
1489tile_bundle_decoder_fsms[TILE_NUM_PIPELINE_ENCODINGS];
1490
1491
1492struct tile_opcode
1493{
1494 /* The opcode mnemonic, e.g. "add" */
1495 const char *name;
1496
1497 /* The enum value for this mnemonic. */
1498 tile_mnemonic mnemonic;
1499
1500 /* A bit mask of which of the five pipes this instruction
1501 is compatible with:
1502 X0 0x01
1503 X1 0x02
1504 Y0 0x04
1505 Y1 0x08
1506 Y2 0x10 */
1507 unsigned char pipes;
1508
1509 /* How many operands are there? */
1510 unsigned char num_operands;
1511
1512 /* Which register does this write implicitly, or TREG_ZERO if none? */
1513 unsigned char implicitly_written_register;
1514
1515 /* Can this be bundled with other instructions (almost always true). */
1516 unsigned char can_bundle;
1517
1518 /* The description of the operands. Each of these is an
1519 * index into the tile_operands[] table. */
1520 unsigned char operands[TILE_NUM_PIPELINE_ENCODINGS][TILE_MAX_OPERANDS];
1521
1522 /* A mask of which bits have predefined values for each pipeline.
1523 * This is useful for disassembly. */
1524 tile_bundle_bits fixed_bit_masks[TILE_NUM_PIPELINE_ENCODINGS];
1525
1526 /* For each bit set in fixed_bit_masks, what the value is for this
1527 * instruction. */
1528 tile_bundle_bits fixed_bit_values[TILE_NUM_PIPELINE_ENCODINGS];
1529};
1530
1531extern const struct tile_opcode tile_opcodes[];
1532
1533struct tile_sn_opcode
1534{
1535 /* The opcode mnemonic, e.g. "add" */
1536 const char *name;
1537
1538 /* The enum value for this mnemonic. */
1539 tile_sn_mnemonic mnemonic;
1540
1541 /* How many operands are there? */
1542 unsigned char num_operands;
1543
1544 /* The description of the operands. Each of these is an
1545 * index into the tile_operands[] table. */
1546 unsigned char operands[TILE_SN_MAX_OPERANDS];
1547
1548 /* A mask of which bits have predefined values.
1549 * This is useful for disassembly. */
1550 tile_sn_instruction_bits fixed_bit_mask;
1551
1552 /* For each bit set in fixed_bit_masks, what its value is. */
1553 tile_sn_instruction_bits fixed_bit_values;
1554};
1555
1556extern const struct tile_sn_opcode tile_sn_opcodes[];
1557
1558/* Used for non-textual disassembly into structs. */
1559struct tile_decoded_instruction
1560{
1561 const struct tile_opcode *opcode;
1562 const struct tile_operand *operands[TILE_MAX_OPERANDS];
1563 int operand_values[TILE_MAX_OPERANDS];
1564};
1565
1566
1567/* Disassemble a bundle into a struct for machine processing. */
1568extern int parse_insn_tile(tile_bundle_bits bits,
1569 unsigned int pc,
1570 struct tile_decoded_instruction
1571 decoded[TILE_MAX_INSTRUCTIONS_PER_BUNDLE]);
1572
1573
1574/* Canonical names of all the registers. */
1575/* ISSUE: This table lives in "tile-dis.c" */
1576extern const char * const tile_register_names[];
1577
1578/* Descriptor for a special-purpose register. */
1579struct tile_spr
1580{
1581 /* The number */
1582 int number;
1583
1584 /* The name */
1585 const char *name;
1586};
1587
1588/* List of all the SPRs; ordered by increasing number. */
1589extern const struct tile_spr tile_sprs[];
1590
1591/* Number of special-purpose registers. */
1592extern const int tile_num_sprs;
1593
1594extern const char *
1595get_tile_spr_name (int num);
1596
1597#endif /* opcode_tile_h */
diff --git a/arch/tile/include/asm/opcode_constants.h b/arch/tile/include/asm/opcode_constants.h
new file mode 100644
index 000000000000..37a9f2958cb1
--- /dev/null
+++ b/arch/tile/include/asm/opcode_constants.h
@@ -0,0 +1,26 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_OPCODE_CONSTANTS_H
16#define _ASM_TILE_OPCODE_CONSTANTS_H
17
18#include <arch/chip.h>
19
20#if CHIP_WORD_SIZE() == 64
21#include <asm/opcode_constants_64.h>
22#else
23#include <asm/opcode_constants_32.h>
24#endif
25
26#endif /* _ASM_TILE_OPCODE_CONSTANTS_H */
diff --git a/arch/tile/include/asm/opcode_constants_32.h b/arch/tile/include/asm/opcode_constants_32.h
new file mode 100644
index 000000000000..227d033b180c
--- /dev/null
+++ b/arch/tile/include/asm/opcode_constants_32.h
@@ -0,0 +1,480 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15/* This file is machine-generated; DO NOT EDIT! */
16
17
18#ifndef _TILE_OPCODE_CONSTANTS_H
19#define _TILE_OPCODE_CONSTANTS_H
20enum
21{
22 ADDBS_U_SPECIAL_0_OPCODE_X0 = 98,
23 ADDBS_U_SPECIAL_0_OPCODE_X1 = 68,
24 ADDB_SPECIAL_0_OPCODE_X0 = 1,
25 ADDB_SPECIAL_0_OPCODE_X1 = 1,
26 ADDHS_SPECIAL_0_OPCODE_X0 = 99,
27 ADDHS_SPECIAL_0_OPCODE_X1 = 69,
28 ADDH_SPECIAL_0_OPCODE_X0 = 2,
29 ADDH_SPECIAL_0_OPCODE_X1 = 2,
30 ADDIB_IMM_0_OPCODE_X0 = 1,
31 ADDIB_IMM_0_OPCODE_X1 = 1,
32 ADDIH_IMM_0_OPCODE_X0 = 2,
33 ADDIH_IMM_0_OPCODE_X1 = 2,
34 ADDI_IMM_0_OPCODE_X0 = 3,
35 ADDI_IMM_0_OPCODE_X1 = 3,
36 ADDI_IMM_1_OPCODE_SN = 1,
37 ADDI_OPCODE_Y0 = 9,
38 ADDI_OPCODE_Y1 = 7,
39 ADDLIS_OPCODE_X0 = 1,
40 ADDLIS_OPCODE_X1 = 2,
41 ADDLI_OPCODE_X0 = 2,
42 ADDLI_OPCODE_X1 = 3,
43 ADDS_SPECIAL_0_OPCODE_X0 = 96,
44 ADDS_SPECIAL_0_OPCODE_X1 = 66,
45 ADD_SPECIAL_0_OPCODE_X0 = 3,
46 ADD_SPECIAL_0_OPCODE_X1 = 3,
47 ADD_SPECIAL_0_OPCODE_Y0 = 0,
48 ADD_SPECIAL_0_OPCODE_Y1 = 0,
49 ADIFFB_U_SPECIAL_0_OPCODE_X0 = 4,
50 ADIFFH_SPECIAL_0_OPCODE_X0 = 5,
51 ANDI_IMM_0_OPCODE_X0 = 1,
52 ANDI_IMM_0_OPCODE_X1 = 4,
53 ANDI_OPCODE_Y0 = 10,
54 ANDI_OPCODE_Y1 = 8,
55 AND_SPECIAL_0_OPCODE_X0 = 6,
56 AND_SPECIAL_0_OPCODE_X1 = 4,
57 AND_SPECIAL_2_OPCODE_Y0 = 0,
58 AND_SPECIAL_2_OPCODE_Y1 = 0,
59 AULI_OPCODE_X0 = 3,
60 AULI_OPCODE_X1 = 4,
61 AVGB_U_SPECIAL_0_OPCODE_X0 = 7,
62 AVGH_SPECIAL_0_OPCODE_X0 = 8,
63 BBNST_BRANCH_OPCODE_X1 = 15,
64 BBNS_BRANCH_OPCODE_X1 = 14,
65 BBNS_OPCODE_SN = 63,
66 BBST_BRANCH_OPCODE_X1 = 13,
67 BBS_BRANCH_OPCODE_X1 = 12,
68 BBS_OPCODE_SN = 62,
69 BGEZT_BRANCH_OPCODE_X1 = 7,
70 BGEZ_BRANCH_OPCODE_X1 = 6,
71 BGEZ_OPCODE_SN = 61,
72 BGZT_BRANCH_OPCODE_X1 = 5,
73 BGZ_BRANCH_OPCODE_X1 = 4,
74 BGZ_OPCODE_SN = 58,
75 BITX_UN_0_SHUN_0_OPCODE_X0 = 1,
76 BITX_UN_0_SHUN_0_OPCODE_Y0 = 1,
77 BLEZT_BRANCH_OPCODE_X1 = 11,
78 BLEZ_BRANCH_OPCODE_X1 = 10,
79 BLEZ_OPCODE_SN = 59,
80 BLZT_BRANCH_OPCODE_X1 = 9,
81 BLZ_BRANCH_OPCODE_X1 = 8,
82 BLZ_OPCODE_SN = 60,
83 BNZT_BRANCH_OPCODE_X1 = 3,
84 BNZ_BRANCH_OPCODE_X1 = 2,
85 BNZ_OPCODE_SN = 57,
86 BPT_NOREG_RR_IMM_0_OPCODE_SN = 1,
87 BRANCH_OPCODE_X1 = 5,
88 BYTEX_UN_0_SHUN_0_OPCODE_X0 = 2,
89 BYTEX_UN_0_SHUN_0_OPCODE_Y0 = 2,
90 BZT_BRANCH_OPCODE_X1 = 1,
91 BZ_BRANCH_OPCODE_X1 = 0,
92 BZ_OPCODE_SN = 56,
93 CLZ_UN_0_SHUN_0_OPCODE_X0 = 3,
94 CLZ_UN_0_SHUN_0_OPCODE_Y0 = 3,
95 CRC32_32_SPECIAL_0_OPCODE_X0 = 9,
96 CRC32_8_SPECIAL_0_OPCODE_X0 = 10,
97 CTZ_UN_0_SHUN_0_OPCODE_X0 = 4,
98 CTZ_UN_0_SHUN_0_OPCODE_Y0 = 4,
99 DRAIN_UN_0_SHUN_0_OPCODE_X1 = 1,
100 DTLBPR_UN_0_SHUN_0_OPCODE_X1 = 2,
101 DWORD_ALIGN_SPECIAL_0_OPCODE_X0 = 95,
102 FINV_UN_0_SHUN_0_OPCODE_X1 = 3,
103 FLUSH_UN_0_SHUN_0_OPCODE_X1 = 4,
104 FNOP_NOREG_RR_IMM_0_OPCODE_SN = 3,
105 FNOP_UN_0_SHUN_0_OPCODE_X0 = 5,
106 FNOP_UN_0_SHUN_0_OPCODE_X1 = 5,
107 FNOP_UN_0_SHUN_0_OPCODE_Y0 = 5,
108 FNOP_UN_0_SHUN_0_OPCODE_Y1 = 1,
109 HALT_NOREG_RR_IMM_0_OPCODE_SN = 0,
110 ICOH_UN_0_SHUN_0_OPCODE_X1 = 6,
111 ILL_UN_0_SHUN_0_OPCODE_X1 = 7,
112 ILL_UN_0_SHUN_0_OPCODE_Y1 = 2,
113 IMM_0_OPCODE_SN = 0,
114 IMM_0_OPCODE_X0 = 4,
115 IMM_0_OPCODE_X1 = 6,
116 IMM_1_OPCODE_SN = 1,
117 IMM_OPCODE_0_X0 = 5,
118 INTHB_SPECIAL_0_OPCODE_X0 = 11,
119 INTHB_SPECIAL_0_OPCODE_X1 = 5,
120 INTHH_SPECIAL_0_OPCODE_X0 = 12,
121 INTHH_SPECIAL_0_OPCODE_X1 = 6,
122 INTLB_SPECIAL_0_OPCODE_X0 = 13,
123 INTLB_SPECIAL_0_OPCODE_X1 = 7,
124 INTLH_SPECIAL_0_OPCODE_X0 = 14,
125 INTLH_SPECIAL_0_OPCODE_X1 = 8,
126 INV_UN_0_SHUN_0_OPCODE_X1 = 8,
127 IRET_UN_0_SHUN_0_OPCODE_X1 = 9,
128 JALB_OPCODE_X1 = 13,
129 JALF_OPCODE_X1 = 12,
130 JALRP_SPECIAL_0_OPCODE_X1 = 9,
131 JALRR_IMM_1_OPCODE_SN = 3,
132 JALR_RR_IMM_0_OPCODE_SN = 5,
133 JALR_SPECIAL_0_OPCODE_X1 = 10,
134 JB_OPCODE_X1 = 11,
135 JF_OPCODE_X1 = 10,
136 JRP_SPECIAL_0_OPCODE_X1 = 11,
137 JRR_IMM_1_OPCODE_SN = 2,
138 JR_RR_IMM_0_OPCODE_SN = 4,
139 JR_SPECIAL_0_OPCODE_X1 = 12,
140 LBADD_IMM_0_OPCODE_X1 = 22,
141 LBADD_U_IMM_0_OPCODE_X1 = 23,
142 LB_OPCODE_Y2 = 0,
143 LB_UN_0_SHUN_0_OPCODE_X1 = 10,
144 LB_U_OPCODE_Y2 = 1,
145 LB_U_UN_0_SHUN_0_OPCODE_X1 = 11,
146 LHADD_IMM_0_OPCODE_X1 = 24,
147 LHADD_U_IMM_0_OPCODE_X1 = 25,
148 LH_OPCODE_Y2 = 2,
149 LH_UN_0_SHUN_0_OPCODE_X1 = 12,
150 LH_U_OPCODE_Y2 = 3,
151 LH_U_UN_0_SHUN_0_OPCODE_X1 = 13,
152 LNK_SPECIAL_0_OPCODE_X1 = 13,
153 LWADD_IMM_0_OPCODE_X1 = 26,
154 LWADD_NA_IMM_0_OPCODE_X1 = 27,
155 LW_NA_UN_0_SHUN_0_OPCODE_X1 = 24,
156 LW_OPCODE_Y2 = 4,
157 LW_UN_0_SHUN_0_OPCODE_X1 = 14,
158 MAXB_U_SPECIAL_0_OPCODE_X0 = 15,
159 MAXB_U_SPECIAL_0_OPCODE_X1 = 14,
160 MAXH_SPECIAL_0_OPCODE_X0 = 16,
161 MAXH_SPECIAL_0_OPCODE_X1 = 15,
162 MAXIB_U_IMM_0_OPCODE_X0 = 4,
163 MAXIB_U_IMM_0_OPCODE_X1 = 5,
164 MAXIH_IMM_0_OPCODE_X0 = 5,
165 MAXIH_IMM_0_OPCODE_X1 = 6,
166 MFSPR_IMM_0_OPCODE_X1 = 7,
167 MF_UN_0_SHUN_0_OPCODE_X1 = 15,
168 MINB_U_SPECIAL_0_OPCODE_X0 = 17,
169 MINB_U_SPECIAL_0_OPCODE_X1 = 16,
170 MINH_SPECIAL_0_OPCODE_X0 = 18,
171 MINH_SPECIAL_0_OPCODE_X1 = 17,
172 MINIB_U_IMM_0_OPCODE_X0 = 6,
173 MINIB_U_IMM_0_OPCODE_X1 = 8,
174 MINIH_IMM_0_OPCODE_X0 = 7,
175 MINIH_IMM_0_OPCODE_X1 = 9,
176 MM_OPCODE_X0 = 6,
177 MM_OPCODE_X1 = 7,
178 MNZB_SPECIAL_0_OPCODE_X0 = 19,
179 MNZB_SPECIAL_0_OPCODE_X1 = 18,
180 MNZH_SPECIAL_0_OPCODE_X0 = 20,
181 MNZH_SPECIAL_0_OPCODE_X1 = 19,
182 MNZ_SPECIAL_0_OPCODE_X0 = 21,
183 MNZ_SPECIAL_0_OPCODE_X1 = 20,
184 MNZ_SPECIAL_1_OPCODE_Y0 = 0,
185 MNZ_SPECIAL_1_OPCODE_Y1 = 1,
186 MOVEI_IMM_1_OPCODE_SN = 0,
187 MOVE_RR_IMM_0_OPCODE_SN = 8,
188 MTSPR_IMM_0_OPCODE_X1 = 10,
189 MULHHA_SS_SPECIAL_0_OPCODE_X0 = 22,
190 MULHHA_SS_SPECIAL_7_OPCODE_Y0 = 0,
191 MULHHA_SU_SPECIAL_0_OPCODE_X0 = 23,
192 MULHHA_UU_SPECIAL_0_OPCODE_X0 = 24,
193 MULHHA_UU_SPECIAL_7_OPCODE_Y0 = 1,
194 MULHHSA_UU_SPECIAL_0_OPCODE_X0 = 25,
195 MULHH_SS_SPECIAL_0_OPCODE_X0 = 26,
196 MULHH_SS_SPECIAL_6_OPCODE_Y0 = 0,
197 MULHH_SU_SPECIAL_0_OPCODE_X0 = 27,
198 MULHH_UU_SPECIAL_0_OPCODE_X0 = 28,
199 MULHH_UU_SPECIAL_6_OPCODE_Y0 = 1,
200 MULHLA_SS_SPECIAL_0_OPCODE_X0 = 29,
201 MULHLA_SU_SPECIAL_0_OPCODE_X0 = 30,
202 MULHLA_US_SPECIAL_0_OPCODE_X0 = 31,
203 MULHLA_UU_SPECIAL_0_OPCODE_X0 = 32,
204 MULHLSA_UU_SPECIAL_0_OPCODE_X0 = 33,
205 MULHLSA_UU_SPECIAL_5_OPCODE_Y0 = 0,
206 MULHL_SS_SPECIAL_0_OPCODE_X0 = 34,
207 MULHL_SU_SPECIAL_0_OPCODE_X0 = 35,
208 MULHL_US_SPECIAL_0_OPCODE_X0 = 36,
209 MULHL_UU_SPECIAL_0_OPCODE_X0 = 37,
210 MULLLA_SS_SPECIAL_0_OPCODE_X0 = 38,
211 MULLLA_SS_SPECIAL_7_OPCODE_Y0 = 2,
212 MULLLA_SU_SPECIAL_0_OPCODE_X0 = 39,
213 MULLLA_UU_SPECIAL_0_OPCODE_X0 = 40,
214 MULLLA_UU_SPECIAL_7_OPCODE_Y0 = 3,
215 MULLLSA_UU_SPECIAL_0_OPCODE_X0 = 41,
216 MULLL_SS_SPECIAL_0_OPCODE_X0 = 42,
217 MULLL_SS_SPECIAL_6_OPCODE_Y0 = 2,
218 MULLL_SU_SPECIAL_0_OPCODE_X0 = 43,
219 MULLL_UU_SPECIAL_0_OPCODE_X0 = 44,
220 MULLL_UU_SPECIAL_6_OPCODE_Y0 = 3,
221 MVNZ_SPECIAL_0_OPCODE_X0 = 45,
222 MVNZ_SPECIAL_1_OPCODE_Y0 = 1,
223 MVZ_SPECIAL_0_OPCODE_X0 = 46,
224 MVZ_SPECIAL_1_OPCODE_Y0 = 2,
225 MZB_SPECIAL_0_OPCODE_X0 = 47,
226 MZB_SPECIAL_0_OPCODE_X1 = 21,
227 MZH_SPECIAL_0_OPCODE_X0 = 48,
228 MZH_SPECIAL_0_OPCODE_X1 = 22,
229 MZ_SPECIAL_0_OPCODE_X0 = 49,
230 MZ_SPECIAL_0_OPCODE_X1 = 23,
231 MZ_SPECIAL_1_OPCODE_Y0 = 3,
232 MZ_SPECIAL_1_OPCODE_Y1 = 2,
233 NAP_UN_0_SHUN_0_OPCODE_X1 = 16,
234 NOP_NOREG_RR_IMM_0_OPCODE_SN = 2,
235 NOP_UN_0_SHUN_0_OPCODE_X0 = 6,
236 NOP_UN_0_SHUN_0_OPCODE_X1 = 17,
237 NOP_UN_0_SHUN_0_OPCODE_Y0 = 6,
238 NOP_UN_0_SHUN_0_OPCODE_Y1 = 3,
239 NOREG_RR_IMM_0_OPCODE_SN = 0,
240 NOR_SPECIAL_0_OPCODE_X0 = 50,
241 NOR_SPECIAL_0_OPCODE_X1 = 24,
242 NOR_SPECIAL_2_OPCODE_Y0 = 1,
243 NOR_SPECIAL_2_OPCODE_Y1 = 1,
244 ORI_IMM_0_OPCODE_X0 = 8,
245 ORI_IMM_0_OPCODE_X1 = 11,
246 ORI_OPCODE_Y0 = 11,
247 ORI_OPCODE_Y1 = 9,
248 OR_SPECIAL_0_OPCODE_X0 = 51,
249 OR_SPECIAL_0_OPCODE_X1 = 25,
250 OR_SPECIAL_2_OPCODE_Y0 = 2,
251 OR_SPECIAL_2_OPCODE_Y1 = 2,
252 PACKBS_U_SPECIAL_0_OPCODE_X0 = 103,
253 PACKBS_U_SPECIAL_0_OPCODE_X1 = 73,
254 PACKHB_SPECIAL_0_OPCODE_X0 = 52,
255 PACKHB_SPECIAL_0_OPCODE_X1 = 26,
256 PACKHS_SPECIAL_0_OPCODE_X0 = 102,
257 PACKHS_SPECIAL_0_OPCODE_X1 = 72,
258 PACKLB_SPECIAL_0_OPCODE_X0 = 53,
259 PACKLB_SPECIAL_0_OPCODE_X1 = 27,
260 PCNT_UN_0_SHUN_0_OPCODE_X0 = 7,
261 PCNT_UN_0_SHUN_0_OPCODE_Y0 = 7,
262 RLI_SHUN_0_OPCODE_X0 = 1,
263 RLI_SHUN_0_OPCODE_X1 = 1,
264 RLI_SHUN_0_OPCODE_Y0 = 1,
265 RLI_SHUN_0_OPCODE_Y1 = 1,
266 RL_SPECIAL_0_OPCODE_X0 = 54,
267 RL_SPECIAL_0_OPCODE_X1 = 28,
268 RL_SPECIAL_3_OPCODE_Y0 = 0,
269 RL_SPECIAL_3_OPCODE_Y1 = 0,
270 RR_IMM_0_OPCODE_SN = 0,
271 S1A_SPECIAL_0_OPCODE_X0 = 55,
272 S1A_SPECIAL_0_OPCODE_X1 = 29,
273 S1A_SPECIAL_0_OPCODE_Y0 = 1,
274 S1A_SPECIAL_0_OPCODE_Y1 = 1,
275 S2A_SPECIAL_0_OPCODE_X0 = 56,
276 S2A_SPECIAL_0_OPCODE_X1 = 30,
277 S2A_SPECIAL_0_OPCODE_Y0 = 2,
278 S2A_SPECIAL_0_OPCODE_Y1 = 2,
279 S3A_SPECIAL_0_OPCODE_X0 = 57,
280 S3A_SPECIAL_0_OPCODE_X1 = 31,
281 S3A_SPECIAL_5_OPCODE_Y0 = 1,
282 S3A_SPECIAL_5_OPCODE_Y1 = 1,
283 SADAB_U_SPECIAL_0_OPCODE_X0 = 58,
284 SADAH_SPECIAL_0_OPCODE_X0 = 59,
285 SADAH_U_SPECIAL_0_OPCODE_X0 = 60,
286 SADB_U_SPECIAL_0_OPCODE_X0 = 61,
287 SADH_SPECIAL_0_OPCODE_X0 = 62,
288 SADH_U_SPECIAL_0_OPCODE_X0 = 63,
289 SBADD_IMM_0_OPCODE_X1 = 28,
290 SB_OPCODE_Y2 = 5,
291 SB_SPECIAL_0_OPCODE_X1 = 32,
292 SEQB_SPECIAL_0_OPCODE_X0 = 64,
293 SEQB_SPECIAL_0_OPCODE_X1 = 33,
294 SEQH_SPECIAL_0_OPCODE_X0 = 65,
295 SEQH_SPECIAL_0_OPCODE_X1 = 34,
296 SEQIB_IMM_0_OPCODE_X0 = 9,
297 SEQIB_IMM_0_OPCODE_X1 = 12,
298 SEQIH_IMM_0_OPCODE_X0 = 10,
299 SEQIH_IMM_0_OPCODE_X1 = 13,
300 SEQI_IMM_0_OPCODE_X0 = 11,
301 SEQI_IMM_0_OPCODE_X1 = 14,
302 SEQI_OPCODE_Y0 = 12,
303 SEQI_OPCODE_Y1 = 10,
304 SEQ_SPECIAL_0_OPCODE_X0 = 66,
305 SEQ_SPECIAL_0_OPCODE_X1 = 35,
306 SEQ_SPECIAL_5_OPCODE_Y0 = 2,
307 SEQ_SPECIAL_5_OPCODE_Y1 = 2,
308 SHADD_IMM_0_OPCODE_X1 = 29,
309 SHL8II_IMM_0_OPCODE_SN = 3,
310 SHLB_SPECIAL_0_OPCODE_X0 = 67,
311 SHLB_SPECIAL_0_OPCODE_X1 = 36,
312 SHLH_SPECIAL_0_OPCODE_X0 = 68,
313 SHLH_SPECIAL_0_OPCODE_X1 = 37,
314 SHLIB_SHUN_0_OPCODE_X0 = 2,
315 SHLIB_SHUN_0_OPCODE_X1 = 2,
316 SHLIH_SHUN_0_OPCODE_X0 = 3,
317 SHLIH_SHUN_0_OPCODE_X1 = 3,
318 SHLI_SHUN_0_OPCODE_X0 = 4,
319 SHLI_SHUN_0_OPCODE_X1 = 4,
320 SHLI_SHUN_0_OPCODE_Y0 = 2,
321 SHLI_SHUN_0_OPCODE_Y1 = 2,
322 SHL_SPECIAL_0_OPCODE_X0 = 69,
323 SHL_SPECIAL_0_OPCODE_X1 = 38,
324 SHL_SPECIAL_3_OPCODE_Y0 = 1,
325 SHL_SPECIAL_3_OPCODE_Y1 = 1,
326 SHR1_RR_IMM_0_OPCODE_SN = 9,
327 SHRB_SPECIAL_0_OPCODE_X0 = 70,
328 SHRB_SPECIAL_0_OPCODE_X1 = 39,
329 SHRH_SPECIAL_0_OPCODE_X0 = 71,
330 SHRH_SPECIAL_0_OPCODE_X1 = 40,
331 SHRIB_SHUN_0_OPCODE_X0 = 5,
332 SHRIB_SHUN_0_OPCODE_X1 = 5,
333 SHRIH_SHUN_0_OPCODE_X0 = 6,
334 SHRIH_SHUN_0_OPCODE_X1 = 6,
335 SHRI_SHUN_0_OPCODE_X0 = 7,
336 SHRI_SHUN_0_OPCODE_X1 = 7,
337 SHRI_SHUN_0_OPCODE_Y0 = 3,
338 SHRI_SHUN_0_OPCODE_Y1 = 3,
339 SHR_SPECIAL_0_OPCODE_X0 = 72,
340 SHR_SPECIAL_0_OPCODE_X1 = 41,
341 SHR_SPECIAL_3_OPCODE_Y0 = 2,
342 SHR_SPECIAL_3_OPCODE_Y1 = 2,
343 SHUN_0_OPCODE_X0 = 7,
344 SHUN_0_OPCODE_X1 = 8,
345 SHUN_0_OPCODE_Y0 = 13,
346 SHUN_0_OPCODE_Y1 = 11,
347 SH_OPCODE_Y2 = 6,
348 SH_SPECIAL_0_OPCODE_X1 = 42,
349 SLTB_SPECIAL_0_OPCODE_X0 = 73,
350 SLTB_SPECIAL_0_OPCODE_X1 = 43,
351 SLTB_U_SPECIAL_0_OPCODE_X0 = 74,
352 SLTB_U_SPECIAL_0_OPCODE_X1 = 44,
353 SLTEB_SPECIAL_0_OPCODE_X0 = 75,
354 SLTEB_SPECIAL_0_OPCODE_X1 = 45,
355 SLTEB_U_SPECIAL_0_OPCODE_X0 = 76,
356 SLTEB_U_SPECIAL_0_OPCODE_X1 = 46,
357 SLTEH_SPECIAL_0_OPCODE_X0 = 77,
358 SLTEH_SPECIAL_0_OPCODE_X1 = 47,
359 SLTEH_U_SPECIAL_0_OPCODE_X0 = 78,
360 SLTEH_U_SPECIAL_0_OPCODE_X1 = 48,
361 SLTE_SPECIAL_0_OPCODE_X0 = 79,
362 SLTE_SPECIAL_0_OPCODE_X1 = 49,
363 SLTE_SPECIAL_4_OPCODE_Y0 = 0,
364 SLTE_SPECIAL_4_OPCODE_Y1 = 0,
365 SLTE_U_SPECIAL_0_OPCODE_X0 = 80,
366 SLTE_U_SPECIAL_0_OPCODE_X1 = 50,
367 SLTE_U_SPECIAL_4_OPCODE_Y0 = 1,
368 SLTE_U_SPECIAL_4_OPCODE_Y1 = 1,
369 SLTH_SPECIAL_0_OPCODE_X0 = 81,
370 SLTH_SPECIAL_0_OPCODE_X1 = 51,
371 SLTH_U_SPECIAL_0_OPCODE_X0 = 82,
372 SLTH_U_SPECIAL_0_OPCODE_X1 = 52,
373 SLTIB_IMM_0_OPCODE_X0 = 12,
374 SLTIB_IMM_0_OPCODE_X1 = 15,
375 SLTIB_U_IMM_0_OPCODE_X0 = 13,
376 SLTIB_U_IMM_0_OPCODE_X1 = 16,
377 SLTIH_IMM_0_OPCODE_X0 = 14,
378 SLTIH_IMM_0_OPCODE_X1 = 17,
379 SLTIH_U_IMM_0_OPCODE_X0 = 15,
380 SLTIH_U_IMM_0_OPCODE_X1 = 18,
381 SLTI_IMM_0_OPCODE_X0 = 16,
382 SLTI_IMM_0_OPCODE_X1 = 19,
383 SLTI_OPCODE_Y0 = 14,
384 SLTI_OPCODE_Y1 = 12,
385 SLTI_U_IMM_0_OPCODE_X0 = 17,
386 SLTI_U_IMM_0_OPCODE_X1 = 20,
387 SLTI_U_OPCODE_Y0 = 15,
388 SLTI_U_OPCODE_Y1 = 13,
389 SLT_SPECIAL_0_OPCODE_X0 = 83,
390 SLT_SPECIAL_0_OPCODE_X1 = 53,
391 SLT_SPECIAL_4_OPCODE_Y0 = 2,
392 SLT_SPECIAL_4_OPCODE_Y1 = 2,
393 SLT_U_SPECIAL_0_OPCODE_X0 = 84,
394 SLT_U_SPECIAL_0_OPCODE_X1 = 54,
395 SLT_U_SPECIAL_4_OPCODE_Y0 = 3,
396 SLT_U_SPECIAL_4_OPCODE_Y1 = 3,
397 SNEB_SPECIAL_0_OPCODE_X0 = 85,
398 SNEB_SPECIAL_0_OPCODE_X1 = 55,
399 SNEH_SPECIAL_0_OPCODE_X0 = 86,
400 SNEH_SPECIAL_0_OPCODE_X1 = 56,
401 SNE_SPECIAL_0_OPCODE_X0 = 87,
402 SNE_SPECIAL_0_OPCODE_X1 = 57,
403 SNE_SPECIAL_5_OPCODE_Y0 = 3,
404 SNE_SPECIAL_5_OPCODE_Y1 = 3,
405 SPECIAL_0_OPCODE_X0 = 0,
406 SPECIAL_0_OPCODE_X1 = 1,
407 SPECIAL_0_OPCODE_Y0 = 1,
408 SPECIAL_0_OPCODE_Y1 = 1,
409 SPECIAL_1_OPCODE_Y0 = 2,
410 SPECIAL_1_OPCODE_Y1 = 2,
411 SPECIAL_2_OPCODE_Y0 = 3,
412 SPECIAL_2_OPCODE_Y1 = 3,
413 SPECIAL_3_OPCODE_Y0 = 4,
414 SPECIAL_3_OPCODE_Y1 = 4,
415 SPECIAL_4_OPCODE_Y0 = 5,
416 SPECIAL_4_OPCODE_Y1 = 5,
417 SPECIAL_5_OPCODE_Y0 = 6,
418 SPECIAL_5_OPCODE_Y1 = 6,
419 SPECIAL_6_OPCODE_Y0 = 7,
420 SPECIAL_7_OPCODE_Y0 = 8,
421 SRAB_SPECIAL_0_OPCODE_X0 = 88,
422 SRAB_SPECIAL_0_OPCODE_X1 = 58,
423 SRAH_SPECIAL_0_OPCODE_X0 = 89,
424 SRAH_SPECIAL_0_OPCODE_X1 = 59,
425 SRAIB_SHUN_0_OPCODE_X0 = 8,
426 SRAIB_SHUN_0_OPCODE_X1 = 8,
427 SRAIH_SHUN_0_OPCODE_X0 = 9,
428 SRAIH_SHUN_0_OPCODE_X1 = 9,
429 SRAI_SHUN_0_OPCODE_X0 = 10,
430 SRAI_SHUN_0_OPCODE_X1 = 10,
431 SRAI_SHUN_0_OPCODE_Y0 = 4,
432 SRAI_SHUN_0_OPCODE_Y1 = 4,
433 SRA_SPECIAL_0_OPCODE_X0 = 90,
434 SRA_SPECIAL_0_OPCODE_X1 = 60,
435 SRA_SPECIAL_3_OPCODE_Y0 = 3,
436 SRA_SPECIAL_3_OPCODE_Y1 = 3,
437 SUBBS_U_SPECIAL_0_OPCODE_X0 = 100,
438 SUBBS_U_SPECIAL_0_OPCODE_X1 = 70,
439 SUBB_SPECIAL_0_OPCODE_X0 = 91,
440 SUBB_SPECIAL_0_OPCODE_X1 = 61,
441 SUBHS_SPECIAL_0_OPCODE_X0 = 101,
442 SUBHS_SPECIAL_0_OPCODE_X1 = 71,
443 SUBH_SPECIAL_0_OPCODE_X0 = 92,
444 SUBH_SPECIAL_0_OPCODE_X1 = 62,
445 SUBS_SPECIAL_0_OPCODE_X0 = 97,
446 SUBS_SPECIAL_0_OPCODE_X1 = 67,
447 SUB_SPECIAL_0_OPCODE_X0 = 93,
448 SUB_SPECIAL_0_OPCODE_X1 = 63,
449 SUB_SPECIAL_0_OPCODE_Y0 = 3,
450 SUB_SPECIAL_0_OPCODE_Y1 = 3,
451 SWADD_IMM_0_OPCODE_X1 = 30,
452 SWINT0_UN_0_SHUN_0_OPCODE_X1 = 18,
453 SWINT1_UN_0_SHUN_0_OPCODE_X1 = 19,
454 SWINT2_UN_0_SHUN_0_OPCODE_X1 = 20,
455 SWINT3_UN_0_SHUN_0_OPCODE_X1 = 21,
456 SW_OPCODE_Y2 = 7,
457 SW_SPECIAL_0_OPCODE_X1 = 64,
458 TBLIDXB0_UN_0_SHUN_0_OPCODE_X0 = 8,
459 TBLIDXB0_UN_0_SHUN_0_OPCODE_Y0 = 8,
460 TBLIDXB1_UN_0_SHUN_0_OPCODE_X0 = 9,
461 TBLIDXB1_UN_0_SHUN_0_OPCODE_Y0 = 9,
462 TBLIDXB2_UN_0_SHUN_0_OPCODE_X0 = 10,
463 TBLIDXB2_UN_0_SHUN_0_OPCODE_Y0 = 10,
464 TBLIDXB3_UN_0_SHUN_0_OPCODE_X0 = 11,
465 TBLIDXB3_UN_0_SHUN_0_OPCODE_Y0 = 11,
466 TNS_UN_0_SHUN_0_OPCODE_X1 = 22,
467 UN_0_SHUN_0_OPCODE_X0 = 11,
468 UN_0_SHUN_0_OPCODE_X1 = 11,
469 UN_0_SHUN_0_OPCODE_Y0 = 5,
470 UN_0_SHUN_0_OPCODE_Y1 = 5,
471 WH64_UN_0_SHUN_0_OPCODE_X1 = 23,
472 XORI_IMM_0_OPCODE_X0 = 2,
473 XORI_IMM_0_OPCODE_X1 = 21,
474 XOR_SPECIAL_0_OPCODE_X0 = 94,
475 XOR_SPECIAL_0_OPCODE_X1 = 65,
476 XOR_SPECIAL_2_OPCODE_Y0 = 3,
477 XOR_SPECIAL_2_OPCODE_Y1 = 3
478};
479
480#endif /* !_TILE_OPCODE_CONSTANTS_H */
diff --git a/arch/tile/include/asm/opcode_constants_64.h b/arch/tile/include/asm/opcode_constants_64.h
new file mode 100644
index 000000000000..227d033b180c
--- /dev/null
+++ b/arch/tile/include/asm/opcode_constants_64.h
@@ -0,0 +1,480 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15/* This file is machine-generated; DO NOT EDIT! */
16
17
18#ifndef _TILE_OPCODE_CONSTANTS_H
19#define _TILE_OPCODE_CONSTANTS_H
20enum
21{
22 ADDBS_U_SPECIAL_0_OPCODE_X0 = 98,
23 ADDBS_U_SPECIAL_0_OPCODE_X1 = 68,
24 ADDB_SPECIAL_0_OPCODE_X0 = 1,
25 ADDB_SPECIAL_0_OPCODE_X1 = 1,
26 ADDHS_SPECIAL_0_OPCODE_X0 = 99,
27 ADDHS_SPECIAL_0_OPCODE_X1 = 69,
28 ADDH_SPECIAL_0_OPCODE_X0 = 2,
29 ADDH_SPECIAL_0_OPCODE_X1 = 2,
30 ADDIB_IMM_0_OPCODE_X0 = 1,
31 ADDIB_IMM_0_OPCODE_X1 = 1,
32 ADDIH_IMM_0_OPCODE_X0 = 2,
33 ADDIH_IMM_0_OPCODE_X1 = 2,
34 ADDI_IMM_0_OPCODE_X0 = 3,
35 ADDI_IMM_0_OPCODE_X1 = 3,
36 ADDI_IMM_1_OPCODE_SN = 1,
37 ADDI_OPCODE_Y0 = 9,
38 ADDI_OPCODE_Y1 = 7,
39 ADDLIS_OPCODE_X0 = 1,
40 ADDLIS_OPCODE_X1 = 2,
41 ADDLI_OPCODE_X0 = 2,
42 ADDLI_OPCODE_X1 = 3,
43 ADDS_SPECIAL_0_OPCODE_X0 = 96,
44 ADDS_SPECIAL_0_OPCODE_X1 = 66,
45 ADD_SPECIAL_0_OPCODE_X0 = 3,
46 ADD_SPECIAL_0_OPCODE_X1 = 3,
47 ADD_SPECIAL_0_OPCODE_Y0 = 0,
48 ADD_SPECIAL_0_OPCODE_Y1 = 0,
49 ADIFFB_U_SPECIAL_0_OPCODE_X0 = 4,
50 ADIFFH_SPECIAL_0_OPCODE_X0 = 5,
51 ANDI_IMM_0_OPCODE_X0 = 1,
52 ANDI_IMM_0_OPCODE_X1 = 4,
53 ANDI_OPCODE_Y0 = 10,
54 ANDI_OPCODE_Y1 = 8,
55 AND_SPECIAL_0_OPCODE_X0 = 6,
56 AND_SPECIAL_0_OPCODE_X1 = 4,
57 AND_SPECIAL_2_OPCODE_Y0 = 0,
58 AND_SPECIAL_2_OPCODE_Y1 = 0,
59 AULI_OPCODE_X0 = 3,
60 AULI_OPCODE_X1 = 4,
61 AVGB_U_SPECIAL_0_OPCODE_X0 = 7,
62 AVGH_SPECIAL_0_OPCODE_X0 = 8,
63 BBNST_BRANCH_OPCODE_X1 = 15,
64 BBNS_BRANCH_OPCODE_X1 = 14,
65 BBNS_OPCODE_SN = 63,
66 BBST_BRANCH_OPCODE_X1 = 13,
67 BBS_BRANCH_OPCODE_X1 = 12,
68 BBS_OPCODE_SN = 62,
69 BGEZT_BRANCH_OPCODE_X1 = 7,
70 BGEZ_BRANCH_OPCODE_X1 = 6,
71 BGEZ_OPCODE_SN = 61,
72 BGZT_BRANCH_OPCODE_X1 = 5,
73 BGZ_BRANCH_OPCODE_X1 = 4,
74 BGZ_OPCODE_SN = 58,
75 BITX_UN_0_SHUN_0_OPCODE_X0 = 1,
76 BITX_UN_0_SHUN_0_OPCODE_Y0 = 1,
77 BLEZT_BRANCH_OPCODE_X1 = 11,
78 BLEZ_BRANCH_OPCODE_X1 = 10,
79 BLEZ_OPCODE_SN = 59,
80 BLZT_BRANCH_OPCODE_X1 = 9,
81 BLZ_BRANCH_OPCODE_X1 = 8,
82 BLZ_OPCODE_SN = 60,
83 BNZT_BRANCH_OPCODE_X1 = 3,
84 BNZ_BRANCH_OPCODE_X1 = 2,
85 BNZ_OPCODE_SN = 57,
86 BPT_NOREG_RR_IMM_0_OPCODE_SN = 1,
87 BRANCH_OPCODE_X1 = 5,
88 BYTEX_UN_0_SHUN_0_OPCODE_X0 = 2,
89 BYTEX_UN_0_SHUN_0_OPCODE_Y0 = 2,
90 BZT_BRANCH_OPCODE_X1 = 1,
91 BZ_BRANCH_OPCODE_X1 = 0,
92 BZ_OPCODE_SN = 56,
93 CLZ_UN_0_SHUN_0_OPCODE_X0 = 3,
94 CLZ_UN_0_SHUN_0_OPCODE_Y0 = 3,
95 CRC32_32_SPECIAL_0_OPCODE_X0 = 9,
96 CRC32_8_SPECIAL_0_OPCODE_X0 = 10,
97 CTZ_UN_0_SHUN_0_OPCODE_X0 = 4,
98 CTZ_UN_0_SHUN_0_OPCODE_Y0 = 4,
99 DRAIN_UN_0_SHUN_0_OPCODE_X1 = 1,
100 DTLBPR_UN_0_SHUN_0_OPCODE_X1 = 2,
101 DWORD_ALIGN_SPECIAL_0_OPCODE_X0 = 95,
102 FINV_UN_0_SHUN_0_OPCODE_X1 = 3,
103 FLUSH_UN_0_SHUN_0_OPCODE_X1 = 4,
104 FNOP_NOREG_RR_IMM_0_OPCODE_SN = 3,
105 FNOP_UN_0_SHUN_0_OPCODE_X0 = 5,
106 FNOP_UN_0_SHUN_0_OPCODE_X1 = 5,
107 FNOP_UN_0_SHUN_0_OPCODE_Y0 = 5,
108 FNOP_UN_0_SHUN_0_OPCODE_Y1 = 1,
109 HALT_NOREG_RR_IMM_0_OPCODE_SN = 0,
110 ICOH_UN_0_SHUN_0_OPCODE_X1 = 6,
111 ILL_UN_0_SHUN_0_OPCODE_X1 = 7,
112 ILL_UN_0_SHUN_0_OPCODE_Y1 = 2,
113 IMM_0_OPCODE_SN = 0,
114 IMM_0_OPCODE_X0 = 4,
115 IMM_0_OPCODE_X1 = 6,
116 IMM_1_OPCODE_SN = 1,
117 IMM_OPCODE_0_X0 = 5,
118 INTHB_SPECIAL_0_OPCODE_X0 = 11,
119 INTHB_SPECIAL_0_OPCODE_X1 = 5,
120 INTHH_SPECIAL_0_OPCODE_X0 = 12,
121 INTHH_SPECIAL_0_OPCODE_X1 = 6,
122 INTLB_SPECIAL_0_OPCODE_X0 = 13,
123 INTLB_SPECIAL_0_OPCODE_X1 = 7,
124 INTLH_SPECIAL_0_OPCODE_X0 = 14,
125 INTLH_SPECIAL_0_OPCODE_X1 = 8,
126 INV_UN_0_SHUN_0_OPCODE_X1 = 8,
127 IRET_UN_0_SHUN_0_OPCODE_X1 = 9,
128 JALB_OPCODE_X1 = 13,
129 JALF_OPCODE_X1 = 12,
130 JALRP_SPECIAL_0_OPCODE_X1 = 9,
131 JALRR_IMM_1_OPCODE_SN = 3,
132 JALR_RR_IMM_0_OPCODE_SN = 5,
133 JALR_SPECIAL_0_OPCODE_X1 = 10,
134 JB_OPCODE_X1 = 11,
135 JF_OPCODE_X1 = 10,
136 JRP_SPECIAL_0_OPCODE_X1 = 11,
137 JRR_IMM_1_OPCODE_SN = 2,
138 JR_RR_IMM_0_OPCODE_SN = 4,
139 JR_SPECIAL_0_OPCODE_X1 = 12,
140 LBADD_IMM_0_OPCODE_X1 = 22,
141 LBADD_U_IMM_0_OPCODE_X1 = 23,
142 LB_OPCODE_Y2 = 0,
143 LB_UN_0_SHUN_0_OPCODE_X1 = 10,
144 LB_U_OPCODE_Y2 = 1,
145 LB_U_UN_0_SHUN_0_OPCODE_X1 = 11,
146 LHADD_IMM_0_OPCODE_X1 = 24,
147 LHADD_U_IMM_0_OPCODE_X1 = 25,
148 LH_OPCODE_Y2 = 2,
149 LH_UN_0_SHUN_0_OPCODE_X1 = 12,
150 LH_U_OPCODE_Y2 = 3,
151 LH_U_UN_0_SHUN_0_OPCODE_X1 = 13,
152 LNK_SPECIAL_0_OPCODE_X1 = 13,
153 LWADD_IMM_0_OPCODE_X1 = 26,
154 LWADD_NA_IMM_0_OPCODE_X1 = 27,
155 LW_NA_UN_0_SHUN_0_OPCODE_X1 = 24,
156 LW_OPCODE_Y2 = 4,
157 LW_UN_0_SHUN_0_OPCODE_X1 = 14,
158 MAXB_U_SPECIAL_0_OPCODE_X0 = 15,
159 MAXB_U_SPECIAL_0_OPCODE_X1 = 14,
160 MAXH_SPECIAL_0_OPCODE_X0 = 16,
161 MAXH_SPECIAL_0_OPCODE_X1 = 15,
162 MAXIB_U_IMM_0_OPCODE_X0 = 4,
163 MAXIB_U_IMM_0_OPCODE_X1 = 5,
164 MAXIH_IMM_0_OPCODE_X0 = 5,
165 MAXIH_IMM_0_OPCODE_X1 = 6,
166 MFSPR_IMM_0_OPCODE_X1 = 7,
167 MF_UN_0_SHUN_0_OPCODE_X1 = 15,
168 MINB_U_SPECIAL_0_OPCODE_X0 = 17,
169 MINB_U_SPECIAL_0_OPCODE_X1 = 16,
170 MINH_SPECIAL_0_OPCODE_X0 = 18,
171 MINH_SPECIAL_0_OPCODE_X1 = 17,
172 MINIB_U_IMM_0_OPCODE_X0 = 6,
173 MINIB_U_IMM_0_OPCODE_X1 = 8,
174 MINIH_IMM_0_OPCODE_X0 = 7,
175 MINIH_IMM_0_OPCODE_X1 = 9,
176 MM_OPCODE_X0 = 6,
177 MM_OPCODE_X1 = 7,
178 MNZB_SPECIAL_0_OPCODE_X0 = 19,
179 MNZB_SPECIAL_0_OPCODE_X1 = 18,
180 MNZH_SPECIAL_0_OPCODE_X0 = 20,
181 MNZH_SPECIAL_0_OPCODE_X1 = 19,
182 MNZ_SPECIAL_0_OPCODE_X0 = 21,
183 MNZ_SPECIAL_0_OPCODE_X1 = 20,
184 MNZ_SPECIAL_1_OPCODE_Y0 = 0,
185 MNZ_SPECIAL_1_OPCODE_Y1 = 1,
186 MOVEI_IMM_1_OPCODE_SN = 0,
187 MOVE_RR_IMM_0_OPCODE_SN = 8,
188 MTSPR_IMM_0_OPCODE_X1 = 10,
189 MULHHA_SS_SPECIAL_0_OPCODE_X0 = 22,
190 MULHHA_SS_SPECIAL_7_OPCODE_Y0 = 0,
191 MULHHA_SU_SPECIAL_0_OPCODE_X0 = 23,
192 MULHHA_UU_SPECIAL_0_OPCODE_X0 = 24,
193 MULHHA_UU_SPECIAL_7_OPCODE_Y0 = 1,
194 MULHHSA_UU_SPECIAL_0_OPCODE_X0 = 25,
195 MULHH_SS_SPECIAL_0_OPCODE_X0 = 26,
196 MULHH_SS_SPECIAL_6_OPCODE_Y0 = 0,
197 MULHH_SU_SPECIAL_0_OPCODE_X0 = 27,
198 MULHH_UU_SPECIAL_0_OPCODE_X0 = 28,
199 MULHH_UU_SPECIAL_6_OPCODE_Y0 = 1,
200 MULHLA_SS_SPECIAL_0_OPCODE_X0 = 29,
201 MULHLA_SU_SPECIAL_0_OPCODE_X0 = 30,
202 MULHLA_US_SPECIAL_0_OPCODE_X0 = 31,
203 MULHLA_UU_SPECIAL_0_OPCODE_X0 = 32,
204 MULHLSA_UU_SPECIAL_0_OPCODE_X0 = 33,
205 MULHLSA_UU_SPECIAL_5_OPCODE_Y0 = 0,
206 MULHL_SS_SPECIAL_0_OPCODE_X0 = 34,
207 MULHL_SU_SPECIAL_0_OPCODE_X0 = 35,
208 MULHL_US_SPECIAL_0_OPCODE_X0 = 36,
209 MULHL_UU_SPECIAL_0_OPCODE_X0 = 37,
210 MULLLA_SS_SPECIAL_0_OPCODE_X0 = 38,
211 MULLLA_SS_SPECIAL_7_OPCODE_Y0 = 2,
212 MULLLA_SU_SPECIAL_0_OPCODE_X0 = 39,
213 MULLLA_UU_SPECIAL_0_OPCODE_X0 = 40,
214 MULLLA_UU_SPECIAL_7_OPCODE_Y0 = 3,
215 MULLLSA_UU_SPECIAL_0_OPCODE_X0 = 41,
216 MULLL_SS_SPECIAL_0_OPCODE_X0 = 42,
217 MULLL_SS_SPECIAL_6_OPCODE_Y0 = 2,
218 MULLL_SU_SPECIAL_0_OPCODE_X0 = 43,
219 MULLL_UU_SPECIAL_0_OPCODE_X0 = 44,
220 MULLL_UU_SPECIAL_6_OPCODE_Y0 = 3,
221 MVNZ_SPECIAL_0_OPCODE_X0 = 45,
222 MVNZ_SPECIAL_1_OPCODE_Y0 = 1,
223 MVZ_SPECIAL_0_OPCODE_X0 = 46,
224 MVZ_SPECIAL_1_OPCODE_Y0 = 2,
225 MZB_SPECIAL_0_OPCODE_X0 = 47,
226 MZB_SPECIAL_0_OPCODE_X1 = 21,
227 MZH_SPECIAL_0_OPCODE_X0 = 48,
228 MZH_SPECIAL_0_OPCODE_X1 = 22,
229 MZ_SPECIAL_0_OPCODE_X0 = 49,
230 MZ_SPECIAL_0_OPCODE_X1 = 23,
231 MZ_SPECIAL_1_OPCODE_Y0 = 3,
232 MZ_SPECIAL_1_OPCODE_Y1 = 2,
233 NAP_UN_0_SHUN_0_OPCODE_X1 = 16,
234 NOP_NOREG_RR_IMM_0_OPCODE_SN = 2,
235 NOP_UN_0_SHUN_0_OPCODE_X0 = 6,
236 NOP_UN_0_SHUN_0_OPCODE_X1 = 17,
237 NOP_UN_0_SHUN_0_OPCODE_Y0 = 6,
238 NOP_UN_0_SHUN_0_OPCODE_Y1 = 3,
239 NOREG_RR_IMM_0_OPCODE_SN = 0,
240 NOR_SPECIAL_0_OPCODE_X0 = 50,
241 NOR_SPECIAL_0_OPCODE_X1 = 24,
242 NOR_SPECIAL_2_OPCODE_Y0 = 1,
243 NOR_SPECIAL_2_OPCODE_Y1 = 1,
244 ORI_IMM_0_OPCODE_X0 = 8,
245 ORI_IMM_0_OPCODE_X1 = 11,
246 ORI_OPCODE_Y0 = 11,
247 ORI_OPCODE_Y1 = 9,
248 OR_SPECIAL_0_OPCODE_X0 = 51,
249 OR_SPECIAL_0_OPCODE_X1 = 25,
250 OR_SPECIAL_2_OPCODE_Y0 = 2,
251 OR_SPECIAL_2_OPCODE_Y1 = 2,
252 PACKBS_U_SPECIAL_0_OPCODE_X0 = 103,
253 PACKBS_U_SPECIAL_0_OPCODE_X1 = 73,
254 PACKHB_SPECIAL_0_OPCODE_X0 = 52,
255 PACKHB_SPECIAL_0_OPCODE_X1 = 26,
256 PACKHS_SPECIAL_0_OPCODE_X0 = 102,
257 PACKHS_SPECIAL_0_OPCODE_X1 = 72,
258 PACKLB_SPECIAL_0_OPCODE_X0 = 53,
259 PACKLB_SPECIAL_0_OPCODE_X1 = 27,
260 PCNT_UN_0_SHUN_0_OPCODE_X0 = 7,
261 PCNT_UN_0_SHUN_0_OPCODE_Y0 = 7,
262 RLI_SHUN_0_OPCODE_X0 = 1,
263 RLI_SHUN_0_OPCODE_X1 = 1,
264 RLI_SHUN_0_OPCODE_Y0 = 1,
265 RLI_SHUN_0_OPCODE_Y1 = 1,
266 RL_SPECIAL_0_OPCODE_X0 = 54,
267 RL_SPECIAL_0_OPCODE_X1 = 28,
268 RL_SPECIAL_3_OPCODE_Y0 = 0,
269 RL_SPECIAL_3_OPCODE_Y1 = 0,
270 RR_IMM_0_OPCODE_SN = 0,
271 S1A_SPECIAL_0_OPCODE_X0 = 55,
272 S1A_SPECIAL_0_OPCODE_X1 = 29,
273 S1A_SPECIAL_0_OPCODE_Y0 = 1,
274 S1A_SPECIAL_0_OPCODE_Y1 = 1,
275 S2A_SPECIAL_0_OPCODE_X0 = 56,
276 S2A_SPECIAL_0_OPCODE_X1 = 30,
277 S2A_SPECIAL_0_OPCODE_Y0 = 2,
278 S2A_SPECIAL_0_OPCODE_Y1 = 2,
279 S3A_SPECIAL_0_OPCODE_X0 = 57,
280 S3A_SPECIAL_0_OPCODE_X1 = 31,
281 S3A_SPECIAL_5_OPCODE_Y0 = 1,
282 S3A_SPECIAL_5_OPCODE_Y1 = 1,
283 SADAB_U_SPECIAL_0_OPCODE_X0 = 58,
284 SADAH_SPECIAL_0_OPCODE_X0 = 59,
285 SADAH_U_SPECIAL_0_OPCODE_X0 = 60,
286 SADB_U_SPECIAL_0_OPCODE_X0 = 61,
287 SADH_SPECIAL_0_OPCODE_X0 = 62,
288 SADH_U_SPECIAL_0_OPCODE_X0 = 63,
289 SBADD_IMM_0_OPCODE_X1 = 28,
290 SB_OPCODE_Y2 = 5,
291 SB_SPECIAL_0_OPCODE_X1 = 32,
292 SEQB_SPECIAL_0_OPCODE_X0 = 64,
293 SEQB_SPECIAL_0_OPCODE_X1 = 33,
294 SEQH_SPECIAL_0_OPCODE_X0 = 65,
295 SEQH_SPECIAL_0_OPCODE_X1 = 34,
296 SEQIB_IMM_0_OPCODE_X0 = 9,
297 SEQIB_IMM_0_OPCODE_X1 = 12,
298 SEQIH_IMM_0_OPCODE_X0 = 10,
299 SEQIH_IMM_0_OPCODE_X1 = 13,
300 SEQI_IMM_0_OPCODE_X0 = 11,
301 SEQI_IMM_0_OPCODE_X1 = 14,
302 SEQI_OPCODE_Y0 = 12,
303 SEQI_OPCODE_Y1 = 10,
304 SEQ_SPECIAL_0_OPCODE_X0 = 66,
305 SEQ_SPECIAL_0_OPCODE_X1 = 35,
306 SEQ_SPECIAL_5_OPCODE_Y0 = 2,
307 SEQ_SPECIAL_5_OPCODE_Y1 = 2,
308 SHADD_IMM_0_OPCODE_X1 = 29,
309 SHL8II_IMM_0_OPCODE_SN = 3,
310 SHLB_SPECIAL_0_OPCODE_X0 = 67,
311 SHLB_SPECIAL_0_OPCODE_X1 = 36,
312 SHLH_SPECIAL_0_OPCODE_X0 = 68,
313 SHLH_SPECIAL_0_OPCODE_X1 = 37,
314 SHLIB_SHUN_0_OPCODE_X0 = 2,
315 SHLIB_SHUN_0_OPCODE_X1 = 2,
316 SHLIH_SHUN_0_OPCODE_X0 = 3,
317 SHLIH_SHUN_0_OPCODE_X1 = 3,
318 SHLI_SHUN_0_OPCODE_X0 = 4,
319 SHLI_SHUN_0_OPCODE_X1 = 4,
320 SHLI_SHUN_0_OPCODE_Y0 = 2,
321 SHLI_SHUN_0_OPCODE_Y1 = 2,
322 SHL_SPECIAL_0_OPCODE_X0 = 69,
323 SHL_SPECIAL_0_OPCODE_X1 = 38,
324 SHL_SPECIAL_3_OPCODE_Y0 = 1,
325 SHL_SPECIAL_3_OPCODE_Y1 = 1,
326 SHR1_RR_IMM_0_OPCODE_SN = 9,
327 SHRB_SPECIAL_0_OPCODE_X0 = 70,
328 SHRB_SPECIAL_0_OPCODE_X1 = 39,
329 SHRH_SPECIAL_0_OPCODE_X0 = 71,
330 SHRH_SPECIAL_0_OPCODE_X1 = 40,
331 SHRIB_SHUN_0_OPCODE_X0 = 5,
332 SHRIB_SHUN_0_OPCODE_X1 = 5,
333 SHRIH_SHUN_0_OPCODE_X0 = 6,
334 SHRIH_SHUN_0_OPCODE_X1 = 6,
335 SHRI_SHUN_0_OPCODE_X0 = 7,
336 SHRI_SHUN_0_OPCODE_X1 = 7,
337 SHRI_SHUN_0_OPCODE_Y0 = 3,
338 SHRI_SHUN_0_OPCODE_Y1 = 3,
339 SHR_SPECIAL_0_OPCODE_X0 = 72,
340 SHR_SPECIAL_0_OPCODE_X1 = 41,
341 SHR_SPECIAL_3_OPCODE_Y0 = 2,
342 SHR_SPECIAL_3_OPCODE_Y1 = 2,
343 SHUN_0_OPCODE_X0 = 7,
344 SHUN_0_OPCODE_X1 = 8,
345 SHUN_0_OPCODE_Y0 = 13,
346 SHUN_0_OPCODE_Y1 = 11,
347 SH_OPCODE_Y2 = 6,
348 SH_SPECIAL_0_OPCODE_X1 = 42,
349 SLTB_SPECIAL_0_OPCODE_X0 = 73,
350 SLTB_SPECIAL_0_OPCODE_X1 = 43,
351 SLTB_U_SPECIAL_0_OPCODE_X0 = 74,
352 SLTB_U_SPECIAL_0_OPCODE_X1 = 44,
353 SLTEB_SPECIAL_0_OPCODE_X0 = 75,
354 SLTEB_SPECIAL_0_OPCODE_X1 = 45,
355 SLTEB_U_SPECIAL_0_OPCODE_X0 = 76,
356 SLTEB_U_SPECIAL_0_OPCODE_X1 = 46,
357 SLTEH_SPECIAL_0_OPCODE_X0 = 77,
358 SLTEH_SPECIAL_0_OPCODE_X1 = 47,
359 SLTEH_U_SPECIAL_0_OPCODE_X0 = 78,
360 SLTEH_U_SPECIAL_0_OPCODE_X1 = 48,
361 SLTE_SPECIAL_0_OPCODE_X0 = 79,
362 SLTE_SPECIAL_0_OPCODE_X1 = 49,
363 SLTE_SPECIAL_4_OPCODE_Y0 = 0,
364 SLTE_SPECIAL_4_OPCODE_Y1 = 0,
365 SLTE_U_SPECIAL_0_OPCODE_X0 = 80,
366 SLTE_U_SPECIAL_0_OPCODE_X1 = 50,
367 SLTE_U_SPECIAL_4_OPCODE_Y0 = 1,
368 SLTE_U_SPECIAL_4_OPCODE_Y1 = 1,
369 SLTH_SPECIAL_0_OPCODE_X0 = 81,
370 SLTH_SPECIAL_0_OPCODE_X1 = 51,
371 SLTH_U_SPECIAL_0_OPCODE_X0 = 82,
372 SLTH_U_SPECIAL_0_OPCODE_X1 = 52,
373 SLTIB_IMM_0_OPCODE_X0 = 12,
374 SLTIB_IMM_0_OPCODE_X1 = 15,
375 SLTIB_U_IMM_0_OPCODE_X0 = 13,
376 SLTIB_U_IMM_0_OPCODE_X1 = 16,
377 SLTIH_IMM_0_OPCODE_X0 = 14,
378 SLTIH_IMM_0_OPCODE_X1 = 17,
379 SLTIH_U_IMM_0_OPCODE_X0 = 15,
380 SLTIH_U_IMM_0_OPCODE_X1 = 18,
381 SLTI_IMM_0_OPCODE_X0 = 16,
382 SLTI_IMM_0_OPCODE_X1 = 19,
383 SLTI_OPCODE_Y0 = 14,
384 SLTI_OPCODE_Y1 = 12,
385 SLTI_U_IMM_0_OPCODE_X0 = 17,
386 SLTI_U_IMM_0_OPCODE_X1 = 20,
387 SLTI_U_OPCODE_Y0 = 15,
388 SLTI_U_OPCODE_Y1 = 13,
389 SLT_SPECIAL_0_OPCODE_X0 = 83,
390 SLT_SPECIAL_0_OPCODE_X1 = 53,
391 SLT_SPECIAL_4_OPCODE_Y0 = 2,
392 SLT_SPECIAL_4_OPCODE_Y1 = 2,
393 SLT_U_SPECIAL_0_OPCODE_X0 = 84,
394 SLT_U_SPECIAL_0_OPCODE_X1 = 54,
395 SLT_U_SPECIAL_4_OPCODE_Y0 = 3,
396 SLT_U_SPECIAL_4_OPCODE_Y1 = 3,
397 SNEB_SPECIAL_0_OPCODE_X0 = 85,
398 SNEB_SPECIAL_0_OPCODE_X1 = 55,
399 SNEH_SPECIAL_0_OPCODE_X0 = 86,
400 SNEH_SPECIAL_0_OPCODE_X1 = 56,
401 SNE_SPECIAL_0_OPCODE_X0 = 87,
402 SNE_SPECIAL_0_OPCODE_X1 = 57,
403 SNE_SPECIAL_5_OPCODE_Y0 = 3,
404 SNE_SPECIAL_5_OPCODE_Y1 = 3,
405 SPECIAL_0_OPCODE_X0 = 0,
406 SPECIAL_0_OPCODE_X1 = 1,
407 SPECIAL_0_OPCODE_Y0 = 1,
408 SPECIAL_0_OPCODE_Y1 = 1,
409 SPECIAL_1_OPCODE_Y0 = 2,
410 SPECIAL_1_OPCODE_Y1 = 2,
411 SPECIAL_2_OPCODE_Y0 = 3,
412 SPECIAL_2_OPCODE_Y1 = 3,
413 SPECIAL_3_OPCODE_Y0 = 4,
414 SPECIAL_3_OPCODE_Y1 = 4,
415 SPECIAL_4_OPCODE_Y0 = 5,
416 SPECIAL_4_OPCODE_Y1 = 5,
417 SPECIAL_5_OPCODE_Y0 = 6,
418 SPECIAL_5_OPCODE_Y1 = 6,
419 SPECIAL_6_OPCODE_Y0 = 7,
420 SPECIAL_7_OPCODE_Y0 = 8,
421 SRAB_SPECIAL_0_OPCODE_X0 = 88,
422 SRAB_SPECIAL_0_OPCODE_X1 = 58,
423 SRAH_SPECIAL_0_OPCODE_X0 = 89,
424 SRAH_SPECIAL_0_OPCODE_X1 = 59,
425 SRAIB_SHUN_0_OPCODE_X0 = 8,
426 SRAIB_SHUN_0_OPCODE_X1 = 8,
427 SRAIH_SHUN_0_OPCODE_X0 = 9,
428 SRAIH_SHUN_0_OPCODE_X1 = 9,
429 SRAI_SHUN_0_OPCODE_X0 = 10,
430 SRAI_SHUN_0_OPCODE_X1 = 10,
431 SRAI_SHUN_0_OPCODE_Y0 = 4,
432 SRAI_SHUN_0_OPCODE_Y1 = 4,
433 SRA_SPECIAL_0_OPCODE_X0 = 90,
434 SRA_SPECIAL_0_OPCODE_X1 = 60,
435 SRA_SPECIAL_3_OPCODE_Y0 = 3,
436 SRA_SPECIAL_3_OPCODE_Y1 = 3,
437 SUBBS_U_SPECIAL_0_OPCODE_X0 = 100,
438 SUBBS_U_SPECIAL_0_OPCODE_X1 = 70,
439 SUBB_SPECIAL_0_OPCODE_X0 = 91,
440 SUBB_SPECIAL_0_OPCODE_X1 = 61,
441 SUBHS_SPECIAL_0_OPCODE_X0 = 101,
442 SUBHS_SPECIAL_0_OPCODE_X1 = 71,
443 SUBH_SPECIAL_0_OPCODE_X0 = 92,
444 SUBH_SPECIAL_0_OPCODE_X1 = 62,
445 SUBS_SPECIAL_0_OPCODE_X0 = 97,
446 SUBS_SPECIAL_0_OPCODE_X1 = 67,
447 SUB_SPECIAL_0_OPCODE_X0 = 93,
448 SUB_SPECIAL_0_OPCODE_X1 = 63,
449 SUB_SPECIAL_0_OPCODE_Y0 = 3,
450 SUB_SPECIAL_0_OPCODE_Y1 = 3,
451 SWADD_IMM_0_OPCODE_X1 = 30,
452 SWINT0_UN_0_SHUN_0_OPCODE_X1 = 18,
453 SWINT1_UN_0_SHUN_0_OPCODE_X1 = 19,
454 SWINT2_UN_0_SHUN_0_OPCODE_X1 = 20,
455 SWINT3_UN_0_SHUN_0_OPCODE_X1 = 21,
456 SW_OPCODE_Y2 = 7,
457 SW_SPECIAL_0_OPCODE_X1 = 64,
458 TBLIDXB0_UN_0_SHUN_0_OPCODE_X0 = 8,
459 TBLIDXB0_UN_0_SHUN_0_OPCODE_Y0 = 8,
460 TBLIDXB1_UN_0_SHUN_0_OPCODE_X0 = 9,
461 TBLIDXB1_UN_0_SHUN_0_OPCODE_Y0 = 9,
462 TBLIDXB2_UN_0_SHUN_0_OPCODE_X0 = 10,
463 TBLIDXB2_UN_0_SHUN_0_OPCODE_Y0 = 10,
464 TBLIDXB3_UN_0_SHUN_0_OPCODE_X0 = 11,
465 TBLIDXB3_UN_0_SHUN_0_OPCODE_Y0 = 11,
466 TNS_UN_0_SHUN_0_OPCODE_X1 = 22,
467 UN_0_SHUN_0_OPCODE_X0 = 11,
468 UN_0_SHUN_0_OPCODE_X1 = 11,
469 UN_0_SHUN_0_OPCODE_Y0 = 5,
470 UN_0_SHUN_0_OPCODE_Y1 = 5,
471 WH64_UN_0_SHUN_0_OPCODE_X1 = 23,
472 XORI_IMM_0_OPCODE_X0 = 2,
473 XORI_IMM_0_OPCODE_X1 = 21,
474 XOR_SPECIAL_0_OPCODE_X0 = 94,
475 XOR_SPECIAL_0_OPCODE_X1 = 65,
476 XOR_SPECIAL_2_OPCODE_Y0 = 3,
477 XOR_SPECIAL_2_OPCODE_Y1 = 3
478};
479
480#endif /* !_TILE_OPCODE_CONSTANTS_H */
diff --git a/arch/tile/include/asm/page.h b/arch/tile/include/asm/page.h
new file mode 100644
index 000000000000..c8301c43d6d9
--- /dev/null
+++ b/arch/tile/include/asm/page.h
@@ -0,0 +1,334 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_PAGE_H
16#define _ASM_TILE_PAGE_H
17
18#include <linux/const.h>
19#include <hv/hypervisor.h>
20#include <arch/chip.h>
21
22/* PAGE_SHIFT and HPAGE_SHIFT determine the page sizes. */
23#define PAGE_SHIFT 16
24#define HPAGE_SHIFT 24
25
26#define PAGE_SIZE (_AC(1, UL) << PAGE_SHIFT)
27#define HPAGE_SIZE (_AC(1, UL) << HPAGE_SHIFT)
28
29#define PAGE_MASK (~(PAGE_SIZE - 1))
30#define HPAGE_MASK (~(HPAGE_SIZE - 1))
31
32/*
33 * The {,H}PAGE_SHIFT values must match the HV_LOG2_PAGE_SIZE_xxx
34 * definitions in <hv/hypervisor.h>. We validate this at build time
35 * here, and again at runtime during early boot. We provide a
36 * separate definition since userspace doesn't have <hv/hypervisor.h>.
37 *
38 * Be careful to distinguish PAGE_SHIFT from HV_PTE_INDEX_PFN, since
39 * they are the same on i386 but not TILE.
40 */
41#if HV_LOG2_PAGE_SIZE_SMALL != PAGE_SHIFT
42# error Small page size mismatch in Linux
43#endif
44#if HV_LOG2_PAGE_SIZE_LARGE != HPAGE_SHIFT
45# error Huge page size mismatch in Linux
46#endif
47
48#ifndef __ASSEMBLY__
49
50#include <linux/types.h>
51#include <linux/string.h>
52
53struct page;
54
55static inline void clear_page(void *page)
56{
57 memset(page, 0, PAGE_SIZE);
58}
59
60static inline void copy_page(void *to, void *from)
61{
62 memcpy(to, from, PAGE_SIZE);
63}
64
65static inline void clear_user_page(void *page, unsigned long vaddr,
66 struct page *pg)
67{
68 clear_page(page);
69}
70
71static inline void copy_user_page(void *to, void *from, unsigned long vaddr,
72 struct page *topage)
73{
74 copy_page(to, from);
75}
76
77/*
78 * Hypervisor page tables are made of the same basic structure.
79 */
80
81typedef __u64 pteval_t;
82typedef __u64 pmdval_t;
83typedef __u64 pudval_t;
84typedef __u64 pgdval_t;
85typedef __u64 pgprotval_t;
86
87typedef HV_PTE pte_t;
88typedef HV_PTE pgd_t;
89typedef HV_PTE pgprot_t;
90
91/*
92 * User L2 page tables are managed as one L2 page table per page,
93 * because we use the page allocator for them. This keeps the allocation
94 * simple and makes it potentially useful to implement HIGHPTE at some point.
95 * However, it's also inefficient, since L2 page tables are much smaller
96 * than pages (currently 2KB vs 64KB). So we should revisit this.
97 */
98typedef struct page *pgtable_t;
99
100/* Must be a macro since it is used to create constants. */
101#define __pgprot(val) hv_pte(val)
102
103static inline u64 pgprot_val(pgprot_t pgprot)
104{
105 return hv_pte_val(pgprot);
106}
107
108static inline u64 pte_val(pte_t pte)
109{
110 return hv_pte_val(pte);
111}
112
113static inline u64 pgd_val(pgd_t pgd)
114{
115 return hv_pte_val(pgd);
116}
117
118#ifdef __tilegx__
119
120typedef HV_PTE pmd_t;
121
122static inline u64 pmd_val(pmd_t pmd)
123{
124 return hv_pte_val(pmd);
125}
126
127#endif
128
129#endif /* !__ASSEMBLY__ */
130
131#define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT)
132
133#define HUGE_MAX_HSTATE 2
134
135#ifdef CONFIG_HUGETLB_PAGE
136#define HAVE_ARCH_HUGETLB_UNMAPPED_AREA
137#endif
138
139/* Each memory controller has PAs distinct in their high bits. */
140#define NR_PA_HIGHBIT_SHIFT (CHIP_PA_WIDTH() - CHIP_LOG_NUM_MSHIMS())
141#define NR_PA_HIGHBIT_VALUES (1 << CHIP_LOG_NUM_MSHIMS())
142#define __pa_to_highbits(pa) ((phys_addr_t)(pa) >> NR_PA_HIGHBIT_SHIFT)
143#define __pfn_to_highbits(pfn) ((pfn) >> (NR_PA_HIGHBIT_SHIFT - PAGE_SHIFT))
144
145#ifdef __tilegx__
146
147/*
148 * We reserve the lower half of memory for user-space programs, and the
149 * upper half for system code. We re-map all of physical memory in the
150 * upper half, which takes a quarter of our VA space. Then we have
151 * the vmalloc regions. The supervisor code lives at 0xfffffff700000000,
152 * with the hypervisor above that.
153 *
154 * Loadable kernel modules are placed immediately after the static
155 * supervisor code, with each being allocated a 256MB region of
156 * address space, so we don't have to worry about the range of "jal"
157 * and other branch instructions.
158 *
159 * For now we keep life simple and just allocate one pmd (4GB) for vmalloc.
160 * Similarly, for now we don't play any struct page mapping games.
161 */
162
163#if CHIP_PA_WIDTH() + 2 > CHIP_VA_WIDTH()
164# error Too much PA to map with the VA available!
165#endif
166#define HALF_VA_SPACE (_AC(1, UL) << (CHIP_VA_WIDTH() - 1))
167
168#define MEM_LOW_END (HALF_VA_SPACE - 1) /* low half */
169#define MEM_HIGH_START (-HALF_VA_SPACE) /* high half */
170#define PAGE_OFFSET MEM_HIGH_START
171#define _VMALLOC_START _AC(0xfffffff500000000, UL) /* 4 GB */
172#define HUGE_VMAP_BASE _AC(0xfffffff600000000, UL) /* 4 GB */
173#define MEM_SV_START _AC(0xfffffff700000000, UL) /* 256 MB */
174#define MEM_SV_INTRPT MEM_SV_START
175#define MEM_MODULE_START _AC(0xfffffff710000000, UL) /* 256 MB */
176#define MEM_MODULE_END (MEM_MODULE_START + (256*1024*1024))
177#define MEM_HV_START _AC(0xfffffff800000000, UL) /* 32 GB */
178
179/* Highest DTLB address we will use */
180#define KERNEL_HIGH_VADDR MEM_SV_START
181
182/* Since we don't currently provide any fixmaps, we use an impossible VA. */
183#define FIXADDR_TOP MEM_HV_START
184
185#else /* !__tilegx__ */
186
187/*
188 * A PAGE_OFFSET of 0xC0000000 means that the kernel has
189 * a virtual address space of one gigabyte, which limits the
190 * amount of physical memory you can use to about 768MB.
191 * If you want more physical memory than this then see the CONFIG_HIGHMEM
192 * option in the kernel configuration.
193 *
194 * The top two 16MB chunks in the table below (VIRT and HV) are
195 * unavailable to Linux. Since the kernel interrupt vectors must live
196 * at 0xfd000000, we map all of the bottom of RAM at this address with
197 * a huge page table entry to minimize its ITLB footprint (as well as
198 * at PAGE_OFFSET). The last architected requirement is that user
199 * interrupt vectors live at 0xfc000000, so we make that range of
200 * memory available to user processes. The remaining regions are sized
201 * as shown; after the first four addresses, we show "typical" values,
202 * since the actual addresses depend on kernel #defines.
203 *
204 * MEM_VIRT_INTRPT 0xff000000
205 * MEM_HV_INTRPT 0xfe000000
206 * MEM_SV_INTRPT (kernel code) 0xfd000000
207 * MEM_USER_INTRPT (user vector) 0xfc000000
208 * FIX_KMAP_xxx 0xf8000000 (via NR_CPUS * KM_TYPE_NR)
209 * PKMAP_BASE 0xf7000000 (via LAST_PKMAP)
210 * HUGE_VMAP 0xf3000000 (via CONFIG_NR_HUGE_VMAPS)
211 * VMALLOC_START 0xf0000000 (via __VMALLOC_RESERVE)
212 * mapped LOWMEM 0xc0000000
213 */
214
215#define MEM_USER_INTRPT _AC(0xfc000000, UL)
216#define MEM_SV_INTRPT _AC(0xfd000000, UL)
217#define MEM_HV_INTRPT _AC(0xfe000000, UL)
218#define MEM_VIRT_INTRPT _AC(0xff000000, UL)
219
220#define INTRPT_SIZE 0x4000
221
222/* Tolerate page size larger than the architecture interrupt region size. */
223#if PAGE_SIZE > INTRPT_SIZE
224#undef INTRPT_SIZE
225#define INTRPT_SIZE PAGE_SIZE
226#endif
227
228#define KERNEL_HIGH_VADDR MEM_USER_INTRPT
229#define FIXADDR_TOP (KERNEL_HIGH_VADDR - PAGE_SIZE)
230
231#define PAGE_OFFSET _AC(CONFIG_PAGE_OFFSET, UL)
232
233/* On 32-bit architectures we mix kernel modules in with other vmaps. */
234#define MEM_MODULE_START VMALLOC_START
235#define MEM_MODULE_END VMALLOC_END
236
237#endif /* __tilegx__ */
238
239#ifndef __ASSEMBLY__
240
241#ifdef CONFIG_HIGHMEM
242
243/* Map kernel virtual addresses to page frames, in HPAGE_SIZE chunks. */
244extern unsigned long pbase_map[];
245extern void *vbase_map[];
246
247static inline unsigned long kaddr_to_pfn(const volatile void *_kaddr)
248{
249 unsigned long kaddr = (unsigned long)_kaddr;
250 return pbase_map[kaddr >> HPAGE_SHIFT] +
251 ((kaddr & (HPAGE_SIZE - 1)) >> PAGE_SHIFT);
252}
253
254static inline void *pfn_to_kaddr(unsigned long pfn)
255{
256 return vbase_map[__pfn_to_highbits(pfn)] + (pfn << PAGE_SHIFT);
257}
258
259static inline phys_addr_t virt_to_phys(const volatile void *kaddr)
260{
261 unsigned long pfn = kaddr_to_pfn(kaddr);
262 return ((phys_addr_t)pfn << PAGE_SHIFT) +
263 ((unsigned long)kaddr & (PAGE_SIZE-1));
264}
265
266static inline void *phys_to_virt(phys_addr_t paddr)
267{
268 return pfn_to_kaddr(paddr >> PAGE_SHIFT) + (paddr & (PAGE_SIZE-1));
269}
270
271/* With HIGHMEM, we pack PAGE_OFFSET through high_memory with all valid VAs. */
272static inline int virt_addr_valid(const volatile void *kaddr)
273{
274 extern void *high_memory; /* copied from <linux/mm.h> */
275 return ((unsigned long)kaddr >= PAGE_OFFSET && kaddr < high_memory);
276}
277
278#else /* !CONFIG_HIGHMEM */
279
280static inline unsigned long kaddr_to_pfn(const volatile void *kaddr)
281{
282 return ((unsigned long)kaddr - PAGE_OFFSET) >> PAGE_SHIFT;
283}
284
285static inline void *pfn_to_kaddr(unsigned long pfn)
286{
287 return (void *)((pfn << PAGE_SHIFT) + PAGE_OFFSET);
288}
289
290static inline phys_addr_t virt_to_phys(const volatile void *kaddr)
291{
292 return (phys_addr_t)((unsigned long)kaddr - PAGE_OFFSET);
293}
294
295static inline void *phys_to_virt(phys_addr_t paddr)
296{
297 return (void *)((unsigned long)paddr + PAGE_OFFSET);
298}
299
300/* Check that the given address is within some mapped range of PAs. */
301#define virt_addr_valid(kaddr) pfn_valid(kaddr_to_pfn(kaddr))
302
303#endif /* !CONFIG_HIGHMEM */
304
305/* All callers are not consistent in how they call these functions. */
306#define __pa(kaddr) virt_to_phys((void *)(unsigned long)(kaddr))
307#define __va(paddr) phys_to_virt((phys_addr_t)(paddr))
308
309extern int devmem_is_allowed(unsigned long pagenr);
310
311#ifdef CONFIG_FLATMEM
312static inline int pfn_valid(unsigned long pfn)
313{
314 return pfn < max_mapnr;
315}
316#endif
317
318/* Provide as macros since these require some other headers included. */
319#define page_to_pa(page) ((phys_addr_t)(page_to_pfn(page)) << PAGE_SHIFT)
320#define virt_to_page(kaddr) pfn_to_page(kaddr_to_pfn(kaddr))
321#define page_to_virt(page) pfn_to_kaddr(page_to_pfn(page))
322
323struct mm_struct;
324extern pte_t *virt_to_pte(struct mm_struct *mm, unsigned long addr);
325
326#endif /* !__ASSEMBLY__ */
327
328#define VM_DATA_DEFAULT_FLAGS \
329 (VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
330
331#include <asm-generic/memory_model.h>
332#include <asm-generic/getorder.h>
333
334#endif /* _ASM_TILE_PAGE_H */
diff --git a/arch/tile/include/asm/param.h b/arch/tile/include/asm/param.h
new file mode 100644
index 000000000000..965d45427975
--- /dev/null
+++ b/arch/tile/include/asm/param.h
@@ -0,0 +1 @@
#include <asm-generic/param.h>
diff --git a/arch/tile/include/asm/pci-bridge.h b/arch/tile/include/asm/pci-bridge.h
new file mode 100644
index 000000000000..e853b0e2793b
--- /dev/null
+++ b/arch/tile/include/asm/pci-bridge.h
@@ -0,0 +1,117 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_PCI_BRIDGE_H
16#define _ASM_TILE_PCI_BRIDGE_H
17
18#include <linux/ioport.h>
19#include <linux/pci.h>
20
21struct device_node;
22struct pci_controller;
23
24/*
25 * pci_io_base returns the memory address at which you can access
26 * the I/O space for PCI bus number `bus' (or NULL on error).
27 */
28extern void __iomem *pci_bus_io_base(unsigned int bus);
29extern unsigned long pci_bus_io_base_phys(unsigned int bus);
30extern unsigned long pci_bus_mem_base_phys(unsigned int bus);
31
32/* Allocate a new PCI host bridge structure */
33extern struct pci_controller *pcibios_alloc_controller(void);
34
35/* Helper function for setting up resources */
36extern void pci_init_resource(struct resource *res, unsigned long start,
37 unsigned long end, int flags, char *name);
38
39/* Get the PCI host controller for a bus */
40extern struct pci_controller *pci_bus_to_hose(int bus);
41
42/*
43 * Structure of a PCI controller (host bridge)
44 */
45struct pci_controller {
46 int index; /* PCI domain number */
47 struct pci_bus *root_bus;
48
49 int first_busno;
50 int last_busno;
51
52 int hv_cfg_fd[2]; /* config{0,1} fds for this PCIe controller */
53 int hv_mem_fd; /* fd to Hypervisor for MMIO operations */
54
55 struct pci_ops *ops;
56
57 int irq_base; /* Base IRQ from the Hypervisor */
58 int plx_gen1; /* flag for PLX Gen 1 configuration */
59
60 /* Address ranges that are routed to this controller/bridge. */
61 struct resource mem_resources[3];
62};
63
64static inline struct pci_controller *pci_bus_to_host(struct pci_bus *bus)
65{
66 return bus->sysdata;
67}
68
69extern void setup_indirect_pci_nomap(struct pci_controller *hose,
70 void __iomem *cfg_addr, void __iomem *cfg_data);
71extern void setup_indirect_pci(struct pci_controller *hose,
72 u32 cfg_addr, u32 cfg_data);
73extern void setup_grackle(struct pci_controller *hose);
74
75extern unsigned char common_swizzle(struct pci_dev *, unsigned char *);
76
77/*
78 * The following code swizzles for exactly one bridge. The routine
79 * common_swizzle below handles multiple bridges. But there are a
80 * some boards that don't follow the PCI spec's suggestion so we
81 * break this piece out separately.
82 */
83static inline unsigned char bridge_swizzle(unsigned char pin,
84 unsigned char idsel)
85{
86 return (((pin-1) + idsel) % 4) + 1;
87}
88
89/*
90 * The following macro is used to lookup irqs in a standard table
91 * format for those PPC systems that do not already have PCI
92 * interrupts properly routed.
93 */
94/* FIXME - double check this */
95#define PCI_IRQ_TABLE_LOOKUP ({ \
96 long _ctl_ = -1; \
97 if (idsel >= min_idsel && idsel <= max_idsel && pin <= irqs_per_slot) \
98 _ctl_ = pci_irq_table[idsel - min_idsel][pin-1]; \
99 _ctl_; \
100})
101
102/*
103 * Scan the buses below a given PCI host bridge and assign suitable
104 * resources to all devices found.
105 */
106extern int pciauto_bus_scan(struct pci_controller *, int);
107
108#ifdef CONFIG_PCI
109extern unsigned long pci_address_to_pio(phys_addr_t address);
110#else
111static inline unsigned long pci_address_to_pio(phys_addr_t address)
112{
113 return (unsigned long)-1;
114}
115#endif
116
117#endif /* _ASM_TILE_PCI_BRIDGE_H */
diff --git a/arch/tile/include/asm/pci.h b/arch/tile/include/asm/pci.h
new file mode 100644
index 000000000000..b0c15da2d5d5
--- /dev/null
+++ b/arch/tile/include/asm/pci.h
@@ -0,0 +1,128 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_PCI_H
16#define _ASM_TILE_PCI_H
17
18#include <asm/pci-bridge.h>
19
20/*
21 * The hypervisor maps the entirety of CPA-space as bus addresses, so
22 * bus addresses are physical addresses. The networking and block
23 * device layers use this boolean for bounce buffer decisions.
24 */
25#define PCI_DMA_BUS_IS_PHYS 1
26
27struct pci_controller *pci_bus_to_hose(int bus);
28unsigned char __init common_swizzle(struct pci_dev *dev, unsigned char *pinp);
29int __init tile_pci_init(void);
30void pci_iounmap(struct pci_dev *dev, void __iomem *addr);
31void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max);
32void __devinit pcibios_fixup_bus(struct pci_bus *bus);
33
34int __devinit _tile_cfg_read(struct pci_controller *hose,
35 int bus,
36 int slot,
37 int function,
38 int offset,
39 int size,
40 u32 *val);
41int __devinit _tile_cfg_write(struct pci_controller *hose,
42 int bus,
43 int slot,
44 int function,
45 int offset,
46 int size,
47 u32 val);
48
49/*
50 * These are used to to config reads and writes in the early stages of
51 * setup before the driver infrastructure has been set up enough to be
52 * able to do config reads and writes.
53 */
54#define early_cfg_read(where, size, value) \
55 _tile_cfg_read(controller, \
56 current_bus, \
57 pci_slot, \
58 pci_fn, \
59 where, \
60 size, \
61 value)
62
63#define early_cfg_write(where, size, value) \
64 _tile_cfg_write(controller, \
65 current_bus, \
66 pci_slot, \
67 pci_fn, \
68 where, \
69 size, \
70 value)
71
72
73
74#define PCICFG_BYTE 1
75#define PCICFG_WORD 2
76#define PCICFG_DWORD 4
77
78#define TILE_NUM_PCIE 2
79
80#define pci_domain_nr(bus) (((struct pci_controller *)(bus)->sysdata)->index)
81
82/*
83 * This decides whether to display the domain number in /proc.
84 */
85static inline int pci_proc_domain(struct pci_bus *bus)
86{
87 return 1;
88}
89
90/*
91 * I/O space is currently not supported.
92 */
93
94#define TILE_PCIE_LOWER_IO 0x0
95#define TILE_PCIE_UPPER_IO 0x10000
96#define TILE_PCIE_PCIE_IO_SIZE 0x0000FFFF
97
98#define _PAGE_NO_CACHE 0
99#define _PAGE_GUARDED 0
100
101
102#define pcibios_assign_all_busses() pci_assign_all_buses
103extern int pci_assign_all_buses;
104
105static inline void pcibios_set_master(struct pci_dev *dev)
106{
107 /* No special bus mastering setup handling */
108}
109
110#define PCIBIOS_MIN_MEM 0
111#define PCIBIOS_MIN_IO TILE_PCIE_LOWER_IO
112
113/*
114 * This flag tells if the platform is TILEmpower that needs
115 * special configuration for the PLX switch chip.
116 */
117extern int blade_pci;
118
119/* implement the pci_ DMA API in terms of the generic device dma_ one */
120#include <asm-generic/pci-dma-compat.h>
121
122/* generic pci stuff */
123#include <asm-generic/pci.h>
124
125/* Use any cpu for PCI. */
126#define cpumask_of_pcibus(bus) cpu_online_mask
127
128#endif /* _ASM_TILE_PCI_H */
diff --git a/arch/tile/include/asm/percpu.h b/arch/tile/include/asm/percpu.h
new file mode 100644
index 000000000000..63294f5a8efb
--- /dev/null
+++ b/arch/tile/include/asm/percpu.h
@@ -0,0 +1,24 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_PERCPU_H
16#define _ASM_TILE_PERCPU_H
17
18register unsigned long __my_cpu_offset __asm__("tp");
19#define __my_cpu_offset __my_cpu_offset
20#define set_my_cpu_offset(tp) (__my_cpu_offset = (tp))
21
22#include <asm-generic/percpu.h>
23
24#endif /* _ASM_TILE_PERCPU_H */
diff --git a/arch/tile/include/asm/pgalloc.h b/arch/tile/include/asm/pgalloc.h
new file mode 100644
index 000000000000..cf52791a5501
--- /dev/null
+++ b/arch/tile/include/asm/pgalloc.h
@@ -0,0 +1,119 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_PGALLOC_H
16#define _ASM_TILE_PGALLOC_H
17
18#include <linux/threads.h>
19#include <linux/mm.h>
20#include <linux/mmzone.h>
21#include <asm/fixmap.h>
22#include <hv/hypervisor.h>
23
24/* Bits for the size of the second-level page table. */
25#define L2_KERNEL_PGTABLE_SHIFT \
26 (HV_LOG2_PAGE_SIZE_LARGE - HV_LOG2_PAGE_SIZE_SMALL + HV_LOG2_PTE_SIZE)
27
28/* We currently allocate user L2 page tables by page (unlike kernel L2s). */
29#if L2_KERNEL_PGTABLE_SHIFT < HV_LOG2_PAGE_SIZE_SMALL
30#define L2_USER_PGTABLE_SHIFT HV_LOG2_PAGE_SIZE_SMALL
31#else
32#define L2_USER_PGTABLE_SHIFT L2_KERNEL_PGTABLE_SHIFT
33#endif
34
35/* How many pages do we need, as an "order", for a user L2 page table? */
36#define L2_USER_PGTABLE_ORDER (L2_USER_PGTABLE_SHIFT - HV_LOG2_PAGE_SIZE_SMALL)
37
38/* How big is a kernel L2 page table? */
39#define L2_KERNEL_PGTABLE_SIZE (1 << L2_KERNEL_PGTABLE_SHIFT)
40
41static inline void set_pmd(pmd_t *pmdp, pmd_t pmd)
42{
43#ifdef CONFIG_64BIT
44 set_pte_order(pmdp, pmd, L2_USER_PGTABLE_ORDER);
45#else
46 set_pte_order(&pmdp->pud.pgd, pmd.pud.pgd, L2_USER_PGTABLE_ORDER);
47#endif
48}
49
50static inline void pmd_populate_kernel(struct mm_struct *mm,
51 pmd_t *pmd, pte_t *ptep)
52{
53 set_pmd(pmd, ptfn_pmd(__pa(ptep) >> HV_LOG2_PAGE_TABLE_ALIGN,
54 __pgprot(_PAGE_PRESENT)));
55}
56
57static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
58 pgtable_t page)
59{
60 set_pmd(pmd, ptfn_pmd(HV_PFN_TO_PTFN(page_to_pfn(page)),
61 __pgprot(_PAGE_PRESENT)));
62}
63
64/*
65 * Allocate and free page tables.
66 */
67
68extern pgd_t *pgd_alloc(struct mm_struct *mm);
69extern void pgd_free(struct mm_struct *mm, pgd_t *pgd);
70
71extern pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address);
72extern void pte_free(struct mm_struct *mm, struct page *pte);
73
74#define pmd_pgtable(pmd) pmd_page(pmd)
75
76static inline pte_t *
77pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
78{
79 return pfn_to_kaddr(page_to_pfn(pte_alloc_one(mm, address)));
80}
81
82static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
83{
84 BUG_ON((unsigned long)pte & (PAGE_SIZE-1));
85 pte_free(mm, virt_to_page(pte));
86}
87
88extern void __pte_free_tlb(struct mmu_gather *tlb, struct page *pte,
89 unsigned long address);
90
91#define check_pgt_cache() do { } while (0)
92
93/*
94 * Get the small-page pte_t lowmem entry for a given pfn.
95 * This may or may not be in use, depending on whether the initial
96 * huge-page entry for the page has already been shattered.
97 */
98pte_t *get_prealloc_pte(unsigned long pfn);
99
100/* During init, we can shatter kernel huge pages if needed. */
101void shatter_pmd(pmd_t *pmd);
102
103#ifdef __tilegx__
104/* We share a single page allocator for both L1 and L2 page tables. */
105#if HV_L1_SIZE != HV_L2_SIZE
106# error Rework assumption that L1 and L2 page tables are same size.
107#endif
108#define L1_USER_PGTABLE_ORDER L2_USER_PGTABLE_ORDER
109#define pud_populate(mm, pud, pmd) \
110 pmd_populate_kernel((mm), (pmd_t *)(pud), (pte_t *)(pmd))
111#define pmd_alloc_one(mm, addr) \
112 ((pmd_t *)page_to_virt(pte_alloc_one((mm), (addr))))
113#define pmd_free(mm, pmdp) \
114 pte_free((mm), virt_to_page(pmdp))
115#define __pmd_free_tlb(tlb, pmdp, address) \
116 __pte_free_tlb((tlb), virt_to_page(pmdp), (address))
117#endif
118
119#endif /* _ASM_TILE_PGALLOC_H */
diff --git a/arch/tile/include/asm/pgtable.h b/arch/tile/include/asm/pgtable.h
new file mode 100644
index 000000000000..beb1504e9c10
--- /dev/null
+++ b/arch/tile/include/asm/pgtable.h
@@ -0,0 +1,475 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 *
14 * This file contains the functions and defines necessary to modify and use
15 * the TILE page table tree.
16 */
17
18#ifndef _ASM_TILE_PGTABLE_H
19#define _ASM_TILE_PGTABLE_H
20
21#include <hv/hypervisor.h>
22
23#ifndef __ASSEMBLY__
24
25#include <linux/bitops.h>
26#include <linux/threads.h>
27#include <linux/slab.h>
28#include <linux/list.h>
29#include <linux/spinlock.h>
30#include <asm/processor.h>
31#include <asm/fixmap.h>
32#include <asm/system.h>
33
34struct mm_struct;
35struct vm_area_struct;
36
37/*
38 * ZERO_PAGE is a global shared page that is always zero: used
39 * for zero-mapped memory areas etc..
40 */
41extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)];
42#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
43
44extern pgd_t swapper_pg_dir[];
45extern pgprot_t swapper_pgprot;
46extern struct kmem_cache *pgd_cache;
47extern spinlock_t pgd_lock;
48extern struct list_head pgd_list;
49
50/*
51 * The very last slots in the pgd_t are for addresses unusable by Linux
52 * (pgd_addr_invalid() returns true). So we use them for the list structure.
53 * The x86 code we are modelled on uses the page->private/index fields
54 * (older 2.6 kernels) or the lru list (newer 2.6 kernels), but since
55 * our pgds are so much smaller than a page, it seems a waste to
56 * spend a whole page on each pgd.
57 */
58#define PGD_LIST_OFFSET \
59 ((PTRS_PER_PGD * sizeof(pgd_t)) - sizeof(struct list_head))
60#define pgd_to_list(pgd) \
61 ((struct list_head *)((char *)(pgd) + PGD_LIST_OFFSET))
62#define list_to_pgd(list) \
63 ((pgd_t *)((char *)(list) - PGD_LIST_OFFSET))
64
65extern void pgtable_cache_init(void);
66extern void paging_init(void);
67extern void set_page_homes(void);
68
69#define FIRST_USER_ADDRESS 0
70
71#define _PAGE_PRESENT HV_PTE_PRESENT
72#define _PAGE_HUGE_PAGE HV_PTE_PAGE
73#define _PAGE_READABLE HV_PTE_READABLE
74#define _PAGE_WRITABLE HV_PTE_WRITABLE
75#define _PAGE_EXECUTABLE HV_PTE_EXECUTABLE
76#define _PAGE_ACCESSED HV_PTE_ACCESSED
77#define _PAGE_DIRTY HV_PTE_DIRTY
78#define _PAGE_GLOBAL HV_PTE_GLOBAL
79#define _PAGE_USER HV_PTE_USER
80
81/*
82 * All the "standard" bits. Cache-control bits are managed elsewhere.
83 * This is used to test for valid level-2 page table pointers by checking
84 * all the bits, and to mask away the cache control bits for mprotect.
85 */
86#define _PAGE_ALL (\
87 _PAGE_PRESENT | \
88 _PAGE_HUGE_PAGE | \
89 _PAGE_READABLE | \
90 _PAGE_WRITABLE | \
91 _PAGE_EXECUTABLE | \
92 _PAGE_ACCESSED | \
93 _PAGE_DIRTY | \
94 _PAGE_GLOBAL | \
95 _PAGE_USER \
96)
97
98#define PAGE_NONE \
99 __pgprot(_PAGE_PRESENT | _PAGE_ACCESSED)
100#define PAGE_SHARED \
101 __pgprot(_PAGE_PRESENT | _PAGE_READABLE | _PAGE_WRITABLE | \
102 _PAGE_USER | _PAGE_ACCESSED)
103
104#define PAGE_SHARED_EXEC \
105 __pgprot(_PAGE_PRESENT | _PAGE_READABLE | _PAGE_WRITABLE | \
106 _PAGE_EXECUTABLE | _PAGE_USER | _PAGE_ACCESSED)
107#define PAGE_COPY_NOEXEC \
108 __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_READABLE)
109#define PAGE_COPY_EXEC \
110 __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | \
111 _PAGE_READABLE | _PAGE_EXECUTABLE)
112#define PAGE_COPY \
113 PAGE_COPY_NOEXEC
114#define PAGE_READONLY \
115 __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_READABLE)
116#define PAGE_READONLY_EXEC \
117 __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | \
118 _PAGE_READABLE | _PAGE_EXECUTABLE)
119
120#define _PAGE_KERNEL_RO \
121 (_PAGE_PRESENT | _PAGE_GLOBAL | _PAGE_READABLE | _PAGE_ACCESSED)
122#define _PAGE_KERNEL \
123 (_PAGE_KERNEL_RO | _PAGE_WRITABLE | _PAGE_DIRTY)
124#define _PAGE_KERNEL_EXEC (_PAGE_KERNEL_RO | _PAGE_EXECUTABLE)
125
126#define PAGE_KERNEL __pgprot(_PAGE_KERNEL)
127#define PAGE_KERNEL_RO __pgprot(_PAGE_KERNEL_RO)
128#define PAGE_KERNEL_EXEC __pgprot(_PAGE_KERNEL_EXEC)
129
130#define page_to_kpgprot(p) PAGE_KERNEL
131
132/*
133 * We could tighten these up, but for now writable or executable
134 * implies readable.
135 */
136#define __P000 PAGE_NONE
137#define __P001 PAGE_READONLY
138#define __P010 PAGE_COPY /* this is write-only, which we won't support */
139#define __P011 PAGE_COPY
140#define __P100 PAGE_READONLY_EXEC
141#define __P101 PAGE_READONLY_EXEC
142#define __P110 PAGE_COPY_EXEC
143#define __P111 PAGE_COPY_EXEC
144
145#define __S000 PAGE_NONE
146#define __S001 PAGE_READONLY
147#define __S010 PAGE_SHARED
148#define __S011 PAGE_SHARED
149#define __S100 PAGE_READONLY_EXEC
150#define __S101 PAGE_READONLY_EXEC
151#define __S110 PAGE_SHARED_EXEC
152#define __S111 PAGE_SHARED_EXEC
153
154/*
155 * All the normal _PAGE_ALL bits are ignored for PMDs, except PAGE_PRESENT
156 * and PAGE_HUGE_PAGE, which must be one and zero, respectively.
157 * We set the ignored bits to zero.
158 */
159#define _PAGE_TABLE _PAGE_PRESENT
160
161/* Inherit the caching flags from the old protection bits. */
162#define pgprot_modify(oldprot, newprot) \
163 (pgprot_t) { ((oldprot).val & ~_PAGE_ALL) | (newprot).val }
164
165/* Just setting the PFN to zero suffices. */
166#define pte_pgprot(x) hv_pte_set_pfn((x), 0)
167
168/*
169 * For PTEs and PDEs, we must clear the Present bit first when
170 * clearing a page table entry, so clear the bottom half first and
171 * enforce ordering with a barrier.
172 */
173static inline void __pte_clear(pte_t *ptep)
174{
175#ifdef __tilegx__
176 ptep->val = 0;
177#else
178 u32 *tmp = (u32 *)ptep;
179 tmp[0] = 0;
180 barrier();
181 tmp[1] = 0;
182#endif
183}
184#define pte_clear(mm, addr, ptep) __pte_clear(ptep)
185
186/*
187 * The following only work if pte_present() is true.
188 * Undefined behaviour if not..
189 */
190#define pte_present hv_pte_get_present
191#define pte_user hv_pte_get_user
192#define pte_read hv_pte_get_readable
193#define pte_dirty hv_pte_get_dirty
194#define pte_young hv_pte_get_accessed
195#define pte_write hv_pte_get_writable
196#define pte_exec hv_pte_get_executable
197#define pte_huge hv_pte_get_page
198#define pte_rdprotect hv_pte_clear_readable
199#define pte_exprotect hv_pte_clear_executable
200#define pte_mkclean hv_pte_clear_dirty
201#define pte_mkold hv_pte_clear_accessed
202#define pte_wrprotect hv_pte_clear_writable
203#define pte_mksmall hv_pte_clear_page
204#define pte_mkread hv_pte_set_readable
205#define pte_mkexec hv_pte_set_executable
206#define pte_mkdirty hv_pte_set_dirty
207#define pte_mkyoung hv_pte_set_accessed
208#define pte_mkwrite hv_pte_set_writable
209#define pte_mkhuge hv_pte_set_page
210
211#define pte_special(pte) 0
212#define pte_mkspecial(pte) (pte)
213
214/*
215 * Use some spare bits in the PTE for user-caching tags.
216 */
217#define pte_set_forcecache hv_pte_set_client0
218#define pte_get_forcecache hv_pte_get_client0
219#define pte_clear_forcecache hv_pte_clear_client0
220#define pte_set_anyhome hv_pte_set_client1
221#define pte_get_anyhome hv_pte_get_client1
222#define pte_clear_anyhome hv_pte_clear_client1
223
224/*
225 * A migrating PTE has PAGE_PRESENT clear but all the other bits preserved.
226 */
227#define pte_migrating hv_pte_get_migrating
228#define pte_mkmigrate(x) hv_pte_set_migrating(hv_pte_clear_present(x))
229#define pte_donemigrate(x) hv_pte_set_present(hv_pte_clear_migrating(x))
230
231#define pte_ERROR(e) \
232 printk("%s:%d: bad pte 0x%016llx.\n", __FILE__, __LINE__, pte_val(e))
233#define pgd_ERROR(e) \
234 printk("%s:%d: bad pgd 0x%016llx.\n", __FILE__, __LINE__, pgd_val(e))
235
236/*
237 * set_pte_order() sets the given PTE and also sanity-checks the
238 * requested PTE against the page homecaching. Unspecified parts
239 * of the PTE are filled in when it is written to memory, i.e. all
240 * caching attributes if "!forcecache", or the home cpu if "anyhome".
241 */
242extern void set_pte_order(pte_t *ptep, pte_t pte, int order);
243
244#define set_pte(ptep, pteval) set_pte_order(ptep, pteval, 0)
245#define set_pte_at(mm, addr, ptep, pteval) set_pte(ptep, pteval)
246#define set_pte_atomic(pteptr, pteval) set_pte(pteptr, pteval)
247
248#define pte_page(x) pfn_to_page(pte_pfn(x))
249
250static inline int pte_none(pte_t pte)
251{
252 return !pte.val;
253}
254
255static inline unsigned long pte_pfn(pte_t pte)
256{
257 return hv_pte_get_pfn(pte);
258}
259
260/* Set or get the remote cache cpu in a pgprot with remote caching. */
261extern pgprot_t set_remote_cache_cpu(pgprot_t prot, int cpu);
262extern int get_remote_cache_cpu(pgprot_t prot);
263
264static inline pte_t pfn_pte(unsigned long pfn, pgprot_t prot)
265{
266 return hv_pte_set_pfn(prot, pfn);
267}
268
269/* Support for priority mappings. */
270extern void start_mm_caching(struct mm_struct *mm);
271extern void check_mm_caching(struct mm_struct *prev, struct mm_struct *next);
272
273/*
274 * Support non-linear file mappings (see sys_remap_file_pages).
275 * This is defined by CLIENT1 set but CLIENT0 and _PAGE_PRESENT clear, and the
276 * file offset in the 32 high bits.
277 */
278#define _PAGE_FILE HV_PTE_CLIENT1
279#define PTE_FILE_MAX_BITS 32
280#define pte_file(pte) (hv_pte_get_client1(pte) && !hv_pte_get_client0(pte))
281#define pte_to_pgoff(pte) ((pte).val >> 32)
282#define pgoff_to_pte(off) ((pte_t) { (((long long)(off)) << 32) | _PAGE_FILE })
283
284/*
285 * Encode and de-code a swap entry (see <linux/swapops.h>).
286 * We put the swap file type+offset in the 32 high bits;
287 * I believe we can just leave the low bits clear.
288 */
289#define __swp_type(swp) ((swp).val & 0x1f)
290#define __swp_offset(swp) ((swp).val >> 5)
291#define __swp_entry(type, off) ((swp_entry_t) { (type) | ((off) << 5) })
292#define __pte_to_swp_entry(pte) ((swp_entry_t) { (pte).val >> 32 })
293#define __swp_entry_to_pte(swp) ((pte_t) { (((long long) ((swp).val)) << 32) })
294
295/*
296 * clone_pgd_range(pgd_t *dst, pgd_t *src, int count);
297 *
298 * dst - pointer to pgd range anwhere on a pgd page
299 * src - ""
300 * count - the number of pgds to copy.
301 *
302 * dst and src can be on the same page, but the range must not overlap,
303 * and must not cross a page boundary.
304 */
305static inline void clone_pgd_range(pgd_t *dst, pgd_t *src, int count)
306{
307 memcpy(dst, src, count * sizeof(pgd_t));
308}
309
310/*
311 * Conversion functions: convert a page and protection to a page entry,
312 * and a page entry and page directory to the page they refer to.
313 */
314
315#define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot))
316
317/*
318 * If we are doing an mprotect(), just accept the new vma->vm_page_prot
319 * value and combine it with the PFN from the old PTE to get a new PTE.
320 */
321static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
322{
323 return pfn_pte(hv_pte_get_pfn(pte), newprot);
324}
325
326/*
327 * The pgd page can be thought of an array like this: pgd_t[PTRS_PER_PGD]
328 *
329 * This macro returns the index of the entry in the pgd page which would
330 * control the given virtual address.
331 */
332#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD - 1))
333
334/*
335 * pgd_offset() returns a (pgd_t *)
336 * pgd_index() is used get the offset into the pgd page's array of pgd_t's.
337 */
338#define pgd_offset(mm, address) ((mm)->pgd + pgd_index(address))
339
340/*
341 * A shortcut which implies the use of the kernel's pgd, instead
342 * of a process's.
343 */
344#define pgd_offset_k(address) pgd_offset(&init_mm, address)
345
346#if defined(CONFIG_HIGHPTE)
347extern pte_t *_pte_offset_map(pmd_t *, unsigned long address, enum km_type);
348#define pte_offset_map(dir, address) \
349 _pte_offset_map(dir, address, KM_PTE0)
350#define pte_offset_map_nested(dir, address) \
351 _pte_offset_map(dir, address, KM_PTE1)
352#define pte_unmap(pte) kunmap_atomic(pte, KM_PTE0)
353#define pte_unmap_nested(pte) kunmap_atomic(pte, KM_PTE1)
354#else
355#define pte_offset_map(dir, address) pte_offset_kernel(dir, address)
356#define pte_offset_map_nested(dir, address) pte_offset_map(dir, address)
357#define pte_unmap(pte) do { } while (0)
358#define pte_unmap_nested(pte) do { } while (0)
359#endif
360
361/* Clear a non-executable kernel PTE and flush it from the TLB. */
362#define kpte_clear_flush(ptep, vaddr) \
363do { \
364 pte_clear(&init_mm, (vaddr), (ptep)); \
365 local_flush_tlb_page(FLUSH_NONEXEC, (vaddr), PAGE_SIZE); \
366} while (0)
367
368/*
369 * The kernel page tables contain what we need, and we flush when we
370 * change specific page table entries.
371 */
372#define update_mmu_cache(vma, address, pte) do { } while (0)
373
374#ifdef CONFIG_FLATMEM
375#define kern_addr_valid(addr) (1)
376#endif /* CONFIG_FLATMEM */
377
378#define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \
379 remap_pfn_range(vma, vaddr, pfn, size, prot)
380
381extern void vmalloc_sync_all(void);
382
383#endif /* !__ASSEMBLY__ */
384
385#ifdef __tilegx__
386#include <asm/pgtable_64.h>
387#else
388#include <asm/pgtable_32.h>
389#endif
390
391#ifndef __ASSEMBLY__
392
393static inline int pmd_none(pmd_t pmd)
394{
395 /*
396 * Only check low word on 32-bit platforms, since it might be
397 * out of sync with upper half.
398 */
399 return (unsigned long)pmd_val(pmd) == 0;
400}
401
402static inline int pmd_present(pmd_t pmd)
403{
404 return pmd_val(pmd) & _PAGE_PRESENT;
405}
406
407static inline int pmd_bad(pmd_t pmd)
408{
409 return ((pmd_val(pmd) & _PAGE_ALL) != _PAGE_TABLE);
410}
411
412static inline unsigned long pages_to_mb(unsigned long npg)
413{
414 return npg >> (20 - PAGE_SHIFT);
415}
416
417/*
418 * The pmd can be thought of an array like this: pmd_t[PTRS_PER_PMD]
419 *
420 * This function returns the index of the entry in the pmd which would
421 * control the given virtual address.
422 */
423static inline unsigned long pmd_index(unsigned long address)
424{
425 return (address >> PMD_SHIFT) & (PTRS_PER_PMD - 1);
426}
427
428/*
429 * A given kernel pmd_t maps to a specific virtual address (either a
430 * kernel huge page or a kernel pte_t table). Since kernel pte_t
431 * tables can be aligned at sub-page granularity, this function can
432 * return non-page-aligned pointers, despite its name.
433 */
434static inline unsigned long pmd_page_vaddr(pmd_t pmd)
435{
436 phys_addr_t pa =
437 (phys_addr_t)pmd_ptfn(pmd) << HV_LOG2_PAGE_TABLE_ALIGN;
438 return (unsigned long)__va(pa);
439}
440
441/*
442 * A pmd_t points to the base of a huge page or to a pte_t array.
443 * If a pte_t array, since we can have multiple per page, we don't
444 * have a one-to-one mapping of pmd_t's to pages. However, this is
445 * OK for pte_lockptr(), since we just end up with potentially one
446 * lock being used for several pte_t arrays.
447 */
448#define pmd_page(pmd) pfn_to_page(HV_PTFN_TO_PFN(pmd_ptfn(pmd)))
449
450/*
451 * The pte page can be thought of an array like this: pte_t[PTRS_PER_PTE]
452 *
453 * This macro returns the index of the entry in the pte page which would
454 * control the given virtual address.
455 */
456static inline unsigned long pte_index(unsigned long address)
457{
458 return (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1);
459}
460
461static inline pte_t *pte_offset_kernel(pmd_t *pmd, unsigned long address)
462{
463 return (pte_t *)pmd_page_vaddr(*pmd) + pte_index(address);
464}
465
466static inline int pmd_huge_page(pmd_t pmd)
467{
468 return pmd_val(pmd) & _PAGE_HUGE_PAGE;
469}
470
471#include <asm-generic/pgtable.h>
472
473#endif /* !__ASSEMBLY__ */
474
475#endif /* _ASM_TILE_PGTABLE_H */
diff --git a/arch/tile/include/asm/pgtable_32.h b/arch/tile/include/asm/pgtable_32.h
new file mode 100644
index 000000000000..b935fb2ad4f3
--- /dev/null
+++ b/arch/tile/include/asm/pgtable_32.h
@@ -0,0 +1,117 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 *
14 */
15
16#ifndef _ASM_TILE_PGTABLE_32_H
17#define _ASM_TILE_PGTABLE_32_H
18
19/*
20 * The level-1 index is defined by the huge page size. A PGD is composed
21 * of PTRS_PER_PGD pgd_t's and is the top level of the page table.
22 */
23#define PGDIR_SHIFT HV_LOG2_PAGE_SIZE_LARGE
24#define PGDIR_SIZE HV_PAGE_SIZE_LARGE
25#define PGDIR_MASK (~(PGDIR_SIZE-1))
26#define PTRS_PER_PGD (1 << (32 - PGDIR_SHIFT))
27
28/*
29 * The level-2 index is defined by the difference between the huge
30 * page size and the normal page size. A PTE is composed of
31 * PTRS_PER_PTE pte_t's and is the bottom level of the page table.
32 * Note that the hypervisor docs use PTE for what we call pte_t, so
33 * this nomenclature is somewhat confusing.
34 */
35#define PTRS_PER_PTE (1 << (HV_LOG2_PAGE_SIZE_LARGE - HV_LOG2_PAGE_SIZE_SMALL))
36
37#ifndef __ASSEMBLY__
38
39/*
40 * Right now we initialize only a single pte table. It can be extended
41 * easily, subsequent pte tables have to be allocated in one physical
42 * chunk of RAM.
43 *
44 * HOWEVER, if we are using an allocation scheme with slop after the
45 * end of the page table (e.g. where our L2 page tables are 2KB but
46 * our pages are 64KB and we are allocating via the page allocator)
47 * we can't extend it easily.
48 */
49#define LAST_PKMAP PTRS_PER_PTE
50
51#define PKMAP_BASE ((FIXADDR_BOOT_START - PAGE_SIZE*LAST_PKMAP) & PGDIR_MASK)
52
53#ifdef CONFIG_HIGHMEM
54# define __VMAPPING_END (PKMAP_BASE & ~(HPAGE_SIZE-1))
55#else
56# define __VMAPPING_END (FIXADDR_START & ~(HPAGE_SIZE-1))
57#endif
58
59#ifdef CONFIG_HUGEVMAP
60#define HUGE_VMAP_END __VMAPPING_END
61#define HUGE_VMAP_BASE (HUGE_VMAP_END - CONFIG_NR_HUGE_VMAPS * HPAGE_SIZE)
62#define _VMALLOC_END HUGE_VMAP_BASE
63#else
64#define _VMALLOC_END __VMAPPING_END
65#endif
66
67/*
68 * Align the vmalloc area to an L2 page table, and leave a guard page
69 * at the beginning and end. The vmalloc code also puts in an internal
70 * guard page between each allocation.
71 */
72#define VMALLOC_END (_VMALLOC_END - PAGE_SIZE)
73extern unsigned long VMALLOC_RESERVE /* = CONFIG_VMALLOC_RESERVE */;
74#define _VMALLOC_START (_VMALLOC_END - VMALLOC_RESERVE)
75#define VMALLOC_START (_VMALLOC_START + PAGE_SIZE)
76
77/* This is the maximum possible amount of lowmem. */
78#define MAXMEM (_VMALLOC_START - PAGE_OFFSET)
79
80/* We have no pmd or pud since we are strictly a two-level page table */
81#include <asm-generic/pgtable-nopmd.h>
82
83/* We don't define any pgds for these addresses. */
84static inline int pgd_addr_invalid(unsigned long addr)
85{
86 return addr >= MEM_HV_INTRPT;
87}
88
89/*
90 * Provide versions of these routines that can be used safely when
91 * the hypervisor may be asynchronously modifying dirty/accessed bits.
92 */
93#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
94#define __HAVE_ARCH_PTEP_SET_WRPROTECT
95
96extern int ptep_test_and_clear_young(struct vm_area_struct *,
97 unsigned long addr, pte_t *);
98extern void ptep_set_wrprotect(struct mm_struct *,
99 unsigned long addr, pte_t *);
100
101/* Create a pmd from a PTFN. */
102static inline pmd_t ptfn_pmd(unsigned long ptfn, pgprot_t prot)
103{
104 return (pmd_t){ { hv_pte_set_ptfn(prot, ptfn) } };
105}
106
107/* Return the page-table frame number (ptfn) that a pmd_t points at. */
108#define pmd_ptfn(pmd) hv_pte_get_ptfn((pmd).pud.pgd)
109
110static inline void pmd_clear(pmd_t *pmdp)
111{
112 __pte_clear(&pmdp->pud.pgd);
113}
114
115#endif /* __ASSEMBLY__ */
116
117#endif /* _ASM_TILE_PGTABLE_32_H */
diff --git a/arch/tile/include/asm/poll.h b/arch/tile/include/asm/poll.h
new file mode 100644
index 000000000000..c98509d3149e
--- /dev/null
+++ b/arch/tile/include/asm/poll.h
@@ -0,0 +1 @@
#include <asm-generic/poll.h>
diff --git a/arch/tile/include/asm/posix_types.h b/arch/tile/include/asm/posix_types.h
new file mode 100644
index 000000000000..22cae6230ceb
--- /dev/null
+++ b/arch/tile/include/asm/posix_types.h
@@ -0,0 +1 @@
#include <asm-generic/posix_types.h>
diff --git a/arch/tile/include/asm/processor.h b/arch/tile/include/asm/processor.h
new file mode 100644
index 000000000000..96c50d2c4c2b
--- /dev/null
+++ b/arch/tile/include/asm/processor.h
@@ -0,0 +1,339 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_PROCESSOR_H
16#define _ASM_TILE_PROCESSOR_H
17
18#ifndef __ASSEMBLY__
19
20/*
21 * NOTE: we don't include <linux/ptrace.h> or <linux/percpu.h> as one
22 * normally would, due to #include dependencies.
23 */
24#include <asm/ptrace.h>
25#include <asm/percpu.h>
26
27#include <arch/chip.h>
28#include <arch/spr_def.h>
29
30struct task_struct;
31struct thread_struct;
32struct list_head;
33
34typedef struct {
35 unsigned long seg;
36} mm_segment_t;
37
38/*
39 * Default implementation of macro that returns current
40 * instruction pointer ("program counter").
41 */
42void *current_text_addr(void);
43
44#if CHIP_HAS_TILE_DMA()
45/* Capture the state of a suspended DMA. */
46struct tile_dma_state {
47 int enabled;
48 unsigned long src;
49 unsigned long dest;
50 unsigned long strides;
51 unsigned long chunk_size;
52 unsigned long src_chunk;
53 unsigned long dest_chunk;
54 unsigned long byte;
55 unsigned long status;
56};
57
58/*
59 * A mask of the DMA status register for selecting only the 'running'
60 * and 'done' bits.
61 */
62#define DMA_STATUS_MASK \
63 (SPR_DMA_STATUS__RUNNING_MASK | SPR_DMA_STATUS__DONE_MASK)
64#endif
65
66/*
67 * Track asynchronous TLB events (faults and access violations)
68 * that occur while we are in kernel mode from DMA or the SN processor.
69 */
70struct async_tlb {
71 short fault_num; /* original fault number; 0 if none */
72 char is_fault; /* was it a fault (vs an access violation) */
73 char is_write; /* for fault: was it caused by a write? */
74 unsigned long address; /* what address faulted? */
75};
76
77
78struct thread_struct {
79 /* kernel stack pointer */
80 unsigned long ksp;
81 /* kernel PC */
82 unsigned long pc;
83 /* starting user stack pointer (for page migration) */
84 unsigned long usp0;
85 /* pid of process that created this one */
86 pid_t creator_pid;
87#if CHIP_HAS_TILE_DMA()
88 /* DMA info for suspended threads (byte == 0 means no DMA state) */
89 struct tile_dma_state tile_dma_state;
90#endif
91 /* User EX_CONTEXT registers */
92 unsigned long ex_context[2];
93 /* User SYSTEM_SAVE registers */
94 unsigned long system_save[4];
95 /* User interrupt mask */
96 unsigned long long interrupt_mask;
97 /* User interrupt-control 0 state */
98 unsigned long intctrl_0;
99#if CHIP_HAS_PROC_STATUS_SPR()
100 /* Any other miscellaneous processor state bits */
101 unsigned long proc_status;
102#endif
103#if CHIP_HAS_TILE_DMA()
104 /* Async DMA TLB fault information */
105 struct async_tlb dma_async_tlb;
106#endif
107#if CHIP_HAS_SN_PROC()
108 /* Was static network processor when we were switched out? */
109 int sn_proc_running;
110 /* Async SNI TLB fault information */
111 struct async_tlb sn_async_tlb;
112#endif
113};
114
115#endif /* !__ASSEMBLY__ */
116
117/*
118 * Start with "sp" this many bytes below the top of the kernel stack.
119 * This preserves the invariant that a called function may write to *sp.
120 */
121#define STACK_TOP_DELTA 8
122
123/*
124 * When entering the kernel via a fault, start with the top of the
125 * pt_regs structure this many bytes below the top of the page.
126 * This aligns the pt_regs structure optimally for cache-line access.
127 */
128#ifdef __tilegx__
129#define KSTK_PTREGS_GAP 48
130#else
131#define KSTK_PTREGS_GAP 56
132#endif
133
134#ifndef __ASSEMBLY__
135
136#ifdef __tilegx__
137#define TASK_SIZE_MAX (MEM_LOW_END + 1)
138#else
139#define TASK_SIZE_MAX PAGE_OFFSET
140#endif
141
142/* TASK_SIZE and related variables are always checked in "current" context. */
143#ifdef CONFIG_COMPAT
144#define COMPAT_TASK_SIZE (1UL << 31)
145#define TASK_SIZE ((current_thread_info()->status & TS_COMPAT) ?\
146 COMPAT_TASK_SIZE : TASK_SIZE_MAX)
147#else
148#define TASK_SIZE TASK_SIZE_MAX
149#endif
150
151/* We provide a minimal "vdso" a la x86; just the sigreturn code for now. */
152#define VDSO_BASE (TASK_SIZE - PAGE_SIZE)
153
154#define STACK_TOP VDSO_BASE
155
156/* STACK_TOP_MAX is used temporarily in execve and should not check COMPAT. */
157#define STACK_TOP_MAX TASK_SIZE_MAX
158
159/*
160 * This decides where the kernel will search for a free chunk of vm
161 * space during mmap's, if it is using bottom-up mapping.
162 */
163#define TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3))
164
165#define HAVE_ARCH_PICK_MMAP_LAYOUT
166
167#define INIT_THREAD { \
168 .ksp = (unsigned long)init_stack + THREAD_SIZE - STACK_TOP_DELTA, \
169 .interrupt_mask = -1ULL \
170}
171
172/* Kernel stack top for the task that first boots on this cpu. */
173DECLARE_PER_CPU(unsigned long, boot_sp);
174
175/* PC to boot from on this cpu. */
176DECLARE_PER_CPU(unsigned long, boot_pc);
177
178/* Do necessary setup to start up a newly executed thread. */
179static inline void start_thread(struct pt_regs *regs,
180 unsigned long pc, unsigned long usp)
181{
182 regs->pc = pc;
183 regs->sp = usp;
184}
185
186/* Free all resources held by a thread. */
187static inline void release_thread(struct task_struct *dead_task)
188{
189 /* Nothing for now */
190}
191
192/* Prepare to copy thread state - unlazy all lazy status. */
193#define prepare_to_copy(tsk) do { } while (0)
194
195extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
196
197/* Helper routines for setting home cache modes at exec() time. */
198
199
200/*
201 * Return saved (kernel) PC of a blocked thread.
202 * Only used in a printk() in kernel/sched.c, so don't work too hard.
203 */
204#define thread_saved_pc(t) ((t)->thread.pc)
205
206unsigned long get_wchan(struct task_struct *p);
207
208/* Return initial ksp value for given task. */
209#define task_ksp0(task) ((unsigned long)(task)->stack + THREAD_SIZE)
210
211/* Return some info about the user process TASK. */
212#define KSTK_TOP(task) (task_ksp0(task) - STACK_TOP_DELTA)
213#define task_pt_regs(task) \
214 ((struct pt_regs *)(task_ksp0(task) - KSTK_PTREGS_GAP) - 1)
215#define task_sp(task) (task_pt_regs(task)->sp)
216#define task_pc(task) (task_pt_regs(task)->pc)
217/* Aliases for pc and sp (used in fs/proc/array.c) */
218#define KSTK_EIP(task) task_pc(task)
219#define KSTK_ESP(task) task_sp(task)
220
221/* Standard format for printing registers and other word-size data. */
222#ifdef __tilegx__
223# define REGFMT "0x%016lx"
224#else
225# define REGFMT "0x%08lx"
226#endif
227
228/*
229 * Do some slow action (e.g. read a slow SPR).
230 * Note that this must also have compiler-barrier semantics since
231 * it may be used in a busy loop reading memory.
232 */
233static inline void cpu_relax(void)
234{
235 __insn_mfspr(SPR_PASS);
236 barrier();
237}
238
239struct siginfo;
240extern void arch_coredump_signal(struct siginfo *, struct pt_regs *);
241#define arch_coredump_signal arch_coredump_signal
242
243/* Provide information about the chip model. */
244extern char chip_model[64];
245
246/* Data on which physical memory controller corresponds to which NUMA node. */
247extern int node_controller[];
248
249
250/* Do we dump information to the console when a user application crashes? */
251extern int show_crashinfo;
252
253#if CHIP_HAS_CBOX_HOME_MAP()
254/* Does the heap allocator return hash-for-home pages by default? */
255extern int hash_default;
256
257/* Should kernel stack pages be hash-for-home? */
258extern int kstack_hash;
259#else
260#define hash_default 0
261#define kstack_hash 0
262#endif
263
264/* Are we using huge pages in the TLB for kernel data? */
265extern int kdata_huge;
266
267/*
268 * Note that with OLOC the prefetch will return an unused read word to
269 * the issuing tile, which will cause some MDN traffic. Benchmarking
270 * should be done to see whether this outweighs prefetching.
271 */
272#define ARCH_HAS_PREFETCH
273#define ARCH_HAS_PREFETCHW
274#define ARCH_HAS_SPINLOCK_PREFETCH
275
276#define prefetch(ptr) __builtin_prefetch((ptr), 0, 3)
277#define prefetchw(ptr) __builtin_prefetch((ptr), 1, 3)
278
279#ifdef CONFIG_SMP
280#define spin_lock_prefetch(ptr) prefetchw(ptr)
281#else
282/* Nothing to prefetch. */
283#define spin_lock_prefetch(lock) do { } while (0)
284#endif
285
286#else /* __ASSEMBLY__ */
287
288/* Do some slow action (e.g. read a slow SPR). */
289#define CPU_RELAX mfspr zero, SPR_PASS
290
291#endif /* !__ASSEMBLY__ */
292
293/* Assembly code assumes that the PL is in the low bits. */
294#if SPR_EX_CONTEXT_1_1__PL_SHIFT != 0
295# error Fix assembly assumptions about PL
296#endif
297
298/* We sometimes use these macros for EX_CONTEXT_0_1 as well. */
299#if SPR_EX_CONTEXT_1_1__PL_SHIFT != SPR_EX_CONTEXT_0_1__PL_SHIFT || \
300 SPR_EX_CONTEXT_1_1__PL_RMASK != SPR_EX_CONTEXT_0_1__PL_RMASK || \
301 SPR_EX_CONTEXT_1_1__ICS_SHIFT != SPR_EX_CONTEXT_0_1__ICS_SHIFT || \
302 SPR_EX_CONTEXT_1_1__ICS_RMASK != SPR_EX_CONTEXT_0_1__ICS_RMASK
303# error Fix assumptions that EX1 macros work for both PL0 and PL1
304#endif
305
306/* Allow pulling apart and recombining the PL and ICS bits in EX_CONTEXT. */
307#define EX1_PL(ex1) \
308 (((ex1) >> SPR_EX_CONTEXT_1_1__PL_SHIFT) & SPR_EX_CONTEXT_1_1__PL_RMASK)
309#define EX1_ICS(ex1) \
310 (((ex1) >> SPR_EX_CONTEXT_1_1__ICS_SHIFT) & SPR_EX_CONTEXT_1_1__ICS_RMASK)
311#define PL_ICS_EX1(pl, ics) \
312 (((pl) << SPR_EX_CONTEXT_1_1__PL_SHIFT) | \
313 ((ics) << SPR_EX_CONTEXT_1_1__ICS_SHIFT))
314
315/*
316 * Provide symbolic constants for PLs.
317 * Note that assembly code assumes that USER_PL is zero.
318 */
319#define USER_PL 0
320#define KERNEL_PL 1
321
322/* SYSTEM_SAVE_1_0 holds the current cpu number ORed with ksp0. */
323#define CPU_LOG_MASK_VALUE 12
324#define CPU_MASK_VALUE ((1 << CPU_LOG_MASK_VALUE) - 1)
325#if CONFIG_NR_CPUS > CPU_MASK_VALUE
326# error Too many cpus!
327#endif
328#define raw_smp_processor_id() \
329 ((int)__insn_mfspr(SPR_SYSTEM_SAVE_1_0) & CPU_MASK_VALUE)
330#define get_current_ksp0() \
331 (__insn_mfspr(SPR_SYSTEM_SAVE_1_0) & ~CPU_MASK_VALUE)
332#define next_current_ksp0(task) ({ \
333 unsigned long __ksp0 = task_ksp0(task); \
334 int __cpu = raw_smp_processor_id(); \
335 BUG_ON(__ksp0 & CPU_MASK_VALUE); \
336 __ksp0 | __cpu; \
337})
338
339#endif /* _ASM_TILE_PROCESSOR_H */
diff --git a/arch/tile/include/asm/ptrace.h b/arch/tile/include/asm/ptrace.h
new file mode 100644
index 000000000000..4d1d9953016a
--- /dev/null
+++ b/arch/tile/include/asm/ptrace.h
@@ -0,0 +1,163 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_PTRACE_H
16#define _ASM_TILE_PTRACE_H
17
18#include <arch/chip.h>
19#include <arch/abi.h>
20
21/* These must match struct pt_regs, below. */
22#if CHIP_WORD_SIZE() == 32
23#define PTREGS_OFFSET_REG(n) ((n)*4)
24#else
25#define PTREGS_OFFSET_REG(n) ((n)*8)
26#endif
27#define PTREGS_OFFSET_BASE 0
28#define PTREGS_OFFSET_TP PTREGS_OFFSET_REG(53)
29#define PTREGS_OFFSET_SP PTREGS_OFFSET_REG(54)
30#define PTREGS_OFFSET_LR PTREGS_OFFSET_REG(55)
31#define PTREGS_NR_GPRS 56
32#define PTREGS_OFFSET_PC PTREGS_OFFSET_REG(56)
33#define PTREGS_OFFSET_EX1 PTREGS_OFFSET_REG(57)
34#define PTREGS_OFFSET_FAULTNUM PTREGS_OFFSET_REG(58)
35#define PTREGS_OFFSET_ORIG_R0 PTREGS_OFFSET_REG(59)
36#define PTREGS_OFFSET_FLAGS PTREGS_OFFSET_REG(60)
37#if CHIP_HAS_CMPEXCH()
38#define PTREGS_OFFSET_CMPEXCH PTREGS_OFFSET_REG(61)
39#endif
40#define PTREGS_SIZE PTREGS_OFFSET_REG(64)
41
42#ifndef __ASSEMBLY__
43
44#ifdef __KERNEL__
45/* Benefit from consistent use of "long" on all chips. */
46typedef unsigned long pt_reg_t;
47#else
48/* Provide appropriate length type to userspace regardless of -m32/-m64. */
49typedef uint_reg_t pt_reg_t;
50#endif
51
52/*
53 * This struct defines the way the registers are stored on the stack during a
54 * system call/exception. It should be a multiple of 8 bytes to preserve
55 * normal stack alignment rules.
56 *
57 * Must track <sys/ucontext.h> and <sys/procfs.h>
58 */
59struct pt_regs {
60 /* Saved main processor registers; 56..63 are special. */
61 /* tp, sp, and lr must immediately follow regs[] for aliasing. */
62 pt_reg_t regs[53];
63 pt_reg_t tp; /* aliases regs[TREG_TP] */
64 pt_reg_t sp; /* aliases regs[TREG_SP] */
65 pt_reg_t lr; /* aliases regs[TREG_LR] */
66
67 /* Saved special registers. */
68 pt_reg_t pc; /* stored in EX_CONTEXT_1_0 */
69 pt_reg_t ex1; /* stored in EX_CONTEXT_1_1 (PL and ICS bit) */
70 pt_reg_t faultnum; /* fault number (INT_SWINT_1 for syscall) */
71 pt_reg_t orig_r0; /* r0 at syscall entry, else zero */
72 pt_reg_t flags; /* flags (see below) */
73#if !CHIP_HAS_CMPEXCH()
74 pt_reg_t pad[3];
75#else
76 pt_reg_t cmpexch; /* value of CMPEXCH_VALUE SPR at interrupt */
77 pt_reg_t pad[2];
78#endif
79};
80
81#endif /* __ASSEMBLY__ */
82
83/* Flag bits in pt_regs.flags */
84#define PT_FLAGS_DISABLE_IRQ 1 /* on return to kernel, disable irqs */
85#define PT_FLAGS_CALLER_SAVES 2 /* caller-save registers are valid */
86#define PT_FLAGS_RESTORE_REGS 4 /* restore callee-save regs on return */
87
88#define PTRACE_GETREGS 12
89#define PTRACE_SETREGS 13
90#define PTRACE_GETFPREGS 14
91#define PTRACE_SETFPREGS 15
92
93/* Support TILE-specific ptrace options, with events starting at 16. */
94#define PTRACE_O_TRACEMIGRATE 0x00010000
95#define PTRACE_EVENT_MIGRATE 16
96#ifdef __KERNEL__
97#define PTRACE_O_MASK_TILE (PTRACE_O_TRACEMIGRATE)
98#define PT_TRACE_MIGRATE 0x00080000
99#define PT_TRACE_MASK_TILE (PT_TRACE_MIGRATE)
100#endif
101
102#ifdef __KERNEL__
103
104#ifndef __ASSEMBLY__
105
106#define instruction_pointer(regs) ((regs)->pc)
107#define profile_pc(regs) instruction_pointer(regs)
108
109/* Does the process account for user or for system time? */
110#define user_mode(regs) (EX1_PL((regs)->ex1) == USER_PL)
111
112/* Fill in a struct pt_regs with the current kernel registers. */
113struct pt_regs *get_pt_regs(struct pt_regs *);
114
115extern void show_regs(struct pt_regs *);
116
117#define arch_has_single_step() (1)
118
119/*
120 * A structure for all single-stepper state.
121 *
122 * Also update defines in assembler section if it changes
123 */
124struct single_step_state {
125 /* the page to which we will write hacked-up bundles */
126 void *buffer;
127
128 union {
129 int flags;
130 struct {
131 unsigned long is_enabled:1, update:1, update_reg:6;
132 };
133 };
134
135 unsigned long orig_pc; /* the original PC */
136 unsigned long next_pc; /* return PC if no branch (PC + 1) */
137 unsigned long branch_next_pc; /* return PC if we did branch/jump */
138 unsigned long update_value; /* value to restore to update_target */
139};
140
141/* Single-step the instruction at regs->pc */
142extern void single_step_once(struct pt_regs *regs);
143
144struct task_struct;
145
146extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs,
147 int error_code);
148
149#ifdef __tilegx__
150/* We need this since sigval_t has a user pointer in it, for GETSIGINFO etc. */
151#define __ARCH_WANT_COMPAT_SYS_PTRACE
152#endif
153
154#endif /* !__ASSEMBLY__ */
155
156#define SINGLESTEP_STATE_MASK_IS_ENABLED 0x1
157#define SINGLESTEP_STATE_MASK_UPDATE 0x2
158#define SINGLESTEP_STATE_TARGET_LB 2
159#define SINGLESTEP_STATE_TARGET_UB 7
160
161#endif /* !__KERNEL__ */
162
163#endif /* _ASM_TILE_PTRACE_H */
diff --git a/arch/tile/include/asm/resource.h b/arch/tile/include/asm/resource.h
new file mode 100644
index 000000000000..04bc4db8921b
--- /dev/null
+++ b/arch/tile/include/asm/resource.h
@@ -0,0 +1 @@
#include <asm-generic/resource.h>
diff --git a/arch/tile/include/asm/scatterlist.h b/arch/tile/include/asm/scatterlist.h
new file mode 100644
index 000000000000..c5604242c0d5
--- /dev/null
+++ b/arch/tile/include/asm/scatterlist.h
@@ -0,0 +1,22 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_SCATTERLIST_H
16#define _ASM_TILE_SCATTERLIST_H
17
18#define ISA_DMA_THRESHOLD (~0UL)
19
20#include <asm-generic/scatterlist.h>
21
22#endif /* _ASM_TILE_SCATTERLIST_H */
diff --git a/arch/tile/include/asm/sections.h b/arch/tile/include/asm/sections.h
new file mode 100644
index 000000000000..6c111491f0ed
--- /dev/null
+++ b/arch/tile/include/asm/sections.h
@@ -0,0 +1,37 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_SECTIONS_H
16#define _ASM_TILE_SECTIONS_H
17
18#define arch_is_kernel_data arch_is_kernel_data
19
20#include <asm-generic/sections.h>
21
22/* Text and data are at different areas in the kernel VA space. */
23extern char _sinitdata[], _einitdata[];
24
25/* Write-once data is writable only till the end of initialization. */
26extern char __w1data_begin[], __w1data_end[];
27
28extern char __feedback_section_start[], __feedback_section_end[];
29
30/* Handle the discontiguity between _sdata and _stext. */
31static inline int arch_is_kernel_data(unsigned long addr)
32{
33 return addr >= (unsigned long)_sdata &&
34 addr < (unsigned long)_end;
35}
36
37#endif /* _ASM_TILE_SECTIONS_H */
diff --git a/arch/tile/include/asm/sembuf.h b/arch/tile/include/asm/sembuf.h
new file mode 100644
index 000000000000..7673b83cfef7
--- /dev/null
+++ b/arch/tile/include/asm/sembuf.h
@@ -0,0 +1 @@
#include <asm-generic/sembuf.h>
diff --git a/arch/tile/include/asm/setup.h b/arch/tile/include/asm/setup.h
new file mode 100644
index 000000000000..823ddd47ff6e
--- /dev/null
+++ b/arch/tile/include/asm/setup.h
@@ -0,0 +1,32 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_SETUP_H
16#define _ASM_TILE_SETUP_H
17
18#include <linux/pfn.h>
19#include <linux/init.h>
20
21/*
22 * Reserved space for vmalloc and iomap - defined in asm/page.h
23 */
24#define MAXMEM_PFN PFN_DOWN(MAXMEM)
25
26#define COMMAND_LINE_SIZE 2048
27
28void early_panic(const char *fmt, ...);
29void warn_early_printk(void);
30void __init disable_early_printk(void);
31
32#endif /* _ASM_TILE_SETUP_H */
diff --git a/arch/tile/include/asm/shmbuf.h b/arch/tile/include/asm/shmbuf.h
new file mode 100644
index 000000000000..83c05fc2de38
--- /dev/null
+++ b/arch/tile/include/asm/shmbuf.h
@@ -0,0 +1 @@
#include <asm-generic/shmbuf.h>
diff --git a/arch/tile/include/asm/shmparam.h b/arch/tile/include/asm/shmparam.h
new file mode 100644
index 000000000000..93f30deb95d0
--- /dev/null
+++ b/arch/tile/include/asm/shmparam.h
@@ -0,0 +1 @@
#include <asm-generic/shmparam.h>
diff --git a/arch/tile/include/asm/sigcontext.h b/arch/tile/include/asm/sigcontext.h
new file mode 100644
index 000000000000..7cd7672e3ad4
--- /dev/null
+++ b/arch/tile/include/asm/sigcontext.h
@@ -0,0 +1,27 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_SIGCONTEXT_H
16#define _ASM_TILE_SIGCONTEXT_H
17
18/* NOTE: we can't include <linux/ptrace.h> due to #include dependencies. */
19#include <asm/ptrace.h>
20
21/* Must track <sys/ucontext.h> */
22
23struct sigcontext {
24 struct pt_regs regs;
25};
26
27#endif /* _ASM_TILE_SIGCONTEXT_H */
diff --git a/arch/tile/include/asm/sigframe.h b/arch/tile/include/asm/sigframe.h
new file mode 100644
index 000000000000..994d3d30205f
--- /dev/null
+++ b/arch/tile/include/asm/sigframe.h
@@ -0,0 +1,33 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_SIGFRAME_H
16#define _ASM_TILE_SIGFRAME_H
17
18/* Indicate that syscall return should not examine r0 */
19#define INT_SWINT_1_SIGRETURN (~0)
20
21#ifndef __ASSEMBLY__
22
23#include <arch/abi.h>
24
25struct rt_sigframe {
26 unsigned char save_area[C_ABI_SAVE_AREA_SIZE]; /* caller save area */
27 struct siginfo info;
28 struct ucontext uc;
29};
30
31#endif /* !__ASSEMBLY__ */
32
33#endif /* _ASM_TILE_SIGFRAME_H */
diff --git a/arch/tile/include/asm/siginfo.h b/arch/tile/include/asm/siginfo.h
new file mode 100644
index 000000000000..0c12d1b9ddf2
--- /dev/null
+++ b/arch/tile/include/asm/siginfo.h
@@ -0,0 +1,30 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_SIGINFO_H
16#define _ASM_TILE_SIGINFO_H
17
18#define __ARCH_SI_TRAPNO
19
20#include <asm-generic/siginfo.h>
21
22/*
23 * Additional Tile-specific SIGILL si_codes
24 */
25#define ILL_DBLFLT (__SI_FAULT|9) /* double fault */
26#define ILL_HARDWALL (__SI_FAULT|10) /* user networks hardwall violation */
27#undef NSIGILL
28#define NSIGILL 10
29
30#endif /* _ASM_TILE_SIGINFO_H */
diff --git a/arch/tile/include/asm/signal.h b/arch/tile/include/asm/signal.h
new file mode 100644
index 000000000000..d20d326d201b
--- /dev/null
+++ b/arch/tile/include/asm/signal.h
@@ -0,0 +1,31 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_SIGNAL_H
16#define _ASM_TILE_SIGNAL_H
17
18/* Do not notify a ptracer when this signal is handled. */
19#define SA_NOPTRACE 0x02000000u
20
21/* Used in earlier Tilera releases, so keeping for binary compatibility. */
22#define SA_RESTORER 0x04000000u
23
24#include <asm-generic/signal.h>
25
26#if defined(__KERNEL__) && !defined(__ASSEMBLY__)
27int restore_sigcontext(struct pt_regs *, struct sigcontext __user *, long *);
28int setup_sigcontext(struct sigcontext __user *, struct pt_regs *);
29#endif
30
31#endif /* _ASM_TILE_SIGNAL_H */
diff --git a/arch/tile/include/asm/smp.h b/arch/tile/include/asm/smp.h
new file mode 100644
index 000000000000..da24858a7392
--- /dev/null
+++ b/arch/tile/include/asm/smp.h
@@ -0,0 +1,126 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_SMP_H
16#define _ASM_TILE_SMP_H
17
18#ifdef CONFIG_SMP
19
20#include <asm/processor.h>
21#include <linux/cpumask.h>
22#include <linux/irqreturn.h>
23
24/* Set up this tile to support receiving hypervisor messages */
25void init_messaging(void);
26
27/* Set up this tile to support receiving device interrupts and IPIs. */
28void init_per_tile_IRQs(void);
29
30/* Send a message to processors specified in mask */
31void send_IPI_many(const struct cpumask *mask, int tag);
32
33/* Send a message to all but the sending processor */
34void send_IPI_allbutself(int tag);
35
36/* Send a message to a specific processor */
37void send_IPI_single(int dest, int tag);
38
39/* Process an IPI message */
40void evaluate_message(int tag);
41
42/* Process an IRQ_RESCHEDULE IPI. */
43irqreturn_t handle_reschedule_ipi(int irq, void *token);
44
45/* Boot a secondary cpu */
46void online_secondary(void);
47
48/* Call a function on a specified set of CPUs (may include this one). */
49extern void on_each_cpu_mask(const struct cpumask *mask,
50 void (*func)(void *), void *info, bool wait);
51
52/* Topology of the supervisor tile grid, and coordinates of boot processor */
53extern HV_Topology smp_topology;
54
55/* Accessors for grid size */
56#define smp_height (smp_topology.height)
57#define smp_width (smp_topology.width)
58
59/* Hypervisor message tags sent via the tile send_IPI*() routines. */
60#define MSG_TAG_START_CPU 1
61#define MSG_TAG_STOP_CPU 2
62#define MSG_TAG_CALL_FUNCTION_MANY 3
63#define MSG_TAG_CALL_FUNCTION_SINGLE 4
64
65/* Hook for the generic smp_call_function_many() routine. */
66static inline void arch_send_call_function_ipi_mask(struct cpumask *mask)
67{
68 send_IPI_many(mask, MSG_TAG_CALL_FUNCTION_MANY);
69}
70
71/* Hook for the generic smp_call_function_single() routine. */
72static inline void arch_send_call_function_single_ipi(int cpu)
73{
74 send_IPI_single(cpu, MSG_TAG_CALL_FUNCTION_SINGLE);
75}
76
77/* Print out the boot string describing which cpus were disabled. */
78void print_disabled_cpus(void);
79
80#else /* !CONFIG_SMP */
81
82#define on_each_cpu_mask(mask, func, info, wait) \
83 do { if (cpumask_test_cpu(0, (mask))) func(info); } while (0)
84
85#define smp_master_cpu 0
86#define smp_height 1
87#define smp_width 1
88
89#endif /* !CONFIG_SMP */
90
91
92/* Which cpus may be used as the lotar in a page table entry. */
93extern struct cpumask cpu_lotar_map;
94#define cpu_is_valid_lotar(cpu) cpumask_test_cpu((cpu), &cpu_lotar_map)
95
96#if CHIP_HAS_CBOX_HOME_MAP()
97/* Which processors are used for hash-for-home mapping */
98extern struct cpumask hash_for_home_map;
99#endif
100
101/* Which cpus can have their cache flushed by hv_flush_remote(). */
102extern struct cpumask cpu_cacheable_map;
103#define cpu_cacheable(cpu) cpumask_test_cpu((cpu), &cpu_cacheable_map)
104
105/* Convert an HV_LOTAR value into a cpu. */
106static inline int hv_lotar_to_cpu(HV_LOTAR lotar)
107{
108 return HV_LOTAR_X(lotar) + (HV_LOTAR_Y(lotar) * smp_width);
109}
110
111/*
112 * Extension of <linux/cpumask.h> functionality when you just want
113 * to express a mask or suppression or inclusion region without
114 * being too concerned about exactly which cpus are valid in that region.
115 */
116int bitmap_parselist_crop(const char *bp, unsigned long *maskp, int nmaskbits);
117
118#define cpulist_parse_crop(buf, dst) \
119 __cpulist_parse_crop((buf), (dst), NR_CPUS)
120static inline int __cpulist_parse_crop(const char *buf, struct cpumask *dstp,
121 int nbits)
122{
123 return bitmap_parselist_crop(buf, cpumask_bits(dstp), nbits);
124}
125
126#endif /* _ASM_TILE_SMP_H */
diff --git a/arch/tile/include/asm/socket.h b/arch/tile/include/asm/socket.h
new file mode 100644
index 000000000000..6b71384b9d8b
--- /dev/null
+++ b/arch/tile/include/asm/socket.h
@@ -0,0 +1 @@
#include <asm-generic/socket.h>
diff --git a/arch/tile/include/asm/sockios.h b/arch/tile/include/asm/sockios.h
new file mode 100644
index 000000000000..def6d4746ee7
--- /dev/null
+++ b/arch/tile/include/asm/sockios.h
@@ -0,0 +1 @@
#include <asm-generic/sockios.h>
diff --git a/arch/tile/include/asm/spinlock.h b/arch/tile/include/asm/spinlock.h
new file mode 100644
index 000000000000..1a8bd4740c28
--- /dev/null
+++ b/arch/tile/include/asm/spinlock.h
@@ -0,0 +1,24 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_SPINLOCK_H
16#define _ASM_TILE_SPINLOCK_H
17
18#ifdef __tilegx__
19#include <asm/spinlock_64.h>
20#else
21#include <asm/spinlock_32.h>
22#endif
23
24#endif /* _ASM_TILE_SPINLOCK_H */
diff --git a/arch/tile/include/asm/spinlock_32.h b/arch/tile/include/asm/spinlock_32.h
new file mode 100644
index 000000000000..f3a8473c68da
--- /dev/null
+++ b/arch/tile/include/asm/spinlock_32.h
@@ -0,0 +1,200 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 *
14 * 32-bit SMP spinlocks.
15 */
16
17#ifndef _ASM_TILE_SPINLOCK_32_H
18#define _ASM_TILE_SPINLOCK_32_H
19
20#include <asm/atomic.h>
21#include <asm/page.h>
22#include <asm/system.h>
23#include <linux/compiler.h>
24
25/*
26 * We only use even ticket numbers so the '1' inserted by a tns is
27 * an unambiguous "ticket is busy" flag.
28 */
29#define TICKET_QUANTUM 2
30
31
32/*
33 * SMP ticket spinlocks, allowing only a single CPU anywhere
34 *
35 * (the type definitions are in asm/spinlock_types.h)
36 */
37static inline int arch_spin_is_locked(arch_spinlock_t *lock)
38{
39 /*
40 * Note that even if a new ticket is in the process of being
41 * acquired, so lock->next_ticket is 1, it's still reasonable
42 * to claim the lock is held, since it will be momentarily
43 * if not already. There's no need to wait for a "valid"
44 * lock->next_ticket to become available.
45 */
46 return lock->next_ticket != lock->current_ticket;
47}
48
49void arch_spin_lock(arch_spinlock_t *lock);
50
51/* We cannot take an interrupt after getting a ticket, so don't enable them. */
52#define arch_spin_lock_flags(lock, flags) arch_spin_lock(lock)
53
54int arch_spin_trylock(arch_spinlock_t *lock);
55
56static inline void arch_spin_unlock(arch_spinlock_t *lock)
57{
58 /* For efficiency, overlap fetching the old ticket with the wmb(). */
59 int old_ticket = lock->current_ticket;
60 wmb(); /* guarantee anything modified under the lock is visible */
61 lock->current_ticket = old_ticket + TICKET_QUANTUM;
62}
63
64void arch_spin_unlock_wait(arch_spinlock_t *lock);
65
66/*
67 * Read-write spinlocks, allowing multiple readers
68 * but only one writer.
69 *
70 * We use a "tns/store-back" technique on a single word to manage
71 * the lock state, looping around to retry if the tns returns 1.
72 */
73
74/* Internal layout of the word; do not use. */
75#define _WR_NEXT_SHIFT 8
76#define _WR_CURR_SHIFT 16
77#define _WR_WIDTH 8
78#define _RD_COUNT_SHIFT 24
79#define _RD_COUNT_WIDTH 8
80
81/* Internal functions; do not use. */
82void arch_read_lock_slow(arch_rwlock_t *, u32);
83int arch_read_trylock_slow(arch_rwlock_t *);
84void arch_read_unlock_slow(arch_rwlock_t *);
85void arch_write_lock_slow(arch_rwlock_t *, u32);
86void arch_write_unlock_slow(arch_rwlock_t *, u32);
87
88/**
89 * arch_read_can_lock() - would read_trylock() succeed?
90 */
91static inline int arch_read_can_lock(arch_rwlock_t *rwlock)
92{
93 return (rwlock->lock << _RD_COUNT_WIDTH) == 0;
94}
95
96/**
97 * arch_write_can_lock() - would write_trylock() succeed?
98 */
99static inline int arch_write_can_lock(arch_rwlock_t *rwlock)
100{
101 return rwlock->lock == 0;
102}
103
104/**
105 * arch_read_lock() - acquire a read lock.
106 */
107static inline void arch_read_lock(arch_rwlock_t *rwlock)
108{
109 u32 val = __insn_tns((int *)&rwlock->lock);
110 if (unlikely(val << _RD_COUNT_WIDTH)) {
111 arch_read_lock_slow(rwlock, val);
112 return;
113 }
114 rwlock->lock = val + (1 << _RD_COUNT_SHIFT);
115}
116
117/**
118 * arch_read_lock() - acquire a write lock.
119 */
120static inline void arch_write_lock(arch_rwlock_t *rwlock)
121{
122 u32 val = __insn_tns((int *)&rwlock->lock);
123 if (unlikely(val != 0)) {
124 arch_write_lock_slow(rwlock, val);
125 return;
126 }
127 rwlock->lock = 1 << _WR_NEXT_SHIFT;
128}
129
130/**
131 * arch_read_trylock() - try to acquire a read lock.
132 */
133static inline int arch_read_trylock(arch_rwlock_t *rwlock)
134{
135 int locked;
136 u32 val = __insn_tns((int *)&rwlock->lock);
137 if (unlikely(val & 1)) {
138 return arch_read_trylock_slow(rwlock);
139 }
140 locked = (val << _RD_COUNT_WIDTH) == 0;
141 rwlock->lock = val + (locked << _RD_COUNT_SHIFT);
142 return locked;
143}
144
145/**
146 * arch_write_trylock() - try to acquire a write lock.
147 */
148static inline int arch_write_trylock(arch_rwlock_t *rwlock)
149{
150 u32 val = __insn_tns((int *)&rwlock->lock);
151
152 /*
153 * If a tns is in progress, or there's a waiting or active locker,
154 * or active readers, we can't take the lock, so give up.
155 */
156 if (unlikely(val != 0)) {
157 if (!(val & 1))
158 rwlock->lock = val;
159 return 0;
160 }
161
162 /* Set the "next" field to mark it locked. */
163 rwlock->lock = 1 << _WR_NEXT_SHIFT;
164 return 1;
165}
166
167/**
168 * arch_read_unlock() - release a read lock.
169 */
170static inline void arch_read_unlock(arch_rwlock_t *rwlock)
171{
172 u32 val;
173 mb(); /* guarantee anything modified under the lock is visible */
174 val = __insn_tns((int *)&rwlock->lock);
175 if (unlikely(val & 1)) {
176 arch_read_unlock_slow(rwlock);
177 return;
178 }
179 rwlock->lock = val - (1 << _RD_COUNT_SHIFT);
180}
181
182/**
183 * arch_write_unlock() - release a write lock.
184 */
185static inline void arch_write_unlock(arch_rwlock_t *rwlock)
186{
187 u32 val;
188 mb(); /* guarantee anything modified under the lock is visible */
189 val = __insn_tns((int *)&rwlock->lock);
190 if (unlikely(val != (1 << _WR_NEXT_SHIFT))) {
191 arch_write_unlock_slow(rwlock, val);
192 return;
193 }
194 rwlock->lock = 0;
195}
196
197#define arch_read_lock_flags(lock, flags) arch_read_lock(lock)
198#define arch_write_lock_flags(lock, flags) arch_write_lock(lock)
199
200#endif /* _ASM_TILE_SPINLOCK_32_H */
diff --git a/arch/tile/include/asm/spinlock_types.h b/arch/tile/include/asm/spinlock_types.h
new file mode 100644
index 000000000000..a71f59b49c50
--- /dev/null
+++ b/arch/tile/include/asm/spinlock_types.h
@@ -0,0 +1,60 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_SPINLOCK_TYPES_H
16#define _ASM_TILE_SPINLOCK_TYPES_H
17
18#ifndef __LINUX_SPINLOCK_TYPES_H
19# error "please don't include this file directly"
20#endif
21
22#ifdef __tilegx__
23
24/* Low 15 bits are "next"; high 15 bits are "current". */
25typedef struct arch_spinlock {
26 unsigned int lock;
27} arch_spinlock_t;
28
29#define __ARCH_SPIN_LOCK_UNLOCKED { 0 }
30
31/* High bit is "writer owns"; low 31 bits are a count of readers. */
32typedef struct arch_rwlock {
33 unsigned int lock;
34} arch_rwlock_t;
35
36#define __ARCH_RW_LOCK_UNLOCKED { 0 }
37
38#else
39
40typedef struct arch_spinlock {
41 /* Next ticket number to hand out. */
42 int next_ticket;
43 /* The ticket number that currently owns this lock. */
44 int current_ticket;
45} arch_spinlock_t;
46
47#define __ARCH_SPIN_LOCK_UNLOCKED { 0, 0 }
48
49/*
50 * Byte 0 for tns (only the low bit is used), byte 1 for ticket-lock "next",
51 * byte 2 for ticket-lock "current", byte 3 for reader count.
52 */
53typedef struct arch_rwlock {
54 unsigned int lock;
55} arch_rwlock_t;
56
57#define __ARCH_RW_LOCK_UNLOCKED { 0 }
58
59#endif
60#endif /* _ASM_TILE_SPINLOCK_TYPES_H */
diff --git a/arch/tile/include/asm/stack.h b/arch/tile/include/asm/stack.h
new file mode 100644
index 000000000000..864913bcfbc9
--- /dev/null
+++ b/arch/tile/include/asm/stack.h
@@ -0,0 +1,68 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_STACK_H
16#define _ASM_TILE_STACK_H
17
18#include <linux/types.h>
19#include <linux/sched.h>
20#include <asm/backtrace.h>
21#include <hv/hypervisor.h>
22
23/* Everything we need to keep track of a backtrace iteration */
24struct KBacktraceIterator {
25 BacktraceIterator it;
26 struct task_struct *task; /* task we are backtracing */
27 HV_PTE *pgtable; /* page table for user space access */
28 int end; /* iteration complete. */
29 int new_context; /* new context is starting */
30 int profile; /* profiling, so stop on async intrpt */
31 int verbose; /* printk extra info (don't want to
32 * do this for profiling) */
33 int is_current; /* backtracing current task */
34};
35
36/* Iteration methods for kernel backtraces */
37
38/*
39 * Initialize a KBacktraceIterator from a task_struct, and optionally from
40 * a set of registers. If the registers are omitted, the process is
41 * assumed to be descheduled, and registers are read from the process's
42 * thread_struct and stack. "verbose" means to printk some additional
43 * information about fault handlers as we pass them on the stack.
44 */
45extern void KBacktraceIterator_init(struct KBacktraceIterator *kbt,
46 struct task_struct *, struct pt_regs *);
47
48/* Initialize iterator based on current stack. */
49extern void KBacktraceIterator_init_current(struct KBacktraceIterator *kbt);
50
51/* No more frames? */
52extern int KBacktraceIterator_end(struct KBacktraceIterator *kbt);
53
54/* Advance to the next frame. */
55extern void KBacktraceIterator_next(struct KBacktraceIterator *kbt);
56
57/*
58 * Dump stack given complete register info. Use only from the
59 * architecture-specific code; show_stack()
60 * and dump_stack() (in entry.S) are architecture-independent entry points.
61 */
62extern void tile_show_stack(struct KBacktraceIterator *, int headers);
63
64/* Dump stack of current process, with registers to seed the backtrace. */
65extern void dump_stack_regs(struct pt_regs *);
66
67
68#endif /* _ASM_TILE_STACK_H */
diff --git a/arch/tile/include/asm/stat.h b/arch/tile/include/asm/stat.h
new file mode 100644
index 000000000000..3dc90fa92c70
--- /dev/null
+++ b/arch/tile/include/asm/stat.h
@@ -0,0 +1 @@
#include <asm-generic/stat.h>
diff --git a/arch/tile/include/asm/statfs.h b/arch/tile/include/asm/statfs.h
new file mode 100644
index 000000000000..0b91fe198c20
--- /dev/null
+++ b/arch/tile/include/asm/statfs.h
@@ -0,0 +1 @@
#include <asm-generic/statfs.h>
diff --git a/arch/tile/include/asm/string.h b/arch/tile/include/asm/string.h
new file mode 100644
index 000000000000..7535cf1a30e4
--- /dev/null
+++ b/arch/tile/include/asm/string.h
@@ -0,0 +1,32 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_STRING_H
16#define _ASM_TILE_STRING_H
17
18#define __HAVE_ARCH_MEMCHR
19#define __HAVE_ARCH_MEMSET
20#define __HAVE_ARCH_MEMCPY
21#define __HAVE_ARCH_MEMMOVE
22#define __HAVE_ARCH_STRCHR
23#define __HAVE_ARCH_STRLEN
24
25extern __kernel_size_t strlen(const char *);
26extern char *strchr(const char *s, int c);
27extern void *memchr(const void *s, int c, size_t n);
28extern void *memset(void *, int, __kernel_size_t);
29extern void *memcpy(void *, const void *, __kernel_size_t);
30extern void *memmove(void *, const void *, __kernel_size_t);
31
32#endif /* _ASM_TILE_STRING_H */
diff --git a/arch/tile/include/asm/swab.h b/arch/tile/include/asm/swab.h
new file mode 100644
index 000000000000..25c686a00f1d
--- /dev/null
+++ b/arch/tile/include/asm/swab.h
@@ -0,0 +1,29 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_SWAB_H
16#define _ASM_TILE_SWAB_H
17
18/* Tile gcc is always >= 4.3.0, so we use __builtin_bswap. */
19#define __arch_swab32(x) __builtin_bswap32(x)
20#define __arch_swab64(x) __builtin_bswap64(x)
21
22/* Use the variant that is natural for the wordsize. */
23#ifdef CONFIG_64BIT
24#define __arch_swab16(x) (__builtin_bswap64(x) >> 48)
25#else
26#define __arch_swab16(x) (__builtin_bswap32(x) >> 16)
27#endif
28
29#endif /* _ASM_TILE_SWAB_H */
diff --git a/arch/tile/include/asm/syscall.h b/arch/tile/include/asm/syscall.h
new file mode 100644
index 000000000000..d35e0dcb67b1
--- /dev/null
+++ b/arch/tile/include/asm/syscall.h
@@ -0,0 +1,79 @@
1/*
2 * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved.
3 * Copyright 2010 Tilera Corporation. All Rights Reserved.
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation, version 2.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
12 * NON INFRINGEMENT. See the GNU General Public License for
13 * more details.
14 *
15 * See asm-generic/syscall.h for descriptions of what we must do here.
16 */
17
18#ifndef _ASM_TILE_SYSCALL_H
19#define _ASM_TILE_SYSCALL_H
20
21#include <linux/sched.h>
22#include <linux/err.h>
23#include <arch/abi.h>
24
25/*
26 * Only the low 32 bits of orig_r0 are meaningful, so we return int.
27 * This importantly ignores the high bits on 64-bit, so comparisons
28 * sign-extend the low 32 bits.
29 */
30static inline int syscall_get_nr(struct task_struct *t, struct pt_regs *regs)
31{
32 return regs->regs[TREG_SYSCALL_NR];
33}
34
35static inline void syscall_rollback(struct task_struct *task,
36 struct pt_regs *regs)
37{
38 regs->regs[0] = regs->orig_r0;
39}
40
41static inline long syscall_get_error(struct task_struct *task,
42 struct pt_regs *regs)
43{
44 unsigned long error = regs->regs[0];
45 return IS_ERR_VALUE(error) ? error : 0;
46}
47
48static inline long syscall_get_return_value(struct task_struct *task,
49 struct pt_regs *regs)
50{
51 return regs->regs[0];
52}
53
54static inline void syscall_set_return_value(struct task_struct *task,
55 struct pt_regs *regs,
56 int error, long val)
57{
58 regs->regs[0] = (long) error ?: val;
59}
60
61static inline void syscall_get_arguments(struct task_struct *task,
62 struct pt_regs *regs,
63 unsigned int i, unsigned int n,
64 unsigned long *args)
65{
66 BUG_ON(i + n > 6);
67 memcpy(args, &regs[i], n * sizeof(args[0]));
68}
69
70static inline void syscall_set_arguments(struct task_struct *task,
71 struct pt_regs *regs,
72 unsigned int i, unsigned int n,
73 const unsigned long *args)
74{
75 BUG_ON(i + n > 6);
76 memcpy(&regs[i], args, n * sizeof(args[0]));
77}
78
79#endif /* _ASM_TILE_SYSCALL_H */
diff --git a/arch/tile/include/asm/syscalls.h b/arch/tile/include/asm/syscalls.h
new file mode 100644
index 000000000000..e1be54d1a7d8
--- /dev/null
+++ b/arch/tile/include/asm/syscalls.h
@@ -0,0 +1,60 @@
1/*
2 * syscalls.h - Linux syscall interfaces (arch-specific)
3 *
4 * Copyright (c) 2008 Jaswinder Singh Rajput
5 * Copyright 2010 Tilera Corporation. All Rights Reserved.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation, version 2.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
14 * NON INFRINGEMENT. See the GNU General Public License for
15 * more details.
16 */
17
18#ifndef _ASM_TILE_SYSCALLS_H
19#define _ASM_TILE_SYSCALLS_H
20
21#include <linux/compiler.h>
22#include <linux/linkage.h>
23#include <linux/signal.h>
24#include <linux/types.h>
25
26/* kernel/process.c */
27int sys_fork(struct pt_regs *);
28int sys_vfork(struct pt_regs *);
29int sys_clone(unsigned long clone_flags, unsigned long newsp,
30 int __user *parent_tidptr, int __user *child_tidptr,
31 struct pt_regs *);
32int sys_execve(char __user *path, char __user *__user *argv,
33 char __user *__user *envp, struct pt_regs *);
34
35/* kernel/signal.c */
36int sys_sigaltstack(const stack_t __user *, stack_t __user *,
37 struct pt_regs *);
38long sys_rt_sigreturn(struct pt_regs *);
39int sys_raise_fpe(int code, unsigned long addr, struct pt_regs*);
40
41/* kernel/sys.c */
42ssize_t sys32_readahead(int fd, u32 offset_lo, u32 offset_hi, u32 count);
43long sys32_fadvise64(int fd, u32 offset_lo, u32 offset_hi,
44 u32 len, int advice);
45int sys32_fadvise64_64(int fd, u32 offset_lo, u32 offset_hi,
46 u32 len_lo, u32 len_hi, int advice);
47long sys_flush_cache(void);
48long sys_mmap(unsigned long addr, unsigned long len,
49 unsigned long prot, unsigned long flags,
50 unsigned long fd, unsigned long offset);
51long sys_mmap2(unsigned long addr, unsigned long len,
52 unsigned long prot, unsigned long flags,
53 unsigned long fd, unsigned long offset);
54
55#ifndef __tilegx__
56/* mm/fault.c */
57int sys_cmpxchg_badaddr(unsigned long address, struct pt_regs *);
58#endif
59
60#endif /* _ASM_TILE_SYSCALLS_H */
diff --git a/arch/tile/include/asm/system.h b/arch/tile/include/asm/system.h
new file mode 100644
index 000000000000..d6ca7f816c87
--- /dev/null
+++ b/arch/tile/include/asm/system.h
@@ -0,0 +1,220 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_SYSTEM_H
16#define _ASM_TILE_SYSTEM_H
17
18#ifndef __ASSEMBLY__
19
20#include <linux/types.h>
21#include <linux/irqflags.h>
22
23/* NOTE: we can't include <linux/ptrace.h> due to #include dependencies. */
24#include <asm/ptrace.h>
25
26#include <arch/chip.h>
27#include <arch/sim_def.h>
28#include <arch/spr_def.h>
29
30/*
31 * read_barrier_depends - Flush all pending reads that subsequents reads
32 * depend on.
33 *
34 * No data-dependent reads from memory-like regions are ever reordered
35 * over this barrier. All reads preceding this primitive are guaranteed
36 * to access memory (but not necessarily other CPUs' caches) before any
37 * reads following this primitive that depend on the data return by
38 * any of the preceding reads. This primitive is much lighter weight than
39 * rmb() on most CPUs, and is never heavier weight than is
40 * rmb().
41 *
42 * These ordering constraints are respected by both the local CPU
43 * and the compiler.
44 *
45 * Ordering is not guaranteed by anything other than these primitives,
46 * not even by data dependencies. See the documentation for
47 * memory_barrier() for examples and URLs to more information.
48 *
49 * For example, the following code would force ordering (the initial
50 * value of "a" is zero, "b" is one, and "p" is "&a"):
51 *
52 * <programlisting>
53 * CPU 0 CPU 1
54 *
55 * b = 2;
56 * memory_barrier();
57 * p = &b; q = p;
58 * read_barrier_depends();
59 * d = *q;
60 * </programlisting>
61 *
62 * because the read of "*q" depends on the read of "p" and these
63 * two reads are separated by a read_barrier_depends(). However,
64 * the following code, with the same initial values for "a" and "b":
65 *
66 * <programlisting>
67 * CPU 0 CPU 1
68 *
69 * a = 2;
70 * memory_barrier();
71 * b = 3; y = b;
72 * read_barrier_depends();
73 * x = a;
74 * </programlisting>
75 *
76 * does not enforce ordering, since there is no data dependency between
77 * the read of "a" and the read of "b". Therefore, on some CPUs, such
78 * as Alpha, "y" could be set to 3 and "x" to 0. Use rmb()
79 * in cases like this where there are no data dependencies.
80 */
81
82#define read_barrier_depends() do { } while (0)
83
84#define __sync() __insn_mf()
85
86#if CHIP_HAS_SPLIT_CYCLE()
87#define get_cycles_low() __insn_mfspr(SPR_CYCLE_LOW)
88#else
89#define get_cycles_low() __insn_mfspr(SPR_CYCLE) /* just get all 64 bits */
90#endif
91
92/* Fence to guarantee visibility of stores to incoherent memory. */
93static inline void
94mb_incoherent(void)
95{
96 __insn_mf();
97
98#if !CHIP_HAS_MF_WAITS_FOR_VICTIMS()
99 {
100 int __mb_incoherent(void);
101#if CHIP_HAS_TILE_WRITE_PENDING()
102 const unsigned long WRITE_TIMEOUT_CYCLES = 400;
103 unsigned long start = get_cycles_low();
104 do {
105 if (__insn_mfspr(SPR_TILE_WRITE_PENDING) == 0)
106 return;
107 } while ((get_cycles_low() - start) < WRITE_TIMEOUT_CYCLES);
108#endif /* CHIP_HAS_TILE_WRITE_PENDING() */
109 (void) __mb_incoherent();
110 }
111#endif /* CHIP_HAS_MF_WAITS_FOR_VICTIMS() */
112}
113
114#define fast_wmb() __sync()
115#define fast_rmb() __sync()
116#define fast_mb() __sync()
117#define fast_iob() mb_incoherent()
118
119#define wmb() fast_wmb()
120#define rmb() fast_rmb()
121#define mb() fast_mb()
122#define iob() fast_iob()
123
124#ifdef CONFIG_SMP
125#define smp_mb() mb()
126#define smp_rmb() rmb()
127#define smp_wmb() wmb()
128#define smp_read_barrier_depends() read_barrier_depends()
129#else
130#define smp_mb() barrier()
131#define smp_rmb() barrier()
132#define smp_wmb() barrier()
133#define smp_read_barrier_depends() do { } while (0)
134#endif
135
136#define set_mb(var, value) \
137 do { var = value; mb(); } while (0)
138
139#include <linux/irqflags.h>
140
141/*
142 * Pause the DMA engine and static network before task switching.
143 */
144#define prepare_arch_switch(next) _prepare_arch_switch(next)
145void _prepare_arch_switch(struct task_struct *next);
146
147
148/*
149 * switch_to(n) should switch tasks to task nr n, first
150 * checking that n isn't the current task, in which case it does nothing.
151 * The number of callee-saved registers saved on the kernel stack
152 * is defined here for use in copy_thread() and must agree with __switch_to().
153 */
154#endif /* !__ASSEMBLY__ */
155#define CALLEE_SAVED_FIRST_REG 30
156#define CALLEE_SAVED_REGS_COUNT 24 /* r30 to r52, plus an empty to align */
157#ifndef __ASSEMBLY__
158struct task_struct;
159#define switch_to(prev, next, last) ((last) = _switch_to((prev), (next)))
160extern struct task_struct *_switch_to(struct task_struct *prev,
161 struct task_struct *next);
162
163/*
164 * On SMP systems, when the scheduler does migration-cost autodetection,
165 * it needs a way to flush as much of the CPU's caches as possible:
166 *
167 * TODO: fill this in!
168 */
169static inline void sched_cacheflush(void)
170{
171}
172
173#define arch_align_stack(x) (x)
174
175/*
176 * Is the kernel doing fixups of unaligned accesses? If <0, no kernel
177 * intervention occurs and SIGBUS is delivered with no data address
178 * info. If 0, the kernel single-steps the instruction to discover
179 * the data address to provide with the SIGBUS. If 1, the kernel does
180 * a fixup.
181 */
182extern int unaligned_fixup;
183
184/* Is the kernel printing on each unaligned fixup? */
185extern int unaligned_printk;
186
187/* Number of unaligned fixups performed */
188extern unsigned int unaligned_fixup_count;
189
190/* User-level DMA management functions */
191void grant_dma_mpls(void);
192void restrict_dma_mpls(void);
193
194
195/* Invoke the simulator "syscall" mechanism (see arch/tile/kernel/entry.S). */
196extern int _sim_syscall(int syscall_num, ...);
197#define sim_syscall(syscall_num, ...) \
198 _sim_syscall(SIM_CONTROL_SYSCALL + \
199 ((syscall_num) << _SIM_CONTROL_OPERATOR_BITS), \
200 ## __VA_ARGS__)
201
202/*
203 * Kernel threads can check to see if they need to migrate their
204 * stack whenever they return from a context switch; for user
205 * threads, we defer until they are returning to user-space.
206 */
207#define finish_arch_switch(prev) do { \
208 if (unlikely((prev)->state == TASK_DEAD)) \
209 __insn_mtspr(SPR_SIM_CONTROL, SIM_CONTROL_OS_EXIT | \
210 ((prev)->pid << _SIM_CONTROL_OPERATOR_BITS)); \
211 __insn_mtspr(SPR_SIM_CONTROL, SIM_CONTROL_OS_SWITCH | \
212 (current->pid << _SIM_CONTROL_OPERATOR_BITS)); \
213 if (current->mm == NULL && !kstack_hash && \
214 current_thread_info()->homecache_cpu != smp_processor_id()) \
215 homecache_migrate_kthread(); \
216} while (0)
217
218#endif /* !__ASSEMBLY__ */
219
220#endif /* _ASM_TILE_SYSTEM_H */
diff --git a/arch/tile/include/asm/termbits.h b/arch/tile/include/asm/termbits.h
new file mode 100644
index 000000000000..3935b106de79
--- /dev/null
+++ b/arch/tile/include/asm/termbits.h
@@ -0,0 +1 @@
#include <asm-generic/termbits.h>
diff --git a/arch/tile/include/asm/termios.h b/arch/tile/include/asm/termios.h
new file mode 100644
index 000000000000..280d78a9d966
--- /dev/null
+++ b/arch/tile/include/asm/termios.h
@@ -0,0 +1 @@
#include <asm-generic/termios.h>
diff --git a/arch/tile/include/asm/thread_info.h b/arch/tile/include/asm/thread_info.h
new file mode 100644
index 000000000000..9024bf3530aa
--- /dev/null
+++ b/arch/tile/include/asm/thread_info.h
@@ -0,0 +1,165 @@
1/*
2 * Copyright (C) 2002 David Howells (dhowells@redhat.com)
3 * Copyright 2010 Tilera Corporation. All Rights Reserved.
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation, version 2.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
12 * NON INFRINGEMENT. See the GNU General Public License for
13 * more details.
14 */
15
16#ifndef _ASM_TILE_THREAD_INFO_H
17#define _ASM_TILE_THREAD_INFO_H
18
19#include <asm/processor.h>
20#include <asm/page.h>
21#ifndef __ASSEMBLY__
22
23/*
24 * Low level task data that assembly code needs immediate access to.
25 * The structure is placed at the bottom of the supervisor stack.
26 */
27struct thread_info {
28 struct task_struct *task; /* main task structure */
29 struct exec_domain *exec_domain; /* execution domain */
30 unsigned long flags; /* low level flags */
31 unsigned long status; /* thread-synchronous flags */
32 __u32 homecache_cpu; /* CPU we are homecached on */
33 __u32 cpu; /* current CPU */
34 int preempt_count; /* 0 => preemptable,
35 <0 => BUG */
36
37 mm_segment_t addr_limit; /* thread address space
38 (KERNEL_DS or USER_DS) */
39 struct restart_block restart_block;
40 struct single_step_state *step_state; /* single step state
41 (if non-zero) */
42};
43
44/*
45 * macros/functions for gaining access to the thread information structure.
46 */
47#define INIT_THREAD_INFO(tsk) \
48{ \
49 .task = &tsk, \
50 .exec_domain = &default_exec_domain, \
51 .flags = 0, \
52 .cpu = 0, \
53 .preempt_count = INIT_PREEMPT_COUNT, \
54 .addr_limit = KERNEL_DS, \
55 .restart_block = { \
56 .fn = do_no_restart_syscall, \
57 }, \
58 .step_state = 0, \
59}
60
61#define init_thread_info (init_thread_union.thread_info)
62#define init_stack (init_thread_union.stack)
63
64#endif /* !__ASSEMBLY__ */
65
66#if PAGE_SIZE < 8192
67#define THREAD_SIZE_ORDER (13 - PAGE_SHIFT)
68#else
69#define THREAD_SIZE_ORDER (0)
70#endif
71
72#define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER)
73#define LOG2_THREAD_SIZE (PAGE_SHIFT + THREAD_SIZE_ORDER)
74
75#define STACK_WARN (THREAD_SIZE/8)
76
77#ifndef __ASSEMBLY__
78
79/* How to get the thread information struct from C. */
80register unsigned long stack_pointer __asm__("sp");
81
82#define current_thread_info() \
83 ((struct thread_info *)(stack_pointer & -THREAD_SIZE))
84
85#define __HAVE_ARCH_THREAD_INFO_ALLOCATOR
86extern struct thread_info *alloc_thread_info(struct task_struct *task);
87extern void free_thread_info(struct thread_info *info);
88
89/* Switch boot idle thread to a freshly-allocated stack and free old stack. */
90extern void cpu_idle_on_new_stack(struct thread_info *old_ti,
91 unsigned long new_sp,
92 unsigned long new_ss10);
93
94#else /* __ASSEMBLY__ */
95
96/* how to get the thread information struct from ASM */
97#ifdef __tilegx__
98#define GET_THREAD_INFO(reg) move reg, sp; mm reg, zero, LOG2_THREAD_SIZE, 63
99#else
100#define GET_THREAD_INFO(reg) mm reg, sp, zero, LOG2_THREAD_SIZE, 31
101#endif
102
103#endif /* !__ASSEMBLY__ */
104
105#define PREEMPT_ACTIVE 0x10000000
106
107/*
108 * Thread information flags that various assembly files may need to access.
109 * Keep flags accessed frequently in low bits, particular since it makes
110 * it easier to build constants in assembly.
111 */
112#define TIF_SIGPENDING 0 /* signal pending */
113#define TIF_NEED_RESCHED 1 /* rescheduling necessary */
114#define TIF_SINGLESTEP 2 /* restore singlestep on return to
115 user mode */
116#define TIF_ASYNC_TLB 3 /* got an async TLB fault in kernel */
117#define TIF_SYSCALL_TRACE 4 /* syscall trace active */
118#define TIF_SYSCALL_AUDIT 5 /* syscall auditing active */
119#define TIF_SECCOMP 6 /* secure computing */
120#define TIF_MEMDIE 7 /* OOM killer at work */
121
122#define _TIF_SIGPENDING (1<<TIF_SIGPENDING)
123#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
124#define _TIF_SINGLESTEP (1<<TIF_SINGLESTEP)
125#define _TIF_ASYNC_TLB (1<<TIF_ASYNC_TLB)
126#define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
127#define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT)
128#define _TIF_SECCOMP (1<<TIF_SECCOMP)
129#define _TIF_MEMDIE (1<<TIF_MEMDIE)
130
131/* Work to do on any return to user space. */
132#define _TIF_ALLWORK_MASK \
133 (_TIF_SIGPENDING|_TIF_NEED_RESCHED|_TIF_SINGLESTEP|_TIF_ASYNC_TLB)
134
135/*
136 * Thread-synchronous status.
137 *
138 * This is different from the flags in that nobody else
139 * ever touches our thread-synchronous status, so we don't
140 * have to worry about atomic accesses.
141 */
142#ifdef __tilegx__
143#define TS_COMPAT 0x0001 /* 32-bit compatibility mode */
144#endif
145#define TS_POLLING 0x0004 /* in idle loop but not sleeping */
146#define TS_RESTORE_SIGMASK 0x0008 /* restore signal mask in do_signal */
147#define TS_EXEC_HASH_SET 0x0010 /* apply TS_EXEC_HASH_xxx flags */
148#define TS_EXEC_HASH_RO 0x0020 /* during exec, hash r/o segments */
149#define TS_EXEC_HASH_RW 0x0040 /* during exec, hash r/w segments */
150#define TS_EXEC_HASH_STACK 0x0080 /* during exec, hash the stack */
151#define TS_EXEC_HASH_FLAGS 0x00f0 /* mask for TS_EXEC_HASH_xxx flags */
152
153#define tsk_is_polling(t) (task_thread_info(t)->status & TS_POLLING)
154
155#ifndef __ASSEMBLY__
156#define HAVE_SET_RESTORE_SIGMASK 1
157static inline void set_restore_sigmask(void)
158{
159 struct thread_info *ti = current_thread_info();
160 ti->status |= TS_RESTORE_SIGMASK;
161 set_bit(TIF_SIGPENDING, &ti->flags);
162}
163#endif /* !__ASSEMBLY__ */
164
165#endif /* _ASM_TILE_THREAD_INFO_H */
diff --git a/arch/tile/include/asm/timex.h b/arch/tile/include/asm/timex.h
new file mode 100644
index 000000000000..3baf5fc4c0a1
--- /dev/null
+++ b/arch/tile/include/asm/timex.h
@@ -0,0 +1,47 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_TIMEX_H
16#define _ASM_TILE_TIMEX_H
17
18/*
19 * This rate should be a multiple of the possible HZ values (100, 250, 1000)
20 * and a fraction of the possible hardware timer frequencies. Our timer
21 * frequency is highly tunable but also quite precise, so for the primary use
22 * of this value (setting ACT_HZ from HZ) we just pick a value that causes
23 * ACT_HZ to be set to HZ. We make the value somewhat large just to be
24 * more robust in case someone tries out a new value of HZ.
25 */
26#define CLOCK_TICK_RATE 1000000
27
28typedef unsigned long long cycles_t;
29
30#if CHIP_HAS_SPLIT_CYCLE()
31cycles_t get_cycles(void);
32#else
33static inline cycles_t get_cycles(void)
34{
35 return __insn_mfspr(SPR_CYCLE);
36}
37#endif
38
39cycles_t get_clock_rate(void);
40
41/* Called at cpu initialization to set some low-level constants. */
42void setup_clock(void);
43
44/* Called at cpu initialization to start the tile-timer clock device. */
45void setup_tile_timer(void);
46
47#endif /* _ASM_TILE_TIMEX_H */
diff --git a/arch/tile/include/asm/tlb.h b/arch/tile/include/asm/tlb.h
new file mode 100644
index 000000000000..4a891a1a8df3
--- /dev/null
+++ b/arch/tile/include/asm/tlb.h
@@ -0,0 +1,25 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_TLB_H
16#define _ASM_TILE_TLB_H
17
18#define tlb_start_vma(tlb, vma) do { } while (0)
19#define tlb_end_vma(tlb, vma) do { } while (0)
20#define __tlb_remove_tlb_entry(tlb, ptep, address) do { } while (0)
21#define tlb_flush(tlb) flush_tlb_mm((tlb)->mm)
22
23#include <asm-generic/tlb.h>
24
25#endif /* _ASM_TILE_TLB_H */
diff --git a/arch/tile/include/asm/tlbflush.h b/arch/tile/include/asm/tlbflush.h
new file mode 100644
index 000000000000..96199d214fb8
--- /dev/null
+++ b/arch/tile/include/asm/tlbflush.h
@@ -0,0 +1,128 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_TLBFLUSH_H
16#define _ASM_TILE_TLBFLUSH_H
17
18#include <linux/mm.h>
19#include <linux/sched.h>
20#include <linux/smp.h>
21#include <asm/cacheflush.h>
22#include <asm/page.h>
23#include <hv/hypervisor.h>
24
25/*
26 * Rather than associating each mm with its own ASID, we just use
27 * ASIDs to allow us to lazily flush the TLB when we switch mms.
28 * This way we only have to do an actual TLB flush on mm switch
29 * every time we wrap ASIDs, not every single time we switch.
30 *
31 * FIXME: We might improve performance by keeping ASIDs around
32 * properly, though since the hypervisor direct-maps VAs to TSB
33 * entries, we're likely to have lost at least the executable page
34 * mappings by the time we switch back to the original mm.
35 */
36DECLARE_PER_CPU(int, current_asid);
37
38/* The hypervisor tells us what ASIDs are available to us. */
39extern int min_asid, max_asid;
40
41static inline unsigned long hv_page_size(const struct vm_area_struct *vma)
42{
43 return (vma->vm_flags & VM_HUGETLB) ? HPAGE_SIZE : PAGE_SIZE;
44}
45
46/* Pass as vma pointer for non-executable mapping, if no vma available. */
47#define FLUSH_NONEXEC ((const struct vm_area_struct *)-1UL)
48
49/* Flush a single user page on this cpu. */
50static inline void local_flush_tlb_page(const struct vm_area_struct *vma,
51 unsigned long addr,
52 unsigned long page_size)
53{
54 int rc = hv_flush_page(addr, page_size);
55 if (rc < 0)
56 panic("hv_flush_page(%#lx,%#lx) failed: %d",
57 addr, page_size, rc);
58 if (!vma || (vma != FLUSH_NONEXEC && (vma->vm_flags & VM_EXEC)))
59 __flush_icache();
60}
61
62/* Flush range of user pages on this cpu. */
63static inline void local_flush_tlb_pages(const struct vm_area_struct *vma,
64 unsigned long addr,
65 unsigned long page_size,
66 unsigned long len)
67{
68 int rc = hv_flush_pages(addr, page_size, len);
69 if (rc < 0)
70 panic("hv_flush_pages(%#lx,%#lx,%#lx) failed: %d",
71 addr, page_size, len, rc);
72 if (!vma || (vma != FLUSH_NONEXEC && (vma->vm_flags & VM_EXEC)))
73 __flush_icache();
74}
75
76/* Flush all user pages on this cpu. */
77static inline void local_flush_tlb(void)
78{
79 int rc = hv_flush_all(1); /* preserve global mappings */
80 if (rc < 0)
81 panic("hv_flush_all(1) failed: %d", rc);
82 __flush_icache();
83}
84
85/*
86 * Global pages have to be flushed a bit differently. Not a real
87 * performance problem because this does not happen often.
88 */
89static inline void local_flush_tlb_all(void)
90{
91 int i;
92 for (i = 0; ; ++i) {
93 HV_VirtAddrRange r = hv_inquire_virtual(i);
94 if (r.size == 0)
95 break;
96 local_flush_tlb_pages(NULL, r.start, PAGE_SIZE, r.size);
97 local_flush_tlb_pages(NULL, r.start, HPAGE_SIZE, r.size);
98 }
99}
100
101/*
102 * TLB flushing:
103 *
104 * - flush_tlb() flushes the current mm struct TLBs
105 * - flush_tlb_all() flushes all processes TLBs
106 * - flush_tlb_mm(mm) flushes the specified mm context TLB's
107 * - flush_tlb_page(vma, vmaddr) flushes one page
108 * - flush_tlb_range(vma, start, end) flushes a range of pages
109 * - flush_tlb_kernel_range(start, end) flushes a range of kernel pages
110 * - flush_tlb_others(cpumask, mm, va) flushes TLBs on other cpus
111 *
112 * Here (as in vm_area_struct), "end" means the first byte after
113 * our end address.
114 */
115
116extern void flush_tlb_all(void);
117extern void flush_tlb_kernel_range(unsigned long start, unsigned long end);
118extern void flush_tlb_current_task(void);
119extern void flush_tlb_mm(struct mm_struct *);
120extern void flush_tlb_page(const struct vm_area_struct *, unsigned long);
121extern void flush_tlb_page_mm(const struct vm_area_struct *,
122 struct mm_struct *, unsigned long);
123extern void flush_tlb_range(const struct vm_area_struct *,
124 unsigned long start, unsigned long end);
125
126#define flush_tlb() flush_tlb_current_task()
127
128#endif /* _ASM_TILE_TLBFLUSH_H */
diff --git a/arch/tile/include/asm/topology.h b/arch/tile/include/asm/topology.h
new file mode 100644
index 000000000000..343172d422a9
--- /dev/null
+++ b/arch/tile/include/asm/topology.h
@@ -0,0 +1,85 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_TOPOLOGY_H
16#define _ASM_TILE_TOPOLOGY_H
17
18#ifdef CONFIG_NUMA
19
20#include <linux/cpumask.h>
21
22/* Mappings between logical cpu number and node number. */
23extern struct cpumask node_2_cpu_mask[];
24extern char cpu_2_node[];
25
26/* Returns the number of the node containing CPU 'cpu'. */
27static inline int cpu_to_node(int cpu)
28{
29 return cpu_2_node[cpu];
30}
31
32/*
33 * Returns the number of the node containing Node 'node'.
34 * This architecture is flat, so it is a pretty simple function!
35 */
36#define parent_node(node) (node)
37
38/* Returns a bitmask of CPUs on Node 'node'. */
39static inline const struct cpumask *cpumask_of_node(int node)
40{
41 return &node_2_cpu_mask[node];
42}
43
44/* For now, use numa node -1 for global allocation. */
45#define pcibus_to_node(bus) ((void)(bus), -1)
46
47/* sched_domains SD_NODE_INIT for TILE architecture */
48#define SD_NODE_INIT (struct sched_domain) { \
49 .min_interval = 8, \
50 .max_interval = 32, \
51 .busy_factor = 32, \
52 .imbalance_pct = 125, \
53 .cache_nice_tries = 1, \
54 .busy_idx = 3, \
55 .idle_idx = 1, \
56 .newidle_idx = 2, \
57 .wake_idx = 1, \
58 .flags = SD_LOAD_BALANCE \
59 | SD_BALANCE_NEWIDLE \
60 | SD_BALANCE_EXEC \
61 | SD_BALANCE_FORK \
62 | SD_WAKE_AFFINE \
63 | SD_SERIALIZE, \
64 .last_balance = jiffies, \
65 .balance_interval = 1, \
66}
67
68/* By definition, we create nodes based on online memory. */
69#define node_has_online_mem(nid) 1
70
71#endif /* CONFIG_NUMA */
72
73#include <asm-generic/topology.h>
74
75#ifdef CONFIG_SMP
76#define topology_physical_package_id(cpu) ((void)(cpu), 0)
77#define topology_core_id(cpu) (cpu)
78#define topology_core_cpumask(cpu) ((void)(cpu), cpu_online_mask)
79#define topology_thread_cpumask(cpu) cpumask_of(cpu)
80
81/* indicates that pointers to the topology struct cpumask maps are valid */
82#define arch_provides_topology_pointers yes
83#endif
84
85#endif /* _ASM_TILE_TOPOLOGY_H */
diff --git a/arch/tile/include/asm/traps.h b/arch/tile/include/asm/traps.h
new file mode 100644
index 000000000000..eab33d4a917d
--- /dev/null
+++ b/arch/tile/include/asm/traps.h
@@ -0,0 +1,36 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_TRAPS_H
16#define _ASM_TILE_TRAPS_H
17
18/* mm/fault.c */
19void do_page_fault(struct pt_regs *, int fault_num,
20 unsigned long address, unsigned long write);
21
22/* kernel/traps.c */
23void do_trap(struct pt_regs *, int fault_num, unsigned long reason);
24
25/* kernel/time.c */
26void do_timer_interrupt(struct pt_regs *, int fault_num);
27
28/* kernel/messaging.c */
29void hv_message_intr(struct pt_regs *, int intnum);
30
31/* kernel/irq.c */
32void tile_dev_intr(struct pt_regs *, int intnum);
33
34
35
36#endif /* _ASM_TILE_SYSCALLS_H */
diff --git a/arch/tile/include/asm/types.h b/arch/tile/include/asm/types.h
new file mode 100644
index 000000000000..b9e79bc580dd
--- /dev/null
+++ b/arch/tile/include/asm/types.h
@@ -0,0 +1 @@
#include <asm-generic/types.h>
diff --git a/arch/tile/include/asm/uaccess.h b/arch/tile/include/asm/uaccess.h
new file mode 100644
index 000000000000..f3058afd5a88
--- /dev/null
+++ b/arch/tile/include/asm/uaccess.h
@@ -0,0 +1,578 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_UACCESS_H
16#define _ASM_TILE_UACCESS_H
17
18/*
19 * User space memory access functions
20 */
21#include <linux/sched.h>
22#include <linux/mm.h>
23#include <asm-generic/uaccess-unaligned.h>
24#include <asm/processor.h>
25#include <asm/page.h>
26
27#define VERIFY_READ 0
28#define VERIFY_WRITE 1
29
30/*
31 * The fs value determines whether argument validity checking should be
32 * performed or not. If get_fs() == USER_DS, checking is performed, with
33 * get_fs() == KERNEL_DS, checking is bypassed.
34 *
35 * For historical reasons, these macros are grossly misnamed.
36 */
37#define MAKE_MM_SEG(a) ((mm_segment_t) { (a) })
38
39#define KERNEL_DS MAKE_MM_SEG(-1UL)
40#define USER_DS MAKE_MM_SEG(PAGE_OFFSET)
41
42#define get_ds() (KERNEL_DS)
43#define get_fs() (current_thread_info()->addr_limit)
44#define set_fs(x) (current_thread_info()->addr_limit = (x))
45
46#define segment_eq(a, b) ((a).seg == (b).seg)
47
48#ifndef __tilegx__
49/*
50 * We could allow mapping all 16 MB at 0xfc000000, but we set up a
51 * special hack in arch_setup_additional_pages() to auto-create a mapping
52 * for the first 16 KB, and it would seem strange to have different
53 * user-accessible semantics for memory at 0xfc000000 and above 0xfc004000.
54 */
55static inline int is_arch_mappable_range(unsigned long addr,
56 unsigned long size)
57{
58 return (addr >= MEM_USER_INTRPT &&
59 addr < (MEM_USER_INTRPT + INTRPT_SIZE) &&
60 size <= (MEM_USER_INTRPT + INTRPT_SIZE) - addr);
61}
62#define is_arch_mappable_range is_arch_mappable_range
63#else
64#define is_arch_mappable_range(addr, size) 0
65#endif
66
67/*
68 * Test whether a block of memory is a valid user space address.
69 * Returns 0 if the range is valid, nonzero otherwise.
70 */
71int __range_ok(unsigned long addr, unsigned long size);
72
73/**
74 * access_ok: - Checks if a user space pointer is valid
75 * @type: Type of access: %VERIFY_READ or %VERIFY_WRITE. Note that
76 * %VERIFY_WRITE is a superset of %VERIFY_READ - if it is safe
77 * to write to a block, it is always safe to read from it.
78 * @addr: User space pointer to start of block to check
79 * @size: Size of block to check
80 *
81 * Context: User context only. This function may sleep.
82 *
83 * Checks if a pointer to a block of memory in user space is valid.
84 *
85 * Returns true (nonzero) if the memory block may be valid, false (zero)
86 * if it is definitely invalid.
87 *
88 * Note that, depending on architecture, this function probably just
89 * checks that the pointer is in the user space range - after calling
90 * this function, memory access functions may still return -EFAULT.
91 */
92#define access_ok(type, addr, size) \
93 (likely(__range_ok((unsigned long)addr, size) == 0))
94
95/*
96 * The exception table consists of pairs of addresses: the first is the
97 * address of an instruction that is allowed to fault, and the second is
98 * the address at which the program should continue. No registers are
99 * modified, so it is entirely up to the continuation code to figure out
100 * what to do.
101 *
102 * All the routines below use bits of fixup code that are out of line
103 * with the main instruction path. This means when everything is well,
104 * we don't even have to jump over them. Further, they do not intrude
105 * on our cache or tlb entries.
106 */
107
108struct exception_table_entry {
109 unsigned long insn, fixup;
110};
111
112extern int fixup_exception(struct pt_regs *regs);
113
114/*
115 * We return the __get_user_N function results in a structure,
116 * thus in r0 and r1. If "err" is zero, "val" is the result
117 * of the read; otherwise, "err" is -EFAULT.
118 *
119 * We rarely need 8-byte values on a 32-bit architecture, but
120 * we size the structure to accommodate. In practice, for the
121 * the smaller reads, we can zero the high word for free, and
122 * the caller will ignore it by virtue of casting anyway.
123 */
124struct __get_user {
125 unsigned long long val;
126 int err;
127};
128
129/*
130 * FIXME: we should express these as inline extended assembler, since
131 * they're fundamentally just a variable dereference and some
132 * supporting exception_table gunk. Note that (a la i386) we can
133 * extend the copy_to_user and copy_from_user routines to call into
134 * such extended assembler routines, though we will have to use a
135 * different return code in that case (1, 2, or 4, rather than -EFAULT).
136 */
137extern struct __get_user __get_user_1(const void *);
138extern struct __get_user __get_user_2(const void *);
139extern struct __get_user __get_user_4(const void *);
140extern struct __get_user __get_user_8(const void *);
141extern int __put_user_1(long, void *);
142extern int __put_user_2(long, void *);
143extern int __put_user_4(long, void *);
144extern int __put_user_8(long long, void *);
145
146/* Unimplemented routines to cause linker failures */
147extern struct __get_user __get_user_bad(void);
148extern int __put_user_bad(void);
149
150/*
151 * Careful: we have to cast the result to the type of the pointer
152 * for sign reasons.
153 */
154/**
155 * __get_user: - Get a simple variable from user space, with less checking.
156 * @x: Variable to store result.
157 * @ptr: Source address, in user space.
158 *
159 * Context: User context only. This function may sleep.
160 *
161 * This macro copies a single simple variable from user space to kernel
162 * space. It supports simple types like char and int, but not larger
163 * data types like structures or arrays.
164 *
165 * @ptr must have pointer-to-simple-variable type, and the result of
166 * dereferencing @ptr must be assignable to @x without a cast.
167 *
168 * Returns zero on success, or -EFAULT on error.
169 * On error, the variable @x is set to zero.
170 *
171 * Caller must check the pointer with access_ok() before calling this
172 * function.
173 */
174#define __get_user(x, ptr) \
175({ struct __get_user __ret; \
176 __typeof__(*(ptr)) const __user *__gu_addr = (ptr); \
177 __chk_user_ptr(__gu_addr); \
178 switch (sizeof(*(__gu_addr))) { \
179 case 1: \
180 __ret = __get_user_1(__gu_addr); \
181 break; \
182 case 2: \
183 __ret = __get_user_2(__gu_addr); \
184 break; \
185 case 4: \
186 __ret = __get_user_4(__gu_addr); \
187 break; \
188 case 8: \
189 __ret = __get_user_8(__gu_addr); \
190 break; \
191 default: \
192 __ret = __get_user_bad(); \
193 break; \
194 } \
195 (x) = (__typeof__(*__gu_addr)) (__typeof__(*__gu_addr - *__gu_addr)) \
196 __ret.val; \
197 __ret.err; \
198})
199
200/**
201 * __put_user: - Write a simple value into user space, with less checking.
202 * @x: Value to copy to user space.
203 * @ptr: Destination address, in user space.
204 *
205 * Context: User context only. This function may sleep.
206 *
207 * This macro copies a single simple value from kernel space to user
208 * space. It supports simple types like char and int, but not larger
209 * data types like structures or arrays.
210 *
211 * @ptr must have pointer-to-simple-variable type, and @x must be assignable
212 * to the result of dereferencing @ptr.
213 *
214 * Caller must check the pointer with access_ok() before calling this
215 * function.
216 *
217 * Returns zero on success, or -EFAULT on error.
218 *
219 * Implementation note: The "case 8" logic of casting to the type of
220 * the result of subtracting the value from itself is basically a way
221 * of keeping all integer types the same, but casting any pointers to
222 * ptrdiff_t, i.e. also an integer type. This way there are no
223 * questionable casts seen by the compiler on an ILP32 platform.
224 */
225#define __put_user(x, ptr) \
226({ \
227 int __pu_err = 0; \
228 __typeof__(*(ptr)) __user *__pu_addr = (ptr); \
229 typeof(*__pu_addr) __pu_val = (x); \
230 __chk_user_ptr(__pu_addr); \
231 switch (sizeof(__pu_val)) { \
232 case 1: \
233 __pu_err = __put_user_1((long)__pu_val, __pu_addr); \
234 break; \
235 case 2: \
236 __pu_err = __put_user_2((long)__pu_val, __pu_addr); \
237 break; \
238 case 4: \
239 __pu_err = __put_user_4((long)__pu_val, __pu_addr); \
240 break; \
241 case 8: \
242 __pu_err = \
243 __put_user_8((__typeof__(__pu_val - __pu_val))__pu_val,\
244 __pu_addr); \
245 break; \
246 default: \
247 __pu_err = __put_user_bad(); \
248 break; \
249 } \
250 __pu_err; \
251})
252
253/*
254 * The versions of get_user and put_user without initial underscores
255 * check the address of their arguments to make sure they are not
256 * in kernel space.
257 */
258#define put_user(x, ptr) \
259({ \
260 __typeof__(*(ptr)) __user *__Pu_addr = (ptr); \
261 access_ok(VERIFY_WRITE, (__Pu_addr), sizeof(*(__Pu_addr))) ? \
262 __put_user((x), (__Pu_addr)) : \
263 -EFAULT; \
264})
265
266#define get_user(x, ptr) \
267({ \
268 __typeof__(*(ptr)) const __user *__Gu_addr = (ptr); \
269 access_ok(VERIFY_READ, (__Gu_addr), sizeof(*(__Gu_addr))) ? \
270 __get_user((x), (__Gu_addr)) : \
271 ((x) = 0, -EFAULT); \
272})
273
274/**
275 * __copy_to_user() - copy data into user space, with less checking.
276 * @to: Destination address, in user space.
277 * @from: Source address, in kernel space.
278 * @n: Number of bytes to copy.
279 *
280 * Context: User context only. This function may sleep.
281 *
282 * Copy data from kernel space to user space. Caller must check
283 * the specified block with access_ok() before calling this function.
284 *
285 * Returns number of bytes that could not be copied.
286 * On success, this will be zero.
287 *
288 * An alternate version - __copy_to_user_inatomic() - is designed
289 * to be called from atomic context, typically bracketed by calls
290 * to pagefault_disable() and pagefault_enable().
291 */
292extern unsigned long __must_check __copy_to_user_inatomic(
293 void __user *to, const void *from, unsigned long n);
294
295static inline unsigned long __must_check
296__copy_to_user(void __user *to, const void *from, unsigned long n)
297{
298 might_fault();
299 return __copy_to_user_inatomic(to, from, n);
300}
301
302static inline unsigned long __must_check
303copy_to_user(void __user *to, const void *from, unsigned long n)
304{
305 if (access_ok(VERIFY_WRITE, to, n))
306 n = __copy_to_user(to, from, n);
307 return n;
308}
309
310/**
311 * __copy_from_user() - copy data from user space, with less checking.
312 * @to: Destination address, in kernel space.
313 * @from: Source address, in user space.
314 * @n: Number of bytes to copy.
315 *
316 * Context: User context only. This function may sleep.
317 *
318 * Copy data from user space to kernel space. Caller must check
319 * the specified block with access_ok() before calling this function.
320 *
321 * Returns number of bytes that could not be copied.
322 * On success, this will be zero.
323 *
324 * If some data could not be copied, this function will pad the copied
325 * data to the requested size using zero bytes.
326 *
327 * An alternate version - __copy_from_user_inatomic() - is designed
328 * to be called from atomic context, typically bracketed by calls
329 * to pagefault_disable() and pagefault_enable(). This version
330 * does *NOT* pad with zeros.
331 */
332extern unsigned long __must_check __copy_from_user_inatomic(
333 void *to, const void __user *from, unsigned long n);
334extern unsigned long __must_check __copy_from_user_zeroing(
335 void *to, const void __user *from, unsigned long n);
336
337static inline unsigned long __must_check
338__copy_from_user(void *to, const void __user *from, unsigned long n)
339{
340 might_fault();
341 return __copy_from_user_zeroing(to, from, n);
342}
343
344static inline unsigned long __must_check
345_copy_from_user(void *to, const void __user *from, unsigned long n)
346{
347 if (access_ok(VERIFY_READ, from, n))
348 n = __copy_from_user(to, from, n);
349 else
350 memset(to, 0, n);
351 return n;
352}
353
354#ifdef CONFIG_DEBUG_COPY_FROM_USER
355extern void copy_from_user_overflow(void)
356 __compiletime_warning("copy_from_user() size is not provably correct");
357
358static inline unsigned long __must_check copy_from_user(void *to,
359 const void __user *from,
360 unsigned long n)
361{
362 int sz = __compiletime_object_size(to);
363
364 if (likely(sz == -1 || sz >= n))
365 n = _copy_from_user(to, from, n);
366 else
367 copy_from_user_overflow();
368
369 return n;
370}
371#else
372#define copy_from_user _copy_from_user
373#endif
374
375#ifdef __tilegx__
376/**
377 * __copy_in_user() - copy data within user space, with less checking.
378 * @to: Destination address, in user space.
379 * @from: Source address, in kernel space.
380 * @n: Number of bytes to copy.
381 *
382 * Context: User context only. This function may sleep.
383 *
384 * Copy data from user space to user space. Caller must check
385 * the specified blocks with access_ok() before calling this function.
386 *
387 * Returns number of bytes that could not be copied.
388 * On success, this will be zero.
389 */
390extern unsigned long __copy_in_user_asm(
391 void __user *to, const void __user *from, unsigned long n);
392
393static inline unsigned long __must_check
394__copy_in_user(void __user *to, const void __user *from, unsigned long n)
395{
396 might_sleep();
397 return __copy_in_user_asm(to, from, n);
398}
399
400static inline unsigned long __must_check
401copy_in_user(void __user *to, const void __user *from, unsigned long n)
402{
403 if (access_ok(VERIFY_WRITE, to, n) && access_ok(VERIFY_READ, from, n))
404 n = __copy_in_user(to, from, n);
405 return n;
406}
407#endif
408
409
410/**
411 * strlen_user: - Get the size of a string in user space.
412 * @str: The string to measure.
413 *
414 * Context: User context only. This function may sleep.
415 *
416 * Get the size of a NUL-terminated string in user space.
417 *
418 * Returns the size of the string INCLUDING the terminating NUL.
419 * On exception, returns 0.
420 *
421 * If there is a limit on the length of a valid string, you may wish to
422 * consider using strnlen_user() instead.
423 */
424extern long strnlen_user_asm(const char __user *str, long n);
425static inline long __must_check strnlen_user(const char __user *str, long n)
426{
427 might_fault();
428 return strnlen_user_asm(str, n);
429}
430#define strlen_user(str) strnlen_user(str, LONG_MAX)
431
432/**
433 * strncpy_from_user: - Copy a NUL terminated string from userspace, with less checking.
434 * @dst: Destination address, in kernel space. This buffer must be at
435 * least @count bytes long.
436 * @src: Source address, in user space.
437 * @count: Maximum number of bytes to copy, including the trailing NUL.
438 *
439 * Copies a NUL-terminated string from userspace to kernel space.
440 * Caller must check the specified block with access_ok() before calling
441 * this function.
442 *
443 * On success, returns the length of the string (not including the trailing
444 * NUL).
445 *
446 * If access to userspace fails, returns -EFAULT (some data may have been
447 * copied).
448 *
449 * If @count is smaller than the length of the string, copies @count bytes
450 * and returns @count.
451 */
452extern long strncpy_from_user_asm(char *dst, const char __user *src, long);
453static inline long __must_check __strncpy_from_user(
454 char *dst, const char __user *src, long count)
455{
456 might_fault();
457 return strncpy_from_user_asm(dst, src, count);
458}
459static inline long __must_check strncpy_from_user(
460 char *dst, const char __user *src, long count)
461{
462 if (access_ok(VERIFY_READ, src, 1))
463 return __strncpy_from_user(dst, src, count);
464 return -EFAULT;
465}
466
467/**
468 * clear_user: - Zero a block of memory in user space.
469 * @mem: Destination address, in user space.
470 * @len: Number of bytes to zero.
471 *
472 * Zero a block of memory in user space.
473 *
474 * Returns number of bytes that could not be cleared.
475 * On success, this will be zero.
476 */
477extern unsigned long clear_user_asm(void __user *mem, unsigned long len);
478static inline unsigned long __must_check __clear_user(
479 void __user *mem, unsigned long len)
480{
481 might_fault();
482 return clear_user_asm(mem, len);
483}
484static inline unsigned long __must_check clear_user(
485 void __user *mem, unsigned long len)
486{
487 if (access_ok(VERIFY_WRITE, mem, len))
488 return __clear_user(mem, len);
489 return len;
490}
491
492/**
493 * flush_user: - Flush a block of memory in user space from cache.
494 * @mem: Destination address, in user space.
495 * @len: Number of bytes to flush.
496 *
497 * Returns number of bytes that could not be flushed.
498 * On success, this will be zero.
499 */
500extern unsigned long flush_user_asm(void __user *mem, unsigned long len);
501static inline unsigned long __must_check __flush_user(
502 void __user *mem, unsigned long len)
503{
504 int retval;
505
506 might_fault();
507 retval = flush_user_asm(mem, len);
508 mb_incoherent();
509 return retval;
510}
511
512static inline unsigned long __must_check flush_user(
513 void __user *mem, unsigned long len)
514{
515 if (access_ok(VERIFY_WRITE, mem, len))
516 return __flush_user(mem, len);
517 return len;
518}
519
520/**
521 * inv_user: - Invalidate a block of memory in user space from cache.
522 * @mem: Destination address, in user space.
523 * @len: Number of bytes to invalidate.
524 *
525 * Returns number of bytes that could not be invalidated.
526 * On success, this will be zero.
527 *
528 * Note that on Tile64, the "inv" operation is in fact a
529 * "flush and invalidate", so cache write-backs will occur prior
530 * to the cache being marked invalid.
531 */
532extern unsigned long inv_user_asm(void __user *mem, unsigned long len);
533static inline unsigned long __must_check __inv_user(
534 void __user *mem, unsigned long len)
535{
536 int retval;
537
538 might_fault();
539 retval = inv_user_asm(mem, len);
540 mb_incoherent();
541 return retval;
542}
543static inline unsigned long __must_check inv_user(
544 void __user *mem, unsigned long len)
545{
546 if (access_ok(VERIFY_WRITE, mem, len))
547 return __inv_user(mem, len);
548 return len;
549}
550
551/**
552 * finv_user: - Flush-inval a block of memory in user space from cache.
553 * @mem: Destination address, in user space.
554 * @len: Number of bytes to invalidate.
555 *
556 * Returns number of bytes that could not be flush-invalidated.
557 * On success, this will be zero.
558 */
559extern unsigned long finv_user_asm(void __user *mem, unsigned long len);
560static inline unsigned long __must_check __finv_user(
561 void __user *mem, unsigned long len)
562{
563 int retval;
564
565 might_fault();
566 retval = finv_user_asm(mem, len);
567 mb_incoherent();
568 return retval;
569}
570static inline unsigned long __must_check finv_user(
571 void __user *mem, unsigned long len)
572{
573 if (access_ok(VERIFY_WRITE, mem, len))
574 return __finv_user(mem, len);
575 return len;
576}
577
578#endif /* _ASM_TILE_UACCESS_H */
diff --git a/arch/tile/include/asm/ucontext.h b/arch/tile/include/asm/ucontext.h
new file mode 100644
index 000000000000..9bc07b9f30fb
--- /dev/null
+++ b/arch/tile/include/asm/ucontext.h
@@ -0,0 +1 @@
#include <asm-generic/ucontext.h>
diff --git a/arch/tile/include/asm/unaligned.h b/arch/tile/include/asm/unaligned.h
new file mode 100644
index 000000000000..137e2de5b102
--- /dev/null
+++ b/arch/tile/include/asm/unaligned.h
@@ -0,0 +1,24 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#ifndef _ASM_TILE_UNALIGNED_H
16#define _ASM_TILE_UNALIGNED_H
17
18#include <linux/unaligned/le_struct.h>
19#include <linux/unaligned/be_byteshift.h>
20#include <linux/unaligned/generic.h>
21#define get_unaligned __get_unaligned_le
22#define put_unaligned __put_unaligned_le
23
24#endif /* _ASM_TILE_UNALIGNED_H */
diff --git a/arch/tile/include/asm/unistd.h b/arch/tile/include/asm/unistd.h
new file mode 100644
index 000000000000..03b3d5d665dd
--- /dev/null
+++ b/arch/tile/include/asm/unistd.h
@@ -0,0 +1,47 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 */
14
15#if !defined(_ASM_TILE_UNISTD_H) || defined(__SYSCALL)
16#define _ASM_TILE_UNISTD_H
17
18
19#ifndef __LP64__
20/* Use the flavor of this syscall that matches the 32-bit API better. */
21#define __ARCH_WANT_SYNC_FILE_RANGE2
22#endif
23
24/* Use the standard ABI for syscalls. */
25#include <asm-generic/unistd.h>
26
27#ifndef __tilegx__
28/* "Fast" syscalls provide atomic support for 32-bit chips. */
29#define __NR_FAST_cmpxchg -1
30#define __NR_FAST_atomic_update -2
31#define __NR_FAST_cmpxchg64 -3
32#define __NR_cmpxchg_badaddr (__NR_arch_specific_syscall + 0)
33__SYSCALL(__NR_cmpxchg_badaddr, sys_cmpxchg_badaddr)
34#endif
35
36/* Additional Tilera-specific syscalls. */
37#define __NR_flush_cache (__NR_arch_specific_syscall + 1)
38__SYSCALL(__NR_flush_cache, sys_flush_cache)
39
40#ifdef __KERNEL__
41/* In compat mode, we use sys_llseek() for compat_sys_llseek(). */
42#ifdef CONFIG_COMPAT
43#define __ARCH_WANT_SYS_LLSEEK
44#endif
45#endif
46
47#endif /* _ASM_TILE_UNISTD_H */
diff --git a/arch/tile/include/asm/user.h b/arch/tile/include/asm/user.h
new file mode 100644
index 000000000000..cbc8b4d5a5ce
--- /dev/null
+++ b/arch/tile/include/asm/user.h
@@ -0,0 +1,21 @@
1/*
2 * Copyright 2010 Tilera Corporation. All Rights Reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation, version 2.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
11 * NON INFRINGEMENT. See the GNU General Public License for
12 * more details.
13 *
14 */
15
16#ifndef _ASM_TILE_USER_H
17#define _ASM_TILE_USER_H
18
19/* This header is for a.out file formats, which TILE does not support. */
20
21#endif /* _ASM_TILE_USER_H */
diff --git a/arch/tile/include/asm/xor.h b/arch/tile/include/asm/xor.h
new file mode 100644
index 000000000000..c82eb12a5b18
--- /dev/null
+++ b/arch/tile/include/asm/xor.h
@@ -0,0 +1 @@
#include <asm-generic/xor.h>