1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#ifndef _ASM_TILE_PROCESSOR_H
16#define _ASM_TILE_PROCESSOR_H
17
18#ifndef __ASSEMBLY__
19
20
21
22
23
24#include <linux/types.h>
25#include <asm/ptrace.h>
26#include <asm/percpu.h>
27
28#include <arch/chip.h>
29#include <arch/spr_def.h>
30
31struct task_struct;
32struct thread_struct;
33
34typedef struct {
35 unsigned long seg;
36} mm_segment_t;
37
38
39
40
41
42void *current_text_addr(void);
43
44#if CHIP_HAS_TILE_DMA()
45
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
60
61
62#define DMA_STATUS_MASK \
63 (SPR_DMA_STATUS__RUNNING_MASK | SPR_DMA_STATUS__DONE_MASK)
64#endif
65
66
67
68
69
70struct async_tlb {
71 short fault_num;
72 char is_fault;
73 char is_write;
74 unsigned long address;
75};
76
77#ifdef CONFIG_HARDWALL
78struct hardwall_info;
79#endif
80
81struct thread_struct {
82
83 unsigned long ksp;
84
85 unsigned long pc;
86
87 unsigned long usp0;
88
89 pid_t creator_pid;
90#if CHIP_HAS_TILE_DMA()
91
92 struct tile_dma_state tile_dma_state;
93#endif
94
95 unsigned long ex_context[2];
96
97 unsigned long system_save[4];
98
99 unsigned long long interrupt_mask;
100
101 unsigned long intctrl_0;
102#if CHIP_HAS_PROC_STATUS_SPR()
103
104 unsigned long proc_status;
105#endif
106#if !CHIP_HAS_FIXED_INTVEC_BASE()
107
108 unsigned long interrupt_vector_base;
109#endif
110#if CHIP_HAS_TILE_RTF_HWM()
111
112 unsigned long tile_rtf_hwm;
113#endif
114#if CHIP_HAS_DSTREAM_PF()
115
116 unsigned long dstream_pf;
117#endif
118#ifdef CONFIG_HARDWALL
119
120 struct hardwall_info *hardwall;
121
122 struct list_head hardwall_list;
123#endif
124#if CHIP_HAS_TILE_DMA()
125
126 struct async_tlb dma_async_tlb;
127#endif
128#if CHIP_HAS_SN_PROC()
129
130 int sn_proc_running;
131
132 struct async_tlb sn_async_tlb;
133#endif
134};
135
136#endif
137
138
139
140
141
142#define STACK_TOP_DELTA 8
143
144
145
146
147
148
149#ifdef __tilegx__
150#define KSTK_PTREGS_GAP 48
151#else
152#define KSTK_PTREGS_GAP 56
153#endif
154
155#ifndef __ASSEMBLY__
156
157#ifdef __tilegx__
158#define TASK_SIZE_MAX (MEM_LOW_END + 1)
159#else
160#define TASK_SIZE_MAX PAGE_OFFSET
161#endif
162
163
164#ifdef CONFIG_COMPAT
165#define COMPAT_TASK_SIZE (1UL << 31)
166#define TASK_SIZE ((current_thread_info()->status & TS_COMPAT) ?\
167 COMPAT_TASK_SIZE : TASK_SIZE_MAX)
168#else
169#define TASK_SIZE TASK_SIZE_MAX
170#endif
171
172
173#define VDSO_BASE (TASK_SIZE - PAGE_SIZE)
174
175#define STACK_TOP VDSO_BASE
176
177
178#define STACK_TOP_MAX TASK_SIZE_MAX
179
180
181
182
183
184#define TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3))
185
186#define HAVE_ARCH_PICK_MMAP_LAYOUT
187
188#define INIT_THREAD { \
189 .ksp = (unsigned long)init_stack + THREAD_SIZE - STACK_TOP_DELTA, \
190 .interrupt_mask = -1ULL \
191}
192
193
194DECLARE_PER_CPU(unsigned long, boot_sp);
195
196
197DECLARE_PER_CPU(unsigned long, boot_pc);
198
199
200static inline void start_thread(struct pt_regs *regs,
201 unsigned long pc, unsigned long usp)
202{
203 regs->pc = pc;
204 regs->sp = usp;
205}
206
207
208static inline void release_thread(struct task_struct *dead_task)
209{
210
211}
212
213
214#define prepare_to_copy(tsk) do { } while (0)
215
216extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
217
218
219
220
221
222
223#define thread_saved_pc(t) ((t)->thread.pc)
224
225unsigned long get_wchan(struct task_struct *p);
226
227
228#define task_ksp0(task) ((unsigned long)(task)->stack + THREAD_SIZE)
229
230
231#define KSTK_TOP(task) (task_ksp0(task) - STACK_TOP_DELTA)
232#define task_pt_regs(task) \
233 ((struct pt_regs *)(task_ksp0(task) - KSTK_PTREGS_GAP) - 1)
234#define task_sp(task) (task_pt_regs(task)->sp)
235#define task_pc(task) (task_pt_regs(task)->pc)
236
237#define KSTK_EIP(task) task_pc(task)
238#define KSTK_ESP(task) task_sp(task)
239
240
241#ifdef __tilegx__
242# define REGFMT "0x%016lx"
243#else
244# define REGFMT "0x%08lx"
245#endif
246
247
248
249
250
251
252static inline void cpu_relax(void)
253{
254 __insn_mfspr(SPR_PASS);
255 barrier();
256}
257
258struct siginfo;
259extern void arch_coredump_signal(struct siginfo *, struct pt_regs *);
260#define arch_coredump_signal arch_coredump_signal
261
262
263struct seq_operations;
264extern const struct seq_operations cpuinfo_op;
265
266
267extern char chip_model[64];
268
269
270extern int node_controller[];
271
272
273
274extern int show_crashinfo;
275
276#if CHIP_HAS_CBOX_HOME_MAP()
277
278extern int hash_default;
279
280
281extern int kstack_hash;
282
283
284#define uheap_hash hash_default
285
286#else
287#define hash_default 0
288#define kstack_hash 0
289#define uheap_hash 0
290#endif
291
292
293extern int kdata_huge;
294
295
296#define ARCH_HAS_PREFETCH
297#define prefetch(x) __builtin_prefetch(x)
298#define PREFETCH_STRIDE CHIP_L2_LINE_SIZE()
299
300
301#ifdef __tilegx__
302#define prefetch_L1(x) __insn_prefetch_l1_fault((void *)(x))
303#else
304#define prefetch_L1(x) __insn_prefetch_L1((void *)(x))
305#endif
306
307#else
308
309
310#define CPU_RELAX mfspr zero, SPR_PASS
311
312#endif
313
314
315#if SPR_EX_CONTEXT_1_1__PL_SHIFT != 0
316# error Fix assembly assumptions about PL
317#endif
318
319
320#if SPR_EX_CONTEXT_1_1__PL_SHIFT != SPR_EX_CONTEXT_0_1__PL_SHIFT || \
321 SPR_EX_CONTEXT_1_1__PL_RMASK != SPR_EX_CONTEXT_0_1__PL_RMASK || \
322 SPR_EX_CONTEXT_1_1__ICS_SHIFT != SPR_EX_CONTEXT_0_1__ICS_SHIFT || \
323 SPR_EX_CONTEXT_1_1__ICS_RMASK != SPR_EX_CONTEXT_0_1__ICS_RMASK
324# error Fix assumptions that EX1 macros work for both PL0 and PL1
325#endif
326
327
328#define EX1_PL(ex1) \
329 (((ex1) >> SPR_EX_CONTEXT_1_1__PL_SHIFT) & SPR_EX_CONTEXT_1_1__PL_RMASK)
330#define EX1_ICS(ex1) \
331 (((ex1) >> SPR_EX_CONTEXT_1_1__ICS_SHIFT) & SPR_EX_CONTEXT_1_1__ICS_RMASK)
332#define PL_ICS_EX1(pl, ics) \
333 (((pl) << SPR_EX_CONTEXT_1_1__PL_SHIFT) | \
334 ((ics) << SPR_EX_CONTEXT_1_1__ICS_SHIFT))
335
336
337
338
339
340#define USER_PL 0
341#if CONFIG_KERNEL_PL == 2
342#define GUEST_PL 1
343#endif
344#define KERNEL_PL CONFIG_KERNEL_PL
345
346
347#define CPU_LOG_MASK_VALUE 12
348#define CPU_MASK_VALUE ((1 << CPU_LOG_MASK_VALUE) - 1)
349#if CONFIG_NR_CPUS > CPU_MASK_VALUE
350# error Too many cpus!
351#endif
352#define raw_smp_processor_id() \
353 ((int)__insn_mfspr(SPR_SYSTEM_SAVE_K_0) & CPU_MASK_VALUE)
354#define get_current_ksp0() \
355 (__insn_mfspr(SPR_SYSTEM_SAVE_K_0) & ~CPU_MASK_VALUE)
356#define next_current_ksp0(task) ({ \
357 unsigned long __ksp0 = task_ksp0(task); \
358 int __cpu = raw_smp_processor_id(); \
359 BUG_ON(__ksp0 & CPU_MASK_VALUE); \
360 __ksp0 | __cpu; \
361})
362
363#endif
364