Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
avr32
include
asm
processor.h
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2004-2006 Atmel Corporation
3
*
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License version 2 as
6
* published by the Free Software Foundation.
7
*/
8
#ifndef __ASM_AVR32_PROCESSOR_H
9
#define __ASM_AVR32_PROCESSOR_H
10
11
#include <asm/page.h>
12
#include <asm/cache.h>
13
14
#define TASK_SIZE 0x80000000
15
16
#ifdef __KERNEL__
17
#define STACK_TOP TASK_SIZE
18
#define STACK_TOP_MAX STACK_TOP
19
#endif
20
21
#ifndef __ASSEMBLY__
22
23
static
inline
void
*
current_text_addr
(
void
)
24
{
25
register
void
*
pc
asm
(
"pc"
);
26
return
pc
;
27
}
28
29
enum
arch_type
{
30
ARCH_AVR32A
,
31
ARCH_AVR32B
,
32
ARCH_MAX
33
};
34
35
enum
cpu_type
{
36
CPU_MORGAN
,
37
CPU_AT32AP
,
38
CPU_MAX
39
};
40
41
enum
tlb_config
{
42
TLB_NONE
,
43
TLB_SPLIT
,
44
TLB_UNIFIED
,
45
TLB_INVALID
46
};
47
48
#define AVR32_FEATURE_RMW (1 << 0)
49
#define AVR32_FEATURE_DSP (1 << 1)
50
#define AVR32_FEATURE_SIMD (1 << 2)
51
#define AVR32_FEATURE_OCD (1 << 3)
52
#define AVR32_FEATURE_PCTR (1 << 4)
53
#define AVR32_FEATURE_JAVA (1 << 5)
54
#define AVR32_FEATURE_FPU (1 << 6)
55
56
struct
avr32_cpuinfo
{
57
struct
clk
*
clk
;
58
unsigned
long
loops_per_jiffy
;
59
enum
arch_type
arch_type
;
60
enum
cpu_type
cpu_type
;
61
unsigned
short
arch_revision
;
62
unsigned
short
cpu_revision
;
63
enum
tlb_config
tlb_config
;
64
unsigned
long
features
;
65
u32
device_id
;
66
67
struct
cache_info
icache
;
68
struct
cache_info
dcache
;
69
};
70
71
static
inline
unsigned
int
avr32_get_manufacturer_id(
struct
avr32_cpuinfo
*
cpu
)
72
{
73
return
(cpu->
device_id
>> 1) & 0x7f;
74
}
75
static
inline
unsigned
int
avr32_get_product_number(
struct
avr32_cpuinfo
*cpu)
76
{
77
return
(cpu->
device_id
>> 12) & 0xffff;
78
}
79
static
inline
unsigned
int
avr32_get_chip_revision(
struct
avr32_cpuinfo
*cpu)
80
{
81
return
(cpu->
device_id
>> 28) & 0x0f;
82
}
83
84
extern
struct
avr32_cpuinfo
boot_cpu_data
;
85
86
#ifdef CONFIG_SMP
87
extern
struct
avr32_cpuinfo
cpu_data
[];
88
#define current_cpu_data cpu_data[smp_processor_id()]
89
#else
90
#define cpu_data (&boot_cpu_data)
91
#define current_cpu_data boot_cpu_data
92
#endif
93
94
/* This decides where the kernel will search for a free chunk of vm
95
* space during mmap's
96
*/
97
#define TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3))
98
99
#define cpu_relax() barrier()
100
#define cpu_sync_pipeline() asm volatile("sub pc, -2" : : : "memory")
101
102
struct
cpu_context
{
103
unsigned
long
sr
;
104
unsigned
long
pc
;
105
unsigned
long
ksp
;
/* Kernel stack pointer */
106
unsigned
long
r7
;
107
unsigned
long
r6
;
108
unsigned
long
r5
;
109
unsigned
long
r4
;
110
unsigned
long
r3
;
111
unsigned
long
r2
;
112
unsigned
long
r1
;
113
unsigned
long
r0
;
114
};
115
116
/* This struct contains the CPU context as stored by switch_to() */
117
struct
thread_struct
{
118
struct
cpu_context
cpu_context
;
119
unsigned
long
single_step_addr
;
120
u16
single_step_insn
;
121
};
122
123
#define INIT_THREAD { \
124
.cpu_context = { \
125
.ksp = sizeof(init_stack) + (long)&init_stack, \
126
}, \
127
}
128
129
/*
130
* Do necessary setup to start up a newly executed thread.
131
*/
132
#define start_thread(regs, new_pc, new_sp) \
133
do { \
134
memset(regs, 0, sizeof(*regs)); \
135
regs->sr = MODE_USER; \
136
regs->pc = new_pc & ~1; \
137
regs->sp = new_sp; \
138
} while(0)
139
140
struct
task_struct
;
141
142
/* Free all resources held by a thread */
143
extern
void
release_thread
(
struct
task_struct
*);
144
145
/* Create a kernel thread without removing it from tasklists */
146
extern
int
kernel_thread
(
int
(*
fn
)(
void
*),
void
*
arg
,
unsigned
long
flags
);
147
148
/* Return saved PC of a blocked thread */
149
#define thread_saved_pc(tsk) ((tsk)->thread.cpu_context.pc)
150
151
struct
pt_regs
;
152
extern
unsigned
long
get_wchan
(
struct
task_struct
*
p
);
153
extern
void
show_regs_log_lvl
(
struct
pt_regs
*
regs
,
const
char
*log_lvl);
154
extern
void
show_stack_log_lvl
(
struct
task_struct
*tsk,
unsigned
long
sp
,
155
struct
pt_regs
*
regs
,
const
char
*log_lvl);
156
157
#define task_pt_regs(p) \
158
((struct pt_regs *)(THREAD_SIZE + task_stack_page(p)) - 1)
159
160
#define KSTK_EIP(tsk) ((tsk)->thread.cpu_context.pc)
161
#define KSTK_ESP(tsk) ((tsk)->thread.cpu_context.ksp)
162
163
#define ARCH_HAS_PREFETCH
164
165
static
inline
void
prefetch
(
const
void
*
x
)
166
{
167
const
char
*
c
=
x
;
168
asm
volatile
(
"pref %0"
: :
"r"
(
c
));
169
}
170
#define PREFETCH_STRIDE L1_CACHE_BYTES
171
172
#endif
/* __ASSEMBLY__ */
173
174
#endif
/* __ASM_AVR32_PROCESSOR_H */
Generated on Thu Jan 10 2013 12:50:16 for Linux Kernel by
1.8.2