diff options
Diffstat (limited to 'arch')
330 files changed, 6497 insertions, 4118 deletions
diff --git a/arch/alpha/include/asm/8253pit.h b/arch/alpha/include/asm/8253pit.h index fef5c1450e47..a71c9c1455a7 100644 --- a/arch/alpha/include/asm/8253pit.h +++ b/arch/alpha/include/asm/8253pit.h | |||
@@ -1,10 +1,3 @@ | |||
1 | /* | 1 | /* |
2 | * 8253/8254 Programmable Interval Timer | 2 | * 8253/8254 Programmable Interval Timer |
3 | */ | 3 | */ |
4 | |||
5 | #ifndef _8253PIT_H | ||
6 | #define _8253PIT_H | ||
7 | |||
8 | #define PIT_TICK_RATE 1193180UL | ||
9 | |||
10 | #endif | ||
diff --git a/arch/alpha/include/asm/kmap_types.h b/arch/alpha/include/asm/kmap_types.h index 3e6735a34c57..a8d4ec8ea4b6 100644 --- a/arch/alpha/include/asm/kmap_types.h +++ b/arch/alpha/include/asm/kmap_types.h | |||
@@ -3,30 +3,12 @@ | |||
3 | 3 | ||
4 | /* Dummy header just to define km_type. */ | 4 | /* Dummy header just to define km_type. */ |
5 | 5 | ||
6 | |||
7 | #ifdef CONFIG_DEBUG_HIGHMEM | 6 | #ifdef CONFIG_DEBUG_HIGHMEM |
8 | # define D(n) __KM_FENCE_##n , | 7 | #define __WITH_KM_FENCE |
9 | #else | ||
10 | # define D(n) | ||
11 | #endif | 8 | #endif |
12 | 9 | ||
13 | enum km_type { | 10 | #include <asm-generic/kmap_types.h> |
14 | D(0) KM_BOUNCE_READ, | ||
15 | D(1) KM_SKB_SUNRPC_DATA, | ||
16 | D(2) KM_SKB_DATA_SOFTIRQ, | ||
17 | D(3) KM_USER0, | ||
18 | D(4) KM_USER1, | ||
19 | D(5) KM_BIO_SRC_IRQ, | ||
20 | D(6) KM_BIO_DST_IRQ, | ||
21 | D(7) KM_PTE0, | ||
22 | D(8) KM_PTE1, | ||
23 | D(9) KM_IRQ0, | ||
24 | D(10) KM_IRQ1, | ||
25 | D(11) KM_SOFTIRQ0, | ||
26 | D(12) KM_SOFTIRQ1, | ||
27 | D(13) KM_TYPE_NR | ||
28 | }; | ||
29 | 11 | ||
30 | #undef D | 12 | #undef __WITH_KM_FENCE |
31 | 13 | ||
32 | #endif | 14 | #endif |
diff --git a/arch/alpha/kernel/init_task.c b/arch/alpha/kernel/init_task.c index c2938e574a40..19b86328ffd7 100644 --- a/arch/alpha/kernel/init_task.c +++ b/arch/alpha/kernel/init_task.c | |||
@@ -10,10 +10,7 @@ | |||
10 | 10 | ||
11 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 11 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
12 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 12 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
13 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
14 | struct task_struct init_task = INIT_TASK(init_task); | 13 | struct task_struct init_task = INIT_TASK(init_task); |
15 | |||
16 | EXPORT_SYMBOL(init_mm); | ||
17 | EXPORT_SYMBOL(init_task); | 14 | EXPORT_SYMBOL(init_task); |
18 | 15 | ||
19 | union thread_union init_thread_union | 16 | union thread_union init_thread_union |
diff --git a/arch/alpha/kernel/irq_alpha.c b/arch/alpha/kernel/irq_alpha.c index 67c19f8a9944..38c805dfc544 100644 --- a/arch/alpha/kernel/irq_alpha.c +++ b/arch/alpha/kernel/irq_alpha.c | |||
@@ -227,7 +227,7 @@ struct irqaction timer_irqaction = { | |||
227 | .name = "timer", | 227 | .name = "timer", |
228 | }; | 228 | }; |
229 | 229 | ||
230 | static struct hw_interrupt_type rtc_irq_type = { | 230 | static struct irq_chip rtc_irq_type = { |
231 | .typename = "RTC", | 231 | .typename = "RTC", |
232 | .startup = rtc_startup, | 232 | .startup = rtc_startup, |
233 | .shutdown = rtc_enable_disable, | 233 | .shutdown = rtc_enable_disable, |
diff --git a/arch/alpha/kernel/irq_i8259.c b/arch/alpha/kernel/irq_i8259.c index 9405bee9894e..50bfec9b588f 100644 --- a/arch/alpha/kernel/irq_i8259.c +++ b/arch/alpha/kernel/irq_i8259.c | |||
@@ -83,7 +83,7 @@ i8259a_end_irq(unsigned int irq) | |||
83 | i8259a_enable_irq(irq); | 83 | i8259a_enable_irq(irq); |
84 | } | 84 | } |
85 | 85 | ||
86 | struct hw_interrupt_type i8259a_irq_type = { | 86 | struct irq_chip i8259a_irq_type = { |
87 | .typename = "XT-PIC", | 87 | .typename = "XT-PIC", |
88 | .startup = i8259a_startup_irq, | 88 | .startup = i8259a_startup_irq, |
89 | .shutdown = i8259a_disable_irq, | 89 | .shutdown = i8259a_disable_irq, |
diff --git a/arch/alpha/kernel/irq_impl.h b/arch/alpha/kernel/irq_impl.h index cc9a8a7aa279..b63ccd7386f1 100644 --- a/arch/alpha/kernel/irq_impl.h +++ b/arch/alpha/kernel/irq_impl.h | |||
@@ -36,7 +36,7 @@ extern void i8259a_disable_irq(unsigned int); | |||
36 | extern void i8259a_mask_and_ack_irq(unsigned int); | 36 | extern void i8259a_mask_and_ack_irq(unsigned int); |
37 | extern unsigned int i8259a_startup_irq(unsigned int); | 37 | extern unsigned int i8259a_startup_irq(unsigned int); |
38 | extern void i8259a_end_irq(unsigned int); | 38 | extern void i8259a_end_irq(unsigned int); |
39 | extern struct hw_interrupt_type i8259a_irq_type; | 39 | extern struct irq_chip i8259a_irq_type; |
40 | extern void init_i8259a_irqs(void); | 40 | extern void init_i8259a_irqs(void); |
41 | 41 | ||
42 | extern void handle_irq(int irq); | 42 | extern void handle_irq(int irq); |
diff --git a/arch/alpha/kernel/irq_pyxis.c b/arch/alpha/kernel/irq_pyxis.c index d53edbccbfe5..69199a76ec4a 100644 --- a/arch/alpha/kernel/irq_pyxis.c +++ b/arch/alpha/kernel/irq_pyxis.c | |||
@@ -70,7 +70,7 @@ pyxis_mask_and_ack_irq(unsigned int irq) | |||
70 | *(vulp)PYXIS_INT_MASK; | 70 | *(vulp)PYXIS_INT_MASK; |
71 | } | 71 | } |
72 | 72 | ||
73 | static struct hw_interrupt_type pyxis_irq_type = { | 73 | static struct irq_chip pyxis_irq_type = { |
74 | .typename = "PYXIS", | 74 | .typename = "PYXIS", |
75 | .startup = pyxis_startup_irq, | 75 | .startup = pyxis_startup_irq, |
76 | .shutdown = pyxis_disable_irq, | 76 | .shutdown = pyxis_disable_irq, |
diff --git a/arch/alpha/kernel/irq_srm.c b/arch/alpha/kernel/irq_srm.c index a03fbca4940e..85229369a1f8 100644 --- a/arch/alpha/kernel/irq_srm.c +++ b/arch/alpha/kernel/irq_srm.c | |||
@@ -48,7 +48,7 @@ srm_end_irq(unsigned int irq) | |||
48 | } | 48 | } |
49 | 49 | ||
50 | /* Handle interrupts from the SRM, assuming no additional weirdness. */ | 50 | /* Handle interrupts from the SRM, assuming no additional weirdness. */ |
51 | static struct hw_interrupt_type srm_irq_type = { | 51 | static struct irq_chip srm_irq_type = { |
52 | .typename = "SRM", | 52 | .typename = "SRM", |
53 | .startup = srm_startup_irq, | 53 | .startup = srm_startup_irq, |
54 | .shutdown = srm_disable_irq, | 54 | .shutdown = srm_disable_irq, |
diff --git a/arch/alpha/kernel/setup.c b/arch/alpha/kernel/setup.c index 80df86cd746b..d2634e4476b4 100644 --- a/arch/alpha/kernel/setup.c +++ b/arch/alpha/kernel/setup.c | |||
@@ -252,9 +252,9 @@ reserve_std_resources(void) | |||
252 | } | 252 | } |
253 | 253 | ||
254 | #define PFN_MAX PFN_DOWN(0x80000000) | 254 | #define PFN_MAX PFN_DOWN(0x80000000) |
255 | #define for_each_mem_cluster(memdesc, cluster, i) \ | 255 | #define for_each_mem_cluster(memdesc, _cluster, i) \ |
256 | for ((cluster) = (memdesc)->cluster, (i) = 0; \ | 256 | for ((_cluster) = (memdesc)->cluster, (i) = 0; \ |
257 | (i) < (memdesc)->numclusters; (i)++, (cluster)++) | 257 | (i) < (memdesc)->numclusters; (i)++, (_cluster)++) |
258 | 258 | ||
259 | static unsigned long __init | 259 | static unsigned long __init |
260 | get_mem_size_limit(char *s) | 260 | get_mem_size_limit(char *s) |
diff --git a/arch/alpha/kernel/sys_alcor.c b/arch/alpha/kernel/sys_alcor.c index e53a1e1c2f21..382035ef7394 100644 --- a/arch/alpha/kernel/sys_alcor.c +++ b/arch/alpha/kernel/sys_alcor.c | |||
@@ -89,7 +89,7 @@ alcor_end_irq(unsigned int irq) | |||
89 | alcor_enable_irq(irq); | 89 | alcor_enable_irq(irq); |
90 | } | 90 | } |
91 | 91 | ||
92 | static struct hw_interrupt_type alcor_irq_type = { | 92 | static struct irq_chip alcor_irq_type = { |
93 | .typename = "ALCOR", | 93 | .typename = "ALCOR", |
94 | .startup = alcor_startup_irq, | 94 | .startup = alcor_startup_irq, |
95 | .shutdown = alcor_disable_irq, | 95 | .shutdown = alcor_disable_irq, |
diff --git a/arch/alpha/kernel/sys_cabriolet.c b/arch/alpha/kernel/sys_cabriolet.c index ace475c124f6..ed349436732b 100644 --- a/arch/alpha/kernel/sys_cabriolet.c +++ b/arch/alpha/kernel/sys_cabriolet.c | |||
@@ -71,7 +71,7 @@ cabriolet_end_irq(unsigned int irq) | |||
71 | cabriolet_enable_irq(irq); | 71 | cabriolet_enable_irq(irq); |
72 | } | 72 | } |
73 | 73 | ||
74 | static struct hw_interrupt_type cabriolet_irq_type = { | 74 | static struct irq_chip cabriolet_irq_type = { |
75 | .typename = "CABRIOLET", | 75 | .typename = "CABRIOLET", |
76 | .startup = cabriolet_startup_irq, | 76 | .startup = cabriolet_startup_irq, |
77 | .shutdown = cabriolet_disable_irq, | 77 | .shutdown = cabriolet_disable_irq, |
diff --git a/arch/alpha/kernel/sys_dp264.c b/arch/alpha/kernel/sys_dp264.c index 5bd5259324b7..46e70ece5176 100644 --- a/arch/alpha/kernel/sys_dp264.c +++ b/arch/alpha/kernel/sys_dp264.c | |||
@@ -198,7 +198,7 @@ clipper_set_affinity(unsigned int irq, const struct cpumask *affinity) | |||
198 | return 0; | 198 | return 0; |
199 | } | 199 | } |
200 | 200 | ||
201 | static struct hw_interrupt_type dp264_irq_type = { | 201 | static struct irq_chip dp264_irq_type = { |
202 | .typename = "DP264", | 202 | .typename = "DP264", |
203 | .startup = dp264_startup_irq, | 203 | .startup = dp264_startup_irq, |
204 | .shutdown = dp264_disable_irq, | 204 | .shutdown = dp264_disable_irq, |
@@ -209,7 +209,7 @@ static struct hw_interrupt_type dp264_irq_type = { | |||
209 | .set_affinity = dp264_set_affinity, | 209 | .set_affinity = dp264_set_affinity, |
210 | }; | 210 | }; |
211 | 211 | ||
212 | static struct hw_interrupt_type clipper_irq_type = { | 212 | static struct irq_chip clipper_irq_type = { |
213 | .typename = "CLIPPER", | 213 | .typename = "CLIPPER", |
214 | .startup = clipper_startup_irq, | 214 | .startup = clipper_startup_irq, |
215 | .shutdown = clipper_disable_irq, | 215 | .shutdown = clipper_disable_irq, |
@@ -298,7 +298,7 @@ clipper_srm_device_interrupt(unsigned long vector) | |||
298 | } | 298 | } |
299 | 299 | ||
300 | static void __init | 300 | static void __init |
301 | init_tsunami_irqs(struct hw_interrupt_type * ops, int imin, int imax) | 301 | init_tsunami_irqs(struct irq_chip * ops, int imin, int imax) |
302 | { | 302 | { |
303 | long i; | 303 | long i; |
304 | for (i = imin; i <= imax; ++i) { | 304 | for (i = imin; i <= imax; ++i) { |
diff --git a/arch/alpha/kernel/sys_eb64p.c b/arch/alpha/kernel/sys_eb64p.c index 9c5a306dc0ee..660c23ef661f 100644 --- a/arch/alpha/kernel/sys_eb64p.c +++ b/arch/alpha/kernel/sys_eb64p.c | |||
@@ -69,7 +69,7 @@ eb64p_end_irq(unsigned int irq) | |||
69 | eb64p_enable_irq(irq); | 69 | eb64p_enable_irq(irq); |
70 | } | 70 | } |
71 | 71 | ||
72 | static struct hw_interrupt_type eb64p_irq_type = { | 72 | static struct irq_chip eb64p_irq_type = { |
73 | .typename = "EB64P", | 73 | .typename = "EB64P", |
74 | .startup = eb64p_startup_irq, | 74 | .startup = eb64p_startup_irq, |
75 | .shutdown = eb64p_disable_irq, | 75 | .shutdown = eb64p_disable_irq, |
diff --git a/arch/alpha/kernel/sys_eiger.c b/arch/alpha/kernel/sys_eiger.c index baf60f36cbd7..b99ea488d844 100644 --- a/arch/alpha/kernel/sys_eiger.c +++ b/arch/alpha/kernel/sys_eiger.c | |||
@@ -80,7 +80,7 @@ eiger_end_irq(unsigned int irq) | |||
80 | eiger_enable_irq(irq); | 80 | eiger_enable_irq(irq); |
81 | } | 81 | } |
82 | 82 | ||
83 | static struct hw_interrupt_type eiger_irq_type = { | 83 | static struct irq_chip eiger_irq_type = { |
84 | .typename = "EIGER", | 84 | .typename = "EIGER", |
85 | .startup = eiger_startup_irq, | 85 | .startup = eiger_startup_irq, |
86 | .shutdown = eiger_disable_irq, | 86 | .shutdown = eiger_disable_irq, |
diff --git a/arch/alpha/kernel/sys_jensen.c b/arch/alpha/kernel/sys_jensen.c index 2b5caf3d9b15..ef0b83a070ac 100644 --- a/arch/alpha/kernel/sys_jensen.c +++ b/arch/alpha/kernel/sys_jensen.c | |||
@@ -118,7 +118,7 @@ jensen_local_end(unsigned int irq) | |||
118 | i8259a_end_irq(1); | 118 | i8259a_end_irq(1); |
119 | } | 119 | } |
120 | 120 | ||
121 | static struct hw_interrupt_type jensen_local_irq_type = { | 121 | static struct irq_chip jensen_local_irq_type = { |
122 | .typename = "LOCAL", | 122 | .typename = "LOCAL", |
123 | .startup = jensen_local_startup, | 123 | .startup = jensen_local_startup, |
124 | .shutdown = jensen_local_shutdown, | 124 | .shutdown = jensen_local_shutdown, |
diff --git a/arch/alpha/kernel/sys_marvel.c b/arch/alpha/kernel/sys_marvel.c index c5a1a2438c67..bbfc4f20ca72 100644 --- a/arch/alpha/kernel/sys_marvel.c +++ b/arch/alpha/kernel/sys_marvel.c | |||
@@ -169,7 +169,7 @@ marvel_irq_noop_return(unsigned int irq) | |||
169 | return 0; | 169 | return 0; |
170 | } | 170 | } |
171 | 171 | ||
172 | static struct hw_interrupt_type marvel_legacy_irq_type = { | 172 | static struct irq_chip marvel_legacy_irq_type = { |
173 | .typename = "LEGACY", | 173 | .typename = "LEGACY", |
174 | .startup = marvel_irq_noop_return, | 174 | .startup = marvel_irq_noop_return, |
175 | .shutdown = marvel_irq_noop, | 175 | .shutdown = marvel_irq_noop, |
@@ -179,7 +179,7 @@ static struct hw_interrupt_type marvel_legacy_irq_type = { | |||
179 | .end = marvel_irq_noop, | 179 | .end = marvel_irq_noop, |
180 | }; | 180 | }; |
181 | 181 | ||
182 | static struct hw_interrupt_type io7_lsi_irq_type = { | 182 | static struct irq_chip io7_lsi_irq_type = { |
183 | .typename = "LSI", | 183 | .typename = "LSI", |
184 | .startup = io7_startup_irq, | 184 | .startup = io7_startup_irq, |
185 | .shutdown = io7_disable_irq, | 185 | .shutdown = io7_disable_irq, |
@@ -189,7 +189,7 @@ static struct hw_interrupt_type io7_lsi_irq_type = { | |||
189 | .end = io7_end_irq, | 189 | .end = io7_end_irq, |
190 | }; | 190 | }; |
191 | 191 | ||
192 | static struct hw_interrupt_type io7_msi_irq_type = { | 192 | static struct irq_chip io7_msi_irq_type = { |
193 | .typename = "MSI", | 193 | .typename = "MSI", |
194 | .startup = io7_startup_irq, | 194 | .startup = io7_startup_irq, |
195 | .shutdown = io7_disable_irq, | 195 | .shutdown = io7_disable_irq, |
@@ -273,8 +273,8 @@ init_one_io7_msi(struct io7 *io7, unsigned int which, unsigned int where) | |||
273 | 273 | ||
274 | static void __init | 274 | static void __init |
275 | init_io7_irqs(struct io7 *io7, | 275 | init_io7_irqs(struct io7 *io7, |
276 | struct hw_interrupt_type *lsi_ops, | 276 | struct irq_chip *lsi_ops, |
277 | struct hw_interrupt_type *msi_ops) | 277 | struct irq_chip *msi_ops) |
278 | { | 278 | { |
279 | long base = (io7->pe << MARVEL_IRQ_VEC_PE_SHIFT) + 16; | 279 | long base = (io7->pe << MARVEL_IRQ_VEC_PE_SHIFT) + 16; |
280 | long i; | 280 | long i; |
diff --git a/arch/alpha/kernel/sys_mikasa.c b/arch/alpha/kernel/sys_mikasa.c index 8d3e9429c5ee..4e366641a08e 100644 --- a/arch/alpha/kernel/sys_mikasa.c +++ b/arch/alpha/kernel/sys_mikasa.c | |||
@@ -68,7 +68,7 @@ mikasa_end_irq(unsigned int irq) | |||
68 | mikasa_enable_irq(irq); | 68 | mikasa_enable_irq(irq); |
69 | } | 69 | } |
70 | 70 | ||
71 | static struct hw_interrupt_type mikasa_irq_type = { | 71 | static struct irq_chip mikasa_irq_type = { |
72 | .typename = "MIKASA", | 72 | .typename = "MIKASA", |
73 | .startup = mikasa_startup_irq, | 73 | .startup = mikasa_startup_irq, |
74 | .shutdown = mikasa_disable_irq, | 74 | .shutdown = mikasa_disable_irq, |
diff --git a/arch/alpha/kernel/sys_noritake.c b/arch/alpha/kernel/sys_noritake.c index 538876b62449..35753a173bac 100644 --- a/arch/alpha/kernel/sys_noritake.c +++ b/arch/alpha/kernel/sys_noritake.c | |||
@@ -73,7 +73,7 @@ noritake_end_irq(unsigned int irq) | |||
73 | noritake_enable_irq(irq); | 73 | noritake_enable_irq(irq); |
74 | } | 74 | } |
75 | 75 | ||
76 | static struct hw_interrupt_type noritake_irq_type = { | 76 | static struct irq_chip noritake_irq_type = { |
77 | .typename = "NORITAKE", | 77 | .typename = "NORITAKE", |
78 | .startup = noritake_startup_irq, | 78 | .startup = noritake_startup_irq, |
79 | .shutdown = noritake_disable_irq, | 79 | .shutdown = noritake_disable_irq, |
diff --git a/arch/alpha/kernel/sys_rawhide.c b/arch/alpha/kernel/sys_rawhide.c index 672cb2df53df..f3aec7e085c8 100644 --- a/arch/alpha/kernel/sys_rawhide.c +++ b/arch/alpha/kernel/sys_rawhide.c | |||
@@ -135,7 +135,7 @@ rawhide_end_irq(unsigned int irq) | |||
135 | rawhide_enable_irq(irq); | 135 | rawhide_enable_irq(irq); |
136 | } | 136 | } |
137 | 137 | ||
138 | static struct hw_interrupt_type rawhide_irq_type = { | 138 | static struct irq_chip rawhide_irq_type = { |
139 | .typename = "RAWHIDE", | 139 | .typename = "RAWHIDE", |
140 | .startup = rawhide_startup_irq, | 140 | .startup = rawhide_startup_irq, |
141 | .shutdown = rawhide_disable_irq, | 141 | .shutdown = rawhide_disable_irq, |
diff --git a/arch/alpha/kernel/sys_ruffian.c b/arch/alpha/kernel/sys_ruffian.c index f15a329b6011..d9f9cfeb9931 100644 --- a/arch/alpha/kernel/sys_ruffian.c +++ b/arch/alpha/kernel/sys_ruffian.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/sched.h> | 14 | #include <linux/sched.h> |
15 | #include <linux/pci.h> | 15 | #include <linux/pci.h> |
16 | #include <linux/ioport.h> | 16 | #include <linux/ioport.h> |
17 | #include <linux/timex.h> | ||
17 | #include <linux/init.h> | 18 | #include <linux/init.h> |
18 | 19 | ||
19 | #include <asm/ptrace.h> | 20 | #include <asm/ptrace.h> |
diff --git a/arch/alpha/kernel/sys_rx164.c b/arch/alpha/kernel/sys_rx164.c index ce1faa6f1df1..fc9246373452 100644 --- a/arch/alpha/kernel/sys_rx164.c +++ b/arch/alpha/kernel/sys_rx164.c | |||
@@ -72,7 +72,7 @@ rx164_end_irq(unsigned int irq) | |||
72 | rx164_enable_irq(irq); | 72 | rx164_enable_irq(irq); |
73 | } | 73 | } |
74 | 74 | ||
75 | static struct hw_interrupt_type rx164_irq_type = { | 75 | static struct irq_chip rx164_irq_type = { |
76 | .typename = "RX164", | 76 | .typename = "RX164", |
77 | .startup = rx164_startup_irq, | 77 | .startup = rx164_startup_irq, |
78 | .shutdown = rx164_disable_irq, | 78 | .shutdown = rx164_disable_irq, |
diff --git a/arch/alpha/kernel/sys_sable.c b/arch/alpha/kernel/sys_sable.c index 9e263256a42d..426eb6906d01 100644 --- a/arch/alpha/kernel/sys_sable.c +++ b/arch/alpha/kernel/sys_sable.c | |||
@@ -501,7 +501,7 @@ sable_lynx_mask_and_ack_irq(unsigned int irq) | |||
501 | spin_unlock(&sable_lynx_irq_lock); | 501 | spin_unlock(&sable_lynx_irq_lock); |
502 | } | 502 | } |
503 | 503 | ||
504 | static struct hw_interrupt_type sable_lynx_irq_type = { | 504 | static struct irq_chip sable_lynx_irq_type = { |
505 | .typename = "SABLE/LYNX", | 505 | .typename = "SABLE/LYNX", |
506 | .startup = sable_lynx_startup_irq, | 506 | .startup = sable_lynx_startup_irq, |
507 | .shutdown = sable_lynx_disable_irq, | 507 | .shutdown = sable_lynx_disable_irq, |
diff --git a/arch/alpha/kernel/sys_takara.c b/arch/alpha/kernel/sys_takara.c index 9bd9a31450c6..830318c21661 100644 --- a/arch/alpha/kernel/sys_takara.c +++ b/arch/alpha/kernel/sys_takara.c | |||
@@ -74,7 +74,7 @@ takara_end_irq(unsigned int irq) | |||
74 | takara_enable_irq(irq); | 74 | takara_enable_irq(irq); |
75 | } | 75 | } |
76 | 76 | ||
77 | static struct hw_interrupt_type takara_irq_type = { | 77 | static struct irq_chip takara_irq_type = { |
78 | .typename = "TAKARA", | 78 | .typename = "TAKARA", |
79 | .startup = takara_startup_irq, | 79 | .startup = takara_startup_irq, |
80 | .shutdown = takara_disable_irq, | 80 | .shutdown = takara_disable_irq, |
diff --git a/arch/alpha/kernel/sys_titan.c b/arch/alpha/kernel/sys_titan.c index 8dd239ebdb9e..88978fc60f83 100644 --- a/arch/alpha/kernel/sys_titan.c +++ b/arch/alpha/kernel/sys_titan.c | |||
@@ -185,7 +185,7 @@ titan_srm_device_interrupt(unsigned long vector) | |||
185 | 185 | ||
186 | 186 | ||
187 | static void __init | 187 | static void __init |
188 | init_titan_irqs(struct hw_interrupt_type * ops, int imin, int imax) | 188 | init_titan_irqs(struct irq_chip * ops, int imin, int imax) |
189 | { | 189 | { |
190 | long i; | 190 | long i; |
191 | for (i = imin; i <= imax; ++i) { | 191 | for (i = imin; i <= imax; ++i) { |
@@ -194,7 +194,7 @@ init_titan_irqs(struct hw_interrupt_type * ops, int imin, int imax) | |||
194 | } | 194 | } |
195 | } | 195 | } |
196 | 196 | ||
197 | static struct hw_interrupt_type titan_irq_type = { | 197 | static struct irq_chip titan_irq_type = { |
198 | .typename = "TITAN", | 198 | .typename = "TITAN", |
199 | .startup = titan_startup_irq, | 199 | .startup = titan_startup_irq, |
200 | .shutdown = titan_disable_irq, | 200 | .shutdown = titan_disable_irq, |
diff --git a/arch/alpha/kernel/sys_wildfire.c b/arch/alpha/kernel/sys_wildfire.c index 42c3eede4d09..e91b4c3838a8 100644 --- a/arch/alpha/kernel/sys_wildfire.c +++ b/arch/alpha/kernel/sys_wildfire.c | |||
@@ -157,7 +157,7 @@ wildfire_end_irq(unsigned int irq) | |||
157 | wildfire_enable_irq(irq); | 157 | wildfire_enable_irq(irq); |
158 | } | 158 | } |
159 | 159 | ||
160 | static struct hw_interrupt_type wildfire_irq_type = { | 160 | static struct irq_chip wildfire_irq_type = { |
161 | .typename = "WILDFIRE", | 161 | .typename = "WILDFIRE", |
162 | .startup = wildfire_startup_irq, | 162 | .startup = wildfire_startup_irq, |
163 | .shutdown = wildfire_disable_irq, | 163 | .shutdown = wildfire_disable_irq, |
diff --git a/arch/alpha/mm/numa.c b/arch/alpha/mm/numa.c index a13de49d1265..0eab55749423 100644 --- a/arch/alpha/mm/numa.c +++ b/arch/alpha/mm/numa.c | |||
@@ -28,9 +28,9 @@ EXPORT_SYMBOL(node_data); | |||
28 | #define DBGDCONT(args...) | 28 | #define DBGDCONT(args...) |
29 | #endif | 29 | #endif |
30 | 30 | ||
31 | #define for_each_mem_cluster(memdesc, cluster, i) \ | 31 | #define for_each_mem_cluster(memdesc, _cluster, i) \ |
32 | for ((cluster) = (memdesc)->cluster, (i) = 0; \ | 32 | for ((_cluster) = (memdesc)->cluster, (i) = 0; \ |
33 | (i) < (memdesc)->numclusters; (i)++, (cluster)++) | 33 | (i) < (memdesc)->numclusters; (i)++, (_cluster)++) |
34 | 34 | ||
35 | static void __init show_mem_layout(void) | 35 | static void __init show_mem_layout(void) |
36 | { | 36 | { |
diff --git a/arch/arm/kernel/init_task.c b/arch/arm/kernel/init_task.c index e859af349467..3f470866bb89 100644 --- a/arch/arm/kernel/init_task.c +++ b/arch/arm/kernel/init_task.c | |||
@@ -14,10 +14,6 @@ | |||
14 | 14 | ||
15 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 15 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
16 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 16 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
17 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
18 | |||
19 | EXPORT_SYMBOL(init_mm); | ||
20 | |||
21 | /* | 17 | /* |
22 | * Initial thread structure. | 18 | * Initial thread structure. |
23 | * | 19 | * |
diff --git a/arch/arm/mach-pxa/pcm990-baseboard.c b/arch/arm/mach-pxa/pcm990-baseboard.c index 095521e9ee24..01791d74e08e 100644 --- a/arch/arm/mach-pxa/pcm990-baseboard.c +++ b/arch/arm/mach-pxa/pcm990-baseboard.c | |||
@@ -380,12 +380,12 @@ static struct pca953x_platform_data pca9536_data = { | |||
380 | .gpio_base = NR_BUILTIN_GPIO, | 380 | .gpio_base = NR_BUILTIN_GPIO, |
381 | }; | 381 | }; |
382 | 382 | ||
383 | static int gpio_bus_switch; | 383 | static int gpio_bus_switch = -EINVAL; |
384 | 384 | ||
385 | static int pcm990_camera_set_bus_param(struct soc_camera_link *link, | 385 | static int pcm990_camera_set_bus_param(struct soc_camera_link *link, |
386 | unsigned long flags) | 386 | unsigned long flags) |
387 | { | 387 | { |
388 | if (gpio_bus_switch <= 0) { | 388 | if (gpio_bus_switch < 0) { |
389 | if (flags == SOCAM_DATAWIDTH_10) | 389 | if (flags == SOCAM_DATAWIDTH_10) |
390 | return 0; | 390 | return 0; |
391 | else | 391 | else |
@@ -404,25 +404,34 @@ static unsigned long pcm990_camera_query_bus_param(struct soc_camera_link *link) | |||
404 | { | 404 | { |
405 | int ret; | 405 | int ret; |
406 | 406 | ||
407 | if (!gpio_bus_switch) { | 407 | if (gpio_bus_switch < 0) { |
408 | ret = gpio_request(NR_BUILTIN_GPIO, "camera"); | 408 | ret = gpio_request(NR_BUILTIN_GPIO, "camera"); |
409 | if (!ret) { | 409 | if (!ret) { |
410 | gpio_bus_switch = NR_BUILTIN_GPIO; | 410 | gpio_bus_switch = NR_BUILTIN_GPIO; |
411 | gpio_direction_output(gpio_bus_switch, 0); | 411 | gpio_direction_output(gpio_bus_switch, 0); |
412 | } else | 412 | } |
413 | gpio_bus_switch = -EINVAL; | ||
414 | } | 413 | } |
415 | 414 | ||
416 | if (gpio_bus_switch > 0) | 415 | if (gpio_bus_switch >= 0) |
417 | return SOCAM_DATAWIDTH_8 | SOCAM_DATAWIDTH_10; | 416 | return SOCAM_DATAWIDTH_8 | SOCAM_DATAWIDTH_10; |
418 | else | 417 | else |
419 | return SOCAM_DATAWIDTH_10; | 418 | return SOCAM_DATAWIDTH_10; |
420 | } | 419 | } |
421 | 420 | ||
421 | static void pcm990_camera_free_bus(struct soc_camera_link *link) | ||
422 | { | ||
423 | if (gpio_bus_switch < 0) | ||
424 | return; | ||
425 | |||
426 | gpio_free(gpio_bus_switch); | ||
427 | gpio_bus_switch = -EINVAL; | ||
428 | } | ||
429 | |||
422 | static struct soc_camera_link iclink = { | 430 | static struct soc_camera_link iclink = { |
423 | .bus_id = 0, /* Must match with the camera ID above */ | 431 | .bus_id = 0, /* Must match with the camera ID above */ |
424 | .query_bus_param = pcm990_camera_query_bus_param, | 432 | .query_bus_param = pcm990_camera_query_bus_param, |
425 | .set_bus_param = pcm990_camera_set_bus_param, | 433 | .set_bus_param = pcm990_camera_set_bus_param, |
434 | .free_bus = pcm990_camera_free_bus, | ||
426 | }; | 435 | }; |
427 | 436 | ||
428 | /* Board I2C devices. */ | 437 | /* Board I2C devices. */ |
diff --git a/arch/arm/plat-s3c/include/plat/regs-usb-hsotg-phy.h b/arch/arm/plat-s3c/include/plat/regs-usb-hsotg-phy.h new file mode 100644 index 000000000000..36a85f5000c8 --- /dev/null +++ b/arch/arm/plat-s3c/include/plat/regs-usb-hsotg-phy.h | |||
@@ -0,0 +1,50 @@ | |||
1 | /* arch/arm/plat-s3c/include/plat/regs-usb-hsotg-phy.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * http://armlinux.simtec.co.uk/ | ||
6 | * Ben Dooks <ben@simtec.co.uk> | ||
7 | * | ||
8 | * S3C - USB2.0 Highspeed/OtG device PHY registers | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | /* Note, this is a seperate header file as some of the clock framework | ||
16 | * needs to touch this if the clk_48m is used as the USB OHCI or other | ||
17 | * peripheral source. | ||
18 | */ | ||
19 | |||
20 | #ifndef __PLAT_S3C64XX_REGS_USB_HSOTG_PHY_H | ||
21 | #define __PLAT_S3C64XX_REGS_USB_HSOTG_PHY_H __FILE__ | ||
22 | |||
23 | /* S3C64XX_PA_USB_HSPHY */ | ||
24 | |||
25 | #define S3C_HSOTG_PHYREG(x) ((x) + S3C_VA_USB_HSPHY) | ||
26 | |||
27 | #define S3C_PHYPWR S3C_HSOTG_PHYREG(0x00) | ||
28 | #define SRC_PHYPWR_OTG_DISABLE (1 << 4) | ||
29 | #define SRC_PHYPWR_ANALOG_POWERDOWN (1 << 3) | ||
30 | #define SRC_PHYPWR_FORCE_SUSPEND (1 << 1) | ||
31 | |||
32 | #define S3C_PHYCLK S3C_HSOTG_PHYREG(0x04) | ||
33 | #define S3C_PHYCLK_MODE_USB11 (1 << 6) | ||
34 | #define S3C_PHYCLK_EXT_OSC (1 << 5) | ||
35 | #define S3C_PHYCLK_CLK_FORCE (1 << 4) | ||
36 | #define S3C_PHYCLK_ID_PULL (1 << 2) | ||
37 | #define S3C_PHYCLK_CLKSEL_MASK (0x3 << 0) | ||
38 | #define S3C_PHYCLK_CLKSEL_SHIFT (0) | ||
39 | #define S3C_PHYCLK_CLKSEL_48M (0x0 << 0) | ||
40 | #define S3C_PHYCLK_CLKSEL_12M (0x2 << 0) | ||
41 | #define S3C_PHYCLK_CLKSEL_24M (0x3 << 0) | ||
42 | |||
43 | #define S3C_RSTCON S3C_HSOTG_PHYREG(0x08) | ||
44 | #define S3C_RSTCON_PHYCLK (1 << 2) | ||
45 | #define S3C_RSTCON_HCLK (1 << 2) | ||
46 | #define S3C_RSTCON_PHY (1 << 0) | ||
47 | |||
48 | #define S3C_PHYTUNE S3C_HSOTG_PHYREG(0x20) | ||
49 | |||
50 | #endif /* __PLAT_S3C64XX_REGS_USB_HSOTG_PHY_H */ | ||
diff --git a/arch/arm/plat-s3c/include/plat/regs-usb-hsotg.h b/arch/arm/plat-s3c/include/plat/regs-usb-hsotg.h new file mode 100644 index 000000000000..8d18d9d4d148 --- /dev/null +++ b/arch/arm/plat-s3c/include/plat/regs-usb-hsotg.h | |||
@@ -0,0 +1,377 @@ | |||
1 | /* arch/arm/plat-s3c/include/plat/regs-usb-hsotg.h | ||
2 | * | ||
3 | * Copyright 2008 Openmoko, Inc. | ||
4 | * Copyright 2008 Simtec Electronics | ||
5 | * http://armlinux.simtec.co.uk/ | ||
6 | * Ben Dooks <ben@simtec.co.uk> | ||
7 | * | ||
8 | * S3C - USB2.0 Highspeed/OtG device block registers | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
14 | |||
15 | #ifndef __PLAT_S3C64XX_REGS_USB_HSOTG_H | ||
16 | #define __PLAT_S3C64XX_REGS_USB_HSOTG_H __FILE__ | ||
17 | |||
18 | #define S3C_HSOTG_REG(x) (x) | ||
19 | |||
20 | #define S3C_GOTGCTL S3C_HSOTG_REG(0x000) | ||
21 | #define S3C_GOTGCTL_BSESVLD (1 << 19) | ||
22 | #define S3C_GOTGCTL_ASESVLD (1 << 18) | ||
23 | #define S3C_GOTGCTL_DBNC_SHORT (1 << 17) | ||
24 | #define S3C_GOTGCTL_CONID_B (1 << 16) | ||
25 | #define S3C_GOTGCTL_DEVHNPEN (1 << 11) | ||
26 | #define S3C_GOTGCTL_HSSETHNPEN (1 << 10) | ||
27 | #define S3C_GOTGCTL_HNPREQ (1 << 9) | ||
28 | #define S3C_GOTGCTL_HSTNEGSCS (1 << 8) | ||
29 | #define S3C_GOTGCTL_SESREQ (1 << 1) | ||
30 | #define S3C_GOTGCTL_SESREQSCS (1 << 0) | ||
31 | |||
32 | #define S3C_GOTGINT S3C_HSOTG_REG(0x004) | ||
33 | #define S3C_GOTGINT_DbnceDone (1 << 19) | ||
34 | #define S3C_GOTGINT_ADevTOUTChg (1 << 18) | ||
35 | #define S3C_GOTGINT_HstNegDet (1 << 17) | ||
36 | #define S3C_GOTGINT_HstnegSucStsChng (1 << 9) | ||
37 | #define S3C_GOTGINT_SesReqSucStsChng (1 << 8) | ||
38 | #define S3C_GOTGINT_SesEndDet (1 << 2) | ||
39 | |||
40 | #define S3C_GAHBCFG S3C_HSOTG_REG(0x008) | ||
41 | #define S3C_GAHBCFG_PTxFEmpLvl (1 << 8) | ||
42 | #define S3C_GAHBCFG_NPTxFEmpLvl (1 << 7) | ||
43 | #define S3C_GAHBCFG_DMAEn (1 << 5) | ||
44 | #define S3C_GAHBCFG_HBstLen_MASK (0xf << 1) | ||
45 | #define S3C_GAHBCFG_HBstLen_SHIFT (1) | ||
46 | #define S3C_GAHBCFG_HBstLen_Single (0x0 << 1) | ||
47 | #define S3C_GAHBCFG_HBstLen_Incr (0x1 << 1) | ||
48 | #define S3C_GAHBCFG_HBstLen_Incr4 (0x3 << 1) | ||
49 | #define S3C_GAHBCFG_HBstLen_Incr8 (0x5 << 1) | ||
50 | #define S3C_GAHBCFG_HBstLen_Incr16 (0x7 << 1) | ||
51 | #define S3C_GAHBCFG_GlblIntrEn (1 << 0) | ||
52 | |||
53 | #define S3C_GUSBCFG S3C_HSOTG_REG(0x00C) | ||
54 | #define S3C_GUSBCFG_PHYLPClkSel (1 << 15) | ||
55 | #define S3C_GUSBCFG_HNPCap (1 << 9) | ||
56 | #define S3C_GUSBCFG_SRPCap (1 << 8) | ||
57 | #define S3C_GUSBCFG_PHYIf16 (1 << 3) | ||
58 | #define S3C_GUSBCFG_TOutCal_MASK (0x7 << 0) | ||
59 | #define S3C_GUSBCFG_TOutCal_SHIFT (0) | ||
60 | #define S3C_GUSBCFG_TOutCal_LIMIT (0x7) | ||
61 | #define S3C_GUSBCFG_TOutCal(_x) ((_x) << 0) | ||
62 | |||
63 | #define S3C_GRSTCTL S3C_HSOTG_REG(0x010) | ||
64 | |||
65 | #define S3C_GRSTCTL_AHBIdle (1 << 31) | ||
66 | #define S3C_GRSTCTL_DMAReq (1 << 30) | ||
67 | #define S3C_GRSTCTL_TxFNum_MASK (0x1f << 6) | ||
68 | #define S3C_GRSTCTL_TxFNum_SHIFT (6) | ||
69 | #define S3C_GRSTCTL_TxFNum_LIMIT (0x1f) | ||
70 | #define S3C_GRSTCTL_TxFNum(_x) ((_x) << 6) | ||
71 | #define S3C_GRSTCTL_TxFFlsh (1 << 5) | ||
72 | #define S3C_GRSTCTL_RxFFlsh (1 << 4) | ||
73 | #define S3C_GRSTCTL_INTknQFlsh (1 << 3) | ||
74 | #define S3C_GRSTCTL_FrmCntrRst (1 << 2) | ||
75 | #define S3C_GRSTCTL_HSftRst (1 << 1) | ||
76 | #define S3C_GRSTCTL_CSftRst (1 << 0) | ||
77 | |||
78 | #define S3C_GINTSTS S3C_HSOTG_REG(0x014) | ||
79 | #define S3C_GINTMSK S3C_HSOTG_REG(0x018) | ||
80 | |||
81 | #define S3C_GINTSTS_WkUpInt (1 << 31) | ||
82 | #define S3C_GINTSTS_SessReqInt (1 << 30) | ||
83 | #define S3C_GINTSTS_DisconnInt (1 << 29) | ||
84 | #define S3C_GINTSTS_ConIDStsChng (1 << 28) | ||
85 | #define S3C_GINTSTS_PTxFEmp (1 << 26) | ||
86 | #define S3C_GINTSTS_HChInt (1 << 25) | ||
87 | #define S3C_GINTSTS_PrtInt (1 << 24) | ||
88 | #define S3C_GINTSTS_FetSusp (1 << 22) | ||
89 | #define S3C_GINTSTS_incompIP (1 << 21) | ||
90 | #define S3C_GINTSTS_IncomplSOIN (1 << 20) | ||
91 | #define S3C_GINTSTS_OEPInt (1 << 19) | ||
92 | #define S3C_GINTSTS_IEPInt (1 << 18) | ||
93 | #define S3C_GINTSTS_EPMis (1 << 17) | ||
94 | #define S3C_GINTSTS_EOPF (1 << 15) | ||
95 | #define S3C_GINTSTS_ISOutDrop (1 << 14) | ||
96 | #define S3C_GINTSTS_EnumDone (1 << 13) | ||
97 | #define S3C_GINTSTS_USBRst (1 << 12) | ||
98 | #define S3C_GINTSTS_USBSusp (1 << 11) | ||
99 | #define S3C_GINTSTS_ErlySusp (1 << 10) | ||
100 | #define S3C_GINTSTS_GOUTNakEff (1 << 7) | ||
101 | #define S3C_GINTSTS_GINNakEff (1 << 6) | ||
102 | #define S3C_GINTSTS_NPTxFEmp (1 << 5) | ||
103 | #define S3C_GINTSTS_RxFLvl (1 << 4) | ||
104 | #define S3C_GINTSTS_SOF (1 << 3) | ||
105 | #define S3C_GINTSTS_OTGInt (1 << 2) | ||
106 | #define S3C_GINTSTS_ModeMis (1 << 1) | ||
107 | #define S3C_GINTSTS_CurMod_Host (1 << 0) | ||
108 | |||
109 | #define S3C_GRXSTSR S3C_HSOTG_REG(0x01C) | ||
110 | #define S3C_GRXSTSP S3C_HSOTG_REG(0x020) | ||
111 | |||
112 | #define S3C_GRXSTS_FN_MASK (0x7f << 25) | ||
113 | #define S3C_GRXSTS_FN_SHIFT (25) | ||
114 | |||
115 | #define S3C_GRXSTS_PktSts_MASK (0xf << 17) | ||
116 | #define S3C_GRXSTS_PktSts_SHIFT (17) | ||
117 | #define S3C_GRXSTS_PktSts_GlobalOutNAK (0x1 << 17) | ||
118 | #define S3C_GRXSTS_PktSts_OutRX (0x2 << 17) | ||
119 | #define S3C_GRXSTS_PktSts_OutDone (0x3 << 17) | ||
120 | #define S3C_GRXSTS_PktSts_SetupDone (0x4 << 17) | ||
121 | #define S3C_GRXSTS_PktSts_SetupRX (0x6 << 17) | ||
122 | |||
123 | #define S3C_GRXSTS_DPID_MASK (0x3 << 15) | ||
124 | #define S3C_GRXSTS_DPID_SHIFT (15) | ||
125 | #define S3C_GRXSTS_ByteCnt_MASK (0x7ff << 4) | ||
126 | #define S3C_GRXSTS_ByteCnt_SHIFT (4) | ||
127 | #define S3C_GRXSTS_EPNum_MASK (0xf << 0) | ||
128 | #define S3C_GRXSTS_EPNum_SHIFT (0) | ||
129 | |||
130 | #define S3C_GRXFSIZ S3C_HSOTG_REG(0x024) | ||
131 | |||
132 | #define S3C_GNPTXFSIZ S3C_HSOTG_REG(0x028) | ||
133 | |||
134 | #define S3C_GNPTXFSIZ_NPTxFDep_MASK (0xffff << 16) | ||
135 | #define S3C_GNPTXFSIZ_NPTxFDep_SHIFT (16) | ||
136 | #define S3C_GNPTXFSIZ_NPTxFDep_LIMIT (0xffff) | ||
137 | #define S3C_GNPTXFSIZ_NPTxFDep(_x) ((_x) << 16) | ||
138 | #define S3C_GNPTXFSIZ_NPTxFStAddr_MASK (0xffff << 0) | ||
139 | #define S3C_GNPTXFSIZ_NPTxFStAddr_SHIFT (0) | ||
140 | #define S3C_GNPTXFSIZ_NPTxFStAddr_LIMIT (0xffff) | ||
141 | #define S3C_GNPTXFSIZ_NPTxFStAddr(_x) ((_x) << 0) | ||
142 | |||
143 | #define S3C_GNPTXSTS S3C_HSOTG_REG(0x02C) | ||
144 | |||
145 | #define S3C_GNPTXSTS_NPtxQTop_MASK (0x7f << 24) | ||
146 | #define S3C_GNPTXSTS_NPtxQTop_SHIFT (24) | ||
147 | |||
148 | #define S3C_GNPTXSTS_NPTxQSpcAvail_MASK (0xff << 16) | ||
149 | #define S3C_GNPTXSTS_NPTxQSpcAvail_SHIFT (16) | ||
150 | #define S3C_GNPTXSTS_NPTxQSpcAvail_GET(_v) (((_v) >> 16) & 0xff) | ||
151 | |||
152 | #define S3C_GNPTXSTS_NPTxFSpcAvail_MASK (0xffff << 0) | ||
153 | #define S3C_GNPTXSTS_NPTxFSpcAvail_SHIFT (0) | ||
154 | #define S3C_GNPTXSTS_NPTxFSpcAvail_GET(_v) (((_v) >> 0) & 0xffff) | ||
155 | |||
156 | |||
157 | #define S3C_HPTXFSIZ S3C_HSOTG_REG(0x100) | ||
158 | |||
159 | #define S3C_DPTXFSIZn(_a) S3C_HSOTG_REG(0x104 + (((_a) - 1) * 4)) | ||
160 | |||
161 | #define S3C_DPTXFSIZn_DPTxFSize_MASK (0xffff << 16) | ||
162 | #define S3C_DPTXFSIZn_DPTxFSize_SHIFT (16) | ||
163 | #define S3C_DPTXFSIZn_DPTxFSize_GET(_v) (((_v) >> 16) & 0xffff) | ||
164 | #define S3C_DPTXFSIZn_DPTxFSize_LIMIT (0xffff) | ||
165 | #define S3C_DPTXFSIZn_DPTxFSize(_x) ((_x) << 16) | ||
166 | |||
167 | #define S3C_DPTXFSIZn_DPTxFStAddr_MASK (0xffff << 0) | ||
168 | #define S3C_DPTXFSIZn_DPTxFStAddr_SHIFT (0) | ||
169 | |||
170 | /* Device mode registers */ | ||
171 | #define S3C_DCFG S3C_HSOTG_REG(0x800) | ||
172 | |||
173 | #define S3C_DCFG_EPMisCnt_MASK (0x1f << 18) | ||
174 | #define S3C_DCFG_EPMisCnt_SHIFT (18) | ||
175 | #define S3C_DCFG_EPMisCnt_LIMIT (0x1f) | ||
176 | #define S3C_DCFG_EPMisCnt(_x) ((_x) << 18) | ||
177 | |||
178 | #define S3C_DCFG_PerFrInt_MASK (0x3 << 11) | ||
179 | #define S3C_DCFG_PerFrInt_SHIFT (11) | ||
180 | #define S3C_DCFG_PerFrInt_LIMIT (0x3) | ||
181 | #define S3C_DCFG_PerFrInt(_x) ((_x) << 11) | ||
182 | |||
183 | #define S3C_DCFG_DevAddr_MASK (0x7f << 4) | ||
184 | #define S3C_DCFG_DevAddr_SHIFT (4) | ||
185 | #define S3C_DCFG_DevAddr_LIMIT (0x7f) | ||
186 | #define S3C_DCFG_DevAddr(_x) ((_x) << 4) | ||
187 | |||
188 | #define S3C_DCFG_NZStsOUTHShk (1 << 2) | ||
189 | |||
190 | #define S3C_DCFG_DevSpd_MASK (0x3 << 0) | ||
191 | #define S3C_DCFG_DevSpd_SHIFT (0) | ||
192 | #define S3C_DCFG_DevSpd_HS (0x0 << 0) | ||
193 | #define S3C_DCFG_DevSpd_FS (0x1 << 0) | ||
194 | #define S3C_DCFG_DevSpd_LS (0x2 << 0) | ||
195 | #define S3C_DCFG_DevSpd_FS48 (0x3 << 0) | ||
196 | |||
197 | #define S3C_DCTL S3C_HSOTG_REG(0x804) | ||
198 | |||
199 | #define S3C_DCTL_PWROnPrgDone (1 << 11) | ||
200 | #define S3C_DCTL_CGOUTNak (1 << 10) | ||
201 | #define S3C_DCTL_SGOUTNak (1 << 9) | ||
202 | #define S3C_DCTL_CGNPInNAK (1 << 8) | ||
203 | #define S3C_DCTL_SGNPInNAK (1 << 7) | ||
204 | #define S3C_DCTL_TstCtl_MASK (0x7 << 4) | ||
205 | #define S3C_DCTL_TstCtl_SHIFT (4) | ||
206 | #define S3C_DCTL_GOUTNakSts (1 << 3) | ||
207 | #define S3C_DCTL_GNPINNakSts (1 << 2) | ||
208 | #define S3C_DCTL_SftDiscon (1 << 1) | ||
209 | #define S3C_DCTL_RmtWkUpSig (1 << 0) | ||
210 | |||
211 | #define S3C_DSTS S3C_HSOTG_REG(0x808) | ||
212 | |||
213 | #define S3C_DSTS_SOFFN_MASK (0x3fff << 8) | ||
214 | #define S3C_DSTS_SOFFN_SHIFT (8) | ||
215 | #define S3C_DSTS_SOFFN_LIMIT (0x3fff) | ||
216 | #define S3C_DSTS_SOFFN(_x) ((_x) << 8) | ||
217 | #define S3C_DSTS_ErraticErr (1 << 3) | ||
218 | #define S3C_DSTS_EnumSpd_MASK (0x3 << 1) | ||
219 | #define S3C_DSTS_EnumSpd_SHIFT (1) | ||
220 | #define S3C_DSTS_EnumSpd_HS (0x0 << 1) | ||
221 | #define S3C_DSTS_EnumSpd_FS (0x1 << 1) | ||
222 | #define S3C_DSTS_EnumSpd_LS (0x2 << 1) | ||
223 | #define S3C_DSTS_EnumSpd_FS48 (0x3 << 1) | ||
224 | |||
225 | #define S3C_DSTS_SuspSts (1 << 0) | ||
226 | |||
227 | #define S3C_DIEPMSK S3C_HSOTG_REG(0x810) | ||
228 | |||
229 | #define S3C_DIEPMSK_INEPNakEffMsk (1 << 6) | ||
230 | #define S3C_DIEPMSK_INTknEPMisMsk (1 << 5) | ||
231 | #define S3C_DIEPMSK_INTknTXFEmpMsk (1 << 4) | ||
232 | #define S3C_DIEPMSK_TimeOUTMsk (1 << 3) | ||
233 | #define S3C_DIEPMSK_AHBErrMsk (1 << 2) | ||
234 | #define S3C_DIEPMSK_EPDisbldMsk (1 << 1) | ||
235 | #define S3C_DIEPMSK_XferComplMsk (1 << 0) | ||
236 | |||
237 | #define S3C_DOEPMSK S3C_HSOTG_REG(0x814) | ||
238 | |||
239 | #define S3C_DOEPMSK_Back2BackSetup (1 << 6) | ||
240 | #define S3C_DOEPMSK_OUTTknEPdisMsk (1 << 4) | ||
241 | #define S3C_DOEPMSK_SetupMsk (1 << 3) | ||
242 | #define S3C_DOEPMSK_AHBErrMsk (1 << 2) | ||
243 | #define S3C_DOEPMSK_EPDisbldMsk (1 << 1) | ||
244 | #define S3C_DOEPMSK_XferComplMsk (1 << 0) | ||
245 | |||
246 | #define S3C_DAINT S3C_HSOTG_REG(0x818) | ||
247 | #define S3C_DAINTMSK S3C_HSOTG_REG(0x81C) | ||
248 | |||
249 | #define S3C_DAINT_OutEP_SHIFT (16) | ||
250 | #define S3C_DAINT_OutEP(x) (1 << ((x) + 16)) | ||
251 | #define S3C_DAINT_InEP(x) (1 << (x)) | ||
252 | |||
253 | #define S3C_DTKNQR1 S3C_HSOTG_REG(0x820) | ||
254 | #define S3C_DTKNQR2 S3C_HSOTG_REG(0x824) | ||
255 | #define S3C_DTKNQR3 S3C_HSOTG_REG(0x830) | ||
256 | #define S3C_DTKNQR4 S3C_HSOTG_REG(0x834) | ||
257 | |||
258 | #define S3C_DVBUSDIS S3C_HSOTG_REG(0x828) | ||
259 | #define S3C_DVBUSPULSE S3C_HSOTG_REG(0x82C) | ||
260 | |||
261 | #define S3C_DIEPCTL0 S3C_HSOTG_REG(0x900) | ||
262 | #define S3C_DOEPCTL0 S3C_HSOTG_REG(0xB00) | ||
263 | #define S3C_DIEPCTL(_a) S3C_HSOTG_REG(0x900 + ((_a) * 0x20)) | ||
264 | #define S3C_DOEPCTL(_a) S3C_HSOTG_REG(0xB00 + ((_a) * 0x20)) | ||
265 | |||
266 | /* EP0 specialness: | ||
267 | * bits[29..28] - reserved (no SetD0PID, SetD1PID) | ||
268 | * bits[25..22] - should always be zero, this isn't a periodic endpoint | ||
269 | * bits[10..0] - MPS setting differenct for EP0 | ||
270 | */ | ||
271 | #define S3C_D0EPCTL_MPS_MASK (0x3 << 0) | ||
272 | #define S3C_D0EPCTL_MPS_SHIFT (0) | ||
273 | #define S3C_D0EPCTL_MPS_64 (0x0 << 0) | ||
274 | #define S3C_D0EPCTL_MPS_32 (0x1 << 0) | ||
275 | #define S3C_D0EPCTL_MPS_16 (0x2 << 0) | ||
276 | #define S3C_D0EPCTL_MPS_8 (0x3 << 0) | ||
277 | |||
278 | #define S3C_DxEPCTL_EPEna (1 << 31) | ||
279 | #define S3C_DxEPCTL_EPDis (1 << 30) | ||
280 | #define S3C_DxEPCTL_SetD1PID (1 << 29) | ||
281 | #define S3C_DxEPCTL_SetOddFr (1 << 29) | ||
282 | #define S3C_DxEPCTL_SetD0PID (1 << 28) | ||
283 | #define S3C_DxEPCTL_SetEvenFr (1 << 28) | ||
284 | #define S3C_DxEPCTL_SNAK (1 << 27) | ||
285 | #define S3C_DxEPCTL_CNAK (1 << 26) | ||
286 | #define S3C_DxEPCTL_TxFNum_MASK (0xf << 22) | ||
287 | #define S3C_DxEPCTL_TxFNum_SHIFT (22) | ||
288 | #define S3C_DxEPCTL_TxFNum_LIMIT (0xf) | ||
289 | #define S3C_DxEPCTL_TxFNum(_x) ((_x) << 22) | ||
290 | |||
291 | #define S3C_DxEPCTL_Stall (1 << 21) | ||
292 | #define S3C_DxEPCTL_Snp (1 << 20) | ||
293 | #define S3C_DxEPCTL_EPType_MASK (0x3 << 18) | ||
294 | #define S3C_DxEPCTL_EPType_SHIFT (18) | ||
295 | #define S3C_DxEPCTL_EPType_Control (0x0 << 18) | ||
296 | #define S3C_DxEPCTL_EPType_Iso (0x1 << 18) | ||
297 | #define S3C_DxEPCTL_EPType_Bulk (0x2 << 18) | ||
298 | #define S3C_DxEPCTL_EPType_Intterupt (0x3 << 18) | ||
299 | |||
300 | #define S3C_DxEPCTL_NAKsts (1 << 17) | ||
301 | #define S3C_DxEPCTL_DPID (1 << 16) | ||
302 | #define S3C_DxEPCTL_EOFrNum (1 << 16) | ||
303 | #define S3C_DxEPCTL_USBActEp (1 << 15) | ||
304 | #define S3C_DxEPCTL_NextEp_MASK (0xf << 11) | ||
305 | #define S3C_DxEPCTL_NextEp_SHIFT (11) | ||
306 | #define S3C_DxEPCTL_NextEp_LIMIT (0xf) | ||
307 | #define S3C_DxEPCTL_NextEp(_x) ((_x) << 11) | ||
308 | |||
309 | #define S3C_DxEPCTL_MPS_MASK (0x7ff << 0) | ||
310 | #define S3C_DxEPCTL_MPS_SHIFT (0) | ||
311 | #define S3C_DxEPCTL_MPS_LIMIT (0x7ff) | ||
312 | #define S3C_DxEPCTL_MPS(_x) ((_x) << 0) | ||
313 | |||
314 | #define S3C_DIEPINT(_a) S3C_HSOTG_REG(0x908 + ((_a) * 0x20)) | ||
315 | #define S3C_DOEPINT(_a) S3C_HSOTG_REG(0xB08 + ((_a) * 0x20)) | ||
316 | |||
317 | #define S3C_DxEPINT_INEPNakEff (1 << 6) | ||
318 | #define S3C_DxEPINT_Back2BackSetup (1 << 6) | ||
319 | #define S3C_DxEPINT_INTknEPMis (1 << 5) | ||
320 | #define S3C_DxEPINT_INTknTXFEmp (1 << 4) | ||
321 | #define S3C_DxEPINT_OUTTknEPdis (1 << 4) | ||
322 | #define S3C_DxEPINT_Timeout (1 << 3) | ||
323 | #define S3C_DxEPINT_Setup (1 << 3) | ||
324 | #define S3C_DxEPINT_AHBErr (1 << 2) | ||
325 | #define S3C_DxEPINT_EPDisbld (1 << 1) | ||
326 | #define S3C_DxEPINT_XferCompl (1 << 0) | ||
327 | |||
328 | #define S3C_DIEPTSIZ0 S3C_HSOTG_REG(0x910) | ||
329 | |||
330 | #define S3C_DIEPTSIZ0_PktCnt_MASK (0x3 << 19) | ||
331 | #define S3C_DIEPTSIZ0_PktCnt_SHIFT (19) | ||
332 | #define S3C_DIEPTSIZ0_PktCnt_LIMIT (0x3) | ||
333 | #define S3C_DIEPTSIZ0_PktCnt(_x) ((_x) << 19) | ||
334 | |||
335 | #define S3C_DIEPTSIZ0_XferSize_MASK (0x7f << 0) | ||
336 | #define S3C_DIEPTSIZ0_XferSize_SHIFT (0) | ||
337 | #define S3C_DIEPTSIZ0_XferSize_LIMIT (0x7f) | ||
338 | #define S3C_DIEPTSIZ0_XferSize(_x) ((_x) << 0) | ||
339 | |||
340 | |||
341 | #define DOEPTSIZ0 S3C_HSOTG_REG(0xB10) | ||
342 | #define S3C_DOEPTSIZ0_SUPCnt_MASK (0x3 << 29) | ||
343 | #define S3C_DOEPTSIZ0_SUPCnt_SHIFT (29) | ||
344 | #define S3C_DOEPTSIZ0_SUPCnt_LIMIT (0x3) | ||
345 | #define S3C_DOEPTSIZ0_SUPCnt(_x) ((_x) << 29) | ||
346 | |||
347 | #define S3C_DOEPTSIZ0_PktCnt (1 << 19) | ||
348 | #define S3C_DOEPTSIZ0_XferSize_MASK (0x7f << 0) | ||
349 | #define S3C_DOEPTSIZ0_XferSize_SHIFT (0) | ||
350 | |||
351 | #define S3C_DIEPTSIZ(_a) S3C_HSOTG_REG(0x910 + ((_a) * 0x20)) | ||
352 | #define S3C_DOEPTSIZ(_a) S3C_HSOTG_REG(0xB10 + ((_a) * 0x20)) | ||
353 | |||
354 | #define S3C_DxEPTSIZ_MC_MASK (0x3 << 29) | ||
355 | #define S3C_DxEPTSIZ_MC_SHIFT (29) | ||
356 | #define S3C_DxEPTSIZ_MC_LIMIT (0x3) | ||
357 | #define S3C_DxEPTSIZ_MC(_x) ((_x) << 29) | ||
358 | |||
359 | #define S3C_DxEPTSIZ_PktCnt_MASK (0x3ff << 19) | ||
360 | #define S3C_DxEPTSIZ_PktCnt_SHIFT (19) | ||
361 | #define S3C_DxEPTSIZ_PktCnt_GET(_v) (((_v) >> 19) & 0x3ff) | ||
362 | #define S3C_DxEPTSIZ_PktCnt_LIMIT (0x3ff) | ||
363 | #define S3C_DxEPTSIZ_PktCnt(_x) ((_x) << 19) | ||
364 | |||
365 | #define S3C_DxEPTSIZ_XferSize_MASK (0x7ffff << 0) | ||
366 | #define S3C_DxEPTSIZ_XferSize_SHIFT (0) | ||
367 | #define S3C_DxEPTSIZ_XferSize_GET(_v) (((_v) >> 0) & 0x7ffff) | ||
368 | #define S3C_DxEPTSIZ_XferSize_LIMIT (0x7ffff) | ||
369 | #define S3C_DxEPTSIZ_XferSize(_x) ((_x) << 0) | ||
370 | |||
371 | |||
372 | #define S3C_DIEPDMA(_a) S3C_HSOTG_REG(0x914 + ((_a) * 0x20)) | ||
373 | #define S3C_DOEPDMA(_a) S3C_HSOTG_REG(0xB14 + ((_a) * 0x20)) | ||
374 | |||
375 | #define S3C_EPFIFO(_a) S3C_HSOTG_REG(0x1000 + ((_a) * 0x1000)) | ||
376 | |||
377 | #endif /* __PLAT_S3C64XX_REGS_USB_HSOTG_H */ | ||
diff --git a/arch/avr32/kernel/init_task.c b/arch/avr32/kernel/init_task.c index 993d56ee3cf3..57ec9f2dcd95 100644 --- a/arch/avr32/kernel/init_task.c +++ b/arch/avr32/kernel/init_task.c | |||
@@ -15,10 +15,6 @@ | |||
15 | 15 | ||
16 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 16 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
17 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 17 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
18 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
19 | |||
20 | EXPORT_SYMBOL(init_mm); | ||
21 | |||
22 | /* | 18 | /* |
23 | * Initial thread structure. Must be aligned on an 8192-byte boundary. | 19 | * Initial thread structure. Must be aligned on an 8192-byte boundary. |
24 | */ | 20 | */ |
diff --git a/arch/blackfin/Kconfig b/arch/blackfin/Kconfig index a60cfe757914..8ea0d942cdea 100644 --- a/arch/blackfin/Kconfig +++ b/arch/blackfin/Kconfig | |||
@@ -6,59 +6,65 @@ | |||
6 | mainmenu "Blackfin Kernel Configuration" | 6 | mainmenu "Blackfin Kernel Configuration" |
7 | 7 | ||
8 | config MMU | 8 | config MMU |
9 | bool | 9 | def_bool n |
10 | default n | ||
11 | 10 | ||
12 | config FPU | 11 | config FPU |
13 | bool | 12 | def_bool n |
14 | default n | ||
15 | 13 | ||
16 | config RWSEM_GENERIC_SPINLOCK | 14 | config RWSEM_GENERIC_SPINLOCK |
17 | bool | 15 | def_bool y |
18 | default y | ||
19 | 16 | ||
20 | config RWSEM_XCHGADD_ALGORITHM | 17 | config RWSEM_XCHGADD_ALGORITHM |
21 | bool | 18 | def_bool n |
22 | default n | ||
23 | 19 | ||
24 | config BLACKFIN | 20 | config BLACKFIN |
25 | bool | 21 | def_bool y |
26 | default y | 22 | select HAVE_FUNCTION_GRAPH_TRACER |
23 | select HAVE_FUNCTION_TRACER | ||
27 | select HAVE_IDE | 24 | select HAVE_IDE |
25 | select HAVE_KERNEL_GZIP | ||
26 | select HAVE_KERNEL_BZIP2 | ||
27 | select HAVE_KERNEL_LZMA | ||
28 | select HAVE_OPROFILE | 28 | select HAVE_OPROFILE |
29 | select ARCH_WANT_OPTIONAL_GPIOLIB | 29 | select ARCH_WANT_OPTIONAL_GPIOLIB |
30 | 30 | ||
31 | config GENERIC_BUG | ||
32 | def_bool y | ||
33 | depends on BUG | ||
34 | |||
31 | config ZONE_DMA | 35 | config ZONE_DMA |
32 | bool | 36 | def_bool y |
33 | default y | ||
34 | 37 | ||
35 | config GENERIC_FIND_NEXT_BIT | 38 | config GENERIC_FIND_NEXT_BIT |
36 | bool | 39 | def_bool y |
37 | default y | ||
38 | 40 | ||
39 | config GENERIC_HWEIGHT | 41 | config GENERIC_HWEIGHT |
40 | bool | 42 | def_bool y |
41 | default y | ||
42 | 43 | ||
43 | config GENERIC_HARDIRQS | 44 | config GENERIC_HARDIRQS |
44 | bool | 45 | def_bool y |
45 | default y | ||
46 | 46 | ||
47 | config GENERIC_IRQ_PROBE | 47 | config GENERIC_IRQ_PROBE |
48 | bool | 48 | def_bool y |
49 | default y | ||
50 | 49 | ||
51 | config GENERIC_GPIO | 50 | config GENERIC_GPIO |
52 | bool | 51 | def_bool y |
53 | default y | ||
54 | 52 | ||
55 | config FORCE_MAX_ZONEORDER | 53 | config FORCE_MAX_ZONEORDER |
56 | int | 54 | int |
57 | default "14" | 55 | default "14" |
58 | 56 | ||
59 | config GENERIC_CALIBRATE_DELAY | 57 | config GENERIC_CALIBRATE_DELAY |
60 | bool | 58 | def_bool y |
61 | default y | 59 | |
60 | config LOCKDEP_SUPPORT | ||
61 | def_bool y | ||
62 | |||
63 | config STACKTRACE_SUPPORT | ||
64 | def_bool y | ||
65 | |||
66 | config TRACE_IRQFLAGS_SUPPORT | ||
67 | def_bool y | ||
62 | 68 | ||
63 | source "init/Kconfig" | 69 | source "init/Kconfig" |
64 | 70 | ||
@@ -408,12 +414,12 @@ comment "Clock/PLL Setup" | |||
408 | 414 | ||
409 | config CLKIN_HZ | 415 | config CLKIN_HZ |
410 | int "Frequency of the crystal on the board in Hz" | 416 | int "Frequency of the crystal on the board in Hz" |
417 | default "10000000" if BFIN532_IP0X | ||
411 | default "11059200" if BFIN533_STAMP | 418 | default "11059200" if BFIN533_STAMP |
419 | default "24576000" if PNAV10 | ||
420 | default "25000000" # most people use this | ||
412 | default "27000000" if BFIN533_EZKIT | 421 | default "27000000" if BFIN533_EZKIT |
413 | default "25000000" if (BFIN537_STAMP || BFIN527_EZKIT || H8606_HVSISTEMAS || BLACKSTAMP || BFIN526_EZBRD || BFIN538_EZKIT || BFIN518F-EZBRD) | ||
414 | default "30000000" if BFIN561_EZKIT | 422 | default "30000000" if BFIN561_EZKIT |
415 | default "24576000" if PNAV10 | ||
416 | default "10000000" if BFIN532_IP0X | ||
417 | help | 423 | help |
418 | The frequency of CLKIN crystal oscillator on the board in Hz. | 424 | The frequency of CLKIN crystal oscillator on the board in Hz. |
419 | Warning: This value should match the crystal on the board. Otherwise, | 425 | Warning: This value should match the crystal on the board. Otherwise, |
diff --git a/arch/blackfin/Makefile b/arch/blackfin/Makefile index d54c8283825c..6f9533c3d752 100644 --- a/arch/blackfin/Makefile +++ b/arch/blackfin/Makefile | |||
@@ -137,7 +137,7 @@ archclean: | |||
137 | 137 | ||
138 | INSTALL_PATH ?= /tftpboot | 138 | INSTALL_PATH ?= /tftpboot |
139 | boot := arch/$(ARCH)/boot | 139 | boot := arch/$(ARCH)/boot |
140 | BOOT_TARGETS = vmImage | 140 | BOOT_TARGETS = vmImage vmImage.bz2 vmImage.gz vmImage.lzma |
141 | PHONY += $(BOOT_TARGETS) install | 141 | PHONY += $(BOOT_TARGETS) install |
142 | KBUILD_IMAGE := $(boot)/vmImage | 142 | KBUILD_IMAGE := $(boot)/vmImage |
143 | 143 | ||
@@ -150,7 +150,10 @@ install: | |||
150 | $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) install | 150 | $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) install |
151 | 151 | ||
152 | define archhelp | 152 | define archhelp |
153 | echo '* vmImage - Kernel-only image for U-Boot (arch/$(ARCH)/boot/vmImage)' | 153 | echo '* vmImage - Alias to selected kernel format (vmImage.gz by default)' |
154 | echo ' vmImage.bz2 - Kernel-only image for U-Boot (arch/$(ARCH)/boot/vmImage.bz2)' | ||
155 | echo '* vmImage.gz - Kernel-only image for U-Boot (arch/$(ARCH)/boot/vmImage.gz)' | ||
156 | echo ' vmImage.lzma - Kernel-only image for U-Boot (arch/$(ARCH)/boot/vmImage.lzma)' | ||
154 | echo ' install - Install kernel using' | 157 | echo ' install - Install kernel using' |
155 | echo ' (your) ~/bin/$(CROSS_COMPILE)installkernel or' | 158 | echo ' (your) ~/bin/$(CROSS_COMPILE)installkernel or' |
156 | echo ' (distribution) PATH: $(CROSS_COMPILE)installkernel or' | 159 | echo ' (distribution) PATH: $(CROSS_COMPILE)installkernel or' |
diff --git a/arch/blackfin/boot/.gitignore b/arch/blackfin/boot/.gitignore index 3ae03994b88d..229e50808677 100644 --- a/arch/blackfin/boot/.gitignore +++ b/arch/blackfin/boot/.gitignore | |||
@@ -1 +1,2 @@ | |||
1 | +vmImage | 1 | vmImage* |
2 | vmlinux* | ||
diff --git a/arch/blackfin/boot/Makefile b/arch/blackfin/boot/Makefile index e028d13481a9..3ab6f23561dd 100644 --- a/arch/blackfin/boot/Makefile +++ b/arch/blackfin/boot/Makefile | |||
@@ -8,24 +8,41 @@ | |||
8 | 8 | ||
9 | MKIMAGE := $(srctree)/scripts/mkuboot.sh | 9 | MKIMAGE := $(srctree)/scripts/mkuboot.sh |
10 | 10 | ||
11 | targets := vmImage | 11 | targets := vmImage vmImage.bz2 vmImage.gz vmImage.lzma |
12 | extra-y += vmlinux.bin vmlinux.gz | 12 | extra-y += vmlinux.bin vmlinux.bin.gz vmlinux.bin.bz2 vmlinux.bin.lzma |
13 | 13 | ||
14 | quiet_cmd_uimage = UIMAGE $@ | 14 | quiet_cmd_uimage = UIMAGE $@ |
15 | cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A $(ARCH) -O linux -T kernel \ | 15 | cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A $(ARCH) -O linux -T kernel \ |
16 | -C gzip -n 'Linux-$(KERNELRELEASE)' -a $(CONFIG_BOOT_LOAD) \ | 16 | -C $(2) -n 'Linux-$(KERNELRELEASE)' -a $(CONFIG_BOOT_LOAD) \ |
17 | -e $(shell $(NM) vmlinux | awk '$$NF == "__start" {print $$1}') \ | 17 | -e $(shell $(NM) vmlinux | awk '$$NF == "__start" {print $$1}') \ |
18 | -d $< $@ | 18 | -d $< $@ |
19 | 19 | ||
20 | $(obj)/vmlinux.bin: vmlinux FORCE | 20 | $(obj)/vmlinux.bin: vmlinux FORCE |
21 | $(call if_changed,objcopy) | 21 | $(call if_changed,objcopy) |
22 | 22 | ||
23 | $(obj)/vmlinux.gz: $(obj)/vmlinux.bin FORCE | 23 | $(obj)/vmlinux.bin.gz: $(obj)/vmlinux.bin FORCE |
24 | $(call if_changed,gzip) | 24 | $(call if_changed,gzip) |
25 | 25 | ||
26 | $(obj)/vmImage: $(obj)/vmlinux.gz | 26 | $(obj)/vmlinux.bin.bz2: $(obj)/vmlinux.bin FORCE |
27 | $(call if_changed,uimage) | 27 | $(call if_changed,bzip2) |
28 | @$(kecho) 'Kernel: $@ is ready' | 28 | |
29 | $(obj)/vmlinux.bin.lzma: $(obj)/vmlinux.bin FORCE | ||
30 | $(call if_changed,lzma) | ||
31 | |||
32 | $(obj)/vmImage.bz2: $(obj)/vmlinux.bin.bz2 | ||
33 | $(call if_changed,uimage,bzip2) | ||
34 | |||
35 | $(obj)/vmImage.gz: $(obj)/vmlinux.bin.gz | ||
36 | $(call if_changed,uimage,gzip) | ||
37 | |||
38 | $(obj)/vmImage.lzma: $(obj)/vmlinux.bin.lzma | ||
39 | $(call if_changed,uimage,lzma) | ||
40 | |||
41 | suffix-$(CONFIG_KERNEL_GZIP) := gz | ||
42 | suffix-$(CONFIG_KERNEL_BZIP2) := bz2 | ||
43 | suffix-$(CONFIG_KERNEL_LZMA) := lzma | ||
44 | $(obj)/vmImage: $(obj)/vmImage.$(suffix-y) | ||
45 | @ln -sf $(notdir $<) $@ | ||
29 | 46 | ||
30 | install: | 47 | install: |
31 | sh $(srctree)/$(src)/install.sh $(KERNELRELEASE) $(BOOTIMAGE) System.map "$(INSTALL_PATH)" | 48 | sh $(srctree)/$(src)/install.sh $(KERNELRELEASE) $(BOOTIMAGE) System.map "$(INSTALL_PATH)" |
diff --git a/arch/blackfin/include/asm/atomic.h b/arch/blackfin/include/asm/atomic.h index 7bbf44e4ddf9..b1d92f13ef96 100644 --- a/arch/blackfin/include/asm/atomic.h +++ b/arch/blackfin/include/asm/atomic.h | |||
@@ -90,7 +90,7 @@ static inline int atomic_test_mask(int mask, atomic_t *v) | |||
90 | 90 | ||
91 | static inline void atomic_add(int i, atomic_t *v) | 91 | static inline void atomic_add(int i, atomic_t *v) |
92 | { | 92 | { |
93 | long flags; | 93 | unsigned long flags; |
94 | 94 | ||
95 | local_irq_save_hw(flags); | 95 | local_irq_save_hw(flags); |
96 | v->counter += i; | 96 | v->counter += i; |
@@ -99,7 +99,7 @@ static inline void atomic_add(int i, atomic_t *v) | |||
99 | 99 | ||
100 | static inline void atomic_sub(int i, atomic_t *v) | 100 | static inline void atomic_sub(int i, atomic_t *v) |
101 | { | 101 | { |
102 | long flags; | 102 | unsigned long flags; |
103 | 103 | ||
104 | local_irq_save_hw(flags); | 104 | local_irq_save_hw(flags); |
105 | v->counter -= i; | 105 | v->counter -= i; |
@@ -110,7 +110,7 @@ static inline void atomic_sub(int i, atomic_t *v) | |||
110 | static inline int atomic_add_return(int i, atomic_t *v) | 110 | static inline int atomic_add_return(int i, atomic_t *v) |
111 | { | 111 | { |
112 | int __temp = 0; | 112 | int __temp = 0; |
113 | long flags; | 113 | unsigned long flags; |
114 | 114 | ||
115 | local_irq_save_hw(flags); | 115 | local_irq_save_hw(flags); |
116 | v->counter += i; | 116 | v->counter += i; |
@@ -124,7 +124,7 @@ static inline int atomic_add_return(int i, atomic_t *v) | |||
124 | static inline int atomic_sub_return(int i, atomic_t *v) | 124 | static inline int atomic_sub_return(int i, atomic_t *v) |
125 | { | 125 | { |
126 | int __temp = 0; | 126 | int __temp = 0; |
127 | long flags; | 127 | unsigned long flags; |
128 | 128 | ||
129 | local_irq_save_hw(flags); | 129 | local_irq_save_hw(flags); |
130 | v->counter -= i; | 130 | v->counter -= i; |
@@ -136,7 +136,7 @@ static inline int atomic_sub_return(int i, atomic_t *v) | |||
136 | 136 | ||
137 | static inline void atomic_inc(volatile atomic_t *v) | 137 | static inline void atomic_inc(volatile atomic_t *v) |
138 | { | 138 | { |
139 | long flags; | 139 | unsigned long flags; |
140 | 140 | ||
141 | local_irq_save_hw(flags); | 141 | local_irq_save_hw(flags); |
142 | v->counter++; | 142 | v->counter++; |
@@ -145,7 +145,7 @@ static inline void atomic_inc(volatile atomic_t *v) | |||
145 | 145 | ||
146 | static inline void atomic_dec(volatile atomic_t *v) | 146 | static inline void atomic_dec(volatile atomic_t *v) |
147 | { | 147 | { |
148 | long flags; | 148 | unsigned long flags; |
149 | 149 | ||
150 | local_irq_save_hw(flags); | 150 | local_irq_save_hw(flags); |
151 | v->counter--; | 151 | v->counter--; |
@@ -154,7 +154,7 @@ static inline void atomic_dec(volatile atomic_t *v) | |||
154 | 154 | ||
155 | static inline void atomic_clear_mask(unsigned int mask, atomic_t *v) | 155 | static inline void atomic_clear_mask(unsigned int mask, atomic_t *v) |
156 | { | 156 | { |
157 | long flags; | 157 | unsigned long flags; |
158 | 158 | ||
159 | local_irq_save_hw(flags); | 159 | local_irq_save_hw(flags); |
160 | v->counter &= ~mask; | 160 | v->counter &= ~mask; |
@@ -163,7 +163,7 @@ static inline void atomic_clear_mask(unsigned int mask, atomic_t *v) | |||
163 | 163 | ||
164 | static inline void atomic_set_mask(unsigned int mask, atomic_t *v) | 164 | static inline void atomic_set_mask(unsigned int mask, atomic_t *v) |
165 | { | 165 | { |
166 | long flags; | 166 | unsigned long flags; |
167 | 167 | ||
168 | local_irq_save_hw(flags); | 168 | local_irq_save_hw(flags); |
169 | v->counter |= mask; | 169 | v->counter |= mask; |
diff --git a/arch/blackfin/include/asm/bfin-global.h b/arch/blackfin/include/asm/bfin-global.h index daffc0684e75..e39277ea43e8 100644 --- a/arch/blackfin/include/asm/bfin-global.h +++ b/arch/blackfin/include/asm/bfin-global.h | |||
@@ -31,7 +31,7 @@ | |||
31 | 31 | ||
32 | #ifndef __ASSEMBLY__ | 32 | #ifndef __ASSEMBLY__ |
33 | 33 | ||
34 | #include <asm-generic/sections.h> | 34 | #include <asm/sections.h> |
35 | #include <asm/ptrace.h> | 35 | #include <asm/ptrace.h> |
36 | #include <asm/user.h> | 36 | #include <asm/user.h> |
37 | #include <linux/linkage.h> | 37 | #include <linux/linkage.h> |
@@ -99,15 +99,6 @@ extern const char bfin_board_name[]; | |||
99 | extern unsigned long bfin_sic_iwr[]; | 99 | extern unsigned long bfin_sic_iwr[]; |
100 | extern unsigned vr_wakeup; | 100 | extern unsigned vr_wakeup; |
101 | extern u16 _bfin_swrst; /* shadow for Software Reset Register (SWRST) */ | 101 | extern u16 _bfin_swrst; /* shadow for Software Reset Register (SWRST) */ |
102 | extern unsigned long _ramstart, _ramend, _rambase; | ||
103 | extern unsigned long memory_start, memory_end, physical_mem_end; | ||
104 | extern char _stext_l1[], _etext_l1[], _sdata_l1[], _edata_l1[], _sbss_l1[], | ||
105 | _ebss_l1[], _l1_lma_start[], _sdata_b_l1[], _sbss_b_l1[], _ebss_b_l1[], | ||
106 | _stext_l2[], _etext_l2[], _sdata_l2[], _edata_l2[], _sbss_l2[], | ||
107 | _ebss_l2[], _l2_lma_start[]; | ||
108 | |||
109 | /* only used when MTD_UCLINUX */ | ||
110 | extern unsigned long memory_mtd_start, memory_mtd_end, mtd_size; | ||
111 | 102 | ||
112 | #ifdef CONFIG_BFIN_ICACHE_LOCK | 103 | #ifdef CONFIG_BFIN_ICACHE_LOCK |
113 | extern void cache_grab_lock(int way); | 104 | extern void cache_grab_lock(int way); |
diff --git a/arch/blackfin/include/asm/bitops.h b/arch/blackfin/include/asm/bitops.h index 21b036eadab1..75fee2f7d9f2 100644 --- a/arch/blackfin/include/asm/bitops.h +++ b/arch/blackfin/include/asm/bitops.h | |||
@@ -109,7 +109,8 @@ static inline void clear_bit(int nr, volatile unsigned long *addr) | |||
109 | 109 | ||
110 | static inline void change_bit(int nr, volatile unsigned long *addr) | 110 | static inline void change_bit(int nr, volatile unsigned long *addr) |
111 | { | 111 | { |
112 | int mask, flags; | 112 | int mask; |
113 | unsigned long flags; | ||
113 | unsigned long *ADDR = (unsigned long *)addr; | 114 | unsigned long *ADDR = (unsigned long *)addr; |
114 | 115 | ||
115 | ADDR += nr >> 5; | 116 | ADDR += nr >> 5; |
diff --git a/arch/blackfin/include/asm/bug.h b/arch/blackfin/include/asm/bug.h index 6d3e11b1fc57..655e49540e41 100644 --- a/arch/blackfin/include/asm/bug.h +++ b/arch/blackfin/include/asm/bug.h | |||
@@ -2,13 +2,58 @@ | |||
2 | #define _BLACKFIN_BUG_H | 2 | #define _BLACKFIN_BUG_H |
3 | 3 | ||
4 | #ifdef CONFIG_BUG | 4 | #ifdef CONFIG_BUG |
5 | #define HAVE_ARCH_BUG | ||
6 | 5 | ||
7 | #define BUG() do { \ | 6 | #define BFIN_BUG_OPCODE 0xefcd |
8 | dump_bfin_trace_buffer(); \ | 7 | |
9 | printk(KERN_EMERG "BUG: failure at %s:%d/%s()!\n", __FILE__, __LINE__, __func__); \ | 8 | #ifdef CONFIG_DEBUG_BUGVERBOSE |
10 | panic("BUG!"); \ | 9 | |
11 | } while (0) | 10 | #define _BUG_OR_WARN(flags) \ |
11 | asm volatile( \ | ||
12 | "1: .hword %0\n" \ | ||
13 | " .section __bug_table,\"a\",@progbits\n" \ | ||
14 | "2: .long 1b\n" \ | ||
15 | " .long %1\n" \ | ||
16 | " .short %2\n" \ | ||
17 | " .short %3\n" \ | ||
18 | " .org 2b + %4\n" \ | ||
19 | " .previous" \ | ||
20 | : \ | ||
21 | : "i"(BFIN_BUG_OPCODE), "i"(__FILE__), \ | ||
22 | "i"(__LINE__), "i"(flags), \ | ||
23 | "i"(sizeof(struct bug_entry))) | ||
24 | |||
25 | #else | ||
26 | |||
27 | #define _BUG_OR_WARN(flags) \ | ||
28 | asm volatile( \ | ||
29 | "1: .hword %0\n" \ | ||
30 | " .section __bug_table,\"a\",@progbits\n" \ | ||
31 | "2: .long 1b\n" \ | ||
32 | " .short %1\n" \ | ||
33 | " .org 2b + %2\n" \ | ||
34 | " .previous" \ | ||
35 | : \ | ||
36 | : "i"(BFIN_BUG_OPCODE), "i"(flags), \ | ||
37 | "i"(sizeof(struct bug_entry))) | ||
38 | |||
39 | #endif /* CONFIG_DEBUG_BUGVERBOSE */ | ||
40 | |||
41 | #define BUG() \ | ||
42 | do { \ | ||
43 | _BUG_OR_WARN(0); \ | ||
44 | for (;;); \ | ||
45 | } while (0) | ||
46 | |||
47 | #define WARN_ON(condition) \ | ||
48 | ({ \ | ||
49 | int __ret_warn_on = !!(condition); \ | ||
50 | if (unlikely(__ret_warn_on)) \ | ||
51 | _BUG_OR_WARN(BUGFLAG_WARNING); \ | ||
52 | unlikely(__ret_warn_on); \ | ||
53 | }) | ||
54 | |||
55 | #define HAVE_ARCH_BUG | ||
56 | #define HAVE_ARCH_WARN_ON | ||
12 | 57 | ||
13 | #endif | 58 | #endif |
14 | 59 | ||
diff --git a/arch/blackfin/include/asm/cache.h b/arch/blackfin/include/asm/cache.h index 86637814cf25..2ef669ed9222 100644 --- a/arch/blackfin/include/asm/cache.h +++ b/arch/blackfin/include/asm/cache.h | |||
@@ -34,9 +34,13 @@ | |||
34 | #define L1_CACHE_SHIFT_MAX 5 | 34 | #define L1_CACHE_SHIFT_MAX 5 |
35 | 35 | ||
36 | #if defined(CONFIG_SMP) && \ | 36 | #if defined(CONFIG_SMP) && \ |
37 | !defined(CONFIG_BFIN_CACHE_COHERENT) && \ | 37 | !defined(CONFIG_BFIN_CACHE_COHERENT) |
38 | defined(CONFIG_BFIN_DCACHE) | 38 | # if defined(CONFIG_BFIN_ICACHE) |
39 | #define __ARCH_SYNC_CORE_DCACHE | 39 | # define __ARCH_SYNC_CORE_ICACHE |
40 | # endif | ||
41 | # if defined(CONFIG_BFIN_DCACHE) | ||
42 | # define __ARCH_SYNC_CORE_DCACHE | ||
43 | # endif | ||
40 | #ifndef __ASSEMBLY__ | 44 | #ifndef __ASSEMBLY__ |
41 | asmlinkage void __raw_smp_mark_barrier_asm(void); | 45 | asmlinkage void __raw_smp_mark_barrier_asm(void); |
42 | asmlinkage void __raw_smp_check_barrier_asm(void); | 46 | asmlinkage void __raw_smp_check_barrier_asm(void); |
@@ -51,6 +55,7 @@ static inline void smp_check_barrier(void) | |||
51 | } | 55 | } |
52 | 56 | ||
53 | void resync_core_dcache(void); | 57 | void resync_core_dcache(void); |
58 | void resync_core_icache(void); | ||
54 | #endif | 59 | #endif |
55 | #endif | 60 | #endif |
56 | 61 | ||
diff --git a/arch/blackfin/include/asm/cacheflush.h b/arch/blackfin/include/asm/cacheflush.h index 94697f0f6f40..5c17dee53b5d 100644 --- a/arch/blackfin/include/asm/cacheflush.h +++ b/arch/blackfin/include/asm/cacheflush.h | |||
@@ -37,6 +37,7 @@ extern void blackfin_dcache_flush_range(unsigned long start_address, unsigned lo | |||
37 | extern void blackfin_dcache_invalidate_range(unsigned long start_address, unsigned long end_address); | 37 | extern void blackfin_dcache_invalidate_range(unsigned long start_address, unsigned long end_address); |
38 | extern void blackfin_dflush_page(void *page); | 38 | extern void blackfin_dflush_page(void *page); |
39 | extern void blackfin_invalidate_entire_dcache(void); | 39 | extern void blackfin_invalidate_entire_dcache(void); |
40 | extern void blackfin_invalidate_entire_icache(void); | ||
40 | 41 | ||
41 | #define flush_dcache_mmap_lock(mapping) do { } while (0) | 42 | #define flush_dcache_mmap_lock(mapping) do { } while (0) |
42 | #define flush_dcache_mmap_unlock(mapping) do { } while (0) | 43 | #define flush_dcache_mmap_unlock(mapping) do { } while (0) |
@@ -97,7 +98,7 @@ do { memcpy(dst, src, len); \ | |||
97 | extern unsigned long reserved_mem_dcache_on; | 98 | extern unsigned long reserved_mem_dcache_on; |
98 | extern unsigned long reserved_mem_icache_on; | 99 | extern unsigned long reserved_mem_icache_on; |
99 | 100 | ||
100 | static inline int bfin_addr_dcachable(unsigned long addr) | 101 | static inline int bfin_addr_dcacheable(unsigned long addr) |
101 | { | 102 | { |
102 | #ifdef CONFIG_BFIN_DCACHE | 103 | #ifdef CONFIG_BFIN_DCACHE |
103 | if (addr < (_ramend - DMA_UNCACHED_REGION)) | 104 | if (addr < (_ramend - DMA_UNCACHED_REGION)) |
diff --git a/arch/blackfin/include/asm/cpu.h b/arch/blackfin/include/asm/cpu.h index c2594ef877f6..565b8136855e 100644 --- a/arch/blackfin/include/asm/cpu.h +++ b/arch/blackfin/include/asm/cpu.h | |||
@@ -34,6 +34,7 @@ struct blackfin_cpudata { | |||
34 | unsigned int dmemctl; | 34 | unsigned int dmemctl; |
35 | unsigned long loops_per_jiffy; | 35 | unsigned long loops_per_jiffy; |
36 | unsigned long dcache_invld_count; | 36 | unsigned long dcache_invld_count; |
37 | unsigned long icache_invld_count; | ||
37 | }; | 38 | }; |
38 | 39 | ||
39 | DECLARE_PER_CPU(struct blackfin_cpudata, cpu_data); | 40 | DECLARE_PER_CPU(struct blackfin_cpudata, cpu_data); |
diff --git a/arch/blackfin/include/asm/ftrace.h b/arch/blackfin/include/asm/ftrace.h index 40a8c178f10d..8643680f0f78 100644 --- a/arch/blackfin/include/asm/ftrace.h +++ b/arch/blackfin/include/asm/ftrace.h | |||
@@ -1 +1,13 @@ | |||
1 | /* empty */ | 1 | /* |
2 | * Blackfin ftrace code | ||
3 | * | ||
4 | * Copyright 2009 Analog Devices Inc. | ||
5 | * Licensed under the GPL-2 or later. | ||
6 | */ | ||
7 | |||
8 | #ifndef __ASM_BFIN_FTRACE_H__ | ||
9 | #define __ASM_BFIN_FTRACE_H__ | ||
10 | |||
11 | #define MCOUNT_INSN_SIZE 8 /* sizeof mcount call: LINK + CALL */ | ||
12 | |||
13 | #endif | ||
diff --git a/arch/blackfin/include/asm/ipipe.h b/arch/blackfin/include/asm/ipipe.h index 51d0bf5e2899..bbe1c3726b69 100644 --- a/arch/blackfin/include/asm/ipipe.h +++ b/arch/blackfin/include/asm/ipipe.h | |||
@@ -35,10 +35,10 @@ | |||
35 | #include <asm/atomic.h> | 35 | #include <asm/atomic.h> |
36 | #include <asm/traps.h> | 36 | #include <asm/traps.h> |
37 | 37 | ||
38 | #define IPIPE_ARCH_STRING "1.9-01" | 38 | #define IPIPE_ARCH_STRING "1.10-00" |
39 | #define IPIPE_MAJOR_NUMBER 1 | 39 | #define IPIPE_MAJOR_NUMBER 1 |
40 | #define IPIPE_MINOR_NUMBER 9 | 40 | #define IPIPE_MINOR_NUMBER 10 |
41 | #define IPIPE_PATCH_NUMBER 1 | 41 | #define IPIPE_PATCH_NUMBER 0 |
42 | 42 | ||
43 | #ifdef CONFIG_SMP | 43 | #ifdef CONFIG_SMP |
44 | #error "I-pipe/blackfin: SMP not implemented" | 44 | #error "I-pipe/blackfin: SMP not implemented" |
@@ -54,10 +54,11 @@ do { \ | |||
54 | 54 | ||
55 | #define task_hijacked(p) \ | 55 | #define task_hijacked(p) \ |
56 | ({ \ | 56 | ({ \ |
57 | int __x__ = ipipe_current_domain != ipipe_root_domain; \ | 57 | int __x__ = __ipipe_root_domain_p; \ |
58 | /* We would need to clear the SYNC flag for the root domain */ \ | 58 | __clear_bit(IPIPE_SYNC_FLAG, &ipipe_root_cpudom_var(status)); \ |
59 | /* over the current processor in SMP mode. */ \ | 59 | if (__x__) \ |
60 | local_irq_enable_hw(); __x__; \ | 60 | local_irq_enable_hw(); \ |
61 | !__x__; \ | ||
61 | }) | 62 | }) |
62 | 63 | ||
63 | struct ipipe_domain; | 64 | struct ipipe_domain; |
@@ -179,23 +180,24 @@ static inline unsigned long __ipipe_ffnz(unsigned long ul) | |||
179 | 180 | ||
180 | #define __ipipe_run_isr(ipd, irq) \ | 181 | #define __ipipe_run_isr(ipd, irq) \ |
181 | do { \ | 182 | do { \ |
182 | if (ipd == ipipe_root_domain) { \ | 183 | if (!__ipipe_pipeline_head_p(ipd)) \ |
183 | local_irq_enable_hw(); \ | 184 | local_irq_enable_hw(); \ |
184 | if (ipipe_virtual_irq_p(irq)) \ | 185 | if (ipd == ipipe_root_domain) { \ |
186 | if (unlikely(ipipe_virtual_irq_p(irq))) { \ | ||
187 | irq_enter(); \ | ||
185 | ipd->irqs[irq].handler(irq, ipd->irqs[irq].cookie); \ | 188 | ipd->irqs[irq].handler(irq, ipd->irqs[irq].cookie); \ |
186 | else \ | 189 | irq_exit(); \ |
190 | } else \ | ||
187 | ipd->irqs[irq].handler(irq, &__raw_get_cpu_var(__ipipe_tick_regs)); \ | 191 | ipd->irqs[irq].handler(irq, &__raw_get_cpu_var(__ipipe_tick_regs)); \ |
188 | local_irq_disable_hw(); \ | ||
189 | } else { \ | 192 | } else { \ |
190 | __clear_bit(IPIPE_SYNC_FLAG, &ipipe_cpudom_var(ipd, status)); \ | 193 | __clear_bit(IPIPE_SYNC_FLAG, &ipipe_cpudom_var(ipd, status)); \ |
191 | local_irq_enable_nohead(ipd); \ | ||
192 | ipd->irqs[irq].handler(irq, ipd->irqs[irq].cookie); \ | 194 | ipd->irqs[irq].handler(irq, ipd->irqs[irq].cookie); \ |
193 | /* Attempt to exit the outer interrupt level before \ | 195 | /* Attempt to exit the outer interrupt level before \ |
194 | * starting the deferred IRQ processing. */ \ | 196 | * starting the deferred IRQ processing. */ \ |
195 | local_irq_disable_nohead(ipd); \ | ||
196 | __ipipe_run_irqtail(); \ | 197 | __ipipe_run_irqtail(); \ |
197 | __set_bit(IPIPE_SYNC_FLAG, &ipipe_cpudom_var(ipd, status)); \ | 198 | __set_bit(IPIPE_SYNC_FLAG, &ipipe_cpudom_var(ipd, status)); \ |
198 | } \ | 199 | } \ |
200 | local_irq_disable_hw(); \ | ||
199 | } while (0) | 201 | } while (0) |
200 | 202 | ||
201 | #define __ipipe_syscall_watched_p(p, sc) \ | 203 | #define __ipipe_syscall_watched_p(p, sc) \ |
diff --git a/arch/blackfin/include/asm/irq.h b/arch/blackfin/include/asm/irq.h index 7645e85a5f6f..400bdd52ce87 100644 --- a/arch/blackfin/include/asm/irq.h +++ b/arch/blackfin/include/asm/irq.h | |||
@@ -17,270 +17,17 @@ | |||
17 | #ifndef _BFIN_IRQ_H_ | 17 | #ifndef _BFIN_IRQ_H_ |
18 | #define _BFIN_IRQ_H_ | 18 | #define _BFIN_IRQ_H_ |
19 | 19 | ||
20 | /* SYS_IRQS and NR_IRQS are defined in <mach-bf5xx/irq.h>*/ | 20 | #include <linux/irqflags.h> |
21 | #include <mach/irq.h> | ||
22 | #include <asm/pda.h> | ||
23 | #include <asm/processor.h> | ||
24 | |||
25 | #ifdef CONFIG_SMP | ||
26 | /* Forward decl needed due to cdef inter dependencies */ | ||
27 | static inline uint32_t __pure bfin_dspid(void); | ||
28 | # define blackfin_core_id() (bfin_dspid() & 0xff) | ||
29 | # define bfin_irq_flags cpu_pda[blackfin_core_id()].imask | ||
30 | #else | ||
31 | extern unsigned long bfin_irq_flags; | ||
32 | #endif | ||
33 | |||
34 | #ifdef CONFIG_IPIPE | ||
35 | |||
36 | #include <linux/ipipe_trace.h> | ||
37 | 21 | ||
38 | void __ipipe_unstall_root(void); | 22 | /* SYS_IRQS and NR_IRQS are defined in <mach-bf5xx/irq.h> */ |
39 | 23 | #include <mach/irq.h> | |
40 | void __ipipe_restore_root(unsigned long flags); | ||
41 | |||
42 | #ifdef CONFIG_DEBUG_HWERR | ||
43 | # define __all_masked_irq_flags 0x3f | ||
44 | # define __save_and_cli_hw(x) \ | ||
45 | __asm__ __volatile__( \ | ||
46 | "cli %0;" \ | ||
47 | "sti %1;" \ | ||
48 | : "=&d"(x) \ | ||
49 | : "d" (0x3F) \ | ||
50 | ) | ||
51 | #else | ||
52 | # define __all_masked_irq_flags 0x1f | ||
53 | # define __save_and_cli_hw(x) \ | ||
54 | __asm__ __volatile__( \ | ||
55 | "cli %0;" \ | ||
56 | : "=&d"(x) \ | ||
57 | ) | ||
58 | #endif | ||
59 | |||
60 | #define irqs_enabled_from_flags_hw(x) ((x) != __all_masked_irq_flags) | ||
61 | #define raw_irqs_disabled_flags(flags) (!irqs_enabled_from_flags_hw(flags)) | ||
62 | #define local_test_iflag_hw(x) irqs_enabled_from_flags_hw(x) | ||
63 | |||
64 | #define local_save_flags(x) \ | ||
65 | do { \ | ||
66 | (x) = __ipipe_test_root() ? \ | ||
67 | __all_masked_irq_flags : bfin_irq_flags; \ | ||
68 | barrier(); \ | ||
69 | } while (0) | ||
70 | |||
71 | #define local_irq_save(x) \ | ||
72 | do { \ | ||
73 | (x) = __ipipe_test_and_stall_root() ? \ | ||
74 | __all_masked_irq_flags : bfin_irq_flags; \ | ||
75 | barrier(); \ | ||
76 | } while (0) | ||
77 | |||
78 | static inline void local_irq_restore(unsigned long x) | ||
79 | { | ||
80 | barrier(); | ||
81 | __ipipe_restore_root(x == __all_masked_irq_flags); | ||
82 | } | ||
83 | |||
84 | #define local_irq_disable() \ | ||
85 | do { \ | ||
86 | __ipipe_stall_root(); \ | ||
87 | barrier(); \ | ||
88 | } while (0) | ||
89 | |||
90 | static inline void local_irq_enable(void) | ||
91 | { | ||
92 | barrier(); | ||
93 | __ipipe_unstall_root(); | ||
94 | } | ||
95 | |||
96 | #define irqs_disabled() __ipipe_test_root() | ||
97 | |||
98 | #define local_save_flags_hw(x) \ | ||
99 | __asm__ __volatile__( \ | ||
100 | "cli %0;" \ | ||
101 | "sti %0;" \ | ||
102 | : "=d"(x) \ | ||
103 | ) | ||
104 | |||
105 | #define irqs_disabled_hw() \ | ||
106 | ({ \ | ||
107 | unsigned long flags; \ | ||
108 | local_save_flags_hw(flags); \ | ||
109 | !irqs_enabled_from_flags_hw(flags); \ | ||
110 | }) | ||
111 | |||
112 | static inline unsigned long raw_mangle_irq_bits(int virt, unsigned long real) | ||
113 | { | ||
114 | /* Merge virtual and real interrupt mask bits into a single | ||
115 | 32bit word. */ | ||
116 | return (real & ~(1 << 31)) | ((virt != 0) << 31); | ||
117 | } | ||
118 | |||
119 | static inline int raw_demangle_irq_bits(unsigned long *x) | ||
120 | { | ||
121 | int virt = (*x & (1 << 31)) != 0; | ||
122 | *x &= ~(1L << 31); | ||
123 | return virt; | ||
124 | } | ||
125 | |||
126 | #ifdef CONFIG_IPIPE_TRACE_IRQSOFF | ||
127 | |||
128 | #define local_irq_disable_hw() \ | ||
129 | do { \ | ||
130 | int _tmp_dummy; \ | ||
131 | if (!irqs_disabled_hw()) \ | ||
132 | ipipe_trace_begin(0x80000000); \ | ||
133 | __asm__ __volatile__ ("cli %0;" : "=d" (_tmp_dummy) : ); \ | ||
134 | } while (0) | ||
135 | |||
136 | #define local_irq_enable_hw() \ | ||
137 | do { \ | ||
138 | if (irqs_disabled_hw()) \ | ||
139 | ipipe_trace_end(0x80000000); \ | ||
140 | __asm__ __volatile__ ("sti %0;" : : "d"(bfin_irq_flags)); \ | ||
141 | } while (0) | ||
142 | |||
143 | #define local_irq_save_hw(x) \ | ||
144 | do { \ | ||
145 | __save_and_cli_hw(x); \ | ||
146 | if (local_test_iflag_hw(x)) \ | ||
147 | ipipe_trace_begin(0x80000001); \ | ||
148 | } while (0) | ||
149 | |||
150 | #define local_irq_restore_hw(x) \ | ||
151 | do { \ | ||
152 | if (local_test_iflag_hw(x)) { \ | ||
153 | ipipe_trace_end(0x80000001); \ | ||
154 | local_irq_enable_hw_notrace(); \ | ||
155 | } \ | ||
156 | } while (0) | ||
157 | |||
158 | #define local_irq_disable_hw_notrace() \ | ||
159 | do { \ | ||
160 | int _tmp_dummy; \ | ||
161 | __asm__ __volatile__ ("cli %0;" : "=d" (_tmp_dummy) : ); \ | ||
162 | } while (0) | ||
163 | |||
164 | #define local_irq_enable_hw_notrace() \ | ||
165 | __asm__ __volatile__( \ | ||
166 | "sti %0;" \ | ||
167 | : \ | ||
168 | : "d"(bfin_irq_flags) \ | ||
169 | ) | ||
170 | |||
171 | #define local_irq_save_hw_notrace(x) __save_and_cli_hw(x) | ||
172 | |||
173 | #define local_irq_restore_hw_notrace(x) \ | ||
174 | do { \ | ||
175 | if (local_test_iflag_hw(x)) \ | ||
176 | local_irq_enable_hw_notrace(); \ | ||
177 | } while (0) | ||
178 | |||
179 | #else /* CONFIG_IPIPE_TRACE_IRQSOFF */ | ||
180 | |||
181 | #define local_irq_enable_hw() \ | ||
182 | __asm__ __volatile__( \ | ||
183 | "sti %0;" \ | ||
184 | : \ | ||
185 | : "d"(bfin_irq_flags) \ | ||
186 | ) | ||
187 | |||
188 | #define local_irq_disable_hw() \ | ||
189 | do { \ | ||
190 | int _tmp_dummy; \ | ||
191 | __asm__ __volatile__ ( \ | ||
192 | "cli %0;" \ | ||
193 | : "=d" (_tmp_dummy)); \ | ||
194 | } while (0) | ||
195 | |||
196 | #define local_irq_restore_hw(x) \ | ||
197 | do { \ | ||
198 | if (irqs_enabled_from_flags_hw(x)) \ | ||
199 | local_irq_enable_hw(); \ | ||
200 | } while (0) | ||
201 | |||
202 | #define local_irq_save_hw(x) __save_and_cli_hw(x) | ||
203 | |||
204 | #define local_irq_disable_hw_notrace() local_irq_disable_hw() | ||
205 | #define local_irq_enable_hw_notrace() local_irq_enable_hw() | ||
206 | #define local_irq_save_hw_notrace(x) local_irq_save_hw(x) | ||
207 | #define local_irq_restore_hw_notrace(x) local_irq_restore_hw(x) | ||
208 | |||
209 | #endif /* CONFIG_IPIPE_TRACE_IRQSOFF */ | ||
210 | |||
211 | #else /* !CONFIG_IPIPE */ | ||
212 | |||
213 | /* | ||
214 | * Interrupt configuring macros. | ||
215 | */ | ||
216 | #define local_irq_disable() \ | ||
217 | do { \ | ||
218 | int __tmp_dummy; \ | ||
219 | __asm__ __volatile__( \ | ||
220 | "cli %0;" \ | ||
221 | : "=d" (__tmp_dummy) \ | ||
222 | ); \ | ||
223 | } while (0) | ||
224 | |||
225 | #define local_irq_enable() \ | ||
226 | __asm__ __volatile__( \ | ||
227 | "sti %0;" \ | ||
228 | : \ | ||
229 | : "d" (bfin_irq_flags) \ | ||
230 | ) | ||
231 | |||
232 | #ifdef CONFIG_DEBUG_HWERR | ||
233 | # define __save_and_cli(x) \ | ||
234 | __asm__ __volatile__( \ | ||
235 | "cli %0;" \ | ||
236 | "sti %1;" \ | ||
237 | : "=&d" (x) \ | ||
238 | : "d" (0x3F) \ | ||
239 | ) | ||
240 | #else | ||
241 | # define __save_and_cli(x) \ | ||
242 | __asm__ __volatile__( \ | ||
243 | "cli %0;" \ | ||
244 | : "=&d" (x) \ | ||
245 | ) | ||
246 | #endif | ||
247 | |||
248 | #define local_save_flags(x) \ | ||
249 | __asm__ __volatile__( \ | ||
250 | "cli %0;" \ | ||
251 | "sti %0;" \ | ||
252 | : "=d" (x) \ | ||
253 | ) | ||
254 | |||
255 | #ifdef CONFIG_DEBUG_HWERR | ||
256 | #define irqs_enabled_from_flags(x) (((x) & ~0x3f) != 0) | ||
257 | #else | ||
258 | #define irqs_enabled_from_flags(x) ((x) != 0x1f) | ||
259 | #endif | ||
260 | |||
261 | #define local_irq_restore(x) \ | ||
262 | do { \ | ||
263 | if (irqs_enabled_from_flags(x)) \ | ||
264 | local_irq_enable(); \ | ||
265 | } while (0) | ||
266 | |||
267 | /* For spinlocks etc */ | ||
268 | #define local_irq_save(x) __save_and_cli(x) | ||
269 | |||
270 | #define irqs_disabled() \ | ||
271 | ({ \ | ||
272 | unsigned long flags; \ | ||
273 | local_save_flags(flags); \ | ||
274 | !irqs_enabled_from_flags(flags); \ | ||
275 | }) | ||
276 | |||
277 | #define local_irq_save_hw(x) local_irq_save(x) | ||
278 | #define local_irq_restore_hw(x) local_irq_restore(x) | ||
279 | #define local_irq_enable_hw() local_irq_enable() | ||
280 | #define local_irq_disable_hw() local_irq_disable() | ||
281 | #define irqs_disabled_hw() irqs_disabled() | ||
282 | 24 | ||
283 | #endif /* !CONFIG_IPIPE */ | 25 | /* Xenomai IPIPE helpers */ |
26 | #define local_irq_restore_hw(x) local_irq_restore(x) | ||
27 | #define local_irq_save_hw(x) local_irq_save(x) | ||
28 | #define local_irq_enable_hw(x) local_irq_enable(x) | ||
29 | #define local_irq_disable_hw(x) local_irq_disable(x) | ||
30 | #define irqs_disabled_hw(x) irqs_disabled(x) | ||
284 | 31 | ||
285 | #if ANOMALY_05000244 && defined(CONFIG_BFIN_ICACHE) | 32 | #if ANOMALY_05000244 && defined(CONFIG_BFIN_ICACHE) |
286 | # define NOP_PAD_ANOMALY_05000244 "nop; nop;" | 33 | # define NOP_PAD_ANOMALY_05000244 "nop; nop;" |
diff --git a/arch/blackfin/include/asm/irqflags.h b/arch/blackfin/include/asm/irqflags.h new file mode 100644 index 000000000000..139cba4651b1 --- /dev/null +++ b/arch/blackfin/include/asm/irqflags.h | |||
@@ -0,0 +1,63 @@ | |||
1 | /* | ||
2 | * interface to Blackfin CEC | ||
3 | * | ||
4 | * Copyright 2009 Analog Devices Inc. | ||
5 | * Licensed under the GPL-2 or later. | ||
6 | */ | ||
7 | |||
8 | #ifndef __ASM_BFIN_IRQFLAGS_H__ | ||
9 | #define __ASM_BFIN_IRQFLAGS_H__ | ||
10 | |||
11 | #ifdef CONFIG_SMP | ||
12 | # include <asm/pda.h> | ||
13 | # include <asm/processor.h> | ||
14 | /* Forward decl needed due to cdef inter dependencies */ | ||
15 | static inline uint32_t __pure bfin_dspid(void); | ||
16 | # define blackfin_core_id() (bfin_dspid() & 0xff) | ||
17 | # define bfin_irq_flags cpu_pda[blackfin_core_id()].imask | ||
18 | #else | ||
19 | extern unsigned long bfin_irq_flags; | ||
20 | #endif | ||
21 | |||
22 | static inline void bfin_sti(unsigned long flags) | ||
23 | { | ||
24 | asm volatile("sti %0;" : : "d" (flags)); | ||
25 | } | ||
26 | |||
27 | static inline unsigned long bfin_cli(void) | ||
28 | { | ||
29 | unsigned long flags; | ||
30 | asm volatile("cli %0;" : "=d" (flags)); | ||
31 | return flags; | ||
32 | } | ||
33 | |||
34 | static inline void raw_local_irq_disable(void) | ||
35 | { | ||
36 | bfin_cli(); | ||
37 | } | ||
38 | static inline void raw_local_irq_enable(void) | ||
39 | { | ||
40 | bfin_sti(bfin_irq_flags); | ||
41 | } | ||
42 | |||
43 | #define raw_local_save_flags(flags) do { (flags) = bfin_read_IMASK(); } while (0) | ||
44 | |||
45 | #define raw_irqs_disabled_flags(flags) (((flags) & ~0x3f) == 0) | ||
46 | |||
47 | static inline void raw_local_irq_restore(unsigned long flags) | ||
48 | { | ||
49 | if (!raw_irqs_disabled_flags(flags)) | ||
50 | raw_local_irq_enable(); | ||
51 | } | ||
52 | |||
53 | static inline unsigned long __raw_local_irq_save(void) | ||
54 | { | ||
55 | unsigned long flags = bfin_cli(); | ||
56 | #ifdef CONFIG_DEBUG_HWERR | ||
57 | bfin_sti(0x3f); | ||
58 | #endif | ||
59 | return flags; | ||
60 | } | ||
61 | #define raw_local_irq_save(flags) do { (flags) = __raw_local_irq_save(); } while (0) | ||
62 | |||
63 | #endif | ||
diff --git a/arch/blackfin/include/asm/kmap_types.h b/arch/blackfin/include/asm/kmap_types.h index e215f7104974..0a88622339ee 100644 --- a/arch/blackfin/include/asm/kmap_types.h +++ b/arch/blackfin/include/asm/kmap_types.h | |||
@@ -1,21 +1,6 @@ | |||
1 | #ifndef _ASM_KMAP_TYPES_H | 1 | #ifndef _ASM_KMAP_TYPES_H |
2 | #define _ASM_KMAP_TYPES_H | 2 | #define _ASM_KMAP_TYPES_H |
3 | 3 | ||
4 | enum km_type { | 4 | #include <asm-generic/kmap_types.h> |
5 | KM_BOUNCE_READ, | ||
6 | KM_SKB_SUNRPC_DATA, | ||
7 | KM_SKB_DATA_SOFTIRQ, | ||
8 | KM_USER0, | ||
9 | KM_USER1, | ||
10 | KM_BIO_SRC_IRQ, | ||
11 | KM_BIO_DST_IRQ, | ||
12 | KM_PTE0, | ||
13 | KM_PTE1, | ||
14 | KM_IRQ0, | ||
15 | KM_IRQ1, | ||
16 | KM_SOFTIRQ0, | ||
17 | KM_SOFTIRQ1, | ||
18 | KM_TYPE_NR | ||
19 | }; | ||
20 | 5 | ||
21 | #endif | 6 | #endif |
diff --git a/arch/blackfin/include/asm/mutex-dec.h b/arch/blackfin/include/asm/mutex-dec.h deleted file mode 100644 index 0134151656af..000000000000 --- a/arch/blackfin/include/asm/mutex-dec.h +++ /dev/null | |||
@@ -1,112 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-generic/mutex-dec.h | ||
3 | * | ||
4 | * Generic implementation of the mutex fastpath, based on atomic | ||
5 | * decrement/increment. | ||
6 | */ | ||
7 | #ifndef _ASM_GENERIC_MUTEX_DEC_H | ||
8 | #define _ASM_GENERIC_MUTEX_DEC_H | ||
9 | |||
10 | /** | ||
11 | * __mutex_fastpath_lock - try to take the lock by moving the count | ||
12 | * from 1 to a 0 value | ||
13 | * @count: pointer of type atomic_t | ||
14 | * @fail_fn: function to call if the original value was not 1 | ||
15 | * | ||
16 | * Change the count from 1 to a value lower than 1, and call <fail_fn> if | ||
17 | * it wasn't 1 originally. This function MUST leave the value lower than | ||
18 | * 1 even when the "1" assertion wasn't true. | ||
19 | */ | ||
20 | static inline void | ||
21 | __mutex_fastpath_lock(atomic_t *count, fastcall void (*fail_fn)(atomic_t *)) | ||
22 | { | ||
23 | if (unlikely(atomic_dec_return(count) < 0)) | ||
24 | fail_fn(count); | ||
25 | else | ||
26 | smp_mb(); | ||
27 | } | ||
28 | |||
29 | /** | ||
30 | * __mutex_fastpath_lock_retval - try to take the lock by moving the count | ||
31 | * from 1 to a 0 value | ||
32 | * @count: pointer of type atomic_t | ||
33 | * @fail_fn: function to call if the original value was not 1 | ||
34 | * | ||
35 | * Change the count from 1 to a value lower than 1, and call <fail_fn> if | ||
36 | * it wasn't 1 originally. This function returns 0 if the fastpath succeeds, | ||
37 | * or anything the slow path function returns. | ||
38 | */ | ||
39 | static inline int | ||
40 | __mutex_fastpath_lock_retval(atomic_t *count, fastcall int (*fail_fn)(atomic_t *)) | ||
41 | { | ||
42 | if (unlikely(atomic_dec_return(count) < 0)) | ||
43 | return fail_fn(count); | ||
44 | else { | ||
45 | smp_mb(); | ||
46 | return 0; | ||
47 | } | ||
48 | } | ||
49 | |||
50 | /** | ||
51 | * __mutex_fastpath_unlock - try to promote the count from 0 to 1 | ||
52 | * @count: pointer of type atomic_t | ||
53 | * @fail_fn: function to call if the original value was not 0 | ||
54 | * | ||
55 | * Try to promote the count from 0 to 1. If it wasn't 0, call <fail_fn>. | ||
56 | * In the failure case, this function is allowed to either set the value to | ||
57 | * 1, or to set it to a value lower than 1. | ||
58 | * | ||
59 | * If the implementation sets it to a value of lower than 1, then the | ||
60 | * __mutex_slowpath_needs_to_unlock() macro needs to return 1, it needs | ||
61 | * to return 0 otherwise. | ||
62 | */ | ||
63 | static inline void | ||
64 | __mutex_fastpath_unlock(atomic_t *count, fastcall void (*fail_fn)(atomic_t *)) | ||
65 | { | ||
66 | smp_mb(); | ||
67 | if (unlikely(atomic_inc_return(count) <= 0)) | ||
68 | fail_fn(count); | ||
69 | } | ||
70 | |||
71 | #define __mutex_slowpath_needs_to_unlock() 1 | ||
72 | |||
73 | /** | ||
74 | * __mutex_fastpath_trylock - try to acquire the mutex, without waiting | ||
75 | * | ||
76 | * @count: pointer of type atomic_t | ||
77 | * @fail_fn: fallback function | ||
78 | * | ||
79 | * Change the count from 1 to a value lower than 1, and return 0 (failure) | ||
80 | * if it wasn't 1 originally, or return 1 (success) otherwise. This function | ||
81 | * MUST leave the value lower than 1 even when the "1" assertion wasn't true. | ||
82 | * Additionally, if the value was < 0 originally, this function must not leave | ||
83 | * it to 0 on failure. | ||
84 | * | ||
85 | * If the architecture has no effective trylock variant, it should call the | ||
86 | * <fail_fn> spinlock-based trylock variant unconditionally. | ||
87 | */ | ||
88 | static inline int | ||
89 | __mutex_fastpath_trylock(atomic_t *count, int (*fail_fn)(atomic_t *)) | ||
90 | { | ||
91 | /* | ||
92 | * We have two variants here. The cmpxchg based one is the best one | ||
93 | * because it never induce a false contention state. It is included | ||
94 | * here because architectures using the inc/dec algorithms over the | ||
95 | * xchg ones are much more likely to support cmpxchg natively. | ||
96 | * | ||
97 | * If not we fall back to the spinlock based variant - that is | ||
98 | * just as efficient (and simpler) as a 'destructive' probing of | ||
99 | * the mutex state would be. | ||
100 | */ | ||
101 | #ifdef __HAVE_ARCH_CMPXCHG | ||
102 | if (likely(atomic_cmpxchg(count, 1, 0) == 1)) { | ||
103 | smp_mb(); | ||
104 | return 1; | ||
105 | } | ||
106 | return 0; | ||
107 | #else | ||
108 | return fail_fn(count); | ||
109 | #endif | ||
110 | } | ||
111 | |||
112 | #endif | ||
diff --git a/arch/blackfin/include/asm/sections.h b/arch/blackfin/include/asm/sections.h index 1443c3353a8c..e7fd0ecd73f7 100644 --- a/arch/blackfin/include/asm/sections.h +++ b/arch/blackfin/include/asm/sections.h | |||
@@ -4,4 +4,15 @@ | |||
4 | /* nothing to see, move along */ | 4 | /* nothing to see, move along */ |
5 | #include <asm-generic/sections.h> | 5 | #include <asm-generic/sections.h> |
6 | 6 | ||
7 | /* only used when MTD_UCLINUX */ | ||
8 | extern unsigned long memory_mtd_start, memory_mtd_end, mtd_size; | ||
9 | |||
10 | extern unsigned long _ramstart, _ramend, _rambase; | ||
11 | extern unsigned long memory_start, memory_end, physical_mem_end; | ||
12 | |||
13 | extern char _stext_l1[], _etext_l1[], _sdata_l1[], _edata_l1[], _sbss_l1[], | ||
14 | _ebss_l1[], _l1_lma_start[], _sdata_b_l1[], _sbss_b_l1[], _ebss_b_l1[], | ||
15 | _stext_l2[], _etext_l2[], _sdata_l2[], _edata_l2[], _sbss_l2[], | ||
16 | _ebss_l2[], _l2_lma_start[]; | ||
17 | |||
7 | #endif | 18 | #endif |
diff --git a/arch/blackfin/include/asm/system.h b/arch/blackfin/include/asm/system.h index a4c8254bec55..294dbda24164 100644 --- a/arch/blackfin/include/asm/system.h +++ b/arch/blackfin/include/asm/system.h | |||
@@ -35,10 +35,10 @@ | |||
35 | #define _BLACKFIN_SYSTEM_H | 35 | #define _BLACKFIN_SYSTEM_H |
36 | 36 | ||
37 | #include <linux/linkage.h> | 37 | #include <linux/linkage.h> |
38 | #include <linux/compiler.h> | 38 | #include <linux/irqflags.h> |
39 | #include <mach/anomaly.h> | 39 | #include <mach/anomaly.h> |
40 | #include <asm/cache.h> | ||
40 | #include <asm/pda.h> | 41 | #include <asm/pda.h> |
41 | #include <asm/processor.h> | ||
42 | #include <asm/irq.h> | 42 | #include <asm/irq.h> |
43 | 43 | ||
44 | /* | 44 | /* |
diff --git a/arch/blackfin/include/asm/unistd.h b/arch/blackfin/include/asm/unistd.h index cf5066d3efd2..da35133c171d 100644 --- a/arch/blackfin/include/asm/unistd.h +++ b/arch/blackfin/include/asm/unistd.h | |||
@@ -380,8 +380,9 @@ | |||
380 | #define __NR_inotify_init1 365 | 380 | #define __NR_inotify_init1 365 |
381 | #define __NR_preadv 366 | 381 | #define __NR_preadv 366 |
382 | #define __NR_pwritev 367 | 382 | #define __NR_pwritev 367 |
383 | #define __NR_rt_tgsigqueueinfo 368 | ||
383 | 384 | ||
384 | #define __NR_syscall 368 | 385 | #define __NR_syscall 369 |
385 | #define NR_syscalls __NR_syscall | 386 | #define NR_syscalls __NR_syscall |
386 | 387 | ||
387 | /* Old optional stuff no one actually uses */ | 388 | /* Old optional stuff no one actually uses */ |
diff --git a/arch/blackfin/kernel/Makefile b/arch/blackfin/kernel/Makefile index fd4d4328a0f2..3731088e181b 100644 --- a/arch/blackfin/kernel/Makefile +++ b/arch/blackfin/kernel/Makefile | |||
@@ -15,6 +15,10 @@ else | |||
15 | obj-y += time.o | 15 | obj-y += time.o |
16 | endif | 16 | endif |
17 | 17 | ||
18 | obj-$(CONFIG_FUNCTION_TRACER) += ftrace-entry.o | ||
19 | obj-$(CONFIG_FUNCTION_GRAPH_TRACER) += ftrace.o | ||
20 | CFLAGS_REMOVE_ftrace.o = -pg | ||
21 | |||
18 | obj-$(CONFIG_IPIPE) += ipipe.o | 22 | obj-$(CONFIG_IPIPE) += ipipe.o |
19 | obj-$(CONFIG_IPIPE_TRACE_MCOUNT) += mcount.o | 23 | obj-$(CONFIG_IPIPE_TRACE_MCOUNT) += mcount.o |
20 | obj-$(CONFIG_BFIN_GPTIMERS) += gptimers.o | 24 | obj-$(CONFIG_BFIN_GPTIMERS) += gptimers.o |
@@ -23,6 +27,7 @@ obj-$(CONFIG_MODULES) += module.o | |||
23 | obj-$(CONFIG_KGDB) += kgdb.o | 27 | obj-$(CONFIG_KGDB) += kgdb.o |
24 | obj-$(CONFIG_KGDB_TESTS) += kgdb_test.o | 28 | obj-$(CONFIG_KGDB_TESTS) += kgdb_test.o |
25 | obj-$(CONFIG_EARLY_PRINTK) += early_printk.o | 29 | obj-$(CONFIG_EARLY_PRINTK) += early_printk.o |
30 | obj-$(CONFIG_STACKTRACE) += stacktrace.o | ||
26 | 31 | ||
27 | # the kgdb test puts code into L2 and without linker | 32 | # the kgdb test puts code into L2 and without linker |
28 | # relaxation, we need to force long calls to/from it | 33 | # relaxation, we need to force long calls to/from it |
diff --git a/arch/blackfin/kernel/bfin_dma_5xx.c b/arch/blackfin/kernel/bfin_dma_5xx.c index 763ed84ba459..e0bf8cc06907 100644 --- a/arch/blackfin/kernel/bfin_dma_5xx.c +++ b/arch/blackfin/kernel/bfin_dma_5xx.c | |||
@@ -453,10 +453,10 @@ void *dma_memcpy(void *pdst, const void *psrc, size_t size) | |||
453 | unsigned long src = (unsigned long)psrc; | 453 | unsigned long src = (unsigned long)psrc; |
454 | size_t bulk, rest; | 454 | size_t bulk, rest; |
455 | 455 | ||
456 | if (bfin_addr_dcachable(src)) | 456 | if (bfin_addr_dcacheable(src)) |
457 | blackfin_dcache_flush_range(src, src + size); | 457 | blackfin_dcache_flush_range(src, src + size); |
458 | 458 | ||
459 | if (bfin_addr_dcachable(dst)) | 459 | if (bfin_addr_dcacheable(dst)) |
460 | blackfin_dcache_invalidate_range(dst, dst + size); | 460 | blackfin_dcache_invalidate_range(dst, dst + size); |
461 | 461 | ||
462 | bulk = size & ~0xffff; | 462 | bulk = size & ~0xffff; |
diff --git a/arch/blackfin/kernel/bfin_ksyms.c b/arch/blackfin/kernel/bfin_ksyms.c index 53e893ff708a..aa05e638fb7c 100644 --- a/arch/blackfin/kernel/bfin_ksyms.c +++ b/arch/blackfin/kernel/bfin_ksyms.c | |||
@@ -103,3 +103,8 @@ EXPORT_SYMBOL(__raw_smp_mark_barrier_asm); | |||
103 | EXPORT_SYMBOL(__raw_smp_check_barrier_asm); | 103 | EXPORT_SYMBOL(__raw_smp_check_barrier_asm); |
104 | #endif | 104 | #endif |
105 | #endif | 105 | #endif |
106 | |||
107 | #ifdef CONFIG_FUNCTION_TRACER | ||
108 | extern void _mcount(void); | ||
109 | EXPORT_SYMBOL(_mcount); | ||
110 | #endif | ||
diff --git a/arch/blackfin/kernel/cplb-mpu/cplbmgr.c b/arch/blackfin/kernel/cplb-mpu/cplbmgr.c index 87463ce87f5a..784923e52a9a 100644 --- a/arch/blackfin/kernel/cplb-mpu/cplbmgr.c +++ b/arch/blackfin/kernel/cplb-mpu/cplbmgr.c | |||
@@ -151,7 +151,7 @@ static noinline int dcplb_miss(unsigned int cpu) | |||
151 | 151 | ||
152 | d_data = CPLB_SUPV_WR | CPLB_VALID | CPLB_DIRTY | PAGE_SIZE_4KB; | 152 | d_data = CPLB_SUPV_WR | CPLB_VALID | CPLB_DIRTY | PAGE_SIZE_4KB; |
153 | #ifdef CONFIG_BFIN_DCACHE | 153 | #ifdef CONFIG_BFIN_DCACHE |
154 | if (bfin_addr_dcachable(addr)) { | 154 | if (bfin_addr_dcacheable(addr)) { |
155 | d_data |= CPLB_L1_CHBL | ANOMALY_05000158_WORKAROUND; | 155 | d_data |= CPLB_L1_CHBL | ANOMALY_05000158_WORKAROUND; |
156 | #ifdef CONFIG_BFIN_WT | 156 | #ifdef CONFIG_BFIN_WT |
157 | d_data |= CPLB_L1_AOW | CPLB_WT; | 157 | d_data |= CPLB_L1_AOW | CPLB_WT; |
diff --git a/arch/blackfin/kernel/cplb-nompu/cplbmgr.c b/arch/blackfin/kernel/cplb-nompu/cplbmgr.c index 8cbb47c7b663..12b030842fdb 100644 --- a/arch/blackfin/kernel/cplb-nompu/cplbmgr.c +++ b/arch/blackfin/kernel/cplb-nompu/cplbmgr.c | |||
@@ -28,6 +28,7 @@ | |||
28 | #include <asm/cplbinit.h> | 28 | #include <asm/cplbinit.h> |
29 | #include <asm/cplb.h> | 29 | #include <asm/cplb.h> |
30 | #include <asm/mmu_context.h> | 30 | #include <asm/mmu_context.h> |
31 | #include <asm/traps.h> | ||
31 | 32 | ||
32 | /* | 33 | /* |
33 | * WARNING | 34 | * WARNING |
@@ -100,28 +101,6 @@ static inline void write_icplb_data(int cpu, int idx, unsigned long data, | |||
100 | #endif | 101 | #endif |
101 | } | 102 | } |
102 | 103 | ||
103 | /* | ||
104 | * Given the contents of the status register, return the index of the | ||
105 | * CPLB that caused the fault. | ||
106 | */ | ||
107 | static inline int faulting_cplb_index(int status) | ||
108 | { | ||
109 | int signbits = __builtin_bfin_norm_fr1x32(status & 0xFFFF); | ||
110 | return 30 - signbits; | ||
111 | } | ||
112 | |||
113 | /* | ||
114 | * Given the contents of the status register and the DCPLB_DATA contents, | ||
115 | * return true if a write access should be permitted. | ||
116 | */ | ||
117 | static inline int write_permitted(int status, unsigned long data) | ||
118 | { | ||
119 | if (status & FAULT_USERSUPV) | ||
120 | return !!(data & CPLB_SUPV_WR); | ||
121 | else | ||
122 | return !!(data & CPLB_USER_WR); | ||
123 | } | ||
124 | |||
125 | /* Counters to implement round-robin replacement. */ | 104 | /* Counters to implement round-robin replacement. */ |
126 | static int icplb_rr_index[NR_CPUS] PDT_ATTR; | 105 | static int icplb_rr_index[NR_CPUS] PDT_ATTR; |
127 | static int dcplb_rr_index[NR_CPUS] PDT_ATTR; | 106 | static int dcplb_rr_index[NR_CPUS] PDT_ATTR; |
@@ -245,43 +224,16 @@ MGR_ATTR static int dcplb_miss(int cpu) | |||
245 | return CPLB_RELOADED; | 224 | return CPLB_RELOADED; |
246 | } | 225 | } |
247 | 226 | ||
248 | MGR_ATTR static noinline int dcplb_protection_fault(int cpu) | ||
249 | { | ||
250 | int status = bfin_read_DCPLB_STATUS(); | ||
251 | |||
252 | nr_dcplb_prot[cpu]++; | ||
253 | |||
254 | if (likely(status & FAULT_RW)) { | ||
255 | int idx = faulting_cplb_index(status); | ||
256 | unsigned long regaddr = DCPLB_DATA0 + idx * 4; | ||
257 | unsigned long data = bfin_read32(regaddr); | ||
258 | |||
259 | /* Check if fault is to dirty a clean page */ | ||
260 | if (!(data & CPLB_WT) && !(data & CPLB_DIRTY) && | ||
261 | write_permitted(status, data)) { | ||
262 | |||
263 | dcplb_tbl[cpu][idx].data = data; | ||
264 | bfin_write32(regaddr, data); | ||
265 | return CPLB_RELOADED; | ||
266 | } | ||
267 | } | ||
268 | |||
269 | return CPLB_PROT_VIOL; | ||
270 | } | ||
271 | |||
272 | MGR_ATTR int cplb_hdr(int seqstat, struct pt_regs *regs) | 227 | MGR_ATTR int cplb_hdr(int seqstat, struct pt_regs *regs) |
273 | { | 228 | { |
274 | int cause = seqstat & 0x3f; | 229 | int cause = seqstat & 0x3f; |
275 | unsigned int cpu = smp_processor_id(); | 230 | unsigned int cpu = smp_processor_id(); |
276 | switch (cause) { | 231 | switch (cause) { |
277 | case 0x2C: | 232 | case VEC_CPLB_I_M: |
278 | return icplb_miss(cpu); | 233 | return icplb_miss(cpu); |
279 | case 0x26: | 234 | case VEC_CPLB_M: |
280 | return dcplb_miss(cpu); | 235 | return dcplb_miss(cpu); |
281 | default: | 236 | default: |
282 | if (unlikely(cause == 0x23)) | ||
283 | return dcplb_protection_fault(cpu); | ||
284 | |||
285 | return CPLB_UNKNOWN_ERR; | 237 | return CPLB_UNKNOWN_ERR; |
286 | } | 238 | } |
287 | } | 239 | } |
diff --git a/arch/blackfin/kernel/early_printk.c b/arch/blackfin/kernel/early_printk.c index 3302719173ca..2ab56811841c 100644 --- a/arch/blackfin/kernel/early_printk.c +++ b/arch/blackfin/kernel/early_printk.c | |||
@@ -202,11 +202,15 @@ asmlinkage void __init init_early_exception_vectors(void) | |||
202 | asmlinkage void __init early_trap_c(struct pt_regs *fp, void *retaddr) | 202 | asmlinkage void __init early_trap_c(struct pt_regs *fp, void *retaddr) |
203 | { | 203 | { |
204 | /* This can happen before the uart is initialized, so initialize | 204 | /* This can happen before the uart is initialized, so initialize |
205 | * the UART now | 205 | * the UART now (but only if we are running on the processor we think |
206 | * we are compiled for - otherwise we write to MMRs that don't exist, | ||
207 | * and cause other problems. Nothing comes out the UART, but it does | ||
208 | * end up in the __buf_log. | ||
206 | */ | 209 | */ |
207 | if (likely(early_console == NULL)) | 210 | if (likely(early_console == NULL) && CPUID == bfin_cpuid()) |
208 | setup_early_printk(DEFAULT_EARLY_PORT); | 211 | setup_early_printk(DEFAULT_EARLY_PORT); |
209 | 212 | ||
213 | printk(KERN_EMERG "Early panic\n"); | ||
210 | dump_bfin_mem(fp); | 214 | dump_bfin_mem(fp); |
211 | show_regs(fp); | 215 | show_regs(fp); |
212 | dump_bfin_trace_buffer(); | 216 | dump_bfin_trace_buffer(); |
diff --git a/arch/blackfin/kernel/ftrace-entry.S b/arch/blackfin/kernel/ftrace-entry.S new file mode 100644 index 000000000000..6980b7a0615d --- /dev/null +++ b/arch/blackfin/kernel/ftrace-entry.S | |||
@@ -0,0 +1,140 @@ | |||
1 | /* | ||
2 | * mcount and friends -- ftrace stuff | ||
3 | * | ||
4 | * Copyright (C) 2009 Analog Devices Inc. | ||
5 | * Licensed under the GPL-2 or later. | ||
6 | */ | ||
7 | |||
8 | #include <linux/linkage.h> | ||
9 | #include <asm/ftrace.h> | ||
10 | |||
11 | .text | ||
12 | |||
13 | /* GCC will have called us before setting up the function prologue, so we | ||
14 | * can clobber the normal scratch registers, but we need to make sure to | ||
15 | * save/restore the registers used for argument passing (R0-R2) in case | ||
16 | * the profiled function is using them. With data registers, R3 is the | ||
17 | * only one we can blow away. With pointer registers, we have P0-P2. | ||
18 | * | ||
19 | * Upon entry, the RETS will point to the top of the current profiled | ||
20 | * function. And since GCC setup the frame for us, the previous function | ||
21 | * will be waiting there. mmmm pie. | ||
22 | */ | ||
23 | ENTRY(__mcount) | ||
24 | /* save third function arg early so we can do testing below */ | ||
25 | [--sp] = r2; | ||
26 | |||
27 | /* load the function pointer to the tracer */ | ||
28 | p0.l = _ftrace_trace_function; | ||
29 | p0.h = _ftrace_trace_function; | ||
30 | r3 = [p0]; | ||
31 | |||
32 | /* optional micro optimization: don't call the stub tracer */ | ||
33 | r2.l = _ftrace_stub; | ||
34 | r2.h = _ftrace_stub; | ||
35 | cc = r2 == r3; | ||
36 | if ! cc jump .Ldo_trace; | ||
37 | |||
38 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
39 | /* if the ftrace_graph_return function pointer is not set to | ||
40 | * the ftrace_stub entry, call prepare_ftrace_return(). | ||
41 | */ | ||
42 | p0.l = _ftrace_graph_return; | ||
43 | p0.h = _ftrace_graph_return; | ||
44 | r3 = [p0]; | ||
45 | cc = r2 == r3; | ||
46 | if ! cc jump _ftrace_graph_caller; | ||
47 | |||
48 | /* similarly, if the ftrace_graph_entry function pointer is not | ||
49 | * set to the ftrace_graph_entry_stub entry, ... | ||
50 | */ | ||
51 | p0.l = _ftrace_graph_entry; | ||
52 | p0.h = _ftrace_graph_entry; | ||
53 | r2.l = _ftrace_graph_entry_stub; | ||
54 | r2.h = _ftrace_graph_entry_stub; | ||
55 | r3 = [p0]; | ||
56 | cc = r2 == r3; | ||
57 | if ! cc jump _ftrace_graph_caller; | ||
58 | #endif | ||
59 | |||
60 | r2 = [sp++]; | ||
61 | rts; | ||
62 | |||
63 | .Ldo_trace: | ||
64 | |||
65 | /* save first/second function arg and the return register */ | ||
66 | [--sp] = r0; | ||
67 | [--sp] = r1; | ||
68 | [--sp] = rets; | ||
69 | |||
70 | /* setup the tracer function */ | ||
71 | p0 = r3; | ||
72 | |||
73 | /* tracer(ulong frompc, ulong selfpc): | ||
74 | * frompc: the pc that did the call to ... | ||
75 | * selfpc: ... this location | ||
76 | * the selfpc itself will need adjusting for the mcount call | ||
77 | */ | ||
78 | r1 = rets; | ||
79 | r0 = [fp + 4]; | ||
80 | r1 += -MCOUNT_INSN_SIZE; | ||
81 | |||
82 | /* call the tracer */ | ||
83 | call (p0); | ||
84 | |||
85 | /* restore state and get out of dodge */ | ||
86 | .Lfinish_trace: | ||
87 | rets = [sp++]; | ||
88 | r1 = [sp++]; | ||
89 | r0 = [sp++]; | ||
90 | r2 = [sp++]; | ||
91 | |||
92 | .globl _ftrace_stub | ||
93 | _ftrace_stub: | ||
94 | rts; | ||
95 | ENDPROC(__mcount) | ||
96 | |||
97 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
98 | /* The prepare_ftrace_return() function is similar to the trace function | ||
99 | * except it takes a pointer to the location of the frompc. This is so | ||
100 | * the prepare_ftrace_return() can hijack it temporarily for probing | ||
101 | * purposes. | ||
102 | */ | ||
103 | ENTRY(_ftrace_graph_caller) | ||
104 | /* save first/second function arg and the return register */ | ||
105 | [--sp] = r0; | ||
106 | [--sp] = r1; | ||
107 | [--sp] = rets; | ||
108 | |||
109 | r0 = fp; | ||
110 | r1 = rets; | ||
111 | r0 += 4; | ||
112 | r1 += -MCOUNT_INSN_SIZE; | ||
113 | call _prepare_ftrace_return; | ||
114 | |||
115 | jump .Lfinish_trace; | ||
116 | ENDPROC(_ftrace_graph_caller) | ||
117 | |||
118 | /* Undo the rewrite caused by ftrace_graph_caller(). The common function | ||
119 | * ftrace_return_to_handler() will return the original rets so we can | ||
120 | * restore it and be on our way. | ||
121 | */ | ||
122 | ENTRY(_return_to_handler) | ||
123 | /* make sure original return values are saved */ | ||
124 | [--sp] = p0; | ||
125 | [--sp] = r0; | ||
126 | [--sp] = r1; | ||
127 | |||
128 | /* get original return address */ | ||
129 | call _ftrace_return_to_handler; | ||
130 | rets = r0; | ||
131 | |||
132 | /* anomaly 05000371 - make sure we have at least three instructions | ||
133 | * between rets setting and the return | ||
134 | */ | ||
135 | r1 = [sp++]; | ||
136 | r0 = [sp++]; | ||
137 | p0 = [sp++]; | ||
138 | rts; | ||
139 | ENDPROC(_return_to_handler) | ||
140 | #endif | ||
diff --git a/arch/blackfin/kernel/ftrace.c b/arch/blackfin/kernel/ftrace.c new file mode 100644 index 000000000000..905bfc40a00b --- /dev/null +++ b/arch/blackfin/kernel/ftrace.c | |||
@@ -0,0 +1,42 @@ | |||
1 | /* | ||
2 | * ftrace graph code | ||
3 | * | ||
4 | * Copyright (C) 2009 Analog Devices Inc. | ||
5 | * Licensed under the GPL-2 or later. | ||
6 | */ | ||
7 | |||
8 | #include <linux/ftrace.h> | ||
9 | #include <linux/kernel.h> | ||
10 | #include <linux/sched.h> | ||
11 | #include <asm/atomic.h> | ||
12 | |||
13 | #ifdef CONFIG_FUNCTION_GRAPH_TRACER | ||
14 | |||
15 | /* | ||
16 | * Hook the return address and push it in the stack of return addrs | ||
17 | * in current thread info. | ||
18 | */ | ||
19 | void prepare_ftrace_return(unsigned long *parent, unsigned long self_addr) | ||
20 | { | ||
21 | struct ftrace_graph_ent trace; | ||
22 | unsigned long return_hooker = (unsigned long)&return_to_handler; | ||
23 | |||
24 | if (unlikely(atomic_read(¤t->tracing_graph_pause))) | ||
25 | return; | ||
26 | |||
27 | if (ftrace_push_return_trace(*parent, self_addr, &trace.depth) == -EBUSY) | ||
28 | return; | ||
29 | |||
30 | trace.func = self_addr; | ||
31 | |||
32 | /* Only trace if the calling function expects to */ | ||
33 | if (!ftrace_graph_entry(&trace)) { | ||
34 | current->curr_ret_stack--; | ||
35 | return; | ||
36 | } | ||
37 | |||
38 | /* all is well in the world ! hijack RETS ... */ | ||
39 | *parent = return_hooker; | ||
40 | } | ||
41 | |||
42 | #endif | ||
diff --git a/arch/blackfin/kernel/init_task.c b/arch/blackfin/kernel/init_task.c index 2c228c020978..c26c34de9f3c 100644 --- a/arch/blackfin/kernel/init_task.c +++ b/arch/blackfin/kernel/init_task.c | |||
@@ -35,10 +35,6 @@ | |||
35 | 35 | ||
36 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 36 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
37 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 37 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
38 | |||
39 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
40 | EXPORT_SYMBOL(init_mm); | ||
41 | |||
42 | /* | 38 | /* |
43 | * Initial task structure. | 39 | * Initial task structure. |
44 | * | 40 | * |
diff --git a/arch/blackfin/kernel/ipipe.c b/arch/blackfin/kernel/ipipe.c index 5fc424803a17..d8cde1fc5cb9 100644 --- a/arch/blackfin/kernel/ipipe.c +++ b/arch/blackfin/kernel/ipipe.c | |||
@@ -99,7 +99,7 @@ void __ipipe_handle_irq(unsigned irq, struct pt_regs *regs) | |||
99 | * interrupt. | 99 | * interrupt. |
100 | */ | 100 | */ |
101 | m_ack = (regs == NULL || irq == IRQ_SYSTMR || irq == IRQ_CORETMR); | 101 | m_ack = (regs == NULL || irq == IRQ_SYSTMR || irq == IRQ_CORETMR); |
102 | this_domain = ipipe_current_domain; | 102 | this_domain = __ipipe_current_domain; |
103 | 103 | ||
104 | if (unlikely(test_bit(IPIPE_STICKY_FLAG, &this_domain->irqs[irq].control))) | 104 | if (unlikely(test_bit(IPIPE_STICKY_FLAG, &this_domain->irqs[irq].control))) |
105 | head = &this_domain->p_link; | 105 | head = &this_domain->p_link; |
@@ -212,7 +212,9 @@ void __ipipe_unstall_root_raw(void) | |||
212 | 212 | ||
213 | int __ipipe_syscall_root(struct pt_regs *regs) | 213 | int __ipipe_syscall_root(struct pt_regs *regs) |
214 | { | 214 | { |
215 | struct ipipe_percpu_domain_data *p; | ||
215 | unsigned long flags; | 216 | unsigned long flags; |
217 | int ret; | ||
216 | 218 | ||
217 | /* | 219 | /* |
218 | * We need to run the IRQ tail hook whenever we don't | 220 | * We need to run the IRQ tail hook whenever we don't |
@@ -231,29 +233,31 @@ int __ipipe_syscall_root(struct pt_regs *regs) | |||
231 | /* | 233 | /* |
232 | * This routine either returns: | 234 | * This routine either returns: |
233 | * 0 -- if the syscall is to be passed to Linux; | 235 | * 0 -- if the syscall is to be passed to Linux; |
234 | * 1 -- if the syscall should not be passed to Linux, and no | 236 | * >0 -- if the syscall should not be passed to Linux, and no |
235 | * tail work should be performed; | 237 | * tail work should be performed; |
236 | * -1 -- if the syscall should not be passed to Linux but the | 238 | * <0 -- if the syscall should not be passed to Linux but the |
237 | * tail work has to be performed (for handling signals etc). | 239 | * tail work has to be performed (for handling signals etc). |
238 | */ | 240 | */ |
239 | 241 | ||
240 | if (__ipipe_event_monitored_p(IPIPE_EVENT_SYSCALL) && | 242 | if (!__ipipe_event_monitored_p(IPIPE_EVENT_SYSCALL)) |
241 | __ipipe_dispatch_event(IPIPE_EVENT_SYSCALL, regs) > 0) { | 243 | return 0; |
242 | if (ipipe_root_domain_p && !in_atomic()) { | 244 | |
243 | /* | 245 | ret = __ipipe_dispatch_event(IPIPE_EVENT_SYSCALL, regs); |
244 | * Sync pending VIRQs before _TIF_NEED_RESCHED | 246 | |
245 | * is tested. | 247 | local_irq_save_hw(flags); |
246 | */ | 248 | |
247 | local_irq_save_hw(flags); | 249 | if (!__ipipe_root_domain_p) { |
248 | if ((ipipe_root_cpudom_var(irqpend_himask) & IPIPE_IRQMASK_VIRT) != 0) | 250 | local_irq_restore_hw(flags); |
249 | __ipipe_sync_pipeline(IPIPE_IRQMASK_VIRT); | ||
250 | local_irq_restore_hw(flags); | ||
251 | return -1; | ||
252 | } | ||
253 | return 1; | 251 | return 1; |
254 | } | 252 | } |
255 | 253 | ||
256 | return 0; | 254 | p = ipipe_root_cpudom_ptr(); |
255 | if ((p->irqpend_himask & IPIPE_IRQMASK_VIRT) != 0) | ||
256 | __ipipe_sync_pipeline(IPIPE_IRQMASK_VIRT); | ||
257 | |||
258 | local_irq_restore_hw(flags); | ||
259 | |||
260 | return -ret; | ||
257 | } | 261 | } |
258 | 262 | ||
259 | unsigned long ipipe_critical_enter(void (*syncfn) (void)) | 263 | unsigned long ipipe_critical_enter(void (*syncfn) (void)) |
@@ -329,9 +333,7 @@ asmlinkage void __ipipe_sync_root(void) | |||
329 | 333 | ||
330 | void ___ipipe_sync_pipeline(unsigned long syncmask) | 334 | void ___ipipe_sync_pipeline(unsigned long syncmask) |
331 | { | 335 | { |
332 | struct ipipe_domain *ipd = ipipe_current_domain; | 336 | if (__ipipe_root_domain_p) { |
333 | |||
334 | if (ipd == ipipe_root_domain) { | ||
335 | if (test_bit(IPIPE_SYNCDEFER_FLAG, &ipipe_root_cpudom_var(status))) | 337 | if (test_bit(IPIPE_SYNCDEFER_FLAG, &ipipe_root_cpudom_var(status))) |
336 | return; | 338 | return; |
337 | } | 339 | } |
diff --git a/arch/blackfin/kernel/setup.c b/arch/blackfin/kernel/setup.c index 80447f99c2b5..6454babdfaff 100644 --- a/arch/blackfin/kernel/setup.c +++ b/arch/blackfin/kernel/setup.c | |||
@@ -1098,7 +1098,7 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
1098 | CPUID, bfin_cpuid()); | 1098 | CPUID, bfin_cpuid()); |
1099 | 1099 | ||
1100 | seq_printf(m, "model name\t: ADSP-%s %lu(MHz CCLK) %lu(MHz SCLK) (%s)\n" | 1100 | seq_printf(m, "model name\t: ADSP-%s %lu(MHz CCLK) %lu(MHz SCLK) (%s)\n" |
1101 | "stepping\t: %d\n", | 1101 | "stepping\t: %d ", |
1102 | cpu, cclk/1000000, sclk/1000000, | 1102 | cpu, cclk/1000000, sclk/1000000, |
1103 | #ifdef CONFIG_MPU | 1103 | #ifdef CONFIG_MPU |
1104 | "mpu on", | 1104 | "mpu on", |
@@ -1107,7 +1107,16 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
1107 | #endif | 1107 | #endif |
1108 | revid); | 1108 | revid); |
1109 | 1109 | ||
1110 | seq_printf(m, "cpu MHz\t\t: %lu.%03lu/%lu.%03lu\n", | 1110 | if (bfin_revid() != bfin_compiled_revid()) { |
1111 | if (bfin_compiled_revid() == -1) | ||
1112 | seq_printf(m, "(Compiled for Rev none)"); | ||
1113 | else if (bfin_compiled_revid() == 0xffff) | ||
1114 | seq_printf(m, "(Compiled for Rev any)"); | ||
1115 | else | ||
1116 | seq_printf(m, "(Compiled for Rev %d)", bfin_compiled_revid()); | ||
1117 | } | ||
1118 | |||
1119 | seq_printf(m, "\ncpu MHz\t\t: %lu.%03lu/%lu.%03lu\n", | ||
1111 | cclk/1000000, cclk%1000000, | 1120 | cclk/1000000, cclk%1000000, |
1112 | sclk/1000000, sclk%1000000); | 1121 | sclk/1000000, sclk%1000000); |
1113 | seq_printf(m, "bogomips\t: %lu.%02lu\n" | 1122 | seq_printf(m, "bogomips\t: %lu.%02lu\n" |
@@ -1172,6 +1181,9 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
1172 | #ifdef __ARCH_SYNC_CORE_DCACHE | 1181 | #ifdef __ARCH_SYNC_CORE_DCACHE |
1173 | seq_printf(m, "SMP Dcache Flushes\t: %lu\n\n", cpudata->dcache_invld_count); | 1182 | seq_printf(m, "SMP Dcache Flushes\t: %lu\n\n", cpudata->dcache_invld_count); |
1174 | #endif | 1183 | #endif |
1184 | #ifdef __ARCH_SYNC_CORE_ICACHE | ||
1185 | seq_printf(m, "SMP Icache Flushes\t: %lu\n\n", cpudata->icache_invld_count); | ||
1186 | #endif | ||
1175 | #ifdef CONFIG_BFIN_ICACHE_LOCK | 1187 | #ifdef CONFIG_BFIN_ICACHE_LOCK |
1176 | switch ((cpudata->imemctl >> 3) & WAYALL_L) { | 1188 | switch ((cpudata->imemctl >> 3) & WAYALL_L) { |
1177 | case WAY0_L: | 1189 | case WAY0_L: |
diff --git a/arch/blackfin/kernel/stacktrace.c b/arch/blackfin/kernel/stacktrace.c new file mode 100644 index 000000000000..30301e1eace5 --- /dev/null +++ b/arch/blackfin/kernel/stacktrace.c | |||
@@ -0,0 +1,53 @@ | |||
1 | /* | ||
2 | * Blackfin stacktrace code (mostly copied from avr32) | ||
3 | * | ||
4 | * Copyright 2009 Analog Devices Inc. | ||
5 | * Licensed under the GPL-2 or later. | ||
6 | */ | ||
7 | |||
8 | #include <linux/sched.h> | ||
9 | #include <linux/stacktrace.h> | ||
10 | #include <linux/thread_info.h> | ||
11 | #include <linux/module.h> | ||
12 | |||
13 | register unsigned long current_frame_pointer asm("FP"); | ||
14 | |||
15 | struct stackframe { | ||
16 | unsigned long fp; | ||
17 | unsigned long rets; | ||
18 | }; | ||
19 | |||
20 | /* | ||
21 | * Save stack-backtrace addresses into a stack_trace buffer. | ||
22 | */ | ||
23 | void save_stack_trace(struct stack_trace *trace) | ||
24 | { | ||
25 | unsigned long low, high; | ||
26 | unsigned long fp; | ||
27 | struct stackframe *frame; | ||
28 | int skip = trace->skip; | ||
29 | |||
30 | low = (unsigned long)task_stack_page(current); | ||
31 | high = low + THREAD_SIZE; | ||
32 | fp = current_frame_pointer; | ||
33 | |||
34 | while (fp >= low && fp <= (high - sizeof(*frame))) { | ||
35 | frame = (struct stackframe *)fp; | ||
36 | |||
37 | if (skip) { | ||
38 | skip--; | ||
39 | } else { | ||
40 | trace->entries[trace->nr_entries++] = frame->rets; | ||
41 | if (trace->nr_entries >= trace->max_entries) | ||
42 | break; | ||
43 | } | ||
44 | |||
45 | /* | ||
46 | * The next frame must be at a higher address than the | ||
47 | * current frame. | ||
48 | */ | ||
49 | low = fp + sizeof(*frame); | ||
50 | fp = frame->fp; | ||
51 | } | ||
52 | } | ||
53 | EXPORT_SYMBOL_GPL(save_stack_trace); | ||
diff --git a/arch/blackfin/kernel/traps.c b/arch/blackfin/kernel/traps.c index aa76dfb0226e..d279552fe9b0 100644 --- a/arch/blackfin/kernel/traps.c +++ b/arch/blackfin/kernel/traps.c | |||
@@ -27,6 +27,7 @@ | |||
27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 27 | * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
28 | */ | 28 | */ |
29 | 29 | ||
30 | #include <linux/bug.h> | ||
30 | #include <linux/uaccess.h> | 31 | #include <linux/uaccess.h> |
31 | #include <linux/interrupt.h> | 32 | #include <linux/interrupt.h> |
32 | #include <linux/module.h> | 33 | #include <linux/module.h> |
@@ -238,6 +239,11 @@ asmlinkage void double_fault_c(struct pt_regs *fp) | |||
238 | 239 | ||
239 | } | 240 | } |
240 | 241 | ||
242 | static int kernel_mode_regs(struct pt_regs *regs) | ||
243 | { | ||
244 | return regs->ipend & 0xffc0; | ||
245 | } | ||
246 | |||
241 | asmlinkage void trap_c(struct pt_regs *fp) | 247 | asmlinkage void trap_c(struct pt_regs *fp) |
242 | { | 248 | { |
243 | #ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON | 249 | #ifdef CONFIG_DEBUG_BFIN_HWTRACE_ON |
@@ -246,6 +252,7 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
246 | #ifdef CONFIG_DEBUG_HUNT_FOR_ZERO | 252 | #ifdef CONFIG_DEBUG_HUNT_FOR_ZERO |
247 | unsigned int cpu = smp_processor_id(); | 253 | unsigned int cpu = smp_processor_id(); |
248 | #endif | 254 | #endif |
255 | const char *strerror = NULL; | ||
249 | int sig = 0; | 256 | int sig = 0; |
250 | siginfo_t info; | 257 | siginfo_t info; |
251 | unsigned long trapnr = fp->seqstat & SEQSTAT_EXCAUSE; | 258 | unsigned long trapnr = fp->seqstat & SEQSTAT_EXCAUSE; |
@@ -259,27 +266,10 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
259 | * double faults if the stack has become corrupt | 266 | * double faults if the stack has become corrupt |
260 | */ | 267 | */ |
261 | 268 | ||
262 | /* If the fault was caused by a kernel thread, or interrupt handler | 269 | #ifndef CONFIG_KGDB |
263 | * we will kernel panic, so the system reboots. | 270 | /* IPEND is skipped if KGDB isn't enabled (see entry code) */ |
264 | * If KGDB is enabled, don't set this for kernel breakpoints | 271 | fp->ipend = bfin_read_IPEND(); |
265 | */ | ||
266 | |||
267 | /* TODO: check to see if we are in some sort of deferred HWERR | ||
268 | * that we should be able to recover from, not kernel panic | ||
269 | */ | ||
270 | if ((bfin_read_IPEND() & 0xFFC0) && (trapnr != VEC_STEP) | ||
271 | #ifdef CONFIG_KGDB | ||
272 | && (trapnr != VEC_EXCPT02) | ||
273 | #endif | 272 | #endif |
274 | ){ | ||
275 | console_verbose(); | ||
276 | oops_in_progress = 1; | ||
277 | } else if (current) { | ||
278 | if (current->mm == NULL) { | ||
279 | console_verbose(); | ||
280 | oops_in_progress = 1; | ||
281 | } | ||
282 | } | ||
283 | 273 | ||
284 | /* trap_c() will be called for exceptions. During exceptions | 274 | /* trap_c() will be called for exceptions. During exceptions |
285 | * processing, the pc value should be set with retx value. | 275 | * processing, the pc value should be set with retx value. |
@@ -307,15 +297,15 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
307 | sig = SIGTRAP; | 297 | sig = SIGTRAP; |
308 | CHK_DEBUGGER_TRAP_MAYBE(); | 298 | CHK_DEBUGGER_TRAP_MAYBE(); |
309 | /* Check if this is a breakpoint in kernel space */ | 299 | /* Check if this is a breakpoint in kernel space */ |
310 | if (fp->ipend & 0xffc0) | 300 | if (kernel_mode_regs(fp)) |
311 | return; | 301 | goto traps_done; |
312 | else | 302 | else |
313 | break; | 303 | break; |
314 | /* 0x03 - User Defined, userspace stack overflow */ | 304 | /* 0x03 - User Defined, userspace stack overflow */ |
315 | case VEC_EXCPT03: | 305 | case VEC_EXCPT03: |
316 | info.si_code = SEGV_STACKFLOW; | 306 | info.si_code = SEGV_STACKFLOW; |
317 | sig = SIGSEGV; | 307 | sig = SIGSEGV; |
318 | verbose_printk(KERN_NOTICE EXC_0x03(KERN_NOTICE)); | 308 | strerror = KERN_NOTICE EXC_0x03(KERN_NOTICE); |
319 | CHK_DEBUGGER_TRAP_MAYBE(); | 309 | CHK_DEBUGGER_TRAP_MAYBE(); |
320 | break; | 310 | break; |
321 | /* 0x02 - KGDB initial connection and break signal trap */ | 311 | /* 0x02 - KGDB initial connection and break signal trap */ |
@@ -324,7 +314,7 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
324 | info.si_code = TRAP_ILLTRAP; | 314 | info.si_code = TRAP_ILLTRAP; |
325 | sig = SIGTRAP; | 315 | sig = SIGTRAP; |
326 | CHK_DEBUGGER_TRAP(); | 316 | CHK_DEBUGGER_TRAP(); |
327 | return; | 317 | goto traps_done; |
328 | #endif | 318 | #endif |
329 | /* 0x04 - User Defined */ | 319 | /* 0x04 - User Defined */ |
330 | /* 0x05 - User Defined */ | 320 | /* 0x05 - User Defined */ |
@@ -344,7 +334,7 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
344 | case VEC_EXCPT04 ... VEC_EXCPT15: | 334 | case VEC_EXCPT04 ... VEC_EXCPT15: |
345 | info.si_code = ILL_ILLPARAOP; | 335 | info.si_code = ILL_ILLPARAOP; |
346 | sig = SIGILL; | 336 | sig = SIGILL; |
347 | verbose_printk(KERN_NOTICE EXC_0x04(KERN_NOTICE)); | 337 | strerror = KERN_NOTICE EXC_0x04(KERN_NOTICE); |
348 | CHK_DEBUGGER_TRAP_MAYBE(); | 338 | CHK_DEBUGGER_TRAP_MAYBE(); |
349 | break; | 339 | break; |
350 | /* 0x10 HW Single step, handled here */ | 340 | /* 0x10 HW Single step, handled here */ |
@@ -353,15 +343,15 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
353 | sig = SIGTRAP; | 343 | sig = SIGTRAP; |
354 | CHK_DEBUGGER_TRAP_MAYBE(); | 344 | CHK_DEBUGGER_TRAP_MAYBE(); |
355 | /* Check if this is a single step in kernel space */ | 345 | /* Check if this is a single step in kernel space */ |
356 | if (fp->ipend & 0xffc0) | 346 | if (kernel_mode_regs(fp)) |
357 | return; | 347 | goto traps_done; |
358 | else | 348 | else |
359 | break; | 349 | break; |
360 | /* 0x11 - Trace Buffer Full, handled here */ | 350 | /* 0x11 - Trace Buffer Full, handled here */ |
361 | case VEC_OVFLOW: | 351 | case VEC_OVFLOW: |
362 | info.si_code = TRAP_TRACEFLOW; | 352 | info.si_code = TRAP_TRACEFLOW; |
363 | sig = SIGTRAP; | 353 | sig = SIGTRAP; |
364 | verbose_printk(KERN_NOTICE EXC_0x11(KERN_NOTICE)); | 354 | strerror = KERN_NOTICE EXC_0x11(KERN_NOTICE); |
365 | CHK_DEBUGGER_TRAP_MAYBE(); | 355 | CHK_DEBUGGER_TRAP_MAYBE(); |
366 | break; | 356 | break; |
367 | /* 0x12 - Reserved, Caught by default */ | 357 | /* 0x12 - Reserved, Caught by default */ |
@@ -381,37 +371,54 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
381 | /* 0x20 - Reserved, Caught by default */ | 371 | /* 0x20 - Reserved, Caught by default */ |
382 | /* 0x21 - Undefined Instruction, handled here */ | 372 | /* 0x21 - Undefined Instruction, handled here */ |
383 | case VEC_UNDEF_I: | 373 | case VEC_UNDEF_I: |
374 | #ifdef CONFIG_BUG | ||
375 | if (kernel_mode_regs(fp)) { | ||
376 | switch (report_bug(fp->pc, fp)) { | ||
377 | case BUG_TRAP_TYPE_NONE: | ||
378 | break; | ||
379 | case BUG_TRAP_TYPE_WARN: | ||
380 | dump_bfin_trace_buffer(); | ||
381 | fp->pc += 2; | ||
382 | goto traps_done; | ||
383 | case BUG_TRAP_TYPE_BUG: | ||
384 | /* call to panic() will dump trace, and it is | ||
385 | * off at this point, so it won't be clobbered | ||
386 | */ | ||
387 | panic("BUG()"); | ||
388 | } | ||
389 | } | ||
390 | #endif | ||
384 | info.si_code = ILL_ILLOPC; | 391 | info.si_code = ILL_ILLOPC; |
385 | sig = SIGILL; | 392 | sig = SIGILL; |
386 | verbose_printk(KERN_NOTICE EXC_0x21(KERN_NOTICE)); | 393 | strerror = KERN_NOTICE EXC_0x21(KERN_NOTICE); |
387 | CHK_DEBUGGER_TRAP_MAYBE(); | 394 | CHK_DEBUGGER_TRAP_MAYBE(); |
388 | break; | 395 | break; |
389 | /* 0x22 - Illegal Instruction Combination, handled here */ | 396 | /* 0x22 - Illegal Instruction Combination, handled here */ |
390 | case VEC_ILGAL_I: | 397 | case VEC_ILGAL_I: |
391 | info.si_code = ILL_ILLPARAOP; | 398 | info.si_code = ILL_ILLPARAOP; |
392 | sig = SIGILL; | 399 | sig = SIGILL; |
393 | verbose_printk(KERN_NOTICE EXC_0x22(KERN_NOTICE)); | 400 | strerror = KERN_NOTICE EXC_0x22(KERN_NOTICE); |
394 | CHK_DEBUGGER_TRAP_MAYBE(); | 401 | CHK_DEBUGGER_TRAP_MAYBE(); |
395 | break; | 402 | break; |
396 | /* 0x23 - Data CPLB protection violation, handled here */ | 403 | /* 0x23 - Data CPLB protection violation, handled here */ |
397 | case VEC_CPLB_VL: | 404 | case VEC_CPLB_VL: |
398 | info.si_code = ILL_CPLB_VI; | 405 | info.si_code = ILL_CPLB_VI; |
399 | sig = SIGBUS; | 406 | sig = SIGBUS; |
400 | verbose_printk(KERN_NOTICE EXC_0x23(KERN_NOTICE)); | 407 | strerror = KERN_NOTICE EXC_0x23(KERN_NOTICE); |
401 | CHK_DEBUGGER_TRAP_MAYBE(); | 408 | CHK_DEBUGGER_TRAP_MAYBE(); |
402 | break; | 409 | break; |
403 | /* 0x24 - Data access misaligned, handled here */ | 410 | /* 0x24 - Data access misaligned, handled here */ |
404 | case VEC_MISALI_D: | 411 | case VEC_MISALI_D: |
405 | info.si_code = BUS_ADRALN; | 412 | info.si_code = BUS_ADRALN; |
406 | sig = SIGBUS; | 413 | sig = SIGBUS; |
407 | verbose_printk(KERN_NOTICE EXC_0x24(KERN_NOTICE)); | 414 | strerror = KERN_NOTICE EXC_0x24(KERN_NOTICE); |
408 | CHK_DEBUGGER_TRAP_MAYBE(); | 415 | CHK_DEBUGGER_TRAP_MAYBE(); |
409 | break; | 416 | break; |
410 | /* 0x25 - Unrecoverable Event, handled here */ | 417 | /* 0x25 - Unrecoverable Event, handled here */ |
411 | case VEC_UNCOV: | 418 | case VEC_UNCOV: |
412 | info.si_code = ILL_ILLEXCPT; | 419 | info.si_code = ILL_ILLEXCPT; |
413 | sig = SIGILL; | 420 | sig = SIGILL; |
414 | verbose_printk(KERN_NOTICE EXC_0x25(KERN_NOTICE)); | 421 | strerror = KERN_NOTICE EXC_0x25(KERN_NOTICE); |
415 | CHK_DEBUGGER_TRAP_MAYBE(); | 422 | CHK_DEBUGGER_TRAP_MAYBE(); |
416 | break; | 423 | break; |
417 | /* 0x26 - Data CPLB Miss, normal case is handled in _cplb_hdr, | 424 | /* 0x26 - Data CPLB Miss, normal case is handled in _cplb_hdr, |
@@ -419,7 +426,7 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
419 | case VEC_CPLB_M: | 426 | case VEC_CPLB_M: |
420 | info.si_code = BUS_ADRALN; | 427 | info.si_code = BUS_ADRALN; |
421 | sig = SIGBUS; | 428 | sig = SIGBUS; |
422 | verbose_printk(KERN_NOTICE EXC_0x26(KERN_NOTICE)); | 429 | strerror = KERN_NOTICE EXC_0x26(KERN_NOTICE); |
423 | break; | 430 | break; |
424 | /* 0x27 - Data CPLB Multiple Hits - Linux Trap Zero, handled here */ | 431 | /* 0x27 - Data CPLB Multiple Hits - Linux Trap Zero, handled here */ |
425 | case VEC_CPLB_MHIT: | 432 | case VEC_CPLB_MHIT: |
@@ -427,10 +434,10 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
427 | sig = SIGSEGV; | 434 | sig = SIGSEGV; |
428 | #ifdef CONFIG_DEBUG_HUNT_FOR_ZERO | 435 | #ifdef CONFIG_DEBUG_HUNT_FOR_ZERO |
429 | if (cpu_pda[cpu].dcplb_fault_addr < FIXED_CODE_START) | 436 | if (cpu_pda[cpu].dcplb_fault_addr < FIXED_CODE_START) |
430 | verbose_printk(KERN_NOTICE "NULL pointer access\n"); | 437 | strerror = KERN_NOTICE "NULL pointer access\n"; |
431 | else | 438 | else |
432 | #endif | 439 | #endif |
433 | verbose_printk(KERN_NOTICE EXC_0x27(KERN_NOTICE)); | 440 | strerror = KERN_NOTICE EXC_0x27(KERN_NOTICE); |
434 | CHK_DEBUGGER_TRAP_MAYBE(); | 441 | CHK_DEBUGGER_TRAP_MAYBE(); |
435 | break; | 442 | break; |
436 | /* 0x28 - Emulation Watchpoint, handled here */ | 443 | /* 0x28 - Emulation Watchpoint, handled here */ |
@@ -440,8 +447,8 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
440 | pr_debug(EXC_0x28(KERN_DEBUG)); | 447 | pr_debug(EXC_0x28(KERN_DEBUG)); |
441 | CHK_DEBUGGER_TRAP_MAYBE(); | 448 | CHK_DEBUGGER_TRAP_MAYBE(); |
442 | /* Check if this is a watchpoint in kernel space */ | 449 | /* Check if this is a watchpoint in kernel space */ |
443 | if (fp->ipend & 0xffc0) | 450 | if (kernel_mode_regs(fp)) |
444 | return; | 451 | goto traps_done; |
445 | else | 452 | else |
446 | break; | 453 | break; |
447 | #ifdef CONFIG_BF535 | 454 | #ifdef CONFIG_BF535 |
@@ -449,7 +456,7 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
449 | case VEC_ISTRU_VL: /* ADSP-BF535 only (MH) */ | 456 | case VEC_ISTRU_VL: /* ADSP-BF535 only (MH) */ |
450 | info.si_code = BUS_OPFETCH; | 457 | info.si_code = BUS_OPFETCH; |
451 | sig = SIGBUS; | 458 | sig = SIGBUS; |
452 | verbose_printk(KERN_NOTICE "BF535: VEC_ISTRU_VL\n"); | 459 | strerror = KERN_NOTICE "BF535: VEC_ISTRU_VL\n"; |
453 | CHK_DEBUGGER_TRAP_MAYBE(); | 460 | CHK_DEBUGGER_TRAP_MAYBE(); |
454 | break; | 461 | break; |
455 | #else | 462 | #else |
@@ -459,21 +466,21 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
459 | case VEC_MISALI_I: | 466 | case VEC_MISALI_I: |
460 | info.si_code = BUS_ADRALN; | 467 | info.si_code = BUS_ADRALN; |
461 | sig = SIGBUS; | 468 | sig = SIGBUS; |
462 | verbose_printk(KERN_NOTICE EXC_0x2A(KERN_NOTICE)); | 469 | strerror = KERN_NOTICE EXC_0x2A(KERN_NOTICE); |
463 | CHK_DEBUGGER_TRAP_MAYBE(); | 470 | CHK_DEBUGGER_TRAP_MAYBE(); |
464 | break; | 471 | break; |
465 | /* 0x2B - Instruction CPLB protection violation, handled here */ | 472 | /* 0x2B - Instruction CPLB protection violation, handled here */ |
466 | case VEC_CPLB_I_VL: | 473 | case VEC_CPLB_I_VL: |
467 | info.si_code = ILL_CPLB_VI; | 474 | info.si_code = ILL_CPLB_VI; |
468 | sig = SIGBUS; | 475 | sig = SIGBUS; |
469 | verbose_printk(KERN_NOTICE EXC_0x2B(KERN_NOTICE)); | 476 | strerror = KERN_NOTICE EXC_0x2B(KERN_NOTICE); |
470 | CHK_DEBUGGER_TRAP_MAYBE(); | 477 | CHK_DEBUGGER_TRAP_MAYBE(); |
471 | break; | 478 | break; |
472 | /* 0x2C - Instruction CPLB miss, handled in _cplb_hdr */ | 479 | /* 0x2C - Instruction CPLB miss, handled in _cplb_hdr */ |
473 | case VEC_CPLB_I_M: | 480 | case VEC_CPLB_I_M: |
474 | info.si_code = ILL_CPLB_MISS; | 481 | info.si_code = ILL_CPLB_MISS; |
475 | sig = SIGBUS; | 482 | sig = SIGBUS; |
476 | verbose_printk(KERN_NOTICE EXC_0x2C(KERN_NOTICE)); | 483 | strerror = KERN_NOTICE EXC_0x2C(KERN_NOTICE); |
477 | break; | 484 | break; |
478 | /* 0x2D - Instruction CPLB Multiple Hits, handled here */ | 485 | /* 0x2D - Instruction CPLB Multiple Hits, handled here */ |
479 | case VEC_CPLB_I_MHIT: | 486 | case VEC_CPLB_I_MHIT: |
@@ -481,17 +488,17 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
481 | sig = SIGSEGV; | 488 | sig = SIGSEGV; |
482 | #ifdef CONFIG_DEBUG_HUNT_FOR_ZERO | 489 | #ifdef CONFIG_DEBUG_HUNT_FOR_ZERO |
483 | if (cpu_pda[cpu].icplb_fault_addr < FIXED_CODE_START) | 490 | if (cpu_pda[cpu].icplb_fault_addr < FIXED_CODE_START) |
484 | verbose_printk(KERN_NOTICE "Jump to NULL address\n"); | 491 | strerror = KERN_NOTICE "Jump to NULL address\n"; |
485 | else | 492 | else |
486 | #endif | 493 | #endif |
487 | verbose_printk(KERN_NOTICE EXC_0x2D(KERN_NOTICE)); | 494 | strerror = KERN_NOTICE EXC_0x2D(KERN_NOTICE); |
488 | CHK_DEBUGGER_TRAP_MAYBE(); | 495 | CHK_DEBUGGER_TRAP_MAYBE(); |
489 | break; | 496 | break; |
490 | /* 0x2E - Illegal use of Supervisor Resource, handled here */ | 497 | /* 0x2E - Illegal use of Supervisor Resource, handled here */ |
491 | case VEC_ILL_RES: | 498 | case VEC_ILL_RES: |
492 | info.si_code = ILL_PRVOPC; | 499 | info.si_code = ILL_PRVOPC; |
493 | sig = SIGILL; | 500 | sig = SIGILL; |
494 | verbose_printk(KERN_NOTICE EXC_0x2E(KERN_NOTICE)); | 501 | strerror = KERN_NOTICE EXC_0x2E(KERN_NOTICE); |
495 | CHK_DEBUGGER_TRAP_MAYBE(); | 502 | CHK_DEBUGGER_TRAP_MAYBE(); |
496 | break; | 503 | break; |
497 | /* 0x2F - Reserved, Caught by default */ | 504 | /* 0x2F - Reserved, Caught by default */ |
@@ -519,17 +526,17 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
519 | case (SEQSTAT_HWERRCAUSE_SYSTEM_MMR): | 526 | case (SEQSTAT_HWERRCAUSE_SYSTEM_MMR): |
520 | info.si_code = BUS_ADRALN; | 527 | info.si_code = BUS_ADRALN; |
521 | sig = SIGBUS; | 528 | sig = SIGBUS; |
522 | verbose_printk(KERN_NOTICE HWC_x2(KERN_NOTICE)); | 529 | strerror = KERN_NOTICE HWC_x2(KERN_NOTICE); |
523 | break; | 530 | break; |
524 | /* External Memory Addressing Error */ | 531 | /* External Memory Addressing Error */ |
525 | case (SEQSTAT_HWERRCAUSE_EXTERN_ADDR): | 532 | case (SEQSTAT_HWERRCAUSE_EXTERN_ADDR): |
526 | info.si_code = BUS_ADRERR; | 533 | info.si_code = BUS_ADRERR; |
527 | sig = SIGBUS; | 534 | sig = SIGBUS; |
528 | verbose_printk(KERN_NOTICE HWC_x3(KERN_NOTICE)); | 535 | strerror = KERN_NOTICE HWC_x3(KERN_NOTICE); |
529 | break; | 536 | break; |
530 | /* Performance Monitor Overflow */ | 537 | /* Performance Monitor Overflow */ |
531 | case (SEQSTAT_HWERRCAUSE_PERF_FLOW): | 538 | case (SEQSTAT_HWERRCAUSE_PERF_FLOW): |
532 | verbose_printk(KERN_NOTICE HWC_x12(KERN_NOTICE)); | 539 | strerror = KERN_NOTICE HWC_x12(KERN_NOTICE); |
533 | break; | 540 | break; |
534 | /* RAISE 5 instruction */ | 541 | /* RAISE 5 instruction */ |
535 | case (SEQSTAT_HWERRCAUSE_RAISE_5): | 542 | case (SEQSTAT_HWERRCAUSE_RAISE_5): |
@@ -546,7 +553,6 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
546 | * if we get here we hit a reserved one, so panic | 553 | * if we get here we hit a reserved one, so panic |
547 | */ | 554 | */ |
548 | default: | 555 | default: |
549 | oops_in_progress = 1; | ||
550 | info.si_code = ILL_ILLPARAOP; | 556 | info.si_code = ILL_ILLPARAOP; |
551 | sig = SIGILL; | 557 | sig = SIGILL; |
552 | verbose_printk(KERN_EMERG "Caught Unhandled Exception, code = %08lx\n", | 558 | verbose_printk(KERN_EMERG "Caught Unhandled Exception, code = %08lx\n", |
@@ -557,6 +563,16 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
557 | 563 | ||
558 | BUG_ON(sig == 0); | 564 | BUG_ON(sig == 0); |
559 | 565 | ||
566 | /* If the fault was caused by a kernel thread, or interrupt handler | ||
567 | * we will kernel panic, so the system reboots. | ||
568 | */ | ||
569 | if (kernel_mode_regs(fp) || (current && !current->mm)) { | ||
570 | console_verbose(); | ||
571 | oops_in_progress = 1; | ||
572 | if (strerror) | ||
573 | verbose_printk(strerror); | ||
574 | } | ||
575 | |||
560 | if (sig != SIGTRAP) { | 576 | if (sig != SIGTRAP) { |
561 | dump_bfin_process(fp); | 577 | dump_bfin_process(fp); |
562 | dump_bfin_mem(fp); | 578 | dump_bfin_mem(fp); |
@@ -606,8 +622,8 @@ asmlinkage void trap_c(struct pt_regs *fp) | |||
606 | if (ANOMALY_05000461 && trapnr == VEC_HWERR && !access_ok(VERIFY_READ, fp->pc, 8)) | 622 | if (ANOMALY_05000461 && trapnr == VEC_HWERR && !access_ok(VERIFY_READ, fp->pc, 8)) |
607 | fp->pc = SAFE_USER_INSTRUCTION; | 623 | fp->pc = SAFE_USER_INSTRUCTION; |
608 | 624 | ||
625 | traps_done: | ||
609 | trace_buffer_restore(j); | 626 | trace_buffer_restore(j); |
610 | return; | ||
611 | } | 627 | } |
612 | 628 | ||
613 | /* Typical exception handling routines */ | 629 | /* Typical exception handling routines */ |
@@ -792,6 +808,18 @@ void dump_bfin_trace_buffer(void) | |||
792 | } | 808 | } |
793 | EXPORT_SYMBOL(dump_bfin_trace_buffer); | 809 | EXPORT_SYMBOL(dump_bfin_trace_buffer); |
794 | 810 | ||
811 | #ifdef CONFIG_BUG | ||
812 | int is_valid_bugaddr(unsigned long addr) | ||
813 | { | ||
814 | unsigned short opcode; | ||
815 | |||
816 | if (!get_instruction(&opcode, (unsigned short *)addr)) | ||
817 | return 0; | ||
818 | |||
819 | return opcode == BFIN_BUG_OPCODE; | ||
820 | } | ||
821 | #endif | ||
822 | |||
795 | /* | 823 | /* |
796 | * Checks to see if the address pointed to is either a | 824 | * Checks to see if the address pointed to is either a |
797 | * 16-bit CALL instruction, or a 32-bit CALL instruction | 825 | * 16-bit CALL instruction, or a 32-bit CALL instruction |
diff --git a/arch/blackfin/kernel/vmlinux.lds.S b/arch/blackfin/kernel/vmlinux.lds.S index 8b67167cb4f4..6ac307ca0d80 100644 --- a/arch/blackfin/kernel/vmlinux.lds.S +++ b/arch/blackfin/kernel/vmlinux.lds.S | |||
@@ -54,6 +54,7 @@ SECTIONS | |||
54 | SCHED_TEXT | 54 | SCHED_TEXT |
55 | #endif | 55 | #endif |
56 | LOCK_TEXT | 56 | LOCK_TEXT |
57 | IRQENTRY_TEXT | ||
57 | KPROBES_TEXT | 58 | KPROBES_TEXT |
58 | *(.text.*) | 59 | *(.text.*) |
59 | *(.fixup) | 60 | *(.fixup) |
@@ -166,6 +167,20 @@ SECTIONS | |||
166 | } | 167 | } |
167 | PERCPU(4) | 168 | PERCPU(4) |
168 | SECURITY_INIT | 169 | SECURITY_INIT |
170 | |||
171 | /* we have to discard exit text and such at runtime, not link time, to | ||
172 | * handle embedded cross-section references (alt instructions, bug | ||
173 | * table, eh_frame, etc...) | ||
174 | */ | ||
175 | .exit.text : | ||
176 | { | ||
177 | EXIT_TEXT | ||
178 | } | ||
179 | .exit.data : | ||
180 | { | ||
181 | EXIT_DATA | ||
182 | } | ||
183 | |||
169 | .init.ramfs : | 184 | .init.ramfs : |
170 | { | 185 | { |
171 | . = ALIGN(4); | 186 | . = ALIGN(4); |
@@ -264,8 +279,6 @@ SECTIONS | |||
264 | 279 | ||
265 | /DISCARD/ : | 280 | /DISCARD/ : |
266 | { | 281 | { |
267 | EXIT_TEXT | ||
268 | EXIT_DATA | ||
269 | *(.exitcall.exit) | 282 | *(.exitcall.exit) |
270 | } | 283 | } |
271 | } | 284 | } |
diff --git a/arch/blackfin/lib/checksum.c b/arch/blackfin/lib/checksum.c index 762a7f02970a..cd605e7d8518 100644 --- a/arch/blackfin/lib/checksum.c +++ b/arch/blackfin/lib/checksum.c | |||
@@ -116,6 +116,7 @@ __sum16 ip_compute_csum(const void *buff, int len) | |||
116 | { | 116 | { |
117 | return (__force __sum16)~do_csum(buff, len); | 117 | return (__force __sum16)~do_csum(buff, len); |
118 | } | 118 | } |
119 | EXPORT_SYMBOL(ip_compute_csum); | ||
119 | 120 | ||
120 | /* | 121 | /* |
121 | * copy from fs while checksumming, otherwise like csum_partial | 122 | * copy from fs while checksumming, otherwise like csum_partial |
@@ -130,6 +131,7 @@ csum_partial_copy_from_user(const void __user *src, void *dst, | |||
130 | memcpy(dst, (__force void *)src, len); | 131 | memcpy(dst, (__force void *)src, len); |
131 | return csum_partial(dst, len, sum); | 132 | return csum_partial(dst, len, sum); |
132 | } | 133 | } |
134 | EXPORT_SYMBOL(csum_partial_copy_from_user); | ||
133 | 135 | ||
134 | /* | 136 | /* |
135 | * copy from ds while checksumming, otherwise like csum_partial | 137 | * copy from ds while checksumming, otherwise like csum_partial |
diff --git a/arch/blackfin/mach-bf518/boards/ezbrd.c b/arch/blackfin/mach-bf518/boards/ezbrd.c index 62bba09bcce6..1382f0382359 100644 --- a/arch/blackfin/mach-bf518/boards/ezbrd.c +++ b/arch/blackfin/mach-bf518/boards/ezbrd.c | |||
@@ -246,7 +246,7 @@ static struct spi_board_info bfin_spi_board_info[] __initdata = { | |||
246 | .modalias = "m25p80", /* Name of spi_driver for this device */ | 246 | .modalias = "m25p80", /* Name of spi_driver for this device */ |
247 | .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */ | 247 | .max_speed_hz = 25000000, /* max spi clock (SCK) speed in HZ */ |
248 | .bus_num = 0, /* Framework bus number */ | 248 | .bus_num = 0, /* Framework bus number */ |
249 | .chip_select = 1, /* Framework chip select. On STAMP537 it is SPISSEL1*/ | 249 | .chip_select = 2, /* On BF518F-EZBRD it's SPI0_SSEL2 */ |
250 | .platform_data = &bfin_spi_flash_data, | 250 | .platform_data = &bfin_spi_flash_data, |
251 | .controller_data = &spi_flash_chip_info, | 251 | .controller_data = &spi_flash_chip_info, |
252 | .mode = SPI_MODE_3, | 252 | .mode = SPI_MODE_3, |
@@ -369,6 +369,11 @@ static struct resource bfin_spi0_resource[] = { | |||
369 | [1] = { | 369 | [1] = { |
370 | .start = CH_SPI0, | 370 | .start = CH_SPI0, |
371 | .end = CH_SPI0, | 371 | .end = CH_SPI0, |
372 | .flags = IORESOURCE_DMA, | ||
373 | }, | ||
374 | [2] = { | ||
375 | .start = IRQ_SPI0, | ||
376 | .end = IRQ_SPI0, | ||
372 | .flags = IORESOURCE_IRQ, | 377 | .flags = IORESOURCE_IRQ, |
373 | }, | 378 | }, |
374 | }; | 379 | }; |
@@ -399,6 +404,11 @@ static struct resource bfin_spi1_resource[] = { | |||
399 | [1] = { | 404 | [1] = { |
400 | .start = CH_SPI1, | 405 | .start = CH_SPI1, |
401 | .end = CH_SPI1, | 406 | .end = CH_SPI1, |
407 | .flags = IORESOURCE_DMA, | ||
408 | }, | ||
409 | [2] = { | ||
410 | .start = IRQ_SPI1, | ||
411 | .end = IRQ_SPI1, | ||
402 | .flags = IORESOURCE_IRQ, | 412 | .flags = IORESOURCE_IRQ, |
403 | }, | 413 | }, |
404 | }; | 414 | }; |
diff --git a/arch/blackfin/mach-bf527/boards/cm_bf527.c b/arch/blackfin/mach-bf527/boards/cm_bf527.c index 6d6f9effa0bb..1eaf27ff722e 100644 --- a/arch/blackfin/mach-bf527/boards/cm_bf527.c +++ b/arch/blackfin/mach-bf527/boards/cm_bf527.c | |||
@@ -664,6 +664,11 @@ static struct resource bfin_spi0_resource[] = { | |||
664 | [1] = { | 664 | [1] = { |
665 | .start = CH_SPI, | 665 | .start = CH_SPI, |
666 | .end = CH_SPI, | 666 | .end = CH_SPI, |
667 | .flags = IORESOURCE_DMA, | ||
668 | }, | ||
669 | [2] = { | ||
670 | .start = IRQ_SPI, | ||
671 | .end = IRQ_SPI, | ||
667 | .flags = IORESOURCE_IRQ, | 672 | .flags = IORESOURCE_IRQ, |
668 | }, | 673 | }, |
669 | }; | 674 | }; |
diff --git a/arch/blackfin/mach-bf527/boards/ezbrd.c b/arch/blackfin/mach-bf527/boards/ezbrd.c index 1435c5d38cd5..9f9c0005dcf1 100644 --- a/arch/blackfin/mach-bf527/boards/ezbrd.c +++ b/arch/blackfin/mach-bf527/boards/ezbrd.c | |||
@@ -467,6 +467,11 @@ static struct resource bfin_spi0_resource[] = { | |||
467 | [1] = { | 467 | [1] = { |
468 | .start = CH_SPI, | 468 | .start = CH_SPI, |
469 | .end = CH_SPI, | 469 | .end = CH_SPI, |
470 | .flags = IORESOURCE_DMA, | ||
471 | }, | ||
472 | [2] = { | ||
473 | .start = IRQ_SPI, | ||
474 | .end = IRQ_SPI, | ||
470 | .flags = IORESOURCE_IRQ, | 475 | .flags = IORESOURCE_IRQ, |
471 | }, | 476 | }, |
472 | }; | 477 | }; |
diff --git a/arch/blackfin/mach-bf527/boards/ezkit.c b/arch/blackfin/mach-bf527/boards/ezkit.c index 147edd1eb1ad..3e5b7db6b065 100644 --- a/arch/blackfin/mach-bf527/boards/ezkit.c +++ b/arch/blackfin/mach-bf527/boards/ezkit.c | |||
@@ -723,6 +723,11 @@ static struct resource bfin_spi0_resource[] = { | |||
723 | [1] = { | 723 | [1] = { |
724 | .start = CH_SPI, | 724 | .start = CH_SPI, |
725 | .end = CH_SPI, | 725 | .end = CH_SPI, |
726 | .flags = IORESOURCE_DMA, | ||
727 | }, | ||
728 | [2] = { | ||
729 | .start = IRQ_SPI, | ||
730 | .end = IRQ_SPI, | ||
726 | .flags = IORESOURCE_IRQ, | 731 | .flags = IORESOURCE_IRQ, |
727 | }, | 732 | }, |
728 | }; | 733 | }; |
diff --git a/arch/blackfin/mach-bf533/boards/H8606.c b/arch/blackfin/mach-bf533/boards/H8606.c index 895f213ea454..38cf8ffd6d74 100644 --- a/arch/blackfin/mach-bf533/boards/H8606.c +++ b/arch/blackfin/mach-bf533/boards/H8606.c | |||
@@ -266,6 +266,11 @@ static struct resource bfin_spi0_resource[] = { | |||
266 | [1] = { | 266 | [1] = { |
267 | .start = CH_SPI, | 267 | .start = CH_SPI, |
268 | .end = CH_SPI, | 268 | .end = CH_SPI, |
269 | .flags = IORESOURCE_DMA, | ||
270 | }, | ||
271 | [2] = { | ||
272 | .start = IRQ_SPI, | ||
273 | .end = IRQ_SPI, | ||
269 | .flags = IORESOURCE_IRQ, | 274 | .flags = IORESOURCE_IRQ, |
270 | } | 275 | } |
271 | }; | 276 | }; |
diff --git a/arch/blackfin/mach-bf533/boards/blackstamp.c b/arch/blackfin/mach-bf533/boards/blackstamp.c index 0765872a8ada..9ecdc361fa6d 100644 --- a/arch/blackfin/mach-bf533/boards/blackstamp.c +++ b/arch/blackfin/mach-bf533/boards/blackstamp.c | |||
@@ -162,6 +162,11 @@ static struct resource bfin_spi0_resource[] = { | |||
162 | [1] = { | 162 | [1] = { |
163 | .start = CH_SPI, | 163 | .start = CH_SPI, |
164 | .end = CH_SPI, | 164 | .end = CH_SPI, |
165 | .flags = IORESOURCE_DMA, | ||
166 | }, | ||
167 | [2] = { | ||
168 | .start = IRQ_SPI, | ||
169 | .end = IRQ_SPI, | ||
165 | .flags = IORESOURCE_IRQ, | 170 | .flags = IORESOURCE_IRQ, |
166 | } | 171 | } |
167 | }; | 172 | }; |
diff --git a/arch/blackfin/mach-bf533/boards/cm_bf533.c b/arch/blackfin/mach-bf533/boards/cm_bf533.c index a727e538fa28..1443e92d8b62 100644 --- a/arch/blackfin/mach-bf533/boards/cm_bf533.c +++ b/arch/blackfin/mach-bf533/boards/cm_bf533.c | |||
@@ -160,6 +160,11 @@ static struct resource bfin_spi0_resource[] = { | |||
160 | [1] = { | 160 | [1] = { |
161 | .start = CH_SPI, | 161 | .start = CH_SPI, |
162 | .end = CH_SPI, | 162 | .end = CH_SPI, |
163 | .flags = IORESOURCE_DMA, | ||
164 | }, | ||
165 | [2] = { | ||
166 | .start = IRQ_SPI, | ||
167 | .end = IRQ_SPI, | ||
163 | .flags = IORESOURCE_IRQ, | 168 | .flags = IORESOURCE_IRQ, |
164 | } | 169 | } |
165 | }; | 170 | }; |
diff --git a/arch/blackfin/mach-bf533/boards/ezkit.c b/arch/blackfin/mach-bf533/boards/ezkit.c index 842f1c9c2393..89a5ec4ca048 100644 --- a/arch/blackfin/mach-bf533/boards/ezkit.c +++ b/arch/blackfin/mach-bf533/boards/ezkit.c | |||
@@ -196,6 +196,11 @@ static struct resource bfin_spi0_resource[] = { | |||
196 | [1] = { | 196 | [1] = { |
197 | .start = CH_SPI, | 197 | .start = CH_SPI, |
198 | .end = CH_SPI, | 198 | .end = CH_SPI, |
199 | .flags = IORESOURCE_DMA, | ||
200 | }, | ||
201 | [2] = { | ||
202 | .start = IRQ_SPI, | ||
203 | .end = IRQ_SPI, | ||
199 | .flags = IORESOURCE_IRQ, | 204 | .flags = IORESOURCE_IRQ, |
200 | } | 205 | } |
201 | }; | 206 | }; |
diff --git a/arch/blackfin/mach-bf533/boards/stamp.c b/arch/blackfin/mach-bf533/boards/stamp.c index e19c565ade16..a68ade8a3ca2 100644 --- a/arch/blackfin/mach-bf533/boards/stamp.c +++ b/arch/blackfin/mach-bf533/boards/stamp.c | |||
@@ -299,6 +299,11 @@ static struct resource bfin_spi0_resource[] = { | |||
299 | [1] = { | 299 | [1] = { |
300 | .start = CH_SPI, | 300 | .start = CH_SPI, |
301 | .end = CH_SPI, | 301 | .end = CH_SPI, |
302 | .flags = IORESOURCE_DMA, | ||
303 | }, | ||
304 | [2] = { | ||
305 | .start = IRQ_SPI, | ||
306 | .end = IRQ_SPI, | ||
302 | .flags = IORESOURCE_IRQ, | 307 | .flags = IORESOURCE_IRQ, |
303 | } | 308 | } |
304 | }; | 309 | }; |
diff --git a/arch/blackfin/mach-bf537/boards/cm_bf537.c b/arch/blackfin/mach-bf537/boards/cm_bf537.c index 4fee19673127..2a87d1cfcd06 100644 --- a/arch/blackfin/mach-bf537/boards/cm_bf537.c +++ b/arch/blackfin/mach-bf537/boards/cm_bf537.c | |||
@@ -182,8 +182,13 @@ static struct resource bfin_spi0_resource[] = { | |||
182 | [1] = { | 182 | [1] = { |
183 | .start = CH_SPI, | 183 | .start = CH_SPI, |
184 | .end = CH_SPI, | 184 | .end = CH_SPI, |
185 | .flags = IORESOURCE_DMA, | ||
186 | }, | ||
187 | [2] = { | ||
188 | .start = IRQ_SPI, | ||
189 | .end = IRQ_SPI, | ||
185 | .flags = IORESOURCE_IRQ, | 190 | .flags = IORESOURCE_IRQ, |
186 | } | 191 | }, |
187 | }; | 192 | }; |
188 | 193 | ||
189 | /* SPI controller data */ | 194 | /* SPI controller data */ |
diff --git a/arch/blackfin/mach-bf537/boards/minotaur.c b/arch/blackfin/mach-bf537/boards/minotaur.c index 3c159819e555..399f81da7b93 100644 --- a/arch/blackfin/mach-bf537/boards/minotaur.c +++ b/arch/blackfin/mach-bf537/boards/minotaur.c | |||
@@ -184,6 +184,11 @@ static struct resource bfin_spi0_resource[] = { | |||
184 | [1] = { | 184 | [1] = { |
185 | .start = CH_SPI, | 185 | .start = CH_SPI, |
186 | .end = CH_SPI, | 186 | .end = CH_SPI, |
187 | .flags = IORESOURCE_DMA, | ||
188 | }, | ||
189 | [2] = { | ||
190 | .start = IRQ_SPI, | ||
191 | .end = IRQ_SPI, | ||
187 | .flags = IORESOURCE_IRQ, | 192 | .flags = IORESOURCE_IRQ, |
188 | }, | 193 | }, |
189 | }; | 194 | }; |
diff --git a/arch/blackfin/mach-bf537/boards/pnav10.c b/arch/blackfin/mach-bf537/boards/pnav10.c index 26707ce39f29..838240f151f5 100644 --- a/arch/blackfin/mach-bf537/boards/pnav10.c +++ b/arch/blackfin/mach-bf537/boards/pnav10.c | |||
@@ -398,8 +398,13 @@ static struct resource bfin_spi0_resource[] = { | |||
398 | [1] = { | 398 | [1] = { |
399 | .start = CH_SPI, | 399 | .start = CH_SPI, |
400 | .end = CH_SPI, | 400 | .end = CH_SPI, |
401 | .flags = IORESOURCE_DMA, | ||
402 | }, | ||
403 | [2] = { | ||
404 | .start = IRQ_SPI, | ||
405 | .end = IRQ_SPI, | ||
401 | .flags = IORESOURCE_IRQ, | 406 | .flags = IORESOURCE_IRQ, |
402 | } | 407 | }, |
403 | }; | 408 | }; |
404 | 409 | ||
405 | /* SPI controller data */ | 410 | /* SPI controller data */ |
diff --git a/arch/blackfin/mach-bf537/boards/stamp.c b/arch/blackfin/mach-bf537/boards/stamp.c index dfb5036f8a6b..ff7228caa7da 100644 --- a/arch/blackfin/mach-bf537/boards/stamp.c +++ b/arch/blackfin/mach-bf537/boards/stamp.c | |||
@@ -1345,7 +1345,7 @@ static struct i2c_board_info __initdata bfin_i2c_board_info[] = { | |||
1345 | #if defined(CONFIG_PMIC_ADP5520) || defined(CONFIG_PMIC_ADP5520_MODULE) | 1345 | #if defined(CONFIG_PMIC_ADP5520) || defined(CONFIG_PMIC_ADP5520_MODULE) |
1346 | { | 1346 | { |
1347 | I2C_BOARD_INFO("pmic-adp5520", 0x32), | 1347 | I2C_BOARD_INFO("pmic-adp5520", 0x32), |
1348 | .irq = IRQ_PF7, | 1348 | .irq = IRQ_PG0, |
1349 | .platform_data = (void *)&adp5520_pdev_data, | 1349 | .platform_data = (void *)&adp5520_pdev_data, |
1350 | }, | 1350 | }, |
1351 | #endif | 1351 | #endif |
diff --git a/arch/blackfin/mach-bf537/boards/tcm_bf537.c b/arch/blackfin/mach-bf537/boards/tcm_bf537.c index 280574591201..e523e6e610d0 100644 --- a/arch/blackfin/mach-bf537/boards/tcm_bf537.c +++ b/arch/blackfin/mach-bf537/boards/tcm_bf537.c | |||
@@ -182,6 +182,11 @@ static struct resource bfin_spi0_resource[] = { | |||
182 | [1] = { | 182 | [1] = { |
183 | .start = CH_SPI, | 183 | .start = CH_SPI, |
184 | .end = CH_SPI, | 184 | .end = CH_SPI, |
185 | .flags = IORESOURCE_DMA, | ||
186 | }, | ||
187 | [2] = { | ||
188 | .start = IRQ_SPI, | ||
189 | .end = IRQ_SPI, | ||
185 | .flags = IORESOURCE_IRQ, | 190 | .flags = IORESOURCE_IRQ, |
186 | } | 191 | } |
187 | }; | 192 | }; |
diff --git a/arch/blackfin/mach-bf538/boards/ezkit.c b/arch/blackfin/mach-bf538/boards/ezkit.c index e37cb9378884..57695b4c3c09 100644 --- a/arch/blackfin/mach-bf538/boards/ezkit.c +++ b/arch/blackfin/mach-bf538/boards/ezkit.c | |||
@@ -352,6 +352,11 @@ static struct resource bfin_spi0_resource[] = { | |||
352 | [1] = { | 352 | [1] = { |
353 | .start = CH_SPI0, | 353 | .start = CH_SPI0, |
354 | .end = CH_SPI0, | 354 | .end = CH_SPI0, |
355 | .flags = IORESOURCE_DMA, | ||
356 | }, | ||
357 | [2] = { | ||
358 | .start = IRQ_SPI0, | ||
359 | .end = IRQ_SPI0, | ||
355 | .flags = IORESOURCE_IRQ, | 360 | .flags = IORESOURCE_IRQ, |
356 | } | 361 | } |
357 | }; | 362 | }; |
@@ -366,6 +371,11 @@ static struct resource bfin_spi1_resource[] = { | |||
366 | [1] = { | 371 | [1] = { |
367 | .start = CH_SPI1, | 372 | .start = CH_SPI1, |
368 | .end = CH_SPI1, | 373 | .end = CH_SPI1, |
374 | .flags = IORESOURCE_DMA, | ||
375 | }, | ||
376 | [2] = { | ||
377 | .start = IRQ_SPI1, | ||
378 | .end = IRQ_SPI1, | ||
369 | .flags = IORESOURCE_IRQ, | 379 | .flags = IORESOURCE_IRQ, |
370 | } | 380 | } |
371 | }; | 381 | }; |
diff --git a/arch/blackfin/mach-bf548/boards/cm_bf548.c b/arch/blackfin/mach-bf548/boards/cm_bf548.c index f53ad682530b..f5a3c30a41bd 100644 --- a/arch/blackfin/mach-bf548/boards/cm_bf548.c +++ b/arch/blackfin/mach-bf548/boards/cm_bf548.c | |||
@@ -612,6 +612,11 @@ static struct resource bfin_spi0_resource[] = { | |||
612 | [1] = { | 612 | [1] = { |
613 | .start = CH_SPI0, | 613 | .start = CH_SPI0, |
614 | .end = CH_SPI0, | 614 | .end = CH_SPI0, |
615 | .flags = IORESOURCE_DMA, | ||
616 | }, | ||
617 | [2] = { | ||
618 | .start = IRQ_SPI0, | ||
619 | .end = IRQ_SPI0, | ||
615 | .flags = IORESOURCE_IRQ, | 620 | .flags = IORESOURCE_IRQ, |
616 | } | 621 | } |
617 | }; | 622 | }; |
@@ -626,6 +631,11 @@ static struct resource bfin_spi1_resource[] = { | |||
626 | [1] = { | 631 | [1] = { |
627 | .start = CH_SPI1, | 632 | .start = CH_SPI1, |
628 | .end = CH_SPI1, | 633 | .end = CH_SPI1, |
634 | .flags = IORESOURCE_DMA, | ||
635 | }, | ||
636 | [2] = { | ||
637 | .start = IRQ_SPI1, | ||
638 | .end = IRQ_SPI1, | ||
629 | .flags = IORESOURCE_IRQ, | 639 | .flags = IORESOURCE_IRQ, |
630 | } | 640 | } |
631 | }; | 641 | }; |
diff --git a/arch/blackfin/mach-bf548/boards/ezkit.c b/arch/blackfin/mach-bf548/boards/ezkit.c index add5a17452ce..805a57b5e650 100644 --- a/arch/blackfin/mach-bf548/boards/ezkit.c +++ b/arch/blackfin/mach-bf548/boards/ezkit.c | |||
@@ -396,6 +396,8 @@ static struct platform_device bfin_sir3_device = { | |||
396 | #endif | 396 | #endif |
397 | 397 | ||
398 | #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) | 398 | #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) |
399 | #include <linux/smsc911x.h> | ||
400 | |||
399 | static struct resource smsc911x_resources[] = { | 401 | static struct resource smsc911x_resources[] = { |
400 | { | 402 | { |
401 | .name = "smsc911x-memory", | 403 | .name = "smsc911x-memory", |
@@ -409,11 +411,22 @@ static struct resource smsc911x_resources[] = { | |||
409 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL, | 411 | .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL, |
410 | }, | 412 | }, |
411 | }; | 413 | }; |
414 | |||
415 | static struct smsc911x_platform_config smsc911x_config = { | ||
416 | .flags = SMSC911X_USE_32BIT, | ||
417 | .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, | ||
418 | .irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, | ||
419 | .phy_interface = PHY_INTERFACE_MODE_MII, | ||
420 | }; | ||
421 | |||
412 | static struct platform_device smsc911x_device = { | 422 | static struct platform_device smsc911x_device = { |
413 | .name = "smsc911x", | 423 | .name = "smsc911x", |
414 | .id = 0, | 424 | .id = 0, |
415 | .num_resources = ARRAY_SIZE(smsc911x_resources), | 425 | .num_resources = ARRAY_SIZE(smsc911x_resources), |
416 | .resource = smsc911x_resources, | 426 | .resource = smsc911x_resources, |
427 | .dev = { | ||
428 | .platform_data = &smsc911x_config, | ||
429 | }, | ||
417 | }; | 430 | }; |
418 | #endif | 431 | #endif |
419 | 432 | ||
@@ -741,6 +754,11 @@ static struct resource bfin_spi0_resource[] = { | |||
741 | [1] = { | 754 | [1] = { |
742 | .start = CH_SPI0, | 755 | .start = CH_SPI0, |
743 | .end = CH_SPI0, | 756 | .end = CH_SPI0, |
757 | .flags = IORESOURCE_DMA, | ||
758 | }, | ||
759 | [2] = { | ||
760 | .start = IRQ_SPI0, | ||
761 | .end = IRQ_SPI0, | ||
744 | .flags = IORESOURCE_IRQ, | 762 | .flags = IORESOURCE_IRQ, |
745 | } | 763 | } |
746 | }; | 764 | }; |
@@ -755,6 +773,11 @@ static struct resource bfin_spi1_resource[] = { | |||
755 | [1] = { | 773 | [1] = { |
756 | .start = CH_SPI1, | 774 | .start = CH_SPI1, |
757 | .end = CH_SPI1, | 775 | .end = CH_SPI1, |
776 | .flags = IORESOURCE_DMA, | ||
777 | }, | ||
778 | [2] = { | ||
779 | .start = IRQ_SPI1, | ||
780 | .end = IRQ_SPI1, | ||
758 | .flags = IORESOURCE_IRQ, | 781 | .flags = IORESOURCE_IRQ, |
759 | } | 782 | } |
760 | }; | 783 | }; |
diff --git a/arch/blackfin/mach-bf561/boards/cm_bf561.c b/arch/blackfin/mach-bf561/boards/cm_bf561.c index 0dd9685e5d53..0c9d72c5f5ba 100644 --- a/arch/blackfin/mach-bf561/boards/cm_bf561.c +++ b/arch/blackfin/mach-bf561/boards/cm_bf561.c | |||
@@ -177,8 +177,13 @@ static struct resource bfin_spi0_resource[] = { | |||
177 | [1] = { | 177 | [1] = { |
178 | .start = CH_SPI, | 178 | .start = CH_SPI, |
179 | .end = CH_SPI, | 179 | .end = CH_SPI, |
180 | .flags = IORESOURCE_DMA, | ||
181 | }, | ||
182 | [2] = { | ||
183 | .start = IRQ_SPI, | ||
184 | .end = IRQ_SPI, | ||
180 | .flags = IORESOURCE_IRQ, | 185 | .flags = IORESOURCE_IRQ, |
181 | } | 186 | }, |
182 | }; | 187 | }; |
183 | 188 | ||
184 | /* SPI controller data */ | 189 | /* SPI controller data */ |
diff --git a/arch/blackfin/mach-bf561/boards/ezkit.c b/arch/blackfin/mach-bf561/boards/ezkit.c index 0e2178a1aec5..b5ef7ff7b7bd 100644 --- a/arch/blackfin/mach-bf561/boards/ezkit.c +++ b/arch/blackfin/mach-bf561/boards/ezkit.c | |||
@@ -304,6 +304,11 @@ static struct resource bfin_spi0_resource[] = { | |||
304 | [1] = { | 304 | [1] = { |
305 | .start = CH_SPI, | 305 | .start = CH_SPI, |
306 | .end = CH_SPI, | 306 | .end = CH_SPI, |
307 | .flags = IORESOURCE_DMA, | ||
308 | }, | ||
309 | [2] = { | ||
310 | .start = IRQ_SPI, | ||
311 | .end = IRQ_SPI, | ||
307 | .flags = IORESOURCE_IRQ, | 312 | .flags = IORESOURCE_IRQ, |
308 | } | 313 | } |
309 | }; | 314 | }; |
diff --git a/arch/blackfin/mach-common/cache-c.c b/arch/blackfin/mach-common/cache-c.c index e6ab1f815123..b59ce3cb3807 100644 --- a/arch/blackfin/mach-common/cache-c.c +++ b/arch/blackfin/mach-common/cache-c.c | |||
@@ -16,9 +16,21 @@ | |||
16 | void blackfin_invalidate_entire_dcache(void) | 16 | void blackfin_invalidate_entire_dcache(void) |
17 | { | 17 | { |
18 | u32 dmem = bfin_read_DMEM_CONTROL(); | 18 | u32 dmem = bfin_read_DMEM_CONTROL(); |
19 | SSYNC(); | ||
20 | bfin_write_DMEM_CONTROL(dmem & ~0xc); | 19 | bfin_write_DMEM_CONTROL(dmem & ~0xc); |
21 | SSYNC(); | 20 | SSYNC(); |
22 | bfin_write_DMEM_CONTROL(dmem); | 21 | bfin_write_DMEM_CONTROL(dmem); |
23 | SSYNC(); | 22 | SSYNC(); |
24 | } | 23 | } |
24 | |||
25 | /* Invalidate the Entire Instruction cache by | ||
26 | * clearing IMC bit | ||
27 | */ | ||
28 | void blackfin_invalidate_entire_icache(void) | ||
29 | { | ||
30 | u32 imem = bfin_read_IMEM_CONTROL(); | ||
31 | bfin_write_IMEM_CONTROL(imem & ~0x4); | ||
32 | SSYNC(); | ||
33 | bfin_write_IMEM_CONTROL(imem); | ||
34 | SSYNC(); | ||
35 | } | ||
36 | |||
diff --git a/arch/blackfin/mach-common/entry.S b/arch/blackfin/mach-common/entry.S index da0558ad1b1a..31fa313e81cf 100644 --- a/arch/blackfin/mach-common/entry.S +++ b/arch/blackfin/mach-common/entry.S | |||
@@ -42,6 +42,7 @@ | |||
42 | #include <asm/thread_info.h> /* TIF_NEED_RESCHED */ | 42 | #include <asm/thread_info.h> /* TIF_NEED_RESCHED */ |
43 | #include <asm/asm-offsets.h> | 43 | #include <asm/asm-offsets.h> |
44 | #include <asm/trace.h> | 44 | #include <asm/trace.h> |
45 | #include <asm/traps.h> | ||
45 | 46 | ||
46 | #include <asm/context.S> | 47 | #include <asm/context.S> |
47 | 48 | ||
@@ -84,13 +85,15 @@ ENTRY(_ex_workaround_261) | |||
84 | if !cc jump _bfin_return_from_exception; | 85 | if !cc jump _bfin_return_from_exception; |
85 | /* fall through */ | 86 | /* fall through */ |
86 | R7 = P4; | 87 | R7 = P4; |
87 | R6 = 0x26; /* Data CPLB Miss */ | 88 | R6 = VEC_CPLB_M; /* Data CPLB Miss */ |
88 | cc = R6 == R7; | 89 | cc = R6 == R7; |
89 | if cc jump _ex_dcplb_miss (BP); | 90 | if cc jump _ex_dcplb_miss (BP); |
90 | R6 = 0x23; /* Data CPLB Miss */ | 91 | #ifdef CONFIG_MPU |
92 | R6 = VEC_CPLB_VL; /* Data CPLB Violation */ | ||
91 | cc = R6 == R7; | 93 | cc = R6 == R7; |
92 | if cc jump _ex_dcplb_viol (BP); | 94 | if cc jump _ex_dcplb_viol (BP); |
93 | /* Handle 0x23 Data CPLB Protection Violation | 95 | #endif |
96 | /* Handle Data CPLB Protection Violation | ||
94 | * and Data CPLB Multiple Hits - Linux Trap Zero | 97 | * and Data CPLB Multiple Hits - Linux Trap Zero |
95 | */ | 98 | */ |
96 | jump _ex_trap_c; | 99 | jump _ex_trap_c; |
@@ -270,7 +273,7 @@ ENTRY(_bfin_return_from_exception) | |||
270 | r6.l = lo(SEQSTAT_EXCAUSE); | 273 | r6.l = lo(SEQSTAT_EXCAUSE); |
271 | r6.h = hi(SEQSTAT_EXCAUSE); | 274 | r6.h = hi(SEQSTAT_EXCAUSE); |
272 | r7 = r7 & r6; | 275 | r7 = r7 & r6; |
273 | r6 = 0x25; | 276 | r6 = VEC_UNCOV; |
274 | CC = R7 == R6; | 277 | CC = R7 == R6; |
275 | if CC JUMP _double_fault; | 278 | if CC JUMP _double_fault; |
276 | #endif | 279 | #endif |
@@ -1605,6 +1608,7 @@ ENTRY(_sys_call_table) | |||
1605 | .long _sys_inotify_init1 /* 365 */ | 1608 | .long _sys_inotify_init1 /* 365 */ |
1606 | .long _sys_preadv | 1609 | .long _sys_preadv |
1607 | .long _sys_pwritev | 1610 | .long _sys_pwritev |
1611 | .long _sys_rt_tgsigqueueinfo | ||
1608 | 1612 | ||
1609 | .rept NR_syscalls-(.-_sys_call_table)/4 | 1613 | .rept NR_syscalls-(.-_sys_call_table)/4 |
1610 | .long _sys_ni_syscall | 1614 | .long _sys_ni_syscall |
diff --git a/arch/blackfin/mach-common/smp.c b/arch/blackfin/mach-common/smp.c index 3b8ebaee77f2..61840059dfac 100644 --- a/arch/blackfin/mach-common/smp.c +++ b/arch/blackfin/mach-common/smp.c | |||
@@ -144,7 +144,7 @@ static void ipi_call_function(unsigned int cpu, struct ipi_message *msg) | |||
144 | 144 | ||
145 | static irqreturn_t ipi_handler(int irq, void *dev_instance) | 145 | static irqreturn_t ipi_handler(int irq, void *dev_instance) |
146 | { | 146 | { |
147 | struct ipi_message *msg, *mg; | 147 | struct ipi_message *msg; |
148 | struct ipi_message_queue *msg_queue; | 148 | struct ipi_message_queue *msg_queue; |
149 | unsigned int cpu = smp_processor_id(); | 149 | unsigned int cpu = smp_processor_id(); |
150 | 150 | ||
@@ -154,7 +154,8 @@ static irqreturn_t ipi_handler(int irq, void *dev_instance) | |||
154 | msg_queue->count++; | 154 | msg_queue->count++; |
155 | 155 | ||
156 | spin_lock(&msg_queue->lock); | 156 | spin_lock(&msg_queue->lock); |
157 | list_for_each_entry_safe(msg, mg, &msg_queue->head, list) { | 157 | while (!list_empty(&msg_queue->head)) { |
158 | msg = list_entry(msg_queue->head.next, typeof(*msg), list); | ||
158 | list_del(&msg->list); | 159 | list_del(&msg->list); |
159 | switch (msg->type) { | 160 | switch (msg->type) { |
160 | case BFIN_IPI_RESCHEDULE: | 161 | case BFIN_IPI_RESCHEDULE: |
@@ -221,7 +222,7 @@ int smp_call_function(void (*func)(void *info), void *info, int wait) | |||
221 | for_each_cpu_mask(cpu, callmap) { | 222 | for_each_cpu_mask(cpu, callmap) { |
222 | msg_queue = &per_cpu(ipi_msg_queue, cpu); | 223 | msg_queue = &per_cpu(ipi_msg_queue, cpu); |
223 | spin_lock_irqsave(&msg_queue->lock, flags); | 224 | spin_lock_irqsave(&msg_queue->lock, flags); |
224 | list_add(&msg->list, &msg_queue->head); | 225 | list_add_tail(&msg->list, &msg_queue->head); |
225 | spin_unlock_irqrestore(&msg_queue->lock, flags); | 226 | spin_unlock_irqrestore(&msg_queue->lock, flags); |
226 | platform_send_ipi_cpu(cpu); | 227 | platform_send_ipi_cpu(cpu); |
227 | } | 228 | } |
@@ -261,7 +262,7 @@ int smp_call_function_single(int cpuid, void (*func) (void *info), void *info, | |||
261 | 262 | ||
262 | msg_queue = &per_cpu(ipi_msg_queue, cpu); | 263 | msg_queue = &per_cpu(ipi_msg_queue, cpu); |
263 | spin_lock_irqsave(&msg_queue->lock, flags); | 264 | spin_lock_irqsave(&msg_queue->lock, flags); |
264 | list_add(&msg->list, &msg_queue->head); | 265 | list_add_tail(&msg->list, &msg_queue->head); |
265 | spin_unlock_irqrestore(&msg_queue->lock, flags); | 266 | spin_unlock_irqrestore(&msg_queue->lock, flags); |
266 | platform_send_ipi_cpu(cpu); | 267 | platform_send_ipi_cpu(cpu); |
267 | 268 | ||
@@ -292,7 +293,7 @@ void smp_send_reschedule(int cpu) | |||
292 | 293 | ||
293 | msg_queue = &per_cpu(ipi_msg_queue, cpu); | 294 | msg_queue = &per_cpu(ipi_msg_queue, cpu); |
294 | spin_lock_irqsave(&msg_queue->lock, flags); | 295 | spin_lock_irqsave(&msg_queue->lock, flags); |
295 | list_add(&msg->list, &msg_queue->head); | 296 | list_add_tail(&msg->list, &msg_queue->head); |
296 | spin_unlock_irqrestore(&msg_queue->lock, flags); | 297 | spin_unlock_irqrestore(&msg_queue->lock, flags); |
297 | platform_send_ipi_cpu(cpu); | 298 | platform_send_ipi_cpu(cpu); |
298 | 299 | ||
@@ -320,7 +321,7 @@ void smp_send_stop(void) | |||
320 | for_each_cpu_mask(cpu, callmap) { | 321 | for_each_cpu_mask(cpu, callmap) { |
321 | msg_queue = &per_cpu(ipi_msg_queue, cpu); | 322 | msg_queue = &per_cpu(ipi_msg_queue, cpu); |
322 | spin_lock_irqsave(&msg_queue->lock, flags); | 323 | spin_lock_irqsave(&msg_queue->lock, flags); |
323 | list_add(&msg->list, &msg_queue->head); | 324 | list_add_tail(&msg->list, &msg_queue->head); |
324 | spin_unlock_irqrestore(&msg_queue->lock, flags); | 325 | spin_unlock_irqrestore(&msg_queue->lock, flags); |
325 | platform_send_ipi_cpu(cpu); | 326 | platform_send_ipi_cpu(cpu); |
326 | } | 327 | } |
@@ -468,6 +469,17 @@ void smp_icache_flush_range_others(unsigned long start, unsigned long end) | |||
468 | } | 469 | } |
469 | EXPORT_SYMBOL_GPL(smp_icache_flush_range_others); | 470 | EXPORT_SYMBOL_GPL(smp_icache_flush_range_others); |
470 | 471 | ||
472 | #ifdef __ARCH_SYNC_CORE_ICACHE | ||
473 | void resync_core_icache(void) | ||
474 | { | ||
475 | unsigned int cpu = get_cpu(); | ||
476 | blackfin_invalidate_entire_icache(); | ||
477 | ++per_cpu(cpu_data, cpu).icache_invld_count; | ||
478 | put_cpu(); | ||
479 | } | ||
480 | EXPORT_SYMBOL(resync_core_icache); | ||
481 | #endif | ||
482 | |||
471 | #ifdef __ARCH_SYNC_CORE_DCACHE | 483 | #ifdef __ARCH_SYNC_CORE_DCACHE |
472 | unsigned long barrier_mask __attribute__ ((__section__(".l2.bss"))); | 484 | unsigned long barrier_mask __attribute__ ((__section__(".l2.bss"))); |
473 | 485 | ||
diff --git a/arch/cris/include/asm/kmap_types.h b/arch/cris/include/asm/kmap_types.h index 492988cb9077..d2d643c4ea59 100644 --- a/arch/cris/include/asm/kmap_types.h +++ b/arch/cris/include/asm/kmap_types.h | |||
@@ -5,21 +5,6 @@ | |||
5 | * is actually used on cris. | 5 | * is actually used on cris. |
6 | */ | 6 | */ |
7 | 7 | ||
8 | enum km_type { | 8 | #include <asm-generic/kmap_types.h> |
9 | KM_BOUNCE_READ, | ||
10 | KM_SKB_SUNRPC_DATA, | ||
11 | KM_SKB_DATA_SOFTIRQ, | ||
12 | KM_USER0, | ||
13 | KM_USER1, | ||
14 | KM_BIO_SRC_IRQ, | ||
15 | KM_BIO_DST_IRQ, | ||
16 | KM_PTE0, | ||
17 | KM_PTE1, | ||
18 | KM_IRQ0, | ||
19 | KM_IRQ1, | ||
20 | KM_SOFTIRQ0, | ||
21 | KM_SOFTIRQ1, | ||
22 | KM_TYPE_NR | ||
23 | }; | ||
24 | 9 | ||
25 | #endif | 10 | #endif |
diff --git a/arch/cris/kernel/process.c b/arch/cris/kernel/process.c index 4df0b320d524..51dcd04d2777 100644 --- a/arch/cris/kernel/process.c +++ b/arch/cris/kernel/process.c | |||
@@ -38,10 +38,6 @@ | |||
38 | 38 | ||
39 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 39 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
40 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 40 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
41 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
42 | |||
43 | EXPORT_SYMBOL(init_mm); | ||
44 | |||
45 | /* | 41 | /* |
46 | * Initial thread structure. | 42 | * Initial thread structure. |
47 | * | 43 | * |
diff --git a/arch/frv/kernel/init_task.c b/arch/frv/kernel/init_task.c index 29429a8b7f6a..1d3df1d9495c 100644 --- a/arch/frv/kernel/init_task.c +++ b/arch/frv/kernel/init_task.c | |||
@@ -12,10 +12,6 @@ | |||
12 | 12 | ||
13 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 13 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
14 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 14 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
15 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
16 | |||
17 | EXPORT_SYMBOL(init_mm); | ||
18 | |||
19 | /* | 15 | /* |
20 | * Initial thread structure. | 16 | * Initial thread structure. |
21 | * | 17 | * |
diff --git a/arch/h8300/include/asm/kmap_types.h b/arch/h8300/include/asm/kmap_types.h index 1ec8a3427120..be12a7160116 100644 --- a/arch/h8300/include/asm/kmap_types.h +++ b/arch/h8300/include/asm/kmap_types.h | |||
@@ -1,21 +1,6 @@ | |||
1 | #ifndef _ASM_H8300_KMAP_TYPES_H | 1 | #ifndef _ASM_H8300_KMAP_TYPES_H |
2 | #define _ASM_H8300_KMAP_TYPES_H | 2 | #define _ASM_H8300_KMAP_TYPES_H |
3 | 3 | ||
4 | enum km_type { | 4 | #include <asm-generic/kmap_types.h> |
5 | KM_BOUNCE_READ, | ||
6 | KM_SKB_SUNRPC_DATA, | ||
7 | KM_SKB_DATA_SOFTIRQ, | ||
8 | KM_USER0, | ||
9 | KM_USER1, | ||
10 | KM_BIO_SRC_IRQ, | ||
11 | KM_BIO_DST_IRQ, | ||
12 | KM_PTE0, | ||
13 | KM_PTE1, | ||
14 | KM_IRQ0, | ||
15 | KM_IRQ1, | ||
16 | KM_SOFTIRQ0, | ||
17 | KM_SOFTIRQ1, | ||
18 | KM_TYPE_NR | ||
19 | }; | ||
20 | 5 | ||
21 | #endif | 6 | #endif |
diff --git a/arch/h8300/kernel/init_task.c b/arch/h8300/kernel/init_task.c index cb5dc552da97..089c65ed6eb3 100644 --- a/arch/h8300/kernel/init_task.c +++ b/arch/h8300/kernel/init_task.c | |||
@@ -14,10 +14,6 @@ | |||
14 | 14 | ||
15 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 15 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
16 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 16 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
17 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
18 | |||
19 | EXPORT_SYMBOL(init_mm); | ||
20 | |||
21 | /* | 17 | /* |
22 | * Initial task structure. | 18 | * Initial task structure. |
23 | * | 19 | * |
diff --git a/arch/ia64/hp/common/sba_iommu.c b/arch/ia64/hp/common/sba_iommu.c index 56ceb68eb99d..fe63b2dc9d07 100644 --- a/arch/ia64/hp/common/sba_iommu.c +++ b/arch/ia64/hp/common/sba_iommu.c | |||
@@ -1131,7 +1131,7 @@ sba_alloc_coherent (struct device *dev, size_t size, dma_addr_t *dma_handle, gfp | |||
1131 | #ifdef CONFIG_NUMA | 1131 | #ifdef CONFIG_NUMA |
1132 | { | 1132 | { |
1133 | struct page *page; | 1133 | struct page *page; |
1134 | page = alloc_pages_node(ioc->node == MAX_NUMNODES ? | 1134 | page = alloc_pages_exact_node(ioc->node == MAX_NUMNODES ? |
1135 | numa_node_id() : ioc->node, flags, | 1135 | numa_node_id() : ioc->node, flags, |
1136 | get_order(size)); | 1136 | get_order(size)); |
1137 | 1137 | ||
diff --git a/arch/ia64/include/asm/kmap_types.h b/arch/ia64/include/asm/kmap_types.h index 5d1658aa2b3b..05d5f9996105 100644 --- a/arch/ia64/include/asm/kmap_types.h +++ b/arch/ia64/include/asm/kmap_types.h | |||
@@ -1,30 +1,12 @@ | |||
1 | #ifndef _ASM_IA64_KMAP_TYPES_H | 1 | #ifndef _ASM_IA64_KMAP_TYPES_H |
2 | #define _ASM_IA64_KMAP_TYPES_H | 2 | #define _ASM_IA64_KMAP_TYPES_H |
3 | 3 | ||
4 | |||
5 | #ifdef CONFIG_DEBUG_HIGHMEM | 4 | #ifdef CONFIG_DEBUG_HIGHMEM |
6 | # define D(n) __KM_FENCE_##n , | 5 | #define __WITH_KM_FENCE |
7 | #else | ||
8 | # define D(n) | ||
9 | #endif | 6 | #endif |
10 | 7 | ||
11 | enum km_type { | 8 | #include <asm-generic/kmap_types.h> |
12 | D(0) KM_BOUNCE_READ, | ||
13 | D(1) KM_SKB_SUNRPC_DATA, | ||
14 | D(2) KM_SKB_DATA_SOFTIRQ, | ||
15 | D(3) KM_USER0, | ||
16 | D(4) KM_USER1, | ||
17 | D(5) KM_BIO_SRC_IRQ, | ||
18 | D(6) KM_BIO_DST_IRQ, | ||
19 | D(7) KM_PTE0, | ||
20 | D(8) KM_PTE1, | ||
21 | D(9) KM_IRQ0, | ||
22 | D(10) KM_IRQ1, | ||
23 | D(11) KM_SOFTIRQ0, | ||
24 | D(12) KM_SOFTIRQ1, | ||
25 | D(13) KM_TYPE_NR | ||
26 | }; | ||
27 | 9 | ||
28 | #undef D | 10 | #undef __WITH_KM_FENCE |
29 | 11 | ||
30 | #endif /* _ASM_IA64_KMAP_TYPES_H */ | 12 | #endif /* _ASM_IA64_KMAP_TYPES_H */ |
diff --git a/arch/ia64/kernel/init_task.c b/arch/ia64/kernel/init_task.c index 5b0e830c6f33..c475fc281be7 100644 --- a/arch/ia64/kernel/init_task.c +++ b/arch/ia64/kernel/init_task.c | |||
@@ -19,10 +19,6 @@ | |||
19 | 19 | ||
20 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 20 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
21 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 21 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
22 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
23 | |||
24 | EXPORT_SYMBOL(init_mm); | ||
25 | |||
26 | /* | 22 | /* |
27 | * Initial task structure. | 23 | * Initial task structure. |
28 | * | 24 | * |
diff --git a/arch/ia64/kernel/mca.c b/arch/ia64/kernel/mca.c index 8f33a8840422..5b17bd402275 100644 --- a/arch/ia64/kernel/mca.c +++ b/arch/ia64/kernel/mca.c | |||
@@ -1829,8 +1829,7 @@ ia64_mca_cpu_init(void *cpu_data) | |||
1829 | data = mca_bootmem(); | 1829 | data = mca_bootmem(); |
1830 | first_time = 0; | 1830 | first_time = 0; |
1831 | } else | 1831 | } else |
1832 | data = page_address(alloc_pages_node(numa_node_id(), | 1832 | data = __get_free_pages(GFP_KERNEL, get_order(sz)); |
1833 | GFP_KERNEL, get_order(sz))); | ||
1834 | if (!data) | 1833 | if (!data) |
1835 | panic("Could not allocate MCA memory for cpu %d\n", | 1834 | panic("Could not allocate MCA memory for cpu %d\n", |
1836 | cpu); | 1835 | cpu); |
diff --git a/arch/ia64/kernel/perfmon.c b/arch/ia64/kernel/perfmon.c index 8a06dc480594..bdc176cb5e85 100644 --- a/arch/ia64/kernel/perfmon.c +++ b/arch/ia64/kernel/perfmon.c | |||
@@ -5595,7 +5595,7 @@ pfm_interrupt_handler(int irq, void *arg) | |||
5595 | (*pfm_alt_intr_handler->handler)(irq, arg, regs); | 5595 | (*pfm_alt_intr_handler->handler)(irq, arg, regs); |
5596 | } | 5596 | } |
5597 | 5597 | ||
5598 | put_cpu_no_resched(); | 5598 | put_cpu(); |
5599 | return IRQ_HANDLED; | 5599 | return IRQ_HANDLED; |
5600 | } | 5600 | } |
5601 | 5601 | ||
diff --git a/arch/ia64/kernel/uncached.c b/arch/ia64/kernel/uncached.c index 8eff8c1d40a6..6ba72ab42fcc 100644 --- a/arch/ia64/kernel/uncached.c +++ b/arch/ia64/kernel/uncached.c | |||
@@ -98,7 +98,8 @@ static int uncached_add_chunk(struct uncached_pool *uc_pool, int nid) | |||
98 | 98 | ||
99 | /* attempt to allocate a granule's worth of cached memory pages */ | 99 | /* attempt to allocate a granule's worth of cached memory pages */ |
100 | 100 | ||
101 | page = alloc_pages_node(nid, GFP_KERNEL | __GFP_ZERO | GFP_THISNODE, | 101 | page = alloc_pages_exact_node(nid, |
102 | GFP_KERNEL | __GFP_ZERO | GFP_THISNODE, | ||
102 | IA64_GRANULE_SHIFT-PAGE_SHIFT); | 103 | IA64_GRANULE_SHIFT-PAGE_SHIFT); |
103 | if (!page) { | 104 | if (!page) { |
104 | mutex_unlock(&uc_pool->add_chunk_mutex); | 105 | mutex_unlock(&uc_pool->add_chunk_mutex); |
diff --git a/arch/ia64/sn/pci/pci_dma.c b/arch/ia64/sn/pci/pci_dma.c index d876423e4e75..98b684928e12 100644 --- a/arch/ia64/sn/pci/pci_dma.c +++ b/arch/ia64/sn/pci/pci_dma.c | |||
@@ -90,7 +90,8 @@ static void *sn_dma_alloc_coherent(struct device *dev, size_t size, | |||
90 | */ | 90 | */ |
91 | node = pcibus_to_node(pdev->bus); | 91 | node = pcibus_to_node(pdev->bus); |
92 | if (likely(node >=0)) { | 92 | if (likely(node >=0)) { |
93 | struct page *p = alloc_pages_node(node, flags, get_order(size)); | 93 | struct page *p = alloc_pages_exact_node(node, |
94 | flags, get_order(size)); | ||
94 | 95 | ||
95 | if (likely(p)) | 96 | if (likely(p)) |
96 | cpuaddr = page_address(p); | 97 | cpuaddr = page_address(p); |
diff --git a/arch/m32r/include/asm/kmap_types.h b/arch/m32r/include/asm/kmap_types.h index fa94dc6410ea..4cdb5e3a06bf 100644 --- a/arch/m32r/include/asm/kmap_types.h +++ b/arch/m32r/include/asm/kmap_types.h | |||
@@ -2,28 +2,11 @@ | |||
2 | #define __M32R_KMAP_TYPES_H | 2 | #define __M32R_KMAP_TYPES_H |
3 | 3 | ||
4 | #ifdef CONFIG_DEBUG_HIGHMEM | 4 | #ifdef CONFIG_DEBUG_HIGHMEM |
5 | # define D(n) __KM_FENCE_##n , | 5 | #define __WITH_KM_FENCE |
6 | #else | ||
7 | # define D(n) | ||
8 | #endif | 6 | #endif |
9 | 7 | ||
10 | enum km_type { | 8 | #include <asm-generic/kmap_types.h> |
11 | D(0) KM_BOUNCE_READ, | ||
12 | D(1) KM_SKB_SUNRPC_DATA, | ||
13 | D(2) KM_SKB_DATA_SOFTIRQ, | ||
14 | D(3) KM_USER0, | ||
15 | D(4) KM_USER1, | ||
16 | D(5) KM_BIO_SRC_IRQ, | ||
17 | D(6) KM_BIO_DST_IRQ, | ||
18 | D(7) KM_PTE0, | ||
19 | D(8) KM_PTE1, | ||
20 | D(9) KM_IRQ0, | ||
21 | D(10) KM_IRQ1, | ||
22 | D(11) KM_SOFTIRQ0, | ||
23 | D(12) KM_SOFTIRQ1, | ||
24 | D(13) KM_TYPE_NR | ||
25 | }; | ||
26 | 9 | ||
27 | #undef D | 10 | #undef __WITH_KM_FENCE |
28 | 11 | ||
29 | #endif /* __M32R_KMAP_TYPES_H */ | 12 | #endif /* __M32R_KMAP_TYPES_H */ |
diff --git a/arch/m32r/kernel/init_task.c b/arch/m32r/kernel/init_task.c index 016885c6f260..fce57e5d3f91 100644 --- a/arch/m32r/kernel/init_task.c +++ b/arch/m32r/kernel/init_task.c | |||
@@ -13,10 +13,6 @@ | |||
13 | 13 | ||
14 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 14 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
15 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 15 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
16 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
17 | |||
18 | EXPORT_SYMBOL(init_mm); | ||
19 | |||
20 | /* | 16 | /* |
21 | * Initial thread structure. | 17 | * Initial thread structure. |
22 | * | 18 | * |
diff --git a/arch/m32r/mm/discontig.c b/arch/m32r/mm/discontig.c index 7daf897292cf..b7a78ad429b7 100644 --- a/arch/m32r/mm/discontig.c +++ b/arch/m32r/mm/discontig.c | |||
@@ -154,9 +154,9 @@ unsigned long __init zone_sizes_init(void) | |||
154 | * Use all area of internal RAM. | 154 | * Use all area of internal RAM. |
155 | * see __alloc_pages() | 155 | * see __alloc_pages() |
156 | */ | 156 | */ |
157 | NODE_DATA(1)->node_zones->pages_min = 0; | 157 | NODE_DATA(1)->node_zones->watermark[WMARK_MIN] = 0; |
158 | NODE_DATA(1)->node_zones->pages_low = 0; | 158 | NODE_DATA(1)->node_zones->watermark[WMARK_LOW] = 0; |
159 | NODE_DATA(1)->node_zones->pages_high = 0; | 159 | NODE_DATA(1)->node_zones->watermark[WMARK_HIGH] = 0; |
160 | 160 | ||
161 | return holes; | 161 | return holes; |
162 | } | 162 | } |
diff --git a/arch/m32r/platforms/m32104ut/setup.c b/arch/m32r/platforms/m32104ut/setup.c index 98138b4e9220..922fdfdadeaa 100644 --- a/arch/m32r/platforms/m32104ut/setup.c +++ b/arch/m32r/platforms/m32104ut/setup.c | |||
@@ -63,7 +63,7 @@ static void shutdown_m32104ut_irq(unsigned int irq) | |||
63 | outl(M32R_ICUCR_ILEVEL7, port); | 63 | outl(M32R_ICUCR_ILEVEL7, port); |
64 | } | 64 | } |
65 | 65 | ||
66 | static struct hw_interrupt_type m32104ut_irq_type = | 66 | static struct irq_chip m32104ut_irq_type = |
67 | { | 67 | { |
68 | .typename = "M32104UT-IRQ", | 68 | .typename = "M32104UT-IRQ", |
69 | .startup = startup_m32104ut_irq, | 69 | .startup = startup_m32104ut_irq, |
diff --git a/arch/m32r/platforms/m32700ut/setup.c b/arch/m32r/platforms/m32700ut/setup.c index 77b0ae9379e9..9c1bc7487c1e 100644 --- a/arch/m32r/platforms/m32700ut/setup.c +++ b/arch/m32r/platforms/m32700ut/setup.c | |||
@@ -69,7 +69,7 @@ static void shutdown_m32700ut_irq(unsigned int irq) | |||
69 | outl(M32R_ICUCR_ILEVEL7, port); | 69 | outl(M32R_ICUCR_ILEVEL7, port); |
70 | } | 70 | } |
71 | 71 | ||
72 | static struct hw_interrupt_type m32700ut_irq_type = | 72 | static struct irq_chip m32700ut_irq_type = |
73 | { | 73 | { |
74 | .typename = "M32700UT-IRQ", | 74 | .typename = "M32700UT-IRQ", |
75 | .startup = startup_m32700ut_irq, | 75 | .startup = startup_m32700ut_irq, |
@@ -146,7 +146,7 @@ static void shutdown_m32700ut_pld_irq(unsigned int irq) | |||
146 | outw(PLD_ICUCR_ILEVEL7, port); | 146 | outw(PLD_ICUCR_ILEVEL7, port); |
147 | } | 147 | } |
148 | 148 | ||
149 | static struct hw_interrupt_type m32700ut_pld_irq_type = | 149 | static struct irq_chip m32700ut_pld_irq_type = |
150 | { | 150 | { |
151 | .typename = "M32700UT-PLD-IRQ", | 151 | .typename = "M32700UT-PLD-IRQ", |
152 | .startup = startup_m32700ut_pld_irq, | 152 | .startup = startup_m32700ut_pld_irq, |
@@ -215,7 +215,7 @@ static void shutdown_m32700ut_lanpld_irq(unsigned int irq) | |||
215 | outw(PLD_ICUCR_ILEVEL7, port); | 215 | outw(PLD_ICUCR_ILEVEL7, port); |
216 | } | 216 | } |
217 | 217 | ||
218 | static struct hw_interrupt_type m32700ut_lanpld_irq_type = | 218 | static struct irq_chip m32700ut_lanpld_irq_type = |
219 | { | 219 | { |
220 | .typename = "M32700UT-PLD-LAN-IRQ", | 220 | .typename = "M32700UT-PLD-LAN-IRQ", |
221 | .startup = startup_m32700ut_lanpld_irq, | 221 | .startup = startup_m32700ut_lanpld_irq, |
@@ -284,7 +284,7 @@ static void shutdown_m32700ut_lcdpld_irq(unsigned int irq) | |||
284 | outw(PLD_ICUCR_ILEVEL7, port); | 284 | outw(PLD_ICUCR_ILEVEL7, port); |
285 | } | 285 | } |
286 | 286 | ||
287 | static struct hw_interrupt_type m32700ut_lcdpld_irq_type = | 287 | static struct irq_chip m32700ut_lcdpld_irq_type = |
288 | { | 288 | { |
289 | .typename = "M32700UT-PLD-LCD-IRQ", | 289 | .typename = "M32700UT-PLD-LCD-IRQ", |
290 | .startup = startup_m32700ut_lcdpld_irq, | 290 | .startup = startup_m32700ut_lcdpld_irq, |
diff --git a/arch/m32r/platforms/mappi/setup.c b/arch/m32r/platforms/mappi/setup.c index 3ec087ff2214..fb4b17799b66 100644 --- a/arch/m32r/platforms/mappi/setup.c +++ b/arch/m32r/platforms/mappi/setup.c | |||
@@ -63,7 +63,7 @@ static void shutdown_mappi_irq(unsigned int irq) | |||
63 | outl(M32R_ICUCR_ILEVEL7, port); | 63 | outl(M32R_ICUCR_ILEVEL7, port); |
64 | } | 64 | } |
65 | 65 | ||
66 | static struct hw_interrupt_type mappi_irq_type = | 66 | static struct irq_chip mappi_irq_type = |
67 | { | 67 | { |
68 | .typename = "MAPPI-IRQ", | 68 | .typename = "MAPPI-IRQ", |
69 | .startup = startup_mappi_irq, | 69 | .startup = startup_mappi_irq, |
diff --git a/arch/m32r/platforms/mappi2/setup.c b/arch/m32r/platforms/mappi2/setup.c index d87969c6356e..6a65eda0a056 100644 --- a/arch/m32r/platforms/mappi2/setup.c +++ b/arch/m32r/platforms/mappi2/setup.c | |||
@@ -70,7 +70,7 @@ static void shutdown_mappi2_irq(unsigned int irq) | |||
70 | outl(M32R_ICUCR_ILEVEL7, port); | 70 | outl(M32R_ICUCR_ILEVEL7, port); |
71 | } | 71 | } |
72 | 72 | ||
73 | static struct hw_interrupt_type mappi2_irq_type = | 73 | static struct irq_chip mappi2_irq_type = |
74 | { | 74 | { |
75 | .typename = "MAPPI2-IRQ", | 75 | .typename = "MAPPI2-IRQ", |
76 | .startup = startup_mappi2_irq, | 76 | .startup = startup_mappi2_irq, |
diff --git a/arch/m32r/platforms/mappi3/setup.c b/arch/m32r/platforms/mappi3/setup.c index 785b4bd6d9fd..9c337aeac94b 100644 --- a/arch/m32r/platforms/mappi3/setup.c +++ b/arch/m32r/platforms/mappi3/setup.c | |||
@@ -70,7 +70,7 @@ static void shutdown_mappi3_irq(unsigned int irq) | |||
70 | outl(M32R_ICUCR_ILEVEL7, port); | 70 | outl(M32R_ICUCR_ILEVEL7, port); |
71 | } | 71 | } |
72 | 72 | ||
73 | static struct hw_interrupt_type mappi3_irq_type = | 73 | static struct irq_chip mappi3_irq_type = |
74 | { | 74 | { |
75 | .typename = "MAPPI3-IRQ", | 75 | .typename = "MAPPI3-IRQ", |
76 | .startup = startup_mappi3_irq, | 76 | .startup = startup_mappi3_irq, |
diff --git a/arch/m32r/platforms/oaks32r/setup.c b/arch/m32r/platforms/oaks32r/setup.c index 6faa5db68e95..ed865741c38d 100644 --- a/arch/m32r/platforms/oaks32r/setup.c +++ b/arch/m32r/platforms/oaks32r/setup.c | |||
@@ -61,7 +61,7 @@ static void shutdown_oaks32r_irq(unsigned int irq) | |||
61 | outl(M32R_ICUCR_ILEVEL7, port); | 61 | outl(M32R_ICUCR_ILEVEL7, port); |
62 | } | 62 | } |
63 | 63 | ||
64 | static struct hw_interrupt_type oaks32r_irq_type = | 64 | static struct irq_chip oaks32r_irq_type = |
65 | { | 65 | { |
66 | .typename = "OAKS32R-IRQ", | 66 | .typename = "OAKS32R-IRQ", |
67 | .startup = startup_oaks32r_irq, | 67 | .startup = startup_oaks32r_irq, |
diff --git a/arch/m32r/platforms/opsput/setup.c b/arch/m32r/platforms/opsput/setup.c index fab13fd85422..80d680657019 100644 --- a/arch/m32r/platforms/opsput/setup.c +++ b/arch/m32r/platforms/opsput/setup.c | |||
@@ -70,7 +70,7 @@ static void shutdown_opsput_irq(unsigned int irq) | |||
70 | outl(M32R_ICUCR_ILEVEL7, port); | 70 | outl(M32R_ICUCR_ILEVEL7, port); |
71 | } | 71 | } |
72 | 72 | ||
73 | static struct hw_interrupt_type opsput_irq_type = | 73 | static struct irq_chip opsput_irq_type = |
74 | { | 74 | { |
75 | .typename = "OPSPUT-IRQ", | 75 | .typename = "OPSPUT-IRQ", |
76 | .startup = startup_opsput_irq, | 76 | .startup = startup_opsput_irq, |
@@ -147,7 +147,7 @@ static void shutdown_opsput_pld_irq(unsigned int irq) | |||
147 | outw(PLD_ICUCR_ILEVEL7, port); | 147 | outw(PLD_ICUCR_ILEVEL7, port); |
148 | } | 148 | } |
149 | 149 | ||
150 | static struct hw_interrupt_type opsput_pld_irq_type = | 150 | static struct irq_chip opsput_pld_irq_type = |
151 | { | 151 | { |
152 | .typename = "OPSPUT-PLD-IRQ", | 152 | .typename = "OPSPUT-PLD-IRQ", |
153 | .startup = startup_opsput_pld_irq, | 153 | .startup = startup_opsput_pld_irq, |
@@ -216,7 +216,7 @@ static void shutdown_opsput_lanpld_irq(unsigned int irq) | |||
216 | outw(PLD_ICUCR_ILEVEL7, port); | 216 | outw(PLD_ICUCR_ILEVEL7, port); |
217 | } | 217 | } |
218 | 218 | ||
219 | static struct hw_interrupt_type opsput_lanpld_irq_type = | 219 | static struct irq_chip opsput_lanpld_irq_type = |
220 | { | 220 | { |
221 | .typename = "OPSPUT-PLD-LAN-IRQ", | 221 | .typename = "OPSPUT-PLD-LAN-IRQ", |
222 | .startup = startup_opsput_lanpld_irq, | 222 | .startup = startup_opsput_lanpld_irq, |
@@ -285,7 +285,7 @@ static void shutdown_opsput_lcdpld_irq(unsigned int irq) | |||
285 | outw(PLD_ICUCR_ILEVEL7, port); | 285 | outw(PLD_ICUCR_ILEVEL7, port); |
286 | } | 286 | } |
287 | 287 | ||
288 | static struct hw_interrupt_type opsput_lcdpld_irq_type = | 288 | static struct irq_chip opsput_lcdpld_irq_type = |
289 | { | 289 | { |
290 | "OPSPUT-PLD-LCD-IRQ", | 290 | "OPSPUT-PLD-LCD-IRQ", |
291 | startup_opsput_lcdpld_irq, | 291 | startup_opsput_lcdpld_irq, |
diff --git a/arch/m32r/platforms/usrv/setup.c b/arch/m32r/platforms/usrv/setup.c index 89588d649eb7..757302660af8 100644 --- a/arch/m32r/platforms/usrv/setup.c +++ b/arch/m32r/platforms/usrv/setup.c | |||
@@ -61,7 +61,7 @@ static void shutdown_mappi_irq(unsigned int irq) | |||
61 | outl(M32R_ICUCR_ILEVEL7, port); | 61 | outl(M32R_ICUCR_ILEVEL7, port); |
62 | } | 62 | } |
63 | 63 | ||
64 | static struct hw_interrupt_type mappi_irq_type = | 64 | static struct irq_chip mappi_irq_type = |
65 | { | 65 | { |
66 | .typename = "M32700-IRQ", | 66 | .typename = "M32700-IRQ", |
67 | .startup = startup_mappi_irq, | 67 | .startup = startup_mappi_irq, |
@@ -134,7 +134,7 @@ static void shutdown_m32700ut_pld_irq(unsigned int irq) | |||
134 | outw(PLD_ICUCR_ILEVEL7, port); | 134 | outw(PLD_ICUCR_ILEVEL7, port); |
135 | } | 135 | } |
136 | 136 | ||
137 | static struct hw_interrupt_type m32700ut_pld_irq_type = | 137 | static struct irq_chip m32700ut_pld_irq_type = |
138 | { | 138 | { |
139 | .typename = "USRV-PLD-IRQ", | 139 | .typename = "USRV-PLD-IRQ", |
140 | .startup = startup_m32700ut_pld_irq, | 140 | .startup = startup_m32700ut_pld_irq, |
diff --git a/arch/m68k/include/asm/kmap_types.h b/arch/m68k/include/asm/kmap_types.h index c843c63d3801..3413cc1390ec 100644 --- a/arch/m68k/include/asm/kmap_types.h +++ b/arch/m68k/include/asm/kmap_types.h | |||
@@ -1,21 +1,6 @@ | |||
1 | #ifndef __ASM_M68K_KMAP_TYPES_H | 1 | #ifndef __ASM_M68K_KMAP_TYPES_H |
2 | #define __ASM_M68K_KMAP_TYPES_H | 2 | #define __ASM_M68K_KMAP_TYPES_H |
3 | 3 | ||
4 | enum km_type { | 4 | #include <asm-generic/kmap_types.h> |
5 | KM_BOUNCE_READ, | ||
6 | KM_SKB_SUNRPC_DATA, | ||
7 | KM_SKB_DATA_SOFTIRQ, | ||
8 | KM_USER0, | ||
9 | KM_USER1, | ||
10 | KM_BIO_SRC_IRQ, | ||
11 | KM_BIO_DST_IRQ, | ||
12 | KM_PTE0, | ||
13 | KM_PTE1, | ||
14 | KM_IRQ0, | ||
15 | KM_IRQ1, | ||
16 | KM_SOFTIRQ0, | ||
17 | KM_SOFTIRQ1, | ||
18 | KM_TYPE_NR | ||
19 | }; | ||
20 | 5 | ||
21 | #endif /* __ASM_M68K_KMAP_TYPES_H */ | 6 | #endif /* __ASM_M68K_KMAP_TYPES_H */ |
diff --git a/arch/m68k/kernel/process.c b/arch/m68k/kernel/process.c index ec37fb56c127..72bad65dba3a 100644 --- a/arch/m68k/kernel/process.c +++ b/arch/m68k/kernel/process.c | |||
@@ -42,10 +42,6 @@ | |||
42 | */ | 42 | */ |
43 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 43 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
44 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 44 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
45 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
46 | |||
47 | EXPORT_SYMBOL(init_mm); | ||
48 | |||
49 | union thread_union init_thread_union | 45 | union thread_union init_thread_union |
50 | __attribute__((section(".data.init_task"), aligned(THREAD_SIZE))) | 46 | __attribute__((section(".data.init_task"), aligned(THREAD_SIZE))) |
51 | = { INIT_THREAD_INFO(init_task) }; | 47 | = { INIT_THREAD_INFO(init_task) }; |
diff --git a/arch/m68knommu/kernel/init_task.c b/arch/m68knommu/kernel/init_task.c index fe282de1d596..45e97a207fed 100644 --- a/arch/m68knommu/kernel/init_task.c +++ b/arch/m68knommu/kernel/init_task.c | |||
@@ -14,10 +14,6 @@ | |||
14 | 14 | ||
15 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 15 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
16 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 16 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
17 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
18 | |||
19 | EXPORT_SYMBOL(init_mm); | ||
20 | |||
21 | /* | 17 | /* |
22 | * Initial task structure. | 18 | * Initial task structure. |
23 | * | 19 | * |
diff --git a/arch/microblaze/include/asm/kmap_types.h b/arch/microblaze/include/asm/kmap_types.h index 4d7e222f5dd7..25975252d83d 100644 --- a/arch/microblaze/include/asm/kmap_types.h +++ b/arch/microblaze/include/asm/kmap_types.h | |||
@@ -1,29 +1,6 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2006 Atmark Techno, Inc. | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | */ | ||
8 | |||
9 | #ifndef _ASM_MICROBLAZE_KMAP_TYPES_H | 1 | #ifndef _ASM_MICROBLAZE_KMAP_TYPES_H |
10 | #define _ASM_MICROBLAZE_KMAP_TYPES_H | 2 | #define _ASM_MICROBLAZE_KMAP_TYPES_H |
11 | 3 | ||
12 | enum km_type { | 4 | #include <asm-generic/kmap_types.h> |
13 | KM_BOUNCE_READ, | ||
14 | KM_SKB_SUNRPC_DATA, | ||
15 | KM_SKB_DATA_SOFTIRQ, | ||
16 | KM_USER0, | ||
17 | KM_USER1, | ||
18 | KM_BIO_SRC_IRQ, | ||
19 | KM_BIO_DST_IRQ, | ||
20 | KM_PTE0, | ||
21 | KM_PTE1, | ||
22 | KM_IRQ0, | ||
23 | KM_IRQ1, | ||
24 | KM_SOFTIRQ0, | ||
25 | KM_SOFTIRQ1, | ||
26 | KM_TYPE_NR, | ||
27 | }; | ||
28 | 5 | ||
29 | #endif /* _ASM_MICROBLAZE_KMAP_TYPES_H */ | 6 | #endif /* _ASM_MICROBLAZE_KMAP_TYPES_H */ |
diff --git a/arch/mips/configs/bigsur_defconfig b/arch/mips/configs/bigsur_defconfig index 783da855a2e3..d6d35b2e5fe8 100644 --- a/arch/mips/configs/bigsur_defconfig +++ b/arch/mips/configs/bigsur_defconfig | |||
@@ -963,7 +963,7 @@ CONFIG_EEPROM_LEGACY=y | |||
963 | CONFIG_SENSORS_PCF8574=y | 963 | CONFIG_SENSORS_PCF8574=y |
964 | # CONFIG_PCF8575 is not set | 964 | # CONFIG_PCF8575 is not set |
965 | CONFIG_SENSORS_PCF8591=y | 965 | CONFIG_SENSORS_PCF8591=y |
966 | CONFIG_SENSORS_MAX6875=y | 966 | CONFIG_EEPROM_MAX6875=y |
967 | # CONFIG_SENSORS_TSL2550 is not set | 967 | # CONFIG_SENSORS_TSL2550 is not set |
968 | CONFIG_I2C_DEBUG_CORE=y | 968 | CONFIG_I2C_DEBUG_CORE=y |
969 | CONFIG_I2C_DEBUG_ALGO=y | 969 | CONFIG_I2C_DEBUG_ALGO=y |
diff --git a/arch/mips/configs/mtx1_defconfig b/arch/mips/configs/mtx1_defconfig index 8426d3b9501c..fadb351d249b 100644 --- a/arch/mips/configs/mtx1_defconfig +++ b/arch/mips/configs/mtx1_defconfig | |||
@@ -1849,7 +1849,7 @@ CONFIG_EEPROM_LEGACY=m | |||
1849 | CONFIG_SENSORS_PCF8574=m | 1849 | CONFIG_SENSORS_PCF8574=m |
1850 | CONFIG_SENSORS_PCA9539=m | 1850 | CONFIG_SENSORS_PCA9539=m |
1851 | CONFIG_SENSORS_PCF8591=m | 1851 | CONFIG_SENSORS_PCF8591=m |
1852 | CONFIG_SENSORS_MAX6875=m | 1852 | CONFIG_EEPROM_MAX6875=m |
1853 | # CONFIG_SENSORS_TSL2550 is not set | 1853 | # CONFIG_SENSORS_TSL2550 is not set |
1854 | # CONFIG_I2C_DEBUG_CORE is not set | 1854 | # CONFIG_I2C_DEBUG_CORE is not set |
1855 | # CONFIG_I2C_DEBUG_ALGO is not set | 1855 | # CONFIG_I2C_DEBUG_ALGO is not set |
diff --git a/arch/mips/include/asm/i8253.h b/arch/mips/include/asm/i8253.h index 5dabc870b322..032ca73f181b 100644 --- a/arch/mips/include/asm/i8253.h +++ b/arch/mips/include/asm/i8253.h | |||
@@ -12,8 +12,6 @@ | |||
12 | #define PIT_CH0 0x40 | 12 | #define PIT_CH0 0x40 |
13 | #define PIT_CH2 0x42 | 13 | #define PIT_CH2 0x42 |
14 | 14 | ||
15 | #define PIT_TICK_RATE 1193182UL | ||
16 | |||
17 | extern spinlock_t i8253_lock; | 15 | extern spinlock_t i8253_lock; |
18 | 16 | ||
19 | extern void setup_pit_timer(void); | 17 | extern void setup_pit_timer(void); |
diff --git a/arch/mips/include/asm/kmap_types.h b/arch/mips/include/asm/kmap_types.h index 806aae3c5338..58e91ed0388f 100644 --- a/arch/mips/include/asm/kmap_types.h +++ b/arch/mips/include/asm/kmap_types.h | |||
@@ -1,30 +1,12 @@ | |||
1 | #ifndef _ASM_KMAP_TYPES_H | 1 | #ifndef _ASM_KMAP_TYPES_H |
2 | #define _ASM_KMAP_TYPES_H | 2 | #define _ASM_KMAP_TYPES_H |
3 | 3 | ||
4 | |||
5 | #ifdef CONFIG_DEBUG_HIGHMEM | 4 | #ifdef CONFIG_DEBUG_HIGHMEM |
6 | # define D(n) __KM_FENCE_##n , | 5 | #define __WITH_KM_FENCE |
7 | #else | ||
8 | # define D(n) | ||
9 | #endif | 6 | #endif |
10 | 7 | ||
11 | enum km_type { | 8 | #include <asm-generic/kmap_types.h> |
12 | D(0) KM_BOUNCE_READ, | ||
13 | D(1) KM_SKB_SUNRPC_DATA, | ||
14 | D(2) KM_SKB_DATA_SOFTIRQ, | ||
15 | D(3) KM_USER0, | ||
16 | D(4) KM_USER1, | ||
17 | D(5) KM_BIO_SRC_IRQ, | ||
18 | D(6) KM_BIO_DST_IRQ, | ||
19 | D(7) KM_PTE0, | ||
20 | D(8) KM_PTE1, | ||
21 | D(9) KM_IRQ0, | ||
22 | D(10) KM_IRQ1, | ||
23 | D(11) KM_SOFTIRQ0, | ||
24 | D(12) KM_SOFTIRQ1, | ||
25 | D(13) KM_TYPE_NR | ||
26 | }; | ||
27 | 9 | ||
28 | #undef D | 10 | #undef __WITH_KM_FENCE |
29 | 11 | ||
30 | #endif | 12 | #endif |
diff --git a/arch/mips/kernel/init_task.c b/arch/mips/kernel/init_task.c index 149cd914526e..5b457a40c784 100644 --- a/arch/mips/kernel/init_task.c +++ b/arch/mips/kernel/init_task.c | |||
@@ -11,10 +11,6 @@ | |||
11 | 11 | ||
12 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 12 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
13 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 13 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
14 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
15 | |||
16 | EXPORT_SYMBOL(init_mm); | ||
17 | |||
18 | /* | 14 | /* |
19 | * Initial thread structure. | 15 | * Initial thread structure. |
20 | * | 16 | * |
diff --git a/arch/mips/sni/eisa.c b/arch/mips/sni/eisa.c index 7396cd719900..6827feb4de96 100644 --- a/arch/mips/sni/eisa.c +++ b/arch/mips/sni/eisa.c | |||
@@ -38,7 +38,7 @@ int __init sni_eisa_root_init(void) | |||
38 | if (!r) | 38 | if (!r) |
39 | return r; | 39 | return r; |
40 | 40 | ||
41 | eisa_root_dev.dev.driver_data = &eisa_bus_root; | 41 | dev_set_drvdata(&eisa_root_dev.dev, &eisa_bus_root); |
42 | 42 | ||
43 | if (eisa_root_register(&eisa_bus_root)) { | 43 | if (eisa_root_register(&eisa_bus_root)) { |
44 | /* A real bridge may have been registered before | 44 | /* A real bridge may have been registered before |
diff --git a/arch/mn10300/include/asm/kmap_types.h b/arch/mn10300/include/asm/kmap_types.h index 3398f9f35603..76d093b58d4f 100644 --- a/arch/mn10300/include/asm/kmap_types.h +++ b/arch/mn10300/include/asm/kmap_types.h | |||
@@ -1,31 +1,6 @@ | |||
1 | /* MN10300 kmap_atomic() slot IDs | ||
2 | * | ||
3 | * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. | ||
4 | * Written by David Howells (dhowells@redhat.com) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public Licence | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the Licence, or (at your option) any later version. | ||
10 | */ | ||
11 | #ifndef _ASM_KMAP_TYPES_H | 1 | #ifndef _ASM_KMAP_TYPES_H |
12 | #define _ASM_KMAP_TYPES_H | 2 | #define _ASM_KMAP_TYPES_H |
13 | 3 | ||
14 | enum km_type { | 4 | #include <asm-generic/kmap_types.h> |
15 | KM_BOUNCE_READ, | ||
16 | KM_SKB_SUNRPC_DATA, | ||
17 | KM_SKB_DATA_SOFTIRQ, | ||
18 | KM_USER0, | ||
19 | KM_USER1, | ||
20 | KM_BIO_SRC_IRQ, | ||
21 | KM_BIO_DST_IRQ, | ||
22 | KM_PTE0, | ||
23 | KM_PTE1, | ||
24 | KM_IRQ0, | ||
25 | KM_IRQ1, | ||
26 | KM_SOFTIRQ0, | ||
27 | KM_SOFTIRQ1, | ||
28 | KM_TYPE_NR | ||
29 | }; | ||
30 | 5 | ||
31 | #endif /* _ASM_KMAP_TYPES_H */ | 6 | #endif /* _ASM_KMAP_TYPES_H */ |
diff --git a/arch/mn10300/kernel/init_task.c b/arch/mn10300/kernel/init_task.c index 5ac3566f8c98..80d423b80af3 100644 --- a/arch/mn10300/kernel/init_task.c +++ b/arch/mn10300/kernel/init_task.c | |||
@@ -20,9 +20,6 @@ | |||
20 | 20 | ||
21 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 21 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
22 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 22 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
23 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
24 | EXPORT_SYMBOL(init_mm); | ||
25 | |||
26 | /* | 23 | /* |
27 | * Initial thread structure. | 24 | * Initial thread structure. |
28 | * | 25 | * |
diff --git a/arch/parisc/include/asm/kmap_types.h b/arch/parisc/include/asm/kmap_types.h index 806aae3c5338..58e91ed0388f 100644 --- a/arch/parisc/include/asm/kmap_types.h +++ b/arch/parisc/include/asm/kmap_types.h | |||
@@ -1,30 +1,12 @@ | |||
1 | #ifndef _ASM_KMAP_TYPES_H | 1 | #ifndef _ASM_KMAP_TYPES_H |
2 | #define _ASM_KMAP_TYPES_H | 2 | #define _ASM_KMAP_TYPES_H |
3 | 3 | ||
4 | |||
5 | #ifdef CONFIG_DEBUG_HIGHMEM | 4 | #ifdef CONFIG_DEBUG_HIGHMEM |
6 | # define D(n) __KM_FENCE_##n , | 5 | #define __WITH_KM_FENCE |
7 | #else | ||
8 | # define D(n) | ||
9 | #endif | 6 | #endif |
10 | 7 | ||
11 | enum km_type { | 8 | #include <asm-generic/kmap_types.h> |
12 | D(0) KM_BOUNCE_READ, | ||
13 | D(1) KM_SKB_SUNRPC_DATA, | ||
14 | D(2) KM_SKB_DATA_SOFTIRQ, | ||
15 | D(3) KM_USER0, | ||
16 | D(4) KM_USER1, | ||
17 | D(5) KM_BIO_SRC_IRQ, | ||
18 | D(6) KM_BIO_DST_IRQ, | ||
19 | D(7) KM_PTE0, | ||
20 | D(8) KM_PTE1, | ||
21 | D(9) KM_IRQ0, | ||
22 | D(10) KM_IRQ1, | ||
23 | D(11) KM_SOFTIRQ0, | ||
24 | D(12) KM_SOFTIRQ1, | ||
25 | D(13) KM_TYPE_NR | ||
26 | }; | ||
27 | 9 | ||
28 | #undef D | 10 | #undef __WITH_KM_FENCE |
29 | 11 | ||
30 | #endif | 12 | #endif |
diff --git a/arch/parisc/kernel/init_task.c b/arch/parisc/kernel/init_task.c index 1e25a45d64c1..82974b20fc10 100644 --- a/arch/parisc/kernel/init_task.c +++ b/arch/parisc/kernel/init_task.c | |||
@@ -36,10 +36,6 @@ | |||
36 | 36 | ||
37 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 37 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
38 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 38 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
39 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
40 | |||
41 | EXPORT_SYMBOL(init_mm); | ||
42 | |||
43 | /* | 39 | /* |
44 | * Initial task structure. | 40 | * Initial task structure. |
45 | * | 41 | * |
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 93a61898b259..9fb344d5a86a 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -93,10 +93,6 @@ config GENERIC_HWEIGHT | |||
93 | bool | 93 | bool |
94 | default y | 94 | default y |
95 | 95 | ||
96 | config GENERIC_CALIBRATE_DELAY | ||
97 | bool | ||
98 | default y | ||
99 | |||
100 | config GENERIC_FIND_NEXT_BIT | 96 | config GENERIC_FIND_NEXT_BIT |
101 | bool | 97 | bool |
102 | default y | 98 | default y |
@@ -129,6 +125,7 @@ config PPC | |||
129 | select USE_GENERIC_SMP_HELPERS if SMP | 125 | select USE_GENERIC_SMP_HELPERS if SMP |
130 | select HAVE_OPROFILE | 126 | select HAVE_OPROFILE |
131 | select HAVE_SYSCALL_WRAPPERS if PPC64 | 127 | select HAVE_SYSCALL_WRAPPERS if PPC64 |
128 | select GENERIC_ATOMIC64 if PPC32 | ||
132 | 129 | ||
133 | config EARLY_PRINTK | 130 | config EARLY_PRINTK |
134 | bool | 131 | bool |
diff --git a/arch/powerpc/boot/install.sh b/arch/powerpc/boot/install.sh index 51b2387bdba0..98312d169c85 100644 --- a/arch/powerpc/boot/install.sh +++ b/arch/powerpc/boot/install.sh | |||
@@ -18,6 +18,9 @@ | |||
18 | # $5 and more - kernel boot files; zImage*, uImage, cuImage.*, etc. | 18 | # $5 and more - kernel boot files; zImage*, uImage, cuImage.*, etc. |
19 | # | 19 | # |
20 | 20 | ||
21 | # Bail with error code if anything goes wrong | ||
22 | set -e | ||
23 | |||
21 | # User may have a custom install script | 24 | # User may have a custom install script |
22 | 25 | ||
23 | if [ -x ~/bin/${CROSS_COMPILE}installkernel ]; then exec ~/bin/${CROSS_COMPILE}installkernel "$@"; fi | 26 | if [ -x ~/bin/${CROSS_COMPILE}installkernel ]; then exec ~/bin/${CROSS_COMPILE}installkernel "$@"; fi |
diff --git a/arch/powerpc/configs/ppc6xx_defconfig b/arch/powerpc/configs/ppc6xx_defconfig index 7d044dfd9236..12dc7c409616 100644 --- a/arch/powerpc/configs/ppc6xx_defconfig +++ b/arch/powerpc/configs/ppc6xx_defconfig | |||
@@ -1808,7 +1808,7 @@ CONFIG_PCF8575=m | |||
1808 | CONFIG_SENSORS_PCA9539=m | 1808 | CONFIG_SENSORS_PCA9539=m |
1809 | CONFIG_SENSORS_PCF8591=m | 1809 | CONFIG_SENSORS_PCF8591=m |
1810 | # CONFIG_TPS65010 is not set | 1810 | # CONFIG_TPS65010 is not set |
1811 | CONFIG_SENSORS_MAX6875=m | 1811 | CONFIG_EEPROM_MAX6875=m |
1812 | CONFIG_SENSORS_TSL2550=m | 1812 | CONFIG_SENSORS_TSL2550=m |
1813 | CONFIG_MCU_MPC8349EMITX=m | 1813 | CONFIG_MCU_MPC8349EMITX=m |
1814 | # CONFIG_I2C_DEBUG_CORE is not set | 1814 | # CONFIG_I2C_DEBUG_CORE is not set |
diff --git a/arch/powerpc/include/asm/8253pit.h b/arch/powerpc/include/asm/8253pit.h index b70d6e53b303..a71c9c1455a7 100644 --- a/arch/powerpc/include/asm/8253pit.h +++ b/arch/powerpc/include/asm/8253pit.h | |||
@@ -1,10 +1,3 @@ | |||
1 | #ifndef _ASM_POWERPC_8253PIT_H | ||
2 | #define _ASM_POWERPC_8253PIT_H | ||
3 | |||
4 | /* | 1 | /* |
5 | * 8253/8254 Programmable Interval Timer | 2 | * 8253/8254 Programmable Interval Timer |
6 | */ | 3 | */ |
7 | |||
8 | #define PIT_TICK_RATE 1193182UL | ||
9 | |||
10 | #endif /* _ASM_POWERPC_8253PIT_H */ | ||
diff --git a/arch/powerpc/include/asm/atomic.h b/arch/powerpc/include/asm/atomic.h index b7d2d07b6f96..4012483b1899 100644 --- a/arch/powerpc/include/asm/atomic.h +++ b/arch/powerpc/include/asm/atomic.h | |||
@@ -470,6 +470,9 @@ static __inline__ int atomic64_add_unless(atomic64_t *v, long a, long u) | |||
470 | 470 | ||
471 | #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) | 471 | #define atomic64_inc_not_zero(v) atomic64_add_unless((v), 1, 0) |
472 | 472 | ||
473 | #else /* __powerpc64__ */ | ||
474 | #include <asm-generic/atomic64.h> | ||
475 | |||
473 | #endif /* __powerpc64__ */ | 476 | #endif /* __powerpc64__ */ |
474 | 477 | ||
475 | #include <asm-generic/atomic-long.h> | 478 | #include <asm-generic/atomic-long.h> |
diff --git a/arch/powerpc/include/asm/hw_irq.h b/arch/powerpc/include/asm/hw_irq.h index 53512374e1c9..b7f8f4a87cc0 100644 --- a/arch/powerpc/include/asm/hw_irq.h +++ b/arch/powerpc/include/asm/hw_irq.h | |||
@@ -80,7 +80,7 @@ static inline void local_irq_disable(void) | |||
80 | __asm__ __volatile__("wrteei 0": : :"memory"); | 80 | __asm__ __volatile__("wrteei 0": : :"memory"); |
81 | #else | 81 | #else |
82 | unsigned long msr; | 82 | unsigned long msr; |
83 | __asm__ __volatile__("": : :"memory"); | 83 | |
84 | msr = mfmsr(); | 84 | msr = mfmsr(); |
85 | SET_MSR_EE(msr & ~MSR_EE); | 85 | SET_MSR_EE(msr & ~MSR_EE); |
86 | #endif | 86 | #endif |
@@ -92,7 +92,7 @@ static inline void local_irq_enable(void) | |||
92 | __asm__ __volatile__("wrteei 1": : :"memory"); | 92 | __asm__ __volatile__("wrteei 1": : :"memory"); |
93 | #else | 93 | #else |
94 | unsigned long msr; | 94 | unsigned long msr; |
95 | __asm__ __volatile__("": : :"memory"); | 95 | |
96 | msr = mfmsr(); | 96 | msr = mfmsr(); |
97 | SET_MSR_EE(msr | MSR_EE); | 97 | SET_MSR_EE(msr | MSR_EE); |
98 | #endif | 98 | #endif |
@@ -108,7 +108,6 @@ static inline void local_irq_save_ptr(unsigned long *flags) | |||
108 | #else | 108 | #else |
109 | SET_MSR_EE(msr & ~MSR_EE); | 109 | SET_MSR_EE(msr & ~MSR_EE); |
110 | #endif | 110 | #endif |
111 | __asm__ __volatile__("": : :"memory"); | ||
112 | } | 111 | } |
113 | 112 | ||
114 | #define local_save_flags(flags) ((flags) = mfmsr()) | 113 | #define local_save_flags(flags) ((flags) = mfmsr()) |
diff --git a/arch/powerpc/include/asm/iommu.h b/arch/powerpc/include/asm/iommu.h index 7464c0daddd1..7ead7c16fb7c 100644 --- a/arch/powerpc/include/asm/iommu.h +++ b/arch/powerpc/include/asm/iommu.h | |||
@@ -35,6 +35,16 @@ | |||
35 | #define IOMMU_PAGE_MASK (~((1 << IOMMU_PAGE_SHIFT) - 1)) | 35 | #define IOMMU_PAGE_MASK (~((1 << IOMMU_PAGE_SHIFT) - 1)) |
36 | #define IOMMU_PAGE_ALIGN(addr) _ALIGN_UP(addr, IOMMU_PAGE_SIZE) | 36 | #define IOMMU_PAGE_ALIGN(addr) _ALIGN_UP(addr, IOMMU_PAGE_SIZE) |
37 | 37 | ||
38 | /* Cell page table entries */ | ||
39 | #define CBE_IOPTE_PP_W 0x8000000000000000ul /* protection: write */ | ||
40 | #define CBE_IOPTE_PP_R 0x4000000000000000ul /* protection: read */ | ||
41 | #define CBE_IOPTE_M 0x2000000000000000ul /* coherency required */ | ||
42 | #define CBE_IOPTE_SO_R 0x1000000000000000ul /* ordering: writes */ | ||
43 | #define CBE_IOPTE_SO_RW 0x1800000000000000ul /* ordering: r & w */ | ||
44 | #define CBE_IOPTE_RPN_Mask 0x07fffffffffff000ul /* RPN */ | ||
45 | #define CBE_IOPTE_H 0x0000000000000800ul /* cache hint */ | ||
46 | #define CBE_IOPTE_IOID_Mask 0x00000000000007fful /* ioid */ | ||
47 | |||
38 | /* Boot time flags */ | 48 | /* Boot time flags */ |
39 | extern int iommu_is_off; | 49 | extern int iommu_is_off; |
40 | extern int iommu_force_on; | 50 | extern int iommu_force_on; |
diff --git a/arch/powerpc/include/asm/ps3.h b/arch/powerpc/include/asm/ps3.h index cdb6fd814de8..7f065e178ec4 100644 --- a/arch/powerpc/include/asm/ps3.h +++ b/arch/powerpc/include/asm/ps3.h | |||
@@ -53,6 +53,13 @@ enum ps3_param_av_multi_out ps3_os_area_get_av_multi_out(void); | |||
53 | extern u64 ps3_os_area_get_rtc_diff(void); | 53 | extern u64 ps3_os_area_get_rtc_diff(void); |
54 | extern void ps3_os_area_set_rtc_diff(u64 rtc_diff); | 54 | extern void ps3_os_area_set_rtc_diff(u64 rtc_diff); |
55 | 55 | ||
56 | struct ps3_os_area_flash_ops { | ||
57 | ssize_t (*read)(void *buf, size_t count, loff_t pos); | ||
58 | ssize_t (*write)(const void *buf, size_t count, loff_t pos); | ||
59 | }; | ||
60 | |||
61 | extern void ps3_os_area_flash_register(const struct ps3_os_area_flash_ops *ops); | ||
62 | |||
56 | /* dma routines */ | 63 | /* dma routines */ |
57 | 64 | ||
58 | enum ps3_dma_page_size { | 65 | enum ps3_dma_page_size { |
@@ -418,15 +425,15 @@ static inline struct ps3_system_bus_driver * | |||
418 | * @data: Data to set | 425 | * @data: Data to set |
419 | */ | 426 | */ |
420 | 427 | ||
421 | static inline void ps3_system_bus_set_driver_data( | 428 | static inline void ps3_system_bus_set_drvdata( |
422 | struct ps3_system_bus_device *dev, void *data) | 429 | struct ps3_system_bus_device *dev, void *data) |
423 | { | 430 | { |
424 | dev->core.driver_data = data; | 431 | dev_set_drvdata(&dev->core, data); |
425 | } | 432 | } |
426 | static inline void *ps3_system_bus_get_driver_data( | 433 | static inline void *ps3_system_bus_get_drvdata( |
427 | struct ps3_system_bus_device *dev) | 434 | struct ps3_system_bus_device *dev) |
428 | { | 435 | { |
429 | return dev->core.driver_data; | 436 | return dev_get_drvdata(&dev->core); |
430 | } | 437 | } |
431 | 438 | ||
432 | /* These two need global scope for get_dma_ops(). */ | 439 | /* These two need global scope for get_dma_ops(). */ |
@@ -520,7 +527,4 @@ void ps3_sync_irq(int node); | |||
520 | u32 ps3_get_hw_thread_id(int cpu); | 527 | u32 ps3_get_hw_thread_id(int cpu); |
521 | u64 ps3_get_spe_id(void *arg); | 528 | u64 ps3_get_spe_id(void *arg); |
522 | 529 | ||
523 | /* mutex synchronizing GPU accesses and video mode changes */ | ||
524 | extern struct mutex ps3_gpu_mutex; | ||
525 | |||
526 | #endif | 530 | #endif |
diff --git a/arch/powerpc/include/asm/ps3gpu.h b/arch/powerpc/include/asm/ps3gpu.h new file mode 100644 index 000000000000..b2b89591907c --- /dev/null +++ b/arch/powerpc/include/asm/ps3gpu.h | |||
@@ -0,0 +1,86 @@ | |||
1 | /* | ||
2 | * PS3 GPU declarations. | ||
3 | * | ||
4 | * Copyright 2009 Sony Corporation | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; version 2 of the License. | ||
9 | * | ||
10 | * This program is distributed in the hope that it will be useful, | ||
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
13 | * GNU General Public License for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program. | ||
17 | * If not, see <http://www.gnu.org/licenses/>. | ||
18 | */ | ||
19 | |||
20 | #ifndef _ASM_POWERPC_PS3GPU_H | ||
21 | #define _ASM_POWERPC_PS3GPU_H | ||
22 | |||
23 | #include <linux/mutex.h> | ||
24 | |||
25 | #include <asm/lv1call.h> | ||
26 | |||
27 | |||
28 | #define L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_SYNC 0x101 | ||
29 | #define L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP 0x102 | ||
30 | |||
31 | #define L1GPU_CONTEXT_ATTRIBUTE_FB_SETUP 0x600 | ||
32 | #define L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT 0x601 | ||
33 | #define L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT_SYNC 0x602 | ||
34 | #define L1GPU_CONTEXT_ATTRIBUTE_FB_CLOSE 0x603 | ||
35 | |||
36 | #define L1GPU_FB_BLIT_WAIT_FOR_COMPLETION (1ULL << 32) | ||
37 | |||
38 | #define L1GPU_DISPLAY_SYNC_HSYNC 1 | ||
39 | #define L1GPU_DISPLAY_SYNC_VSYNC 2 | ||
40 | |||
41 | |||
42 | /* mutex synchronizing GPU accesses and video mode changes */ | ||
43 | extern struct mutex ps3_gpu_mutex; | ||
44 | |||
45 | |||
46 | static inline int lv1_gpu_display_sync(u64 context_handle, u64 head, | ||
47 | u64 ddr_offset) | ||
48 | { | ||
49 | return lv1_gpu_context_attribute(context_handle, | ||
50 | L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_SYNC, | ||
51 | head, ddr_offset, 0, 0); | ||
52 | } | ||
53 | |||
54 | static inline int lv1_gpu_display_flip(u64 context_handle, u64 head, | ||
55 | u64 ddr_offset) | ||
56 | { | ||
57 | return lv1_gpu_context_attribute(context_handle, | ||
58 | L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP, | ||
59 | head, ddr_offset, 0, 0); | ||
60 | } | ||
61 | |||
62 | static inline int lv1_gpu_fb_setup(u64 context_handle, u64 xdr_lpar, | ||
63 | u64 xdr_size, u64 ioif_offset) | ||
64 | { | ||
65 | return lv1_gpu_context_attribute(context_handle, | ||
66 | L1GPU_CONTEXT_ATTRIBUTE_FB_SETUP, | ||
67 | xdr_lpar, xdr_size, ioif_offset, 0); | ||
68 | } | ||
69 | |||
70 | static inline int lv1_gpu_fb_blit(u64 context_handle, u64 ddr_offset, | ||
71 | u64 ioif_offset, u64 sync_width, u64 pitch) | ||
72 | { | ||
73 | return lv1_gpu_context_attribute(context_handle, | ||
74 | L1GPU_CONTEXT_ATTRIBUTE_FB_BLIT, | ||
75 | ddr_offset, ioif_offset, sync_width, | ||
76 | pitch); | ||
77 | } | ||
78 | |||
79 | static inline int lv1_gpu_fb_close(u64 context_handle) | ||
80 | { | ||
81 | return lv1_gpu_context_attribute(context_handle, | ||
82 | L1GPU_CONTEXT_ATTRIBUTE_FB_CLOSE, 0, | ||
83 | 0, 0, 0); | ||
84 | } | ||
85 | |||
86 | #endif /* _ASM_POWERPC_PS3GPU_H */ | ||
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h index fb359b0a6937..a3c28e46947c 100644 --- a/arch/powerpc/include/asm/reg.h +++ b/arch/powerpc/include/asm/reg.h | |||
@@ -745,11 +745,11 @@ | |||
745 | asm volatile("mfmsr %0" : "=r" (rval)); rval;}) | 745 | asm volatile("mfmsr %0" : "=r" (rval)); rval;}) |
746 | #ifdef CONFIG_PPC64 | 746 | #ifdef CONFIG_PPC64 |
747 | #define __mtmsrd(v, l) asm volatile("mtmsrd %0," __stringify(l) \ | 747 | #define __mtmsrd(v, l) asm volatile("mtmsrd %0," __stringify(l) \ |
748 | : : "r" (v)) | 748 | : : "r" (v) : "memory") |
749 | #define mtmsrd(v) __mtmsrd((v), 0) | 749 | #define mtmsrd(v) __mtmsrd((v), 0) |
750 | #define mtmsr(v) mtmsrd(v) | 750 | #define mtmsr(v) mtmsrd(v) |
751 | #else | 751 | #else |
752 | #define mtmsr(v) asm volatile("mtmsr %0" : : "r" (v)) | 752 | #define mtmsr(v) asm volatile("mtmsr %0" : : "r" (v) : "memory") |
753 | #endif | 753 | #endif |
754 | 754 | ||
755 | #define mfspr(rn) ({unsigned long rval; \ | 755 | #define mfspr(rn) ({unsigned long rval; \ |
diff --git a/arch/powerpc/include/asm/systbl.h b/arch/powerpc/include/asm/systbl.h index a0b92de51c7e..370600ca2765 100644 --- a/arch/powerpc/include/asm/systbl.h +++ b/arch/powerpc/include/asm/systbl.h | |||
@@ -325,3 +325,4 @@ SYSCALL(inotify_init1) | |||
325 | SYSCALL_SPU(perf_counter_open) | 325 | SYSCALL_SPU(perf_counter_open) |
326 | COMPAT_SYS_SPU(preadv) | 326 | COMPAT_SYS_SPU(preadv) |
327 | COMPAT_SYS_SPU(pwritev) | 327 | COMPAT_SYS_SPU(pwritev) |
328 | COMPAT_SYS(rt_tgsigqueueinfo) | ||
diff --git a/arch/powerpc/include/asm/unistd.h b/arch/powerpc/include/asm/unistd.h index 4badac2d11d1..cef080bfc607 100644 --- a/arch/powerpc/include/asm/unistd.h +++ b/arch/powerpc/include/asm/unistd.h | |||
@@ -344,10 +344,11 @@ | |||
344 | #define __NR_perf_counter_open 319 | 344 | #define __NR_perf_counter_open 319 |
345 | #define __NR_preadv 320 | 345 | #define __NR_preadv 320 |
346 | #define __NR_pwritev 321 | 346 | #define __NR_pwritev 321 |
347 | #define __NR_rt_tgsigqueueinfo 322 | ||
347 | 348 | ||
348 | #ifdef __KERNEL__ | 349 | #ifdef __KERNEL__ |
349 | 350 | ||
350 | #define __NR_syscalls 322 | 351 | #define __NR_syscalls 323 |
351 | 352 | ||
352 | #define __NR__exit __NR_exit | 353 | #define __NR__exit __NR_exit |
353 | #define NR_syscalls __NR_syscalls | 354 | #define NR_syscalls __NR_syscalls |
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index a7def5f90cad..612b0c4dc26d 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile | |||
@@ -125,6 +125,7 @@ PHONY += systbl_chk | |||
125 | systbl_chk: $(src)/systbl_chk.sh $(obj)/systbl_chk.i | 125 | systbl_chk: $(src)/systbl_chk.sh $(obj)/systbl_chk.i |
126 | $(call cmd,systbl_chk) | 126 | $(call cmd,systbl_chk) |
127 | 127 | ||
128 | ifeq ($(CONFIG_PPC_OF_BOOT_TRAMPOLINE),y) | ||
128 | $(obj)/built-in.o: prom_init_check | 129 | $(obj)/built-in.o: prom_init_check |
129 | 130 | ||
130 | quiet_cmd_prom_init_check = CALL $< | 131 | quiet_cmd_prom_init_check = CALL $< |
@@ -133,5 +134,6 @@ quiet_cmd_prom_init_check = CALL $< | |||
133 | PHONY += prom_init_check | 134 | PHONY += prom_init_check |
134 | prom_init_check: $(src)/prom_init_check.sh $(obj)/prom_init.o | 135 | prom_init_check: $(src)/prom_init_check.sh $(obj)/prom_init.o |
135 | $(call cmd,prom_init_check) | 136 | $(call cmd,prom_init_check) |
137 | endif | ||
136 | 138 | ||
137 | clean-files := vmlinux.lds | 139 | clean-files := vmlinux.lds |
diff --git a/arch/powerpc/kernel/init_task.c b/arch/powerpc/kernel/init_task.c index 688b329800bd..ffc4253fef55 100644 --- a/arch/powerpc/kernel/init_task.c +++ b/arch/powerpc/kernel/init_task.c | |||
@@ -9,10 +9,6 @@ | |||
9 | 9 | ||
10 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 10 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
11 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 11 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
12 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
13 | |||
14 | EXPORT_SYMBOL(init_mm); | ||
15 | |||
16 | /* | 12 | /* |
17 | * Initial thread structure. | 13 | * Initial thread structure. |
18 | * | 14 | * |
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index 2f0e64b53642..ef6f64950e9b 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c | |||
@@ -44,10 +44,7 @@ | |||
44 | #include <asm/sections.h> | 44 | #include <asm/sections.h> |
45 | #include <asm/machdep.h> | 45 | #include <asm/machdep.h> |
46 | 46 | ||
47 | #ifdef CONFIG_LOGO_LINUX_CLUT224 | ||
48 | #include <linux/linux_logo.h> | 47 | #include <linux/linux_logo.h> |
49 | extern const struct linux_logo logo_linux_clut224; | ||
50 | #endif | ||
51 | 48 | ||
52 | /* | 49 | /* |
53 | * Properties whose value is longer than this get excluded from our | 50 | * Properties whose value is longer than this get excluded from our |
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index f46548e66045..1f6816003ebe 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
@@ -424,8 +424,8 @@ void __init setup_system(void) | |||
424 | printk("htab_hash_mask = 0x%lx\n", htab_hash_mask); | 424 | printk("htab_hash_mask = 0x%lx\n", htab_hash_mask); |
425 | #endif /* CONFIG_PPC_STD_MMU_64 */ | 425 | #endif /* CONFIG_PPC_STD_MMU_64 */ |
426 | if (PHYSICAL_START > 0) | 426 | if (PHYSICAL_START > 0) |
427 | printk("physical_start = 0x%lx\n", | 427 | printk("physical_start = 0x%llx\n", |
428 | PHYSICAL_START); | 428 | (unsigned long long)PHYSICAL_START); |
429 | printk("-----------------------------------------------------\n"); | 429 | printk("-----------------------------------------------------\n"); |
430 | 430 | ||
431 | DBG(" <- setup_system()\n"); | 431 | DBG(" <- setup_system()\n"); |
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index bee1443da763..15391c2ab013 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
@@ -52,6 +52,7 @@ | |||
52 | #include <linux/jiffies.h> | 52 | #include <linux/jiffies.h> |
53 | #include <linux/posix-timers.h> | 53 | #include <linux/posix-timers.h> |
54 | #include <linux/irq.h> | 54 | #include <linux/irq.h> |
55 | #include <linux/delay.h> | ||
55 | 56 | ||
56 | #include <asm/io.h> | 57 | #include <asm/io.h> |
57 | #include <asm/processor.h> | 58 | #include <asm/processor.h> |
@@ -1143,6 +1144,15 @@ void div128_by_32(u64 dividend_high, u64 dividend_low, | |||
1143 | 1144 | ||
1144 | } | 1145 | } |
1145 | 1146 | ||
1147 | /* We don't need to calibrate delay, we use the CPU timebase for that */ | ||
1148 | void calibrate_delay(void) | ||
1149 | { | ||
1150 | /* Some generic code (such as spinlock debug) use loops_per_jiffy | ||
1151 | * as the number of __delay(1) in a jiffy, so make it so | ||
1152 | */ | ||
1153 | loops_per_jiffy = tb_ticks_per_jiffy; | ||
1154 | } | ||
1155 | |||
1146 | static int __init rtc_init(void) | 1156 | static int __init rtc_init(void) |
1147 | { | 1157 | { |
1148 | struct platform_device *pdev; | 1158 | struct platform_device *pdev; |
diff --git a/arch/powerpc/platforms/cell/axon_msi.c b/arch/powerpc/platforms/cell/axon_msi.c index 0ce45c2b42f8..c71498dbf211 100644 --- a/arch/powerpc/platforms/cell/axon_msi.c +++ b/arch/powerpc/platforms/cell/axon_msi.c | |||
@@ -329,7 +329,7 @@ static struct irq_host_ops msic_host_ops = { | |||
329 | 329 | ||
330 | static int axon_msi_shutdown(struct of_device *device) | 330 | static int axon_msi_shutdown(struct of_device *device) |
331 | { | 331 | { |
332 | struct axon_msic *msic = device->dev.platform_data; | 332 | struct axon_msic *msic = dev_get_drvdata(&device->dev); |
333 | u32 tmp; | 333 | u32 tmp; |
334 | 334 | ||
335 | pr_debug("axon_msi: disabling %s\n", | 335 | pr_debug("axon_msi: disabling %s\n", |
@@ -416,7 +416,7 @@ static int axon_msi_probe(struct of_device *device, | |||
416 | msic->read_offset = dcr_read(msic->dcr_host, MSIC_WRITE_OFFSET_REG) | 416 | msic->read_offset = dcr_read(msic->dcr_host, MSIC_WRITE_OFFSET_REG) |
417 | & MSIC_FIFO_SIZE_MASK; | 417 | & MSIC_FIFO_SIZE_MASK; |
418 | 418 | ||
419 | device->dev.platform_data = msic; | 419 | dev_set_drvdata(&device->dev, msic); |
420 | 420 | ||
421 | ppc_md.setup_msi_irqs = axon_msi_setup_msi_irqs; | 421 | ppc_md.setup_msi_irqs = axon_msi_setup_msi_irqs; |
422 | ppc_md.teardown_msi_irqs = axon_msi_teardown_msi_irqs; | 422 | ppc_md.teardown_msi_irqs = axon_msi_teardown_msi_irqs; |
diff --git a/arch/powerpc/platforms/cell/iommu.c b/arch/powerpc/platforms/cell/iommu.c index bed4690de394..5b34fc211f35 100644 --- a/arch/powerpc/platforms/cell/iommu.c +++ b/arch/powerpc/platforms/cell/iommu.c | |||
@@ -100,16 +100,6 @@ | |||
100 | #define IOSTE_PS_1M 0x0000000000000005ul /* - 1MB */ | 100 | #define IOSTE_PS_1M 0x0000000000000005ul /* - 1MB */ |
101 | #define IOSTE_PS_16M 0x0000000000000007ul /* - 16MB */ | 101 | #define IOSTE_PS_16M 0x0000000000000007ul /* - 16MB */ |
102 | 102 | ||
103 | /* Page table entries */ | ||
104 | #define IOPTE_PP_W 0x8000000000000000ul /* protection: write */ | ||
105 | #define IOPTE_PP_R 0x4000000000000000ul /* protection: read */ | ||
106 | #define IOPTE_M 0x2000000000000000ul /* coherency required */ | ||
107 | #define IOPTE_SO_R 0x1000000000000000ul /* ordering: writes */ | ||
108 | #define IOPTE_SO_RW 0x1800000000000000ul /* ordering: r & w */ | ||
109 | #define IOPTE_RPN_Mask 0x07fffffffffff000ul /* RPN */ | ||
110 | #define IOPTE_H 0x0000000000000800ul /* cache hint */ | ||
111 | #define IOPTE_IOID_Mask 0x00000000000007fful /* ioid */ | ||
112 | |||
113 | 103 | ||
114 | /* IOMMU sizing */ | 104 | /* IOMMU sizing */ |
115 | #define IO_SEGMENT_SHIFT 28 | 105 | #define IO_SEGMENT_SHIFT 28 |
@@ -193,19 +183,21 @@ static int tce_build_cell(struct iommu_table *tbl, long index, long npages, | |||
193 | */ | 183 | */ |
194 | const unsigned long prot = 0xc48; | 184 | const unsigned long prot = 0xc48; |
195 | base_pte = | 185 | base_pte = |
196 | ((prot << (52 + 4 * direction)) & (IOPTE_PP_W | IOPTE_PP_R)) | 186 | ((prot << (52 + 4 * direction)) & |
197 | | IOPTE_M | IOPTE_SO_RW | (window->ioid & IOPTE_IOID_Mask); | 187 | (CBE_IOPTE_PP_W | CBE_IOPTE_PP_R)) | |
188 | CBE_IOPTE_M | CBE_IOPTE_SO_RW | | ||
189 | (window->ioid & CBE_IOPTE_IOID_Mask); | ||
198 | #else | 190 | #else |
199 | base_pte = IOPTE_PP_W | IOPTE_PP_R | IOPTE_M | IOPTE_SO_RW | | 191 | base_pte = CBE_IOPTE_PP_W | CBE_IOPTE_PP_R | CBE_IOPTE_M | |
200 | (window->ioid & IOPTE_IOID_Mask); | 192 | CBE_IOPTE_SO_RW | (window->ioid & CBE_IOPTE_IOID_Mask); |
201 | #endif | 193 | #endif |
202 | if (unlikely(dma_get_attr(DMA_ATTR_WEAK_ORDERING, attrs))) | 194 | if (unlikely(dma_get_attr(DMA_ATTR_WEAK_ORDERING, attrs))) |
203 | base_pte &= ~IOPTE_SO_RW; | 195 | base_pte &= ~CBE_IOPTE_SO_RW; |
204 | 196 | ||
205 | io_pte = (unsigned long *)tbl->it_base + (index - tbl->it_offset); | 197 | io_pte = (unsigned long *)tbl->it_base + (index - tbl->it_offset); |
206 | 198 | ||
207 | for (i = 0; i < npages; i++, uaddr += IOMMU_PAGE_SIZE) | 199 | for (i = 0; i < npages; i++, uaddr += IOMMU_PAGE_SIZE) |
208 | io_pte[i] = base_pte | (__pa(uaddr) & IOPTE_RPN_Mask); | 200 | io_pte[i] = base_pte | (__pa(uaddr) & CBE_IOPTE_RPN_Mask); |
209 | 201 | ||
210 | mb(); | 202 | mb(); |
211 | 203 | ||
@@ -231,8 +223,9 @@ static void tce_free_cell(struct iommu_table *tbl, long index, long npages) | |||
231 | #else | 223 | #else |
232 | /* spider bridge does PCI reads after freeing - insert a mapping | 224 | /* spider bridge does PCI reads after freeing - insert a mapping |
233 | * to a scratch page instead of an invalid entry */ | 225 | * to a scratch page instead of an invalid entry */ |
234 | pte = IOPTE_PP_R | IOPTE_M | IOPTE_SO_RW | __pa(window->iommu->pad_page) | 226 | pte = CBE_IOPTE_PP_R | CBE_IOPTE_M | CBE_IOPTE_SO_RW | |
235 | | (window->ioid & IOPTE_IOID_Mask); | 227 | __pa(window->iommu->pad_page) | |
228 | (window->ioid & CBE_IOPTE_IOID_Mask); | ||
236 | #endif | 229 | #endif |
237 | 230 | ||
238 | io_pte = (unsigned long *)tbl->it_base + (index - tbl->it_offset); | 231 | io_pte = (unsigned long *)tbl->it_base + (index - tbl->it_offset); |
@@ -1001,7 +994,7 @@ static void insert_16M_pte(unsigned long addr, unsigned long *ptab, | |||
1001 | pr_debug("iommu: addr %lx ptab %p segment %lx offset %lx\n", | 994 | pr_debug("iommu: addr %lx ptab %p segment %lx offset %lx\n", |
1002 | addr, ptab, segment, offset); | 995 | addr, ptab, segment, offset); |
1003 | 996 | ||
1004 | ptab[offset] = base_pte | (__pa(addr) & IOPTE_RPN_Mask); | 997 | ptab[offset] = base_pte | (__pa(addr) & CBE_IOPTE_RPN_Mask); |
1005 | } | 998 | } |
1006 | 999 | ||
1007 | static void cell_iommu_setup_fixed_ptab(struct cbe_iommu *iommu, | 1000 | static void cell_iommu_setup_fixed_ptab(struct cbe_iommu *iommu, |
@@ -1016,14 +1009,14 @@ static void cell_iommu_setup_fixed_ptab(struct cbe_iommu *iommu, | |||
1016 | 1009 | ||
1017 | pr_debug("iommu: mapping 0x%lx pages from 0x%lx\n", fsize, fbase); | 1010 | pr_debug("iommu: mapping 0x%lx pages from 0x%lx\n", fsize, fbase); |
1018 | 1011 | ||
1019 | base_pte = IOPTE_PP_W | IOPTE_PP_R | IOPTE_M | 1012 | base_pte = CBE_IOPTE_PP_W | CBE_IOPTE_PP_R | CBE_IOPTE_M | |
1020 | | (cell_iommu_get_ioid(np) & IOPTE_IOID_Mask); | 1013 | (cell_iommu_get_ioid(np) & CBE_IOPTE_IOID_Mask); |
1021 | 1014 | ||
1022 | if (iommu_fixed_is_weak) | 1015 | if (iommu_fixed_is_weak) |
1023 | pr_info("IOMMU: Using weak ordering for fixed mapping\n"); | 1016 | pr_info("IOMMU: Using weak ordering for fixed mapping\n"); |
1024 | else { | 1017 | else { |
1025 | pr_info("IOMMU: Using strong ordering for fixed mapping\n"); | 1018 | pr_info("IOMMU: Using strong ordering for fixed mapping\n"); |
1026 | base_pte |= IOPTE_SO_RW; | 1019 | base_pte |= CBE_IOPTE_SO_RW; |
1027 | } | 1020 | } |
1028 | 1021 | ||
1029 | for (uaddr = 0; uaddr < fsize; uaddr += (1 << 24)) { | 1022 | for (uaddr = 0; uaddr < fsize; uaddr += (1 << 24)) { |
diff --git a/arch/powerpc/platforms/cell/ras.c b/arch/powerpc/platforms/cell/ras.c index 296b5268754e..5e0a191764fc 100644 --- a/arch/powerpc/platforms/cell/ras.c +++ b/arch/powerpc/platforms/cell/ras.c | |||
@@ -122,8 +122,8 @@ static int __init cbe_ptcal_enable_on_node(int nid, int order) | |||
122 | 122 | ||
123 | area->nid = nid; | 123 | area->nid = nid; |
124 | area->order = order; | 124 | area->order = order; |
125 | area->pages = alloc_pages_node(area->nid, GFP_KERNEL | GFP_THISNODE, | 125 | area->pages = alloc_pages_exact_node(area->nid, GFP_KERNEL|GFP_THISNODE, |
126 | area->order); | 126 | area->order); |
127 | 127 | ||
128 | if (!area->pages) { | 128 | if (!area->pages) { |
129 | printk(KERN_WARNING "%s: no page on node %d\n", | 129 | printk(KERN_WARNING "%s: no page on node %d\n", |
diff --git a/arch/powerpc/platforms/cell/spu_base.c b/arch/powerpc/platforms/cell/spu_base.c index 9abd210d87c1..8547e86bfb42 100644 --- a/arch/powerpc/platforms/cell/spu_base.c +++ b/arch/powerpc/platforms/cell/spu_base.c | |||
@@ -752,17 +752,8 @@ static int __init init_spu_base(void) | |||
752 | goto out_unregister_sysdev_class; | 752 | goto out_unregister_sysdev_class; |
753 | } | 753 | } |
754 | 754 | ||
755 | if (ret > 0) { | 755 | if (ret > 0) |
756 | /* | ||
757 | * We cannot put the forward declaration in | ||
758 | * <linux/linux_logo.h> because of conflicting session type | ||
759 | * conflicts for const and __initdata with different compiler | ||
760 | * versions | ||
761 | */ | ||
762 | extern const struct linux_logo logo_spe_clut224; | ||
763 | |||
764 | fb_append_extra_logo(&logo_spe_clut224, ret); | 756 | fb_append_extra_logo(&logo_spe_clut224, ret); |
765 | } | ||
766 | 757 | ||
767 | mutex_lock(&spu_full_list_mutex); | 758 | mutex_lock(&spu_full_list_mutex); |
768 | xmon_register_spus(&spu_full_list); | 759 | xmon_register_spus(&spu_full_list); |
diff --git a/arch/powerpc/platforms/iseries/dt.c b/arch/powerpc/platforms/iseries/dt.c index 4543c4bc3a56..c5a87a72057b 100644 --- a/arch/powerpc/platforms/iseries/dt.c +++ b/arch/powerpc/platforms/iseries/dt.c | |||
@@ -204,7 +204,8 @@ static void __init dt_prop_u32(struct iseries_flat_dt *dt, const char *name, | |||
204 | dt_prop(dt, name, &data, sizeof(u32)); | 204 | dt_prop(dt, name, &data, sizeof(u32)); |
205 | } | 205 | } |
206 | 206 | ||
207 | static void __init dt_prop_u64(struct iseries_flat_dt *dt, const char *name, | 207 | static void __init __maybe_unused dt_prop_u64(struct iseries_flat_dt *dt, |
208 | const char *name, | ||
208 | u64 data) | 209 | u64 data) |
209 | { | 210 | { |
210 | dt_prop(dt, name, &data, sizeof(u64)); | 211 | dt_prop(dt, name, &data, sizeof(u64)); |
diff --git a/arch/powerpc/platforms/iseries/mf.c b/arch/powerpc/platforms/iseries/mf.c index 3689c2413d24..fef4d5150517 100644 --- a/arch/powerpc/platforms/iseries/mf.c +++ b/arch/powerpc/platforms/iseries/mf.c | |||
@@ -267,7 +267,8 @@ static struct pending_event *new_pending_event(void) | |||
267 | return ev; | 267 | return ev; |
268 | } | 268 | } |
269 | 269 | ||
270 | static int signal_vsp_instruction(struct vsp_cmd_data *vsp_cmd) | 270 | static int __maybe_unused |
271 | signal_vsp_instruction(struct vsp_cmd_data *vsp_cmd) | ||
271 | { | 272 | { |
272 | struct pending_event *ev = new_pending_event(); | 273 | struct pending_event *ev = new_pending_event(); |
273 | int rc; | 274 | int rc; |
diff --git a/arch/powerpc/platforms/ps3/mm.c b/arch/powerpc/platforms/ps3/mm.c index 9a2b6d948610..846eb8b57fd1 100644 --- a/arch/powerpc/platforms/ps3/mm.c +++ b/arch/powerpc/platforms/ps3/mm.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/lmb.h> | 24 | #include <linux/lmb.h> |
25 | 25 | ||
26 | #include <asm/firmware.h> | 26 | #include <asm/firmware.h> |
27 | #include <asm/iommu.h> | ||
27 | #include <asm/prom.h> | 28 | #include <asm/prom.h> |
28 | #include <asm/udbg.h> | 29 | #include <asm/udbg.h> |
29 | #include <asm/lv1call.h> | 30 | #include <asm/lv1call.h> |
@@ -605,9 +606,8 @@ static int dma_ioc0_map_pages(struct ps3_dma_region *r, unsigned long phys_addr, | |||
605 | r->ioid, | 606 | r->ioid, |
606 | iopte_flag); | 607 | iopte_flag); |
607 | if (result) { | 608 | if (result) { |
608 | printk(KERN_WARNING "%s:%d: lv1_map_device_dma_region " | 609 | pr_warning("%s:%d: lv1_put_iopte failed: %s\n", |
609 | "failed: %s\n", __func__, __LINE__, | 610 | __func__, __LINE__, ps3_result(result)); |
610 | ps3_result(result)); | ||
611 | goto fail_map; | 611 | goto fail_map; |
612 | } | 612 | } |
613 | DBG("%s: pg=%d bus=%#lx, lpar=%#lx, ioid=%#x\n", __func__, | 613 | DBG("%s: pg=%d bus=%#lx, lpar=%#lx, ioid=%#x\n", __func__, |
@@ -1001,7 +1001,8 @@ static int dma_sb_region_create_linear(struct ps3_dma_region *r) | |||
1001 | if (len > r->len) | 1001 | if (len > r->len) |
1002 | len = r->len; | 1002 | len = r->len; |
1003 | result = dma_sb_map_area(r, virt_addr, len, &tmp, | 1003 | result = dma_sb_map_area(r, virt_addr, len, &tmp, |
1004 | IOPTE_PP_W | IOPTE_PP_R | IOPTE_SO_RW | IOPTE_M); | 1004 | CBE_IOPTE_PP_W | CBE_IOPTE_PP_R | CBE_IOPTE_SO_RW | |
1005 | CBE_IOPTE_M); | ||
1005 | BUG_ON(result); | 1006 | BUG_ON(result); |
1006 | } | 1007 | } |
1007 | 1008 | ||
@@ -1014,7 +1015,8 @@ static int dma_sb_region_create_linear(struct ps3_dma_region *r) | |||
1014 | else | 1015 | else |
1015 | len -= map.rm.size - r->offset; | 1016 | len -= map.rm.size - r->offset; |
1016 | result = dma_sb_map_area(r, virt_addr, len, &tmp, | 1017 | result = dma_sb_map_area(r, virt_addr, len, &tmp, |
1017 | IOPTE_PP_W | IOPTE_PP_R | IOPTE_SO_RW | IOPTE_M); | 1018 | CBE_IOPTE_PP_W | CBE_IOPTE_PP_R | CBE_IOPTE_SO_RW | |
1019 | CBE_IOPTE_M); | ||
1018 | BUG_ON(result); | 1020 | BUG_ON(result); |
1019 | } | 1021 | } |
1020 | 1022 | ||
diff --git a/arch/powerpc/platforms/ps3/os-area.c b/arch/powerpc/platforms/ps3/os-area.c index cf1cd0f8c18f..d6487a9c8019 100644 --- a/arch/powerpc/platforms/ps3/os-area.c +++ b/arch/powerpc/platforms/ps3/os-area.c | |||
@@ -226,6 +226,44 @@ static struct property property_av_multi_out = { | |||
226 | .value = &saved_params.av_multi_out, | 226 | .value = &saved_params.av_multi_out, |
227 | }; | 227 | }; |
228 | 228 | ||
229 | |||
230 | static DEFINE_MUTEX(os_area_flash_mutex); | ||
231 | |||
232 | static const struct ps3_os_area_flash_ops *os_area_flash_ops; | ||
233 | |||
234 | void ps3_os_area_flash_register(const struct ps3_os_area_flash_ops *ops) | ||
235 | { | ||
236 | mutex_lock(&os_area_flash_mutex); | ||
237 | os_area_flash_ops = ops; | ||
238 | mutex_unlock(&os_area_flash_mutex); | ||
239 | } | ||
240 | EXPORT_SYMBOL_GPL(ps3_os_area_flash_register); | ||
241 | |||
242 | static ssize_t os_area_flash_read(void *buf, size_t count, loff_t pos) | ||
243 | { | ||
244 | ssize_t res = -ENODEV; | ||
245 | |||
246 | mutex_lock(&os_area_flash_mutex); | ||
247 | if (os_area_flash_ops) | ||
248 | res = os_area_flash_ops->read(buf, count, pos); | ||
249 | mutex_unlock(&os_area_flash_mutex); | ||
250 | |||
251 | return res; | ||
252 | } | ||
253 | |||
254 | static ssize_t os_area_flash_write(const void *buf, size_t count, loff_t pos) | ||
255 | { | ||
256 | ssize_t res = -ENODEV; | ||
257 | |||
258 | mutex_lock(&os_area_flash_mutex); | ||
259 | if (os_area_flash_ops) | ||
260 | res = os_area_flash_ops->write(buf, count, pos); | ||
261 | mutex_unlock(&os_area_flash_mutex); | ||
262 | |||
263 | return res; | ||
264 | } | ||
265 | |||
266 | |||
229 | /** | 267 | /** |
230 | * os_area_set_property - Add or overwrite a saved_params value to the device tree. | 268 | * os_area_set_property - Add or overwrite a saved_params value to the device tree. |
231 | * | 269 | * |
@@ -352,12 +390,12 @@ static int db_verify(const struct os_area_db *db) | |||
352 | if (memcmp(db->magic_num, OS_AREA_DB_MAGIC_NUM, | 390 | if (memcmp(db->magic_num, OS_AREA_DB_MAGIC_NUM, |
353 | sizeof(db->magic_num))) { | 391 | sizeof(db->magic_num))) { |
354 | pr_debug("%s:%d magic_num failed\n", __func__, __LINE__); | 392 | pr_debug("%s:%d magic_num failed\n", __func__, __LINE__); |
355 | return -1; | 393 | return -EINVAL; |
356 | } | 394 | } |
357 | 395 | ||
358 | if (db->version != 1) { | 396 | if (db->version != 1) { |
359 | pr_debug("%s:%d version failed\n", __func__, __LINE__); | 397 | pr_debug("%s:%d version failed\n", __func__, __LINE__); |
360 | return -1; | 398 | return -EINVAL; |
361 | } | 399 | } |
362 | 400 | ||
363 | return 0; | 401 | return 0; |
@@ -578,59 +616,48 @@ static void os_area_db_init(struct os_area_db *db) | |||
578 | * | 616 | * |
579 | */ | 617 | */ |
580 | 618 | ||
581 | static void __maybe_unused update_flash_db(void) | 619 | static int update_flash_db(void) |
582 | { | 620 | { |
583 | int result; | 621 | const unsigned int buf_len = 8 * OS_AREA_SEGMENT_SIZE; |
584 | int file; | 622 | struct os_area_header *header; |
585 | off_t offset; | ||
586 | ssize_t count; | 623 | ssize_t count; |
587 | static const unsigned int buf_len = 8 * OS_AREA_SEGMENT_SIZE; | 624 | int error; |
588 | const struct os_area_header *header; | 625 | loff_t pos; |
589 | struct os_area_db* db; | 626 | struct os_area_db* db; |
590 | 627 | ||
591 | /* Read in header and db from flash. */ | 628 | /* Read in header and db from flash. */ |
592 | 629 | ||
593 | file = sys_open("/dev/ps3flash", O_RDWR, 0); | ||
594 | |||
595 | if (file < 0) { | ||
596 | pr_debug("%s:%d sys_open failed\n", __func__, __LINE__); | ||
597 | goto fail_open; | ||
598 | } | ||
599 | |||
600 | header = kmalloc(buf_len, GFP_KERNEL); | 630 | header = kmalloc(buf_len, GFP_KERNEL); |
601 | |||
602 | if (!header) { | 631 | if (!header) { |
603 | pr_debug("%s:%d kmalloc failed\n", __func__, __LINE__); | 632 | pr_debug("%s: kmalloc failed\n", __func__); |
604 | goto fail_malloc; | 633 | return -ENOMEM; |
605 | } | 634 | } |
606 | 635 | ||
607 | offset = sys_lseek(file, 0, SEEK_SET); | 636 | count = os_area_flash_read(header, buf_len, 0); |
608 | 637 | if (count < 0) { | |
609 | if (offset != 0) { | 638 | pr_debug("%s: os_area_flash_read failed %zd\n", __func__, |
610 | pr_debug("%s:%d sys_lseek failed\n", __func__, __LINE__); | 639 | count); |
611 | goto fail_header_seek; | 640 | error = count; |
641 | goto fail; | ||
612 | } | 642 | } |
613 | 643 | ||
614 | count = sys_read(file, (char __user *)header, buf_len); | 644 | pos = header->db_area_offset * OS_AREA_SEGMENT_SIZE; |
615 | 645 | if (count < OS_AREA_SEGMENT_SIZE || verify_header(header) || | |
616 | result = count < OS_AREA_SEGMENT_SIZE || verify_header(header) | 646 | count < pos) { |
617 | || count < header->db_area_offset * OS_AREA_SEGMENT_SIZE; | 647 | pr_debug("%s: verify_header failed\n", __func__); |
618 | |||
619 | if (result) { | ||
620 | pr_debug("%s:%d verify_header failed\n", __func__, __LINE__); | ||
621 | dump_header(header); | 648 | dump_header(header); |
622 | goto fail_header; | 649 | error = -EINVAL; |
650 | goto fail; | ||
623 | } | 651 | } |
624 | 652 | ||
625 | /* Now got a good db offset and some maybe good db data. */ | 653 | /* Now got a good db offset and some maybe good db data. */ |
626 | 654 | ||
627 | db = (void*)header + header->db_area_offset * OS_AREA_SEGMENT_SIZE; | 655 | db = (void *)header + pos; |
628 | 656 | ||
629 | result = db_verify(db); | 657 | error = db_verify(db); |
630 | 658 | if (error) { | |
631 | if (result) { | 659 | pr_notice("%s: Verify of flash database failed, formatting.\n", |
632 | printk(KERN_NOTICE "%s:%d: Verify of flash database failed, " | 660 | __func__); |
633 | "formatting.\n", __func__, __LINE__); | ||
634 | dump_db(db); | 661 | dump_db(db); |
635 | os_area_db_init(db); | 662 | os_area_db_init(db); |
636 | } | 663 | } |
@@ -639,29 +666,16 @@ static void __maybe_unused update_flash_db(void) | |||
639 | 666 | ||
640 | db_set_64(db, &os_area_db_id_rtc_diff, saved_params.rtc_diff); | 667 | db_set_64(db, &os_area_db_id_rtc_diff, saved_params.rtc_diff); |
641 | 668 | ||
642 | offset = sys_lseek(file, header->db_area_offset * OS_AREA_SEGMENT_SIZE, | 669 | count = os_area_flash_write(db, sizeof(struct os_area_db), pos); |
643 | SEEK_SET); | ||
644 | |||
645 | if (offset != header->db_area_offset * OS_AREA_SEGMENT_SIZE) { | ||
646 | pr_debug("%s:%d sys_lseek failed\n", __func__, __LINE__); | ||
647 | goto fail_db_seek; | ||
648 | } | ||
649 | |||
650 | count = sys_write(file, (const char __user *)db, | ||
651 | sizeof(struct os_area_db)); | ||
652 | |||
653 | if (count < sizeof(struct os_area_db)) { | 670 | if (count < sizeof(struct os_area_db)) { |
654 | pr_debug("%s:%d sys_write failed\n", __func__, __LINE__); | 671 | pr_debug("%s: os_area_flash_write failed %zd\n", __func__, |
672 | count); | ||
673 | error = count < 0 ? count : -EIO; | ||
655 | } | 674 | } |
656 | 675 | ||
657 | fail_db_seek: | 676 | fail: |
658 | fail_header: | ||
659 | fail_header_seek: | ||
660 | kfree(header); | 677 | kfree(header); |
661 | fail_malloc: | 678 | return error; |
662 | sys_close(file); | ||
663 | fail_open: | ||
664 | return; | ||
665 | } | 679 | } |
666 | 680 | ||
667 | /** | 681 | /** |
@@ -674,11 +688,11 @@ fail_open: | |||
674 | static void os_area_queue_work_handler(struct work_struct *work) | 688 | static void os_area_queue_work_handler(struct work_struct *work) |
675 | { | 689 | { |
676 | struct device_node *node; | 690 | struct device_node *node; |
691 | int error; | ||
677 | 692 | ||
678 | pr_debug(" -> %s:%d\n", __func__, __LINE__); | 693 | pr_debug(" -> %s:%d\n", __func__, __LINE__); |
679 | 694 | ||
680 | node = of_find_node_by_path("/"); | 695 | node = of_find_node_by_path("/"); |
681 | |||
682 | if (node) { | 696 | if (node) { |
683 | os_area_set_property(node, &property_rtc_diff); | 697 | os_area_set_property(node, &property_rtc_diff); |
684 | of_node_put(node); | 698 | of_node_put(node); |
@@ -686,12 +700,10 @@ static void os_area_queue_work_handler(struct work_struct *work) | |||
686 | pr_debug("%s:%d of_find_node_by_path failed\n", | 700 | pr_debug("%s:%d of_find_node_by_path failed\n", |
687 | __func__, __LINE__); | 701 | __func__, __LINE__); |
688 | 702 | ||
689 | #if defined(CONFIG_PS3_FLASH) || defined(CONFIG_PS3_FLASH_MODULE) | 703 | error = update_flash_db(); |
690 | update_flash_db(); | 704 | if (error) |
691 | #else | 705 | pr_warning("%s: Could not update FLASH ROM\n", __func__); |
692 | printk(KERN_WARNING "%s:%d: No flash rom driver configured.\n", | 706 | |
693 | __func__, __LINE__); | ||
694 | #endif | ||
695 | pr_debug(" <- %s:%d\n", __func__, __LINE__); | 707 | pr_debug(" <- %s:%d\n", __func__, __LINE__); |
696 | } | 708 | } |
697 | 709 | ||
@@ -808,7 +820,7 @@ u64 ps3_os_area_get_rtc_diff(void) | |||
808 | { | 820 | { |
809 | return saved_params.rtc_diff; | 821 | return saved_params.rtc_diff; |
810 | } | 822 | } |
811 | EXPORT_SYMBOL(ps3_os_area_get_rtc_diff); | 823 | EXPORT_SYMBOL_GPL(ps3_os_area_get_rtc_diff); |
812 | 824 | ||
813 | /** | 825 | /** |
814 | * ps3_os_area_set_rtc_diff - Set the rtc diff value. | 826 | * ps3_os_area_set_rtc_diff - Set the rtc diff value. |
@@ -824,7 +836,7 @@ void ps3_os_area_set_rtc_diff(u64 rtc_diff) | |||
824 | os_area_queue_work(); | 836 | os_area_queue_work(); |
825 | } | 837 | } |
826 | } | 838 | } |
827 | EXPORT_SYMBOL(ps3_os_area_set_rtc_diff); | 839 | EXPORT_SYMBOL_GPL(ps3_os_area_set_rtc_diff); |
828 | 840 | ||
829 | /** | 841 | /** |
830 | * ps3_os_area_get_av_multi_out - Returns the default video mode. | 842 | * ps3_os_area_get_av_multi_out - Returns the default video mode. |
diff --git a/arch/powerpc/platforms/ps3/platform.h b/arch/powerpc/platforms/ps3/platform.h index 136aa0637d9c..9a196a88eda7 100644 --- a/arch/powerpc/platforms/ps3/platform.h +++ b/arch/powerpc/platforms/ps3/platform.h | |||
@@ -232,14 +232,4 @@ int ps3_repository_read_spu_resource_id(unsigned int res_index, | |||
232 | int ps3_repository_read_vuart_av_port(unsigned int *port); | 232 | int ps3_repository_read_vuart_av_port(unsigned int *port); |
233 | int ps3_repository_read_vuart_sysmgr_port(unsigned int *port); | 233 | int ps3_repository_read_vuart_sysmgr_port(unsigned int *port); |
234 | 234 | ||
235 | /* Page table entries */ | ||
236 | #define IOPTE_PP_W 0x8000000000000000ul /* protection: write */ | ||
237 | #define IOPTE_PP_R 0x4000000000000000ul /* protection: read */ | ||
238 | #define IOPTE_M 0x2000000000000000ul /* coherency required */ | ||
239 | #define IOPTE_SO_R 0x1000000000000000ul /* ordering: writes */ | ||
240 | #define IOPTE_SO_RW 0x1800000000000000ul /* ordering: r & w */ | ||
241 | #define IOPTE_RPN_Mask 0x07fffffffffff000ul /* RPN */ | ||
242 | #define IOPTE_H 0x0000000000000800ul /* cache hint */ | ||
243 | #define IOPTE_IOID_Mask 0x00000000000007fful /* ioid */ | ||
244 | |||
245 | #endif | 235 | #endif |
diff --git a/arch/powerpc/platforms/ps3/setup.c b/arch/powerpc/platforms/ps3/setup.c index 1a7b5ae0c83e..149bea2ce583 100644 --- a/arch/powerpc/platforms/ps3/setup.c +++ b/arch/powerpc/platforms/ps3/setup.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <asm/udbg.h> | 32 | #include <asm/udbg.h> |
33 | #include <asm/prom.h> | 33 | #include <asm/prom.h> |
34 | #include <asm/lv1call.h> | 34 | #include <asm/lv1call.h> |
35 | #include <asm/ps3gpu.h> | ||
35 | 36 | ||
36 | #include "platform.h" | 37 | #include "platform.h" |
37 | 38 | ||
diff --git a/arch/powerpc/platforms/ps3/system-bus.c b/arch/powerpc/platforms/ps3/system-bus.c index 9a73d0238639..9fead0faf38b 100644 --- a/arch/powerpc/platforms/ps3/system-bus.c +++ b/arch/powerpc/platforms/ps3/system-bus.c | |||
@@ -27,6 +27,7 @@ | |||
27 | #include <asm/udbg.h> | 27 | #include <asm/udbg.h> |
28 | #include <asm/lv1call.h> | 28 | #include <asm/lv1call.h> |
29 | #include <asm/firmware.h> | 29 | #include <asm/firmware.h> |
30 | #include <asm/iommu.h> | ||
30 | 31 | ||
31 | #include "platform.h" | 32 | #include "platform.h" |
32 | 33 | ||
@@ -531,7 +532,8 @@ static void * ps3_alloc_coherent(struct device *_dev, size_t size, | |||
531 | } | 532 | } |
532 | 533 | ||
533 | result = ps3_dma_map(dev->d_region, virt_addr, size, dma_handle, | 534 | result = ps3_dma_map(dev->d_region, virt_addr, size, dma_handle, |
534 | IOPTE_PP_W | IOPTE_PP_R | IOPTE_SO_RW | IOPTE_M); | 535 | CBE_IOPTE_PP_W | CBE_IOPTE_PP_R | |
536 | CBE_IOPTE_SO_RW | CBE_IOPTE_M); | ||
535 | 537 | ||
536 | if (result) { | 538 | if (result) { |
537 | pr_debug("%s:%d: ps3_dma_map failed (%d)\n", | 539 | pr_debug("%s:%d: ps3_dma_map failed (%d)\n", |
@@ -575,7 +577,8 @@ static dma_addr_t ps3_sb_map_page(struct device *_dev, struct page *page, | |||
575 | 577 | ||
576 | result = ps3_dma_map(dev->d_region, (unsigned long)ptr, size, | 578 | result = ps3_dma_map(dev->d_region, (unsigned long)ptr, size, |
577 | &bus_addr, | 579 | &bus_addr, |
578 | IOPTE_PP_R | IOPTE_PP_W | IOPTE_SO_RW | IOPTE_M); | 580 | CBE_IOPTE_PP_R | CBE_IOPTE_PP_W | |
581 | CBE_IOPTE_SO_RW | CBE_IOPTE_M); | ||
579 | 582 | ||
580 | if (result) { | 583 | if (result) { |
581 | pr_debug("%s:%d: ps3_dma_map failed (%d)\n", | 584 | pr_debug("%s:%d: ps3_dma_map failed (%d)\n", |
@@ -596,16 +599,16 @@ static dma_addr_t ps3_ioc0_map_page(struct device *_dev, struct page *page, | |||
596 | u64 iopte_flag; | 599 | u64 iopte_flag; |
597 | void *ptr = page_address(page) + offset; | 600 | void *ptr = page_address(page) + offset; |
598 | 601 | ||
599 | iopte_flag = IOPTE_M; | 602 | iopte_flag = CBE_IOPTE_M; |
600 | switch (direction) { | 603 | switch (direction) { |
601 | case DMA_BIDIRECTIONAL: | 604 | case DMA_BIDIRECTIONAL: |
602 | iopte_flag |= IOPTE_PP_R | IOPTE_PP_W | IOPTE_SO_RW; | 605 | iopte_flag |= CBE_IOPTE_PP_R | CBE_IOPTE_PP_W | CBE_IOPTE_SO_RW; |
603 | break; | 606 | break; |
604 | case DMA_TO_DEVICE: | 607 | case DMA_TO_DEVICE: |
605 | iopte_flag |= IOPTE_PP_R | IOPTE_SO_R; | 608 | iopte_flag |= CBE_IOPTE_PP_R | CBE_IOPTE_SO_R; |
606 | break; | 609 | break; |
607 | case DMA_FROM_DEVICE: | 610 | case DMA_FROM_DEVICE: |
608 | iopte_flag |= IOPTE_PP_W | IOPTE_SO_RW; | 611 | iopte_flag |= CBE_IOPTE_PP_W | CBE_IOPTE_SO_RW; |
609 | break; | 612 | break; |
610 | default: | 613 | default: |
611 | /* not happned */ | 614 | /* not happned */ |
diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig index 99dc3ded6b49..a14dba0e4d67 100644 --- a/arch/s390/Kconfig +++ b/arch/s390/Kconfig | |||
@@ -348,6 +348,9 @@ config ARCH_ENABLE_MEMORY_HOTPLUG | |||
348 | config ARCH_ENABLE_MEMORY_HOTREMOVE | 348 | config ARCH_ENABLE_MEMORY_HOTREMOVE |
349 | def_bool y | 349 | def_bool y |
350 | 350 | ||
351 | config ARCH_HIBERNATION_POSSIBLE | ||
352 | def_bool y if 64BIT | ||
353 | |||
351 | source "mm/Kconfig" | 354 | source "mm/Kconfig" |
352 | 355 | ||
353 | comment "I/O subsystem configuration" | 356 | comment "I/O subsystem configuration" |
@@ -592,6 +595,12 @@ config SECCOMP | |||
592 | 595 | ||
593 | endmenu | 596 | endmenu |
594 | 597 | ||
598 | menu "Power Management" | ||
599 | |||
600 | source "kernel/power/Kconfig" | ||
601 | |||
602 | endmenu | ||
603 | |||
595 | source "net/Kconfig" | 604 | source "net/Kconfig" |
596 | 605 | ||
597 | config PCMCIA | 606 | config PCMCIA |
diff --git a/arch/s390/Makefile b/arch/s390/Makefile index 578c61f15a4b..0ff387cebf88 100644 --- a/arch/s390/Makefile +++ b/arch/s390/Makefile | |||
@@ -88,7 +88,9 @@ LDFLAGS_vmlinux := -e start | |||
88 | head-y := arch/s390/kernel/head.o arch/s390/kernel/init_task.o | 88 | head-y := arch/s390/kernel/head.o arch/s390/kernel/init_task.o |
89 | 89 | ||
90 | core-y += arch/s390/mm/ arch/s390/kernel/ arch/s390/crypto/ \ | 90 | core-y += arch/s390/mm/ arch/s390/kernel/ arch/s390/crypto/ \ |
91 | arch/s390/appldata/ arch/s390/hypfs/ arch/s390/kvm/ | 91 | arch/s390/appldata/ arch/s390/hypfs/ arch/s390/kvm/ \ |
92 | arch/s390/power/ | ||
93 | |||
92 | libs-y += arch/s390/lib/ | 94 | libs-y += arch/s390/lib/ |
93 | drivers-y += drivers/s390/ | 95 | drivers-y += drivers/s390/ |
94 | drivers-$(CONFIG_MATHEMU) += arch/s390/math-emu/ | 96 | drivers-$(CONFIG_MATHEMU) += arch/s390/math-emu/ |
diff --git a/arch/s390/appldata/appldata_base.c b/arch/s390/appldata/appldata_base.c index 1dfc7100c7ee..264528e4f58d 100644 --- a/arch/s390/appldata/appldata_base.c +++ b/arch/s390/appldata/appldata_base.c | |||
@@ -5,7 +5,7 @@ | |||
5 | * Exports appldata_register_ops() and appldata_unregister_ops() for the | 5 | * Exports appldata_register_ops() and appldata_unregister_ops() for the |
6 | * data gathering modules. | 6 | * data gathering modules. |
7 | * | 7 | * |
8 | * Copyright IBM Corp. 2003, 2008 | 8 | * Copyright IBM Corp. 2003, 2009 |
9 | * | 9 | * |
10 | * Author: Gerald Schaefer <gerald.schaefer@de.ibm.com> | 10 | * Author: Gerald Schaefer <gerald.schaefer@de.ibm.com> |
11 | */ | 11 | */ |
@@ -26,6 +26,8 @@ | |||
26 | #include <linux/notifier.h> | 26 | #include <linux/notifier.h> |
27 | #include <linux/cpu.h> | 27 | #include <linux/cpu.h> |
28 | #include <linux/workqueue.h> | 28 | #include <linux/workqueue.h> |
29 | #include <linux/suspend.h> | ||
30 | #include <linux/platform_device.h> | ||
29 | #include <asm/appldata.h> | 31 | #include <asm/appldata.h> |
30 | #include <asm/timer.h> | 32 | #include <asm/timer.h> |
31 | #include <asm/uaccess.h> | 33 | #include <asm/uaccess.h> |
@@ -41,6 +43,9 @@ | |||
41 | 43 | ||
42 | #define TOD_MICRO 0x01000 /* nr. of TOD clock units | 44 | #define TOD_MICRO 0x01000 /* nr. of TOD clock units |
43 | for 1 microsecond */ | 45 | for 1 microsecond */ |
46 | |||
47 | static struct platform_device *appldata_pdev; | ||
48 | |||
44 | /* | 49 | /* |
45 | * /proc entries (sysctl) | 50 | * /proc entries (sysctl) |
46 | */ | 51 | */ |
@@ -86,6 +91,7 @@ static atomic_t appldata_expire_count = ATOMIC_INIT(0); | |||
86 | static DEFINE_SPINLOCK(appldata_timer_lock); | 91 | static DEFINE_SPINLOCK(appldata_timer_lock); |
87 | static int appldata_interval = APPLDATA_CPU_INTERVAL; | 92 | static int appldata_interval = APPLDATA_CPU_INTERVAL; |
88 | static int appldata_timer_active; | 93 | static int appldata_timer_active; |
94 | static int appldata_timer_suspended = 0; | ||
89 | 95 | ||
90 | /* | 96 | /* |
91 | * Work queue | 97 | * Work queue |
@@ -475,6 +481,93 @@ void appldata_unregister_ops(struct appldata_ops *ops) | |||
475 | /********************** module-ops management <END> **************************/ | 481 | /********************** module-ops management <END> **************************/ |
476 | 482 | ||
477 | 483 | ||
484 | /**************************** suspend / resume *******************************/ | ||
485 | static int appldata_freeze(struct device *dev) | ||
486 | { | ||
487 | struct appldata_ops *ops; | ||
488 | int rc; | ||
489 | struct list_head *lh; | ||
490 | |||
491 | get_online_cpus(); | ||
492 | spin_lock(&appldata_timer_lock); | ||
493 | if (appldata_timer_active) { | ||
494 | __appldata_vtimer_setup(APPLDATA_DEL_TIMER); | ||
495 | appldata_timer_suspended = 1; | ||
496 | } | ||
497 | spin_unlock(&appldata_timer_lock); | ||
498 | put_online_cpus(); | ||
499 | |||
500 | mutex_lock(&appldata_ops_mutex); | ||
501 | list_for_each(lh, &appldata_ops_list) { | ||
502 | ops = list_entry(lh, struct appldata_ops, list); | ||
503 | if (ops->active == 1) { | ||
504 | rc = appldata_diag(ops->record_nr, APPLDATA_STOP_REC, | ||
505 | (unsigned long) ops->data, ops->size, | ||
506 | ops->mod_lvl); | ||
507 | if (rc != 0) | ||
508 | pr_err("Stopping the data collection for %s " | ||
509 | "failed with rc=%d\n", ops->name, rc); | ||
510 | } | ||
511 | } | ||
512 | mutex_unlock(&appldata_ops_mutex); | ||
513 | return 0; | ||
514 | } | ||
515 | |||
516 | static int appldata_restore(struct device *dev) | ||
517 | { | ||
518 | struct appldata_ops *ops; | ||
519 | int rc; | ||
520 | struct list_head *lh; | ||
521 | |||
522 | get_online_cpus(); | ||
523 | spin_lock(&appldata_timer_lock); | ||
524 | if (appldata_timer_suspended) { | ||
525 | __appldata_vtimer_setup(APPLDATA_ADD_TIMER); | ||
526 | appldata_timer_suspended = 0; | ||
527 | } | ||
528 | spin_unlock(&appldata_timer_lock); | ||
529 | put_online_cpus(); | ||
530 | |||
531 | mutex_lock(&appldata_ops_mutex); | ||
532 | list_for_each(lh, &appldata_ops_list) { | ||
533 | ops = list_entry(lh, struct appldata_ops, list); | ||
534 | if (ops->active == 1) { | ||
535 | ops->callback(ops->data); // init record | ||
536 | rc = appldata_diag(ops->record_nr, | ||
537 | APPLDATA_START_INTERVAL_REC, | ||
538 | (unsigned long) ops->data, ops->size, | ||
539 | ops->mod_lvl); | ||
540 | if (rc != 0) { | ||
541 | pr_err("Starting the data collection for %s " | ||
542 | "failed with rc=%d\n", ops->name, rc); | ||
543 | } | ||
544 | } | ||
545 | } | ||
546 | mutex_unlock(&appldata_ops_mutex); | ||
547 | return 0; | ||
548 | } | ||
549 | |||
550 | static int appldata_thaw(struct device *dev) | ||
551 | { | ||
552 | return appldata_restore(dev); | ||
553 | } | ||
554 | |||
555 | static struct dev_pm_ops appldata_pm_ops = { | ||
556 | .freeze = appldata_freeze, | ||
557 | .thaw = appldata_thaw, | ||
558 | .restore = appldata_restore, | ||
559 | }; | ||
560 | |||
561 | static struct platform_driver appldata_pdrv = { | ||
562 | .driver = { | ||
563 | .name = "appldata", | ||
564 | .owner = THIS_MODULE, | ||
565 | .pm = &appldata_pm_ops, | ||
566 | }, | ||
567 | }; | ||
568 | /************************* suspend / resume <END> ****************************/ | ||
569 | |||
570 | |||
478 | /******************************* init / exit *********************************/ | 571 | /******************************* init / exit *********************************/ |
479 | 572 | ||
480 | static void __cpuinit appldata_online_cpu(int cpu) | 573 | static void __cpuinit appldata_online_cpu(int cpu) |
@@ -531,11 +624,23 @@ static struct notifier_block __cpuinitdata appldata_nb = { | |||
531 | */ | 624 | */ |
532 | static int __init appldata_init(void) | 625 | static int __init appldata_init(void) |
533 | { | 626 | { |
534 | int i; | 627 | int i, rc; |
628 | |||
629 | rc = platform_driver_register(&appldata_pdrv); | ||
630 | if (rc) | ||
631 | return rc; | ||
535 | 632 | ||
633 | appldata_pdev = platform_device_register_simple("appldata", -1, NULL, | ||
634 | 0); | ||
635 | if (IS_ERR(appldata_pdev)) { | ||
636 | rc = PTR_ERR(appldata_pdev); | ||
637 | goto out_driver; | ||
638 | } | ||
536 | appldata_wq = create_singlethread_workqueue("appldata"); | 639 | appldata_wq = create_singlethread_workqueue("appldata"); |
537 | if (!appldata_wq) | 640 | if (!appldata_wq) { |
538 | return -ENOMEM; | 641 | rc = -ENOMEM; |
642 | goto out_device; | ||
643 | } | ||
539 | 644 | ||
540 | get_online_cpus(); | 645 | get_online_cpus(); |
541 | for_each_online_cpu(i) | 646 | for_each_online_cpu(i) |
@@ -547,6 +652,12 @@ static int __init appldata_init(void) | |||
547 | 652 | ||
548 | appldata_sysctl_header = register_sysctl_table(appldata_dir_table); | 653 | appldata_sysctl_header = register_sysctl_table(appldata_dir_table); |
549 | return 0; | 654 | return 0; |
655 | |||
656 | out_device: | ||
657 | platform_device_unregister(appldata_pdev); | ||
658 | out_driver: | ||
659 | platform_driver_unregister(&appldata_pdrv); | ||
660 | return rc; | ||
550 | } | 661 | } |
551 | 662 | ||
552 | __initcall(appldata_init); | 663 | __initcall(appldata_init); |
diff --git a/arch/s390/include/asm/ccwdev.h b/arch/s390/include/asm/ccwdev.h index ba007d8df941..2a5419551176 100644 --- a/arch/s390/include/asm/ccwdev.h +++ b/arch/s390/include/asm/ccwdev.h | |||
@@ -1,11 +1,9 @@ | |||
1 | /* | 1 | /* |
2 | * include/asm-s390/ccwdev.h | 2 | * Copyright IBM Corp. 2002, 2009 |
3 | * include/asm-s390x/ccwdev.h | ||
4 | * | 3 | * |
5 | * Copyright (C) 2002 IBM Deutschland Entwicklung GmbH, IBM Corporation | 4 | * Author(s): Arnd Bergmann <arndb@de.ibm.com> |
6 | * Author(s): Arnd Bergmann <arndb@de.ibm.com> | ||
7 | * | 5 | * |
8 | * Interface for CCW device drivers | 6 | * Interface for CCW device drivers |
9 | */ | 7 | */ |
10 | #ifndef _S390_CCWDEV_H_ | 8 | #ifndef _S390_CCWDEV_H_ |
11 | #define _S390_CCWDEV_H_ | 9 | #define _S390_CCWDEV_H_ |
@@ -104,6 +102,11 @@ struct ccw_device { | |||
104 | * @set_offline: called when setting device offline | 102 | * @set_offline: called when setting device offline |
105 | * @notify: notify driver of device state changes | 103 | * @notify: notify driver of device state changes |
106 | * @shutdown: called at device shutdown | 104 | * @shutdown: called at device shutdown |
105 | * @prepare: prepare for pm state transition | ||
106 | * @complete: undo work done in @prepare | ||
107 | * @freeze: callback for freezing during hibernation snapshotting | ||
108 | * @thaw: undo work done in @freeze | ||
109 | * @restore: callback for restoring after hibernation | ||
107 | * @driver: embedded device driver structure | 110 | * @driver: embedded device driver structure |
108 | * @name: device driver name | 111 | * @name: device driver name |
109 | */ | 112 | */ |
@@ -116,6 +119,11 @@ struct ccw_driver { | |||
116 | int (*set_offline) (struct ccw_device *); | 119 | int (*set_offline) (struct ccw_device *); |
117 | int (*notify) (struct ccw_device *, int); | 120 | int (*notify) (struct ccw_device *, int); |
118 | void (*shutdown) (struct ccw_device *); | 121 | void (*shutdown) (struct ccw_device *); |
122 | int (*prepare) (struct ccw_device *); | ||
123 | void (*complete) (struct ccw_device *); | ||
124 | int (*freeze)(struct ccw_device *); | ||
125 | int (*thaw) (struct ccw_device *); | ||
126 | int (*restore)(struct ccw_device *); | ||
119 | struct device_driver driver; | 127 | struct device_driver driver; |
120 | char *name; | 128 | char *name; |
121 | }; | 129 | }; |
@@ -184,6 +192,7 @@ extern void ccw_device_get_id(struct ccw_device *, struct ccw_dev_id *); | |||
184 | #define to_ccwdrv(n) container_of(n, struct ccw_driver, driver) | 192 | #define to_ccwdrv(n) container_of(n, struct ccw_driver, driver) |
185 | 193 | ||
186 | extern struct ccw_device *ccw_device_probe_console(void); | 194 | extern struct ccw_device *ccw_device_probe_console(void); |
195 | extern int ccw_device_force_console(void); | ||
187 | 196 | ||
188 | // FIXME: these have to go | 197 | // FIXME: these have to go |
189 | extern int _ccw_device_get_subchannel_number(struct ccw_device *); | 198 | extern int _ccw_device_get_subchannel_number(struct ccw_device *); |
diff --git a/arch/s390/include/asm/ccwgroup.h b/arch/s390/include/asm/ccwgroup.h index a27f68985a79..c79c1e787b86 100644 --- a/arch/s390/include/asm/ccwgroup.h +++ b/arch/s390/include/asm/ccwgroup.h | |||
@@ -38,6 +38,11 @@ struct ccwgroup_device { | |||
38 | * @set_online: function called when device is set online | 38 | * @set_online: function called when device is set online |
39 | * @set_offline: function called when device is set offline | 39 | * @set_offline: function called when device is set offline |
40 | * @shutdown: function called when device is shut down | 40 | * @shutdown: function called when device is shut down |
41 | * @prepare: prepare for pm state transition | ||
42 | * @complete: undo work done in @prepare | ||
43 | * @freeze: callback for freezing during hibernation snapshotting | ||
44 | * @thaw: undo work done in @freeze | ||
45 | * @restore: callback for restoring after hibernation | ||
41 | * @driver: embedded driver structure | 46 | * @driver: embedded driver structure |
42 | */ | 47 | */ |
43 | struct ccwgroup_driver { | 48 | struct ccwgroup_driver { |
@@ -51,6 +56,11 @@ struct ccwgroup_driver { | |||
51 | int (*set_online) (struct ccwgroup_device *); | 56 | int (*set_online) (struct ccwgroup_device *); |
52 | int (*set_offline) (struct ccwgroup_device *); | 57 | int (*set_offline) (struct ccwgroup_device *); |
53 | void (*shutdown)(struct ccwgroup_device *); | 58 | void (*shutdown)(struct ccwgroup_device *); |
59 | int (*prepare) (struct ccwgroup_device *); | ||
60 | void (*complete) (struct ccwgroup_device *); | ||
61 | int (*freeze)(struct ccwgroup_device *); | ||
62 | int (*thaw) (struct ccwgroup_device *); | ||
63 | int (*restore)(struct ccwgroup_device *); | ||
54 | 64 | ||
55 | struct device_driver driver; | 65 | struct device_driver driver; |
56 | }; | 66 | }; |
diff --git a/arch/s390/include/asm/kmap_types.h b/arch/s390/include/asm/kmap_types.h index fd1574648223..94ec3ee07983 100644 --- a/arch/s390/include/asm/kmap_types.h +++ b/arch/s390/include/asm/kmap_types.h | |||
@@ -2,22 +2,7 @@ | |||
2 | #ifndef _ASM_KMAP_TYPES_H | 2 | #ifndef _ASM_KMAP_TYPES_H |
3 | #define _ASM_KMAP_TYPES_H | 3 | #define _ASM_KMAP_TYPES_H |
4 | 4 | ||
5 | enum km_type { | 5 | #include <asm-generic/kmap_types.h> |
6 | KM_BOUNCE_READ, | ||
7 | KM_SKB_SUNRPC_DATA, | ||
8 | KM_SKB_DATA_SOFTIRQ, | ||
9 | KM_USER0, | ||
10 | KM_USER1, | ||
11 | KM_BIO_SRC_IRQ, | ||
12 | KM_BIO_DST_IRQ, | ||
13 | KM_PTE0, | ||
14 | KM_PTE1, | ||
15 | KM_IRQ0, | ||
16 | KM_IRQ1, | ||
17 | KM_SOFTIRQ0, | ||
18 | KM_SOFTIRQ1, | ||
19 | KM_TYPE_NR | ||
20 | }; | ||
21 | 6 | ||
22 | #endif | 7 | #endif |
23 | #endif /* __KERNEL__ */ | 8 | #endif /* __KERNEL__ */ |
diff --git a/arch/s390/include/asm/suspend.h b/arch/s390/include/asm/suspend.h new file mode 100644 index 000000000000..dc75c616eafe --- /dev/null +++ b/arch/s390/include/asm/suspend.h | |||
@@ -0,0 +1,10 @@ | |||
1 | #ifndef __ASM_S390_SUSPEND_H | ||
2 | #define __ASM_S390_SUSPEND_H | ||
3 | |||
4 | static inline int arch_prepare_suspend(void) | ||
5 | { | ||
6 | return 0; | ||
7 | } | ||
8 | |||
9 | #endif | ||
10 | |||
diff --git a/arch/s390/include/asm/system.h b/arch/s390/include/asm/system.h index 3a8b26eb1f2e..4fb83c1cdb77 100644 --- a/arch/s390/include/asm/system.h +++ b/arch/s390/include/asm/system.h | |||
@@ -1,11 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * include/asm-s390/system.h | 2 | * Copyright IBM Corp. 1999, 2009 |
3 | * | 3 | * |
4 | * S390 version | 4 | * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com> |
5 | * Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation | ||
6 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), | ||
7 | * | ||
8 | * Derived from "include/asm-i386/system.h" | ||
9 | */ | 5 | */ |
10 | 6 | ||
11 | #ifndef __ASM_SYSTEM_H | 7 | #ifndef __ASM_SYSTEM_H |
@@ -469,6 +465,20 @@ extern psw_t sysc_restore_trace_psw; | |||
469 | extern psw_t io_restore_trace_psw; | 465 | extern psw_t io_restore_trace_psw; |
470 | #endif | 466 | #endif |
471 | 467 | ||
468 | static inline int tprot(unsigned long addr) | ||
469 | { | ||
470 | int rc = -EFAULT; | ||
471 | |||
472 | asm volatile( | ||
473 | " tprot 0(%1),0\n" | ||
474 | "0: ipm %0\n" | ||
475 | " srl %0,28\n" | ||
476 | "1:\n" | ||
477 | EX_TABLE(0b,1b) | ||
478 | : "+d" (rc) : "a" (addr) : "cc"); | ||
479 | return rc; | ||
480 | } | ||
481 | |||
472 | #endif /* __KERNEL__ */ | 482 | #endif /* __KERNEL__ */ |
473 | 483 | ||
474 | #endif | 484 | #endif |
diff --git a/arch/s390/kernel/early.c b/arch/s390/kernel/early.c index fb263736826c..f9b144049dc9 100644 --- a/arch/s390/kernel/early.c +++ b/arch/s390/kernel/early.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * arch/s390/kernel/early.c | 2 | * arch/s390/kernel/early.c |
3 | * | 3 | * |
4 | * Copyright IBM Corp. 2007 | 4 | * Copyright IBM Corp. 2007, 2009 |
5 | * Author(s): Hongjie Yang <hongjie@us.ibm.com>, | 5 | * Author(s): Hongjie Yang <hongjie@us.ibm.com>, |
6 | * Heiko Carstens <heiko.carstens@de.ibm.com> | 6 | * Heiko Carstens <heiko.carstens@de.ibm.com> |
7 | */ | 7 | */ |
@@ -210,7 +210,7 @@ static noinline __init void detect_machine_type(void) | |||
210 | machine_flags |= MACHINE_FLAG_VM; | 210 | machine_flags |= MACHINE_FLAG_VM; |
211 | } | 211 | } |
212 | 212 | ||
213 | static __init void early_pgm_check_handler(void) | 213 | static void early_pgm_check_handler(void) |
214 | { | 214 | { |
215 | unsigned long addr; | 215 | unsigned long addr; |
216 | const struct exception_table_entry *fixup; | 216 | const struct exception_table_entry *fixup; |
@@ -222,7 +222,7 @@ static __init void early_pgm_check_handler(void) | |||
222 | S390_lowcore.program_old_psw.addr = fixup->fixup | PSW_ADDR_AMODE; | 222 | S390_lowcore.program_old_psw.addr = fixup->fixup | PSW_ADDR_AMODE; |
223 | } | 223 | } |
224 | 224 | ||
225 | static noinline __init void setup_lowcore_early(void) | 225 | void setup_lowcore_early(void) |
226 | { | 226 | { |
227 | psw_t psw; | 227 | psw_t psw; |
228 | 228 | ||
diff --git a/arch/s390/kernel/init_task.c b/arch/s390/kernel/init_task.c index 7db95c0b8693..fe787f9e5f3f 100644 --- a/arch/s390/kernel/init_task.c +++ b/arch/s390/kernel/init_task.c | |||
@@ -18,10 +18,6 @@ | |||
18 | 18 | ||
19 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 19 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
20 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 20 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
21 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
22 | |||
23 | EXPORT_SYMBOL(init_mm); | ||
24 | |||
25 | /* | 21 | /* |
26 | * Initial thread structure. | 22 | * Initial thread structure. |
27 | * | 23 | * |
diff --git a/arch/s390/kernel/mem_detect.c b/arch/s390/kernel/mem_detect.c index 9872999c66d1..559af0d07878 100644 --- a/arch/s390/kernel/mem_detect.c +++ b/arch/s390/kernel/mem_detect.c | |||
@@ -1,6 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright IBM Corp. 2008 | 2 | * Copyright IBM Corp. 2008, 2009 |
3 | * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com> | 3 | * |
4 | * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com> | ||
4 | */ | 5 | */ |
5 | 6 | ||
6 | #include <linux/kernel.h> | 7 | #include <linux/kernel.h> |
@@ -9,20 +10,6 @@ | |||
9 | #include <asm/sclp.h> | 10 | #include <asm/sclp.h> |
10 | #include <asm/setup.h> | 11 | #include <asm/setup.h> |
11 | 12 | ||
12 | static inline int tprot(unsigned long addr) | ||
13 | { | ||
14 | int rc = -EFAULT; | ||
15 | |||
16 | asm volatile( | ||
17 | " tprot 0(%1),0\n" | ||
18 | "0: ipm %0\n" | ||
19 | " srl %0,28\n" | ||
20 | "1:\n" | ||
21 | EX_TABLE(0b,1b) | ||
22 | : "+d" (rc) : "a" (addr) : "cc"); | ||
23 | return rc; | ||
24 | } | ||
25 | |||
26 | #define ADDR2G (1ULL << 31) | 13 | #define ADDR2G (1ULL << 31) |
27 | 14 | ||
28 | static void find_memory_chunks(struct mem_chunk chunk[]) | 15 | static void find_memory_chunks(struct mem_chunk chunk[]) |
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index cc8c484984e3..fd8e3111a4e8 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * arch/s390/kernel/smp.c | 2 | * arch/s390/kernel/smp.c |
3 | * | 3 | * |
4 | * Copyright IBM Corp. 1999,2007 | 4 | * Copyright IBM Corp. 1999, 2009 |
5 | * Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com), | 5 | * Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com), |
6 | * Martin Schwidefsky (schwidefsky@de.ibm.com) | 6 | * Martin Schwidefsky (schwidefsky@de.ibm.com) |
7 | * Heiko Carstens (heiko.carstens@de.ibm.com) | 7 | * Heiko Carstens (heiko.carstens@de.ibm.com) |
@@ -1031,6 +1031,42 @@ out: | |||
1031 | static SYSDEV_CLASS_ATTR(dispatching, 0644, dispatching_show, | 1031 | static SYSDEV_CLASS_ATTR(dispatching, 0644, dispatching_show, |
1032 | dispatching_store); | 1032 | dispatching_store); |
1033 | 1033 | ||
1034 | /* | ||
1035 | * If the resume kernel runs on another cpu than the suspended kernel, | ||
1036 | * we have to switch the cpu IDs in the logical map. | ||
1037 | */ | ||
1038 | void smp_switch_boot_cpu_in_resume(u32 resume_phys_cpu_id, | ||
1039 | struct _lowcore *suspend_lowcore) | ||
1040 | { | ||
1041 | int cpu, suspend_cpu_id, resume_cpu_id; | ||
1042 | u32 suspend_phys_cpu_id; | ||
1043 | |||
1044 | suspend_phys_cpu_id = __cpu_logical_map[suspend_lowcore->cpu_nr]; | ||
1045 | suspend_cpu_id = suspend_lowcore->cpu_nr; | ||
1046 | |||
1047 | for_each_present_cpu(cpu) { | ||
1048 | if (__cpu_logical_map[cpu] == resume_phys_cpu_id) { | ||
1049 | resume_cpu_id = cpu; | ||
1050 | goto found; | ||
1051 | } | ||
1052 | } | ||
1053 | panic("Could not find resume cpu in logical map.\n"); | ||
1054 | |||
1055 | found: | ||
1056 | printk("Resume cpu ID: %i/%i\n", resume_phys_cpu_id, resume_cpu_id); | ||
1057 | printk("Suspend cpu ID: %i/%i\n", suspend_phys_cpu_id, suspend_cpu_id); | ||
1058 | |||
1059 | __cpu_logical_map[resume_cpu_id] = suspend_phys_cpu_id; | ||
1060 | __cpu_logical_map[suspend_cpu_id] = resume_phys_cpu_id; | ||
1061 | |||
1062 | lowcore_ptr[suspend_cpu_id]->cpu_addr = resume_phys_cpu_id; | ||
1063 | } | ||
1064 | |||
1065 | u32 smp_get_phys_cpu_id(void) | ||
1066 | { | ||
1067 | return __cpu_logical_map[smp_processor_id()]; | ||
1068 | } | ||
1069 | |||
1034 | static int __init topology_init(void) | 1070 | static int __init topology_init(void) |
1035 | { | 1071 | { |
1036 | int cpu; | 1072 | int cpu; |
diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c index 4ca8e826bf30..565667207985 100644 --- a/arch/s390/mm/pgtable.c +++ b/arch/s390/mm/pgtable.c | |||
@@ -313,3 +313,22 @@ int s390_enable_sie(void) | |||
313 | return 0; | 313 | return 0; |
314 | } | 314 | } |
315 | EXPORT_SYMBOL_GPL(s390_enable_sie); | 315 | EXPORT_SYMBOL_GPL(s390_enable_sie); |
316 | |||
317 | #ifdef CONFIG_DEBUG_PAGEALLOC | ||
318 | #ifdef CONFIG_HIBERNATION | ||
319 | bool kernel_page_present(struct page *page) | ||
320 | { | ||
321 | unsigned long addr; | ||
322 | int cc; | ||
323 | |||
324 | addr = page_to_phys(page); | ||
325 | asm("lra %1,0(%1)\n" | ||
326 | "ipm %0\n" | ||
327 | "srl %0,28" | ||
328 | :"=d"(cc),"+a"(addr)::"cc"); | ||
329 | return cc == 0; | ||
330 | } | ||
331 | |||
332 | #endif /* CONFIG_HIBERNATION */ | ||
333 | #endif /* CONFIG_DEBUG_PAGEALLOC */ | ||
334 | |||
diff --git a/arch/s390/power/Makefile b/arch/s390/power/Makefile new file mode 100644 index 000000000000..973bb45a8fec --- /dev/null +++ b/arch/s390/power/Makefile | |||
@@ -0,0 +1,8 @@ | |||
1 | # | ||
2 | # Makefile for s390 PM support | ||
3 | # | ||
4 | |||
5 | obj-$(CONFIG_HIBERNATION) += suspend.o | ||
6 | obj-$(CONFIG_HIBERNATION) += swsusp.o | ||
7 | obj-$(CONFIG_HIBERNATION) += swsusp_64.o | ||
8 | obj-$(CONFIG_HIBERNATION) += swsusp_asm64.o | ||
diff --git a/arch/s390/power/suspend.c b/arch/s390/power/suspend.c new file mode 100644 index 000000000000..b3351eceebbe --- /dev/null +++ b/arch/s390/power/suspend.c | |||
@@ -0,0 +1,40 @@ | |||
1 | /* | ||
2 | * Suspend support specific for s390. | ||
3 | * | ||
4 | * Copyright IBM Corp. 2009 | ||
5 | * | ||
6 | * Author(s): Hans-Joachim Picht <hans@linux.vnet.ibm.com> | ||
7 | */ | ||
8 | |||
9 | #include <linux/mm.h> | ||
10 | #include <linux/suspend.h> | ||
11 | #include <linux/reboot.h> | ||
12 | #include <linux/pfn.h> | ||
13 | #include <asm/sections.h> | ||
14 | #include <asm/ipl.h> | ||
15 | |||
16 | /* | ||
17 | * References to section boundaries | ||
18 | */ | ||
19 | extern const void __nosave_begin, __nosave_end; | ||
20 | |||
21 | /* | ||
22 | * check if given pfn is in the 'nosave' or in the read only NSS section | ||
23 | */ | ||
24 | int pfn_is_nosave(unsigned long pfn) | ||
25 | { | ||
26 | unsigned long nosave_begin_pfn = __pa(&__nosave_begin) >> PAGE_SHIFT; | ||
27 | unsigned long nosave_end_pfn = PAGE_ALIGN(__pa(&__nosave_end)) | ||
28 | >> PAGE_SHIFT; | ||
29 | unsigned long eshared_pfn = PFN_DOWN(__pa(&_eshared)) - 1; | ||
30 | unsigned long stext_pfn = PFN_DOWN(__pa(&_stext)); | ||
31 | |||
32 | if (pfn >= nosave_begin_pfn && pfn < nosave_end_pfn) | ||
33 | return 1; | ||
34 | if (pfn >= stext_pfn && pfn <= eshared_pfn) { | ||
35 | if (ipl_info.type == IPL_TYPE_NSS) | ||
36 | return 1; | ||
37 | } else if ((tprot(pfn * PAGE_SIZE) && pfn > 0)) | ||
38 | return 1; | ||
39 | return 0; | ||
40 | } | ||
diff --git a/arch/s390/power/swsusp.c b/arch/s390/power/swsusp.c new file mode 100644 index 000000000000..e6a4fe9f5f24 --- /dev/null +++ b/arch/s390/power/swsusp.c | |||
@@ -0,0 +1,30 @@ | |||
1 | /* | ||
2 | * Support for suspend and resume on s390 | ||
3 | * | ||
4 | * Copyright IBM Corp. 2009 | ||
5 | * | ||
6 | * Author(s): Hans-Joachim Picht <hans@linux.vnet.ibm.com> | ||
7 | * | ||
8 | */ | ||
9 | |||
10 | |||
11 | /* | ||
12 | * save CPU registers before creating a hibernation image and before | ||
13 | * restoring the memory state from it | ||
14 | */ | ||
15 | void save_processor_state(void) | ||
16 | { | ||
17 | /* implentation contained in the | ||
18 | * swsusp_arch_suspend function | ||
19 | */ | ||
20 | } | ||
21 | |||
22 | /* | ||
23 | * restore the contents of CPU registers | ||
24 | */ | ||
25 | void restore_processor_state(void) | ||
26 | { | ||
27 | /* implentation contained in the | ||
28 | * swsusp_arch_resume function | ||
29 | */ | ||
30 | } | ||
diff --git a/arch/s390/power/swsusp_64.c b/arch/s390/power/swsusp_64.c new file mode 100644 index 000000000000..9516a517d72f --- /dev/null +++ b/arch/s390/power/swsusp_64.c | |||
@@ -0,0 +1,17 @@ | |||
1 | /* | ||
2 | * Support for suspend and resume on s390 | ||
3 | * | ||
4 | * Copyright IBM Corp. 2009 | ||
5 | * | ||
6 | * Author(s): Hans-Joachim Picht <hans@linux.vnet.ibm.com> | ||
7 | * | ||
8 | */ | ||
9 | |||
10 | #include <asm/system.h> | ||
11 | #include <linux/interrupt.h> | ||
12 | |||
13 | void do_after_copyback(void) | ||
14 | { | ||
15 | mb(); | ||
16 | } | ||
17 | |||
diff --git a/arch/s390/power/swsusp_asm64.S b/arch/s390/power/swsusp_asm64.S new file mode 100644 index 000000000000..3c74e7d827c9 --- /dev/null +++ b/arch/s390/power/swsusp_asm64.S | |||
@@ -0,0 +1,199 @@ | |||
1 | /* | ||
2 | * S390 64-bit swsusp implementation | ||
3 | * | ||
4 | * Copyright IBM Corp. 2009 | ||
5 | * | ||
6 | * Author(s): Hans-Joachim Picht <hans@linux.vnet.ibm.com> | ||
7 | * Michael Holzheu <holzheu@linux.vnet.ibm.com> | ||
8 | */ | ||
9 | |||
10 | #include <asm/page.h> | ||
11 | #include <asm/ptrace.h> | ||
12 | #include <asm/asm-offsets.h> | ||
13 | |||
14 | /* | ||
15 | * Save register context in absolute 0 lowcore and call swsusp_save() to | ||
16 | * create in-memory kernel image. The context is saved in the designated | ||
17 | * "store status" memory locations (see POP). | ||
18 | * We return from this function twice. The first time during the suspend to | ||
19 | * disk process. The second time via the swsusp_arch_resume() function | ||
20 | * (see below) in the resume process. | ||
21 | * This function runs with disabled interrupts. | ||
22 | */ | ||
23 | .section .text | ||
24 | .align 2 | ||
25 | .globl swsusp_arch_suspend | ||
26 | swsusp_arch_suspend: | ||
27 | stmg %r6,%r15,__SF_GPRS(%r15) | ||
28 | lgr %r1,%r15 | ||
29 | aghi %r15,-STACK_FRAME_OVERHEAD | ||
30 | stg %r1,__SF_BACKCHAIN(%r15) | ||
31 | |||
32 | /* Deactivate DAT */ | ||
33 | stnsm __SF_EMPTY(%r15),0xfb | ||
34 | |||
35 | /* Switch off lowcore protection */ | ||
36 | stctg %c0,%c0,__SF_EMPTY(%r15) | ||
37 | ni __SF_EMPTY+4(%r15),0xef | ||
38 | lctlg %c0,%c0,__SF_EMPTY(%r15) | ||
39 | |||
40 | /* Store prefix register on stack */ | ||
41 | stpx __SF_EMPTY(%r15) | ||
42 | |||
43 | /* Setup base register for lowcore (absolute 0) */ | ||
44 | llgf %r1,__SF_EMPTY(%r15) | ||
45 | |||
46 | /* Get pointer to save area */ | ||
47 | aghi %r1,0x1000 | ||
48 | |||
49 | /* Store registers */ | ||
50 | mvc 0x318(4,%r1),__SF_EMPTY(%r15) /* move prefix to lowcore */ | ||
51 | stfpc 0x31c(%r1) /* store fpu control */ | ||
52 | std 0,0x200(%r1) /* store f0 */ | ||
53 | std 1,0x208(%r1) /* store f1 */ | ||
54 | std 2,0x210(%r1) /* store f2 */ | ||
55 | std 3,0x218(%r1) /* store f3 */ | ||
56 | std 4,0x220(%r1) /* store f4 */ | ||
57 | std 5,0x228(%r1) /* store f5 */ | ||
58 | std 6,0x230(%r1) /* store f6 */ | ||
59 | std 7,0x238(%r1) /* store f7 */ | ||
60 | std 8,0x240(%r1) /* store f8 */ | ||
61 | std 9,0x248(%r1) /* store f9 */ | ||
62 | std 10,0x250(%r1) /* store f10 */ | ||
63 | std 11,0x258(%r1) /* store f11 */ | ||
64 | std 12,0x260(%r1) /* store f12 */ | ||
65 | std 13,0x268(%r1) /* store f13 */ | ||
66 | std 14,0x270(%r1) /* store f14 */ | ||
67 | std 15,0x278(%r1) /* store f15 */ | ||
68 | stam %a0,%a15,0x340(%r1) /* store access registers */ | ||
69 | stctg %c0,%c15,0x380(%r1) /* store control registers */ | ||
70 | stmg %r0,%r15,0x280(%r1) /* store general registers */ | ||
71 | |||
72 | stpt 0x328(%r1) /* store timer */ | ||
73 | stckc 0x330(%r1) /* store clock comparator */ | ||
74 | |||
75 | /* Activate DAT */ | ||
76 | stosm __SF_EMPTY(%r15),0x04 | ||
77 | |||
78 | /* Set prefix page to zero */ | ||
79 | xc __SF_EMPTY(4,%r15),__SF_EMPTY(%r15) | ||
80 | spx __SF_EMPTY(%r15) | ||
81 | |||
82 | /* Setup lowcore */ | ||
83 | brasl %r14,setup_lowcore_early | ||
84 | |||
85 | /* Save image */ | ||
86 | brasl %r14,swsusp_save | ||
87 | |||
88 | /* Switch on lowcore protection */ | ||
89 | stctg %c0,%c0,__SF_EMPTY(%r15) | ||
90 | oi __SF_EMPTY+4(%r15),0x10 | ||
91 | lctlg %c0,%c0,__SF_EMPTY(%r15) | ||
92 | |||
93 | /* Restore prefix register and return */ | ||
94 | lghi %r1,0x1000 | ||
95 | spx 0x318(%r1) | ||
96 | lmg %r6,%r15,STACK_FRAME_OVERHEAD + __SF_GPRS(%r15) | ||
97 | lghi %r2,0 | ||
98 | br %r14 | ||
99 | |||
100 | /* | ||
101 | * Restore saved memory image to correct place and restore register context. | ||
102 | * Then we return to the function that called swsusp_arch_suspend(). | ||
103 | * swsusp_arch_resume() runs with disabled interrupts. | ||
104 | */ | ||
105 | .globl swsusp_arch_resume | ||
106 | swsusp_arch_resume: | ||
107 | stmg %r6,%r15,__SF_GPRS(%r15) | ||
108 | lgr %r1,%r15 | ||
109 | aghi %r15,-STACK_FRAME_OVERHEAD | ||
110 | stg %r1,__SF_BACKCHAIN(%r15) | ||
111 | |||
112 | /* Save boot cpu number */ | ||
113 | brasl %r14,smp_get_phys_cpu_id | ||
114 | lgr %r10,%r2 | ||
115 | |||
116 | /* Deactivate DAT */ | ||
117 | stnsm __SF_EMPTY(%r15),0xfb | ||
118 | |||
119 | /* Switch off lowcore protection */ | ||
120 | stctg %c0,%c0,__SF_EMPTY(%r15) | ||
121 | ni __SF_EMPTY+4(%r15),0xef | ||
122 | lctlg %c0,%c0,__SF_EMPTY(%r15) | ||
123 | |||
124 | /* Set prefix page to zero */ | ||
125 | xc __SF_EMPTY(4,%r15),__SF_EMPTY(%r15) | ||
126 | spx __SF_EMPTY(%r15) | ||
127 | |||
128 | /* Restore saved image */ | ||
129 | larl %r1,restore_pblist | ||
130 | lg %r1,0(%r1) | ||
131 | ltgr %r1,%r1 | ||
132 | jz 2f | ||
133 | 0: | ||
134 | lg %r2,8(%r1) | ||
135 | lg %r4,0(%r1) | ||
136 | lghi %r3,PAGE_SIZE | ||
137 | lghi %r5,PAGE_SIZE | ||
138 | 1: | ||
139 | mvcle %r2,%r4,0 | ||
140 | jo 1b | ||
141 | lg %r1,16(%r1) | ||
142 | ltgr %r1,%r1 | ||
143 | jnz 0b | ||
144 | 2: | ||
145 | ptlb /* flush tlb */ | ||
146 | |||
147 | /* Restore registers */ | ||
148 | lghi %r13,0x1000 /* %r1 = pointer to save arae */ | ||
149 | |||
150 | spt 0x328(%r13) /* reprogram timer */ | ||
151 | //sckc 0x330(%r13) /* set clock comparator */ | ||
152 | |||
153 | lctlg %c0,%c15,0x380(%r13) /* load control registers */ | ||
154 | lam %a0,%a15,0x340(%r13) /* load access registers */ | ||
155 | |||
156 | lfpc 0x31c(%r13) /* load fpu control */ | ||
157 | ld 0,0x200(%r13) /* load f0 */ | ||
158 | ld 1,0x208(%r13) /* load f1 */ | ||
159 | ld 2,0x210(%r13) /* load f2 */ | ||
160 | ld 3,0x218(%r13) /* load f3 */ | ||
161 | ld 4,0x220(%r13) /* load f4 */ | ||
162 | ld 5,0x228(%r13) /* load f5 */ | ||
163 | ld 6,0x230(%r13) /* load f6 */ | ||
164 | ld 7,0x238(%r13) /* load f7 */ | ||
165 | ld 8,0x240(%r13) /* load f8 */ | ||
166 | ld 9,0x248(%r13) /* load f9 */ | ||
167 | ld 10,0x250(%r13) /* load f10 */ | ||
168 | ld 11,0x258(%r13) /* load f11 */ | ||
169 | ld 12,0x260(%r13) /* load f12 */ | ||
170 | ld 13,0x268(%r13) /* load f13 */ | ||
171 | ld 14,0x270(%r13) /* load f14 */ | ||
172 | ld 15,0x278(%r13) /* load f15 */ | ||
173 | |||
174 | /* Load old stack */ | ||
175 | lg %r15,0x2f8(%r13) | ||
176 | |||
177 | /* Pointer to save arae */ | ||
178 | lghi %r13,0x1000 | ||
179 | |||
180 | /* Switch CPUs */ | ||
181 | lgr %r2,%r10 /* get cpu id */ | ||
182 | llgf %r3,0x318(%r13) | ||
183 | brasl %r14,smp_switch_boot_cpu_in_resume | ||
184 | |||
185 | /* Restore prefix register */ | ||
186 | spx 0x318(%r13) | ||
187 | |||
188 | /* Switch on lowcore protection */ | ||
189 | stctg %c0,%c0,__SF_EMPTY(%r15) | ||
190 | oi __SF_EMPTY+4(%r15),0x10 | ||
191 | lctlg %c0,%c0,__SF_EMPTY(%r15) | ||
192 | |||
193 | /* Activate DAT */ | ||
194 | stosm __SF_EMPTY(%r15),0x04 | ||
195 | |||
196 | /* Return 0 */ | ||
197 | lmg %r6,%r15,STACK_FRAME_OVERHEAD + __SF_GPRS(%r15) | ||
198 | lghi %r2,0 | ||
199 | br %r14 | ||
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index 586cd045e2db..ac1c620d1c7d 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig | |||
@@ -15,7 +15,9 @@ config SUPERH | |||
15 | select HAVE_IOREMAP_PROT if MMU | 15 | select HAVE_IOREMAP_PROT if MMU |
16 | select HAVE_ARCH_TRACEHOOK | 16 | select HAVE_ARCH_TRACEHOOK |
17 | select HAVE_DMA_API_DEBUG | 17 | select HAVE_DMA_API_DEBUG |
18 | select HAVE_PERF_COUNTER | ||
18 | select RTC_LIB | 19 | select RTC_LIB |
20 | select GENERIC_ATOMIC64 | ||
19 | help | 21 | help |
20 | The SuperH is a RISC processor targeted for use in embedded systems | 22 | The SuperH is a RISC processor targeted for use in embedded systems |
21 | and consumer electronics; it was also used in the Sega Dreamcast | 23 | and consumer electronics; it was also used in the Sega Dreamcast |
@@ -50,6 +52,10 @@ config GENERIC_BUG | |||
50 | def_bool y | 52 | def_bool y |
51 | depends on BUG && SUPERH32 | 53 | depends on BUG && SUPERH32 |
52 | 54 | ||
55 | config GENERIC_CSUM | ||
56 | def_bool y | ||
57 | depends on SUPERH64 | ||
58 | |||
53 | config GENERIC_FIND_NEXT_BIT | 59 | config GENERIC_FIND_NEXT_BIT |
54 | def_bool y | 60 | def_bool y |
55 | 61 | ||
diff --git a/arch/sh/Kconfig.debug b/arch/sh/Kconfig.debug index 8179cc9be9a4..8ece0b5bd028 100644 --- a/arch/sh/Kconfig.debug +++ b/arch/sh/Kconfig.debug | |||
@@ -39,6 +39,7 @@ config EARLY_SCIF_CONSOLE_PORT | |||
39 | CPU_SUBTYPE_SH7722 || CPU_SUBTYPE_SH7366 || \ | 39 | CPU_SUBTYPE_SH7722 || CPU_SUBTYPE_SH7366 || \ |
40 | CPU_SUBTYPE_SH7343 | 40 | CPU_SUBTYPE_SH7343 |
41 | default "0xffea0000" if CPU_SUBTYPE_SH7785 | 41 | default "0xffea0000" if CPU_SUBTYPE_SH7785 |
42 | default "0xffeb0000" if CPU_SUBTYPE_SH7786 | ||
42 | default "0xfffe8000" if CPU_SUBTYPE_SH7203 | 43 | default "0xfffe8000" if CPU_SUBTYPE_SH7203 |
43 | default "0xfffe9800" if CPU_SUBTYPE_SH7206 || CPU_SUBTYPE_SH7263 | 44 | default "0xfffe9800" if CPU_SUBTYPE_SH7206 || CPU_SUBTYPE_SH7263 |
44 | default "0xffe80000" if CPU_SH4 | 45 | default "0xffe80000" if CPU_SH4 |
diff --git a/arch/sh/boards/board-ap325rxa.c b/arch/sh/boards/board-ap325rxa.c index 1c4d83ef2a47..7ffd1b4315bd 100644 --- a/arch/sh/boards/board-ap325rxa.c +++ b/arch/sh/boards/board-ap325rxa.c | |||
@@ -349,15 +349,6 @@ static int ov7725_power(struct device *dev, int mode) | |||
349 | return 0; | 349 | return 0; |
350 | } | 350 | } |
351 | 351 | ||
352 | static struct ov772x_camera_info ov7725_info = { | ||
353 | .buswidth = SOCAM_DATAWIDTH_8, | ||
354 | .flags = OV772X_FLAG_VFLIP | OV772X_FLAG_HFLIP, | ||
355 | .edgectrl = OV772X_AUTO_EDGECTRL(0xf, 0), | ||
356 | .link = { | ||
357 | .power = ov7725_power, | ||
358 | }, | ||
359 | }; | ||
360 | |||
361 | static struct sh_mobile_ceu_info sh_mobile_ceu_info = { | 352 | static struct sh_mobile_ceu_info sh_mobile_ceu_info = { |
362 | .flags = SH_CEU_FLAG_USE_8BIT_BUS, | 353 | .flags = SH_CEU_FLAG_USE_8BIT_BUS, |
363 | }; | 354 | }; |
@@ -402,25 +393,48 @@ static struct platform_device sdcard_cn3_device = { | |||
402 | }, | 393 | }, |
403 | }; | 394 | }; |
404 | 395 | ||
405 | static struct platform_device *ap325rxa_devices[] __initdata = { | ||
406 | &smsc9118_device, | ||
407 | &ap325rxa_nor_flash_device, | ||
408 | &lcdc_device, | ||
409 | &ceu_device, | ||
410 | &nand_flash_device, | ||
411 | &sdcard_cn3_device, | ||
412 | }; | ||
413 | |||
414 | static struct i2c_board_info __initdata ap325rxa_i2c_devices[] = { | 396 | static struct i2c_board_info __initdata ap325rxa_i2c_devices[] = { |
415 | { | 397 | { |
416 | I2C_BOARD_INFO("pcf8563", 0x51), | 398 | I2C_BOARD_INFO("pcf8563", 0x51), |
417 | }, | 399 | }, |
400 | }; | ||
401 | |||
402 | static struct i2c_board_info ap325rxa_i2c_camera[] = { | ||
418 | { | 403 | { |
419 | I2C_BOARD_INFO("ov772x", 0x21), | 404 | I2C_BOARD_INFO("ov772x", 0x21), |
420 | .platform_data = &ov7725_info, | ||
421 | }, | 405 | }, |
422 | }; | 406 | }; |
423 | 407 | ||
408 | static struct ov772x_camera_info ov7725_info = { | ||
409 | .buswidth = SOCAM_DATAWIDTH_8, | ||
410 | .flags = OV772X_FLAG_VFLIP | OV772X_FLAG_HFLIP, | ||
411 | .edgectrl = OV772X_AUTO_EDGECTRL(0xf, 0), | ||
412 | .link = { | ||
413 | .power = ov7725_power, | ||
414 | .board_info = &ap325rxa_i2c_camera[0], | ||
415 | .i2c_adapter_id = 0, | ||
416 | .module_name = "ov772x", | ||
417 | }, | ||
418 | }; | ||
419 | |||
420 | static struct platform_device ap325rxa_camera = { | ||
421 | .name = "soc-camera-pdrv", | ||
422 | .id = 0, | ||
423 | .dev = { | ||
424 | .platform_data = &ov7725_info.link, | ||
425 | }, | ||
426 | }; | ||
427 | |||
428 | static struct platform_device *ap325rxa_devices[] __initdata = { | ||
429 | &smsc9118_device, | ||
430 | &ap325rxa_nor_flash_device, | ||
431 | &lcdc_device, | ||
432 | &ceu_device, | ||
433 | &nand_flash_device, | ||
434 | &sdcard_cn3_device, | ||
435 | &ap325rxa_camera, | ||
436 | }; | ||
437 | |||
424 | static struct spi_board_info ap325rxa_spi_devices[] = { | 438 | static struct spi_board_info ap325rxa_spi_devices[] = { |
425 | { | 439 | { |
426 | .modalias = "mmc_spi", | 440 | .modalias = "mmc_spi", |
diff --git a/arch/sh/boards/board-sh7785lcr.c b/arch/sh/boards/board-sh7785lcr.c index 7be56fb06c1f..42410a15d255 100644 --- a/arch/sh/boards/board-sh7785lcr.c +++ b/arch/sh/boards/board-sh7785lcr.c | |||
@@ -15,16 +15,18 @@ | |||
15 | #include <linux/fb.h> | 15 | #include <linux/fb.h> |
16 | #include <linux/mtd/physmap.h> | 16 | #include <linux/mtd/physmap.h> |
17 | #include <linux/delay.h> | 17 | #include <linux/delay.h> |
18 | #include <linux/interrupt.h> | ||
18 | #include <linux/i2c.h> | 19 | #include <linux/i2c.h> |
19 | #include <linux/i2c-pca-platform.h> | 20 | #include <linux/i2c-pca-platform.h> |
20 | #include <linux/i2c-algo-pca.h> | 21 | #include <linux/i2c-algo-pca.h> |
22 | #include <linux/usb/r8a66597.h> | ||
21 | #include <linux/irq.h> | 23 | #include <linux/irq.h> |
22 | #include <linux/clk.h> | 24 | #include <linux/clk.h> |
23 | #include <linux/errno.h> | 25 | #include <linux/errno.h> |
24 | #include <mach/sh7785lcr.h> | 26 | #include <mach/sh7785lcr.h> |
27 | #include <cpu/sh7785.h> | ||
25 | #include <asm/heartbeat.h> | 28 | #include <asm/heartbeat.h> |
26 | #include <asm/clock.h> | 29 | #include <asm/clock.h> |
27 | #include <cpu/sh7785.h> | ||
28 | 30 | ||
29 | /* | 31 | /* |
30 | * NOTE: This board has 2 physical memory maps. | 32 | * NOTE: This board has 2 physical memory maps. |
@@ -98,18 +100,21 @@ static struct platform_device nor_flash_device = { | |||
98 | .resource = nor_flash_resources, | 100 | .resource = nor_flash_resources, |
99 | }; | 101 | }; |
100 | 102 | ||
103 | static struct r8a66597_platdata r8a66597_data = { | ||
104 | .xtal = R8A66597_PLATDATA_XTAL_12MHZ, | ||
105 | .vif = 1, | ||
106 | }; | ||
107 | |||
101 | static struct resource r8a66597_usb_host_resources[] = { | 108 | static struct resource r8a66597_usb_host_resources[] = { |
102 | [0] = { | 109 | [0] = { |
103 | .name = "r8a66597_hcd", | ||
104 | .start = R8A66597_ADDR, | 110 | .start = R8A66597_ADDR, |
105 | .end = R8A66597_ADDR + R8A66597_SIZE - 1, | 111 | .end = R8A66597_ADDR + R8A66597_SIZE - 1, |
106 | .flags = IORESOURCE_MEM, | 112 | .flags = IORESOURCE_MEM, |
107 | }, | 113 | }, |
108 | [1] = { | 114 | [1] = { |
109 | .name = "r8a66597_hcd", | ||
110 | .start = 2, | 115 | .start = 2, |
111 | .end = 2, | 116 | .end = 2, |
112 | .flags = IORESOURCE_IRQ, | 117 | .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, |
113 | }, | 118 | }, |
114 | }; | 119 | }; |
115 | 120 | ||
@@ -119,6 +124,7 @@ static struct platform_device r8a66597_usb_host_device = { | |||
119 | .dev = { | 124 | .dev = { |
120 | .dma_mask = NULL, | 125 | .dma_mask = NULL, |
121 | .coherent_dma_mask = 0xffffffff, | 126 | .coherent_dma_mask = 0xffffffff, |
127 | .platform_data = &r8a66597_data, | ||
122 | }, | 128 | }, |
123 | .num_resources = ARRAY_SIZE(r8a66597_usb_host_resources), | 129 | .num_resources = ARRAY_SIZE(r8a66597_usb_host_resources), |
124 | .resource = r8a66597_usb_host_resources, | 130 | .resource = r8a66597_usb_host_resources, |
diff --git a/arch/sh/boards/board-urquell.c b/arch/sh/boards/board-urquell.c index beb88c4da2c1..36b8bac9b124 100644 --- a/arch/sh/boards/board-urquell.c +++ b/arch/sh/boards/board-urquell.c | |||
@@ -2,6 +2,7 @@ | |||
2 | * Renesas Technology Corp. SH7786 Urquell Support. | 2 | * Renesas Technology Corp. SH7786 Urquell Support. |
3 | * | 3 | * |
4 | * Copyright (C) 2008 Kuninori Morimoto <morimoto.kuninori@renesas.com> | 4 | * Copyright (C) 2008 Kuninori Morimoto <morimoto.kuninori@renesas.com> |
5 | * Copyright (C) 2009 Paul Mundt | ||
5 | * | 6 | * |
6 | * Based on board-sh7785lcr.c | 7 | * Based on board-sh7785lcr.c |
7 | * Copyright (C) 2008 Yoshihiro Shimoda | 8 | * Copyright (C) 2008 Yoshihiro Shimoda |
@@ -178,6 +179,11 @@ static void __init urquell_init_irq(void) | |||
178 | plat_irq_setup_pins(IRQ_MODE_IRL3210_MASK); | 179 | plat_irq_setup_pins(IRQ_MODE_IRL3210_MASK); |
179 | } | 180 | } |
180 | 181 | ||
182 | static int urquell_mode_pins(void) | ||
183 | { | ||
184 | return __raw_readw(UBOARDREG(MDSWMR)); | ||
185 | } | ||
186 | |||
181 | /* Initialize the board */ | 187 | /* Initialize the board */ |
182 | static void __init urquell_setup(char **cmdline_p) | 188 | static void __init urquell_setup(char **cmdline_p) |
183 | { | 189 | { |
@@ -193,4 +199,5 @@ static struct sh_machine_vector mv_urquell __initmv = { | |||
193 | .mv_name = "Urquell", | 199 | .mv_name = "Urquell", |
194 | .mv_setup = urquell_setup, | 200 | .mv_setup = urquell_setup, |
195 | .mv_init_irq = urquell_init_irq, | 201 | .mv_init_irq = urquell_init_irq, |
202 | .mv_mode_pins = urquell_mode_pins, | ||
196 | }; | 203 | }; |
diff --git a/arch/sh/boards/mach-highlander/setup.c b/arch/sh/boards/mach-highlander/setup.c index 20fe72c515d5..1639f8915000 100644 --- a/arch/sh/boards/mach-highlander/setup.c +++ b/arch/sh/boards/mach-highlander/setup.c | |||
@@ -17,8 +17,11 @@ | |||
17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
18 | #include <linux/ata_platform.h> | 18 | #include <linux/ata_platform.h> |
19 | #include <linux/types.h> | 19 | #include <linux/types.h> |
20 | #include <linux/mtd/physmap.h> | ||
20 | #include <linux/i2c.h> | 21 | #include <linux/i2c.h> |
21 | #include <linux/irq.h> | 22 | #include <linux/irq.h> |
23 | #include <linux/interrupt.h> | ||
24 | #include <linux/usb/r8a66597.h> | ||
22 | #include <net/ax88796.h> | 25 | #include <net/ax88796.h> |
23 | #include <asm/machvec.h> | 26 | #include <asm/machvec.h> |
24 | #include <mach/highlander.h> | 27 | #include <mach/highlander.h> |
@@ -27,18 +30,21 @@ | |||
27 | #include <asm/io.h> | 30 | #include <asm/io.h> |
28 | #include <asm/io_trapped.h> | 31 | #include <asm/io_trapped.h> |
29 | 32 | ||
33 | static struct r8a66597_platdata r8a66597_data = { | ||
34 | .xtal = R8A66597_PLATDATA_XTAL_12MHZ, | ||
35 | .vif = 1, | ||
36 | }; | ||
37 | |||
30 | static struct resource r8a66597_usb_host_resources[] = { | 38 | static struct resource r8a66597_usb_host_resources[] = { |
31 | [0] = { | 39 | [0] = { |
32 | .name = "r8a66597_hcd", | ||
33 | .start = 0xA4200000, | 40 | .start = 0xA4200000, |
34 | .end = 0xA42000FF, | 41 | .end = 0xA42000FF, |
35 | .flags = IORESOURCE_MEM, | 42 | .flags = IORESOURCE_MEM, |
36 | }, | 43 | }, |
37 | [1] = { | 44 | [1] = { |
38 | .name = "r8a66597_hcd", | ||
39 | .start = IRQ_EXT1, /* irq number */ | 45 | .start = IRQ_EXT1, /* irq number */ |
40 | .end = IRQ_EXT1, | 46 | .end = IRQ_EXT1, |
41 | .flags = IORESOURCE_IRQ, | 47 | .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, |
42 | }, | 48 | }, |
43 | }; | 49 | }; |
44 | 50 | ||
@@ -48,6 +54,7 @@ static struct platform_device r8a66597_usb_host_device = { | |||
48 | .dev = { | 54 | .dev = { |
49 | .dma_mask = NULL, /* don't use dma */ | 55 | .dma_mask = NULL, /* don't use dma */ |
50 | .coherent_dma_mask = 0xffffffff, | 56 | .coherent_dma_mask = 0xffffffff, |
57 | .platform_data = &r8a66597_data, | ||
51 | }, | 58 | }, |
52 | .num_resources = ARRAY_SIZE(r8a66597_usb_host_resources), | 59 | .num_resources = ARRAY_SIZE(r8a66597_usb_host_resources), |
53 | .resource = r8a66597_usb_host_resources, | 60 | .resource = r8a66597_usb_host_resources, |
@@ -178,6 +185,53 @@ static struct platform_device ax88796_device = { | |||
178 | .resource = ax88796_resources, | 185 | .resource = ax88796_resources, |
179 | }; | 186 | }; |
180 | 187 | ||
188 | static struct mtd_partition nor_flash_partitions[] = { | ||
189 | { | ||
190 | .name = "loader", | ||
191 | .offset = 0x00000000, | ||
192 | .size = 512 * 1024, | ||
193 | }, | ||
194 | { | ||
195 | .name = "bootenv", | ||
196 | .offset = MTDPART_OFS_APPEND, | ||
197 | .size = 512 * 1024, | ||
198 | }, | ||
199 | { | ||
200 | .name = "kernel", | ||
201 | .offset = MTDPART_OFS_APPEND, | ||
202 | .size = 4 * 1024 * 1024, | ||
203 | }, | ||
204 | { | ||
205 | .name = "data", | ||
206 | .offset = MTDPART_OFS_APPEND, | ||
207 | .size = MTDPART_SIZ_FULL, | ||
208 | }, | ||
209 | }; | ||
210 | |||
211 | static struct physmap_flash_data nor_flash_data = { | ||
212 | .width = 4, | ||
213 | .parts = nor_flash_partitions, | ||
214 | .nr_parts = ARRAY_SIZE(nor_flash_partitions), | ||
215 | }; | ||
216 | |||
217 | /* This config is flash board for mass production. */ | ||
218 | static struct resource nor_flash_resources[] = { | ||
219 | [0] = { | ||
220 | .start = PA_NORFLASH_ADDR, | ||
221 | .end = PA_NORFLASH_ADDR + PA_NORFLASH_SIZE - 1, | ||
222 | .flags = IORESOURCE_MEM, | ||
223 | } | ||
224 | }; | ||
225 | |||
226 | static struct platform_device nor_flash_device = { | ||
227 | .name = "physmap-flash", | ||
228 | .dev = { | ||
229 | .platform_data = &nor_flash_data, | ||
230 | }, | ||
231 | .num_resources = ARRAY_SIZE(nor_flash_resources), | ||
232 | .resource = nor_flash_resources, | ||
233 | }; | ||
234 | |||
181 | static struct resource smbus_resources[] = { | 235 | static struct resource smbus_resources[] = { |
182 | [0] = { | 236 | [0] = { |
183 | .start = PA_SMCR, | 237 | .start = PA_SMCR, |
@@ -209,6 +263,7 @@ static struct platform_device *r7780rp_devices[] __initdata = { | |||
209 | &m66592_usb_peripheral_device, | 263 | &m66592_usb_peripheral_device, |
210 | &heartbeat_device, | 264 | &heartbeat_device, |
211 | &smbus_device, | 265 | &smbus_device, |
266 | &nor_flash_device, | ||
212 | #ifndef CONFIG_SH_R7780RP | 267 | #ifndef CONFIG_SH_R7780RP |
213 | &ax88796_device, | 268 | &ax88796_device, |
214 | #endif | 269 | #endif |
@@ -247,9 +302,10 @@ device_initcall(r7780rp_devices_setup); | |||
247 | /* | 302 | /* |
248 | * Platform specific clocks | 303 | * Platform specific clocks |
249 | */ | 304 | */ |
250 | static void ivdr_clk_enable(struct clk *clk) | 305 | static int ivdr_clk_enable(struct clk *clk) |
251 | { | 306 | { |
252 | ctrl_outw(ctrl_inw(PA_IVDRCTL) | (1 << IVDR_CK_ON), PA_IVDRCTL); | 307 | ctrl_outw(ctrl_inw(PA_IVDRCTL) | (1 << IVDR_CK_ON), PA_IVDRCTL); |
308 | return 0; | ||
253 | } | 309 | } |
254 | 310 | ||
255 | static void ivdr_clk_disable(struct clk *clk) | 311 | static void ivdr_clk_disable(struct clk *clk) |
diff --git a/arch/sh/boards/mach-migor/setup.c b/arch/sh/boards/mach-migor/setup.c index 6ed401cd3156..f70f4644deb4 100644 --- a/arch/sh/boards/mach-migor/setup.c +++ b/arch/sh/boards/mach-migor/setup.c | |||
@@ -381,21 +381,6 @@ static struct platform_device migor_ceu_device = { | |||
381 | }, | 381 | }, |
382 | }; | 382 | }; |
383 | 383 | ||
384 | static struct ov772x_camera_info ov7725_info = { | ||
385 | .buswidth = SOCAM_DATAWIDTH_8, | ||
386 | .link = { | ||
387 | .power = ov7725_power, | ||
388 | }, | ||
389 | }; | ||
390 | |||
391 | static struct tw9910_video_info tw9910_info = { | ||
392 | .buswidth = SOCAM_DATAWIDTH_8, | ||
393 | .mpout = TW9910_MPO_FIELD, | ||
394 | .link = { | ||
395 | .power = tw9910_power, | ||
396 | } | ||
397 | }; | ||
398 | |||
399 | struct spi_gpio_platform_data sdcard_cn9_platform_data = { | 384 | struct spi_gpio_platform_data sdcard_cn9_platform_data = { |
400 | .sck = GPIO_PTD0, | 385 | .sck = GPIO_PTD0, |
401 | .mosi = GPIO_PTD1, | 386 | .mosi = GPIO_PTD1, |
@@ -410,16 +395,6 @@ static struct platform_device sdcard_cn9_device = { | |||
410 | }, | 395 | }, |
411 | }; | 396 | }; |
412 | 397 | ||
413 | static struct platform_device *migor_devices[] __initdata = { | ||
414 | &smc91x_eth_device, | ||
415 | &sh_keysc_device, | ||
416 | &migor_lcdc_device, | ||
417 | &migor_ceu_device, | ||
418 | &migor_nor_flash_device, | ||
419 | &migor_nand_flash_device, | ||
420 | &sdcard_cn9_device, | ||
421 | }; | ||
422 | |||
423 | static struct i2c_board_info migor_i2c_devices[] = { | 398 | static struct i2c_board_info migor_i2c_devices[] = { |
424 | { | 399 | { |
425 | I2C_BOARD_INFO("rs5c372b", 0x32), | 400 | I2C_BOARD_INFO("rs5c372b", 0x32), |
@@ -428,16 +403,66 @@ static struct i2c_board_info migor_i2c_devices[] = { | |||
428 | I2C_BOARD_INFO("migor_ts", 0x51), | 403 | I2C_BOARD_INFO("migor_ts", 0x51), |
429 | .irq = 38, /* IRQ6 */ | 404 | .irq = 38, /* IRQ6 */ |
430 | }, | 405 | }, |
406 | }; | ||
407 | |||
408 | static struct i2c_board_info migor_i2c_camera[] = { | ||
431 | { | 409 | { |
432 | I2C_BOARD_INFO("ov772x", 0x21), | 410 | I2C_BOARD_INFO("ov772x", 0x21), |
433 | .platform_data = &ov7725_info, | ||
434 | }, | 411 | }, |
435 | { | 412 | { |
436 | I2C_BOARD_INFO("tw9910", 0x45), | 413 | I2C_BOARD_INFO("tw9910", 0x45), |
437 | .platform_data = &tw9910_info, | ||
438 | }, | 414 | }, |
439 | }; | 415 | }; |
440 | 416 | ||
417 | static struct ov772x_camera_info ov7725_info = { | ||
418 | .buswidth = SOCAM_DATAWIDTH_8, | ||
419 | .link = { | ||
420 | .power = ov7725_power, | ||
421 | .board_info = &migor_i2c_camera[0], | ||
422 | .i2c_adapter_id = 0, | ||
423 | .module_name = "ov772x", | ||
424 | }, | ||
425 | }; | ||
426 | |||
427 | static struct tw9910_video_info tw9910_info = { | ||
428 | .buswidth = SOCAM_DATAWIDTH_8, | ||
429 | .mpout = TW9910_MPO_FIELD, | ||
430 | .link = { | ||
431 | .power = tw9910_power, | ||
432 | .board_info = &migor_i2c_camera[1], | ||
433 | .i2c_adapter_id = 0, | ||
434 | .module_name = "tw9910", | ||
435 | } | ||
436 | }; | ||
437 | |||
438 | static struct platform_device migor_camera[] = { | ||
439 | { | ||
440 | .name = "soc-camera-pdrv", | ||
441 | .id = 0, | ||
442 | .dev = { | ||
443 | .platform_data = &ov7725_info.link, | ||
444 | }, | ||
445 | }, { | ||
446 | .name = "soc-camera-pdrv", | ||
447 | .id = 1, | ||
448 | .dev = { | ||
449 | .platform_data = &tw9910_info.link, | ||
450 | }, | ||
451 | }, | ||
452 | }; | ||
453 | |||
454 | static struct platform_device *migor_devices[] __initdata = { | ||
455 | &smc91x_eth_device, | ||
456 | &sh_keysc_device, | ||
457 | &migor_lcdc_device, | ||
458 | &migor_ceu_device, | ||
459 | &migor_nor_flash_device, | ||
460 | &migor_nand_flash_device, | ||
461 | &sdcard_cn9_device, | ||
462 | &migor_camera[0], | ||
463 | &migor_camera[1], | ||
464 | }; | ||
465 | |||
441 | static struct spi_board_info migor_spi_devices[] = { | 466 | static struct spi_board_info migor_spi_devices[] = { |
442 | { | 467 | { |
443 | .modalias = "mmc_spi", | 468 | .modalias = "mmc_spi", |
diff --git a/arch/sh/boards/mach-se/7780/irq.c b/arch/sh/boards/mach-se/7780/irq.c index b8d43b638fcf..121744c08714 100644 --- a/arch/sh/boards/mach-se/7780/irq.c +++ b/arch/sh/boards/mach-se/7780/irq.c | |||
@@ -12,7 +12,6 @@ | |||
12 | #include <linux/init.h> | 12 | #include <linux/init.h> |
13 | #include <linux/irq.h> | 13 | #include <linux/irq.h> |
14 | #include <linux/interrupt.h> | 14 | #include <linux/interrupt.h> |
15 | #include <linux/irq.h> | ||
16 | #include <linux/io.h> | 15 | #include <linux/io.h> |
17 | #include <mach-se/mach/se7780.h> | 16 | #include <mach-se/mach/se7780.h> |
18 | 17 | ||
diff --git a/arch/sh/boards/mach-x3proto/setup.c b/arch/sh/boards/mach-x3proto/setup.c index a340492087fa..8913ae39a802 100644 --- a/arch/sh/boards/mach-x3proto/setup.c +++ b/arch/sh/boards/mach-x3proto/setup.c | |||
@@ -15,6 +15,8 @@ | |||
15 | #include <linux/io.h> | 15 | #include <linux/io.h> |
16 | #include <linux/smc91x.h> | 16 | #include <linux/smc91x.h> |
17 | #include <linux/irq.h> | 17 | #include <linux/irq.h> |
18 | #include <linux/interrupt.h> | ||
19 | #include <linux/usb/r8a66597.h> | ||
18 | #include <asm/ilsel.h> | 20 | #include <asm/ilsel.h> |
19 | 21 | ||
20 | static struct resource heartbeat_resources[] = { | 22 | static struct resource heartbeat_resources[] = { |
@@ -58,17 +60,20 @@ static struct platform_device smc91x_device = { | |||
58 | }, | 60 | }, |
59 | }; | 61 | }; |
60 | 62 | ||
63 | static struct r8a66597_platdata r8a66597_data = { | ||
64 | .xtal = R8A66597_PLATDATA_XTAL_12MHZ, | ||
65 | .vif = 1, | ||
66 | }; | ||
67 | |||
61 | static struct resource r8a66597_usb_host_resources[] = { | 68 | static struct resource r8a66597_usb_host_resources[] = { |
62 | [0] = { | 69 | [0] = { |
63 | .name = "r8a66597_hcd", | ||
64 | .start = 0x18040000, | 70 | .start = 0x18040000, |
65 | .end = 0x18080000 - 1, | 71 | .end = 0x18080000 - 1, |
66 | .flags = IORESOURCE_MEM, | 72 | .flags = IORESOURCE_MEM, |
67 | }, | 73 | }, |
68 | [1] = { | 74 | [1] = { |
69 | .name = "r8a66597_hcd", | ||
70 | /* Filled in by ilsel */ | 75 | /* Filled in by ilsel */ |
71 | .flags = IORESOURCE_IRQ, | 76 | .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, |
72 | }, | 77 | }, |
73 | }; | 78 | }; |
74 | 79 | ||
@@ -78,6 +83,7 @@ static struct platform_device r8a66597_usb_host_device = { | |||
78 | .dev = { | 83 | .dev = { |
79 | .dma_mask = NULL, /* don't use dma */ | 84 | .dma_mask = NULL, /* don't use dma */ |
80 | .coherent_dma_mask = 0xffffffff, | 85 | .coherent_dma_mask = 0xffffffff, |
86 | .platform_data = &r8a66597_data, | ||
81 | }, | 87 | }, |
82 | .num_resources = ARRAY_SIZE(r8a66597_usb_host_resources), | 88 | .num_resources = ARRAY_SIZE(r8a66597_usb_host_resources), |
83 | .resource = r8a66597_usb_host_resources, | 89 | .resource = r8a66597_usb_host_resources, |
diff --git a/arch/sh/configs/r7780mp_defconfig b/arch/sh/configs/r7780mp_defconfig index 943da63a3852..d393d9e5bddd 100644 --- a/arch/sh/configs/r7780mp_defconfig +++ b/arch/sh/configs/r7780mp_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.30-rc3 | 3 | # Linux kernel version: 2.6.30 |
4 | # Mon Apr 27 12:53:28 2009 | 4 | # Tue Jun 16 16:08:44 2009 |
5 | # | 5 | # |
6 | CONFIG_SUPERH=y | 6 | CONFIG_SUPERH=y |
7 | CONFIG_SUPERH32=y | 7 | CONFIG_SUPERH32=y |
@@ -20,6 +20,7 @@ CONFIG_GENERIC_CLOCKEVENTS=y | |||
20 | # CONFIG_ARCH_SUSPEND_POSSIBLE is not set | 20 | # CONFIG_ARCH_SUSPEND_POSSIBLE is not set |
21 | CONFIG_ARCH_HIBERNATION_POSSIBLE=y | 21 | CONFIG_ARCH_HIBERNATION_POSSIBLE=y |
22 | CONFIG_SYS_SUPPORTS_PCI=y | 22 | CONFIG_SYS_SUPPORTS_PCI=y |
23 | CONFIG_SYS_SUPPORTS_TMU=y | ||
23 | CONFIG_STACKTRACE_SUPPORT=y | 24 | CONFIG_STACKTRACE_SUPPORT=y |
24 | CONFIG_LOCKDEP_SUPPORT=y | 25 | CONFIG_LOCKDEP_SUPPORT=y |
25 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | 26 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y |
@@ -92,6 +93,10 @@ CONFIG_TIMERFD=y | |||
92 | CONFIG_EVENTFD=y | 93 | CONFIG_EVENTFD=y |
93 | CONFIG_SHMEM=y | 94 | CONFIG_SHMEM=y |
94 | CONFIG_AIO=y | 95 | CONFIG_AIO=y |
96 | |||
97 | # | ||
98 | # Performance Counters | ||
99 | # | ||
95 | CONFIG_VM_EVENT_COUNTERS=y | 100 | CONFIG_VM_EVENT_COUNTERS=y |
96 | CONFIG_PCI_QUIRKS=y | 101 | CONFIG_PCI_QUIRKS=y |
97 | CONFIG_COMPAT_BRK=y | 102 | CONFIG_COMPAT_BRK=y |
@@ -100,7 +105,7 @@ CONFIG_SLAB=y | |||
100 | # CONFIG_SLOB is not set | 105 | # CONFIG_SLOB is not set |
101 | CONFIG_PROFILING=y | 106 | CONFIG_PROFILING=y |
102 | CONFIG_TRACEPOINTS=y | 107 | CONFIG_TRACEPOINTS=y |
103 | # CONFIG_MARKERS is not set | 108 | CONFIG_MARKERS=y |
104 | CONFIG_OPROFILE=m | 109 | CONFIG_OPROFILE=m |
105 | CONFIG_HAVE_OPROFILE=y | 110 | CONFIG_HAVE_OPROFILE=y |
106 | # CONFIG_KPROBES is not set | 111 | # CONFIG_KPROBES is not set |
@@ -185,6 +190,7 @@ CONFIG_CPU_SUBTYPE_SH7780=y | |||
185 | CONFIG_QUICKLIST=y | 190 | CONFIG_QUICKLIST=y |
186 | CONFIG_MMU=y | 191 | CONFIG_MMU=y |
187 | CONFIG_PAGE_OFFSET=0x80000000 | 192 | CONFIG_PAGE_OFFSET=0x80000000 |
193 | CONFIG_FORCE_MAX_ZONEORDER=11 | ||
188 | CONFIG_MEMORY_START=0x08000000 | 194 | CONFIG_MEMORY_START=0x08000000 |
189 | CONFIG_MEMORY_SIZE=0x08000000 | 195 | CONFIG_MEMORY_SIZE=0x08000000 |
190 | # CONFIG_29BIT is not set | 196 | # CONFIG_29BIT is not set |
@@ -203,7 +209,6 @@ CONFIG_PAGE_SIZE_4KB=y | |||
203 | # CONFIG_PAGE_SIZE_8KB is not set | 209 | # CONFIG_PAGE_SIZE_8KB is not set |
204 | # CONFIG_PAGE_SIZE_16KB is not set | 210 | # CONFIG_PAGE_SIZE_16KB is not set |
205 | # CONFIG_PAGE_SIZE_64KB is not set | 211 | # CONFIG_PAGE_SIZE_64KB is not set |
206 | CONFIG_ENTRY_OFFSET=0x00001000 | ||
207 | CONFIG_HUGETLB_PAGE_SIZE_64K=y | 212 | CONFIG_HUGETLB_PAGE_SIZE_64K=y |
208 | # CONFIG_HUGETLB_PAGE_SIZE_256K is not set | 213 | # CONFIG_HUGETLB_PAGE_SIZE_256K is not set |
209 | # CONFIG_HUGETLB_PAGE_SIZE_1MB is not set | 214 | # CONFIG_HUGETLB_PAGE_SIZE_1MB is not set |
@@ -225,6 +230,7 @@ CONFIG_NR_QUICK=2 | |||
225 | CONFIG_UNEVICTABLE_LRU=y | 230 | CONFIG_UNEVICTABLE_LRU=y |
226 | CONFIG_HAVE_MLOCK=y | 231 | CONFIG_HAVE_MLOCK=y |
227 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y | 232 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y |
233 | CONFIG_DEFAULT_MMAP_MIN_ADDR=4096 | ||
228 | 234 | ||
229 | # | 235 | # |
230 | # Cache configuration | 236 | # Cache configuration |
@@ -258,9 +264,10 @@ CONFIG_SH_R7780MP=y | |||
258 | # | 264 | # |
259 | # Timer and clock configuration | 265 | # Timer and clock configuration |
260 | # | 266 | # |
261 | CONFIG_SH_TMU=y | 267 | CONFIG_SH_TIMER_TMU=y |
262 | CONFIG_SH_TIMER_IRQ=28 | ||
263 | CONFIG_SH_PCLK_FREQ=33333333 | 268 | CONFIG_SH_PCLK_FREQ=33333333 |
269 | CONFIG_SH_CLK_CPG=y | ||
270 | CONFIG_SH_CLK_CPG_LEGACY=y | ||
264 | # CONFIG_NO_HZ is not set | 271 | # CONFIG_NO_HZ is not set |
265 | # CONFIG_HIGH_RES_TIMERS is not set | 272 | # CONFIG_HIGH_RES_TIMERS is not set |
266 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y | 273 | CONFIG_GENERIC_CLOCKEVENTS_BUILD=y |
@@ -301,12 +308,14 @@ CONFIG_KEXEC=y | |||
301 | # CONFIG_PREEMPT_VOLUNTARY is not set | 308 | # CONFIG_PREEMPT_VOLUNTARY is not set |
302 | CONFIG_PREEMPT=y | 309 | CONFIG_PREEMPT=y |
303 | CONFIG_GUSA=y | 310 | CONFIG_GUSA=y |
311 | # CONFIG_SPARSE_IRQ is not set | ||
304 | 312 | ||
305 | # | 313 | # |
306 | # Boot options | 314 | # Boot options |
307 | # | 315 | # |
308 | CONFIG_ZERO_PAGE_OFFSET=0x00001000 | 316 | CONFIG_ZERO_PAGE_OFFSET=0x00001000 |
309 | CONFIG_BOOT_LINK_OFFSET=0x00800000 | 317 | CONFIG_BOOT_LINK_OFFSET=0x00800000 |
318 | CONFIG_ENTRY_OFFSET=0x00001000 | ||
310 | CONFIG_CMDLINE_BOOL=y | 319 | CONFIG_CMDLINE_BOOL=y |
311 | CONFIG_CMDLINE="console=ttySC0,115200 root=/dev/sda1" | 320 | CONFIG_CMDLINE="console=ttySC0,115200 root=/dev/sda1" |
312 | 321 | ||
@@ -445,7 +454,91 @@ CONFIG_EXTRA_FIRMWARE="" | |||
445 | # CONFIG_DEBUG_DEVRES is not set | 454 | # CONFIG_DEBUG_DEVRES is not set |
446 | # CONFIG_SYS_HYPERVISOR is not set | 455 | # CONFIG_SYS_HYPERVISOR is not set |
447 | # CONFIG_CONNECTOR is not set | 456 | # CONFIG_CONNECTOR is not set |
448 | # CONFIG_MTD is not set | 457 | CONFIG_MTD=y |
458 | # CONFIG_MTD_DEBUG is not set | ||
459 | # CONFIG_MTD_CONCAT is not set | ||
460 | CONFIG_MTD_PARTITIONS=y | ||
461 | # CONFIG_MTD_TESTS is not set | ||
462 | # CONFIG_MTD_REDBOOT_PARTS is not set | ||
463 | # CONFIG_MTD_CMDLINE_PARTS is not set | ||
464 | # CONFIG_MTD_AR7_PARTS is not set | ||
465 | |||
466 | # | ||
467 | # User Modules And Translation Layers | ||
468 | # | ||
469 | # CONFIG_MTD_CHAR is not set | ||
470 | # CONFIG_MTD_BLKDEVS is not set | ||
471 | # CONFIG_MTD_BLOCK is not set | ||
472 | # CONFIG_MTD_BLOCK_RO is not set | ||
473 | # CONFIG_FTL is not set | ||
474 | # CONFIG_NFTL is not set | ||
475 | # CONFIG_INFTL is not set | ||
476 | # CONFIG_RFD_FTL is not set | ||
477 | # CONFIG_SSFDC is not set | ||
478 | # CONFIG_MTD_OOPS is not set | ||
479 | |||
480 | # | ||
481 | # RAM/ROM/Flash chip drivers | ||
482 | # | ||
483 | CONFIG_MTD_CFI=y | ||
484 | # CONFIG_MTD_JEDECPROBE is not set | ||
485 | CONFIG_MTD_GEN_PROBE=y | ||
486 | # CONFIG_MTD_CFI_ADV_OPTIONS is not set | ||
487 | CONFIG_MTD_MAP_BANK_WIDTH_1=y | ||
488 | CONFIG_MTD_MAP_BANK_WIDTH_2=y | ||
489 | CONFIG_MTD_MAP_BANK_WIDTH_4=y | ||
490 | # CONFIG_MTD_MAP_BANK_WIDTH_8 is not set | ||
491 | # CONFIG_MTD_MAP_BANK_WIDTH_16 is not set | ||
492 | # CONFIG_MTD_MAP_BANK_WIDTH_32 is not set | ||
493 | CONFIG_MTD_CFI_I1=y | ||
494 | CONFIG_MTD_CFI_I2=y | ||
495 | # CONFIG_MTD_CFI_I4 is not set | ||
496 | # CONFIG_MTD_CFI_I8 is not set | ||
497 | # CONFIG_MTD_CFI_INTELEXT is not set | ||
498 | CONFIG_MTD_CFI_AMDSTD=y | ||
499 | # CONFIG_MTD_CFI_STAA is not set | ||
500 | CONFIG_MTD_CFI_UTIL=y | ||
501 | # CONFIG_MTD_RAM is not set | ||
502 | # CONFIG_MTD_ROM is not set | ||
503 | # CONFIG_MTD_ABSENT is not set | ||
504 | |||
505 | # | ||
506 | # Mapping drivers for chip access | ||
507 | # | ||
508 | CONFIG_MTD_COMPLEX_MAPPINGS=y | ||
509 | CONFIG_MTD_PHYSMAP=y | ||
510 | # CONFIG_MTD_PHYSMAP_COMPAT is not set | ||
511 | # CONFIG_MTD_PCI is not set | ||
512 | # CONFIG_MTD_INTEL_VR_NOR is not set | ||
513 | # CONFIG_MTD_PLATRAM is not set | ||
514 | |||
515 | # | ||
516 | # Self-contained MTD device drivers | ||
517 | # | ||
518 | # CONFIG_MTD_PMC551 is not set | ||
519 | # CONFIG_MTD_SLRAM is not set | ||
520 | # CONFIG_MTD_PHRAM is not set | ||
521 | # CONFIG_MTD_MTDRAM is not set | ||
522 | # CONFIG_MTD_BLOCK2MTD is not set | ||
523 | |||
524 | # | ||
525 | # Disk-On-Chip Device Drivers | ||
526 | # | ||
527 | # CONFIG_MTD_DOC2000 is not set | ||
528 | # CONFIG_MTD_DOC2001 is not set | ||
529 | # CONFIG_MTD_DOC2001PLUS is not set | ||
530 | # CONFIG_MTD_NAND is not set | ||
531 | # CONFIG_MTD_ONENAND is not set | ||
532 | |||
533 | # | ||
534 | # LPDDR flash memory drivers | ||
535 | # | ||
536 | # CONFIG_MTD_LPDDR is not set | ||
537 | |||
538 | # | ||
539 | # UBI - Unsorted block images | ||
540 | # | ||
541 | # CONFIG_MTD_UBI is not set | ||
449 | # CONFIG_PARPORT is not set | 542 | # CONFIG_PARPORT is not set |
450 | CONFIG_BLK_DEV=y | 543 | CONFIG_BLK_DEV=y |
451 | # CONFIG_BLK_CPQ_CISS_DA is not set | 544 | # CONFIG_BLK_CPQ_CISS_DA is not set |
@@ -500,10 +593,6 @@ CONFIG_BLK_DEV_SD=y | |||
500 | # CONFIG_BLK_DEV_SR is not set | 593 | # CONFIG_BLK_DEV_SR is not set |
501 | CONFIG_CHR_DEV_SG=m | 594 | CONFIG_CHR_DEV_SG=m |
502 | # CONFIG_CHR_DEV_SCH is not set | 595 | # CONFIG_CHR_DEV_SCH is not set |
503 | |||
504 | # | ||
505 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
506 | # | ||
507 | # CONFIG_SCSI_MULTI_LUN is not set | 596 | # CONFIG_SCSI_MULTI_LUN is not set |
508 | # CONFIG_SCSI_CONSTANTS is not set | 597 | # CONFIG_SCSI_CONSTANTS is not set |
509 | # CONFIG_SCSI_LOGGING is not set | 598 | # CONFIG_SCSI_LOGGING is not set |
@@ -521,6 +610,7 @@ CONFIG_SCSI_WAIT_SCAN=m | |||
521 | CONFIG_SCSI_LOWLEVEL=y | 610 | CONFIG_SCSI_LOWLEVEL=y |
522 | # CONFIG_ISCSI_TCP is not set | 611 | # CONFIG_ISCSI_TCP is not set |
523 | # CONFIG_SCSI_CXGB3_ISCSI is not set | 612 | # CONFIG_SCSI_CXGB3_ISCSI is not set |
613 | # CONFIG_SCSI_BNX2_ISCSI is not set | ||
524 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set | 614 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set |
525 | # CONFIG_SCSI_3W_9XXX is not set | 615 | # CONFIG_SCSI_3W_9XXX is not set |
526 | # CONFIG_SCSI_ACARD is not set | 616 | # CONFIG_SCSI_ACARD is not set |
@@ -529,6 +619,7 @@ CONFIG_SCSI_LOWLEVEL=y | |||
529 | # CONFIG_SCSI_AIC7XXX_OLD is not set | 619 | # CONFIG_SCSI_AIC7XXX_OLD is not set |
530 | # CONFIG_SCSI_AIC79XX is not set | 620 | # CONFIG_SCSI_AIC79XX is not set |
531 | # CONFIG_SCSI_AIC94XX is not set | 621 | # CONFIG_SCSI_AIC94XX is not set |
622 | # CONFIG_SCSI_MVSAS is not set | ||
532 | # CONFIG_SCSI_ARCMSR is not set | 623 | # CONFIG_SCSI_ARCMSR is not set |
533 | # CONFIG_MEGARAID_NEWGEN is not set | 624 | # CONFIG_MEGARAID_NEWGEN is not set |
534 | # CONFIG_MEGARAID_LEGACY is not set | 625 | # CONFIG_MEGARAID_LEGACY is not set |
@@ -543,7 +634,6 @@ CONFIG_SCSI_LOWLEVEL=y | |||
543 | # CONFIG_SCSI_IPS is not set | 634 | # CONFIG_SCSI_IPS is not set |
544 | # CONFIG_SCSI_INITIO is not set | 635 | # CONFIG_SCSI_INITIO is not set |
545 | # CONFIG_SCSI_INIA100 is not set | 636 | # CONFIG_SCSI_INIA100 is not set |
546 | # CONFIG_SCSI_MVSAS is not set | ||
547 | # CONFIG_SCSI_STEX is not set | 637 | # CONFIG_SCSI_STEX is not set |
548 | # CONFIG_SCSI_SYM53C8XX_2 is not set | 638 | # CONFIG_SCSI_SYM53C8XX_2 is not set |
549 | # CONFIG_SCSI_IPR is not set | 639 | # CONFIG_SCSI_IPR is not set |
@@ -1111,6 +1201,7 @@ CONFIG_RTC_DRV_RS5C372=y | |||
1111 | # on-CPU RTC drivers | 1201 | # on-CPU RTC drivers |
1112 | # | 1202 | # |
1113 | CONFIG_RTC_DRV_SH=y | 1203 | CONFIG_RTC_DRV_SH=y |
1204 | # CONFIG_RTC_DRV_GENERIC is not set | ||
1114 | # CONFIG_DMADEVICES is not set | 1205 | # CONFIG_DMADEVICES is not set |
1115 | # CONFIG_AUXDISPLAY is not set | 1206 | # CONFIG_AUXDISPLAY is not set |
1116 | # CONFIG_UIO is not set | 1207 | # CONFIG_UIO is not set |
@@ -1138,6 +1229,7 @@ CONFIG_FILE_LOCKING=y | |||
1138 | # CONFIG_XFS_FS is not set | 1229 | # CONFIG_XFS_FS is not set |
1139 | # CONFIG_OCFS2_FS is not set | 1230 | # CONFIG_OCFS2_FS is not set |
1140 | # CONFIG_BTRFS_FS is not set | 1231 | # CONFIG_BTRFS_FS is not set |
1232 | CONFIG_FSNOTIFY=y | ||
1141 | CONFIG_DNOTIFY=y | 1233 | CONFIG_DNOTIFY=y |
1142 | CONFIG_INOTIFY=y | 1234 | CONFIG_INOTIFY=y |
1143 | CONFIG_INOTIFY_USER=y | 1235 | CONFIG_INOTIFY_USER=y |
@@ -1145,6 +1237,7 @@ CONFIG_INOTIFY_USER=y | |||
1145 | # CONFIG_AUTOFS_FS is not set | 1237 | # CONFIG_AUTOFS_FS is not set |
1146 | # CONFIG_AUTOFS4_FS is not set | 1238 | # CONFIG_AUTOFS4_FS is not set |
1147 | CONFIG_FUSE_FS=m | 1239 | CONFIG_FUSE_FS=m |
1240 | # CONFIG_CUSE is not set | ||
1148 | 1241 | ||
1149 | # | 1242 | # |
1150 | # Caches | 1243 | # Caches |
@@ -1190,6 +1283,7 @@ CONFIG_MISC_FILESYSTEMS=y | |||
1190 | # CONFIG_BEFS_FS is not set | 1283 | # CONFIG_BEFS_FS is not set |
1191 | # CONFIG_BFS_FS is not set | 1284 | # CONFIG_BFS_FS is not set |
1192 | # CONFIG_EFS_FS is not set | 1285 | # CONFIG_EFS_FS is not set |
1286 | # CONFIG_JFFS2_FS is not set | ||
1193 | # CONFIG_CRAMFS is not set | 1287 | # CONFIG_CRAMFS is not set |
1194 | # CONFIG_SQUASHFS is not set | 1288 | # CONFIG_SQUASHFS is not set |
1195 | # CONFIG_VXFS_FS is not set | 1289 | # CONFIG_VXFS_FS is not set |
@@ -1328,41 +1422,40 @@ CONFIG_HAVE_FUNCTION_TRACER=y | |||
1328 | CONFIG_HAVE_DYNAMIC_FTRACE=y | 1422 | CONFIG_HAVE_DYNAMIC_FTRACE=y |
1329 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y | 1423 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y |
1330 | CONFIG_RING_BUFFER=y | 1424 | CONFIG_RING_BUFFER=y |
1425 | CONFIG_EVENT_TRACING=y | ||
1426 | CONFIG_CONTEXT_SWITCH_TRACER=y | ||
1331 | CONFIG_TRACING=y | 1427 | CONFIG_TRACING=y |
1332 | CONFIG_TRACING_SUPPORT=y | 1428 | CONFIG_TRACING_SUPPORT=y |
1333 | 1429 | CONFIG_FTRACE=y | |
1334 | # | ||
1335 | # Tracers | ||
1336 | # | ||
1337 | # CONFIG_FUNCTION_TRACER is not set | 1430 | # CONFIG_FUNCTION_TRACER is not set |
1338 | # CONFIG_IRQSOFF_TRACER is not set | 1431 | # CONFIG_IRQSOFF_TRACER is not set |
1339 | # CONFIG_PREEMPT_TRACER is not set | 1432 | # CONFIG_PREEMPT_TRACER is not set |
1340 | # CONFIG_SCHED_TRACER is not set | 1433 | # CONFIG_SCHED_TRACER is not set |
1341 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | 1434 | # CONFIG_ENABLE_DEFAULT_TRACERS is not set |
1342 | # CONFIG_EVENT_TRACER is not set | ||
1343 | # CONFIG_BOOT_TRACER is not set | 1435 | # CONFIG_BOOT_TRACER is not set |
1344 | # CONFIG_TRACE_BRANCH_PROFILING is not set | 1436 | CONFIG_BRANCH_PROFILE_NONE=y |
1437 | # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set | ||
1438 | # CONFIG_PROFILE_ALL_BRANCHES is not set | ||
1345 | # CONFIG_STACK_TRACER is not set | 1439 | # CONFIG_STACK_TRACER is not set |
1346 | # CONFIG_KMEMTRACE is not set | 1440 | # CONFIG_KMEMTRACE is not set |
1347 | # CONFIG_WORKQUEUE_TRACER is not set | 1441 | # CONFIG_WORKQUEUE_TRACER is not set |
1348 | # CONFIG_BLK_DEV_IO_TRACE is not set | 1442 | # CONFIG_BLK_DEV_IO_TRACE is not set |
1349 | # CONFIG_FTRACE_STARTUP_TEST is not set | 1443 | # CONFIG_RING_BUFFER_BENCHMARK is not set |
1350 | # CONFIG_DYNAMIC_DEBUG is not set | 1444 | # CONFIG_DYNAMIC_DEBUG is not set |
1351 | # CONFIG_DMA_API_DEBUG is not set | 1445 | # CONFIG_DMA_API_DEBUG is not set |
1352 | # CONFIG_SAMPLES is not set | 1446 | # CONFIG_SAMPLES is not set |
1353 | CONFIG_HAVE_ARCH_KGDB=y | 1447 | CONFIG_HAVE_ARCH_KGDB=y |
1354 | # CONFIG_KGDB is not set | 1448 | # CONFIG_KGDB is not set |
1355 | CONFIG_SH_STANDARD_BIOS=y | 1449 | # CONFIG_SH_STANDARD_BIOS is not set |
1356 | # CONFIG_EARLY_SCIF_CONSOLE is not set | 1450 | CONFIG_EARLY_SCIF_CONSOLE=y |
1357 | CONFIG_EARLY_PRINTK=y | 1451 | CONFIG_EARLY_SCIF_CONSOLE_PORT=0xffe00000 |
1452 | # CONFIG_EARLY_PRINTK is not set | ||
1358 | # CONFIG_DEBUG_BOOTMEM is not set | 1453 | # CONFIG_DEBUG_BOOTMEM is not set |
1359 | CONFIG_DEBUG_STACKOVERFLOW=y | 1454 | CONFIG_DEBUG_STACKOVERFLOW=y |
1360 | # CONFIG_DEBUG_STACK_USAGE is not set | 1455 | # CONFIG_DEBUG_STACK_USAGE is not set |
1361 | # CONFIG_4KSTACKS is not set | 1456 | # CONFIG_4KSTACKS is not set |
1362 | # CONFIG_IRQSTACKS is not set | ||
1363 | CONFIG_DUMP_CODE=y | 1457 | CONFIG_DUMP_CODE=y |
1364 | # CONFIG_SH_NO_BSS_INIT is not set | 1458 | # CONFIG_SH_NO_BSS_INIT is not set |
1365 | # CONFIG_MORE_COMPILE_OPTIONS is not set | ||
1366 | 1459 | ||
1367 | # | 1460 | # |
1368 | # Security options | 1461 | # Security options |
diff --git a/arch/sh/drivers/pci/Makefile b/arch/sh/drivers/pci/Makefile index d2ffc477549a..d6303d0e494e 100644 --- a/arch/sh/drivers/pci/Makefile +++ b/arch/sh/drivers/pci/Makefile | |||
@@ -8,6 +8,7 @@ obj-$(CONFIG_CPU_SUBTYPE_SH7751R) += pci-sh7751.o ops-sh4.o | |||
8 | obj-$(CONFIG_CPU_SUBTYPE_SH7763) += pci-sh7780.o ops-sh4.o | 8 | obj-$(CONFIG_CPU_SUBTYPE_SH7763) += pci-sh7780.o ops-sh4.o |
9 | obj-$(CONFIG_CPU_SUBTYPE_SH7780) += pci-sh7780.o ops-sh4.o | 9 | obj-$(CONFIG_CPU_SUBTYPE_SH7780) += pci-sh7780.o ops-sh4.o |
10 | obj-$(CONFIG_CPU_SUBTYPE_SH7785) += pci-sh7780.o ops-sh4.o | 10 | obj-$(CONFIG_CPU_SUBTYPE_SH7785) += pci-sh7780.o ops-sh4.o |
11 | obj-$(CONFIG_CPU_SUBTYPE_SH7786) += ops-sh7786.o | ||
11 | obj-$(CONFIG_CPU_SH5) += pci-sh5.o ops-sh5.o | 12 | obj-$(CONFIG_CPU_SH5) += pci-sh5.o ops-sh5.o |
12 | 13 | ||
13 | obj-$(CONFIG_SH_DREAMCAST) += ops-dreamcast.o fixups-dreamcast.o \ | 14 | obj-$(CONFIG_SH_DREAMCAST) += ops-dreamcast.o fixups-dreamcast.o \ |
diff --git a/arch/sh/drivers/pci/ops-dreamcast.c b/arch/sh/drivers/pci/ops-dreamcast.c index e83d0d3aabe2..16e0a1baad88 100644 --- a/arch/sh/drivers/pci/ops-dreamcast.c +++ b/arch/sh/drivers/pci/ops-dreamcast.c | |||
@@ -18,7 +18,6 @@ | |||
18 | #include <linux/pci.h> | 18 | #include <linux/pci.h> |
19 | #include <linux/module.h> | 19 | #include <linux/module.h> |
20 | #include <linux/io.h> | 20 | #include <linux/io.h> |
21 | #include <linux/irq.h> | ||
22 | #include <mach/pci.h> | 21 | #include <mach/pci.h> |
23 | 22 | ||
24 | /* | 23 | /* |
diff --git a/arch/sh/drivers/pci/ops-sh7786.c b/arch/sh/drivers/pci/ops-sh7786.c new file mode 100644 index 000000000000..48f594b9582b --- /dev/null +++ b/arch/sh/drivers/pci/ops-sh7786.c | |||
@@ -0,0 +1,134 @@ | |||
1 | /* | ||
2 | * Generic SH7786 PCI-Express operations. | ||
3 | * | ||
4 | * Copyright (C) 2009 Paul Mundt | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License v2. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | */ | ||
10 | #include <linux/kernel.h> | ||
11 | #include <linux/init.h> | ||
12 | #include <linux/pci.h> | ||
13 | #include <linux/io.h> | ||
14 | #include <linux/spinlock.h> | ||
15 | #include "pcie-sh7786.h" | ||
16 | |||
17 | enum { | ||
18 | PCI_ACCESS_READ, | ||
19 | PCI_ACCESS_WRITE, | ||
20 | }; | ||
21 | |||
22 | static DEFINE_SPINLOCK(sh7786_pcie_lock); | ||
23 | |||
24 | static int sh7786_pcie_config_access(unsigned char access_type, | ||
25 | struct pci_bus *bus, unsigned int devfn, int where, u32 *data) | ||
26 | { | ||
27 | struct pci_channel *chan = bus->sysdata; | ||
28 | int dev, func; | ||
29 | |||
30 | dev = PCI_SLOT(devfn); | ||
31 | func = PCI_FUNC(devfn); | ||
32 | |||
33 | if (bus->number > 255 || dev > 31 || func > 7) | ||
34 | return PCIBIOS_FUNC_NOT_SUPPORTED; | ||
35 | if (devfn) | ||
36 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
37 | |||
38 | /* Set the PIO address */ | ||
39 | pci_write_reg(chan, (bus->number << 24) | (dev << 19) | | ||
40 | (func << 16) | (where & ~3), SH4A_PCIEPAR); | ||
41 | |||
42 | /* Enable the configuration access */ | ||
43 | pci_write_reg(chan, (1 << 31), SH4A_PCIEPCTLR); | ||
44 | |||
45 | if (access_type == PCI_ACCESS_READ) | ||
46 | *data = pci_read_reg(chan, SH4A_PCIEPDR); | ||
47 | else | ||
48 | pci_write_reg(chan, *data, SH4A_PCIEPDR); | ||
49 | |||
50 | /* Check for master and target aborts */ | ||
51 | if (pci_read_reg(chan, SH4A_PCIEPCICONF1) & ((1 << 29) | (1 << 28))) | ||
52 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
53 | |||
54 | return PCIBIOS_SUCCESSFUL; | ||
55 | } | ||
56 | |||
57 | static int sh7786_pcie_read(struct pci_bus *bus, unsigned int devfn, | ||
58 | int where, int size, u32 *val) | ||
59 | { | ||
60 | unsigned long flags; | ||
61 | int ret; | ||
62 | u32 data; | ||
63 | |||
64 | if ((size == 2) && (where & 1)) | ||
65 | return PCIBIOS_BAD_REGISTER_NUMBER; | ||
66 | else if ((size == 4) && (where & 3)) | ||
67 | return PCIBIOS_BAD_REGISTER_NUMBER; | ||
68 | |||
69 | spin_lock_irqsave(&sh7786_pcie_lock, flags); | ||
70 | ret = sh7786_pcie_config_access(PCI_ACCESS_READ, bus, | ||
71 | devfn, where, &data); | ||
72 | if (ret != PCIBIOS_SUCCESSFUL) | ||
73 | goto out; | ||
74 | |||
75 | if (size == 1) | ||
76 | *val = (data >> ((where & 3) << 3)) & 0xff; | ||
77 | else if (size == 2) | ||
78 | *val = (data >> ((where & 2) << 3)) & 0xffff; | ||
79 | else | ||
80 | *val = data; | ||
81 | |||
82 | dev_dbg(&bus->dev, "pcie-config-read: bus=%3d devfn=0x%04x " | ||
83 | "where=0x%04x size=%d val=0x%08lx\n", bus->number, | ||
84 | devfn, where, size, (unsigned long)*val); | ||
85 | |||
86 | out: | ||
87 | spin_unlock_irqrestore(&sh7786_pcie_lock, flags); | ||
88 | return ret; | ||
89 | } | ||
90 | |||
91 | static int sh7786_pcie_write(struct pci_bus *bus, unsigned int devfn, | ||
92 | int where, int size, u32 val) | ||
93 | { | ||
94 | unsigned long flags; | ||
95 | int shift, ret; | ||
96 | u32 data; | ||
97 | |||
98 | if ((size == 2) && (where & 1)) | ||
99 | return PCIBIOS_BAD_REGISTER_NUMBER; | ||
100 | else if ((size == 4) && (where & 3)) | ||
101 | return PCIBIOS_BAD_REGISTER_NUMBER; | ||
102 | |||
103 | spin_lock_irqsave(&sh7786_pcie_lock, flags); | ||
104 | ret = sh7786_pcie_config_access(PCI_ACCESS_READ, bus, | ||
105 | devfn, where, &data); | ||
106 | if (ret != PCIBIOS_SUCCESSFUL) | ||
107 | goto out; | ||
108 | |||
109 | dev_dbg(&bus->dev, "pcie-config-write: bus=%3d devfn=0x%04x " | ||
110 | "where=0x%04x size=%d val=%08lx\n", bus->number, | ||
111 | devfn, where, size, (unsigned long)val); | ||
112 | |||
113 | if (size == 1) { | ||
114 | shift = (where & 3) << 3; | ||
115 | data &= ~(0xff << shift); | ||
116 | data |= ((val & 0xff) << shift); | ||
117 | } else if (size == 2) { | ||
118 | shift = (where & 2) << 3; | ||
119 | data &= ~(0xffff << shift); | ||
120 | data |= ((val & 0xffff) << shift); | ||
121 | } else | ||
122 | data = val; | ||
123 | |||
124 | ret = sh7786_pcie_config_access(PCI_ACCESS_WRITE, bus, | ||
125 | devfn, where, &data); | ||
126 | out: | ||
127 | spin_unlock_irqrestore(&sh7786_pcie_lock, flags); | ||
128 | return ret; | ||
129 | } | ||
130 | |||
131 | struct pci_ops sh7786_pci_ops = { | ||
132 | .read = sh7786_pcie_read, | ||
133 | .write = sh7786_pcie_write, | ||
134 | }; | ||
diff --git a/arch/sh/drivers/pci/pci.c b/arch/sh/drivers/pci/pci.c index 54d77cbb8b39..9a1c423ad167 100644 --- a/arch/sh/drivers/pci/pci.c +++ b/arch/sh/drivers/pci/pci.c | |||
@@ -53,12 +53,8 @@ static DEFINE_MUTEX(pci_scan_mutex); | |||
53 | 53 | ||
54 | void __devinit register_pci_controller(struct pci_channel *hose) | 54 | void __devinit register_pci_controller(struct pci_channel *hose) |
55 | { | 55 | { |
56 | if (request_resource(&iomem_resource, hose->mem_resource) < 0) | 56 | request_resource(&iomem_resource, hose->mem_resource); |
57 | goto out; | 57 | request_resource(&ioport_resource, hose->io_resource); |
58 | if (request_resource(&ioport_resource, hose->io_resource) < 0) { | ||
59 | release_resource(hose->mem_resource); | ||
60 | goto out; | ||
61 | } | ||
62 | 58 | ||
63 | *hose_tail = hose; | 59 | *hose_tail = hose; |
64 | hose_tail = &hose->next; | 60 | hose_tail = &hose->next; |
@@ -80,12 +76,6 @@ void __devinit register_pci_controller(struct pci_channel *hose) | |||
80 | pcibios_scanbus(hose); | 76 | pcibios_scanbus(hose); |
81 | mutex_unlock(&pci_scan_mutex); | 77 | mutex_unlock(&pci_scan_mutex); |
82 | } | 78 | } |
83 | |||
84 | return; | ||
85 | |||
86 | out: | ||
87 | printk(KERN_WARNING | ||
88 | "Skipping PCI bus scan due to resource conflict\n"); | ||
89 | } | 79 | } |
90 | 80 | ||
91 | static int __init pcibios_init(void) | 81 | static int __init pcibios_init(void) |
diff --git a/arch/sh/drivers/pci/pcie-sh7786.h b/arch/sh/drivers/pci/pcie-sh7786.h new file mode 100644 index 000000000000..c655290a7750 --- /dev/null +++ b/arch/sh/drivers/pci/pcie-sh7786.h | |||
@@ -0,0 +1,589 @@ | |||
1 | /* | ||
2 | * SH7786 PCI-Express controller definitions. | ||
3 | * | ||
4 | * Copyright (C) 2008, 2009 Renesas Technology Corp. | ||
5 | * All rights reserved. | ||
6 | * | ||
7 | * This file is subject to the terms and conditions of the GNU General Public | ||
8 | * License. See the file "COPYING" in the main directory of this archive | ||
9 | * for more details. | ||
10 | */ | ||
11 | #ifndef __PCI_SH7786_H | ||
12 | #define __PCI_SH7786_H | ||
13 | |||
14 | /* PCIe bus-0(x4) on SH7786 */ // Rev1.171 | ||
15 | #define SH4A_PCIE_SPW_BASE 0xFE000000 /* spw config address for controller 0 */ | ||
16 | #define SH4A_PCIE_SPW_BASE1 0xFE200000 /* spw config address for controller 1 (Rev1.14)*/ | ||
17 | #define SH4A_PCIE_SPW_BASE2 0xFCC00000 /* spw config address for controller 2 (Rev1.171)*/ | ||
18 | #define SH4A_PCIE_SPW_BASE_LEN 0x00080000 | ||
19 | |||
20 | #define SH4A_PCI_CNFG_BASE 0xFE040000 /* pci config address for controller 0 */ | ||
21 | #define SH4A_PCI_CNFG_BASE1 0xFE240000 /* pci config address for controller 1 (Rev1.14)*/ | ||
22 | #define SH4A_PCI_CNFG_BASE2 0xFCC40000 /* pci config address for controller 2 (Rev1.171)*/ | ||
23 | #define SH4A_PCI_CNFG_BASE_LEN 0x00040000 | ||
24 | |||
25 | #define SH4A_PCIPIO_ADDR_OFFSET 0x000001c0 /* offset to pci config_address */ | ||
26 | #define SH4A_PCIPIO_DATA_OFFSET 0x00000220 /* offset to pci config_data */ | ||
27 | |||
28 | /* | ||
29 | * for PEX8111(Max Payload Size=128B,PCIIO_SIZE=64K), | ||
30 | * for other(Max Payload Size=4096B,PCIIO_SIZE=8M) | ||
31 | */ | ||
32 | |||
33 | /* PCI0-0: PCI I/O space */ | ||
34 | #define SH4A_PCIIO_BASE 0xFD000000 /* PCI I/O for controller 0 */ | ||
35 | #define SH4A_PCIIO_BASE1 0xFD800000 /* PCI I/O for controller 1 (Rev1.14)*/ | ||
36 | #define SH4A_PCIIO_BASE2 0xFC800000 /* PCI I/O for controller 2 (Rev1.171)*/ | ||
37 | |||
38 | #define SH4A_PCIIO_SIZE64 0x00010000 /* PLX allows only 64K */ | ||
39 | #define SH4A_PCIIO_SIZE 0x00800000 /* 8M */ | ||
40 | #define SH4A_PCIIO_SIZE2 0x00400000 /* 4M (Rev1.171)*/ | ||
41 | |||
42 | /* PCI0-1: PCI memory space 29-bit address */ | ||
43 | #define SH4A_PCIMEM_BASE 0x10000000 | ||
44 | #define SH4A_PCIMEM_SIZE 0x04000000 /* 64M */ | ||
45 | |||
46 | /* PCI0-2: PCI memory space 32-bit address */ | ||
47 | #define SH4A_PCIMEM_BASEA 0xC0000000 /* for controller 0 */ | ||
48 | #define SH4A_PCIMEM_BASEA1 0xA0000000 /* for controller 1 (Rev1.14)*/ | ||
49 | #define SH4A_PCIMEM_BASEA2 0x80000000 /* for controller 2 (Rev1.171)*/ | ||
50 | #define SH4A_PCIMEM_SIZEA 0x20000000 /* 512M */ | ||
51 | |||
52 | /* PCI0: PCI memory target transfer 32-bit address translation value(Rev1.11T)*/ | ||
53 | #define SH4A_PCIBMSTR_TRANSLATION 0x20000000 | ||
54 | |||
55 | #define SH4A_PCI_DEVICE_ID 0x0002 | ||
56 | #define SH4A_PCI_VENDOR_ID 0x1912 | ||
57 | |||
58 | // PCI compatible 000-03f | ||
59 | #define PCI_CMD 0x004 | ||
60 | #define PCI_RID 0x008 | ||
61 | #define PCI_IBAR 0x010 | ||
62 | #define PCI_MBAR0 0x014 | ||
63 | #define PCI_MBAR1 0x018 | ||
64 | |||
65 | /* PCI power management/MSI/capablity 040-0ff */ | ||
66 | /* PCIE extended 100-fff */ | ||
67 | |||
68 | /* SH7786 device identification */ // Rev1.171 | ||
69 | #define SH4A_PVR (0xFF000030) | ||
70 | #define SH4A_PVR_SHX3 (0x10400000) | ||
71 | #define SH4A_PRR (0xFF000044) | ||
72 | #define SH4A_PRR_SH7786 (0x00000400) // Rev1.171 | ||
73 | |||
74 | /* SPVCR0 */ | ||
75 | #define SH4A_PCIEVCR0 (0x000000) /* R - 0x0000 0000 32 */ | ||
76 | #define BITS_TOP_MB (24) | ||
77 | #define MASK_TOP_MB (0xff<<BITS_TOP_MB) | ||
78 | #define BITS_BOT_MB (16) | ||
79 | #define MASK_BOT_MB (0xff<<BITS_BOT_MB) | ||
80 | #define BITS_VC_ID (0) | ||
81 | #define MASK_VC_ID (0xffff<<BITS_VC_ID) | ||
82 | |||
83 | /* SPVCR1 */ | ||
84 | #define SH4A_PCIEVCR1 (0x000004) /* R - 0x0000 0000 32*/ | ||
85 | #define BITS_BADOPC (5) /* 5 BADOPC 0 R/W */ | ||
86 | #define MASK_BADOPC (1<<BITS_BADOPC) | ||
87 | #define BITS_BADDEST (4) /*4 BADDEST 0 R/W */ | ||
88 | #define MASK_BADDEST (1<<BITS_BADDEST) | ||
89 | #define BITS_UNSOLRESP (3) /* 3 UNSOLRESP 0 R/W */ | ||
90 | #define MASK_UNSOLRESP (1<<BITS_UNSOLRESP) | ||
91 | #define BITS_ERRSNT (1) /* 1 ERRSNT 0 */ | ||
92 | #define MASK_ERRSNT (1<<BITS_ERRSNT) | ||
93 | #define BITS_ERRRCV (0) /* 0 ERRRCV 0 */ | ||
94 | #define MASK_ERRRCV (1<<BITS_ERRRCV) | ||
95 | |||
96 | /* PCIEECR */ | ||
97 | #define SH4A_PCIEECR (0x000008) /* R/W - 0x0000 0000 32 */ | ||
98 | #define BITS_ENBL (0) /* 0 ENBL 0 R/W */ | ||
99 | #define MASK_ENBL (1<<BITS_ENBL) | ||
100 | |||
101 | /* PCIEPAR */ | ||
102 | #define SH4A_PCIEPAR (0x000010) /* R/W - 0x0000 0000 32 */ | ||
103 | #define BITS_BN (24) | ||
104 | #define MASK_BN (0xff<<BITS_BN) | ||
105 | #define BITS_DN (19) | ||
106 | #define MASK_DN (0x1f<<BITS_DN) | ||
107 | #define BITS_FN (16) | ||
108 | #define MASK_FN (0x7<<BITS_FN) | ||
109 | #define BITS_EREGNO (8) | ||
110 | #define MASK_EREGNO (0xff<<BITS_EREGNO) | ||
111 | #define BITS_REGNO (2) | ||
112 | #define MASK_REGNO (0x3f<<BITS_REGNO) | ||
113 | |||
114 | /* PCIEPCTLR */ | ||
115 | #define SH4A_PCIEPCTLR (0x000018) /* R/W - 0x0000 0000 32 */ | ||
116 | #define BITS_CCIE (31) /* 31 CCIE */ | ||
117 | #define MASK_CCIE (1<<BITS_CCIE) | ||
118 | #define BITS_TYPE (8) | ||
119 | #define MASK_TYPE (1<<BITS_TYPE) | ||
120 | #define BITS_C_VC (0) | ||
121 | #define MASK_C_VC (1<<BITS_C_VC) | ||
122 | |||
123 | /* PCIEPDR */ | ||
124 | #define SH4A_PCIEPDR (0x000020) /* R/W - 0x0000 0000 32 */ | ||
125 | #define BITS_PDR (0) | ||
126 | #define MASK_PDR (0xffffffff<<BITS_PDR) | ||
127 | |||
128 | /* PCIEMSGALR */ | ||
129 | #define SH4A_PCIEMSGALR (0x000030) /* R/W - 0x0000 0000 32 */ | ||
130 | #define BITS_MSGADRL (0) | ||
131 | #define MASK_MSGADRL (0xffffffff<<BITS_MSGADRL) | ||
132 | |||
133 | /* PCIEMSGAHR */ | ||
134 | #define SH4A_PCIEMSGAHR (0x000034) /* R/W - 0x0000 0000 32 */ | ||
135 | #define BITS_MSGADRH (0) | ||
136 | #define MASK_MSGADRH (0xffffffff<<BITS_MSGADRH) | ||
137 | |||
138 | /* PCIEMSGCTLR */ | ||
139 | #define SH4A_PCIEMSGCTLR (0x000038) /* R/W - 0x0000 0000 32 */ | ||
140 | #define BITS_MSGIE (31) | ||
141 | #define MASK_MSGIE (1<<BITS_MSGIE) | ||
142 | #define BITS_MROUTE (16) | ||
143 | #define MASK_MROUTE (0x7<<BITS_MROUTE) | ||
144 | #define BITS_MCODE (8) | ||
145 | #define MASK_MCODE (0xff<<BITS_MCODE) | ||
146 | #define BITS_M_VC (0) | ||
147 | #define MASK_M_VC (1<<BITS_M_VC) | ||
148 | |||
149 | /* PCIEMSG */ | ||
150 | #define SH4A_PCIEMSG (0x000040) /* W - - 32 */ | ||
151 | #define BITS_MDATA (0) | ||
152 | #define MASK_MDATA (0xffffffff<<BITS_MDATA) | ||
153 | |||
154 | /* PCIEPHYCTLR */ | ||
155 | #define SH4A_PCIEPHYCTLR (0x010000) /* R/W - 0x0000 0000 32 */ | ||
156 | #define BITS_CKE (0) | ||
157 | #define MASK_CKE (1<<BITS_CKE) | ||
158 | |||
159 | /* PCIERMSGIER */ | ||
160 | #define SH4A_PCIERMSGIER (0x004040) /* R/W - 0x0000 0000 32 */ | ||
161 | |||
162 | /* PCIEPHYADRR */ | ||
163 | #define SH4A_PCIEPHYADRR (0x010004) /* R/W - 0x0000 0000 32 */ | ||
164 | #define BITS_ACK (24) // Rev1.171 | ||
165 | #define MASK_ACK (1<<BITS_ACK) // Rev1.171 | ||
166 | #define BITS_CMD (16) // Rev1.171 | ||
167 | #define MASK_CMD (0x03<<BITS_CMD) // Rev1.171 | ||
168 | #define BITS_LANE (8) | ||
169 | #define MASK_LANE (0x0f<<BITS_LANE) | ||
170 | #define BITS_ADR (0) | ||
171 | #define MASK_ADR (0xff<<BITS_ADR) | ||
172 | |||
173 | /* PCIEPHYDINR */ // Rev1.171 start. | ||
174 | #define SH4A_PCIEPHYDINR (0x010008) /* R/W - 0x0000 0000 32 */ | ||
175 | |||
176 | /* PCIEPHYDOUTR */ | ||
177 | #define SH4A_PCIEPHYDOUTR (0x01000C) /* R/W - 0x0000 0000 32 */ | ||
178 | |||
179 | /* PCIEPHYSR */ | ||
180 | #define SH4A_PCIEPHYSR (0x010010) /* R/W - 0x0000 0000 32 */ // Rev1.171 end. | ||
181 | |||
182 | /* PCIEPHYDATAR */ | ||
183 | #define SH4A_PCIEPHYDATAR (0x00008) /* R/W - 0xxxxx xxxx 32 */ | ||
184 | #define BITS_DATA (0) | ||
185 | #define MASK_DATA (0xffffffff<<BITS_DATA) | ||
186 | |||
187 | /* PCIETCTLR */ | ||
188 | #define SH4A_PCIETCTLR (0x020000) /* R/W R/W 0x0000 0000 32 */ | ||
189 | #define BITS_CFINT (0) | ||
190 | #define MASK_CFINT (1<<BITS_CFINT) | ||
191 | |||
192 | /* PCIETSTR */ | ||
193 | #define SH4A_PCIETSTR (0x020004) /* R/W R/W 0x0000 0000 32 */ | ||
194 | |||
195 | /* PCIEINTR */ | ||
196 | #define SH4A_PCIEINTR (0x020008) /* R/W R/W 0x0000 0000 32 */ | ||
197 | #define BITS_INT_RX_ERP (31) | ||
198 | #define MASK_INT_RX_ERP (1<<BITS_INT_RX_ERP) | ||
199 | #define BITS_INT_RX_VCX_Posted (30) | ||
200 | #define MASK_INT_RX_VCX_Posted (1<<BITS_INT_RX_VCX_Posted) | ||
201 | #define BITS_INT_RX_VCX_NonPosted (29) | ||
202 | #define MASK_INT_RX_VCX_NonPosted (1<<BITS_INT_RX_VCX_NonPosted) | ||
203 | #define BITS_INT_RX_VCX_CPL (28) | ||
204 | #define MASK_INT_RX_VCX_CPL (1<<BITS_INT_RX_VCX_CPL) | ||
205 | #define BITS_INT_TX_VCX_Posted (26) | ||
206 | #define MASK_INT_TX_VCX_Posted (1<<BITS_INT_TX_VCX_Posted) | ||
207 | #define BITS_INT_TX_VCX_NonPosted (25) | ||
208 | #define MASK_INT_TX_VCX_NonPosted (1<<BITS_INT_TX_VCX_NonPosted) | ||
209 | #define BITS_INT_TX_VCX_CPL (24) | ||
210 | #define MASK_INT_TX_VCX_CPL (1<<BITS_INT_TX_VCX_CPL) | ||
211 | #define BITS_INT_RX_VC0_Posted (22) | ||
212 | #define MASK_INT_RX_VC0_Posted (1<<BITS_INT_RX_VC0_Posted) | ||
213 | #define BITS_INT_RX_VC0_NonPosted (21) | ||
214 | #define MASK_INT_RX_VC0_NonPosted (1<<BITS_INT_RX_VC0_NonPosted) | ||
215 | #define BITS_INT_RX_VC0_CPL (20) | ||
216 | #define MASK_INT_RX_VC0_CPL (1<<BITS_INT_RX_VC0_CPL) | ||
217 | #define BITS_INT_TX_VC0_Posted (18) | ||
218 | #define MASK_INT_TX_VC0_Posted (1<<BITS_INT_TX_VC0_Posted) | ||
219 | #define BITS_INT_TX_VC0_NonPosted (17) | ||
220 | #define MASK_INT_TX_VC0_NonPosted (1<<BITS_INT_TX_VC0_NonPosted) | ||
221 | #define BITS_INT_TX_VC0_CPL (16) | ||
222 | #define MASK_INT_TX_VC0_CPL (1<<BITS_INT_TX_VC0_CPL) | ||
223 | #define BITS_INT_RX_CTRL (15) | ||
224 | #define MASK_INT_RX_CTRL (1<<BITS_INT_RX_CTRL) | ||
225 | #define BITS_INT_TX_CTRL (14) | ||
226 | #define MASK_INT_TX_CTRL (1<<BITS_INT_TX_CTRL) | ||
227 | #define BITS_INTTL (11) | ||
228 | #define MASK_INTTL (1<<BITS_INTTL) | ||
229 | #define BITS_INTDL (10) | ||
230 | #define MASK_INTDL (1<<BITS_INTDL) | ||
231 | #define BITS_INTMAC (9) | ||
232 | #define MASK_INTMAC (1<<BITS_INTMAC) | ||
233 | #define BITS_INTPM (8) | ||
234 | #define MASK_INTPM (1<<BITS_INTPM) | ||
235 | |||
236 | /* PCIEINTER */ | ||
237 | #define SH4A_PCIEINTER (0x02000C) /* R/W R/W 0x0000 0000 32 */ | ||
238 | #define BITS_INT_RX_ERP (31) | ||
239 | #define MASK_INT_RX_ERP (1<<BITS_INT_RX_ERP) | ||
240 | #define BITS_INT_RX_VCX_Posted (30) | ||
241 | #define MASK_INT_RX_VCX_Posted (1<<BITS_INT_RX_VCX_Posted) | ||
242 | #define BITS_INT_RX_VCX_NonPosted (29) | ||
243 | #define MASK_INT_RX_VCX_NonPosted (1<<BITS_INT_RX_VCX_NonPosted) | ||
244 | #define BITS_INT_RX_VCX_CPL (28) | ||
245 | #define MASK_INT_RX_VCX_CPL (1<<BITS_INT_RX_VCX_CPL) | ||
246 | #define BITS_INT_TX_VCX_Posted (26) | ||
247 | #define MASK_INT_TX_VCX_Posted (1<<BITS_INT_TX_VCX_Posted) | ||
248 | #define BITS_INT_TX_VCX_NonPosted (25) | ||
249 | #define MASK_INT_TX_VCX_NonPosted (1<<BITS_INT_TX_VCX_NonPosted) | ||
250 | #define BITS_INT_TX_VCX_CPL (24) | ||
251 | #define MASK_INT_TX_VCX_CPL (1<<BITS_INT_TX_VCX_CPL) | ||
252 | #define BITS_INT_RX_VC0_Posted (22) | ||
253 | #define MASK_INT_RX_VC0_Posted (1<<BITS_INT_RX_VC0_Posted) | ||
254 | #define BITS_INT_RX_VC0_NonPosted (21) | ||
255 | #define MASK_INT_RX_VC0_NonPosted (1<<BITS_INT_RX_VC0_NonPosted) | ||
256 | #define BITS_INT_RX_VC0_CPL (20) | ||
257 | #define MASK_INT_RX_VC0_CPL (1<<BITS_INT_RX_VC0_CPL) | ||
258 | #define BITS_INT_TX_VC0_Posted (18) | ||
259 | #define MASK_INT_TX_VC0_Posted (1<<BITS_INT_TX_VC0_Posted) | ||
260 | #define BITS_INT_TX_VC0_NonPosted (17) | ||
261 | #define MASK_INT_TX_VC0_NonPosted (1<<BITS_INT_TX_VC0_NonPosted) | ||
262 | #define BITS_INT_TX_VC0_CPL (16) | ||
263 | #define MASK_INT_TX_VC0_CPL (1<<BITS_INT_TX_VC0_CPL) | ||
264 | #define BITS_INT_RX_CTRL (15) | ||
265 | #define MASK_INT_RX_CTRL (1<<BITS_INT_RX_CTRL) | ||
266 | #define BITS_INT_TX_CTRL (14) | ||
267 | #define MASK_INT_TX_CTRL (1<<BITS_INT_TX_CTRL) | ||
268 | #define BITS_INTTL (11) | ||
269 | #define MASK_INTTL (1<<BITS_INTTL) | ||
270 | #define BITS_INTDL (10) | ||
271 | #define MASK_INTDL (1<<BITS_INTDL) | ||
272 | #define BITS_INTMAC (9) | ||
273 | #define MASK_INTMAC (1<<BITS_INTMAC) | ||
274 | #define BITS_INTPM (8) | ||
275 | #define MASK_INTPM (1<<BITS_INTPM) | ||
276 | |||
277 | /* PCIEAIR */ | ||
278 | #define SH4A_PCIEAIR (SH4A_PCIE_BASE + 0x020010) /* R/W R/W 0xxxxx xxxx 32 */ | ||
279 | |||
280 | /* PCIECIR */ | ||
281 | #define SH4A_PCIECIR (SH4A_PCIE_BASE) /* R/W R/W 0xxxxx xxxx 32 */ | ||
282 | |||
283 | /* PCIEERRFR */ // Rev1.18 | ||
284 | #define SH4A_PCIEERRFR (0x020020) /* R/W R/W 0xxxxx xxxx 32 */ // Rev1.18 | ||
285 | // Rev1.18 | ||
286 | /* PCIELAR0 */ | ||
287 | #define SH4A_PCIELAR0 (0x020200) /* R/W R/W 0x0000 0000 32 */ | ||
288 | #define BITS_LARn (20) | ||
289 | #define MASK_LARn (0xfff<<BITS_LARn) | ||
290 | |||
291 | #define SH4A_PCIE_020204 (0x020204) /* R/W R/W 0x0000 0000 32 */ | ||
292 | |||
293 | /* PCIELAMR0 */ | ||
294 | #define SH4A_PCIELAMR0 (0x020208) /* R/W R/W 0x0000 0000 32 */ | ||
295 | #define BITS_LAMRn (20) | ||
296 | #define MASK_LAMRn (0x1ff<<BITS_LAMRn) | ||
297 | #define BITS_LAREn (0) | ||
298 | #define MASK_LAREn (0x1<<BITS_LAREn) | ||
299 | |||
300 | /* PCIECSCR0 */ | ||
301 | #define SH4A_PCIECSCR0 (0x020210) /* R/W R/W 0x0000 0000 32 */ | ||
302 | #define BITS_RANGE (2) | ||
303 | #define MASK_RANGE (0x7<<BITS_RANGE) | ||
304 | #define BITS_SNPMD (0) | ||
305 | #define MASK_SNPMD (0x3<<BITS_SNPMD) | ||
306 | |||
307 | /* PCIECSAR0 */ | ||
308 | #define SH4A_PCIECSAR0 (0x020214) /* R/W R/W 0x0000 0000 32 */ | ||
309 | #define BITS_CSADR (0) | ||
310 | #define MASK_CSADR (0xffffffff<<BITS_CSADR) | ||
311 | |||
312 | /* PCIESTCTLR0 */ | ||
313 | #define SH4A_PCIESTCTLR0 (0x020218) /* R/W R/W 0x0000 0000 32 */ | ||
314 | #define BITS_SHPRI (8) | ||
315 | #define MASK_SHPRI (0x0f<<BITS_SHPRI) | ||
316 | |||
317 | #define SH4A_PCIE_020224 (0x020224) /* R/W R/W 0x0000 0000 32 */ | ||
318 | |||
319 | #define SH4A_PCIELAR1 (0x020220) /* R/W R/W 0x0000 0000 32 */ | ||
320 | #define SH4A_PCIELAMR1 (0x020228) /* R/W R/W 0x0000 0000 32 */ | ||
321 | #define SH4A_PCIECSCR1 (0x020230) /* R/W R/W 0x0000 0000 32 */ | ||
322 | #define SH4A_PCIECSAR1 (0x020234) /* R/W R/W 0x0000 0000 32 */ | ||
323 | #define SH4A_PCIESTCTLR1 (0x020238) /* R/W R/W 0x0000 0000 32 */ | ||
324 | |||
325 | #define SH4A_PCIELAR2 (0x020240) /* R/W R/W 0x0000 0000 32 */ | ||
326 | #define SH4A_PCIE_020244 (0x020244) /* R/W R/W 0x0000 0000 32 */ | ||
327 | #define SH4A_PCIELAMR2 (0x020248) /* R/W R/W 0x0000 0000 32 */ | ||
328 | #define SH4A_PCIECSCR2 (0x020250) /* R/W R/W 0x0000 0000 32 */ | ||
329 | #define SH4A_PCIECSAR2 (0x020254) /* R/W R/W 0x0000 0000 32 */ | ||
330 | #define SH4A_PCIESTCTLR2 (0x020258) /* R/W R/W 0x0000 0000 32 */ | ||
331 | |||
332 | #define SH4A_PCIELAR3 (0x020260) /* R/W R/W 0x0000 0000 32 */ | ||
333 | #define SH4A_PCIE_020264 (0x020264) /* R/W R/W 0x0000 0000 32 */ | ||
334 | #define SH4A_PCIELAMR3 (0x020268) /* R/W R/W 0x0000 0000 32 */ | ||
335 | #define SH4A_PCIECSCR3 (0x020270) /* R/W R/W 0x0000 0000 32 */ | ||
336 | #define SH4A_PCIECSAR3 (0x020274) /* R/W R/W 0x0000 0000 32 */ | ||
337 | #define SH4A_PCIESTCTLR3 (0x020278) /* R/W R/W 0x0000 0000 32 */ | ||
338 | |||
339 | #define SH4A_PCIELAR4 (0x020280) /* R/W R/W 0x0000 0000 32 */ | ||
340 | #define SH4A_PCIE_020284 (0x020284) /* R/W R/W 0x0000 0000 32 */ | ||
341 | #define SH4A_PCIELAMR4 (0x020288) /* R/W R/W 0x0000 0000 32 */ | ||
342 | #define SH4A_PCIECSCR4 (0x020290) /* R/W R/W 0x0000 0000 32 */ | ||
343 | #define SH4A_PCIECSAR4 (0x020294) /* R/W R/W 0x0000 0000 32 */ | ||
344 | #define SH4A_PCIESTCTLR4 (0x020298) /* R/W R/W 0x0000 0000 32 */ | ||
345 | |||
346 | #define SH4A_PCIELAR5 (0x0202A0) /* R/W R/W 0x0000 0000 32 */ | ||
347 | #define SH4A_PCIE_0202A4 (0x0202A4) /* R/W R/W 0x0000 0000 32 */ | ||
348 | #define SH4A_PCIELAMR5 (0x0202A8) /* R/W R/W 0x0000 0000 32 */ | ||
349 | #define SH4A_PCIECSCR5 (0x0202B0) /* R/W R/W 0x0000 0000 32 */ | ||
350 | #define SH4A_PCIECSAR5 (0x0202B4) /* R/W R/W 0x0000 0000 32 */ | ||
351 | #define SH4A_PCIESTCTLR5 (0x0202B8) /* R/W R/W 0x0000 0000 32 */ | ||
352 | |||
353 | /* PCIEPARL0 */ | ||
354 | #define SH4A_PCIEPARL0 (0x020400) /* R/W R/W 0x0000 0000 32 */ | ||
355 | #define BITS_PAL (18) | ||
356 | #define MASK_PAL (0x3fff<<BITS_PAL) | ||
357 | |||
358 | /* PCIEPARH0 */ | ||
359 | #define SH4A_PCIEPARH0 (0x020404) /* R/W R/W 0x0000 0000 32 */ | ||
360 | #define BITS_PAH (0) | ||
361 | #define MASK_PAH (0xffffffff<<BITS_PAH) | ||
362 | |||
363 | /* PCIEPAMR0 */ | ||
364 | #define SH4A_PCIEPAMR0 (0x020408) /* R/W R/W 0x0000 0000 32 */ | ||
365 | #define BITS_PAM (18) | ||
366 | #define MASK_PAM (0x3fff<<BITS_PAM) | ||
367 | |||
368 | /* PCIEPTCTLR0 */ | ||
369 | #define SH4A_PCIEPTCTLR0 (0x02040C) /* R/W R/W 0x0000 0000 32 */ | ||
370 | #define BITS_PARE (31) | ||
371 | #define MASK_PARE (0x1<<BITS_PARE) | ||
372 | #define BITS_TC (20) | ||
373 | #define MASK_TC (0x7<<BITS_TC) | ||
374 | #define BITS_T_VC (16) | ||
375 | #define MASK_T_VC (0x1<<BITS_T_VC) | ||
376 | #define BITS_LOCK (12) | ||
377 | #define MASK_LOCK (0x1<<BITS_LOCK) | ||
378 | #define BITS_SPC (8) | ||
379 | #define MASK_SPC (0x1<<BITS_SPC) | ||
380 | |||
381 | #define SH4A_PCIEPARL1 (0x020420) /* R/W R/W 0x0000 0000 32 */ | ||
382 | #define SH4A_PCIEPARH1 (0x020424) /* R/W R/W 0x0000 0000 32 */ | ||
383 | #define SH4A_PCIEPAMR1 (0x020428) /* R/W R/W 0x0000 0000 32 */ | ||
384 | #define SH4A_PCIEPTCTLR1 (0x02042C) /* R/W R/W 0x0000 0000 32 */ | ||
385 | #define SH4A_PCIEPARL2 (0x020440) /* R/W R/W 0x0000 0000 32 */ | ||
386 | #define SH4A_PCIEPARH2 (0x020444) /* R/W R/W 0x0000 0000 32 */ | ||
387 | #define SH4A_PCIEPAMR2 (0x020448) /* R/W R/W 0x0000 0000 32 */ | ||
388 | #define SH4A_PCIEPTCTLR2 (0x02044C) /* R/W R/W 0x0000 0000 32 */ | ||
389 | #define SH4A_PCIEPARL3 (0x020460) /* R/W R/W 0x0000 0000 32 */ | ||
390 | #define SH4A_PCIEPARH3 (0x020464) /* R/W R/W 0x0000 0000 32 */ | ||
391 | #define SH4A_PCIEPAMR3 (0x020468) /* R/W R/W 0x0000 0000 32 */ | ||
392 | #define SH4A_PCIEPTCTLR3 (0x02046C) /* R/W R/W 0x0000 0000 32 */ | ||
393 | #define SH4A_PCIEPARL4 (0x020480) /* R/W R/W 0x0000 0000 32 */ | ||
394 | #define SH4A_PCIEPARH4 (0x020484) /* R/W R/W 0x0000 0000 32 */ | ||
395 | #define SH4A_PCIEPAMR4 (0x020488) /* R/W R/W 0x0000 0000 32 */ | ||
396 | #define SH4A_PCIEPTCTLR4 (0x02048C) /* R/W R/W 0x0000 0000 32 */ | ||
397 | #define SH4A_PCIEPARL5 (0x0204A0) /* R/W R/W 0x0000 0000 32 */ | ||
398 | #define SH4A_PCIEPARH5 (0x0204A4) /* R/W R/W 0x0000 0000 32 */ | ||
399 | #define SH4A_PCIEPAMR5 (0x0204A8) /* R/W R/W 0x0000 0000 32 */ | ||
400 | #define SH4A_PCIEPTCTLR5 (0x0204AC) /* R/W R/W 0x0000 0000 32 */ | ||
401 | #define SH4A_PCIEDMAOR (0x021000) /* R/W R/W 0x0000 0000 32 */ | ||
402 | #define SH4A_PCIEDMSAR0 (0x021100) /* R/W R/W 0x0000 0000 32 */ | ||
403 | #define SH4A_PCIEDMSAHR0 (0x021104) /* R/W R/W 0x0000 0000 32 */ | ||
404 | #define SH4A_PCIEDMDAR0 (0x021108) /* R/W R/W 0x0000 0000 32 */ | ||
405 | #define SH4A_PCIEDMDAHR0 (0x02110C) /* R/W R/W 0x0000 0000 32 */ | ||
406 | #define SH4A_PCIEDMBCNTR0 (0x021110) /* R/W R/W 0x0000 0000 32 */ | ||
407 | #define SH4A_PCIEDMSBCNTR0 (0x021114) /* R/W R/W 0x0000 0000 32 */ | ||
408 | #define SH4A_PCIEDMSTRR0 (0x021118) /* R/W R/W 0x0000 0000 32 */ | ||
409 | #define SH4A_PCIEDMCCAR0 (0x02111C) /* R/W R/W 0x0000 0000 32 */ | ||
410 | #define SH4A_PCIEDMCCR0 (0x021120) /* R/W R/W 0x0000 0000 32 */ | ||
411 | #define SH4A_PCIEDMCC2R0 (0x021124) /* R/W R/W 0x0000 0000 - */ | ||
412 | #define SH4A_PCIEDMCCCR0 (0x021128) /* R/W R/W 0x0000 0000 32 */ | ||
413 | #define SH4A_PCIEDMSAR1 (0x021140) /* R/W R/W 0x0000 0000 32 */ | ||
414 | #define SH4A_PCIEDMSAHR1 (0x021144) /* R/W R/W 0x0000 0000 32 */ | ||
415 | #define SH4A_PCIEDMDAR1 (0x021148) /* R/W R/W 0x0000 0000 32 */ | ||
416 | #define SH4A_PCIEDMDAHR1 (0x02114C) /* R/W R/W 0x0000 0000 32 */ | ||
417 | #define SH4A_PCIEDMBCNTR1 (0x021150) /* R/W R/W 0x0000 0000 32 */ | ||
418 | #define SH4A_PCIEDMSBCNTR1 (0x021154) /* R/W R/W 0x0000 0000 32 */ | ||
419 | #define SH4A_PCIEDMSTRR1 (0x021158) /* R/W R/W 0x0000 0000 32 */ | ||
420 | #define SH4A_PCIEDMCCAR1 (0x02115C) /* R/W R/W 0x0000 0000 32 */ | ||
421 | #define SH4A_PCIEDMCCR1 (0x021160) /* R/W R/W 0x0000 0000 32 */ | ||
422 | #define SH4A_PCIEDMCC2R1 (0x021164) /* R/W R/W 0x0000 0000 - */ | ||
423 | #define SH4A_PCIEDMCCCR1 (0x021168) /* R/W R/W 0x0000 0000 32 */ | ||
424 | #define SH4A_PCIEDMSAR2 (0x021180) /* R/W R/W 0x0000 0000 32 */ | ||
425 | #define SH4A_PCIEDMSAHR2 (0x021184) /* R/W R/W 0x0000 0000 32 */ | ||
426 | #define SH4A_PCIEDMDAR2 (0x021188) /* R/W R/W 0x0000 0000 32 */ | ||
427 | #define SH4A_PCIEDMDAHR2 (0x02118C) /* R/W R/W 0x0000 0000 32 */ | ||
428 | #define SH4A_PCIEDMBCNTR2 (0x021190) /* R/W R/W 0x0000 0000 32 */ | ||
429 | #define SH4A_PCIEDMSBCNTR2 (0x021194) /* R/W R/W 0x0000 0000 32 */ | ||
430 | #define SH4A_PCIEDMSTRR2 (0x021198) /* R/W R/W 0x0000 0000 32 */ | ||
431 | #define SH4A_PCIEDMCCAR2 (0x02119C) /* R/W R/W 0x0000 0000 32 */ | ||
432 | #define SH4A_PCIEDMCCR2 (0x0211A0) /* R/W R/W 0x0000 0000 32 */ | ||
433 | #define SH4A_PCIEDMCC2R2 (0x0211A4) /* R/W R/W 0x0000 0000 - */ | ||
434 | #define SH4A_PCIEDMCCCR2 (0x0211A8) /* R/W R/W 0x0000 0000 32 */ | ||
435 | #define SH4A_PCIEDMSAR3 (0x0211C0) /* R/W R/W 0x0000 0000 32 */ | ||
436 | #define SH4A_PCIEDMSAHR3 (0x0211C4) /* R/W R/W 0x0000 0000 32 */ | ||
437 | #define SH4A_PCIEDMDAR3 (0x0211C8) /* R/W R/W 0x0000 0000 32 */ | ||
438 | #define SH4A_PCIEDMDAHR3 (0x0211CC) /* R/W R/W 0x0000 0000 32 */ | ||
439 | #define SH4A_PCIEDMBCNTR3 (0x0211D0) /* R/W R/W 0x0000 0000 32 */ | ||
440 | #define SH4A_PCIEDMSBCNTR3 (0x0211D4) /* R/W R/W 0x0000 0000 32 */ | ||
441 | #define SH4A_PCIEDMSTRR3 (0x0211D8) /* R/W R/W 0x0000 0000 32 */ | ||
442 | #define SH4A_PCIEDMCCAR3 (0x0211DC) /* R/W R/W 0x0000 0000 32 */ | ||
443 | #define SH4A_PCIEDMCCR3 (0x0211E0) /* R/W R/W 0x0000 0000 32 */ | ||
444 | #define SH4A_PCIEDMCC2R3 (0x0211E4) /* R/W R/W 0x0000 0000 - */ | ||
445 | #define SH4A_PCIEDMCCCR3 (0x0211E8) /* R/W R/W 0x0000 0000 32 */ | ||
446 | #define SH4A_PCIEPCICONF0 (0x040000) /* R R - 8/16/32 */ | ||
447 | #define SH4A_PCIEPCICONF1 (0x040004) /* R/W R/W 0x0008 0000 8/16/32 */ | ||
448 | #define SH4A_PCIEPCICONF2 (0x040008) /* R/W R/W 0xFF00 0000 8/16/32 */ | ||
449 | #define SH4A_PCIEPCICONF3 (0x04000C) /* R/W R/W 0x0000 0000 8/16/32 */ | ||
450 | #define SH4A_PCIEPCICONF4 (0x040010) /* - R/W - 8/16/32 */ | ||
451 | #define SH4A_PCIEPCICONF5 (0x040014) /* - R/W - 8/16/32 */ | ||
452 | #define SH4A_PCIEPCICONF6 (0x040018) /* - R/W - 8/16/32 */ | ||
453 | #define SH4A_PCIEPCICONF7 (0x04001C) /* - R/W - 8/16/32 */ | ||
454 | #define SH4A_PCIEPCICONF8 (0x040020) /* - R/W - 8/16/32 */ | ||
455 | #define SH4A_PCIEPCICONF9 (0x040024) /* - R/W - 8/16/32 */ | ||
456 | #define SH4A_PCIEPCICONF10 (0x040028) /* R/W R/W 0x0000 0000 8/16/32 */ | ||
457 | #define SH4A_PCIEPCICONF11 (0x04002C) /* R/W R/W 0x0000 0000 8/16/32 */ | ||
458 | #define SH4A_PCIEPCICONF12 (0x040030) /* R/W R/W 0x0000 0000 8/16/32 */ | ||
459 | #define SH4A_PCIEPCICONF13 (0x040034) /* R/W R/W 0x0000 0040 8/16/32 */ | ||
460 | #define SH4A_PCIEPCICONF14 (0x040038) /* R/W R/W 0x0000 0000 8/16/32 */ | ||
461 | #define SH4A_PCIEPCICONF15 (0x04003C) /* R/W R/W 0x0000 00FF 8/16/32 */ | ||
462 | #define SH4A_PCIEPMCAP0 (0x040040) /* R/W R 0x0003 5001 8/16/32 */ | ||
463 | #define SH4A_PCIEPMCAP1 (0x040044) /* R/W R/W 0x0000 0000 8/16/32 */ | ||
464 | #define SH4A_PCIEMSICAP0 (0x040050) /* R/W R/W 0x0180 7005 8/16/32 */ | ||
465 | #define SH4A_PCIEMSICAP1 (0x040054) /* R/W R/W 0x0000 0000 8/16/32 */ | ||
466 | #define SH4A_PCIEMSICAP2 (0x040058) /* R/W R/W 0x0000 0000 8/16/32 */ | ||
467 | #define SH4A_PCIEMSICAP3 (0x04005C) /* R/W R/W 0x0000 0000 8/16/32 */ | ||
468 | #define SH4A_PCIEMSICAP4 (0x040060) /* R/W R/W 0x0000 0000 8/16/32 */ | ||
469 | #define SH4A_PCIEMSICAP5 (0x040064) /* R/W R/W 0x0000 0000 8/16/32 */ | ||
470 | #define SH4A_PCIEEXPCAP0 (0x040070) /* R/W R/W 0x0001 0010 8/16/32 */ | ||
471 | #define SH4A_PCIEEXPCAP1 (0x040074) /* R/W R 0x0000 0005 8/16/32 */ | ||
472 | #define SH4A_PCIEEXPCAP2 (0x040078) /* R/W R/W 0x0000 0801 8/16/32 */ | ||
473 | #define SH4A_PCIEEXPCAP3 (0x04007C) /* R/W R 0x0003 F421 8/16/32 */ | ||
474 | #define SH4A_PCIEEXPCAP4 (0x040080) /* R/W R/W 0x0041 0000 8/16/32 */ | ||
475 | #define SH4A_PCIEEXPCAP5 (0x040084) /* R/W R/W 0x0000 0000 8/16/32 */ | ||
476 | #define SH4A_PCIEEXPCAP6 (0x040088) /* R/W R/W 0x0000 03C0 8/16/32 */ | ||
477 | #define SH4A_PCIEEXPCAP7 (0x04008C) /* R/W R/W 0x0000 0000 8/16/32 */ | ||
478 | #define SH4A_PCIEEXPCAP8 (0x040090) /* R/W R/W 0x0000 0000 8/16/32 */ | ||
479 | #define SH4A_PCIEVCCAP0 (0x040100) /* R/W R 0x1B01 0002 8/16/32 */ | ||
480 | #define SH4A_PCIEVCCAP1 (0x040104) /* R R 0x0000 0001 8/16/32 */ | ||
481 | #define SH4A_PCIEVCCAP2 (0x040108) /* R R 0x0000 0000 8/16/32 */ | ||
482 | #define SH4A_PCIEVCCAP3 (0x04010C) /* R R/W 0x0000 0000 8/16/32 */ | ||
483 | #define SH4A_PCIEVCCAP4 (0x040110) /* R/W R/W 0x0000 0000 8/16/32 */ | ||
484 | #define SH4A_PCIEVCCAP5 (0x040114) /* R/W R/W 0x8000 00FF 8/16/32 */ | ||
485 | #define SH4A_PCIEVCCAP6 (0x040118) /* R/W R 0x0002 0000 8/16/32 */ | ||
486 | #define SH4A_PCIEVCCAP7 (0x04011C) /* R/W R/W 0x0000 0000 8/16/32 */ | ||
487 | #define SH4A_PCIEVCCAP8 (0x040120) /* R/W R/W 0x0000 0000 8/16/32 */ | ||
488 | #define SH4A_PCIEVCCAP9 (0x040124) /* R/W R 0x0002 0000 8/16/32 */ | ||
489 | #define SH4A_PCIENUMCAP0 (0x0001B0) /* RW R 0x0001 0003 8/16/32 */ | ||
490 | #define SH4A_PCIENUMCAP1 (0x0001B4) /* R R 0x0000 0000 8/16/32 */ | ||
491 | #define SH4A_PCIENUMCAP2 (0x0001B8) /* R R 0x0000 0000 8/16/32 */ | ||
492 | #define SH4A_PCIEIDSETR0 (0x041000) /* R/W R 0x0000 FFFF 16/32 */ | ||
493 | #define SH4A_PCIEIDSETR1 (0x041004) /* R/W R 0xFF00 0000 16/32 */ | ||
494 | #define SH4A_PCIEBAR0SETR (0x041008) /* R/W R 0x0000 0000 16/32 */ | ||
495 | #define SH4A_PCIEBAR1SETR (0x04100C) /* R/W R 0x0000 0000 16/32 */ | ||
496 | #define SH4A_PCIEBAR2SETR (0x041010) /* R/W R 0x0000 0000 16/32 */ | ||
497 | #define SH4A_PCIEBAR3SETR (0x041014) /* R/W R 0x0000 0000 16/32 */ | ||
498 | #define SH4A_PCIEBAR4SETR (0x041018) /* R/W R 0x0000 0000 16/32 */ | ||
499 | #define SH4A_PCIEBAR5SETR (0x04101C) /* R/W R 0x0000 0000 16/32 */ | ||
500 | #define SH4A_PCIECISSETR (0x041020) /* R/W R 0x0000 0000 16/32 */ | ||
501 | #define SH4A_PCIEIDSETR2 (0x041024) /* R/W R 0x0000 0000 16/32 */ | ||
502 | #define SH4A_PCIEEROMSETR (0x041028) /* R/W R 0x0000 0000 16/32 */ | ||
503 | #define SH4A_PCIEDSERSETR0 (0x04102C) /* R/W R 0x0000 0000 16/32 */ | ||
504 | #define SH4A_PCIEDSERSETR1 (0x041030) /* R/W R 0x0000 0000 16/32 */ | ||
505 | #define SH4A_PCIECTLR (0x041040) /* R/W R 0x0000 0000 16/32 */ | ||
506 | #define SH4A_PCIETLSR (0x041044) /* R/W1C R 0x0000 0000 16/32 */ | ||
507 | #define SH4A_PCIETLCTLR (0x041048) /* R/W R 0x0000 0000 16/32 */ | ||
508 | #define SH4A_PCIEDLSR (0x04104C) /* R/W1C R 0x4003 0000 16/32 */ | ||
509 | #define SH4A_PCIEDLCTLR (0x041050) /* R R 0x0000 0000 16/32 */ | ||
510 | #define SH4A_PCIEMACSR (0x041054) /* R/W1C R 0x0041 0000 16/32 */ | ||
511 | #define SH4A_PCIEMACCTLR (0x041058) /* R/W R 0x0000 0000 16/32 */ | ||
512 | #define PCIEMACCTLR_SCR_DIS (1 << 27) /* scramble disable */ | ||
513 | #define SH4A_PCIEPMSTR (0x04105C) /* R/W1C R 0x0000 0000 16/32 */ | ||
514 | #define SH4A_PCIEPMCTLR (0x041060) /* R/W R 0x0000 0000 16/32 */ | ||
515 | #define SH4A_PCIETLINTENR (0x041064) /* R/W R 0x0000 0000 16/32 */ | ||
516 | #define SH4A_PCIEDLINTENR (0x041068) /* R/W R 0x0000 0000 16/32 */ | ||
517 | #define PCIEDLINTENR_DLL_ACT_ENABLE (1 << 31) /* DL active irq */ | ||
518 | #define SH4A_PCIEMACINTENR (0x04106C) /* R/W R 0x0000 0000 16/32 */ | ||
519 | #define SH4A_PCIEPMINTENR (0x041070) /* R/W R 0x0000 0000 16/32 */ | ||
520 | #define SH4A_PCIETXDCTLR (0x044000) /* R/W - H'00000000_00000000 32/64 */ | ||
521 | #define SH4A_PCIETXCTLR (0x044020) /* R/W - H'00000000_00000000 32/64 */ | ||
522 | #define SH4A_PCIETXSR (0x044028) /* R - H'00000000_00000000 32/64 */ | ||
523 | #define SH4A_PCIETXVC0DCTLR (0x044100) /* R/W - H'00000000_00000000 32/64 */ | ||
524 | #define SH4A_PCIETXVC0SR (0x044108) /* R/W - H'00888000_00000000 32/64 */ | ||
525 | #define SH4A_PCIEVC0PDTXR (0x044110) /* W - H'00000000_00000000 32/64 */ | ||
526 | #define SH4A_PCIEVC0PHTXR (0x044118) /* W - H'00000000_00000000 32/64 */ | ||
527 | #define SH4A_PCIEVC0NPDTXR (0x044120) /* W - H'00000000_00000000 32/64 */ | ||
528 | #define SH4A_PCIEVC0NPHTXR (0x044128) /* W - H'00000000_00000000 32/64 */ | ||
529 | #define SH4A_PCIEVC0CDTXR (0x044130) /* W - H'00000000_00000000 32/64 */ | ||
530 | #define SH4A_PCIEVC0CHTXR (0x044138) /* W - H'00000000_00000000 32/64 */ | ||
531 | #define SH4A_PCIETXVCXDCTLR (0x044200) /* R/W - H'00000000_00000000 32/64 */ | ||
532 | #define SH4A_PCIETXVCXSR (0x044208) /* R/W - H'00000000_00000000 32/64 */ | ||
533 | #define SH4A_PCIEVCXPDTXR (0x044210) /* W - H'00000000_00000000 32/64 */ | ||
534 | #define SH4A_PCIEVCXPHTXR (0x044218) /* W - H'00000000_00000000 32/64 */ | ||
535 | #define SH4A_PCIEVCXNPDTXR (0x044220) /* W - H'00000000_00000000 32/64 */ | ||
536 | #define SH4A_PCIEVCXNPHTXR (0x044228) /* W - H'00000000_00000000 32/64 */ | ||
537 | #define SH4A_PCIEVCXCDTXR (0x044230) /* W - H'00000000_00000000 32/64 */ | ||
538 | #define SH4A_PCIEVCXCHTXR (0x044238) /* W - H'00000000_00000000 32/64 */ | ||
539 | #define SH4A_PCIERDCTLR (0x046000) /* RW - H'00000000_00000000 32/64 */ | ||
540 | #define SH4A_PCIEERPCTLR (0x046008) /* RW - H'00000000_00000000 32/64 */ | ||
541 | #define SH4A_PCIEERPHR (0x046010) /* R - H'00000000_00000000 32/64 */ | ||
542 | #define SH4A_PCIEERPERR (0x046018) /* R - H'00000000_00000000 32/64 */ | ||
543 | #define SH4A_PCIERXVC0DCTLR (0x046100) /* RW - H'00000000_00000000 32/64 */ | ||
544 | #define SH4A_PCIERXVC0SR (0x046108) /* RW - H'00000000_00000000 32/64 */ | ||
545 | #define SH4A_PCIEVC0PDRXR (0x046140) /* R - H'00000000_00000000 32/64 */ | ||
546 | #define SH4A_PCIEVC0PHRXR (0x046148) /* R - H'00000000_00000000 32/64 */ | ||
547 | #define SH4A_PCIEVC0PERR (0x046150) /* R - H'00000000_00000000 32/64 */ | ||
548 | #define SH4A_PCIEVC0NPDRXR (0x046158) /* R - H'00000000_00000000 32/64 */ | ||
549 | #define SH4A_PCIEVC0NPHRXR (0x046160) /* R - H'00000000_00000000 32/64 */ | ||
550 | #define SH4A_PCIEVC0NPERR (0x046168) /* R - H'00000000_00000000 32/64 */ | ||
551 | #define SH4A_PCIEVC0CDRXR (0x046170) /* R - H'00000000_00000000 32/64 */ | ||
552 | #define SH4A_PCIEVC0CHRXR (0x046178) /* R - H'00000000_00000000 32/64 */ | ||
553 | #define SH4A_PCIEVC0CERR (0x046180) /* R - H'00000000_00000000 32/64 */ | ||
554 | #define SH4A_PCIERXVCXDCTLR (0x046200) /* RW - H'00000000_00000000 32/64 */ | ||
555 | #define SH4A_PCIERXVCXSR (0x046208) /* RW - H'00000000_00000000 32/64 */ | ||
556 | #define SH4A_PCIEVCXPDRXR (0x046240) /* R - H'00000000_00000000 32/64 */ | ||
557 | #define SH4A_PCIEVCXPHRXR (0x046248) /* R H'00000000_00000000 32/64 */ | ||
558 | #define SH4A_PCIEVCXPERR (0x046250) /* R H'00000000_00000000 32/64 */ | ||
559 | #define SH4A_PCIEVCXNPDRXR (0x046258) /* R H'00000000_00000000 32/64 */ | ||
560 | #define SH4A_PCIEVCXNPHRXR (0x046260) /* R H'00000000_00000000 32/64 */ | ||
561 | #define SH4A_PCIEVCXNPERR (0x046268) /* R H'00000000_00000000 32/64 */ | ||
562 | #define SH4A_PCIEVCXCDRXR (0x046270) /* R H'00000000_00000000 32/64 */ | ||
563 | #define SH4A_PCIEVCXCHRXR (0x046278) /* R H'00000000_00000000 32/64 */ | ||
564 | #define SH4A_PCIEVCXCERR (0x046280) /* R H'00000000_00000000 32/64 */ | ||
565 | |||
566 | /* SSI Register Definition for MSI WORK AROUND --hamada */ | ||
567 | #define SH4A_PCI_SSI_BASE 0xFFE00000 /* spw config address */ | ||
568 | #define SH4A_PCI_SSI_BASE_LEN 0x00100000 /* 1MB */ | ||
569 | |||
570 | #define SH4A_SSICR0 (0x000000) | ||
571 | #define SH4A_SSICR1 (0x010000) | ||
572 | #define SH4A_SSICR2 (0x020000) | ||
573 | #define SH4A_SSICR3 (0x030000) | ||
574 | |||
575 | #define PCI_REG(x) ((x) + 0x40000) | ||
576 | |||
577 | static inline void | ||
578 | pci_write_reg(struct pci_channel *chan, unsigned long val, unsigned long reg) | ||
579 | { | ||
580 | __raw_writel(val, chan->reg_base + reg); | ||
581 | } | ||
582 | |||
583 | static inline unsigned long | ||
584 | pci_read_reg(struct pci_channel *chan, unsigned long reg) | ||
585 | { | ||
586 | return __raw_readl(chan->reg_base + reg); | ||
587 | } | ||
588 | |||
589 | #endif /* __PCI_SH7786_H */ | ||
diff --git a/arch/sh/include/asm/atomic-irq.h b/arch/sh/include/asm/atomic-irq.h index a0b348068cae..467d9415a32e 100644 --- a/arch/sh/include/asm/atomic-irq.h +++ b/arch/sh/include/asm/atomic-irq.h | |||
@@ -10,29 +10,29 @@ static inline void atomic_add(int i, atomic_t *v) | |||
10 | { | 10 | { |
11 | unsigned long flags; | 11 | unsigned long flags; |
12 | 12 | ||
13 | local_irq_save(flags); | 13 | raw_local_irq_save(flags); |
14 | v->counter += i; | 14 | v->counter += i; |
15 | local_irq_restore(flags); | 15 | raw_local_irq_restore(flags); |
16 | } | 16 | } |
17 | 17 | ||
18 | static inline void atomic_sub(int i, atomic_t *v) | 18 | static inline void atomic_sub(int i, atomic_t *v) |
19 | { | 19 | { |
20 | unsigned long flags; | 20 | unsigned long flags; |
21 | 21 | ||
22 | local_irq_save(flags); | 22 | raw_local_irq_save(flags); |
23 | v->counter -= i; | 23 | v->counter -= i; |
24 | local_irq_restore(flags); | 24 | raw_local_irq_restore(flags); |
25 | } | 25 | } |
26 | 26 | ||
27 | static inline int atomic_add_return(int i, atomic_t *v) | 27 | static inline int atomic_add_return(int i, atomic_t *v) |
28 | { | 28 | { |
29 | unsigned long temp, flags; | 29 | unsigned long temp, flags; |
30 | 30 | ||
31 | local_irq_save(flags); | 31 | raw_local_irq_save(flags); |
32 | temp = v->counter; | 32 | temp = v->counter; |
33 | temp += i; | 33 | temp += i; |
34 | v->counter = temp; | 34 | v->counter = temp; |
35 | local_irq_restore(flags); | 35 | raw_local_irq_restore(flags); |
36 | 36 | ||
37 | return temp; | 37 | return temp; |
38 | } | 38 | } |
@@ -41,11 +41,11 @@ static inline int atomic_sub_return(int i, atomic_t *v) | |||
41 | { | 41 | { |
42 | unsigned long temp, flags; | 42 | unsigned long temp, flags; |
43 | 43 | ||
44 | local_irq_save(flags); | 44 | raw_local_irq_save(flags); |
45 | temp = v->counter; | 45 | temp = v->counter; |
46 | temp -= i; | 46 | temp -= i; |
47 | v->counter = temp; | 47 | v->counter = temp; |
48 | local_irq_restore(flags); | 48 | raw_local_irq_restore(flags); |
49 | 49 | ||
50 | return temp; | 50 | return temp; |
51 | } | 51 | } |
@@ -54,18 +54,18 @@ static inline void atomic_clear_mask(unsigned int mask, atomic_t *v) | |||
54 | { | 54 | { |
55 | unsigned long flags; | 55 | unsigned long flags; |
56 | 56 | ||
57 | local_irq_save(flags); | 57 | raw_local_irq_save(flags); |
58 | v->counter &= ~mask; | 58 | v->counter &= ~mask; |
59 | local_irq_restore(flags); | 59 | raw_local_irq_restore(flags); |
60 | } | 60 | } |
61 | 61 | ||
62 | static inline void atomic_set_mask(unsigned int mask, atomic_t *v) | 62 | static inline void atomic_set_mask(unsigned int mask, atomic_t *v) |
63 | { | 63 | { |
64 | unsigned long flags; | 64 | unsigned long flags; |
65 | 65 | ||
66 | local_irq_save(flags); | 66 | raw_local_irq_save(flags); |
67 | v->counter |= mask; | 67 | v->counter |= mask; |
68 | local_irq_restore(flags); | 68 | raw_local_irq_restore(flags); |
69 | } | 69 | } |
70 | 70 | ||
71 | #endif /* __ASM_SH_ATOMIC_IRQ_H */ | 71 | #endif /* __ASM_SH_ATOMIC_IRQ_H */ |
diff --git a/arch/sh/include/asm/atomic.h b/arch/sh/include/asm/atomic.h index 157c320272cb..e8e78137c6f5 100644 --- a/arch/sh/include/asm/atomic.h +++ b/arch/sh/include/asm/atomic.h | |||
@@ -85,4 +85,6 @@ static inline int atomic_add_unless(atomic_t *v, int a, int u) | |||
85 | #define smp_mb__after_atomic_inc() barrier() | 85 | #define smp_mb__after_atomic_inc() barrier() |
86 | 86 | ||
87 | #include <asm-generic/atomic-long.h> | 87 | #include <asm-generic/atomic-long.h> |
88 | #include <asm-generic/atomic64.h> | ||
89 | |||
88 | #endif /* __ASM_SH_ATOMIC_H */ | 90 | #endif /* __ASM_SH_ATOMIC_H */ |
diff --git a/arch/sh/include/asm/checksum.h b/arch/sh/include/asm/checksum.h index 67496ab0ef04..fc26d1f4b590 100644 --- a/arch/sh/include/asm/checksum.h +++ b/arch/sh/include/asm/checksum.h | |||
@@ -1,5 +1,5 @@ | |||
1 | #ifdef CONFIG_SUPERH32 | 1 | #ifdef CONFIG_SUPERH32 |
2 | # include "checksum_32.h" | 2 | # include "checksum_32.h" |
3 | #else | 3 | #else |
4 | # include "checksum_64.h" | 4 | # include <asm-generic/checksum.h> |
5 | #endif | 5 | #endif |
diff --git a/arch/sh/include/asm/checksum_64.h b/arch/sh/include/asm/checksum_64.h deleted file mode 100644 index 9c62a031a8f5..000000000000 --- a/arch/sh/include/asm/checksum_64.h +++ /dev/null | |||
@@ -1,78 +0,0 @@ | |||
1 | #ifndef __ASM_SH_CHECKSUM_64_H | ||
2 | #define __ASM_SH_CHECKSUM_64_H | ||
3 | |||
4 | /* | ||
5 | * include/asm-sh/checksum_64.h | ||
6 | * | ||
7 | * Copyright (C) 2000, 2001 Paolo Alberelli | ||
8 | * | ||
9 | * This file is subject to the terms and conditions of the GNU General Public | ||
10 | * License. See the file "COPYING" in the main directory of this archive | ||
11 | * for more details. | ||
12 | */ | ||
13 | |||
14 | /* | ||
15 | * computes the checksum of a memory block at buff, length len, | ||
16 | * and adds in "sum" (32-bit) | ||
17 | * | ||
18 | * returns a 32-bit number suitable for feeding into itself | ||
19 | * or csum_tcpudp_magic | ||
20 | * | ||
21 | * this function must be called with even lengths, except | ||
22 | * for the last fragment, which may be odd | ||
23 | * | ||
24 | * it's best to have buff aligned on a 32-bit boundary | ||
25 | */ | ||
26 | asmlinkage __wsum csum_partial(const void *buff, int len, __wsum sum); | ||
27 | |||
28 | /* | ||
29 | * Note: when you get a NULL pointer exception here this means someone | ||
30 | * passed in an incorrect kernel address to one of these functions. | ||
31 | * | ||
32 | * If you use these functions directly please don't forget the | ||
33 | * access_ok(). | ||
34 | */ | ||
35 | |||
36 | |||
37 | __wsum csum_partial_copy_nocheck(const void *src, void *dst, int len, | ||
38 | __wsum sum); | ||
39 | |||
40 | __wsum csum_partial_copy_from_user(const void __user *src, void *dst, | ||
41 | int len, __wsum sum, int *err_ptr); | ||
42 | |||
43 | static inline __sum16 csum_fold(__wsum csum) | ||
44 | { | ||
45 | u32 sum = (__force u32)csum; | ||
46 | sum = (sum & 0xffff) + (sum >> 16); | ||
47 | sum = (sum & 0xffff) + (sum >> 16); | ||
48 | return (__force __sum16)~sum; | ||
49 | } | ||
50 | |||
51 | __sum16 ip_fast_csum(const void *iph, unsigned int ihl); | ||
52 | |||
53 | __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, | ||
54 | unsigned short len, unsigned short proto, | ||
55 | __wsum sum); | ||
56 | |||
57 | /* | ||
58 | * computes the checksum of the TCP/UDP pseudo-header | ||
59 | * returns a 16-bit checksum, already complemented | ||
60 | */ | ||
61 | static inline __sum16 csum_tcpudp_magic(__be32 saddr, __be32 daddr, | ||
62 | unsigned short len, | ||
63 | unsigned short proto, | ||
64 | __wsum sum) | ||
65 | { | ||
66 | return csum_fold(csum_tcpudp_nofold(saddr,daddr,len,proto,sum)); | ||
67 | } | ||
68 | |||
69 | /* | ||
70 | * this routine is used for miscellaneous IP-like checksums, mainly | ||
71 | * in icmp.c | ||
72 | */ | ||
73 | static inline __sum16 ip_compute_csum(const void *buff, int len) | ||
74 | { | ||
75 | return csum_fold(csum_partial(buff, len, 0)); | ||
76 | } | ||
77 | |||
78 | #endif /* __ASM_SH_CHECKSUM_64_H */ | ||
diff --git a/arch/sh/include/asm/current.h b/arch/sh/include/asm/current.h index 62b63880b333..4c51401b5537 100644 --- a/arch/sh/include/asm/current.h +++ b/arch/sh/include/asm/current.h | |||
@@ -1,20 +1 @@ | |||
1 | #ifndef __ASM_SH_CURRENT_H | #include <asm-generic/current.h> | |
2 | #define __ASM_SH_CURRENT_H | ||
3 | |||
4 | /* | ||
5 | * Copyright (C) 1999 Niibe Yutaka | ||
6 | * | ||
7 | */ | ||
8 | |||
9 | #include <linux/thread_info.h> | ||
10 | |||
11 | struct task_struct; | ||
12 | |||
13 | static __inline__ struct task_struct * get_current(void) | ||
14 | { | ||
15 | return current_thread_info()->task; | ||
16 | } | ||
17 | |||
18 | #define current get_current() | ||
19 | |||
20 | #endif /* __ASM_SH_CURRENT_H */ | ||
diff --git a/arch/sh/include/asm/dma.h b/arch/sh/include/asm/dma.h index 6bd178473878..04ad0e1e637e 100644 --- a/arch/sh/include/asm/dma.h +++ b/arch/sh/include/asm/dma.h | |||
@@ -16,13 +16,7 @@ | |||
16 | #include <linux/sched.h> | 16 | #include <linux/sched.h> |
17 | #include <linux/sysdev.h> | 17 | #include <linux/sysdev.h> |
18 | #include <cpu/dma.h> | 18 | #include <cpu/dma.h> |
19 | 19 | #include <asm-generic/dma.h> | |
20 | /* The maximum address that we can perform a DMA transfer to on this platform */ | ||
21 | /* Don't define MAX_DMA_ADDRESS; it's useless on the SuperH and any | ||
22 | occurrence should be flagged as an error. */ | ||
23 | /* But... */ | ||
24 | /* XXX: This is not applicable to SuperH, just needed for alloc_bootmem */ | ||
25 | #define MAX_DMA_ADDRESS (PAGE_OFFSET+0x10000000) | ||
26 | 20 | ||
27 | #ifdef CONFIG_NR_DMA_CHANNELS | 21 | #ifdef CONFIG_NR_DMA_CHANNELS |
28 | # define MAX_DMA_CHANNELS (CONFIG_NR_DMA_CHANNELS) | 22 | # define MAX_DMA_CHANNELS (CONFIG_NR_DMA_CHANNELS) |
@@ -137,8 +131,6 @@ extern int dma_xfer(unsigned int chan, unsigned long from, | |||
137 | 131 | ||
138 | extern int request_dma_bycap(const char **dmac, const char **caps, | 132 | extern int request_dma_bycap(const char **dmac, const char **caps, |
139 | const char *dev_id); | 133 | const char *dev_id); |
140 | extern int request_dma(unsigned int chan, const char *dev_id); | ||
141 | extern void free_dma(unsigned int chan); | ||
142 | extern int get_dma_residue(unsigned int chan); | 134 | extern int get_dma_residue(unsigned int chan); |
143 | extern struct dma_info *get_dma_info(unsigned int chan); | 135 | extern struct dma_info *get_dma_info(unsigned int chan); |
144 | extern struct dma_channel *get_dma_channel(unsigned int chan); | 136 | extern struct dma_channel *get_dma_channel(unsigned int chan); |
diff --git a/arch/sh/include/asm/ipcbuf.h b/arch/sh/include/asm/ipcbuf.h index 5ffc9972a7ea..84c7e51cb6d0 100644 --- a/arch/sh/include/asm/ipcbuf.h +++ b/arch/sh/include/asm/ipcbuf.h | |||
@@ -1,29 +1 @@ | |||
1 | #ifndef __ASM_SH_IPCBUF_H__ | #include <asm-generic/ipcbuf.h> | |
2 | #define __ASM_SH_IPCBUF_H__ | ||
3 | |||
4 | /* | ||
5 | * The ipc64_perm structure for i386 architecture. | ||
6 | * Note extra padding because this structure is passed back and forth | ||
7 | * between kernel and user space. | ||
8 | * | ||
9 | * Pad space is left for: | ||
10 | * - 32-bit mode_t and seq | ||
11 | * - 2 miscellaneous 32-bit values | ||
12 | */ | ||
13 | |||
14 | struct ipc64_perm | ||
15 | { | ||
16 | __kernel_key_t key; | ||
17 | __kernel_uid32_t uid; | ||
18 | __kernel_gid32_t gid; | ||
19 | __kernel_uid32_t cuid; | ||
20 | __kernel_gid32_t cgid; | ||
21 | __kernel_mode_t mode; | ||
22 | unsigned short __pad1; | ||
23 | unsigned short seq; | ||
24 | unsigned short __pad2; | ||
25 | unsigned long __unused1; | ||
26 | unsigned long __unused2; | ||
27 | }; | ||
28 | |||
29 | #endif /* __ASM_SH_IPCBUF_H__ */ | ||
diff --git a/arch/sh/include/asm/irq.h b/arch/sh/include/asm/irq.h index a2b8c99cc06f..df8e1500527c 100644 --- a/arch/sh/include/asm/irq.h +++ b/arch/sh/include/asm/irq.h | |||
@@ -39,7 +39,6 @@ static inline int generic_irq_demux(int irq) | |||
39 | return irq; | 39 | return irq; |
40 | } | 40 | } |
41 | 41 | ||
42 | #define irq_canonicalize(irq) (irq) | ||
43 | #define irq_demux(irq) sh_mv.mv_irq_demux(irq) | 42 | #define irq_demux(irq) sh_mv.mv_irq_demux(irq) |
44 | 43 | ||
45 | void init_IRQ(void); | 44 | void init_IRQ(void); |
@@ -54,6 +53,7 @@ extern void irq_ctx_exit(int cpu); | |||
54 | # define irq_ctx_exit(cpu) do { } while (0) | 53 | # define irq_ctx_exit(cpu) do { } while (0) |
55 | #endif | 54 | #endif |
56 | 55 | ||
56 | #include <asm-generic/irq.h> | ||
57 | #ifdef CONFIG_CPU_SH5 | 57 | #ifdef CONFIG_CPU_SH5 |
58 | #include <cpu/irq.h> | 58 | #include <cpu/irq.h> |
59 | #endif | 59 | #endif |
diff --git a/arch/sh/include/asm/kmap_types.h b/arch/sh/include/asm/kmap_types.h index 84d565c696be..5962b08b6dd8 100644 --- a/arch/sh/include/asm/kmap_types.h +++ b/arch/sh/include/asm/kmap_types.h | |||
@@ -3,30 +3,12 @@ | |||
3 | 3 | ||
4 | /* Dummy header just to define km_type. */ | 4 | /* Dummy header just to define km_type. */ |
5 | 5 | ||
6 | |||
7 | #ifdef CONFIG_DEBUG_HIGHMEM | 6 | #ifdef CONFIG_DEBUG_HIGHMEM |
8 | # define D(n) __KM_FENCE_##n , | 7 | #define __WITH_KM_FENCE |
9 | #else | ||
10 | # define D(n) | ||
11 | #endif | 8 | #endif |
12 | 9 | ||
13 | enum km_type { | 10 | #include <asm-generic/kmap_types.h> |
14 | D(0) KM_BOUNCE_READ, | ||
15 | D(1) KM_SKB_SUNRPC_DATA, | ||
16 | D(2) KM_SKB_DATA_SOFTIRQ, | ||
17 | D(3) KM_USER0, | ||
18 | D(4) KM_USER1, | ||
19 | D(5) KM_BIO_SRC_IRQ, | ||
20 | D(6) KM_BIO_DST_IRQ, | ||
21 | D(7) KM_PTE0, | ||
22 | D(8) KM_PTE1, | ||
23 | D(9) KM_IRQ0, | ||
24 | D(10) KM_IRQ1, | ||
25 | D(11) KM_SOFTIRQ0, | ||
26 | D(12) KM_SOFTIRQ1, | ||
27 | D(13) KM_TYPE_NR | ||
28 | }; | ||
29 | 11 | ||
30 | #undef D | 12 | #undef __WITH_KM_FENCE |
31 | 13 | ||
32 | #endif | 14 | #endif |
diff --git a/arch/sh/include/asm/mman.h b/arch/sh/include/asm/mman.h index 7d8b72c91a5f..8eebf89f5ab1 100644 --- a/arch/sh/include/asm/mman.h +++ b/arch/sh/include/asm/mman.h | |||
@@ -1,17 +1 @@ | |||
1 | #ifndef __ASM_SH_MMAN_H | #include <asm-generic/mman.h> | |
2 | #define __ASM_SH_MMAN_H | ||
3 | |||
4 | #include <asm-generic/mman-common.h> | ||
5 | |||
6 | #define MAP_GROWSDOWN 0x0100 /* stack-like segment */ | ||
7 | #define MAP_DENYWRITE 0x0800 /* ETXTBSY */ | ||
8 | #define MAP_EXECUTABLE 0x1000 /* mark it as an executable */ | ||
9 | #define MAP_LOCKED 0x2000 /* pages are locked */ | ||
10 | #define MAP_NORESERVE 0x4000 /* don't check for reservations */ | ||
11 | #define MAP_POPULATE 0x8000 /* populate (prefault) page tables */ | ||
12 | #define MAP_NONBLOCK 0x10000 /* do not block on IO */ | ||
13 | |||
14 | #define MCL_CURRENT 1 /* lock all current mappings */ | ||
15 | #define MCL_FUTURE 2 /* lock all future mappings */ | ||
16 | |||
17 | #endif /* __ASM_SH_MMAN_H */ | ||
diff --git a/arch/sh/include/asm/mmu_context.h b/arch/sh/include/asm/mmu_context.h index 2a9c55f1a83f..67d8946db193 100644 --- a/arch/sh/include/asm/mmu_context.h +++ b/arch/sh/include/asm/mmu_context.h | |||
@@ -122,30 +122,30 @@ static inline void switch_mm(struct mm_struct *prev, | |||
122 | unsigned int cpu = smp_processor_id(); | 122 | unsigned int cpu = smp_processor_id(); |
123 | 123 | ||
124 | if (likely(prev != next)) { | 124 | if (likely(prev != next)) { |
125 | cpu_set(cpu, next->cpu_vm_mask); | 125 | cpumask_set_cpu(cpu, mm_cpumask(next)); |
126 | set_TTB(next->pgd); | 126 | set_TTB(next->pgd); |
127 | activate_context(next, cpu); | 127 | activate_context(next, cpu); |
128 | } else | 128 | } else |
129 | if (!cpu_test_and_set(cpu, next->cpu_vm_mask)) | 129 | if (!cpumask_test_and_set_cpu(cpu, mm_cpumask(next))) |
130 | activate_context(next, cpu); | 130 | activate_context(next, cpu); |
131 | } | 131 | } |
132 | |||
133 | #define activate_mm(prev, next) switch_mm((prev),(next),NULL) | ||
134 | #define deactivate_mm(tsk,mm) do { } while (0) | ||
135 | #define enter_lazy_tlb(mm,tsk) do { } while (0) | ||
136 | |||
132 | #else | 137 | #else |
133 | #define get_mmu_context(mm) do { } while (0) | 138 | |
134 | #define init_new_context(tsk,mm) (0) | ||
135 | #define destroy_context(mm) do { } while (0) | ||
136 | #define set_asid(asid) do { } while (0) | 139 | #define set_asid(asid) do { } while (0) |
137 | #define get_asid() (0) | 140 | #define get_asid() (0) |
138 | #define cpu_asid(cpu, mm) ({ (void)cpu; NO_CONTEXT; }) | 141 | #define cpu_asid(cpu, mm) ({ (void)cpu; NO_CONTEXT; }) |
139 | #define switch_and_save_asid(asid) (0) | 142 | #define switch_and_save_asid(asid) (0) |
140 | #define set_TTB(pgd) do { } while (0) | 143 | #define set_TTB(pgd) do { } while (0) |
141 | #define get_TTB() (0) | 144 | #define get_TTB() (0) |
142 | #define activate_context(mm,cpu) do { } while (0) | ||
143 | #define switch_mm(prev,next,tsk) do { } while (0) | ||
144 | #endif /* CONFIG_MMU */ | ||
145 | 145 | ||
146 | #define activate_mm(prev, next) switch_mm((prev),(next),NULL) | 146 | #include <asm-generic/mmu_context.h> |
147 | #define deactivate_mm(tsk,mm) do { } while (0) | 147 | |
148 | #define enter_lazy_tlb(mm,tsk) do { } while (0) | 148 | #endif /* CONFIG_MMU */ |
149 | 149 | ||
150 | #if defined(CONFIG_CPU_SH3) || defined(CONFIG_CPU_SH4) | 150 | #if defined(CONFIG_CPU_SH3) || defined(CONFIG_CPU_SH4) |
151 | /* | 151 | /* |
diff --git a/arch/sh/include/asm/module.h b/arch/sh/include/asm/module.h index 46eccd331660..068bf1659750 100644 --- a/arch/sh/include/asm/module.h +++ b/arch/sh/include/asm/module.h | |||
@@ -1,17 +1,7 @@ | |||
1 | #ifndef _ASM_SH_MODULE_H | 1 | #ifndef _ASM_SH_MODULE_H |
2 | #define _ASM_SH_MODULE_H | 2 | #define _ASM_SH_MODULE_H |
3 | 3 | ||
4 | /* | 4 | #include <asm-generic/module.h> |
5 | * This file contains the SH architecture specific module code. | ||
6 | */ | ||
7 | |||
8 | struct mod_arch_specific { | ||
9 | /* Nothing to see here .. */ | ||
10 | }; | ||
11 | |||
12 | #define Elf_Shdr Elf32_Shdr | ||
13 | #define Elf_Sym Elf32_Sym | ||
14 | #define Elf_Ehdr Elf32_Ehdr | ||
15 | 5 | ||
16 | #ifdef CONFIG_CPU_LITTLE_ENDIAN | 6 | #ifdef CONFIG_CPU_LITTLE_ENDIAN |
17 | # ifdef CONFIG_CPU_SH2 | 7 | # ifdef CONFIG_CPU_SH2 |
diff --git a/arch/sh/include/asm/msgbuf.h b/arch/sh/include/asm/msgbuf.h index 517432343fb5..809134c644a6 100644 --- a/arch/sh/include/asm/msgbuf.h +++ b/arch/sh/include/asm/msgbuf.h | |||
@@ -1,31 +1 @@ | |||
1 | #ifndef __ASM_SH_MSGBUF_H | #include <asm-generic/msgbuf.h> | |
2 | #define __ASM_SH_MSGBUF_H | ||
3 | |||
4 | /* | ||
5 | * The msqid64_ds structure for i386 architecture. | ||
6 | * Note extra padding because this structure is passed back and forth | ||
7 | * between kernel and user space. | ||
8 | * | ||
9 | * Pad space is left for: | ||
10 | * - 64-bit time_t to solve y2038 problem | ||
11 | * - 2 miscellaneous 32-bit values | ||
12 | */ | ||
13 | |||
14 | struct msqid64_ds { | ||
15 | struct ipc64_perm msg_perm; | ||
16 | __kernel_time_t msg_stime; /* last msgsnd time */ | ||
17 | unsigned long __unused1; | ||
18 | __kernel_time_t msg_rtime; /* last msgrcv time */ | ||
19 | unsigned long __unused2; | ||
20 | __kernel_time_t msg_ctime; /* last change time */ | ||
21 | unsigned long __unused3; | ||
22 | unsigned long msg_cbytes; /* current number of bytes on queue */ | ||
23 | unsigned long msg_qnum; /* number of messages in queue */ | ||
24 | unsigned long msg_qbytes; /* max number of bytes on queue */ | ||
25 | __kernel_pid_t msg_lspid; /* pid of last msgsnd */ | ||
26 | __kernel_pid_t msg_lrpid; /* last receive pid */ | ||
27 | unsigned long __unused4; | ||
28 | unsigned long __unused5; | ||
29 | }; | ||
30 | |||
31 | #endif /* __ASM_SH_MSGBUF_H */ | ||
diff --git a/arch/sh/include/asm/param.h b/arch/sh/include/asm/param.h index ae245afdfd6a..965d45427975 100644 --- a/arch/sh/include/asm/param.h +++ b/arch/sh/include/asm/param.h | |||
@@ -1,22 +1 @@ | |||
1 | #ifndef __ASM_SH_PARAM_H | #include <asm-generic/param.h> | |
2 | #define __ASM_SH_PARAM_H | ||
3 | |||
4 | #ifdef __KERNEL__ | ||
5 | # define HZ CONFIG_HZ | ||
6 | # define USER_HZ 100 /* User interfaces are in "ticks" */ | ||
7 | # define CLOCKS_PER_SEC (USER_HZ) /* frequency at which times() counts */ | ||
8 | #endif | ||
9 | |||
10 | #ifndef HZ | ||
11 | #define HZ 100 | ||
12 | #endif | ||
13 | |||
14 | #define EXEC_PAGESIZE 4096 | ||
15 | |||
16 | #ifndef NOGROUP | ||
17 | #define NOGROUP (-1) | ||
18 | #endif | ||
19 | |||
20 | #define MAXHOSTNAMELEN 64 /* max length of hostname */ | ||
21 | |||
22 | #endif /* __ASM_SH_PARAM_H */ | ||
diff --git a/arch/sh/include/asm/parport.h b/arch/sh/include/asm/parport.h index f67ba60a2acd..cf252af64590 100644 --- a/arch/sh/include/asm/parport.h +++ b/arch/sh/include/asm/parport.h | |||
@@ -1,16 +1 @@ | |||
1 | /* | #include <asm-generic/parport.h> | |
2 | * Copyright (C) 1999, 2000 Tim Waugh <tim@cyberelk.demon.co.uk> | ||
3 | * | ||
4 | * This file should only be included by drivers/parport/parport_pc.c. | ||
5 | */ | ||
6 | #ifndef __ASM_SH_PARPORT_H | ||
7 | #define __ASM_SH_PARPORT_H | ||
8 | |||
9 | static int __devinit parport_pc_find_isa_ports(int autoirq, int autodma); | ||
10 | |||
11 | static int __devinit parport_pc_find_nonpci_ports(int autoirq, int autodma) | ||
12 | { | ||
13 | return parport_pc_find_isa_ports(autoirq, autodma); | ||
14 | } | ||
15 | |||
16 | #endif /* __ASM_SH_PARPORT_H */ | ||
diff --git a/arch/sh/include/asm/perf_counter.h b/arch/sh/include/asm/perf_counter.h new file mode 100644 index 000000000000..a8153c2aa6fa --- /dev/null +++ b/arch/sh/include/asm/perf_counter.h | |||
@@ -0,0 +1,7 @@ | |||
1 | #ifndef __ASM_SH_PERF_COUNTER_H | ||
2 | #define __ASM_SH_PERF_COUNTER_H | ||
3 | |||
4 | /* SH only supports software counters through this interface. */ | ||
5 | #define set_perf_counter_pending() do { } while (0) | ||
6 | |||
7 | #endif /* __ASM_SH_PERF_COUNTER_H */ | ||
diff --git a/arch/sh/include/asm/posix_types_32.h b/arch/sh/include/asm/posix_types_32.h index 2172732c55c8..6a9ceaaf1aea 100644 --- a/arch/sh/include/asm/posix_types_32.h +++ b/arch/sh/include/asm/posix_types_32.h | |||
@@ -1,118 +1,29 @@ | |||
1 | #ifndef __ASM_SH_POSIX_TYPES_H | 1 | #ifndef __ASM_SH_POSIX_TYPES_32_H |
2 | #define __ASM_SH_POSIX_TYPES_H | 2 | #define __ASM_SH_POSIX_TYPES_32_H |
3 | 3 | ||
4 | /* | ||
5 | * This file is generally used by user-level software, so you need to | ||
6 | * be a little careful about namespace pollution etc. Also, we cannot | ||
7 | * assume GCC is being used. | ||
8 | */ | ||
9 | |||
10 | typedef unsigned long __kernel_ino_t; | ||
11 | typedef unsigned short __kernel_mode_t; | 4 | typedef unsigned short __kernel_mode_t; |
5 | #define __kernel_mode_t __kernel_mode_t | ||
12 | typedef unsigned short __kernel_nlink_t; | 6 | typedef unsigned short __kernel_nlink_t; |
13 | typedef long __kernel_off_t; | 7 | #define __kernel_nlink_t __kernel_nlink_t |
14 | typedef int __kernel_pid_t; | ||
15 | typedef unsigned short __kernel_ipc_pid_t; | 8 | typedef unsigned short __kernel_ipc_pid_t; |
9 | #define __kernel_ipc_pid_t __kernel_ipc_pid_t | ||
16 | typedef unsigned short __kernel_uid_t; | 10 | typedef unsigned short __kernel_uid_t; |
11 | #define __kernel_uid_t __kernel_uid_t | ||
17 | typedef unsigned short __kernel_gid_t; | 12 | typedef unsigned short __kernel_gid_t; |
18 | typedef unsigned int __kernel_size_t; | 13 | #define __kernel_gid_t __kernel_gid_t |
19 | typedef int __kernel_ssize_t; | 14 | |
20 | typedef int __kernel_ptrdiff_t; | ||
21 | typedef long __kernel_time_t; | ||
22 | typedef long __kernel_suseconds_t; | ||
23 | typedef long __kernel_clock_t; | ||
24 | typedef int __kernel_timer_t; | ||
25 | typedef int __kernel_clockid_t; | ||
26 | typedef int __kernel_daddr_t; | ||
27 | typedef char * __kernel_caddr_t; | ||
28 | typedef unsigned short __kernel_uid16_t; | ||
29 | typedef unsigned short __kernel_gid16_t; | ||
30 | typedef unsigned int __kernel_uid32_t; | 15 | typedef unsigned int __kernel_uid32_t; |
16 | #define __kernel_uid32_t __kernel_uid32_t | ||
31 | typedef unsigned int __kernel_gid32_t; | 17 | typedef unsigned int __kernel_gid32_t; |
18 | #define __kernel_gid32_t __kernel_gid32_t | ||
32 | 19 | ||
33 | typedef unsigned short __kernel_old_uid_t; | 20 | typedef unsigned short __kernel_old_uid_t; |
21 | #define __kernel_old_uid_t __kernel_old_uid_t | ||
34 | typedef unsigned short __kernel_old_gid_t; | 22 | typedef unsigned short __kernel_old_gid_t; |
23 | #define __kernel_old_gid_t __kernel_old_gid_t | ||
35 | typedef unsigned short __kernel_old_dev_t; | 24 | typedef unsigned short __kernel_old_dev_t; |
25 | #define __kernel_old_dev_t __kernel_old_dev_t | ||
36 | 26 | ||
37 | #ifdef __GNUC__ | 27 | #include <asm-generic/posix_types.h> |
38 | typedef long long __kernel_loff_t; | ||
39 | #endif | ||
40 | |||
41 | typedef struct { | ||
42 | int val[2]; | ||
43 | } __kernel_fsid_t; | ||
44 | |||
45 | #if defined(__KERNEL__) | ||
46 | |||
47 | #undef __FD_SET | ||
48 | static __inline__ void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp) | ||
49 | { | ||
50 | unsigned long __tmp = __fd / __NFDBITS; | ||
51 | unsigned long __rem = __fd % __NFDBITS; | ||
52 | __fdsetp->fds_bits[__tmp] |= (1UL<<__rem); | ||
53 | } | ||
54 | |||
55 | #undef __FD_CLR | ||
56 | static __inline__ void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp) | ||
57 | { | ||
58 | unsigned long __tmp = __fd / __NFDBITS; | ||
59 | unsigned long __rem = __fd % __NFDBITS; | ||
60 | __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem); | ||
61 | } | ||
62 | |||
63 | |||
64 | #undef __FD_ISSET | ||
65 | static __inline__ int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p) | ||
66 | { | ||
67 | unsigned long __tmp = __fd / __NFDBITS; | ||
68 | unsigned long __rem = __fd % __NFDBITS; | ||
69 | return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0; | ||
70 | } | ||
71 | |||
72 | /* | ||
73 | * This will unroll the loop for the normal constant case (8 ints, | ||
74 | * for a 256-bit fd_set) | ||
75 | */ | ||
76 | #undef __FD_ZERO | ||
77 | static __inline__ void __FD_ZERO(__kernel_fd_set *__p) | ||
78 | { | ||
79 | unsigned long *__tmp = __p->fds_bits; | ||
80 | int __i; | ||
81 | |||
82 | if (__builtin_constant_p(__FDSET_LONGS)) { | ||
83 | switch (__FDSET_LONGS) { | ||
84 | case 16: | ||
85 | __tmp[ 0] = 0; __tmp[ 1] = 0; | ||
86 | __tmp[ 2] = 0; __tmp[ 3] = 0; | ||
87 | __tmp[ 4] = 0; __tmp[ 5] = 0; | ||
88 | __tmp[ 6] = 0; __tmp[ 7] = 0; | ||
89 | __tmp[ 8] = 0; __tmp[ 9] = 0; | ||
90 | __tmp[10] = 0; __tmp[11] = 0; | ||
91 | __tmp[12] = 0; __tmp[13] = 0; | ||
92 | __tmp[14] = 0; __tmp[15] = 0; | ||
93 | return; | ||
94 | |||
95 | case 8: | ||
96 | __tmp[ 0] = 0; __tmp[ 1] = 0; | ||
97 | __tmp[ 2] = 0; __tmp[ 3] = 0; | ||
98 | __tmp[ 4] = 0; __tmp[ 5] = 0; | ||
99 | __tmp[ 6] = 0; __tmp[ 7] = 0; | ||
100 | return; | ||
101 | |||
102 | case 4: | ||
103 | __tmp[ 0] = 0; __tmp[ 1] = 0; | ||
104 | __tmp[ 2] = 0; __tmp[ 3] = 0; | ||
105 | return; | ||
106 | } | ||
107 | } | ||
108 | __i = __FDSET_LONGS; | ||
109 | while (__i) { | ||
110 | __i--; | ||
111 | *__tmp = 0; | ||
112 | __tmp++; | ||
113 | } | ||
114 | } | ||
115 | |||
116 | #endif /* defined(__KERNEL__) */ | ||
117 | 28 | ||
118 | #endif /* __ASM_SH_POSIX_TYPES_H */ | 29 | #endif /* __ASM_SH_POSIX_TYPES_32_H */ |
diff --git a/arch/sh/include/asm/posix_types_64.h b/arch/sh/include/asm/posix_types_64.h index f83e9bd463d8..8cd11485c06b 100644 --- a/arch/sh/include/asm/posix_types_64.h +++ b/arch/sh/include/asm/posix_types_64.h | |||
@@ -1,127 +1,34 @@ | |||
1 | #ifndef __ASM_SH64_POSIX_TYPES_H | 1 | #ifndef __ASM_SH_POSIX_TYPES_64_H |
2 | #define __ASM_SH64_POSIX_TYPES_H | 2 | #define __ASM_SH_POSIX_TYPES_64_H |
3 | 3 | ||
4 | /* | ||
5 | * This file is subject to the terms and conditions of the GNU General Public | ||
6 | * License. See the file "COPYING" in the main directory of this archive | ||
7 | * for more details. | ||
8 | * | ||
9 | * include/asm-sh64/posix_types.h | ||
10 | * | ||
11 | * Copyright (C) 2000, 2001 Paolo Alberelli | ||
12 | * Copyright (C) 2003 Paul Mundt | ||
13 | * | ||
14 | * This file is generally used by user-level software, so you need to | ||
15 | * be a little careful about namespace pollution etc. Also, we cannot | ||
16 | * assume GCC is being used. | ||
17 | */ | ||
18 | |||
19 | typedef unsigned long __kernel_ino_t; | ||
20 | typedef unsigned short __kernel_mode_t; | 4 | typedef unsigned short __kernel_mode_t; |
5 | #define __kernel_mode_t __kernel_mode_t | ||
21 | typedef unsigned short __kernel_nlink_t; | 6 | typedef unsigned short __kernel_nlink_t; |
22 | typedef long __kernel_off_t; | 7 | #define __kernel_nlink_t __kernel_nlink_t |
23 | typedef int __kernel_pid_t; | ||
24 | typedef unsigned short __kernel_ipc_pid_t; | 8 | typedef unsigned short __kernel_ipc_pid_t; |
9 | #define __kernel_ipc_pid_t __kernel_ipc_pid_t | ||
25 | typedef unsigned short __kernel_uid_t; | 10 | typedef unsigned short __kernel_uid_t; |
11 | #define __kernel_uid_t __kernel_uid_t | ||
26 | typedef unsigned short __kernel_gid_t; | 12 | typedef unsigned short __kernel_gid_t; |
13 | #define __kernel_gid_t __kernel_gid_t | ||
27 | typedef long unsigned int __kernel_size_t; | 14 | typedef long unsigned int __kernel_size_t; |
15 | #define __kernel_size_t __kernel_size_t | ||
28 | typedef int __kernel_ssize_t; | 16 | typedef int __kernel_ssize_t; |
17 | #define __kernel_ssize_t __kernel_ssize_t | ||
29 | typedef int __kernel_ptrdiff_t; | 18 | typedef int __kernel_ptrdiff_t; |
30 | typedef long __kernel_time_t; | 19 | #define __kernel_ptrdiff_t __kernel_ptrdiff_t |
31 | typedef long __kernel_suseconds_t; | ||
32 | typedef long __kernel_clock_t; | ||
33 | typedef int __kernel_timer_t; | ||
34 | typedef int __kernel_clockid_t; | ||
35 | typedef int __kernel_daddr_t; | ||
36 | typedef char * __kernel_caddr_t; | ||
37 | typedef unsigned short __kernel_uid16_t; | ||
38 | typedef unsigned short __kernel_gid16_t; | ||
39 | typedef unsigned int __kernel_uid32_t; | 20 | typedef unsigned int __kernel_uid32_t; |
21 | #define __kernel_uid32_t __kernel_uid32_t | ||
40 | typedef unsigned int __kernel_gid32_t; | 22 | typedef unsigned int __kernel_gid32_t; |
23 | #define __kernel_gid32_t __kernel_gid32_t | ||
41 | 24 | ||
42 | typedef unsigned short __kernel_old_uid_t; | 25 | typedef unsigned short __kernel_old_uid_t; |
26 | #define __kernel_old_uid_t __kernel_old_uid_t | ||
43 | typedef unsigned short __kernel_old_gid_t; | 27 | typedef unsigned short __kernel_old_gid_t; |
28 | #define __kernel_old_gid_t __kernel_old_gid_t | ||
44 | typedef unsigned short __kernel_old_dev_t; | 29 | typedef unsigned short __kernel_old_dev_t; |
30 | #define __kernel_old_dev_t __kernel_old_dev_t | ||
45 | 31 | ||
46 | #ifdef __GNUC__ | 32 | #include <asm-generic/posix_types.h> |
47 | typedef long long __kernel_loff_t; | ||
48 | #endif | ||
49 | |||
50 | typedef struct { | ||
51 | int val[2]; | ||
52 | } __kernel_fsid_t; | ||
53 | |||
54 | #if defined(__KERNEL__) | ||
55 | |||
56 | #undef __FD_SET | ||
57 | static __inline__ void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp) | ||
58 | { | ||
59 | unsigned long __tmp = __fd / __NFDBITS; | ||
60 | unsigned long __rem = __fd % __NFDBITS; | ||
61 | __fdsetp->fds_bits[__tmp] |= (1UL<<__rem); | ||
62 | } | ||
63 | |||
64 | #undef __FD_CLR | ||
65 | static __inline__ void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp) | ||
66 | { | ||
67 | unsigned long __tmp = __fd / __NFDBITS; | ||
68 | unsigned long __rem = __fd % __NFDBITS; | ||
69 | __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem); | ||
70 | } | ||
71 | |||
72 | |||
73 | #undef __FD_ISSET | ||
74 | static __inline__ int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p) | ||
75 | { | ||
76 | unsigned long __tmp = __fd / __NFDBITS; | ||
77 | unsigned long __rem = __fd % __NFDBITS; | ||
78 | return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0; | ||
79 | } | ||
80 | |||
81 | /* | ||
82 | * This will unroll the loop for the normal constant case (8 ints, | ||
83 | * for a 256-bit fd_set) | ||
84 | */ | ||
85 | #undef __FD_ZERO | ||
86 | static __inline__ void __FD_ZERO(__kernel_fd_set *__p) | ||
87 | { | ||
88 | unsigned long *__tmp = __p->fds_bits; | ||
89 | int __i; | ||
90 | |||
91 | if (__builtin_constant_p(__FDSET_LONGS)) { | ||
92 | switch (__FDSET_LONGS) { | ||
93 | case 16: | ||
94 | __tmp[ 0] = 0; __tmp[ 1] = 0; | ||
95 | __tmp[ 2] = 0; __tmp[ 3] = 0; | ||
96 | __tmp[ 4] = 0; __tmp[ 5] = 0; | ||
97 | __tmp[ 6] = 0; __tmp[ 7] = 0; | ||
98 | __tmp[ 8] = 0; __tmp[ 9] = 0; | ||
99 | __tmp[10] = 0; __tmp[11] = 0; | ||
100 | __tmp[12] = 0; __tmp[13] = 0; | ||
101 | __tmp[14] = 0; __tmp[15] = 0; | ||
102 | return; | ||
103 | |||
104 | case 8: | ||
105 | __tmp[ 0] = 0; __tmp[ 1] = 0; | ||
106 | __tmp[ 2] = 0; __tmp[ 3] = 0; | ||
107 | __tmp[ 4] = 0; __tmp[ 5] = 0; | ||
108 | __tmp[ 6] = 0; __tmp[ 7] = 0; | ||
109 | return; | ||
110 | |||
111 | case 4: | ||
112 | __tmp[ 0] = 0; __tmp[ 1] = 0; | ||
113 | __tmp[ 2] = 0; __tmp[ 3] = 0; | ||
114 | return; | ||
115 | } | ||
116 | } | ||
117 | __i = __FDSET_LONGS; | ||
118 | while (__i) { | ||
119 | __i--; | ||
120 | *__tmp = 0; | ||
121 | __tmp++; | ||
122 | } | ||
123 | } | ||
124 | |||
125 | #endif /* defined(__KERNEL__) */ | ||
126 | 33 | ||
127 | #endif /* __ASM_SH64_POSIX_TYPES_H */ | 34 | #endif /* __ASM_SH_POSIX_TYPES_64_H */ |
diff --git a/arch/sh/include/asm/scatterlist.h b/arch/sh/include/asm/scatterlist.h index c693d268a413..327cc2e4c97b 100644 --- a/arch/sh/include/asm/scatterlist.h +++ b/arch/sh/include/asm/scatterlist.h | |||
@@ -1,28 +1,8 @@ | |||
1 | #ifndef __ASM_SH_SCATTERLIST_H | 1 | #ifndef __ASM_SH_SCATTERLIST_H |
2 | #define __ASM_SH_SCATTERLIST_H | 2 | #define __ASM_SH_SCATTERLIST_H |
3 | 3 | ||
4 | #include <asm/types.h> | ||
5 | |||
6 | struct scatterlist { | ||
7 | #ifdef CONFIG_DEBUG_SG | ||
8 | unsigned long sg_magic; | ||
9 | #endif | ||
10 | unsigned long page_link; | ||
11 | unsigned int offset; /* for highmem, page offset */ | ||
12 | unsigned int length; | ||
13 | dma_addr_t dma_address; | ||
14 | unsigned int dma_length; | ||
15 | }; | ||
16 | |||
17 | #define ISA_DMA_THRESHOLD PHYS_ADDR_MASK | 4 | #define ISA_DMA_THRESHOLD PHYS_ADDR_MASK |
18 | 5 | ||
19 | /* These macros should be used after a pci_map_sg call has been done | 6 | #include <asm-generic/scatterlist.h> |
20 | * to get bus addresses of each of the SG entries and their lengths. | ||
21 | * You should only work with the number of sg entries pci_map_sg | ||
22 | * returns, or alternatively stop on the first sg_dma_len(sg) which | ||
23 | * is 0. | ||
24 | */ | ||
25 | #define sg_dma_address(sg) ((sg)->dma_address) | ||
26 | #define sg_dma_len(sg) ((sg)->length) | ||
27 | 7 | ||
28 | #endif /* !(__ASM_SH_SCATTERLIST_H) */ | 8 | #endif /* __ASM_SH_SCATTERLIST_H */ |
diff --git a/arch/sh/include/asm/sembuf.h b/arch/sh/include/asm/sembuf.h index d79f3bd570b2..7673b83cfef7 100644 --- a/arch/sh/include/asm/sembuf.h +++ b/arch/sh/include/asm/sembuf.h | |||
@@ -1,25 +1 @@ | |||
1 | #ifndef __ASM_SH_SEMBUF_H | #include <asm-generic/sembuf.h> | |
2 | #define __ASM_SH_SEMBUF_H | ||
3 | |||
4 | /* | ||
5 | * The semid64_ds structure for i386 architecture. | ||
6 | * Note extra padding because this structure is passed back and forth | ||
7 | * between kernel and user space. | ||
8 | * | ||
9 | * Pad space is left for: | ||
10 | * - 64-bit time_t to solve y2038 problem | ||
11 | * - 2 miscellaneous 32-bit values | ||
12 | */ | ||
13 | |||
14 | struct semid64_ds { | ||
15 | struct ipc64_perm sem_perm; /* permissions .. see ipc.h */ | ||
16 | __kernel_time_t sem_otime; /* last semop time */ | ||
17 | unsigned long __unused1; | ||
18 | __kernel_time_t sem_ctime; /* last change time */ | ||
19 | unsigned long __unused2; | ||
20 | unsigned long sem_nsems; /* no. of semaphores in array */ | ||
21 | unsigned long __unused3; | ||
22 | unsigned long __unused4; | ||
23 | }; | ||
24 | |||
25 | #endif /* __ASM_SH_SEMBUF_H */ | ||
diff --git a/arch/sh/include/asm/serial.h b/arch/sh/include/asm/serial.h index 11f854dd1363..a0cb0caff152 100644 --- a/arch/sh/include/asm/serial.h +++ b/arch/sh/include/asm/serial.h | |||
@@ -1,19 +1 @@ | |||
1 | /* | #include <asm-generic/serial.h> | |
2 | * include/asm-sh/serial.h | ||
3 | * | ||
4 | * Configuration details for 8250, 16450, 16550, etc. serial ports | ||
5 | */ | ||
6 | |||
7 | #ifndef _ASM_SERIAL_H | ||
8 | #define _ASM_SERIAL_H | ||
9 | |||
10 | /* | ||
11 | * This assumes you have a 1.8432 MHz clock for your UART. | ||
12 | * | ||
13 | * It'd be nice if someone built a serial card with a 24.576 MHz | ||
14 | * clock, since the 16550A is capable of handling a top speed of 1.5 | ||
15 | * megabits/second; but this requires the faster clock. | ||
16 | */ | ||
17 | #define BASE_BAUD ( 1843200 / 16 ) | ||
18 | |||
19 | #endif /* _ASM_SERIAL_H */ | ||
diff --git a/arch/sh/include/asm/setup.h b/arch/sh/include/asm/setup.h index d450bcf59ee2..ce3743599b27 100644 --- a/arch/sh/include/asm/setup.h +++ b/arch/sh/include/asm/setup.h | |||
@@ -1,7 +1,7 @@ | |||
1 | #ifndef _SH_SETUP_H | 1 | #ifndef _SH_SETUP_H |
2 | #define _SH_SETUP_H | 2 | #define _SH_SETUP_H |
3 | 3 | ||
4 | #define COMMAND_LINE_SIZE 256 | 4 | #include <asm-generic/setup.h> |
5 | 5 | ||
6 | #ifdef __KERNEL__ | 6 | #ifdef __KERNEL__ |
7 | /* | 7 | /* |
diff --git a/arch/sh/include/asm/shmbuf.h b/arch/sh/include/asm/shmbuf.h index b2101f490521..83c05fc2de38 100644 --- a/arch/sh/include/asm/shmbuf.h +++ b/arch/sh/include/asm/shmbuf.h | |||
@@ -1,42 +1 @@ | |||
1 | #ifndef __ASM_SH_SHMBUF_H | #include <asm-generic/shmbuf.h> | |
2 | #define __ASM_SH_SHMBUF_H | ||
3 | |||
4 | /* | ||
5 | * The shmid64_ds structure for i386 architecture. | ||
6 | * Note extra padding because this structure is passed back and forth | ||
7 | * between kernel and user space. | ||
8 | * | ||
9 | * Pad space is left for: | ||
10 | * - 64-bit time_t to solve y2038 problem | ||
11 | * - 2 miscellaneous 32-bit values | ||
12 | */ | ||
13 | |||
14 | struct shmid64_ds { | ||
15 | struct ipc64_perm shm_perm; /* operation perms */ | ||
16 | size_t shm_segsz; /* size of segment (bytes) */ | ||
17 | __kernel_time_t shm_atime; /* last attach time */ | ||
18 | unsigned long __unused1; | ||
19 | __kernel_time_t shm_dtime; /* last detach time */ | ||
20 | unsigned long __unused2; | ||
21 | __kernel_time_t shm_ctime; /* last change time */ | ||
22 | unsigned long __unused3; | ||
23 | __kernel_pid_t shm_cpid; /* pid of creator */ | ||
24 | __kernel_pid_t shm_lpid; /* pid of last operator */ | ||
25 | unsigned long shm_nattch; /* no. of current attaches */ | ||
26 | unsigned long __unused4; | ||
27 | unsigned long __unused5; | ||
28 | }; | ||
29 | |||
30 | struct shminfo64 { | ||
31 | unsigned long shmmax; | ||
32 | unsigned long shmmin; | ||
33 | unsigned long shmmni; | ||
34 | unsigned long shmseg; | ||
35 | unsigned long shmall; | ||
36 | unsigned long __unused1; | ||
37 | unsigned long __unused2; | ||
38 | unsigned long __unused3; | ||
39 | unsigned long __unused4; | ||
40 | }; | ||
41 | |||
42 | #endif /* __ASM_SH_SHMBUF_H */ | ||
diff --git a/arch/sh/include/asm/signal.h b/arch/sh/include/asm/signal.h index 9cc5f0144689..9ac530a90bce 100644 --- a/arch/sh/include/asm/signal.h +++ b/arch/sh/include/asm/signal.h | |||
@@ -1,114 +1,10 @@ | |||
1 | #ifndef __ASM_SH_SIGNAL_H | 1 | #ifndef __ASM_SH_SIGNAL_H |
2 | #define __ASM_SH_SIGNAL_H | 2 | #define __ASM_SH_SIGNAL_H |
3 | 3 | ||
4 | #include <linux/types.h> | ||
5 | |||
6 | /* Avoid too many header ordering problems. */ | ||
7 | struct pt_regs; | ||
8 | struct siginfo; | ||
9 | |||
10 | #ifdef __KERNEL__ | ||
11 | /* Most things should be clean enough to redefine this at will, if care | ||
12 | is taken to make libc match. */ | ||
13 | |||
14 | #define _NSIG 64 | ||
15 | #define _NSIG_BPW 32 | ||
16 | #define _NSIG_WORDS (_NSIG / _NSIG_BPW) | ||
17 | |||
18 | typedef unsigned long old_sigset_t; /* at least 32 bits */ | ||
19 | |||
20 | typedef struct { | ||
21 | unsigned long sig[_NSIG_WORDS]; | ||
22 | } sigset_t; | ||
23 | |||
24 | #else | ||
25 | /* Here we must cater to libcs that poke about in kernel headers. */ | ||
26 | |||
27 | #define NSIG 32 | ||
28 | typedef unsigned long sigset_t; | ||
29 | |||
30 | #endif /* __KERNEL__ */ | ||
31 | |||
32 | #define SIGHUP 1 | ||
33 | #define SIGINT 2 | ||
34 | #define SIGQUIT 3 | ||
35 | #define SIGILL 4 | ||
36 | #define SIGTRAP 5 | ||
37 | #define SIGABRT 6 | ||
38 | #define SIGIOT 6 | ||
39 | #define SIGBUS 7 | ||
40 | #define SIGFPE 8 | ||
41 | #define SIGKILL 9 | ||
42 | #define SIGUSR1 10 | ||
43 | #define SIGSEGV 11 | ||
44 | #define SIGUSR2 12 | ||
45 | #define SIGPIPE 13 | ||
46 | #define SIGALRM 14 | ||
47 | #define SIGTERM 15 | ||
48 | #define SIGSTKFLT 16 | ||
49 | #define SIGCHLD 17 | ||
50 | #define SIGCONT 18 | ||
51 | #define SIGSTOP 19 | ||
52 | #define SIGTSTP 20 | ||
53 | #define SIGTTIN 21 | ||
54 | #define SIGTTOU 22 | ||
55 | #define SIGURG 23 | ||
56 | #define SIGXCPU 24 | ||
57 | #define SIGXFSZ 25 | ||
58 | #define SIGVTALRM 26 | ||
59 | #define SIGPROF 27 | ||
60 | #define SIGWINCH 28 | ||
61 | #define SIGIO 29 | ||
62 | #define SIGPOLL SIGIO | ||
63 | /* | ||
64 | #define SIGLOST 29 | ||
65 | */ | ||
66 | #define SIGPWR 30 | ||
67 | #define SIGSYS 31 | ||
68 | #define SIGUNUSED 31 | ||
69 | |||
70 | /* These should not be considered constants from userland. */ | ||
71 | #define SIGRTMIN 32 | ||
72 | #define SIGRTMAX _NSIG | ||
73 | |||
74 | /* | ||
75 | * SA_FLAGS values: | ||
76 | * | ||
77 | * SA_ONSTACK indicates that a registered stack_t will be used. | ||
78 | * SA_RESTART flag to get restarting signals (which were the default long ago) | ||
79 | * SA_NOCLDSTOP flag to turn off SIGCHLD when children stop. | ||
80 | * SA_RESETHAND clears the handler when the signal is delivered. | ||
81 | * SA_NOCLDWAIT flag on SIGCHLD to inhibit zombies. | ||
82 | * SA_NODEFER prevents the current signal from being masked in the handler. | ||
83 | * | ||
84 | * SA_ONESHOT and SA_NOMASK are the historical Linux names for the Single | ||
85 | * Unix names RESETHAND and NODEFER respectively. | ||
86 | */ | ||
87 | #define SA_NOCLDSTOP 0x00000001 | ||
88 | #define SA_NOCLDWAIT 0x00000002 | ||
89 | #define SA_SIGINFO 0x00000004 | ||
90 | #define SA_ONSTACK 0x08000000 | ||
91 | #define SA_RESTART 0x10000000 | ||
92 | #define SA_NODEFER 0x40000000 | ||
93 | #define SA_RESETHAND 0x80000000 | ||
94 | |||
95 | #define SA_NOMASK SA_NODEFER | ||
96 | #define SA_ONESHOT SA_RESETHAND | ||
97 | |||
98 | #define SA_RESTORER 0x04000000 | 4 | #define SA_RESTORER 0x04000000 |
99 | 5 | ||
100 | /* | 6 | #include <asm-generic/signal.h> |
101 | * sigaltstack controls | ||
102 | */ | ||
103 | #define SS_ONSTACK 1 | ||
104 | #define SS_DISABLE 2 | ||
105 | |||
106 | #define MINSIGSTKSZ 2048 | ||
107 | #define SIGSTKSZ 8192 | ||
108 | 7 | ||
109 | #include <asm-generic/signal-defs.h> | ||
110 | |||
111 | #ifdef __KERNEL__ | ||
112 | struct old_sigaction { | 8 | struct old_sigaction { |
113 | __sighandler_t sa_handler; | 9 | __sighandler_t sa_handler; |
114 | old_sigset_t sa_mask; | 10 | old_sigset_t sa_mask; |
@@ -116,45 +12,4 @@ struct old_sigaction { | |||
116 | void (*sa_restorer)(void); | 12 | void (*sa_restorer)(void); |
117 | }; | 13 | }; |
118 | 14 | ||
119 | struct sigaction { | ||
120 | __sighandler_t sa_handler; | ||
121 | unsigned long sa_flags; | ||
122 | void (*sa_restorer)(void); | ||
123 | sigset_t sa_mask; /* mask last for extensibility */ | ||
124 | }; | ||
125 | |||
126 | struct k_sigaction { | ||
127 | struct sigaction sa; | ||
128 | }; | ||
129 | #else | ||
130 | /* Here we must cater to libcs that poke about in kernel headers. */ | ||
131 | |||
132 | struct sigaction { | ||
133 | union { | ||
134 | __sighandler_t _sa_handler; | ||
135 | void (*_sa_sigaction)(int, struct siginfo *, void *); | ||
136 | } _u; | ||
137 | sigset_t sa_mask; | ||
138 | unsigned long sa_flags; | ||
139 | void (*sa_restorer)(void); | ||
140 | }; | ||
141 | |||
142 | #define sa_handler _u._sa_handler | ||
143 | #define sa_sigaction _u._sa_sigaction | ||
144 | |||
145 | #endif /* __KERNEL__ */ | ||
146 | |||
147 | typedef struct sigaltstack { | ||
148 | void *ss_sp; | ||
149 | int ss_flags; | ||
150 | size_t ss_size; | ||
151 | } stack_t; | ||
152 | |||
153 | #ifdef __KERNEL__ | ||
154 | #include <asm/sigcontext.h> | ||
155 | |||
156 | #define ptrace_signal_deliver(regs, cookie) do { } while (0) | ||
157 | |||
158 | #endif /* __KERNEL__ */ | ||
159 | |||
160 | #endif /* __ASM_SH_SIGNAL_H */ | 15 | #endif /* __ASM_SH_SIGNAL_H */ |
diff --git a/arch/sh/include/asm/smp.h b/arch/sh/include/asm/smp.h index c24e9c6a1736..ca64f43abe67 100644 --- a/arch/sh/include/asm/smp.h +++ b/arch/sh/include/asm/smp.h | |||
@@ -43,7 +43,8 @@ void plat_start_cpu(unsigned int cpu, unsigned long entry_point); | |||
43 | void plat_send_ipi(unsigned int cpu, unsigned int message); | 43 | void plat_send_ipi(unsigned int cpu, unsigned int message); |
44 | 44 | ||
45 | void arch_send_call_function_single_ipi(int cpu); | 45 | void arch_send_call_function_single_ipi(int cpu); |
46 | void arch_send_call_function_ipi(cpumask_t mask); | 46 | extern void arch_send_call_function_ipi_mask(const struct cpumask *mask); |
47 | #define arch_send_call_function_ipi_mask arch_send_call_function_ipi_mask | ||
47 | 48 | ||
48 | #else | 49 | #else |
49 | 50 | ||
diff --git a/arch/sh/include/asm/socket.h b/arch/sh/include/asm/socket.h index 345653b96826..6b71384b9d8b 100644 --- a/arch/sh/include/asm/socket.h +++ b/arch/sh/include/asm/socket.h | |||
@@ -1,60 +1 @@ | |||
1 | #ifndef __ASM_SH_SOCKET_H | #include <asm-generic/socket.h> | |
2 | #define __ASM_SH_SOCKET_H | ||
3 | |||
4 | #include <asm/sockios.h> | ||
5 | |||
6 | /* For setsockopt(2) */ | ||
7 | #define SOL_SOCKET 1 | ||
8 | |||
9 | #define SO_DEBUG 1 | ||
10 | #define SO_REUSEADDR 2 | ||
11 | #define SO_TYPE 3 | ||
12 | #define SO_ERROR 4 | ||
13 | #define SO_DONTROUTE 5 | ||
14 | #define SO_BROADCAST 6 | ||
15 | #define SO_SNDBUF 7 | ||
16 | #define SO_RCVBUF 8 | ||
17 | #define SO_RCVBUFFORCE 32 | ||
18 | #define SO_SNDBUFFORCE 33 | ||
19 | #define SO_KEEPALIVE 9 | ||
20 | #define SO_OOBINLINE 10 | ||
21 | #define SO_NO_CHECK 11 | ||
22 | #define SO_PRIORITY 12 | ||
23 | #define SO_LINGER 13 | ||
24 | #define SO_BSDCOMPAT 14 | ||
25 | /* To add :#define SO_REUSEPORT 15 */ | ||
26 | #define SO_PASSCRED 16 | ||
27 | #define SO_PEERCRED 17 | ||
28 | #define SO_RCVLOWAT 18 | ||
29 | #define SO_SNDLOWAT 19 | ||
30 | #define SO_RCVTIMEO 20 | ||
31 | #define SO_SNDTIMEO 21 | ||
32 | |||
33 | /* Security levels - as per NRL IPv6 - don't actually do anything */ | ||
34 | #define SO_SECURITY_AUTHENTICATION 22 | ||
35 | #define SO_SECURITY_ENCRYPTION_TRANSPORT 23 | ||
36 | #define SO_SECURITY_ENCRYPTION_NETWORK 24 | ||
37 | |||
38 | #define SO_BINDTODEVICE 25 | ||
39 | |||
40 | /* Socket filtering */ | ||
41 | #define SO_ATTACH_FILTER 26 | ||
42 | #define SO_DETACH_FILTER 27 | ||
43 | |||
44 | #define SO_PEERNAME 28 | ||
45 | #define SO_TIMESTAMP 29 | ||
46 | #define SCM_TIMESTAMP SO_TIMESTAMP | ||
47 | |||
48 | #define SO_ACCEPTCONN 30 | ||
49 | |||
50 | #define SO_PEERSEC 31 | ||
51 | #define SO_PASSSEC 34 | ||
52 | #define SO_TIMESTAMPNS 35 | ||
53 | #define SCM_TIMESTAMPNS SO_TIMESTAMPNS | ||
54 | |||
55 | #define SO_MARK 36 | ||
56 | |||
57 | #define SO_TIMESTAMPING 37 | ||
58 | #define SCM_TIMESTAMPING SO_TIMESTAMPING | ||
59 | |||
60 | #endif /* __ASM_SH_SOCKET_H */ | ||
diff --git a/arch/sh/include/asm/swab.h b/arch/sh/include/asm/swab.h index 0e08fe54ad71..1cd09767a7a3 100644 --- a/arch/sh/include/asm/swab.h +++ b/arch/sh/include/asm/swab.h | |||
@@ -7,8 +7,7 @@ | |||
7 | */ | 7 | */ |
8 | #include <linux/compiler.h> | 8 | #include <linux/compiler.h> |
9 | #include <linux/types.h> | 9 | #include <linux/types.h> |
10 | 10 | #include <asm-generic/swab.h> | |
11 | #define __SWAB_64_THRU_32__ | ||
12 | 11 | ||
13 | static inline __attribute_const__ __u32 __arch_swab32(__u32 x) | 12 | static inline __attribute_const__ __u32 __arch_swab32(__u32 x) |
14 | { | 13 | { |
diff --git a/arch/sh/include/asm/termbits.h b/arch/sh/include/asm/termbits.h index 77db116948cf..3935b106de79 100644 --- a/arch/sh/include/asm/termbits.h +++ b/arch/sh/include/asm/termbits.h | |||
@@ -1,198 +1 @@ | |||
1 | #ifndef __ASM_SH_TERMBITS_H | #include <asm-generic/termbits.h> | |
2 | #define __ASM_SH_TERMBITS_H | ||
3 | |||
4 | #include <linux/posix_types.h> | ||
5 | |||
6 | typedef unsigned char cc_t; | ||
7 | typedef unsigned int speed_t; | ||
8 | typedef unsigned int tcflag_t; | ||
9 | |||
10 | #define NCCS 19 | ||
11 | struct termios { | ||
12 | tcflag_t c_iflag; /* input mode flags */ | ||
13 | tcflag_t c_oflag; /* output mode flags */ | ||
14 | tcflag_t c_cflag; /* control mode flags */ | ||
15 | tcflag_t c_lflag; /* local mode flags */ | ||
16 | cc_t c_line; /* line discipline */ | ||
17 | cc_t c_cc[NCCS]; /* control characters */ | ||
18 | }; | ||
19 | |||
20 | struct termios2 { | ||
21 | tcflag_t c_iflag; /* input mode flags */ | ||
22 | tcflag_t c_oflag; /* output mode flags */ | ||
23 | tcflag_t c_cflag; /* control mode flags */ | ||
24 | tcflag_t c_lflag; /* local mode flags */ | ||
25 | cc_t c_line; /* line discipline */ | ||
26 | cc_t c_cc[NCCS]; /* control characters */ | ||
27 | speed_t c_ispeed; /* input speed */ | ||
28 | speed_t c_ospeed; /* output speed */ | ||
29 | }; | ||
30 | |||
31 | struct ktermios { | ||
32 | tcflag_t c_iflag; /* input mode flags */ | ||
33 | tcflag_t c_oflag; /* output mode flags */ | ||
34 | tcflag_t c_cflag; /* control mode flags */ | ||
35 | tcflag_t c_lflag; /* local mode flags */ | ||
36 | cc_t c_line; /* line discipline */ | ||
37 | cc_t c_cc[NCCS]; /* control characters */ | ||
38 | speed_t c_ispeed; /* input speed */ | ||
39 | speed_t c_ospeed; /* output speed */ | ||
40 | }; | ||
41 | |||
42 | /* c_cc characters */ | ||
43 | #define VINTR 0 | ||
44 | #define VQUIT 1 | ||
45 | #define VERASE 2 | ||
46 | #define VKILL 3 | ||
47 | #define VEOF 4 | ||
48 | #define VTIME 5 | ||
49 | #define VMIN 6 | ||
50 | #define VSWTC 7 | ||
51 | #define VSTART 8 | ||
52 | #define VSTOP 9 | ||
53 | #define VSUSP 10 | ||
54 | #define VEOL 11 | ||
55 | #define VREPRINT 12 | ||
56 | #define VDISCARD 13 | ||
57 | #define VWERASE 14 | ||
58 | #define VLNEXT 15 | ||
59 | #define VEOL2 16 | ||
60 | |||
61 | /* c_iflag bits */ | ||
62 | #define IGNBRK 0000001 | ||
63 | #define BRKINT 0000002 | ||
64 | #define IGNPAR 0000004 | ||
65 | #define PARMRK 0000010 | ||
66 | #define INPCK 0000020 | ||
67 | #define ISTRIP 0000040 | ||
68 | #define INLCR 0000100 | ||
69 | #define IGNCR 0000200 | ||
70 | #define ICRNL 0000400 | ||
71 | #define IUCLC 0001000 | ||
72 | #define IXON 0002000 | ||
73 | #define IXANY 0004000 | ||
74 | #define IXOFF 0010000 | ||
75 | #define IMAXBEL 0020000 | ||
76 | #define IUTF8 0040000 | ||
77 | |||
78 | /* c_oflag bits */ | ||
79 | #define OPOST 0000001 | ||
80 | #define OLCUC 0000002 | ||
81 | #define ONLCR 0000004 | ||
82 | #define OCRNL 0000010 | ||
83 | #define ONOCR 0000020 | ||
84 | #define ONLRET 0000040 | ||
85 | #define OFILL 0000100 | ||
86 | #define OFDEL 0000200 | ||
87 | #define NLDLY 0000400 | ||
88 | #define NL0 0000000 | ||
89 | #define NL1 0000400 | ||
90 | #define CRDLY 0003000 | ||
91 | #define CR0 0000000 | ||
92 | #define CR1 0001000 | ||
93 | #define CR2 0002000 | ||
94 | #define CR3 0003000 | ||
95 | #define TABDLY 0014000 | ||
96 | #define TAB0 0000000 | ||
97 | #define TAB1 0004000 | ||
98 | #define TAB2 0010000 | ||
99 | #define TAB3 0014000 | ||
100 | #define XTABS 0014000 | ||
101 | #define BSDLY 0020000 | ||
102 | #define BS0 0000000 | ||
103 | #define BS1 0020000 | ||
104 | #define VTDLY 0040000 | ||
105 | #define VT0 0000000 | ||
106 | #define VT1 0040000 | ||
107 | #define FFDLY 0100000 | ||
108 | #define FF0 0000000 | ||
109 | #define FF1 0100000 | ||
110 | |||
111 | /* c_cflag bit meaning */ | ||
112 | #define CBAUD 0010017 | ||
113 | #define B0 0000000 /* hang up */ | ||
114 | #define B50 0000001 | ||
115 | #define B75 0000002 | ||
116 | #define B110 0000003 | ||
117 | #define B134 0000004 | ||
118 | #define B150 0000005 | ||
119 | #define B200 0000006 | ||
120 | #define B300 0000007 | ||
121 | #define B600 0000010 | ||
122 | #define B1200 0000011 | ||
123 | #define B1800 0000012 | ||
124 | #define B2400 0000013 | ||
125 | #define B4800 0000014 | ||
126 | #define B9600 0000015 | ||
127 | #define B19200 0000016 | ||
128 | #define B38400 0000017 | ||
129 | #define EXTA B19200 | ||
130 | #define EXTB B38400 | ||
131 | #define CSIZE 0000060 | ||
132 | #define CS5 0000000 | ||
133 | #define CS6 0000020 | ||
134 | #define CS7 0000040 | ||
135 | #define CS8 0000060 | ||
136 | #define CSTOPB 0000100 | ||
137 | #define CREAD 0000200 | ||
138 | #define PARENB 0000400 | ||
139 | #define PARODD 0001000 | ||
140 | #define HUPCL 0002000 | ||
141 | #define CLOCAL 0004000 | ||
142 | #define CBAUDEX 0010000 | ||
143 | #define BOTHER 0010000 | ||
144 | #define B57600 0010001 | ||
145 | #define B115200 0010002 | ||
146 | #define B230400 0010003 | ||
147 | #define B460800 0010004 | ||
148 | #define B500000 0010005 | ||
149 | #define B576000 0010006 | ||
150 | #define B921600 0010007 | ||
151 | #define B1000000 0010010 | ||
152 | #define B1152000 0010011 | ||
153 | #define B1500000 0010012 | ||
154 | #define B2000000 0010013 | ||
155 | #define B2500000 0010014 | ||
156 | #define B3000000 0010015 | ||
157 | #define B3500000 0010016 | ||
158 | #define B4000000 0010017 | ||
159 | #define CIBAUD 002003600000 /* input baud rate */ | ||
160 | #define CMSPAR 010000000000 /* mark or space (stick) parity */ | ||
161 | #define CRTSCTS 020000000000 /* flow control */ | ||
162 | |||
163 | #define IBSHIFT 16 /* Shift from CBAUD to CIBAUD */ | ||
164 | |||
165 | /* c_lflag bits */ | ||
166 | #define ISIG 0000001 | ||
167 | #define ICANON 0000002 | ||
168 | #define XCASE 0000004 | ||
169 | #define ECHO 0000010 | ||
170 | #define ECHOE 0000020 | ||
171 | #define ECHOK 0000040 | ||
172 | #define ECHONL 0000100 | ||
173 | #define NOFLSH 0000200 | ||
174 | #define TOSTOP 0000400 | ||
175 | #define ECHOCTL 0001000 | ||
176 | #define ECHOPRT 0002000 | ||
177 | #define ECHOKE 0004000 | ||
178 | #define FLUSHO 0010000 | ||
179 | #define PENDIN 0040000 | ||
180 | #define IEXTEN 0100000 | ||
181 | |||
182 | /* tcflow() and TCXONC use these */ | ||
183 | #define TCOOFF 0 | ||
184 | #define TCOON 1 | ||
185 | #define TCIOFF 2 | ||
186 | #define TCION 3 | ||
187 | |||
188 | /* tcflush() and TCFLSH use these */ | ||
189 | #define TCIFLUSH 0 | ||
190 | #define TCOFLUSH 1 | ||
191 | #define TCIOFLUSH 2 | ||
192 | |||
193 | /* tcsetattr uses these */ | ||
194 | #define TCSANOW 0 | ||
195 | #define TCSADRAIN 1 | ||
196 | #define TCSAFLUSH 2 | ||
197 | |||
198 | #endif /* __ASM_SH_TERMBITS_H */ | ||
diff --git a/arch/sh/include/asm/termios.h b/arch/sh/include/asm/termios.h index 0a8c793c76f2..280d78a9d966 100644 --- a/arch/sh/include/asm/termios.h +++ b/arch/sh/include/asm/termios.h | |||
@@ -1,90 +1 @@ | |||
1 | #ifndef __ASM_SH_TERMIOS_H | #include <asm-generic/termios.h> | |
2 | #define __ASM_SH_TERMIOS_H | ||
3 | |||
4 | #include <asm/termbits.h> | ||
5 | #include <asm/ioctls.h> | ||
6 | |||
7 | struct winsize { | ||
8 | unsigned short ws_row; | ||
9 | unsigned short ws_col; | ||
10 | unsigned short ws_xpixel; | ||
11 | unsigned short ws_ypixel; | ||
12 | }; | ||
13 | |||
14 | #define NCC 8 | ||
15 | struct termio { | ||
16 | unsigned short c_iflag; /* input mode flags */ | ||
17 | unsigned short c_oflag; /* output mode flags */ | ||
18 | unsigned short c_cflag; /* control mode flags */ | ||
19 | unsigned short c_lflag; /* local mode flags */ | ||
20 | unsigned char c_line; /* line discipline */ | ||
21 | unsigned char c_cc[NCC]; /* control characters */ | ||
22 | }; | ||
23 | |||
24 | /* modem lines */ | ||
25 | #define TIOCM_LE 0x001 | ||
26 | #define TIOCM_DTR 0x002 | ||
27 | #define TIOCM_RTS 0x004 | ||
28 | #define TIOCM_ST 0x008 | ||
29 | #define TIOCM_SR 0x010 | ||
30 | #define TIOCM_CTS 0x020 | ||
31 | #define TIOCM_CAR 0x040 | ||
32 | #define TIOCM_RNG 0x080 | ||
33 | #define TIOCM_DSR 0x100 | ||
34 | #define TIOCM_CD TIOCM_CAR | ||
35 | #define TIOCM_RI TIOCM_RNG | ||
36 | #define TIOCM_OUT1 0x2000 | ||
37 | #define TIOCM_OUT2 0x4000 | ||
38 | #define TIOCM_LOOP 0x8000 | ||
39 | |||
40 | /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */ | ||
41 | |||
42 | #ifdef __KERNEL__ | ||
43 | |||
44 | /* intr=^C quit=^\ erase=del kill=^U | ||
45 | eof=^D vtime=\0 vmin=\1 sxtc=\0 | ||
46 | start=^Q stop=^S susp=^Z eol=\0 | ||
47 | reprint=^R discard=^U werase=^W lnext=^V | ||
48 | eol2=\0 | ||
49 | */ | ||
50 | #define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0" | ||
51 | |||
52 | /* | ||
53 | * Translate a "termio" structure into a "termios". Ugh. | ||
54 | */ | ||
55 | #define SET_LOW_TERMIOS_BITS(termios, termio, x) { \ | ||
56 | unsigned short __tmp; \ | ||
57 | get_user(__tmp,&(termio)->x); \ | ||
58 | *(unsigned short *) &(termios)->x = __tmp; \ | ||
59 | } | ||
60 | |||
61 | #define user_termio_to_kernel_termios(termios, termio) \ | ||
62 | ({ \ | ||
63 | SET_LOW_TERMIOS_BITS(termios, termio, c_iflag); \ | ||
64 | SET_LOW_TERMIOS_BITS(termios, termio, c_oflag); \ | ||
65 | SET_LOW_TERMIOS_BITS(termios, termio, c_cflag); \ | ||
66 | SET_LOW_TERMIOS_BITS(termios, termio, c_lflag); \ | ||
67 | copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \ | ||
68 | }) | ||
69 | |||
70 | /* | ||
71 | * Translate a "termios" structure into a "termio". Ugh. | ||
72 | */ | ||
73 | #define kernel_termios_to_user_termio(termio, termios) \ | ||
74 | ({ \ | ||
75 | put_user((termios)->c_iflag, &(termio)->c_iflag); \ | ||
76 | put_user((termios)->c_oflag, &(termio)->c_oflag); \ | ||
77 | put_user((termios)->c_cflag, &(termio)->c_cflag); \ | ||
78 | put_user((termios)->c_lflag, &(termio)->c_lflag); \ | ||
79 | put_user((termios)->c_line, &(termio)->c_line); \ | ||
80 | copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \ | ||
81 | }) | ||
82 | |||
83 | #define user_termios_to_kernel_termios(k, u) copy_from_user(k, u, sizeof(struct termios2)) | ||
84 | #define kernel_termios_to_user_termios(u, k) copy_to_user(u, k, sizeof(struct termios2)) | ||
85 | #define user_termios_to_kernel_termios_1(k, u) copy_from_user(k, u, sizeof(struct termios)) | ||
86 | #define kernel_termios_to_user_termios_1(u, k) copy_to_user(u, k, sizeof(struct termios)) | ||
87 | |||
88 | #endif /* __KERNEL__ */ | ||
89 | |||
90 | #endif /* __ASM_SH_TERMIOS_H */ | ||
diff --git a/arch/sh/include/asm/timex.h b/arch/sh/include/asm/timex.h index a873e24113cf..b556d49e5f2b 100644 --- a/arch/sh/include/asm/timex.h +++ b/arch/sh/include/asm/timex.h | |||
@@ -8,11 +8,6 @@ | |||
8 | 8 | ||
9 | #define CLOCK_TICK_RATE (CONFIG_SH_PCLK_FREQ / 4) /* Underlying HZ */ | 9 | #define CLOCK_TICK_RATE (CONFIG_SH_PCLK_FREQ / 4) /* Underlying HZ */ |
10 | 10 | ||
11 | typedef unsigned long long cycles_t; | 11 | #include <asm-generic/timex.h> |
12 | |||
13 | static __inline__ cycles_t get_cycles (void) | ||
14 | { | ||
15 | return 0; | ||
16 | } | ||
17 | 12 | ||
18 | #endif /* __ASM_SH_TIMEX_H */ | 13 | #endif /* __ASM_SH_TIMEX_H */ |
diff --git a/arch/sh/include/asm/topology.h b/arch/sh/include/asm/topology.h index 8489a0905a87..b69ee850906d 100644 --- a/arch/sh/include/asm/topology.h +++ b/arch/sh/include/asm/topology.h | |||
@@ -35,9 +35,6 @@ | |||
35 | #define cpumask_of_node(node) ((void)node, cpu_online_mask) | 35 | #define cpumask_of_node(node) ((void)node, cpu_online_mask) |
36 | 36 | ||
37 | #define pcibus_to_node(bus) ((void)(bus), -1) | 37 | #define pcibus_to_node(bus) ((void)(bus), -1) |
38 | #define pcibus_to_cpumask(bus) (pcibus_to_node(bus) == -1 ? \ | ||
39 | CPU_MASK_ALL : \ | ||
40 | node_to_cpumask(pcibus_to_node(bus))) | ||
41 | #define cpumask_of_pcibus(bus) (pcibus_to_node(bus) == -1 ? \ | 38 | #define cpumask_of_pcibus(bus) (pcibus_to_node(bus) == -1 ? \ |
42 | CPU_MASK_ALL_PTR : \ | 39 | CPU_MASK_ALL_PTR : \ |
43 | cpumask_of_node(pcibus_to_node(bus))) | 40 | cpumask_of_node(pcibus_to_node(bus))) |
diff --git a/arch/sh/include/asm/types.h b/arch/sh/include/asm/types.h index b13caca62a76..c7f3c94837dd 100644 --- a/arch/sh/include/asm/types.h +++ b/arch/sh/include/asm/types.h | |||
@@ -1,27 +1,14 @@ | |||
1 | #ifndef __ASM_SH_TYPES_H | 1 | #ifndef __ASM_SH_TYPES_H |
2 | #define __ASM_SH_TYPES_H | 2 | #define __ASM_SH_TYPES_H |
3 | 3 | ||
4 | #include <asm-generic/int-ll64.h> | 4 | #include <asm-generic/types.h> |
5 | |||
6 | #ifndef __ASSEMBLY__ | ||
7 | |||
8 | typedef unsigned short umode_t; | ||
9 | |||
10 | #endif /* __ASSEMBLY__ */ | ||
11 | 5 | ||
12 | /* | 6 | /* |
13 | * These aren't exported outside the kernel to avoid name space clashes | 7 | * These aren't exported outside the kernel to avoid name space clashes |
14 | */ | 8 | */ |
15 | #ifdef __KERNEL__ | 9 | #ifdef __KERNEL__ |
16 | |||
17 | #define BITS_PER_LONG 32 | ||
18 | |||
19 | #ifndef __ASSEMBLY__ | 10 | #ifndef __ASSEMBLY__ |
20 | 11 | ||
21 | /* Dma addresses are 32-bits wide. */ | ||
22 | |||
23 | typedef u32 dma_addr_t; | ||
24 | |||
25 | #ifdef CONFIG_SUPERH32 | 12 | #ifdef CONFIG_SUPERH32 |
26 | typedef u16 insn_size_t; | 13 | typedef u16 insn_size_t; |
27 | #else | 14 | #else |
@@ -29,7 +16,6 @@ typedef u32 insn_size_t; | |||
29 | #endif | 16 | #endif |
30 | 17 | ||
31 | #endif /* __ASSEMBLY__ */ | 18 | #endif /* __ASSEMBLY__ */ |
32 | |||
33 | #endif /* __KERNEL__ */ | 19 | #endif /* __KERNEL__ */ |
34 | 20 | ||
35 | #endif /* __ASM_SH_TYPES_H */ | 21 | #endif /* __ASM_SH_TYPES_H */ |
diff --git a/arch/sh/include/asm/ucontext.h b/arch/sh/include/asm/ucontext.h index 202ef1d5a3c4..9bc07b9f30fb 100644 --- a/arch/sh/include/asm/ucontext.h +++ b/arch/sh/include/asm/ucontext.h | |||
@@ -1,12 +1 @@ | |||
1 | #ifndef __ASM_SH_UCONTEXT_H | #include <asm-generic/ucontext.h> | |
2 | #define __ASM_SH_UCONTEXT_H | ||
3 | |||
4 | struct ucontext { | ||
5 | unsigned long uc_flags; | ||
6 | struct ucontext *uc_link; | ||
7 | stack_t uc_stack; | ||
8 | struct sigcontext uc_mcontext; | ||
9 | sigset_t uc_sigmask; /* mask last for extensibility */ | ||
10 | }; | ||
11 | |||
12 | #endif /* __ASM_SH_UCONTEXT_H */ | ||
diff --git a/arch/sh/include/asm/unaligned.h b/arch/sh/include/asm/unaligned.h index 8c0ad5e4487a..7d14e0669961 100644 --- a/arch/sh/include/asm/unaligned.h +++ b/arch/sh/include/asm/unaligned.h | |||
@@ -6,19 +6,7 @@ | |||
6 | #include <asm/unaligned-sh4a.h> | 6 | #include <asm/unaligned-sh4a.h> |
7 | #else | 7 | #else |
8 | /* Otherwise, SH can't handle unaligned accesses. */ | 8 | /* Otherwise, SH can't handle unaligned accesses. */ |
9 | #ifdef __LITTLE_ENDIAN__ | 9 | #include <asm-generic/unaligned.h> |
10 | # include <linux/unaligned/le_struct.h> | ||
11 | # include <linux/unaligned/be_byteshift.h> | ||
12 | # include <linux/unaligned/generic.h> | ||
13 | # define get_unaligned __get_unaligned_le | ||
14 | # define put_unaligned __put_unaligned_le | ||
15 | #else | ||
16 | # include <linux/unaligned/be_struct.h> | ||
17 | # include <linux/unaligned/le_byteshift.h> | ||
18 | # include <linux/unaligned/generic.h> | ||
19 | # define get_unaligned __get_unaligned_be | ||
20 | # define put_unaligned __put_unaligned_be | ||
21 | #endif | ||
22 | #endif | 10 | #endif |
23 | 11 | ||
24 | #endif /* _ASM_SH_UNALIGNED_H */ | 12 | #endif /* _ASM_SH_UNALIGNED_H */ |
diff --git a/arch/sh/include/asm/unistd_32.h b/arch/sh/include/asm/unistd_32.h index 65197086a1c5..61d6ad93d786 100644 --- a/arch/sh/include/asm/unistd_32.h +++ b/arch/sh/include/asm/unistd_32.h | |||
@@ -344,8 +344,9 @@ | |||
344 | #define __NR_preadv 333 | 344 | #define __NR_preadv 333 |
345 | #define __NR_pwritev 334 | 345 | #define __NR_pwritev 334 |
346 | #define __NR_rt_tgsigqueueinfo 335 | 346 | #define __NR_rt_tgsigqueueinfo 335 |
347 | #define __NR_perf_counter_open 336 | ||
347 | 348 | ||
348 | #define NR_syscalls 336 | 349 | #define NR_syscalls 337 |
349 | 350 | ||
350 | #ifdef __KERNEL__ | 351 | #ifdef __KERNEL__ |
351 | 352 | ||
diff --git a/arch/sh/include/asm/unistd_64.h b/arch/sh/include/asm/unistd_64.h index 8014aea88ec3..a751699afda3 100644 --- a/arch/sh/include/asm/unistd_64.h +++ b/arch/sh/include/asm/unistd_64.h | |||
@@ -384,10 +384,11 @@ | |||
384 | #define __NR_preadv 361 | 384 | #define __NR_preadv 361 |
385 | #define __NR_pwritev 362 | 385 | #define __NR_pwritev 362 |
386 | #define __NR_rt_tgsigqueueinfo 363 | 386 | #define __NR_rt_tgsigqueueinfo 363 |
387 | #define __NR_perf_counter_open 364 | ||
387 | 388 | ||
388 | #ifdef __KERNEL__ | 389 | #ifdef __KERNEL__ |
389 | 390 | ||
390 | #define NR_syscalls 364 | 391 | #define NR_syscalls 365 |
391 | 392 | ||
392 | #define __ARCH_WANT_IPC_PARSE_VERSION | 393 | #define __ARCH_WANT_IPC_PARSE_VERSION |
393 | #define __ARCH_WANT_OLD_READDIR | 394 | #define __ARCH_WANT_OLD_READDIR |
diff --git a/arch/sh/include/mach-common/mach/highlander.h b/arch/sh/include/mach-common/mach/highlander.h index bd26a848cb0b..5d9d4d5154be 100644 --- a/arch/sh/include/mach-common/mach/highlander.h +++ b/arch/sh/include/mach-common/mach/highlander.h | |||
@@ -2,6 +2,9 @@ | |||
2 | #define __ASM_SH_RENESAS_R7780RP_H | 2 | #define __ASM_SH_RENESAS_R7780RP_H |
3 | 3 | ||
4 | /* Box specific addresses. */ | 4 | /* Box specific addresses. */ |
5 | #define PA_NORFLASH_ADDR 0x00000000 | ||
6 | #define PA_NORFLASH_SIZE 0x04000000 | ||
7 | |||
5 | #if defined(CONFIG_SH_R7780MP) | 8 | #if defined(CONFIG_SH_R7780MP) |
6 | #define PA_BCR 0xa4000000 /* FPGA */ | 9 | #define PA_BCR 0xa4000000 /* FPGA */ |
7 | #define PA_SDPOW (-1) | 10 | #define PA_SDPOW (-1) |
diff --git a/arch/sh/kernel/cpu/clock-cpg.c b/arch/sh/kernel/cpu/clock-cpg.c index 275942e58e4f..6dfe2cced3fc 100644 --- a/arch/sh/kernel/cpu/clock-cpg.c +++ b/arch/sh/kernel/cpu/clock-cpg.c | |||
@@ -1,6 +1,6 @@ | |||
1 | #include <linux/clk.h> | 1 | #include <linux/clk.h> |
2 | #include <linux/compiler.h> | 2 | #include <linux/compiler.h> |
3 | #include <linux/bootmem.h> | 3 | #include <linux/slab.h> |
4 | #include <linux/io.h> | 4 | #include <linux/io.h> |
5 | #include <asm/clock.h> | 5 | #include <asm/clock.h> |
6 | 6 | ||
@@ -127,10 +127,11 @@ int __init sh_clk_div6_register(struct clk *clks, int nr) | |||
127 | int k; | 127 | int k; |
128 | 128 | ||
129 | freq_table_size *= (nr_divs + 1); | 129 | freq_table_size *= (nr_divs + 1); |
130 | 130 | freq_table = kzalloc(freq_table_size * nr, GFP_KERNEL); | |
131 | freq_table = alloc_bootmem(freq_table_size * nr); | 131 | if (!freq_table) { |
132 | if (!freq_table) | 132 | pr_err("sh_clk_div6_register: unable to alloc memory\n"); |
133 | return -ENOMEM; | 133 | return -ENOMEM; |
134 | } | ||
134 | 135 | ||
135 | for (k = 0; !ret && (k < nr); k++) { | 136 | for (k = 0; !ret && (k < nr); k++) { |
136 | clkp = clks + k; | 137 | clkp = clks + k; |
@@ -175,10 +176,11 @@ int __init sh_clk_div4_register(struct clk *clks, int nr, | |||
175 | int k; | 176 | int k; |
176 | 177 | ||
177 | freq_table_size *= (nr_divs + 1); | 178 | freq_table_size *= (nr_divs + 1); |
178 | 179 | freq_table = kzalloc(freq_table_size * nr, GFP_KERNEL); | |
179 | freq_table = alloc_bootmem(freq_table_size * nr); | 180 | if (!freq_table) { |
180 | if (!freq_table) | 181 | pr_err("sh_clk_div4_register: unable to alloc memory\n"); |
181 | return -ENOMEM; | 182 | return -ENOMEM; |
183 | } | ||
182 | 184 | ||
183 | for (k = 0; !ret && (k < nr); k++) { | 185 | for (k = 0; !ret && (k < nr); k++) { |
184 | clkp = clks + k; | 186 | clkp = clks + k; |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7366.c b/arch/sh/kernel/cpu/sh4a/setup-sh7366.c index 318516f6bfad..c18f7d09281b 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7366.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7366.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/serial_sci.h> | 15 | #include <linux/serial_sci.h> |
16 | #include <linux/uio_driver.h> | 16 | #include <linux/uio_driver.h> |
17 | #include <linux/sh_timer.h> | 17 | #include <linux/sh_timer.h> |
18 | #include <linux/usb/r8a66597.h> | ||
18 | #include <asm/clock.h> | 19 | #include <asm/clock.h> |
19 | 20 | ||
20 | static struct resource iic_resources[] = { | 21 | static struct resource iic_resources[] = { |
@@ -38,18 +39,20 @@ static struct platform_device iic_device = { | |||
38 | .resource = iic_resources, | 39 | .resource = iic_resources, |
39 | }; | 40 | }; |
40 | 41 | ||
42 | static struct r8a66597_platdata r8a66597_data = { | ||
43 | /* This set zero to all members */ | ||
44 | }; | ||
45 | |||
41 | static struct resource usb_host_resources[] = { | 46 | static struct resource usb_host_resources[] = { |
42 | [0] = { | 47 | [0] = { |
43 | .name = "r8a66597_hcd", | ||
44 | .start = 0xa4d80000, | 48 | .start = 0xa4d80000, |
45 | .end = 0xa4d800ff, | 49 | .end = 0xa4d800ff, |
46 | .flags = IORESOURCE_MEM, | 50 | .flags = IORESOURCE_MEM, |
47 | }, | 51 | }, |
48 | [1] = { | 52 | [1] = { |
49 | .name = "r8a66597_hcd", | ||
50 | .start = 65, | 53 | .start = 65, |
51 | .end = 65, | 54 | .end = 65, |
52 | .flags = IORESOURCE_IRQ, | 55 | .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, |
53 | }, | 56 | }, |
54 | }; | 57 | }; |
55 | 58 | ||
@@ -59,6 +62,7 @@ static struct platform_device usb_host_device = { | |||
59 | .dev = { | 62 | .dev = { |
60 | .dma_mask = NULL, | 63 | .dma_mask = NULL, |
61 | .coherent_dma_mask = 0xffffffff, | 64 | .coherent_dma_mask = 0xffffffff, |
65 | .platform_data = &r8a66597_data, | ||
62 | }, | 66 | }, |
63 | .num_resources = ARRAY_SIZE(usb_host_resources), | 67 | .num_resources = ARRAY_SIZE(usb_host_resources), |
64 | .resource = usb_host_resources, | 68 | .resource = usb_host_resources, |
diff --git a/arch/sh/kernel/cpu/sh4a/setup-sh7723.c b/arch/sh/kernel/cpu/sh4a/setup-sh7723.c index d8f4a13aeff9..e1bb80b2a27b 100644 --- a/arch/sh/kernel/cpu/sh4a/setup-sh7723.c +++ b/arch/sh/kernel/cpu/sh4a/setup-sh7723.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <linux/mm.h> | 13 | #include <linux/mm.h> |
14 | #include <linux/serial_sci.h> | 14 | #include <linux/serial_sci.h> |
15 | #include <linux/uio_driver.h> | 15 | #include <linux/uio_driver.h> |
16 | #include <linux/usb/r8a66597.h> | ||
16 | #include <linux/sh_timer.h> | 17 | #include <linux/sh_timer.h> |
17 | #include <linux/io.h> | 18 | #include <linux/io.h> |
18 | #include <asm/clock.h> | 19 | #include <asm/clock.h> |
@@ -396,9 +397,12 @@ static struct platform_device rtc_device = { | |||
396 | .resource = rtc_resources, | 397 | .resource = rtc_resources, |
397 | }; | 398 | }; |
398 | 399 | ||
400 | static struct r8a66597_platdata r8a66597_data = { | ||
401 | /* This set zero to all members */ | ||
402 | }; | ||
403 | |||
399 | static struct resource sh7723_usb_host_resources[] = { | 404 | static struct resource sh7723_usb_host_resources[] = { |
400 | [0] = { | 405 | [0] = { |
401 | .name = "r8a66597_hcd", | ||
402 | .start = 0xa4d80000, | 406 | .start = 0xa4d80000, |
403 | .end = 0xa4d800ff, | 407 | .end = 0xa4d800ff, |
404 | .flags = IORESOURCE_MEM, | 408 | .flags = IORESOURCE_MEM, |
@@ -406,7 +410,7 @@ static struct resource sh7723_usb_host_resources[] = { | |||
406 | [1] = { | 410 | [1] = { |
407 | .start = 65, | 411 | .start = 65, |
408 | .end = 65, | 412 | .end = 65, |
409 | .flags = IORESOURCE_IRQ, | 413 | .flags = IORESOURCE_IRQ | IRQF_TRIGGER_LOW, |
410 | }, | 414 | }, |
411 | }; | 415 | }; |
412 | 416 | ||
@@ -416,6 +420,7 @@ static struct platform_device sh7723_usb_host_device = { | |||
416 | .dev = { | 420 | .dev = { |
417 | .dma_mask = NULL, /* not use dma */ | 421 | .dma_mask = NULL, /* not use dma */ |
418 | .coherent_dma_mask = 0xffffffff, | 422 | .coherent_dma_mask = 0xffffffff, |
423 | .platform_data = &r8a66597_data, | ||
419 | }, | 424 | }, |
420 | .num_resources = ARRAY_SIZE(sh7723_usb_host_resources), | 425 | .num_resources = ARRAY_SIZE(sh7723_usb_host_resources), |
421 | .resource = sh7723_usb_host_resources, | 426 | .resource = sh7723_usb_host_resources, |
diff --git a/arch/sh/kernel/cpu/sh4a/smp-shx3.c b/arch/sh/kernel/cpu/sh4a/smp-shx3.c index b8869aa20dec..2b6b0d50c576 100644 --- a/arch/sh/kernel/cpu/sh4a/smp-shx3.c +++ b/arch/sh/kernel/cpu/sh4a/smp-shx3.c | |||
@@ -35,8 +35,7 @@ void __init plat_smp_setup(void) | |||
35 | unsigned int cpu = 0; | 35 | unsigned int cpu = 0; |
36 | int i, num; | 36 | int i, num; |
37 | 37 | ||
38 | cpus_clear(cpu_possible_map); | 38 | init_cpu_possible(cpumask_of(cpu)); |
39 | cpu_set(cpu, cpu_possible_map); | ||
40 | 39 | ||
41 | __cpu_number_map[0] = 0; | 40 | __cpu_number_map[0] = 0; |
42 | __cpu_logical_map[0] = 0; | 41 | __cpu_logical_map[0] = 0; |
@@ -46,7 +45,7 @@ void __init plat_smp_setup(void) | |||
46 | * for the total number of cores. | 45 | * for the total number of cores. |
47 | */ | 46 | */ |
48 | for (i = 1, num = 0; i < NR_CPUS; i++) { | 47 | for (i = 1, num = 0; i < NR_CPUS; i++) { |
49 | cpu_set(i, cpu_possible_map); | 48 | set_cpu_possible(i, true); |
50 | __cpu_number_map[i] = ++num; | 49 | __cpu_number_map[i] = ++num; |
51 | __cpu_logical_map[num] = i; | 50 | __cpu_logical_map[num] = i; |
52 | } | 51 | } |
diff --git a/arch/sh/kernel/ftrace.c b/arch/sh/kernel/ftrace.c index 4c3247477aa3..066f37dc32a9 100644 --- a/arch/sh/kernel/ftrace.c +++ b/arch/sh/kernel/ftrace.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (C) 2008 Matt Fleming <mjf@gentoo.org> | 2 | * Copyright (C) 2008 Matt Fleming <matt@console-pimps.org> |
3 | * Copyright (C) 2008 Paul Mundt <lethal@linux-sh.org> | 3 | * Copyright (C) 2008 Paul Mundt <lethal@linux-sh.org> |
4 | * | 4 | * |
5 | * Code for replacing ftrace calls with jumps. | 5 | * Code for replacing ftrace calls with jumps. |
@@ -19,30 +19,37 @@ | |||
19 | #include <asm/ftrace.h> | 19 | #include <asm/ftrace.h> |
20 | #include <asm/cacheflush.h> | 20 | #include <asm/cacheflush.h> |
21 | 21 | ||
22 | static unsigned char ftrace_nop[] = { | ||
23 | 0x09, 0x00, /* nop */ | ||
24 | 0x09, 0x00, /* nop */ | ||
25 | }; | ||
26 | |||
27 | static unsigned char ftrace_replaced_code[MCOUNT_INSN_SIZE]; | 22 | static unsigned char ftrace_replaced_code[MCOUNT_INSN_SIZE]; |
28 | 23 | ||
29 | unsigned char *ftrace_nop_replace(void) | 24 | static unsigned char ftrace_nop[4]; |
25 | /* | ||
26 | * If we're trying to nop out a call to a function, we instead | ||
27 | * place a call to the address after the memory table. | ||
28 | * | ||
29 | * 8c011060 <a>: | ||
30 | * 8c011060: 02 d1 mov.l 8c01106c <a+0xc>,r1 | ||
31 | * 8c011062: 22 4f sts.l pr,@-r15 | ||
32 | * 8c011064: 02 c7 mova 8c011070 <a+0x10>,r0 | ||
33 | * 8c011066: 2b 41 jmp @r1 | ||
34 | * 8c011068: 2a 40 lds r0,pr | ||
35 | * 8c01106a: 09 00 nop | ||
36 | * 8c01106c: 68 24 .word 0x2468 <--- ip | ||
37 | * 8c01106e: 1d 8c .word 0x8c1d | ||
38 | * 8c011070: 26 4f lds.l @r15+,pr <--- ip + MCOUNT_INSN_SIZE | ||
39 | * | ||
40 | * We write 0x8c011070 to 0x8c01106c so that on entry to a() we branch | ||
41 | * past the _mcount call and continue executing code like normal. | ||
42 | */ | ||
43 | static unsigned char *ftrace_nop_replace(unsigned long ip) | ||
30 | { | 44 | { |
45 | __raw_writel(ip + MCOUNT_INSN_SIZE, ftrace_nop); | ||
31 | return ftrace_nop; | 46 | return ftrace_nop; |
32 | } | 47 | } |
33 | 48 | ||
34 | static int is_sh_nop(unsigned char *ip) | 49 | static unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) |
35 | { | ||
36 | return strncmp(ip, ftrace_nop, sizeof(ftrace_nop)); | ||
37 | } | ||
38 | |||
39 | unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) | ||
40 | { | 50 | { |
41 | /* Place the address in the memory table. */ | 51 | /* Place the address in the memory table. */ |
42 | if (addr == CALLER_ADDR) | 52 | __raw_writel(addr, ftrace_replaced_code); |
43 | __raw_writel(addr + MCOUNT_INSN_OFFSET, ftrace_replaced_code); | ||
44 | else | ||
45 | __raw_writel(addr, ftrace_replaced_code); | ||
46 | 53 | ||
47 | /* | 54 | /* |
48 | * No locking needed, this must be called via kstop_machine | 55 | * No locking needed, this must be called via kstop_machine |
@@ -51,7 +58,7 @@ unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) | |||
51 | return ftrace_replaced_code; | 58 | return ftrace_replaced_code; |
52 | } | 59 | } |
53 | 60 | ||
54 | int ftrace_modify_code(unsigned long ip, unsigned char *old_code, | 61 | static int ftrace_modify_code(unsigned long ip, unsigned char *old_code, |
55 | unsigned char *new_code) | 62 | unsigned char *new_code) |
56 | { | 63 | { |
57 | unsigned char replaced[MCOUNT_INSN_SIZE]; | 64 | unsigned char replaced[MCOUNT_INSN_SIZE]; |
@@ -66,13 +73,6 @@ int ftrace_modify_code(unsigned long ip, unsigned char *old_code, | |||
66 | * kstop_machine, or before SMP starts. | 73 | * kstop_machine, or before SMP starts. |
67 | */ | 74 | */ |
68 | 75 | ||
69 | /* | ||
70 | * If we're trying to nop out a call to a function, we instead | ||
71 | * place a call to the address after the memory table. | ||
72 | */ | ||
73 | if (is_sh_nop(new_code) == 0) | ||
74 | __raw_writel(ip + MCOUNT_INSN_SIZE, (unsigned long)new_code); | ||
75 | |||
76 | /* read the text we want to modify */ | 76 | /* read the text we want to modify */ |
77 | if (probe_kernel_read(replaced, (void *)ip, MCOUNT_INSN_SIZE)) | 77 | if (probe_kernel_read(replaced, (void *)ip, MCOUNT_INSN_SIZE)) |
78 | return -EFAULT; | 78 | return -EFAULT; |
@@ -92,13 +92,13 @@ int ftrace_modify_code(unsigned long ip, unsigned char *old_code, | |||
92 | 92 | ||
93 | int ftrace_update_ftrace_func(ftrace_func_t func) | 93 | int ftrace_update_ftrace_func(ftrace_func_t func) |
94 | { | 94 | { |
95 | unsigned long ip = (unsigned long)(&ftrace_call); | 95 | unsigned long ip = (unsigned long)(&ftrace_call) + MCOUNT_INSN_OFFSET; |
96 | unsigned char old[MCOUNT_INSN_SIZE], *new; | 96 | unsigned char old[MCOUNT_INSN_SIZE], *new; |
97 | 97 | ||
98 | memcpy(old, (unsigned char *)(ip + MCOUNT_INSN_OFFSET), MCOUNT_INSN_SIZE); | 98 | memcpy(old, (unsigned char *)ip, MCOUNT_INSN_SIZE); |
99 | new = ftrace_call_replace(ip, (unsigned long)func); | 99 | new = ftrace_call_replace(ip, (unsigned long)func); |
100 | 100 | ||
101 | return ftrace_modify_code(ip + MCOUNT_INSN_OFFSET, old, new); | 101 | return ftrace_modify_code(ip, old, new); |
102 | } | 102 | } |
103 | 103 | ||
104 | int ftrace_make_nop(struct module *mod, | 104 | int ftrace_make_nop(struct module *mod, |
@@ -108,7 +108,7 @@ int ftrace_make_nop(struct module *mod, | |||
108 | unsigned long ip = rec->ip; | 108 | unsigned long ip = rec->ip; |
109 | 109 | ||
110 | old = ftrace_call_replace(ip, addr); | 110 | old = ftrace_call_replace(ip, addr); |
111 | new = ftrace_nop_replace(); | 111 | new = ftrace_nop_replace(ip); |
112 | 112 | ||
113 | return ftrace_modify_code(rec->ip, old, new); | 113 | return ftrace_modify_code(rec->ip, old, new); |
114 | } | 114 | } |
@@ -118,7 +118,7 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) | |||
118 | unsigned char *new, *old; | 118 | unsigned char *new, *old; |
119 | unsigned long ip = rec->ip; | 119 | unsigned long ip = rec->ip; |
120 | 120 | ||
121 | old = ftrace_nop_replace(); | 121 | old = ftrace_nop_replace(ip); |
122 | new = ftrace_call_replace(ip, addr); | 122 | new = ftrace_call_replace(ip, addr); |
123 | 123 | ||
124 | return ftrace_modify_code(rec->ip, old, new); | 124 | return ftrace_modify_code(rec->ip, old, new); |
diff --git a/arch/sh/kernel/init_task.c b/arch/sh/kernel/init_task.c index 80c35ff71d56..1719957c0a69 100644 --- a/arch/sh/kernel/init_task.c +++ b/arch/sh/kernel/init_task.c | |||
@@ -10,9 +10,6 @@ | |||
10 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 10 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
11 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 11 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
12 | struct pt_regs fake_swapper_regs; | 12 | struct pt_regs fake_swapper_regs; |
13 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
14 | EXPORT_SYMBOL(init_mm); | ||
15 | |||
16 | /* | 13 | /* |
17 | * Initial thread structure. | 14 | * Initial thread structure. |
18 | * | 15 | * |
diff --git a/arch/sh/kernel/sh_ksyms_64.c b/arch/sh/kernel/sh_ksyms_64.c index 8f54ef0cfbca..f5bd156ea504 100644 --- a/arch/sh/kernel/sh_ksyms_64.c +++ b/arch/sh/kernel/sh_ksyms_64.c | |||
@@ -38,13 +38,6 @@ EXPORT_SYMBOL(clear_user_page); | |||
38 | EXPORT_SYMBOL(flush_dcache_page); | 38 | EXPORT_SYMBOL(flush_dcache_page); |
39 | #endif | 39 | #endif |
40 | 40 | ||
41 | /* Networking helper routines. */ | ||
42 | EXPORT_SYMBOL(csum_partial); | ||
43 | EXPORT_SYMBOL(csum_partial_copy_nocheck); | ||
44 | #ifdef CONFIG_IPV6 | ||
45 | EXPORT_SYMBOL(csum_ipv6_magic); | ||
46 | #endif | ||
47 | |||
48 | #ifdef CONFIG_VT | 41 | #ifdef CONFIG_VT |
49 | EXPORT_SYMBOL(screen_info); | 42 | EXPORT_SYMBOL(screen_info); |
50 | #endif | 43 | #endif |
diff --git a/arch/sh/kernel/smp.c b/arch/sh/kernel/smp.c index 8f4027412614..442d8d47a41e 100644 --- a/arch/sh/kernel/smp.c +++ b/arch/sh/kernel/smp.c | |||
@@ -47,7 +47,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus) | |||
47 | plat_prepare_cpus(max_cpus); | 47 | plat_prepare_cpus(max_cpus); |
48 | 48 | ||
49 | #ifndef CONFIG_HOTPLUG_CPU | 49 | #ifndef CONFIG_HOTPLUG_CPU |
50 | cpu_present_map = cpu_possible_map; | 50 | init_cpu_present(&cpu_possible_map); |
51 | #endif | 51 | #endif |
52 | } | 52 | } |
53 | 53 | ||
@@ -58,8 +58,8 @@ void __devinit smp_prepare_boot_cpu(void) | |||
58 | __cpu_number_map[0] = cpu; | 58 | __cpu_number_map[0] = cpu; |
59 | __cpu_logical_map[0] = cpu; | 59 | __cpu_logical_map[0] = cpu; |
60 | 60 | ||
61 | cpu_set(cpu, cpu_online_map); | 61 | set_cpu_online(cpu, true); |
62 | cpu_set(cpu, cpu_possible_map); | 62 | set_cpu_possible(cpu, true); |
63 | } | 63 | } |
64 | 64 | ||
65 | asmlinkage void __cpuinit start_secondary(void) | 65 | asmlinkage void __cpuinit start_secondary(void) |
@@ -171,11 +171,11 @@ void smp_send_stop(void) | |||
171 | smp_call_function(stop_this_cpu, 0, 0); | 171 | smp_call_function(stop_this_cpu, 0, 0); |
172 | } | 172 | } |
173 | 173 | ||
174 | void arch_send_call_function_ipi(cpumask_t mask) | 174 | void arch_send_call_function_ipi_mask(const struct cpumask *mask) |
175 | { | 175 | { |
176 | int cpu; | 176 | int cpu; |
177 | 177 | ||
178 | for_each_cpu_mask(cpu, mask) | 178 | for_each_cpu(cpu, mask) |
179 | plat_send_ipi(cpu, SMP_MSG_FUNCTION); | 179 | plat_send_ipi(cpu, SMP_MSG_FUNCTION); |
180 | } | 180 | } |
181 | 181 | ||
diff --git a/arch/sh/kernel/syscalls_32.S b/arch/sh/kernel/syscalls_32.S index a9fff9f731ec..f9e21fa2f592 100644 --- a/arch/sh/kernel/syscalls_32.S +++ b/arch/sh/kernel/syscalls_32.S | |||
@@ -352,3 +352,4 @@ ENTRY(sys_call_table) | |||
352 | .long sys_preadv | 352 | .long sys_preadv |
353 | .long sys_pwritev | 353 | .long sys_pwritev |
354 | .long sys_rt_tgsigqueueinfo /* 335 */ | 354 | .long sys_rt_tgsigqueueinfo /* 335 */ |
355 | .long sys_perf_counter_open | ||
diff --git a/arch/sh/kernel/syscalls_64.S b/arch/sh/kernel/syscalls_64.S index 75c1889af1ed..bf420b616ae0 100644 --- a/arch/sh/kernel/syscalls_64.S +++ b/arch/sh/kernel/syscalls_64.S | |||
@@ -390,3 +390,4 @@ sys_call_table: | |||
390 | .long sys_preadv | 390 | .long sys_preadv |
391 | .long sys_pwritev | 391 | .long sys_pwritev |
392 | .long sys_rt_tgsigqueueinfo | 392 | .long sys_rt_tgsigqueueinfo |
393 | .long sys_perf_counter_open | ||
diff --git a/arch/sh/kernel/time.c b/arch/sh/kernel/time.c index 2edde32c764b..9b352a1e3fb4 100644 --- a/arch/sh/kernel/time.c +++ b/arch/sh/kernel/time.c | |||
@@ -91,21 +91,6 @@ module_init(rtc_generic_init); | |||
91 | 91 | ||
92 | void (*board_time_init)(void); | 92 | void (*board_time_init)(void); |
93 | 93 | ||
94 | unsigned long long sched_clock(void) | ||
95 | { | ||
96 | return (jiffies_64 - INITIAL_JIFFIES) * (NSEC_PER_SEC / HZ); | ||
97 | } | ||
98 | |||
99 | static void __init sh_late_time_init(void) | ||
100 | { | ||
101 | /* | ||
102 | * Make sure all compiled-in early timers register themselves. | ||
103 | * Run probe() for one "earlytimer" device. | ||
104 | */ | ||
105 | early_platform_driver_register_all("earlytimer"); | ||
106 | early_platform_driver_probe("earlytimer", 1, 0); | ||
107 | } | ||
108 | |||
109 | void __init time_init(void) | 94 | void __init time_init(void) |
110 | { | 95 | { |
111 | if (board_time_init) | 96 | if (board_time_init) |
@@ -121,5 +106,15 @@ void __init time_init(void) | |||
121 | local_timer_setup(smp_processor_id()); | 106 | local_timer_setup(smp_processor_id()); |
122 | #endif | 107 | #endif |
123 | 108 | ||
124 | late_time_init = sh_late_time_init; | 109 | /* |
110 | * Make sure all compiled-in early timers register themselves. | ||
111 | * | ||
112 | * Run probe() for two "earlytimer" devices, these will be the | ||
113 | * clockevents and clocksource devices respectively. In the event | ||
114 | * that only a clockevents device is available, we -ENODEV on the | ||
115 | * clocksource and the jiffies clocksource is used transparently | ||
116 | * instead. No error handling is necessary here. | ||
117 | */ | ||
118 | early_platform_driver_register_all("earlytimer"); | ||
119 | early_platform_driver_probe("earlytimer", 2, 0); | ||
125 | } | 120 | } |
diff --git a/arch/sh/kernel/traps.c b/arch/sh/kernel/traps.c index 46348ed07cc3..b3e0067db358 100644 --- a/arch/sh/kernel/traps.c +++ b/arch/sh/kernel/traps.c | |||
@@ -69,6 +69,7 @@ BUILD_TRAP_HANDLER(bug) | |||
69 | insn_size_t insn = *(insn_size_t *)instruction_pointer(regs); | 69 | insn_size_t insn = *(insn_size_t *)instruction_pointer(regs); |
70 | if (insn == TRAPA_BUG_OPCODE) | 70 | if (insn == TRAPA_BUG_OPCODE) |
71 | handle_BUG(regs); | 71 | handle_BUG(regs); |
72 | return; | ||
72 | } | 73 | } |
73 | #endif | 74 | #endif |
74 | 75 | ||
diff --git a/arch/sh/lib64/Makefile b/arch/sh/lib64/Makefile index 4bacb9e83478..334bb2da36ea 100644 --- a/arch/sh/lib64/Makefile +++ b/arch/sh/lib64/Makefile | |||
@@ -10,7 +10,7 @@ | |||
10 | # | 10 | # |
11 | 11 | ||
12 | # Panic should really be compiled as PIC | 12 | # Panic should really be compiled as PIC |
13 | lib-y := udelay.o c-checksum.o dbg.o panic.o memcpy.o memset.o \ | 13 | lib-y := udelay.o dbg.o panic.o memcpy.o memset.o \ |
14 | copy_user_memcpy.o copy_page.o clear_page.o strcpy.o strlen.o | 14 | copy_user_memcpy.o copy_page.o clear_page.o strcpy.o strlen.o |
15 | 15 | ||
16 | # Extracted from libgcc | 16 | # Extracted from libgcc |
diff --git a/arch/sh/lib64/c-checksum.c b/arch/sh/lib64/c-checksum.c deleted file mode 100644 index 73c0877e3a29..000000000000 --- a/arch/sh/lib64/c-checksum.c +++ /dev/null | |||
@@ -1,214 +0,0 @@ | |||
1 | /* | ||
2 | * arch/sh/lib64/c-checksum.c | ||
3 | * | ||
4 | * This file contains network checksum routines that are better done | ||
5 | * in an architecture-specific manner due to speed.. | ||
6 | */ | ||
7 | #include <linux/string.h> | ||
8 | #include <linux/errno.h> | ||
9 | #include <linux/kernel.h> | ||
10 | #include <linux/module.h> | ||
11 | #include <asm/byteorder.h> | ||
12 | #include <asm/uaccess.h> | ||
13 | |||
14 | static inline unsigned short from64to16(unsigned long long x) | ||
15 | { | ||
16 | /* add up 32-bit words for 33 bits */ | ||
17 | x = (x & 0xffffffff) + (x >> 32); | ||
18 | /* add up 16-bit and 17-bit words for 17+c bits */ | ||
19 | x = (x & 0xffff) + (x >> 16); | ||
20 | /* add up 16-bit and 2-bit for 16+c bit */ | ||
21 | x = (x & 0xffff) + (x >> 16); | ||
22 | /* add up carry.. */ | ||
23 | x = (x & 0xffff) + (x >> 16); | ||
24 | return x; | ||
25 | } | ||
26 | |||
27 | static inline unsigned short foldto16(unsigned long x) | ||
28 | { | ||
29 | /* add up 16-bit for 17 bits */ | ||
30 | x = (x & 0xffff) + (x >> 16); | ||
31 | /* add up carry.. */ | ||
32 | x = (x & 0xffff) + (x >> 16); | ||
33 | return x; | ||
34 | } | ||
35 | |||
36 | static inline unsigned short myfoldto16(unsigned long long x) | ||
37 | { | ||
38 | /* Fold down to 32-bits so we don't lose in the typedef-less | ||
39 | network stack. */ | ||
40 | /* 64 to 33 */ | ||
41 | x = (x & 0xffffffff) + (x >> 32); | ||
42 | /* 33 to 32 */ | ||
43 | x = (x & 0xffffffff) + (x >> 32); | ||
44 | |||
45 | /* add up 16-bit for 17 bits */ | ||
46 | x = (x & 0xffff) + (x >> 16); | ||
47 | /* add up carry.. */ | ||
48 | x = (x & 0xffff) + (x >> 16); | ||
49 | return x; | ||
50 | } | ||
51 | |||
52 | #define odd(x) ((x)&1) | ||
53 | #define U16(x) ntohs(x) | ||
54 | |||
55 | static unsigned long do_csum(const unsigned char *buff, int len) | ||
56 | { | ||
57 | int odd, count; | ||
58 | unsigned long result = 0; | ||
59 | |||
60 | pr_debug("do_csum buff %p, len %d (0x%x)\n", buff, len, len); | ||
61 | #ifdef DEBUG | ||
62 | for (i = 0; i < len; i++) { | ||
63 | if ((i % 26) == 0) | ||
64 | printk("\n"); | ||
65 | printk("%02X ", buff[i]); | ||
66 | } | ||
67 | #endif | ||
68 | |||
69 | if (len <= 0) | ||
70 | goto out; | ||
71 | |||
72 | odd = 1 & (unsigned long) buff; | ||
73 | if (odd) { | ||
74 | result = *buff << 8; | ||
75 | len--; | ||
76 | buff++; | ||
77 | } | ||
78 | count = len >> 1; /* nr of 16-bit words.. */ | ||
79 | if (count) { | ||
80 | if (2 & (unsigned long) buff) { | ||
81 | result += *(unsigned short *) buff; | ||
82 | count--; | ||
83 | len -= 2; | ||
84 | buff += 2; | ||
85 | } | ||
86 | count >>= 1; /* nr of 32-bit words.. */ | ||
87 | if (count) { | ||
88 | unsigned long carry = 0; | ||
89 | do { | ||
90 | unsigned long w = *(unsigned long *) buff; | ||
91 | buff += 4; | ||
92 | count--; | ||
93 | result += carry; | ||
94 | result += w; | ||
95 | carry = (w > result); | ||
96 | } while (count); | ||
97 | result += carry; | ||
98 | result = (result & 0xffff) + (result >> 16); | ||
99 | } | ||
100 | if (len & 2) { | ||
101 | result += *(unsigned short *) buff; | ||
102 | buff += 2; | ||
103 | } | ||
104 | } | ||
105 | if (len & 1) | ||
106 | result += *buff; | ||
107 | result = foldto16(result); | ||
108 | if (odd) | ||
109 | result = ((result >> 8) & 0xff) | ((result & 0xff) << 8); | ||
110 | |||
111 | pr_debug("\nCHECKSUM is 0x%lx\n", result); | ||
112 | |||
113 | out: | ||
114 | return result; | ||
115 | } | ||
116 | |||
117 | /* computes the checksum of a memory block at buff, length len, | ||
118 | and adds in "sum" (32-bit) */ | ||
119 | __wsum csum_partial(const void *buff, int len, __wsum sum) | ||
120 | { | ||
121 | unsigned long long result = do_csum(buff, len); | ||
122 | |||
123 | /* add in old sum, and carry.. */ | ||
124 | result += (__force u32)sum; | ||
125 | /* 32+c bits -> 32 bits */ | ||
126 | result = (result & 0xffffffff) + (result >> 32); | ||
127 | |||
128 | pr_debug("csum_partial, buff %p len %d sum 0x%x result=0x%016Lx\n", | ||
129 | buff, len, sum, result); | ||
130 | |||
131 | return (__force __wsum)result; | ||
132 | } | ||
133 | |||
134 | /* Copy while checksumming, otherwise like csum_partial. */ | ||
135 | __wsum | ||
136 | csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum) | ||
137 | { | ||
138 | sum = csum_partial(src, len, sum); | ||
139 | memcpy(dst, src, len); | ||
140 | |||
141 | return sum; | ||
142 | } | ||
143 | |||
144 | /* Copy from userspace and compute checksum. If we catch an exception | ||
145 | then zero the rest of the buffer. */ | ||
146 | __wsum | ||
147 | csum_partial_copy_from_user(const void __user *src, void *dst, int len, | ||
148 | __wsum sum, int *err_ptr) | ||
149 | { | ||
150 | int missing; | ||
151 | |||
152 | pr_debug | ||
153 | ("csum_partial_copy_from_user src %p, dest %p, len %d, sum %08x, err_ptr %p\n", | ||
154 | src, dst, len, sum, err_ptr); | ||
155 | missing = copy_from_user(dst, src, len); | ||
156 | pr_debug(" access_ok %d\n", __access_ok((unsigned long) src, len)); | ||
157 | pr_debug(" missing %d\n", missing); | ||
158 | if (missing) { | ||
159 | memset(dst + len - missing, 0, missing); | ||
160 | *err_ptr = -EFAULT; | ||
161 | } | ||
162 | |||
163 | return csum_partial(dst, len, sum); | ||
164 | } | ||
165 | |||
166 | /* Copy to userspace and compute checksum. */ | ||
167 | __wsum | ||
168 | csum_partial_copy_to_user(const unsigned char *src, unsigned char *dst, int len, | ||
169 | __wsum sum, int *err_ptr) | ||
170 | { | ||
171 | sum = csum_partial(src, len, sum); | ||
172 | |||
173 | if (copy_to_user(dst, src, len)) | ||
174 | *err_ptr = -EFAULT; | ||
175 | |||
176 | return sum; | ||
177 | } | ||
178 | |||
179 | /* | ||
180 | * This is a version of ip_compute_csum() optimized for IP headers, | ||
181 | * which always checksum on 4 octet boundaries. | ||
182 | */ | ||
183 | __sum16 ip_fast_csum(const void *iph, unsigned int ihl) | ||
184 | { | ||
185 | pr_debug("ip_fast_csum %p,%d\n", iph, ihl); | ||
186 | |||
187 | return (__force __sum16)~do_csum(iph, ihl * 4); | ||
188 | } | ||
189 | |||
190 | __wsum csum_tcpudp_nofold(__be32 saddr, __be32 daddr, | ||
191 | unsigned short len, | ||
192 | unsigned short proto, __wsum sum) | ||
193 | { | ||
194 | unsigned long long result; | ||
195 | |||
196 | pr_debug("ntohs(0x%x)=0x%x\n", 0xdead, ntohs(0xdead)); | ||
197 | pr_debug("htons(0x%x)=0x%x\n", 0xdead, htons(0xdead)); | ||
198 | |||
199 | result = (__force u64) saddr + (__force u64) daddr + | ||
200 | (__force u64) sum + ((len + proto) << 8); | ||
201 | |||
202 | /* Fold down to 32-bits so we don't lose in the typedef-less | ||
203 | network stack. */ | ||
204 | /* 64 to 33 */ | ||
205 | result = (result & 0xffffffff) + (result >> 32); | ||
206 | /* 33 to 32 */ | ||
207 | result = (result & 0xffffffff) + (result >> 32); | ||
208 | |||
209 | pr_debug("%s saddr %x daddr %x len %x proto %x sum %x result %08Lx\n", | ||
210 | __func__, saddr, daddr, len, proto, sum, result); | ||
211 | |||
212 | return (__wsum)result; | ||
213 | } | ||
214 | EXPORT_SYMBOL(csum_tcpudp_nofold); | ||
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig index cc12cd48bbc5..3f8b6a92eabd 100644 --- a/arch/sparc/Kconfig +++ b/arch/sparc/Kconfig | |||
@@ -37,6 +37,8 @@ config SPARC64 | |||
37 | select HAVE_KPROBES | 37 | select HAVE_KPROBES |
38 | select HAVE_LMB | 38 | select HAVE_LMB |
39 | select HAVE_SYSCALL_WRAPPERS | 39 | select HAVE_SYSCALL_WRAPPERS |
40 | select HAVE_DYNAMIC_FTRACE | ||
41 | select HAVE_FTRACE_MCOUNT_RECORD | ||
40 | select USE_GENERIC_SMP_HELPERS if SMP | 42 | select USE_GENERIC_SMP_HELPERS if SMP |
41 | select RTC_DRV_CMOS | 43 | select RTC_DRV_CMOS |
42 | select RTC_DRV_BQ4802 | 44 | select RTC_DRV_BQ4802 |
@@ -93,6 +95,9 @@ config AUDIT_ARCH | |||
93 | config HAVE_SETUP_PER_CPU_AREA | 95 | config HAVE_SETUP_PER_CPU_AREA |
94 | def_bool y if SPARC64 | 96 | def_bool y if SPARC64 |
95 | 97 | ||
98 | config HAVE_DYNAMIC_PER_CPU_AREA | ||
99 | def_bool y if SPARC64 | ||
100 | |||
96 | config GENERIC_HARDIRQS_NO__DO_IRQ | 101 | config GENERIC_HARDIRQS_NO__DO_IRQ |
97 | bool | 102 | bool |
98 | def_bool y if SPARC64 | 103 | def_bool y if SPARC64 |
diff --git a/arch/sparc/configs/sparc64_defconfig b/arch/sparc/configs/sparc64_defconfig index b5d63bd8716e..0123a4c596ce 100644 --- a/arch/sparc/configs/sparc64_defconfig +++ b/arch/sparc/configs/sparc64_defconfig | |||
@@ -1,7 +1,7 @@ | |||
1 | # | 1 | # |
2 | # Automatically generated make config: don't edit | 2 | # Automatically generated make config: don't edit |
3 | # Linux kernel version: 2.6.30-rc2 | 3 | # Linux kernel version: 2.6.30 |
4 | # Fri Apr 17 02:03:07 2009 | 4 | # Tue Jun 16 04:59:36 2009 |
5 | # | 5 | # |
6 | CONFIG_64BIT=y | 6 | CONFIG_64BIT=y |
7 | CONFIG_SPARC=y | 7 | CONFIG_SPARC=y |
@@ -19,6 +19,7 @@ CONFIG_LOCKDEP_SUPPORT=y | |||
19 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y | 19 | CONFIG_HAVE_LATENCYTOP_SUPPORT=y |
20 | CONFIG_AUDIT_ARCH=y | 20 | CONFIG_AUDIT_ARCH=y |
21 | CONFIG_HAVE_SETUP_PER_CPU_AREA=y | 21 | CONFIG_HAVE_SETUP_PER_CPU_AREA=y |
22 | CONFIG_HAVE_DYNAMIC_PER_CPU_AREA=y | ||
22 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y | 23 | CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y |
23 | CONFIG_MMU=y | 24 | CONFIG_MMU=y |
24 | CONFIG_ARCH_NO_VIRT_TO_BUS=y | 25 | CONFIG_ARCH_NO_VIRT_TO_BUS=y |
@@ -82,7 +83,6 @@ CONFIG_SYSCTL_SYSCALL=y | |||
82 | CONFIG_KALLSYMS=y | 83 | CONFIG_KALLSYMS=y |
83 | # CONFIG_KALLSYMS_ALL is not set | 84 | # CONFIG_KALLSYMS_ALL is not set |
84 | # CONFIG_KALLSYMS_EXTRA_PASS is not set | 85 | # CONFIG_KALLSYMS_EXTRA_PASS is not set |
85 | # CONFIG_STRIP_ASM_SYMS is not set | ||
86 | CONFIG_HOTPLUG=y | 86 | CONFIG_HOTPLUG=y |
87 | CONFIG_PRINTK=y | 87 | CONFIG_PRINTK=y |
88 | CONFIG_BUG=y | 88 | CONFIG_BUG=y |
@@ -95,16 +95,21 @@ CONFIG_TIMERFD=y | |||
95 | CONFIG_EVENTFD=y | 95 | CONFIG_EVENTFD=y |
96 | CONFIG_SHMEM=y | 96 | CONFIG_SHMEM=y |
97 | CONFIG_AIO=y | 97 | CONFIG_AIO=y |
98 | |||
99 | # | ||
100 | # Performance Counters | ||
101 | # | ||
98 | CONFIG_VM_EVENT_COUNTERS=y | 102 | CONFIG_VM_EVENT_COUNTERS=y |
99 | CONFIG_PCI_QUIRKS=y | 103 | CONFIG_PCI_QUIRKS=y |
100 | CONFIG_SLUB_DEBUG=y | 104 | CONFIG_SLUB_DEBUG=y |
105 | # CONFIG_STRIP_ASM_SYMS is not set | ||
101 | # CONFIG_COMPAT_BRK is not set | 106 | # CONFIG_COMPAT_BRK is not set |
102 | # CONFIG_SLAB is not set | 107 | # CONFIG_SLAB is not set |
103 | CONFIG_SLUB=y | 108 | CONFIG_SLUB=y |
104 | # CONFIG_SLOB is not set | 109 | # CONFIG_SLOB is not set |
105 | CONFIG_PROFILING=y | 110 | CONFIG_PROFILING=y |
106 | CONFIG_TRACEPOINTS=y | 111 | CONFIG_TRACEPOINTS=y |
107 | # CONFIG_MARKERS is not set | 112 | CONFIG_MARKERS=y |
108 | CONFIG_OPROFILE=m | 113 | CONFIG_OPROFILE=m |
109 | CONFIG_HAVE_OPROFILE=y | 114 | CONFIG_HAVE_OPROFILE=y |
110 | CONFIG_KPROBES=y | 115 | CONFIG_KPROBES=y |
@@ -202,6 +207,7 @@ CONFIG_NR_QUICK=1 | |||
202 | CONFIG_UNEVICTABLE_LRU=y | 207 | CONFIG_UNEVICTABLE_LRU=y |
203 | CONFIG_HAVE_MLOCK=y | 208 | CONFIG_HAVE_MLOCK=y |
204 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y | 209 | CONFIG_HAVE_MLOCKED_PAGE_BIT=y |
210 | CONFIG_DEFAULT_MMAP_MIN_ADDR=8192 | ||
205 | CONFIG_SCHED_SMT=y | 211 | CONFIG_SCHED_SMT=y |
206 | CONFIG_SCHED_MC=y | 212 | CONFIG_SCHED_MC=y |
207 | # CONFIG_PREEMPT_NONE is not set | 213 | # CONFIG_PREEMPT_NONE is not set |
@@ -321,6 +327,7 @@ CONFIG_VLAN_8021Q=m | |||
321 | # CONFIG_ECONET is not set | 327 | # CONFIG_ECONET is not set |
322 | # CONFIG_WAN_ROUTER is not set | 328 | # CONFIG_WAN_ROUTER is not set |
323 | # CONFIG_PHONET is not set | 329 | # CONFIG_PHONET is not set |
330 | # CONFIG_IEEE802154 is not set | ||
324 | # CONFIG_NET_SCHED is not set | 331 | # CONFIG_NET_SCHED is not set |
325 | # CONFIG_DCB is not set | 332 | # CONFIG_DCB is not set |
326 | 333 | ||
@@ -340,7 +347,11 @@ CONFIG_WIRELESS=y | |||
340 | CONFIG_WIRELESS_OLD_REGULATORY=y | 347 | CONFIG_WIRELESS_OLD_REGULATORY=y |
341 | # CONFIG_WIRELESS_EXT is not set | 348 | # CONFIG_WIRELESS_EXT is not set |
342 | # CONFIG_LIB80211 is not set | 349 | # CONFIG_LIB80211 is not set |
343 | # CONFIG_MAC80211 is not set | 350 | |
351 | # | ||
352 | # CFG80211 needs to be enabled for MAC80211 | ||
353 | # | ||
354 | CONFIG_MAC80211_DEFAULT_PS_VALUE=0 | ||
344 | # CONFIG_WIMAX is not set | 355 | # CONFIG_WIMAX is not set |
345 | # CONFIG_RFKILL is not set | 356 | # CONFIG_RFKILL is not set |
346 | # CONFIG_NET_9P is not set | 357 | # CONFIG_NET_9P is not set |
@@ -364,6 +375,7 @@ CONFIG_EXTRA_FIRMWARE="" | |||
364 | CONFIG_CONNECTOR=m | 375 | CONFIG_CONNECTOR=m |
365 | # CONFIG_MTD is not set | 376 | # CONFIG_MTD is not set |
366 | CONFIG_OF_DEVICE=y | 377 | CONFIG_OF_DEVICE=y |
378 | CONFIG_OF_MDIO=m | ||
367 | # CONFIG_PARPORT is not set | 379 | # CONFIG_PARPORT is not set |
368 | CONFIG_BLK_DEV=y | 380 | CONFIG_BLK_DEV=y |
369 | # CONFIG_BLK_DEV_FD is not set | 381 | # CONFIG_BLK_DEV_FD is not set |
@@ -399,6 +411,7 @@ CONFIG_MISC_DEVICES=y | |||
399 | # CONFIG_EEPROM_AT24 is not set | 411 | # CONFIG_EEPROM_AT24 is not set |
400 | # CONFIG_EEPROM_LEGACY is not set | 412 | # CONFIG_EEPROM_LEGACY is not set |
401 | # CONFIG_EEPROM_93CX6 is not set | 413 | # CONFIG_EEPROM_93CX6 is not set |
414 | # CONFIG_CB710_CORE is not set | ||
402 | CONFIG_HAVE_IDE=y | 415 | CONFIG_HAVE_IDE=y |
403 | CONFIG_IDE=y | 416 | CONFIG_IDE=y |
404 | 417 | ||
@@ -477,10 +490,6 @@ CONFIG_BLK_DEV_SR=m | |||
477 | CONFIG_BLK_DEV_SR_VENDOR=y | 490 | CONFIG_BLK_DEV_SR_VENDOR=y |
478 | CONFIG_CHR_DEV_SG=m | 491 | CONFIG_CHR_DEV_SG=m |
479 | # CONFIG_CHR_DEV_SCH is not set | 492 | # CONFIG_CHR_DEV_SCH is not set |
480 | |||
481 | # | ||
482 | # Some SCSI devices (e.g. CD jukebox) support multiple LUNs | ||
483 | # | ||
484 | CONFIG_SCSI_MULTI_LUN=y | 493 | CONFIG_SCSI_MULTI_LUN=y |
485 | CONFIG_SCSI_CONSTANTS=y | 494 | CONFIG_SCSI_CONSTANTS=y |
486 | # CONFIG_SCSI_LOGGING is not set | 495 | # CONFIG_SCSI_LOGGING is not set |
@@ -499,6 +508,7 @@ CONFIG_SCSI_FC_ATTRS=y | |||
499 | CONFIG_SCSI_LOWLEVEL=y | 508 | CONFIG_SCSI_LOWLEVEL=y |
500 | # CONFIG_ISCSI_TCP is not set | 509 | # CONFIG_ISCSI_TCP is not set |
501 | # CONFIG_SCSI_CXGB3_ISCSI is not set | 510 | # CONFIG_SCSI_CXGB3_ISCSI is not set |
511 | # CONFIG_SCSI_BNX2_ISCSI is not set | ||
502 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set | 512 | # CONFIG_BLK_DEV_3W_XXXX_RAID is not set |
503 | # CONFIG_SCSI_3W_9XXX is not set | 513 | # CONFIG_SCSI_3W_9XXX is not set |
504 | # CONFIG_SCSI_ACARD is not set | 514 | # CONFIG_SCSI_ACARD is not set |
@@ -507,6 +517,7 @@ CONFIG_SCSI_LOWLEVEL=y | |||
507 | # CONFIG_SCSI_AIC7XXX_OLD is not set | 517 | # CONFIG_SCSI_AIC7XXX_OLD is not set |
508 | # CONFIG_SCSI_AIC79XX is not set | 518 | # CONFIG_SCSI_AIC79XX is not set |
509 | # CONFIG_SCSI_AIC94XX is not set | 519 | # CONFIG_SCSI_AIC94XX is not set |
520 | # CONFIG_SCSI_MVSAS is not set | ||
510 | # CONFIG_SCSI_ARCMSR is not set | 521 | # CONFIG_SCSI_ARCMSR is not set |
511 | # CONFIG_MEGARAID_NEWGEN is not set | 522 | # CONFIG_MEGARAID_NEWGEN is not set |
512 | # CONFIG_MEGARAID_LEGACY is not set | 523 | # CONFIG_MEGARAID_LEGACY is not set |
@@ -521,7 +532,6 @@ CONFIG_SCSI_LOWLEVEL=y | |||
521 | # CONFIG_SCSI_IPS is not set | 532 | # CONFIG_SCSI_IPS is not set |
522 | # CONFIG_SCSI_INITIO is not set | 533 | # CONFIG_SCSI_INITIO is not set |
523 | # CONFIG_SCSI_INIA100 is not set | 534 | # CONFIG_SCSI_INIA100 is not set |
524 | # CONFIG_SCSI_MVSAS is not set | ||
525 | # CONFIG_SCSI_STEX is not set | 535 | # CONFIG_SCSI_STEX is not set |
526 | # CONFIG_SCSI_SYM53C8XX_2 is not set | 536 | # CONFIG_SCSI_SYM53C8XX_2 is not set |
527 | # CONFIG_SCSI_QLOGIC_1280 is not set | 537 | # CONFIG_SCSI_QLOGIC_1280 is not set |
@@ -569,7 +579,6 @@ CONFIG_DM_ZERO=m | |||
569 | # CONFIG_IEEE1394 is not set | 579 | # CONFIG_IEEE1394 is not set |
570 | # CONFIG_I2O is not set | 580 | # CONFIG_I2O is not set |
571 | CONFIG_NETDEVICES=y | 581 | CONFIG_NETDEVICES=y |
572 | CONFIG_COMPAT_NET_DEV_OPS=y | ||
573 | # CONFIG_DUMMY is not set | 582 | # CONFIG_DUMMY is not set |
574 | # CONFIG_BONDING is not set | 583 | # CONFIG_BONDING is not set |
575 | # CONFIG_MACVLAN is not set | 584 | # CONFIG_MACVLAN is not set |
@@ -635,6 +644,7 @@ CONFIG_NET_PCI=y | |||
635 | # CONFIG_SMSC9420 is not set | 644 | # CONFIG_SMSC9420 is not set |
636 | # CONFIG_SUNDANCE is not set | 645 | # CONFIG_SUNDANCE is not set |
637 | # CONFIG_TLAN is not set | 646 | # CONFIG_TLAN is not set |
647 | # CONFIG_KS8842 is not set | ||
638 | # CONFIG_VIA_RHINE is not set | 648 | # CONFIG_VIA_RHINE is not set |
639 | # CONFIG_SC92031 is not set | 649 | # CONFIG_SC92031 is not set |
640 | # CONFIG_ATL2 is not set | 650 | # CONFIG_ATL2 is not set |
@@ -1127,6 +1137,11 @@ CONFIG_SND_VERBOSE_PROCFS=y | |||
1127 | # CONFIG_SND_VERBOSE_PRINTK is not set | 1137 | # CONFIG_SND_VERBOSE_PRINTK is not set |
1128 | # CONFIG_SND_DEBUG is not set | 1138 | # CONFIG_SND_DEBUG is not set |
1129 | CONFIG_SND_VMASTER=y | 1139 | CONFIG_SND_VMASTER=y |
1140 | CONFIG_SND_RAWMIDI_SEQ=m | ||
1141 | # CONFIG_SND_OPL3_LIB_SEQ is not set | ||
1142 | # CONFIG_SND_OPL4_LIB_SEQ is not set | ||
1143 | # CONFIG_SND_SBAWE_SEQ is not set | ||
1144 | # CONFIG_SND_EMU10K1_SEQ is not set | ||
1130 | CONFIG_SND_MPU401_UART=m | 1145 | CONFIG_SND_MPU401_UART=m |
1131 | CONFIG_SND_AC97_CODEC=m | 1146 | CONFIG_SND_AC97_CODEC=m |
1132 | CONFIG_SND_DRIVERS=y | 1147 | CONFIG_SND_DRIVERS=y |
@@ -1153,6 +1168,7 @@ CONFIG_SND_ALI5451=m | |||
1153 | # CONFIG_SND_OXYGEN is not set | 1168 | # CONFIG_SND_OXYGEN is not set |
1154 | # CONFIG_SND_CS4281 is not set | 1169 | # CONFIG_SND_CS4281 is not set |
1155 | # CONFIG_SND_CS46XX is not set | 1170 | # CONFIG_SND_CS46XX is not set |
1171 | # CONFIG_SND_CTXFI is not set | ||
1156 | # CONFIG_SND_DARLA20 is not set | 1172 | # CONFIG_SND_DARLA20 is not set |
1157 | # CONFIG_SND_GINA20 is not set | 1173 | # CONFIG_SND_GINA20 is not set |
1158 | # CONFIG_SND_LAYLA20 is not set | 1174 | # CONFIG_SND_LAYLA20 is not set |
@@ -1183,6 +1199,7 @@ CONFIG_SND_ALI5451=m | |||
1183 | # CONFIG_SND_INTEL8X0 is not set | 1199 | # CONFIG_SND_INTEL8X0 is not set |
1184 | # CONFIG_SND_INTEL8X0M is not set | 1200 | # CONFIG_SND_INTEL8X0M is not set |
1185 | # CONFIG_SND_KORG1212 is not set | 1201 | # CONFIG_SND_KORG1212 is not set |
1202 | # CONFIG_SND_LX6464ES is not set | ||
1186 | # CONFIG_SND_MAESTRO3 is not set | 1203 | # CONFIG_SND_MAESTRO3 is not set |
1187 | # CONFIG_SND_MIXART is not set | 1204 | # CONFIG_SND_MIXART is not set |
1188 | # CONFIG_SND_NM256 is not set | 1205 | # CONFIG_SND_NM256 is not set |
@@ -1229,6 +1246,7 @@ CONFIG_HID_BELKIN=y | |||
1229 | CONFIG_HID_CHERRY=y | 1246 | CONFIG_HID_CHERRY=y |
1230 | CONFIG_HID_CHICONY=y | 1247 | CONFIG_HID_CHICONY=y |
1231 | CONFIG_HID_CYPRESS=y | 1248 | CONFIG_HID_CYPRESS=y |
1249 | CONFIG_HID_DRAGONRISE=y | ||
1232 | # CONFIG_DRAGONRISE_FF is not set | 1250 | # CONFIG_DRAGONRISE_FF is not set |
1233 | CONFIG_HID_EZKEY=y | 1251 | CONFIG_HID_EZKEY=y |
1234 | CONFIG_HID_KYE=y | 1252 | CONFIG_HID_KYE=y |
@@ -1246,9 +1264,14 @@ CONFIG_HID_PETALYNX=y | |||
1246 | CONFIG_HID_SAMSUNG=y | 1264 | CONFIG_HID_SAMSUNG=y |
1247 | CONFIG_HID_SONY=y | 1265 | CONFIG_HID_SONY=y |
1248 | CONFIG_HID_SUNPLUS=y | 1266 | CONFIG_HID_SUNPLUS=y |
1267 | CONFIG_HID_GREENASIA=y | ||
1249 | # CONFIG_GREENASIA_FF is not set | 1268 | # CONFIG_GREENASIA_FF is not set |
1269 | CONFIG_HID_SMARTJOYPLUS=y | ||
1270 | # CONFIG_SMARTJOYPLUS_FF is not set | ||
1250 | CONFIG_HID_TOPSEED=y | 1271 | CONFIG_HID_TOPSEED=y |
1272 | CONFIG_HID_THRUSTMASTER=y | ||
1251 | # CONFIG_THRUSTMASTER_FF is not set | 1273 | # CONFIG_THRUSTMASTER_FF is not set |
1274 | CONFIG_HID_ZEROPLUS=y | ||
1252 | # CONFIG_ZEROPLUS_FF is not set | 1275 | # CONFIG_ZEROPLUS_FF is not set |
1253 | CONFIG_USB_SUPPORT=y | 1276 | CONFIG_USB_SUPPORT=y |
1254 | CONFIG_USB_ARCH_HAS_HCD=y | 1277 | CONFIG_USB_ARCH_HAS_HCD=y |
@@ -1462,6 +1485,7 @@ CONFIG_FILE_LOCKING=y | |||
1462 | # CONFIG_GFS2_FS is not set | 1485 | # CONFIG_GFS2_FS is not set |
1463 | # CONFIG_OCFS2_FS is not set | 1486 | # CONFIG_OCFS2_FS is not set |
1464 | # CONFIG_BTRFS_FS is not set | 1487 | # CONFIG_BTRFS_FS is not set |
1488 | CONFIG_FSNOTIFY=y | ||
1465 | CONFIG_DNOTIFY=y | 1489 | CONFIG_DNOTIFY=y |
1466 | CONFIG_INOTIFY=y | 1490 | CONFIG_INOTIFY=y |
1467 | CONFIG_INOTIFY_USER=y | 1491 | CONFIG_INOTIFY_USER=y |
@@ -1636,25 +1660,28 @@ CONFIG_SYSCTL_SYSCALL_CHECK=y | |||
1636 | # CONFIG_DEBUG_PAGEALLOC is not set | 1660 | # CONFIG_DEBUG_PAGEALLOC is not set |
1637 | CONFIG_NOP_TRACER=y | 1661 | CONFIG_NOP_TRACER=y |
1638 | CONFIG_HAVE_FUNCTION_TRACER=y | 1662 | CONFIG_HAVE_FUNCTION_TRACER=y |
1663 | CONFIG_HAVE_DYNAMIC_FTRACE=y | ||
1664 | CONFIG_HAVE_FTRACE_MCOUNT_RECORD=y | ||
1639 | CONFIG_RING_BUFFER=y | 1665 | CONFIG_RING_BUFFER=y |
1666 | CONFIG_EVENT_TRACING=y | ||
1667 | CONFIG_CONTEXT_SWITCH_TRACER=y | ||
1640 | CONFIG_TRACING=y | 1668 | CONFIG_TRACING=y |
1669 | CONFIG_GENERIC_TRACER=y | ||
1641 | CONFIG_TRACING_SUPPORT=y | 1670 | CONFIG_TRACING_SUPPORT=y |
1642 | 1671 | CONFIG_FTRACE=y | |
1643 | # | ||
1644 | # Tracers | ||
1645 | # | ||
1646 | # CONFIG_FUNCTION_TRACER is not set | 1672 | # CONFIG_FUNCTION_TRACER is not set |
1647 | # CONFIG_IRQSOFF_TRACER is not set | 1673 | # CONFIG_IRQSOFF_TRACER is not set |
1648 | # CONFIG_SCHED_TRACER is not set | 1674 | # CONFIG_SCHED_TRACER is not set |
1649 | # CONFIG_CONTEXT_SWITCH_TRACER is not set | ||
1650 | # CONFIG_EVENT_TRACER is not set | ||
1651 | # CONFIG_BOOT_TRACER is not set | 1675 | # CONFIG_BOOT_TRACER is not set |
1652 | # CONFIG_TRACE_BRANCH_PROFILING is not set | 1676 | CONFIG_BRANCH_PROFILE_NONE=y |
1677 | # CONFIG_PROFILE_ANNOTATED_BRANCHES is not set | ||
1678 | # CONFIG_PROFILE_ALL_BRANCHES is not set | ||
1653 | # CONFIG_STACK_TRACER is not set | 1679 | # CONFIG_STACK_TRACER is not set |
1654 | # CONFIG_KMEMTRACE is not set | 1680 | # CONFIG_KMEMTRACE is not set |
1655 | # CONFIG_WORKQUEUE_TRACER is not set | 1681 | # CONFIG_WORKQUEUE_TRACER is not set |
1656 | CONFIG_BLK_DEV_IO_TRACE=y | 1682 | CONFIG_BLK_DEV_IO_TRACE=y |
1657 | # CONFIG_FTRACE_STARTUP_TEST is not set | 1683 | # CONFIG_FTRACE_STARTUP_TEST is not set |
1684 | # CONFIG_RING_BUFFER_BENCHMARK is not set | ||
1658 | # CONFIG_DYNAMIC_DEBUG is not set | 1685 | # CONFIG_DYNAMIC_DEBUG is not set |
1659 | # CONFIG_SAMPLES is not set | 1686 | # CONFIG_SAMPLES is not set |
1660 | CONFIG_HAVE_ARCH_KGDB=y | 1687 | CONFIG_HAVE_ARCH_KGDB=y |
diff --git a/arch/sparc/include/asm/cpudata_64.h b/arch/sparc/include/asm/cpudata_64.h index a11b89ee9ef8..926397d345ff 100644 --- a/arch/sparc/include/asm/cpudata_64.h +++ b/arch/sparc/include/asm/cpudata_64.h | |||
@@ -6,9 +6,6 @@ | |||
6 | #ifndef _SPARC64_CPUDATA_H | 6 | #ifndef _SPARC64_CPUDATA_H |
7 | #define _SPARC64_CPUDATA_H | 7 | #define _SPARC64_CPUDATA_H |
8 | 8 | ||
9 | #include <asm/hypervisor.h> | ||
10 | #include <asm/asi.h> | ||
11 | |||
12 | #ifndef __ASSEMBLY__ | 9 | #ifndef __ASSEMBLY__ |
13 | 10 | ||
14 | #include <linux/percpu.h> | 11 | #include <linux/percpu.h> |
@@ -38,202 +35,10 @@ DECLARE_PER_CPU(cpuinfo_sparc, __cpu_data); | |||
38 | #define cpu_data(__cpu) per_cpu(__cpu_data, (__cpu)) | 35 | #define cpu_data(__cpu) per_cpu(__cpu_data, (__cpu)) |
39 | #define local_cpu_data() __get_cpu_var(__cpu_data) | 36 | #define local_cpu_data() __get_cpu_var(__cpu_data) |
40 | 37 | ||
41 | /* Trap handling code needs to get at a few critical values upon | ||
42 | * trap entry and to process TSB misses. These cannot be in the | ||
43 | * per_cpu() area as we really need to lock them into the TLB and | ||
44 | * thus make them part of the main kernel image. As a result we | ||
45 | * try to make this as small as possible. | ||
46 | * | ||
47 | * This is padded out and aligned to 64-bytes to avoid false sharing | ||
48 | * on SMP. | ||
49 | */ | ||
50 | |||
51 | /* If you modify the size of this structure, please update | ||
52 | * TRAP_BLOCK_SZ_SHIFT below. | ||
53 | */ | ||
54 | struct thread_info; | ||
55 | struct trap_per_cpu { | ||
56 | /* D-cache line 1: Basic thread information, cpu and device mondo queues */ | ||
57 | struct thread_info *thread; | ||
58 | unsigned long pgd_paddr; | ||
59 | unsigned long cpu_mondo_pa; | ||
60 | unsigned long dev_mondo_pa; | ||
61 | |||
62 | /* D-cache line 2: Error Mondo Queue and kernel buffer pointers */ | ||
63 | unsigned long resum_mondo_pa; | ||
64 | unsigned long resum_kernel_buf_pa; | ||
65 | unsigned long nonresum_mondo_pa; | ||
66 | unsigned long nonresum_kernel_buf_pa; | ||
67 | |||
68 | /* Dcache lines 3, 4, 5, and 6: Hypervisor Fault Status */ | ||
69 | struct hv_fault_status fault_info; | ||
70 | |||
71 | /* Dcache line 7: Physical addresses of CPU send mondo block and CPU list. */ | ||
72 | unsigned long cpu_mondo_block_pa; | ||
73 | unsigned long cpu_list_pa; | ||
74 | unsigned long tsb_huge; | ||
75 | unsigned long tsb_huge_temp; | ||
76 | |||
77 | /* Dcache line 8: IRQ work list, and keep trap_block a power-of-2 in size. */ | ||
78 | unsigned long irq_worklist_pa; | ||
79 | unsigned int cpu_mondo_qmask; | ||
80 | unsigned int dev_mondo_qmask; | ||
81 | unsigned int resum_qmask; | ||
82 | unsigned int nonresum_qmask; | ||
83 | void *hdesc; | ||
84 | } __attribute__((aligned(64))); | ||
85 | extern struct trap_per_cpu trap_block[NR_CPUS]; | ||
86 | extern void init_cur_cpu_trap(struct thread_info *); | ||
87 | extern void setup_tba(void); | ||
88 | extern int ncpus_probed; | ||
89 | extern const struct seq_operations cpuinfo_op; | 38 | extern const struct seq_operations cpuinfo_op; |
90 | 39 | ||
91 | extern unsigned long real_hard_smp_processor_id(void); | ||
92 | |||
93 | struct cpuid_patch_entry { | ||
94 | unsigned int addr; | ||
95 | unsigned int cheetah_safari[4]; | ||
96 | unsigned int cheetah_jbus[4]; | ||
97 | unsigned int starfire[4]; | ||
98 | unsigned int sun4v[4]; | ||
99 | }; | ||
100 | extern struct cpuid_patch_entry __cpuid_patch, __cpuid_patch_end; | ||
101 | |||
102 | struct sun4v_1insn_patch_entry { | ||
103 | unsigned int addr; | ||
104 | unsigned int insn; | ||
105 | }; | ||
106 | extern struct sun4v_1insn_patch_entry __sun4v_1insn_patch, | ||
107 | __sun4v_1insn_patch_end; | ||
108 | |||
109 | struct sun4v_2insn_patch_entry { | ||
110 | unsigned int addr; | ||
111 | unsigned int insns[2]; | ||
112 | }; | ||
113 | extern struct sun4v_2insn_patch_entry __sun4v_2insn_patch, | ||
114 | __sun4v_2insn_patch_end; | ||
115 | |||
116 | #endif /* !(__ASSEMBLY__) */ | 40 | #endif /* !(__ASSEMBLY__) */ |
117 | 41 | ||
118 | #define TRAP_PER_CPU_THREAD 0x00 | 42 | #include <asm/trap_block.h> |
119 | #define TRAP_PER_CPU_PGD_PADDR 0x08 | ||
120 | #define TRAP_PER_CPU_CPU_MONDO_PA 0x10 | ||
121 | #define TRAP_PER_CPU_DEV_MONDO_PA 0x18 | ||
122 | #define TRAP_PER_CPU_RESUM_MONDO_PA 0x20 | ||
123 | #define TRAP_PER_CPU_RESUM_KBUF_PA 0x28 | ||
124 | #define TRAP_PER_CPU_NONRESUM_MONDO_PA 0x30 | ||
125 | #define TRAP_PER_CPU_NONRESUM_KBUF_PA 0x38 | ||
126 | #define TRAP_PER_CPU_FAULT_INFO 0x40 | ||
127 | #define TRAP_PER_CPU_CPU_MONDO_BLOCK_PA 0xc0 | ||
128 | #define TRAP_PER_CPU_CPU_LIST_PA 0xc8 | ||
129 | #define TRAP_PER_CPU_TSB_HUGE 0xd0 | ||
130 | #define TRAP_PER_CPU_TSB_HUGE_TEMP 0xd8 | ||
131 | #define TRAP_PER_CPU_IRQ_WORKLIST_PA 0xe0 | ||
132 | #define TRAP_PER_CPU_CPU_MONDO_QMASK 0xe8 | ||
133 | #define TRAP_PER_CPU_DEV_MONDO_QMASK 0xec | ||
134 | #define TRAP_PER_CPU_RESUM_QMASK 0xf0 | ||
135 | #define TRAP_PER_CPU_NONRESUM_QMASK 0xf4 | ||
136 | |||
137 | #define TRAP_BLOCK_SZ_SHIFT 8 | ||
138 | |||
139 | #include <asm/scratchpad.h> | ||
140 | |||
141 | #define __GET_CPUID(REG) \ | ||
142 | /* Spitfire implementation (default). */ \ | ||
143 | 661: ldxa [%g0] ASI_UPA_CONFIG, REG; \ | ||
144 | srlx REG, 17, REG; \ | ||
145 | and REG, 0x1f, REG; \ | ||
146 | nop; \ | ||
147 | .section .cpuid_patch, "ax"; \ | ||
148 | /* Instruction location. */ \ | ||
149 | .word 661b; \ | ||
150 | /* Cheetah Safari implementation. */ \ | ||
151 | ldxa [%g0] ASI_SAFARI_CONFIG, REG; \ | ||
152 | srlx REG, 17, REG; \ | ||
153 | and REG, 0x3ff, REG; \ | ||
154 | nop; \ | ||
155 | /* Cheetah JBUS implementation. */ \ | ||
156 | ldxa [%g0] ASI_JBUS_CONFIG, REG; \ | ||
157 | srlx REG, 17, REG; \ | ||
158 | and REG, 0x1f, REG; \ | ||
159 | nop; \ | ||
160 | /* Starfire implementation. */ \ | ||
161 | sethi %hi(0x1fff40000d0 >> 9), REG; \ | ||
162 | sllx REG, 9, REG; \ | ||
163 | or REG, 0xd0, REG; \ | ||
164 | lduwa [REG] ASI_PHYS_BYPASS_EC_E, REG;\ | ||
165 | /* sun4v implementation. */ \ | ||
166 | mov SCRATCHPAD_CPUID, REG; \ | ||
167 | ldxa [REG] ASI_SCRATCHPAD, REG; \ | ||
168 | nop; \ | ||
169 | nop; \ | ||
170 | .previous; | ||
171 | |||
172 | #ifdef CONFIG_SMP | ||
173 | |||
174 | #define TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ | ||
175 | __GET_CPUID(TMP) \ | ||
176 | sethi %hi(trap_block), DEST; \ | ||
177 | sllx TMP, TRAP_BLOCK_SZ_SHIFT, TMP; \ | ||
178 | or DEST, %lo(trap_block), DEST; \ | ||
179 | add DEST, TMP, DEST; \ | ||
180 | |||
181 | /* Clobbers TMP, current address space PGD phys address into DEST. */ | ||
182 | #define TRAP_LOAD_PGD_PHYS(DEST, TMP) \ | ||
183 | TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ | ||
184 | ldx [DEST + TRAP_PER_CPU_PGD_PADDR], DEST; | ||
185 | |||
186 | /* Clobbers TMP, loads local processor's IRQ work area into DEST. */ | ||
187 | #define TRAP_LOAD_IRQ_WORK_PA(DEST, TMP) \ | ||
188 | TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ | ||
189 | add DEST, TRAP_PER_CPU_IRQ_WORKLIST_PA, DEST; | ||
190 | |||
191 | /* Clobbers TMP, loads DEST with current thread info pointer. */ | ||
192 | #define TRAP_LOAD_THREAD_REG(DEST, TMP) \ | ||
193 | TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ | ||
194 | ldx [DEST + TRAP_PER_CPU_THREAD], DEST; | ||
195 | |||
196 | /* Given the current thread info pointer in THR, load the per-cpu | ||
197 | * area base of the current processor into DEST. REG1, REG2, and REG3 are | ||
198 | * clobbered. | ||
199 | * | ||
200 | * You absolutely cannot use DEST as a temporary in this code. The | ||
201 | * reason is that traps can happen during execution, and return from | ||
202 | * trap will load the fully resolved DEST per-cpu base. This can corrupt | ||
203 | * the calculations done by the macro mid-stream. | ||
204 | */ | ||
205 | #define LOAD_PER_CPU_BASE(DEST, THR, REG1, REG2, REG3) \ | ||
206 | lduh [THR + TI_CPU], REG1; \ | ||
207 | sethi %hi(__per_cpu_shift), REG3; \ | ||
208 | sethi %hi(__per_cpu_base), REG2; \ | ||
209 | ldx [REG3 + %lo(__per_cpu_shift)], REG3; \ | ||
210 | ldx [REG2 + %lo(__per_cpu_base)], REG2; \ | ||
211 | sllx REG1, REG3, REG3; \ | ||
212 | add REG3, REG2, DEST; | ||
213 | |||
214 | #else | ||
215 | |||
216 | #define TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ | ||
217 | sethi %hi(trap_block), DEST; \ | ||
218 | or DEST, %lo(trap_block), DEST; \ | ||
219 | |||
220 | /* Uniprocessor versions, we know the cpuid is zero. */ | ||
221 | #define TRAP_LOAD_PGD_PHYS(DEST, TMP) \ | ||
222 | TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ | ||
223 | ldx [DEST + TRAP_PER_CPU_PGD_PADDR], DEST; | ||
224 | |||
225 | /* Clobbers TMP, loads local processor's IRQ work area into DEST. */ | ||
226 | #define TRAP_LOAD_IRQ_WORK_PA(DEST, TMP) \ | ||
227 | TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ | ||
228 | add DEST, TRAP_PER_CPU_IRQ_WORKLIST_PA, DEST; | ||
229 | |||
230 | #define TRAP_LOAD_THREAD_REG(DEST, TMP) \ | ||
231 | TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ | ||
232 | ldx [DEST + TRAP_PER_CPU_THREAD], DEST; | ||
233 | |||
234 | /* No per-cpu areas on uniprocessor, so no need to load DEST. */ | ||
235 | #define LOAD_PER_CPU_BASE(DEST, THR, REG1, REG2, REG3) | ||
236 | |||
237 | #endif /* !(CONFIG_SMP) */ | ||
238 | 43 | ||
239 | #endif /* _SPARC64_CPUDATA_H */ | 44 | #endif /* _SPARC64_CPUDATA_H */ |
diff --git a/arch/sparc/include/asm/dma-mapping.h b/arch/sparc/include/asm/dma-mapping.h index 0f4150e26619..204e4bf64438 100644 --- a/arch/sparc/include/asm/dma-mapping.h +++ b/arch/sparc/include/asm/dma-mapping.h | |||
@@ -1,8 +1,166 @@ | |||
1 | #ifndef ___ASM_SPARC_DMA_MAPPING_H | 1 | #ifndef ___ASM_SPARC_DMA_MAPPING_H |
2 | #define ___ASM_SPARC_DMA_MAPPING_H | 2 | #define ___ASM_SPARC_DMA_MAPPING_H |
3 | #if defined(__sparc__) && defined(__arch64__) | 3 | |
4 | #include <asm/dma-mapping_64.h> | 4 | #include <linux/scatterlist.h> |
5 | #else | 5 | #include <linux/mm.h> |
6 | #include <asm/dma-mapping_32.h> | 6 | |
7 | #endif | 7 | #define DMA_ERROR_CODE (~(dma_addr_t)0x0) |
8 | |||
9 | extern int dma_supported(struct device *dev, u64 mask); | ||
10 | extern int dma_set_mask(struct device *dev, u64 dma_mask); | ||
11 | |||
12 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) | ||
13 | #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) | ||
14 | #define dma_is_consistent(d, h) (1) | ||
15 | |||
16 | struct dma_ops { | ||
17 | void *(*alloc_coherent)(struct device *dev, size_t size, | ||
18 | dma_addr_t *dma_handle, gfp_t flag); | ||
19 | void (*free_coherent)(struct device *dev, size_t size, | ||
20 | void *cpu_addr, dma_addr_t dma_handle); | ||
21 | dma_addr_t (*map_page)(struct device *dev, struct page *page, | ||
22 | unsigned long offset, size_t size, | ||
23 | enum dma_data_direction direction); | ||
24 | void (*unmap_page)(struct device *dev, dma_addr_t dma_addr, | ||
25 | size_t size, | ||
26 | enum dma_data_direction direction); | ||
27 | int (*map_sg)(struct device *dev, struct scatterlist *sg, int nents, | ||
28 | enum dma_data_direction direction); | ||
29 | void (*unmap_sg)(struct device *dev, struct scatterlist *sg, | ||
30 | int nhwentries, | ||
31 | enum dma_data_direction direction); | ||
32 | void (*sync_single_for_cpu)(struct device *dev, | ||
33 | dma_addr_t dma_handle, size_t size, | ||
34 | enum dma_data_direction direction); | ||
35 | void (*sync_single_for_device)(struct device *dev, | ||
36 | dma_addr_t dma_handle, size_t size, | ||
37 | enum dma_data_direction direction); | ||
38 | void (*sync_sg_for_cpu)(struct device *dev, struct scatterlist *sg, | ||
39 | int nelems, | ||
40 | enum dma_data_direction direction); | ||
41 | void (*sync_sg_for_device)(struct device *dev, | ||
42 | struct scatterlist *sg, int nents, | ||
43 | enum dma_data_direction dir); | ||
44 | }; | ||
45 | extern const struct dma_ops *dma_ops; | ||
46 | |||
47 | static inline void *dma_alloc_coherent(struct device *dev, size_t size, | ||
48 | dma_addr_t *dma_handle, gfp_t flag) | ||
49 | { | ||
50 | return dma_ops->alloc_coherent(dev, size, dma_handle, flag); | ||
51 | } | ||
52 | |||
53 | static inline void dma_free_coherent(struct device *dev, size_t size, | ||
54 | void *cpu_addr, dma_addr_t dma_handle) | ||
55 | { | ||
56 | dma_ops->free_coherent(dev, size, cpu_addr, dma_handle); | ||
57 | } | ||
58 | |||
59 | static inline dma_addr_t dma_map_single(struct device *dev, void *cpu_addr, | ||
60 | size_t size, | ||
61 | enum dma_data_direction direction) | ||
62 | { | ||
63 | return dma_ops->map_page(dev, virt_to_page(cpu_addr), | ||
64 | (unsigned long)cpu_addr & ~PAGE_MASK, size, | ||
65 | direction); | ||
66 | } | ||
67 | |||
68 | static inline void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, | ||
69 | size_t size, | ||
70 | enum dma_data_direction direction) | ||
71 | { | ||
72 | dma_ops->unmap_page(dev, dma_addr, size, direction); | ||
73 | } | ||
74 | |||
75 | static inline dma_addr_t dma_map_page(struct device *dev, struct page *page, | ||
76 | unsigned long offset, size_t size, | ||
77 | enum dma_data_direction direction) | ||
78 | { | ||
79 | return dma_ops->map_page(dev, page, offset, size, direction); | ||
80 | } | ||
81 | |||
82 | static inline void dma_unmap_page(struct device *dev, dma_addr_t dma_address, | ||
83 | size_t size, | ||
84 | enum dma_data_direction direction) | ||
85 | { | ||
86 | dma_ops->unmap_page(dev, dma_address, size, direction); | ||
87 | } | ||
88 | |||
89 | static inline int dma_map_sg(struct device *dev, struct scatterlist *sg, | ||
90 | int nents, enum dma_data_direction direction) | ||
91 | { | ||
92 | return dma_ops->map_sg(dev, sg, nents, direction); | ||
93 | } | ||
94 | |||
95 | static inline void dma_unmap_sg(struct device *dev, struct scatterlist *sg, | ||
96 | int nents, enum dma_data_direction direction) | ||
97 | { | ||
98 | dma_ops->unmap_sg(dev, sg, nents, direction); | ||
99 | } | ||
100 | |||
101 | static inline void dma_sync_single_for_cpu(struct device *dev, | ||
102 | dma_addr_t dma_handle, size_t size, | ||
103 | enum dma_data_direction direction) | ||
104 | { | ||
105 | dma_ops->sync_single_for_cpu(dev, dma_handle, size, direction); | ||
106 | } | ||
107 | |||
108 | static inline void dma_sync_single_for_device(struct device *dev, | ||
109 | dma_addr_t dma_handle, | ||
110 | size_t size, | ||
111 | enum dma_data_direction direction) | ||
112 | { | ||
113 | if (dma_ops->sync_single_for_device) | ||
114 | dma_ops->sync_single_for_device(dev, dma_handle, size, | ||
115 | direction); | ||
116 | } | ||
117 | |||
118 | static inline void dma_sync_sg_for_cpu(struct device *dev, | ||
119 | struct scatterlist *sg, int nelems, | ||
120 | enum dma_data_direction direction) | ||
121 | { | ||
122 | dma_ops->sync_sg_for_cpu(dev, sg, nelems, direction); | ||
123 | } | ||
124 | |||
125 | static inline void dma_sync_sg_for_device(struct device *dev, | ||
126 | struct scatterlist *sg, int nelems, | ||
127 | enum dma_data_direction direction) | ||
128 | { | ||
129 | if (dma_ops->sync_sg_for_device) | ||
130 | dma_ops->sync_sg_for_device(dev, sg, nelems, direction); | ||
131 | } | ||
132 | |||
133 | static inline void dma_sync_single_range_for_cpu(struct device *dev, | ||
134 | dma_addr_t dma_handle, | ||
135 | unsigned long offset, | ||
136 | size_t size, | ||
137 | enum dma_data_direction dir) | ||
138 | { | ||
139 | dma_sync_single_for_cpu(dev, dma_handle+offset, size, dir); | ||
140 | } | ||
141 | |||
142 | static inline void dma_sync_single_range_for_device(struct device *dev, | ||
143 | dma_addr_t dma_handle, | ||
144 | unsigned long offset, | ||
145 | size_t size, | ||
146 | enum dma_data_direction dir) | ||
147 | { | ||
148 | dma_sync_single_for_device(dev, dma_handle+offset, size, dir); | ||
149 | } | ||
150 | |||
151 | |||
152 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | ||
153 | { | ||
154 | return (dma_addr == DMA_ERROR_CODE); | ||
155 | } | ||
156 | |||
157 | static inline int dma_get_cache_alignment(void) | ||
158 | { | ||
159 | /* | ||
160 | * no easy way to get cache size on all processors, so return | ||
161 | * the maximum possible, to be safe | ||
162 | */ | ||
163 | return (1 << INTERNODE_CACHE_SHIFT); | ||
164 | } | ||
165 | |||
8 | #endif | 166 | #endif |
diff --git a/arch/sparc/include/asm/dma-mapping_32.h b/arch/sparc/include/asm/dma-mapping_32.h deleted file mode 100644 index 8a57ea0573e6..000000000000 --- a/arch/sparc/include/asm/dma-mapping_32.h +++ /dev/null | |||
@@ -1,60 +0,0 @@ | |||
1 | #ifndef _ASM_SPARC_DMA_MAPPING_H | ||
2 | #define _ASM_SPARC_DMA_MAPPING_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | |||
6 | struct device; | ||
7 | struct scatterlist; | ||
8 | struct page; | ||
9 | |||
10 | #define DMA_ERROR_CODE (~(dma_addr_t)0x0) | ||
11 | |||
12 | extern int dma_supported(struct device *dev, u64 mask); | ||
13 | extern int dma_set_mask(struct device *dev, u64 dma_mask); | ||
14 | extern void *dma_alloc_coherent(struct device *dev, size_t size, | ||
15 | dma_addr_t *dma_handle, gfp_t flag); | ||
16 | extern void dma_free_coherent(struct device *dev, size_t size, | ||
17 | void *cpu_addr, dma_addr_t dma_handle); | ||
18 | extern dma_addr_t dma_map_single(struct device *dev, void *cpu_addr, | ||
19 | size_t size, | ||
20 | enum dma_data_direction direction); | ||
21 | extern void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, | ||
22 | size_t size, | ||
23 | enum dma_data_direction direction); | ||
24 | extern dma_addr_t dma_map_page(struct device *dev, struct page *page, | ||
25 | unsigned long offset, size_t size, | ||
26 | enum dma_data_direction direction); | ||
27 | extern void dma_unmap_page(struct device *dev, dma_addr_t dma_address, | ||
28 | size_t size, enum dma_data_direction direction); | ||
29 | extern int dma_map_sg(struct device *dev, struct scatterlist *sg, | ||
30 | int nents, enum dma_data_direction direction); | ||
31 | extern void dma_unmap_sg(struct device *dev, struct scatterlist *sg, | ||
32 | int nents, enum dma_data_direction direction); | ||
33 | extern void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, | ||
34 | size_t size, | ||
35 | enum dma_data_direction direction); | ||
36 | extern void dma_sync_single_for_device(struct device *dev, | ||
37 | dma_addr_t dma_handle, | ||
38 | size_t size, | ||
39 | enum dma_data_direction direction); | ||
40 | extern void dma_sync_single_range_for_cpu(struct device *dev, | ||
41 | dma_addr_t dma_handle, | ||
42 | unsigned long offset, | ||
43 | size_t size, | ||
44 | enum dma_data_direction direction); | ||
45 | extern void dma_sync_single_range_for_device(struct device *dev, | ||
46 | dma_addr_t dma_handle, | ||
47 | unsigned long offset, size_t size, | ||
48 | enum dma_data_direction direction); | ||
49 | extern void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, | ||
50 | int nelems, enum dma_data_direction direction); | ||
51 | extern void dma_sync_sg_for_device(struct device *dev, | ||
52 | struct scatterlist *sg, int nelems, | ||
53 | enum dma_data_direction direction); | ||
54 | extern int dma_mapping_error(struct device *dev, dma_addr_t dma_addr); | ||
55 | extern int dma_get_cache_alignment(void); | ||
56 | |||
57 | #define dma_alloc_noncoherent dma_alloc_coherent | ||
58 | #define dma_free_noncoherent dma_free_coherent | ||
59 | |||
60 | #endif /* _ASM_SPARC_DMA_MAPPING_H */ | ||
diff --git a/arch/sparc/include/asm/dma-mapping_64.h b/arch/sparc/include/asm/dma-mapping_64.h deleted file mode 100644 index bfa64f9702d5..000000000000 --- a/arch/sparc/include/asm/dma-mapping_64.h +++ /dev/null | |||
@@ -1,154 +0,0 @@ | |||
1 | #ifndef _ASM_SPARC64_DMA_MAPPING_H | ||
2 | #define _ASM_SPARC64_DMA_MAPPING_H | ||
3 | |||
4 | #include <linux/scatterlist.h> | ||
5 | #include <linux/mm.h> | ||
6 | |||
7 | #define DMA_ERROR_CODE (~(dma_addr_t)0x0) | ||
8 | |||
9 | struct dma_ops { | ||
10 | void *(*alloc_coherent)(struct device *dev, size_t size, | ||
11 | dma_addr_t *dma_handle, gfp_t flag); | ||
12 | void (*free_coherent)(struct device *dev, size_t size, | ||
13 | void *cpu_addr, dma_addr_t dma_handle); | ||
14 | dma_addr_t (*map_single)(struct device *dev, void *cpu_addr, | ||
15 | size_t size, | ||
16 | enum dma_data_direction direction); | ||
17 | void (*unmap_single)(struct device *dev, dma_addr_t dma_addr, | ||
18 | size_t size, | ||
19 | enum dma_data_direction direction); | ||
20 | int (*map_sg)(struct device *dev, struct scatterlist *sg, int nents, | ||
21 | enum dma_data_direction direction); | ||
22 | void (*unmap_sg)(struct device *dev, struct scatterlist *sg, | ||
23 | int nhwentries, | ||
24 | enum dma_data_direction direction); | ||
25 | void (*sync_single_for_cpu)(struct device *dev, | ||
26 | dma_addr_t dma_handle, size_t size, | ||
27 | enum dma_data_direction direction); | ||
28 | void (*sync_sg_for_cpu)(struct device *dev, struct scatterlist *sg, | ||
29 | int nelems, | ||
30 | enum dma_data_direction direction); | ||
31 | }; | ||
32 | extern const struct dma_ops *dma_ops; | ||
33 | |||
34 | extern int dma_supported(struct device *dev, u64 mask); | ||
35 | extern int dma_set_mask(struct device *dev, u64 dma_mask); | ||
36 | |||
37 | static inline void *dma_alloc_coherent(struct device *dev, size_t size, | ||
38 | dma_addr_t *dma_handle, gfp_t flag) | ||
39 | { | ||
40 | return dma_ops->alloc_coherent(dev, size, dma_handle, flag); | ||
41 | } | ||
42 | |||
43 | static inline void dma_free_coherent(struct device *dev, size_t size, | ||
44 | void *cpu_addr, dma_addr_t dma_handle) | ||
45 | { | ||
46 | dma_ops->free_coherent(dev, size, cpu_addr, dma_handle); | ||
47 | } | ||
48 | |||
49 | static inline dma_addr_t dma_map_single(struct device *dev, void *cpu_addr, | ||
50 | size_t size, | ||
51 | enum dma_data_direction direction) | ||
52 | { | ||
53 | return dma_ops->map_single(dev, cpu_addr, size, direction); | ||
54 | } | ||
55 | |||
56 | static inline void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, | ||
57 | size_t size, | ||
58 | enum dma_data_direction direction) | ||
59 | { | ||
60 | dma_ops->unmap_single(dev, dma_addr, size, direction); | ||
61 | } | ||
62 | |||
63 | static inline dma_addr_t dma_map_page(struct device *dev, struct page *page, | ||
64 | unsigned long offset, size_t size, | ||
65 | enum dma_data_direction direction) | ||
66 | { | ||
67 | return dma_ops->map_single(dev, page_address(page) + offset, | ||
68 | size, direction); | ||
69 | } | ||
70 | |||
71 | static inline void dma_unmap_page(struct device *dev, dma_addr_t dma_address, | ||
72 | size_t size, | ||
73 | enum dma_data_direction direction) | ||
74 | { | ||
75 | dma_ops->unmap_single(dev, dma_address, size, direction); | ||
76 | } | ||
77 | |||
78 | static inline int dma_map_sg(struct device *dev, struct scatterlist *sg, | ||
79 | int nents, enum dma_data_direction direction) | ||
80 | { | ||
81 | return dma_ops->map_sg(dev, sg, nents, direction); | ||
82 | } | ||
83 | |||
84 | static inline void dma_unmap_sg(struct device *dev, struct scatterlist *sg, | ||
85 | int nents, enum dma_data_direction direction) | ||
86 | { | ||
87 | dma_ops->unmap_sg(dev, sg, nents, direction); | ||
88 | } | ||
89 | |||
90 | static inline void dma_sync_single_for_cpu(struct device *dev, | ||
91 | dma_addr_t dma_handle, size_t size, | ||
92 | enum dma_data_direction direction) | ||
93 | { | ||
94 | dma_ops->sync_single_for_cpu(dev, dma_handle, size, direction); | ||
95 | } | ||
96 | |||
97 | static inline void dma_sync_single_for_device(struct device *dev, | ||
98 | dma_addr_t dma_handle, | ||
99 | size_t size, | ||
100 | enum dma_data_direction direction) | ||
101 | { | ||
102 | /* No flushing needed to sync cpu writes to the device. */ | ||
103 | } | ||
104 | |||
105 | static inline void dma_sync_single_range_for_cpu(struct device *dev, | ||
106 | dma_addr_t dma_handle, | ||
107 | unsigned long offset, | ||
108 | size_t size, | ||
109 | enum dma_data_direction direction) | ||
110 | { | ||
111 | dma_sync_single_for_cpu(dev, dma_handle+offset, size, direction); | ||
112 | } | ||
113 | |||
114 | static inline void dma_sync_single_range_for_device(struct device *dev, | ||
115 | dma_addr_t dma_handle, | ||
116 | unsigned long offset, | ||
117 | size_t size, | ||
118 | enum dma_data_direction direction) | ||
119 | { | ||
120 | /* No flushing needed to sync cpu writes to the device. */ | ||
121 | } | ||
122 | |||
123 | |||
124 | static inline void dma_sync_sg_for_cpu(struct device *dev, | ||
125 | struct scatterlist *sg, int nelems, | ||
126 | enum dma_data_direction direction) | ||
127 | { | ||
128 | dma_ops->sync_sg_for_cpu(dev, sg, nelems, direction); | ||
129 | } | ||
130 | |||
131 | static inline void dma_sync_sg_for_device(struct device *dev, | ||
132 | struct scatterlist *sg, int nelems, | ||
133 | enum dma_data_direction direction) | ||
134 | { | ||
135 | /* No flushing needed to sync cpu writes to the device. */ | ||
136 | } | ||
137 | |||
138 | static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | ||
139 | { | ||
140 | return (dma_addr == DMA_ERROR_CODE); | ||
141 | } | ||
142 | |||
143 | static inline int dma_get_cache_alignment(void) | ||
144 | { | ||
145 | /* no easy way to get cache size on all processors, so return | ||
146 | * the maximum possible, to be safe */ | ||
147 | return (1 << INTERNODE_CACHE_SHIFT); | ||
148 | } | ||
149 | |||
150 | #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) | ||
151 | #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) | ||
152 | #define dma_is_consistent(d, h) (1) | ||
153 | |||
154 | #endif /* _ASM_SPARC64_DMA_MAPPING_H */ | ||
diff --git a/arch/sparc/include/asm/ftrace.h b/arch/sparc/include/asm/ftrace.h index d27716cd38c1..b0f18e9893db 100644 --- a/arch/sparc/include/asm/ftrace.h +++ b/arch/sparc/include/asm/ftrace.h | |||
@@ -11,4 +11,15 @@ extern void _mcount(void); | |||
11 | 11 | ||
12 | #endif | 12 | #endif |
13 | 13 | ||
14 | #ifdef CONFIG_DYNAMIC_FTRACE | ||
15 | /* reloction of mcount call site is the same as the address */ | ||
16 | static inline unsigned long ftrace_call_adjust(unsigned long addr) | ||
17 | { | ||
18 | return addr; | ||
19 | } | ||
20 | |||
21 | struct dyn_arch_ftrace { | ||
22 | }; | ||
23 | #endif /* CONFIG_DYNAMIC_FTRACE */ | ||
24 | |||
14 | #endif /* _ASM_SPARC64_FTRACE */ | 25 | #endif /* _ASM_SPARC64_FTRACE */ |
diff --git a/arch/sparc/include/asm/kmap_types.h b/arch/sparc/include/asm/kmap_types.h index 602f5e034f7a..aad21745fbb9 100644 --- a/arch/sparc/include/asm/kmap_types.h +++ b/arch/sparc/include/asm/kmap_types.h | |||
@@ -5,21 +5,6 @@ | |||
5 | * is actually used on sparc. -DaveM | 5 | * is actually used on sparc. -DaveM |
6 | */ | 6 | */ |
7 | 7 | ||
8 | enum km_type { | 8 | #include <asm-generic/kmap_types.h> |
9 | KM_BOUNCE_READ, | ||
10 | KM_SKB_SUNRPC_DATA, | ||
11 | KM_SKB_DATA_SOFTIRQ, | ||
12 | KM_USER0, | ||
13 | KM_USER1, | ||
14 | KM_BIO_SRC_IRQ, | ||
15 | KM_BIO_DST_IRQ, | ||
16 | KM_PTE0, | ||
17 | KM_PTE1, | ||
18 | KM_IRQ0, | ||
19 | KM_IRQ1, | ||
20 | KM_SOFTIRQ0, | ||
21 | KM_SOFTIRQ1, | ||
22 | KM_TYPE_NR | ||
23 | }; | ||
24 | 9 | ||
25 | #endif | 10 | #endif |
diff --git a/arch/sparc/include/asm/mdesc.h b/arch/sparc/include/asm/mdesc.h index 1acc7272e537..9faa046713fb 100644 --- a/arch/sparc/include/asm/mdesc.h +++ b/arch/sparc/include/asm/mdesc.h | |||
@@ -71,7 +71,8 @@ struct mdesc_notifier_client { | |||
71 | 71 | ||
72 | extern void mdesc_register_notifier(struct mdesc_notifier_client *client); | 72 | extern void mdesc_register_notifier(struct mdesc_notifier_client *client); |
73 | 73 | ||
74 | extern void mdesc_fill_in_cpu_data(cpumask_t mask); | 74 | extern void mdesc_fill_in_cpu_data(cpumask_t *mask); |
75 | extern void mdesc_populate_present_mask(cpumask_t *mask); | ||
75 | 76 | ||
76 | extern void sun4v_mdesc_init(void); | 77 | extern void sun4v_mdesc_init(void); |
77 | 78 | ||
diff --git a/arch/sparc/include/asm/percpu_64.h b/arch/sparc/include/asm/percpu_64.h index bee64593023e..007aafb4ae97 100644 --- a/arch/sparc/include/asm/percpu_64.h +++ b/arch/sparc/include/asm/percpu_64.h | |||
@@ -7,20 +7,16 @@ register unsigned long __local_per_cpu_offset asm("g5"); | |||
7 | 7 | ||
8 | #ifdef CONFIG_SMP | 8 | #ifdef CONFIG_SMP |
9 | 9 | ||
10 | extern void real_setup_per_cpu_areas(void); | 10 | #include <asm/trap_block.h> |
11 | 11 | ||
12 | extern unsigned long __per_cpu_base; | ||
13 | extern unsigned long __per_cpu_shift; | ||
14 | #define __per_cpu_offset(__cpu) \ | 12 | #define __per_cpu_offset(__cpu) \ |
15 | (__per_cpu_base + ((unsigned long)(__cpu) << __per_cpu_shift)) | 13 | (trap_block[(__cpu)].__per_cpu_base) |
16 | #define per_cpu_offset(x) (__per_cpu_offset(x)) | 14 | #define per_cpu_offset(x) (__per_cpu_offset(x)) |
17 | 15 | ||
18 | #define __my_cpu_offset __local_per_cpu_offset | 16 | #define __my_cpu_offset __local_per_cpu_offset |
19 | 17 | ||
20 | #else /* ! SMP */ | 18 | #else /* ! SMP */ |
21 | 19 | ||
22 | #define real_setup_per_cpu_areas() do { } while (0) | ||
23 | |||
24 | #endif /* SMP */ | 20 | #endif /* SMP */ |
25 | 21 | ||
26 | #include <asm-generic/percpu.h> | 22 | #include <asm-generic/percpu.h> |
diff --git a/arch/sparc/include/asm/prom.h b/arch/sparc/include/asm/prom.h index 900d44714f8d..be8d7aaeb60d 100644 --- a/arch/sparc/include/asm/prom.h +++ b/arch/sparc/include/asm/prom.h | |||
@@ -86,6 +86,8 @@ extern int of_node_to_nid(struct device_node *dp); | |||
86 | #endif | 86 | #endif |
87 | 87 | ||
88 | extern void prom_build_devicetree(void); | 88 | extern void prom_build_devicetree(void); |
89 | extern void of_populate_present_mask(void); | ||
90 | extern void of_fill_in_cpu_data(void); | ||
89 | 91 | ||
90 | /* Dummy ref counting routines - to be implemented later */ | 92 | /* Dummy ref counting routines - to be implemented later */ |
91 | static inline struct device_node *of_node_get(struct device_node *node) | 93 | static inline struct device_node *of_node_get(struct device_node *node) |
diff --git a/arch/sparc/include/asm/trap_block.h b/arch/sparc/include/asm/trap_block.h new file mode 100644 index 000000000000..7e26b2db6211 --- /dev/null +++ b/arch/sparc/include/asm/trap_block.h | |||
@@ -0,0 +1,207 @@ | |||
1 | #ifndef _SPARC_TRAP_BLOCK_H | ||
2 | #define _SPARC_TRAP_BLOCK_H | ||
3 | |||
4 | #include <asm/hypervisor.h> | ||
5 | #include <asm/asi.h> | ||
6 | |||
7 | #ifndef __ASSEMBLY__ | ||
8 | |||
9 | /* Trap handling code needs to get at a few critical values upon | ||
10 | * trap entry and to process TSB misses. These cannot be in the | ||
11 | * per_cpu() area as we really need to lock them into the TLB and | ||
12 | * thus make them part of the main kernel image. As a result we | ||
13 | * try to make this as small as possible. | ||
14 | * | ||
15 | * This is padded out and aligned to 64-bytes to avoid false sharing | ||
16 | * on SMP. | ||
17 | */ | ||
18 | |||
19 | /* If you modify the size of this structure, please update | ||
20 | * TRAP_BLOCK_SZ_SHIFT below. | ||
21 | */ | ||
22 | struct thread_info; | ||
23 | struct trap_per_cpu { | ||
24 | /* D-cache line 1: Basic thread information, cpu and device mondo queues */ | ||
25 | struct thread_info *thread; | ||
26 | unsigned long pgd_paddr; | ||
27 | unsigned long cpu_mondo_pa; | ||
28 | unsigned long dev_mondo_pa; | ||
29 | |||
30 | /* D-cache line 2: Error Mondo Queue and kernel buffer pointers */ | ||
31 | unsigned long resum_mondo_pa; | ||
32 | unsigned long resum_kernel_buf_pa; | ||
33 | unsigned long nonresum_mondo_pa; | ||
34 | unsigned long nonresum_kernel_buf_pa; | ||
35 | |||
36 | /* Dcache lines 3, 4, 5, and 6: Hypervisor Fault Status */ | ||
37 | struct hv_fault_status fault_info; | ||
38 | |||
39 | /* Dcache line 7: Physical addresses of CPU send mondo block and CPU list. */ | ||
40 | unsigned long cpu_mondo_block_pa; | ||
41 | unsigned long cpu_list_pa; | ||
42 | unsigned long tsb_huge; | ||
43 | unsigned long tsb_huge_temp; | ||
44 | |||
45 | /* Dcache line 8: IRQ work list, and keep trap_block a power-of-2 in size. */ | ||
46 | unsigned long irq_worklist_pa; | ||
47 | unsigned int cpu_mondo_qmask; | ||
48 | unsigned int dev_mondo_qmask; | ||
49 | unsigned int resum_qmask; | ||
50 | unsigned int nonresum_qmask; | ||
51 | unsigned long __per_cpu_base; | ||
52 | } __attribute__((aligned(64))); | ||
53 | extern struct trap_per_cpu trap_block[NR_CPUS]; | ||
54 | extern void init_cur_cpu_trap(struct thread_info *); | ||
55 | extern void setup_tba(void); | ||
56 | extern int ncpus_probed; | ||
57 | |||
58 | extern unsigned long real_hard_smp_processor_id(void); | ||
59 | |||
60 | struct cpuid_patch_entry { | ||
61 | unsigned int addr; | ||
62 | unsigned int cheetah_safari[4]; | ||
63 | unsigned int cheetah_jbus[4]; | ||
64 | unsigned int starfire[4]; | ||
65 | unsigned int sun4v[4]; | ||
66 | }; | ||
67 | extern struct cpuid_patch_entry __cpuid_patch, __cpuid_patch_end; | ||
68 | |||
69 | struct sun4v_1insn_patch_entry { | ||
70 | unsigned int addr; | ||
71 | unsigned int insn; | ||
72 | }; | ||
73 | extern struct sun4v_1insn_patch_entry __sun4v_1insn_patch, | ||
74 | __sun4v_1insn_patch_end; | ||
75 | |||
76 | struct sun4v_2insn_patch_entry { | ||
77 | unsigned int addr; | ||
78 | unsigned int insns[2]; | ||
79 | }; | ||
80 | extern struct sun4v_2insn_patch_entry __sun4v_2insn_patch, | ||
81 | __sun4v_2insn_patch_end; | ||
82 | |||
83 | |||
84 | #endif /* !(__ASSEMBLY__) */ | ||
85 | |||
86 | #define TRAP_PER_CPU_THREAD 0x00 | ||
87 | #define TRAP_PER_CPU_PGD_PADDR 0x08 | ||
88 | #define TRAP_PER_CPU_CPU_MONDO_PA 0x10 | ||
89 | #define TRAP_PER_CPU_DEV_MONDO_PA 0x18 | ||
90 | #define TRAP_PER_CPU_RESUM_MONDO_PA 0x20 | ||
91 | #define TRAP_PER_CPU_RESUM_KBUF_PA 0x28 | ||
92 | #define TRAP_PER_CPU_NONRESUM_MONDO_PA 0x30 | ||
93 | #define TRAP_PER_CPU_NONRESUM_KBUF_PA 0x38 | ||
94 | #define TRAP_PER_CPU_FAULT_INFO 0x40 | ||
95 | #define TRAP_PER_CPU_CPU_MONDO_BLOCK_PA 0xc0 | ||
96 | #define TRAP_PER_CPU_CPU_LIST_PA 0xc8 | ||
97 | #define TRAP_PER_CPU_TSB_HUGE 0xd0 | ||
98 | #define TRAP_PER_CPU_TSB_HUGE_TEMP 0xd8 | ||
99 | #define TRAP_PER_CPU_IRQ_WORKLIST_PA 0xe0 | ||
100 | #define TRAP_PER_CPU_CPU_MONDO_QMASK 0xe8 | ||
101 | #define TRAP_PER_CPU_DEV_MONDO_QMASK 0xec | ||
102 | #define TRAP_PER_CPU_RESUM_QMASK 0xf0 | ||
103 | #define TRAP_PER_CPU_NONRESUM_QMASK 0xf4 | ||
104 | #define TRAP_PER_CPU_PER_CPU_BASE 0xf8 | ||
105 | |||
106 | #define TRAP_BLOCK_SZ_SHIFT 8 | ||
107 | |||
108 | #include <asm/scratchpad.h> | ||
109 | |||
110 | #define __GET_CPUID(REG) \ | ||
111 | /* Spitfire implementation (default). */ \ | ||
112 | 661: ldxa [%g0] ASI_UPA_CONFIG, REG; \ | ||
113 | srlx REG, 17, REG; \ | ||
114 | and REG, 0x1f, REG; \ | ||
115 | nop; \ | ||
116 | .section .cpuid_patch, "ax"; \ | ||
117 | /* Instruction location. */ \ | ||
118 | .word 661b; \ | ||
119 | /* Cheetah Safari implementation. */ \ | ||
120 | ldxa [%g0] ASI_SAFARI_CONFIG, REG; \ | ||
121 | srlx REG, 17, REG; \ | ||
122 | and REG, 0x3ff, REG; \ | ||
123 | nop; \ | ||
124 | /* Cheetah JBUS implementation. */ \ | ||
125 | ldxa [%g0] ASI_JBUS_CONFIG, REG; \ | ||
126 | srlx REG, 17, REG; \ | ||
127 | and REG, 0x1f, REG; \ | ||
128 | nop; \ | ||
129 | /* Starfire implementation. */ \ | ||
130 | sethi %hi(0x1fff40000d0 >> 9), REG; \ | ||
131 | sllx REG, 9, REG; \ | ||
132 | or REG, 0xd0, REG; \ | ||
133 | lduwa [REG] ASI_PHYS_BYPASS_EC_E, REG;\ | ||
134 | /* sun4v implementation. */ \ | ||
135 | mov SCRATCHPAD_CPUID, REG; \ | ||
136 | ldxa [REG] ASI_SCRATCHPAD, REG; \ | ||
137 | nop; \ | ||
138 | nop; \ | ||
139 | .previous; | ||
140 | |||
141 | #ifdef CONFIG_SMP | ||
142 | |||
143 | #define TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ | ||
144 | __GET_CPUID(TMP) \ | ||
145 | sethi %hi(trap_block), DEST; \ | ||
146 | sllx TMP, TRAP_BLOCK_SZ_SHIFT, TMP; \ | ||
147 | or DEST, %lo(trap_block), DEST; \ | ||
148 | add DEST, TMP, DEST; \ | ||
149 | |||
150 | /* Clobbers TMP, current address space PGD phys address into DEST. */ | ||
151 | #define TRAP_LOAD_PGD_PHYS(DEST, TMP) \ | ||
152 | TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ | ||
153 | ldx [DEST + TRAP_PER_CPU_PGD_PADDR], DEST; | ||
154 | |||
155 | /* Clobbers TMP, loads local processor's IRQ work area into DEST. */ | ||
156 | #define TRAP_LOAD_IRQ_WORK_PA(DEST, TMP) \ | ||
157 | TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ | ||
158 | add DEST, TRAP_PER_CPU_IRQ_WORKLIST_PA, DEST; | ||
159 | |||
160 | /* Clobbers TMP, loads DEST with current thread info pointer. */ | ||
161 | #define TRAP_LOAD_THREAD_REG(DEST, TMP) \ | ||
162 | TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ | ||
163 | ldx [DEST + TRAP_PER_CPU_THREAD], DEST; | ||
164 | |||
165 | /* Given the current thread info pointer in THR, load the per-cpu | ||
166 | * area base of the current processor into DEST. REG1, REG2, and REG3 are | ||
167 | * clobbered. | ||
168 | * | ||
169 | * You absolutely cannot use DEST as a temporary in this code. The | ||
170 | * reason is that traps can happen during execution, and return from | ||
171 | * trap will load the fully resolved DEST per-cpu base. This can corrupt | ||
172 | * the calculations done by the macro mid-stream. | ||
173 | */ | ||
174 | #define LOAD_PER_CPU_BASE(DEST, THR, REG1, REG2, REG3) \ | ||
175 | lduh [THR + TI_CPU], REG1; \ | ||
176 | sethi %hi(trap_block), REG2; \ | ||
177 | sllx REG1, TRAP_BLOCK_SZ_SHIFT, REG1; \ | ||
178 | or REG2, %lo(trap_block), REG2; \ | ||
179 | add REG2, REG1, REG2; \ | ||
180 | ldx [REG2 + TRAP_PER_CPU_PER_CPU_BASE], DEST; | ||
181 | |||
182 | #else | ||
183 | |||
184 | #define TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ | ||
185 | sethi %hi(trap_block), DEST; \ | ||
186 | or DEST, %lo(trap_block), DEST; \ | ||
187 | |||
188 | /* Uniprocessor versions, we know the cpuid is zero. */ | ||
189 | #define TRAP_LOAD_PGD_PHYS(DEST, TMP) \ | ||
190 | TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ | ||
191 | ldx [DEST + TRAP_PER_CPU_PGD_PADDR], DEST; | ||
192 | |||
193 | /* Clobbers TMP, loads local processor's IRQ work area into DEST. */ | ||
194 | #define TRAP_LOAD_IRQ_WORK_PA(DEST, TMP) \ | ||
195 | TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ | ||
196 | add DEST, TRAP_PER_CPU_IRQ_WORKLIST_PA, DEST; | ||
197 | |||
198 | #define TRAP_LOAD_THREAD_REG(DEST, TMP) \ | ||
199 | TRAP_LOAD_TRAP_BLOCK(DEST, TMP) \ | ||
200 | ldx [DEST + TRAP_PER_CPU_THREAD], DEST; | ||
201 | |||
202 | /* No per-cpu areas on uniprocessor, so no need to load DEST. */ | ||
203 | #define LOAD_PER_CPU_BASE(DEST, THR, REG1, REG2, REG3) | ||
204 | |||
205 | #endif /* !(CONFIG_SMP) */ | ||
206 | |||
207 | #endif /* _SPARC_TRAP_BLOCK_H */ | ||
diff --git a/arch/sparc/include/asm/unistd.h b/arch/sparc/include/asm/unistd.h index b8eb71ef3163..b2c406de7d4f 100644 --- a/arch/sparc/include/asm/unistd.h +++ b/arch/sparc/include/asm/unistd.h | |||
@@ -394,8 +394,9 @@ | |||
394 | #define __NR_accept4 323 | 394 | #define __NR_accept4 323 |
395 | #define __NR_preadv 324 | 395 | #define __NR_preadv 324 |
396 | #define __NR_pwritev 325 | 396 | #define __NR_pwritev 325 |
397 | #define __NR_rt_tgsigqueueinfo 326 | ||
397 | 398 | ||
398 | #define NR_SYSCALLS 326 | 399 | #define NR_SYSCALLS 327 |
399 | 400 | ||
400 | #ifdef __32bit_syscall_numbers__ | 401 | #ifdef __32bit_syscall_numbers__ |
401 | /* Sparc 32-bit only has the "setresuid32", "getresuid32" variants, | 402 | /* Sparc 32-bit only has the "setresuid32", "getresuid32" variants, |
diff --git a/arch/sparc/kernel/Makefile b/arch/sparc/kernel/Makefile index 54742e58831c..475ce4696acd 100644 --- a/arch/sparc/kernel/Makefile +++ b/arch/sparc/kernel/Makefile | |||
@@ -37,6 +37,7 @@ obj-y += una_asm_$(BITS).o | |||
37 | obj-$(CONFIG_SPARC32) += muldiv.o | 37 | obj-$(CONFIG_SPARC32) += muldiv.o |
38 | obj-y += prom_common.o | 38 | obj-y += prom_common.o |
39 | obj-y += prom_$(BITS).o | 39 | obj-y += prom_$(BITS).o |
40 | obj-y += of_device_common.o | ||
40 | obj-y += of_device_$(BITS).o | 41 | obj-y += of_device_$(BITS).o |
41 | obj-$(CONFIG_SPARC64) += prom_irqtrans.o | 42 | obj-$(CONFIG_SPARC64) += prom_irqtrans.o |
42 | 43 | ||
@@ -54,6 +55,7 @@ obj-$(CONFIG_SPARC64) += sstate.o | |||
54 | obj-$(CONFIG_SPARC64) += mdesc.o | 55 | obj-$(CONFIG_SPARC64) += mdesc.o |
55 | obj-$(CONFIG_SPARC64) += pcr.o | 56 | obj-$(CONFIG_SPARC64) += pcr.o |
56 | obj-$(CONFIG_SPARC64) += nmi.o | 57 | obj-$(CONFIG_SPARC64) += nmi.o |
58 | obj-$(CONFIG_SPARC64_SMP) += cpumap.o | ||
57 | 59 | ||
58 | # sparc32 do not use GENERIC_HARDIRQS but uses the generic devres implementation | 60 | # sparc32 do not use GENERIC_HARDIRQS but uses the generic devres implementation |
59 | obj-$(CONFIG_SPARC32) += devres.o | 61 | obj-$(CONFIG_SPARC32) += devres.o |
diff --git a/arch/sparc/kernel/cpumap.c b/arch/sparc/kernel/cpumap.c new file mode 100644 index 000000000000..7430ed080b23 --- /dev/null +++ b/arch/sparc/kernel/cpumap.c | |||
@@ -0,0 +1,431 @@ | |||
1 | /* cpumap.c: used for optimizing CPU assignment | ||
2 | * | ||
3 | * Copyright (C) 2009 Hong H. Pham <hong.pham@windriver.com> | ||
4 | */ | ||
5 | |||
6 | #include <linux/module.h> | ||
7 | #include <linux/kernel.h> | ||
8 | #include <linux/init.h> | ||
9 | #include <linux/cpumask.h> | ||
10 | #include <linux/spinlock.h> | ||
11 | #include <asm/cpudata.h> | ||
12 | #include "cpumap.h" | ||
13 | |||
14 | |||
15 | enum { | ||
16 | CPUINFO_LVL_ROOT = 0, | ||
17 | CPUINFO_LVL_NODE, | ||
18 | CPUINFO_LVL_CORE, | ||
19 | CPUINFO_LVL_PROC, | ||
20 | CPUINFO_LVL_MAX, | ||
21 | }; | ||
22 | |||
23 | enum { | ||
24 | ROVER_NO_OP = 0, | ||
25 | /* Increment rover every time level is visited */ | ||
26 | ROVER_INC_ON_VISIT = 1 << 0, | ||
27 | /* Increment parent's rover every time rover wraps around */ | ||
28 | ROVER_INC_PARENT_ON_LOOP = 1 << 1, | ||
29 | }; | ||
30 | |||
31 | struct cpuinfo_node { | ||
32 | int id; | ||
33 | int level; | ||
34 | int num_cpus; /* Number of CPUs in this hierarchy */ | ||
35 | int parent_index; | ||
36 | int child_start; /* Array index of the first child node */ | ||
37 | int child_end; /* Array index of the last child node */ | ||
38 | int rover; /* Child node iterator */ | ||
39 | }; | ||
40 | |||
41 | struct cpuinfo_level { | ||
42 | int start_index; /* Index of first node of a level in a cpuinfo tree */ | ||
43 | int end_index; /* Index of last node of a level in a cpuinfo tree */ | ||
44 | int num_nodes; /* Number of nodes in a level in a cpuinfo tree */ | ||
45 | }; | ||
46 | |||
47 | struct cpuinfo_tree { | ||
48 | int total_nodes; | ||
49 | |||
50 | /* Offsets into nodes[] for each level of the tree */ | ||
51 | struct cpuinfo_level level[CPUINFO_LVL_MAX]; | ||
52 | struct cpuinfo_node nodes[0]; | ||
53 | }; | ||
54 | |||
55 | |||
56 | static struct cpuinfo_tree *cpuinfo_tree; | ||
57 | |||
58 | static u16 cpu_distribution_map[NR_CPUS]; | ||
59 | static DEFINE_SPINLOCK(cpu_map_lock); | ||
60 | |||
61 | |||
62 | /* Niagara optimized cpuinfo tree traversal. */ | ||
63 | static const int niagara_iterate_method[] = { | ||
64 | [CPUINFO_LVL_ROOT] = ROVER_NO_OP, | ||
65 | |||
66 | /* Strands (or virtual CPUs) within a core may not run concurrently | ||
67 | * on the Niagara, as instruction pipeline(s) are shared. Distribute | ||
68 | * work to strands in different cores first for better concurrency. | ||
69 | * Go to next NUMA node when all cores are used. | ||
70 | */ | ||
71 | [CPUINFO_LVL_NODE] = ROVER_INC_ON_VISIT|ROVER_INC_PARENT_ON_LOOP, | ||
72 | |||
73 | /* Strands are grouped together by proc_id in cpuinfo_sparc, i.e. | ||
74 | * a proc_id represents an instruction pipeline. Distribute work to | ||
75 | * strands in different proc_id groups if the core has multiple | ||
76 | * instruction pipelines (e.g. the Niagara 2/2+ has two). | ||
77 | */ | ||
78 | [CPUINFO_LVL_CORE] = ROVER_INC_ON_VISIT, | ||
79 | |||
80 | /* Pick the next strand in the proc_id group. */ | ||
81 | [CPUINFO_LVL_PROC] = ROVER_INC_ON_VISIT, | ||
82 | }; | ||
83 | |||
84 | /* Generic cpuinfo tree traversal. Distribute work round robin across NUMA | ||
85 | * nodes. | ||
86 | */ | ||
87 | static const int generic_iterate_method[] = { | ||
88 | [CPUINFO_LVL_ROOT] = ROVER_INC_ON_VISIT, | ||
89 | [CPUINFO_LVL_NODE] = ROVER_NO_OP, | ||
90 | [CPUINFO_LVL_CORE] = ROVER_INC_PARENT_ON_LOOP, | ||
91 | [CPUINFO_LVL_PROC] = ROVER_INC_ON_VISIT|ROVER_INC_PARENT_ON_LOOP, | ||
92 | }; | ||
93 | |||
94 | |||
95 | static int cpuinfo_id(int cpu, int level) | ||
96 | { | ||
97 | int id; | ||
98 | |||
99 | switch (level) { | ||
100 | case CPUINFO_LVL_ROOT: | ||
101 | id = 0; | ||
102 | break; | ||
103 | case CPUINFO_LVL_NODE: | ||
104 | id = cpu_to_node(cpu); | ||
105 | break; | ||
106 | case CPUINFO_LVL_CORE: | ||
107 | id = cpu_data(cpu).core_id; | ||
108 | break; | ||
109 | case CPUINFO_LVL_PROC: | ||
110 | id = cpu_data(cpu).proc_id; | ||
111 | break; | ||
112 | default: | ||
113 | id = -EINVAL; | ||
114 | } | ||
115 | return id; | ||
116 | } | ||
117 | |||
118 | /* | ||
119 | * Enumerate the CPU information in __cpu_data to determine the start index, | ||
120 | * end index, and number of nodes for each level in the cpuinfo tree. The | ||
121 | * total number of cpuinfo nodes required to build the tree is returned. | ||
122 | */ | ||
123 | static int enumerate_cpuinfo_nodes(struct cpuinfo_level *tree_level) | ||
124 | { | ||
125 | int prev_id[CPUINFO_LVL_MAX]; | ||
126 | int i, n, num_nodes; | ||
127 | |||
128 | for (i = CPUINFO_LVL_ROOT; i < CPUINFO_LVL_MAX; i++) { | ||
129 | struct cpuinfo_level *lv = &tree_level[i]; | ||
130 | |||
131 | prev_id[i] = -1; | ||
132 | lv->start_index = lv->end_index = lv->num_nodes = 0; | ||
133 | } | ||
134 | |||
135 | num_nodes = 1; /* Include the root node */ | ||
136 | |||
137 | for (i = 0; i < num_possible_cpus(); i++) { | ||
138 | if (!cpu_online(i)) | ||
139 | continue; | ||
140 | |||
141 | n = cpuinfo_id(i, CPUINFO_LVL_NODE); | ||
142 | if (n > prev_id[CPUINFO_LVL_NODE]) { | ||
143 | tree_level[CPUINFO_LVL_NODE].num_nodes++; | ||
144 | prev_id[CPUINFO_LVL_NODE] = n; | ||
145 | num_nodes++; | ||
146 | } | ||
147 | n = cpuinfo_id(i, CPUINFO_LVL_CORE); | ||
148 | if (n > prev_id[CPUINFO_LVL_CORE]) { | ||
149 | tree_level[CPUINFO_LVL_CORE].num_nodes++; | ||
150 | prev_id[CPUINFO_LVL_CORE] = n; | ||
151 | num_nodes++; | ||
152 | } | ||
153 | n = cpuinfo_id(i, CPUINFO_LVL_PROC); | ||
154 | if (n > prev_id[CPUINFO_LVL_PROC]) { | ||
155 | tree_level[CPUINFO_LVL_PROC].num_nodes++; | ||
156 | prev_id[CPUINFO_LVL_PROC] = n; | ||
157 | num_nodes++; | ||
158 | } | ||
159 | } | ||
160 | |||
161 | tree_level[CPUINFO_LVL_ROOT].num_nodes = 1; | ||
162 | |||
163 | n = tree_level[CPUINFO_LVL_NODE].num_nodes; | ||
164 | tree_level[CPUINFO_LVL_NODE].start_index = 1; | ||
165 | tree_level[CPUINFO_LVL_NODE].end_index = n; | ||
166 | |||
167 | n++; | ||
168 | tree_level[CPUINFO_LVL_CORE].start_index = n; | ||
169 | n += tree_level[CPUINFO_LVL_CORE].num_nodes; | ||
170 | tree_level[CPUINFO_LVL_CORE].end_index = n - 1; | ||
171 | |||
172 | tree_level[CPUINFO_LVL_PROC].start_index = n; | ||
173 | n += tree_level[CPUINFO_LVL_PROC].num_nodes; | ||
174 | tree_level[CPUINFO_LVL_PROC].end_index = n - 1; | ||
175 | |||
176 | return num_nodes; | ||
177 | } | ||
178 | |||
179 | /* Build a tree representation of the CPU hierarchy using the per CPU | ||
180 | * information in __cpu_data. Entries in __cpu_data[0..NR_CPUS] are | ||
181 | * assumed to be sorted in ascending order based on node, core_id, and | ||
182 | * proc_id (in order of significance). | ||
183 | */ | ||
184 | static struct cpuinfo_tree *build_cpuinfo_tree(void) | ||
185 | { | ||
186 | struct cpuinfo_tree *new_tree; | ||
187 | struct cpuinfo_node *node; | ||
188 | struct cpuinfo_level tmp_level[CPUINFO_LVL_MAX]; | ||
189 | int num_cpus[CPUINFO_LVL_MAX]; | ||
190 | int level_rover[CPUINFO_LVL_MAX]; | ||
191 | int prev_id[CPUINFO_LVL_MAX]; | ||
192 | int n, id, cpu, prev_cpu, last_cpu, level; | ||
193 | |||
194 | n = enumerate_cpuinfo_nodes(tmp_level); | ||
195 | |||
196 | new_tree = kzalloc(sizeof(struct cpuinfo_tree) + | ||
197 | (sizeof(struct cpuinfo_node) * n), GFP_ATOMIC); | ||
198 | if (!new_tree) | ||
199 | return NULL; | ||
200 | |||
201 | new_tree->total_nodes = n; | ||
202 | memcpy(&new_tree->level, tmp_level, sizeof(tmp_level)); | ||
203 | |||
204 | prev_cpu = cpu = first_cpu(cpu_online_map); | ||
205 | |||
206 | /* Initialize all levels in the tree with the first CPU */ | ||
207 | for (level = CPUINFO_LVL_PROC; level >= CPUINFO_LVL_ROOT; level--) { | ||
208 | n = new_tree->level[level].start_index; | ||
209 | |||
210 | level_rover[level] = n; | ||
211 | node = &new_tree->nodes[n]; | ||
212 | |||
213 | id = cpuinfo_id(cpu, level); | ||
214 | if (unlikely(id < 0)) { | ||
215 | kfree(new_tree); | ||
216 | return NULL; | ||
217 | } | ||
218 | node->id = id; | ||
219 | node->level = level; | ||
220 | node->num_cpus = 1; | ||
221 | |||
222 | node->parent_index = (level > CPUINFO_LVL_ROOT) | ||
223 | ? new_tree->level[level - 1].start_index : -1; | ||
224 | |||
225 | node->child_start = node->child_end = node->rover = | ||
226 | (level == CPUINFO_LVL_PROC) | ||
227 | ? cpu : new_tree->level[level + 1].start_index; | ||
228 | |||
229 | prev_id[level] = node->id; | ||
230 | num_cpus[level] = 1; | ||
231 | } | ||
232 | |||
233 | for (last_cpu = (num_possible_cpus() - 1); last_cpu >= 0; last_cpu--) { | ||
234 | if (cpu_online(last_cpu)) | ||
235 | break; | ||
236 | } | ||
237 | |||
238 | while (++cpu <= last_cpu) { | ||
239 | if (!cpu_online(cpu)) | ||
240 | continue; | ||
241 | |||
242 | for (level = CPUINFO_LVL_PROC; level >= CPUINFO_LVL_ROOT; | ||
243 | level--) { | ||
244 | id = cpuinfo_id(cpu, level); | ||
245 | if (unlikely(id < 0)) { | ||
246 | kfree(new_tree); | ||
247 | return NULL; | ||
248 | } | ||
249 | |||
250 | if ((id != prev_id[level]) || (cpu == last_cpu)) { | ||
251 | prev_id[level] = id; | ||
252 | node = &new_tree->nodes[level_rover[level]]; | ||
253 | node->num_cpus = num_cpus[level]; | ||
254 | num_cpus[level] = 1; | ||
255 | |||
256 | if (cpu == last_cpu) | ||
257 | node->num_cpus++; | ||
258 | |||
259 | /* Connect tree node to parent */ | ||
260 | if (level == CPUINFO_LVL_ROOT) | ||
261 | node->parent_index = -1; | ||
262 | else | ||
263 | node->parent_index = | ||
264 | level_rover[level - 1]; | ||
265 | |||
266 | if (level == CPUINFO_LVL_PROC) { | ||
267 | node->child_end = | ||
268 | (cpu == last_cpu) ? cpu : prev_cpu; | ||
269 | } else { | ||
270 | node->child_end = | ||
271 | level_rover[level + 1] - 1; | ||
272 | } | ||
273 | |||
274 | /* Initialize the next node in the same level */ | ||
275 | n = ++level_rover[level]; | ||
276 | if (n <= new_tree->level[level].end_index) { | ||
277 | node = &new_tree->nodes[n]; | ||
278 | node->id = id; | ||
279 | node->level = level; | ||
280 | |||
281 | /* Connect node to child */ | ||
282 | node->child_start = node->child_end = | ||
283 | node->rover = | ||
284 | (level == CPUINFO_LVL_PROC) | ||
285 | ? cpu : level_rover[level + 1]; | ||
286 | } | ||
287 | } else | ||
288 | num_cpus[level]++; | ||
289 | } | ||
290 | prev_cpu = cpu; | ||
291 | } | ||
292 | |||
293 | return new_tree; | ||
294 | } | ||
295 | |||
296 | static void increment_rover(struct cpuinfo_tree *t, int node_index, | ||
297 | int root_index, const int *rover_inc_table) | ||
298 | { | ||
299 | struct cpuinfo_node *node = &t->nodes[node_index]; | ||
300 | int top_level, level; | ||
301 | |||
302 | top_level = t->nodes[root_index].level; | ||
303 | for (level = node->level; level >= top_level; level--) { | ||
304 | node->rover++; | ||
305 | if (node->rover <= node->child_end) | ||
306 | return; | ||
307 | |||
308 | node->rover = node->child_start; | ||
309 | /* If parent's rover does not need to be adjusted, stop here. */ | ||
310 | if ((level == top_level) || | ||
311 | !(rover_inc_table[level] & ROVER_INC_PARENT_ON_LOOP)) | ||
312 | return; | ||
313 | |||
314 | node = &t->nodes[node->parent_index]; | ||
315 | } | ||
316 | } | ||
317 | |||
318 | static int iterate_cpu(struct cpuinfo_tree *t, unsigned int root_index) | ||
319 | { | ||
320 | const int *rover_inc_table; | ||
321 | int level, new_index, index = root_index; | ||
322 | |||
323 | switch (sun4v_chip_type) { | ||
324 | case SUN4V_CHIP_NIAGARA1: | ||
325 | case SUN4V_CHIP_NIAGARA2: | ||
326 | rover_inc_table = niagara_iterate_method; | ||
327 | break; | ||
328 | default: | ||
329 | rover_inc_table = generic_iterate_method; | ||
330 | } | ||
331 | |||
332 | for (level = t->nodes[root_index].level; level < CPUINFO_LVL_MAX; | ||
333 | level++) { | ||
334 | new_index = t->nodes[index].rover; | ||
335 | if (rover_inc_table[level] & ROVER_INC_ON_VISIT) | ||
336 | increment_rover(t, index, root_index, rover_inc_table); | ||
337 | |||
338 | index = new_index; | ||
339 | } | ||
340 | return index; | ||
341 | } | ||
342 | |||
343 | static void _cpu_map_rebuild(void) | ||
344 | { | ||
345 | int i; | ||
346 | |||
347 | if (cpuinfo_tree) { | ||
348 | kfree(cpuinfo_tree); | ||
349 | cpuinfo_tree = NULL; | ||
350 | } | ||
351 | |||
352 | cpuinfo_tree = build_cpuinfo_tree(); | ||
353 | if (!cpuinfo_tree) | ||
354 | return; | ||
355 | |||
356 | /* Build CPU distribution map that spans all online CPUs. No need | ||
357 | * to check if the CPU is online, as that is done when the cpuinfo | ||
358 | * tree is being built. | ||
359 | */ | ||
360 | for (i = 0; i < cpuinfo_tree->nodes[0].num_cpus; i++) | ||
361 | cpu_distribution_map[i] = iterate_cpu(cpuinfo_tree, 0); | ||
362 | } | ||
363 | |||
364 | /* Fallback if the cpuinfo tree could not be built. CPU mapping is linear | ||
365 | * round robin. | ||
366 | */ | ||
367 | static int simple_map_to_cpu(unsigned int index) | ||
368 | { | ||
369 | int i, end, cpu_rover; | ||
370 | |||
371 | cpu_rover = 0; | ||
372 | end = index % num_online_cpus(); | ||
373 | for (i = 0; i < num_possible_cpus(); i++) { | ||
374 | if (cpu_online(cpu_rover)) { | ||
375 | if (cpu_rover >= end) | ||
376 | return cpu_rover; | ||
377 | |||
378 | cpu_rover++; | ||
379 | } | ||
380 | } | ||
381 | |||
382 | /* Impossible, since num_online_cpus() <= num_possible_cpus() */ | ||
383 | return first_cpu(cpu_online_map); | ||
384 | } | ||
385 | |||
386 | static int _map_to_cpu(unsigned int index) | ||
387 | { | ||
388 | struct cpuinfo_node *root_node; | ||
389 | |||
390 | if (unlikely(!cpuinfo_tree)) { | ||
391 | _cpu_map_rebuild(); | ||
392 | if (!cpuinfo_tree) | ||
393 | return simple_map_to_cpu(index); | ||
394 | } | ||
395 | |||
396 | root_node = &cpuinfo_tree->nodes[0]; | ||
397 | #ifdef CONFIG_HOTPLUG_CPU | ||
398 | if (unlikely(root_node->num_cpus != num_online_cpus())) { | ||
399 | _cpu_map_rebuild(); | ||
400 | if (!cpuinfo_tree) | ||
401 | return simple_map_to_cpu(index); | ||
402 | } | ||
403 | #endif | ||
404 | return cpu_distribution_map[index % root_node->num_cpus]; | ||
405 | } | ||
406 | |||
407 | int map_to_cpu(unsigned int index) | ||
408 | { | ||
409 | int mapped_cpu; | ||
410 | unsigned long flag; | ||
411 | |||
412 | spin_lock_irqsave(&cpu_map_lock, flag); | ||
413 | mapped_cpu = _map_to_cpu(index); | ||
414 | |||
415 | #ifdef CONFIG_HOTPLUG_CPU | ||
416 | while (unlikely(!cpu_online(mapped_cpu))) | ||
417 | mapped_cpu = _map_to_cpu(index); | ||
418 | #endif | ||
419 | spin_unlock_irqrestore(&cpu_map_lock, flag); | ||
420 | return mapped_cpu; | ||
421 | } | ||
422 | EXPORT_SYMBOL(map_to_cpu); | ||
423 | |||
424 | void cpu_map_rebuild(void) | ||
425 | { | ||
426 | unsigned long flag; | ||
427 | |||
428 | spin_lock_irqsave(&cpu_map_lock, flag); | ||
429 | _cpu_map_rebuild(); | ||
430 | spin_unlock_irqrestore(&cpu_map_lock, flag); | ||
431 | } | ||
diff --git a/arch/sparc/kernel/cpumap.h b/arch/sparc/kernel/cpumap.h new file mode 100644 index 000000000000..e639880ab864 --- /dev/null +++ b/arch/sparc/kernel/cpumap.h | |||
@@ -0,0 +1,16 @@ | |||
1 | #ifndef _CPUMAP_H | ||
2 | #define _CPUMAP_H | ||
3 | |||
4 | #ifdef CONFIG_SMP | ||
5 | extern void cpu_map_rebuild(void); | ||
6 | extern int map_to_cpu(unsigned int index); | ||
7 | #define cpu_map_init() cpu_map_rebuild() | ||
8 | #else | ||
9 | #define cpu_map_init() do {} while (0) | ||
10 | static inline int map_to_cpu(unsigned int index) | ||
11 | { | ||
12 | return raw_smp_processor_id(); | ||
13 | } | ||
14 | #endif | ||
15 | |||
16 | #endif | ||
diff --git a/arch/sparc/kernel/dma.c b/arch/sparc/kernel/dma.c index ebc8403b035e..524c32f97c55 100644 --- a/arch/sparc/kernel/dma.c +++ b/arch/sparc/kernel/dma.c | |||
@@ -35,8 +35,8 @@ int dma_set_mask(struct device *dev, u64 dma_mask) | |||
35 | } | 35 | } |
36 | EXPORT_SYMBOL(dma_set_mask); | 36 | EXPORT_SYMBOL(dma_set_mask); |
37 | 37 | ||
38 | void *dma_alloc_coherent(struct device *dev, size_t size, | 38 | static void *dma32_alloc_coherent(struct device *dev, size_t size, |
39 | dma_addr_t *dma_handle, gfp_t flag) | 39 | dma_addr_t *dma_handle, gfp_t flag) |
40 | { | 40 | { |
41 | #ifdef CONFIG_PCI | 41 | #ifdef CONFIG_PCI |
42 | if (dev->bus == &pci_bus_type) | 42 | if (dev->bus == &pci_bus_type) |
@@ -44,10 +44,9 @@ void *dma_alloc_coherent(struct device *dev, size_t size, | |||
44 | #endif | 44 | #endif |
45 | return sbus_alloc_consistent(dev, size, dma_handle); | 45 | return sbus_alloc_consistent(dev, size, dma_handle); |
46 | } | 46 | } |
47 | EXPORT_SYMBOL(dma_alloc_coherent); | ||
48 | 47 | ||
49 | void dma_free_coherent(struct device *dev, size_t size, | 48 | static void dma32_free_coherent(struct device *dev, size_t size, |
50 | void *cpu_addr, dma_addr_t dma_handle) | 49 | void *cpu_addr, dma_addr_t dma_handle) |
51 | { | 50 | { |
52 | #ifdef CONFIG_PCI | 51 | #ifdef CONFIG_PCI |
53 | if (dev->bus == &pci_bus_type) { | 52 | if (dev->bus == &pci_bus_type) { |
@@ -58,38 +57,10 @@ void dma_free_coherent(struct device *dev, size_t size, | |||
58 | #endif | 57 | #endif |
59 | sbus_free_consistent(dev, size, cpu_addr, dma_handle); | 58 | sbus_free_consistent(dev, size, cpu_addr, dma_handle); |
60 | } | 59 | } |
61 | EXPORT_SYMBOL(dma_free_coherent); | ||
62 | 60 | ||
63 | dma_addr_t dma_map_single(struct device *dev, void *cpu_addr, | 61 | static dma_addr_t dma32_map_page(struct device *dev, struct page *page, |
64 | size_t size, enum dma_data_direction direction) | 62 | unsigned long offset, size_t size, |
65 | { | 63 | enum dma_data_direction direction) |
66 | #ifdef CONFIG_PCI | ||
67 | if (dev->bus == &pci_bus_type) | ||
68 | return pci_map_single(to_pci_dev(dev), cpu_addr, | ||
69 | size, (int)direction); | ||
70 | #endif | ||
71 | return sbus_map_single(dev, cpu_addr, size, (int)direction); | ||
72 | } | ||
73 | EXPORT_SYMBOL(dma_map_single); | ||
74 | |||
75 | void dma_unmap_single(struct device *dev, dma_addr_t dma_addr, | ||
76 | size_t size, | ||
77 | enum dma_data_direction direction) | ||
78 | { | ||
79 | #ifdef CONFIG_PCI | ||
80 | if (dev->bus == &pci_bus_type) { | ||
81 | pci_unmap_single(to_pci_dev(dev), dma_addr, | ||
82 | size, (int)direction); | ||
83 | return; | ||
84 | } | ||
85 | #endif | ||
86 | sbus_unmap_single(dev, dma_addr, size, (int)direction); | ||
87 | } | ||
88 | EXPORT_SYMBOL(dma_unmap_single); | ||
89 | |||
90 | dma_addr_t dma_map_page(struct device *dev, struct page *page, | ||
91 | unsigned long offset, size_t size, | ||
92 | enum dma_data_direction direction) | ||
93 | { | 64 | { |
94 | #ifdef CONFIG_PCI | 65 | #ifdef CONFIG_PCI |
95 | if (dev->bus == &pci_bus_type) | 66 | if (dev->bus == &pci_bus_type) |
@@ -99,10 +70,9 @@ dma_addr_t dma_map_page(struct device *dev, struct page *page, | |||
99 | return sbus_map_single(dev, page_address(page) + offset, | 70 | return sbus_map_single(dev, page_address(page) + offset, |
100 | size, (int)direction); | 71 | size, (int)direction); |
101 | } | 72 | } |
102 | EXPORT_SYMBOL(dma_map_page); | ||
103 | 73 | ||
104 | void dma_unmap_page(struct device *dev, dma_addr_t dma_address, | 74 | static void dma32_unmap_page(struct device *dev, dma_addr_t dma_address, |
105 | size_t size, enum dma_data_direction direction) | 75 | size_t size, enum dma_data_direction direction) |
106 | { | 76 | { |
107 | #ifdef CONFIG_PCI | 77 | #ifdef CONFIG_PCI |
108 | if (dev->bus == &pci_bus_type) { | 78 | if (dev->bus == &pci_bus_type) { |
@@ -113,10 +83,9 @@ void dma_unmap_page(struct device *dev, dma_addr_t dma_address, | |||
113 | #endif | 83 | #endif |
114 | sbus_unmap_single(dev, dma_address, size, (int)direction); | 84 | sbus_unmap_single(dev, dma_address, size, (int)direction); |
115 | } | 85 | } |
116 | EXPORT_SYMBOL(dma_unmap_page); | ||
117 | 86 | ||
118 | int dma_map_sg(struct device *dev, struct scatterlist *sg, | 87 | static int dma32_map_sg(struct device *dev, struct scatterlist *sg, |
119 | int nents, enum dma_data_direction direction) | 88 | int nents, enum dma_data_direction direction) |
120 | { | 89 | { |
121 | #ifdef CONFIG_PCI | 90 | #ifdef CONFIG_PCI |
122 | if (dev->bus == &pci_bus_type) | 91 | if (dev->bus == &pci_bus_type) |
@@ -124,10 +93,9 @@ int dma_map_sg(struct device *dev, struct scatterlist *sg, | |||
124 | #endif | 93 | #endif |
125 | return sbus_map_sg(dev, sg, nents, direction); | 94 | return sbus_map_sg(dev, sg, nents, direction); |
126 | } | 95 | } |
127 | EXPORT_SYMBOL(dma_map_sg); | ||
128 | 96 | ||
129 | void dma_unmap_sg(struct device *dev, struct scatterlist *sg, | 97 | void dma32_unmap_sg(struct device *dev, struct scatterlist *sg, |
130 | int nents, enum dma_data_direction direction) | 98 | int nents, enum dma_data_direction direction) |
131 | { | 99 | { |
132 | #ifdef CONFIG_PCI | 100 | #ifdef CONFIG_PCI |
133 | if (dev->bus == &pci_bus_type) { | 101 | if (dev->bus == &pci_bus_type) { |
@@ -137,10 +105,10 @@ void dma_unmap_sg(struct device *dev, struct scatterlist *sg, | |||
137 | #endif | 105 | #endif |
138 | sbus_unmap_sg(dev, sg, nents, (int)direction); | 106 | sbus_unmap_sg(dev, sg, nents, (int)direction); |
139 | } | 107 | } |
140 | EXPORT_SYMBOL(dma_unmap_sg); | ||
141 | 108 | ||
142 | void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, | 109 | static void dma32_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, |
143 | size_t size, enum dma_data_direction direction) | 110 | size_t size, |
111 | enum dma_data_direction direction) | ||
144 | { | 112 | { |
145 | #ifdef CONFIG_PCI | 113 | #ifdef CONFIG_PCI |
146 | if (dev->bus == &pci_bus_type) { | 114 | if (dev->bus == &pci_bus_type) { |
@@ -151,10 +119,10 @@ void dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, | |||
151 | #endif | 119 | #endif |
152 | sbus_dma_sync_single_for_cpu(dev, dma_handle, size, (int) direction); | 120 | sbus_dma_sync_single_for_cpu(dev, dma_handle, size, (int) direction); |
153 | } | 121 | } |
154 | EXPORT_SYMBOL(dma_sync_single_for_cpu); | ||
155 | 122 | ||
156 | void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, | 123 | static void dma32_sync_single_for_device(struct device *dev, |
157 | size_t size, enum dma_data_direction direction) | 124 | dma_addr_t dma_handle, size_t size, |
125 | enum dma_data_direction direction) | ||
158 | { | 126 | { |
159 | #ifdef CONFIG_PCI | 127 | #ifdef CONFIG_PCI |
160 | if (dev->bus == &pci_bus_type) { | 128 | if (dev->bus == &pci_bus_type) { |
@@ -165,28 +133,9 @@ void dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, | |||
165 | #endif | 133 | #endif |
166 | sbus_dma_sync_single_for_device(dev, dma_handle, size, (int) direction); | 134 | sbus_dma_sync_single_for_device(dev, dma_handle, size, (int) direction); |
167 | } | 135 | } |
168 | EXPORT_SYMBOL(dma_sync_single_for_device); | ||
169 | |||
170 | void dma_sync_single_range_for_cpu(struct device *dev, | ||
171 | dma_addr_t dma_handle, | ||
172 | unsigned long offset, | ||
173 | size_t size, | ||
174 | enum dma_data_direction direction) | ||
175 | { | ||
176 | dma_sync_single_for_cpu(dev, dma_handle+offset, size, direction); | ||
177 | } | ||
178 | EXPORT_SYMBOL(dma_sync_single_range_for_cpu); | ||
179 | |||
180 | void dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle, | ||
181 | unsigned long offset, size_t size, | ||
182 | enum dma_data_direction direction) | ||
183 | { | ||
184 | dma_sync_single_for_device(dev, dma_handle+offset, size, direction); | ||
185 | } | ||
186 | EXPORT_SYMBOL(dma_sync_single_range_for_device); | ||
187 | 136 | ||
188 | void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, | 137 | static void dma32_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, |
189 | int nelems, enum dma_data_direction direction) | 138 | int nelems, enum dma_data_direction direction) |
190 | { | 139 | { |
191 | #ifdef CONFIG_PCI | 140 | #ifdef CONFIG_PCI |
192 | if (dev->bus == &pci_bus_type) { | 141 | if (dev->bus == &pci_bus_type) { |
@@ -197,11 +146,10 @@ void dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, | |||
197 | #endif | 146 | #endif |
198 | BUG(); | 147 | BUG(); |
199 | } | 148 | } |
200 | EXPORT_SYMBOL(dma_sync_sg_for_cpu); | ||
201 | 149 | ||
202 | void dma_sync_sg_for_device(struct device *dev, | 150 | static void dma32_sync_sg_for_device(struct device *dev, |
203 | struct scatterlist *sg, int nelems, | 151 | struct scatterlist *sg, int nelems, |
204 | enum dma_data_direction direction) | 152 | enum dma_data_direction direction) |
205 | { | 153 | { |
206 | #ifdef CONFIG_PCI | 154 | #ifdef CONFIG_PCI |
207 | if (dev->bus == &pci_bus_type) { | 155 | if (dev->bus == &pci_bus_type) { |
@@ -212,16 +160,19 @@ void dma_sync_sg_for_device(struct device *dev, | |||
212 | #endif | 160 | #endif |
213 | BUG(); | 161 | BUG(); |
214 | } | 162 | } |
215 | EXPORT_SYMBOL(dma_sync_sg_for_device); | ||
216 | 163 | ||
217 | int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) | 164 | static const struct dma_ops dma32_dma_ops = { |
218 | { | 165 | .alloc_coherent = dma32_alloc_coherent, |
219 | return (dma_addr == DMA_ERROR_CODE); | 166 | .free_coherent = dma32_free_coherent, |
220 | } | 167 | .map_page = dma32_map_page, |
221 | EXPORT_SYMBOL(dma_mapping_error); | 168 | .unmap_page = dma32_unmap_page, |
222 | 169 | .map_sg = dma32_map_sg, | |
223 | int dma_get_cache_alignment(void) | 170 | .unmap_sg = dma32_unmap_sg, |
224 | { | 171 | .sync_single_for_cpu = dma32_sync_single_for_cpu, |
225 | return 32; | 172 | .sync_single_for_device = dma32_sync_single_for_device, |
226 | } | 173 | .sync_sg_for_cpu = dma32_sync_sg_for_cpu, |
227 | EXPORT_SYMBOL(dma_get_cache_alignment); | 174 | .sync_sg_for_device = dma32_sync_sg_for_device, |
175 | }; | ||
176 | |||
177 | const struct dma_ops *dma_ops = &dma32_dma_ops; | ||
178 | EXPORT_SYMBOL(dma_ops); | ||
diff --git a/arch/sparc/kernel/ds.c b/arch/sparc/kernel/ds.c index 90350f838f05..4a700f4b79ce 100644 --- a/arch/sparc/kernel/ds.c +++ b/arch/sparc/kernel/ds.c | |||
@@ -544,7 +544,8 @@ static int __cpuinit dr_cpu_configure(struct ds_info *dp, | |||
544 | resp_len, ncpus, mask, | 544 | resp_len, ncpus, mask, |
545 | DR_CPU_STAT_CONFIGURED); | 545 | DR_CPU_STAT_CONFIGURED); |
546 | 546 | ||
547 | mdesc_fill_in_cpu_data(*mask); | 547 | mdesc_populate_present_mask(mask); |
548 | mdesc_fill_in_cpu_data(mask); | ||
548 | 549 | ||
549 | for_each_cpu_mask(cpu, *mask) { | 550 | for_each_cpu_mask(cpu, *mask) { |
550 | int err; | 551 | int err; |
diff --git a/arch/sparc/kernel/ftrace.c b/arch/sparc/kernel/ftrace.c index d0218e73f982..d3b1a3076569 100644 --- a/arch/sparc/kernel/ftrace.c +++ b/arch/sparc/kernel/ftrace.c | |||
@@ -7,14 +7,10 @@ | |||
7 | 7 | ||
8 | #include <asm/ftrace.h> | 8 | #include <asm/ftrace.h> |
9 | 9 | ||
10 | #ifdef CONFIG_DYNAMIC_FTRACE | ||
10 | static const u32 ftrace_nop = 0x01000000; | 11 | static const u32 ftrace_nop = 0x01000000; |
11 | 12 | ||
12 | unsigned char *ftrace_nop_replace(void) | 13 | static u32 ftrace_call_replace(unsigned long ip, unsigned long addr) |
13 | { | ||
14 | return (char *)&ftrace_nop; | ||
15 | } | ||
16 | |||
17 | unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) | ||
18 | { | 14 | { |
19 | static u32 call; | 15 | static u32 call; |
20 | s32 off; | 16 | s32 off; |
@@ -22,15 +18,11 @@ unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr) | |||
22 | off = ((s32)addr - (s32)ip); | 18 | off = ((s32)addr - (s32)ip); |
23 | call = 0x40000000 | ((u32)off >> 2); | 19 | call = 0x40000000 | ((u32)off >> 2); |
24 | 20 | ||
25 | return (unsigned char *) &call; | 21 | return call; |
26 | } | 22 | } |
27 | 23 | ||
28 | int | 24 | static int ftrace_modify_code(unsigned long ip, u32 old, u32 new) |
29 | ftrace_modify_code(unsigned long ip, unsigned char *old_code, | ||
30 | unsigned char *new_code) | ||
31 | { | 25 | { |
32 | u32 old = *(u32 *)old_code; | ||
33 | u32 new = *(u32 *)new_code; | ||
34 | u32 replaced; | 26 | u32 replaced; |
35 | int faulted; | 27 | int faulted; |
36 | 28 | ||
@@ -59,18 +51,43 @@ ftrace_modify_code(unsigned long ip, unsigned char *old_code, | |||
59 | return faulted; | 51 | return faulted; |
60 | } | 52 | } |
61 | 53 | ||
54 | int ftrace_make_nop(struct module *mod, struct dyn_ftrace *rec, unsigned long addr) | ||
55 | { | ||
56 | unsigned long ip = rec->ip; | ||
57 | u32 old, new; | ||
58 | |||
59 | old = ftrace_call_replace(ip, addr); | ||
60 | new = ftrace_nop; | ||
61 | return ftrace_modify_code(ip, old, new); | ||
62 | } | ||
63 | |||
64 | int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr) | ||
65 | { | ||
66 | unsigned long ip = rec->ip; | ||
67 | u32 old, new; | ||
68 | |||
69 | old = ftrace_nop; | ||
70 | new = ftrace_call_replace(ip, addr); | ||
71 | return ftrace_modify_code(ip, old, new); | ||
72 | } | ||
73 | |||
62 | int ftrace_update_ftrace_func(ftrace_func_t func) | 74 | int ftrace_update_ftrace_func(ftrace_func_t func) |
63 | { | 75 | { |
64 | unsigned long ip = (unsigned long)(&ftrace_call); | 76 | unsigned long ip = (unsigned long)(&ftrace_call); |
65 | unsigned char old[MCOUNT_INSN_SIZE], *new; | 77 | u32 old, new; |
66 | 78 | ||
67 | memcpy(old, &ftrace_call, MCOUNT_INSN_SIZE); | 79 | old = *(u32 *) &ftrace_call; |
68 | new = ftrace_call_replace(ip, (unsigned long)func); | 80 | new = ftrace_call_replace(ip, (unsigned long)func); |
69 | return ftrace_modify_code(ip, old, new); | 81 | return ftrace_modify_code(ip, old, new); |
70 | } | 82 | } |
71 | 83 | ||
72 | int __init ftrace_dyn_arch_init(void *data) | 84 | int __init ftrace_dyn_arch_init(void *data) |
73 | { | 85 | { |
74 | ftrace_mcount_set(data); | 86 | unsigned long *p = data; |
87 | |||
88 | *p = 0; | ||
89 | |||
75 | return 0; | 90 | return 0; |
76 | } | 91 | } |
92 | #endif | ||
93 | |||
diff --git a/arch/sparc/kernel/head_64.S b/arch/sparc/kernel/head_64.S index 91bf4c7f79b9..f8f21050448b 100644 --- a/arch/sparc/kernel/head_64.S +++ b/arch/sparc/kernel/head_64.S | |||
@@ -641,28 +641,6 @@ tlb_fixup_done: | |||
641 | /* Not reached... */ | 641 | /* Not reached... */ |
642 | 642 | ||
643 | 1: | 643 | 1: |
644 | /* If we boot on a non-zero cpu, all of the per-cpu | ||
645 | * variable references we make before setting up the | ||
646 | * per-cpu areas will use a bogus offset. Put a | ||
647 | * compensating factor into __per_cpu_base to handle | ||
648 | * this cleanly. | ||
649 | * | ||
650 | * What the per-cpu code calculates is: | ||
651 | * | ||
652 | * __per_cpu_base + (cpu << __per_cpu_shift) | ||
653 | * | ||
654 | * These two variables are zero initially, so to | ||
655 | * make it all cancel out to zero we need to put | ||
656 | * "0 - (cpu << 0)" into __per_cpu_base so that the | ||
657 | * above formula evaluates to zero. | ||
658 | * | ||
659 | * We cannot even perform a printk() until this stuff | ||
660 | * is setup as that calls cpu_clock() which uses | ||
661 | * per-cpu variables. | ||
662 | */ | ||
663 | sub %g0, %o0, %o1 | ||
664 | sethi %hi(__per_cpu_base), %o2 | ||
665 | stx %o1, [%o2 + %lo(__per_cpu_base)] | ||
666 | #else | 644 | #else |
667 | mov 0, %o0 | 645 | mov 0, %o0 |
668 | #endif | 646 | #endif |
diff --git a/arch/sparc/kernel/init_task.c b/arch/sparc/kernel/init_task.c index f28cb8278e98..28125c5b3d3c 100644 --- a/arch/sparc/kernel/init_task.c +++ b/arch/sparc/kernel/init_task.c | |||
@@ -10,10 +10,7 @@ | |||
10 | 10 | ||
11 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 11 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
12 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 12 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
13 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
14 | struct task_struct init_task = INIT_TASK(init_task); | 13 | struct task_struct init_task = INIT_TASK(init_task); |
15 | |||
16 | EXPORT_SYMBOL(init_mm); | ||
17 | EXPORT_SYMBOL(init_task); | 14 | EXPORT_SYMBOL(init_task); |
18 | 15 | ||
19 | /* .text section in head.S is aligned at 8k boundary and this gets linked | 16 | /* .text section in head.S is aligned at 8k boundary and this gets linked |
diff --git a/arch/sparc/kernel/iommu.c b/arch/sparc/kernel/iommu.c index d8900e1d5aad..0aeaefe696b9 100644 --- a/arch/sparc/kernel/iommu.c +++ b/arch/sparc/kernel/iommu.c | |||
@@ -351,8 +351,9 @@ static void dma_4u_free_coherent(struct device *dev, size_t size, | |||
351 | free_pages((unsigned long)cpu, order); | 351 | free_pages((unsigned long)cpu, order); |
352 | } | 352 | } |
353 | 353 | ||
354 | static dma_addr_t dma_4u_map_single(struct device *dev, void *ptr, size_t sz, | 354 | static dma_addr_t dma_4u_map_page(struct device *dev, struct page *page, |
355 | enum dma_data_direction direction) | 355 | unsigned long offset, size_t sz, |
356 | enum dma_data_direction direction) | ||
356 | { | 357 | { |
357 | struct iommu *iommu; | 358 | struct iommu *iommu; |
358 | struct strbuf *strbuf; | 359 | struct strbuf *strbuf; |
@@ -368,7 +369,7 @@ static dma_addr_t dma_4u_map_single(struct device *dev, void *ptr, size_t sz, | |||
368 | if (unlikely(direction == DMA_NONE)) | 369 | if (unlikely(direction == DMA_NONE)) |
369 | goto bad_no_ctx; | 370 | goto bad_no_ctx; |
370 | 371 | ||
371 | oaddr = (unsigned long)ptr; | 372 | oaddr = (unsigned long)(page_address(page) + offset); |
372 | npages = IO_PAGE_ALIGN(oaddr + sz) - (oaddr & IO_PAGE_MASK); | 373 | npages = IO_PAGE_ALIGN(oaddr + sz) - (oaddr & IO_PAGE_MASK); |
373 | npages >>= IO_PAGE_SHIFT; | 374 | npages >>= IO_PAGE_SHIFT; |
374 | 375 | ||
@@ -472,8 +473,8 @@ do_flush_sync: | |||
472 | vaddr, ctx, npages); | 473 | vaddr, ctx, npages); |
473 | } | 474 | } |
474 | 475 | ||
475 | static void dma_4u_unmap_single(struct device *dev, dma_addr_t bus_addr, | 476 | static void dma_4u_unmap_page(struct device *dev, dma_addr_t bus_addr, |
476 | size_t sz, enum dma_data_direction direction) | 477 | size_t sz, enum dma_data_direction direction) |
477 | { | 478 | { |
478 | struct iommu *iommu; | 479 | struct iommu *iommu; |
479 | struct strbuf *strbuf; | 480 | struct strbuf *strbuf; |
@@ -824,8 +825,8 @@ static void dma_4u_sync_sg_for_cpu(struct device *dev, | |||
824 | static const struct dma_ops sun4u_dma_ops = { | 825 | static const struct dma_ops sun4u_dma_ops = { |
825 | .alloc_coherent = dma_4u_alloc_coherent, | 826 | .alloc_coherent = dma_4u_alloc_coherent, |
826 | .free_coherent = dma_4u_free_coherent, | 827 | .free_coherent = dma_4u_free_coherent, |
827 | .map_single = dma_4u_map_single, | 828 | .map_page = dma_4u_map_page, |
828 | .unmap_single = dma_4u_unmap_single, | 829 | .unmap_page = dma_4u_unmap_page, |
829 | .map_sg = dma_4u_map_sg, | 830 | .map_sg = dma_4u_map_sg, |
830 | .unmap_sg = dma_4u_unmap_sg, | 831 | .unmap_sg = dma_4u_unmap_sg, |
831 | .sync_single_for_cpu = dma_4u_sync_single_for_cpu, | 832 | .sync_single_for_cpu = dma_4u_sync_single_for_cpu, |
diff --git a/arch/sparc/kernel/irq_64.c b/arch/sparc/kernel/irq_64.c index e5e78f9cfc95..bd075054942b 100644 --- a/arch/sparc/kernel/irq_64.c +++ b/arch/sparc/kernel/irq_64.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #include <asm/cacheflush.h> | 45 | #include <asm/cacheflush.h> |
46 | 46 | ||
47 | #include "entry.h" | 47 | #include "entry.h" |
48 | #include "cpumap.h" | ||
48 | 49 | ||
49 | #define NUM_IVECS (IMAP_INR + 1) | 50 | #define NUM_IVECS (IMAP_INR + 1) |
50 | 51 | ||
@@ -256,35 +257,13 @@ static int irq_choose_cpu(unsigned int virt_irq) | |||
256 | int cpuid; | 257 | int cpuid; |
257 | 258 | ||
258 | cpumask_copy(&mask, irq_desc[virt_irq].affinity); | 259 | cpumask_copy(&mask, irq_desc[virt_irq].affinity); |
259 | if (cpus_equal(mask, CPU_MASK_ALL)) { | 260 | if (cpus_equal(mask, cpu_online_map)) { |
260 | static int irq_rover; | 261 | cpuid = map_to_cpu(virt_irq); |
261 | static DEFINE_SPINLOCK(irq_rover_lock); | ||
262 | unsigned long flags; | ||
263 | |||
264 | /* Round-robin distribution... */ | ||
265 | do_round_robin: | ||
266 | spin_lock_irqsave(&irq_rover_lock, flags); | ||
267 | |||
268 | while (!cpu_online(irq_rover)) { | ||
269 | if (++irq_rover >= nr_cpu_ids) | ||
270 | irq_rover = 0; | ||
271 | } | ||
272 | cpuid = irq_rover; | ||
273 | do { | ||
274 | if (++irq_rover >= nr_cpu_ids) | ||
275 | irq_rover = 0; | ||
276 | } while (!cpu_online(irq_rover)); | ||
277 | |||
278 | spin_unlock_irqrestore(&irq_rover_lock, flags); | ||
279 | } else { | 262 | } else { |
280 | cpumask_t tmp; | 263 | cpumask_t tmp; |
281 | 264 | ||
282 | cpus_and(tmp, cpu_online_map, mask); | 265 | cpus_and(tmp, cpu_online_map, mask); |
283 | 266 | cpuid = cpus_empty(tmp) ? map_to_cpu(virt_irq) : first_cpu(tmp); | |
284 | if (cpus_empty(tmp)) | ||
285 | goto do_round_robin; | ||
286 | |||
287 | cpuid = first_cpu(tmp); | ||
288 | } | 267 | } |
289 | 268 | ||
290 | return cpuid; | 269 | return cpuid; |
diff --git a/arch/sparc/kernel/mdesc.c b/arch/sparc/kernel/mdesc.c index f0e6ed23a468..938da19dc065 100644 --- a/arch/sparc/kernel/mdesc.c +++ b/arch/sparc/kernel/mdesc.c | |||
@@ -574,7 +574,7 @@ static void __init report_platform_properties(void) | |||
574 | mdesc_release(hp); | 574 | mdesc_release(hp); |
575 | } | 575 | } |
576 | 576 | ||
577 | static void __devinit fill_in_one_cache(cpuinfo_sparc *c, | 577 | static void __cpuinit fill_in_one_cache(cpuinfo_sparc *c, |
578 | struct mdesc_handle *hp, | 578 | struct mdesc_handle *hp, |
579 | u64 mp) | 579 | u64 mp) |
580 | { | 580 | { |
@@ -619,8 +619,7 @@ static void __devinit fill_in_one_cache(cpuinfo_sparc *c, | |||
619 | } | 619 | } |
620 | } | 620 | } |
621 | 621 | ||
622 | static void __devinit mark_core_ids(struct mdesc_handle *hp, u64 mp, | 622 | static void __cpuinit mark_core_ids(struct mdesc_handle *hp, u64 mp, int core_id) |
623 | int core_id) | ||
624 | { | 623 | { |
625 | u64 a; | 624 | u64 a; |
626 | 625 | ||
@@ -653,7 +652,7 @@ static void __devinit mark_core_ids(struct mdesc_handle *hp, u64 mp, | |||
653 | } | 652 | } |
654 | } | 653 | } |
655 | 654 | ||
656 | static void __devinit set_core_ids(struct mdesc_handle *hp) | 655 | static void __cpuinit set_core_ids(struct mdesc_handle *hp) |
657 | { | 656 | { |
658 | int idx; | 657 | int idx; |
659 | u64 mp; | 658 | u64 mp; |
@@ -678,8 +677,7 @@ static void __devinit set_core_ids(struct mdesc_handle *hp) | |||
678 | } | 677 | } |
679 | } | 678 | } |
680 | 679 | ||
681 | static void __devinit mark_proc_ids(struct mdesc_handle *hp, u64 mp, | 680 | static void __cpuinit mark_proc_ids(struct mdesc_handle *hp, u64 mp, int proc_id) |
682 | int proc_id) | ||
683 | { | 681 | { |
684 | u64 a; | 682 | u64 a; |
685 | 683 | ||
@@ -698,8 +696,7 @@ static void __devinit mark_proc_ids(struct mdesc_handle *hp, u64 mp, | |||
698 | } | 696 | } |
699 | } | 697 | } |
700 | 698 | ||
701 | static void __devinit __set_proc_ids(struct mdesc_handle *hp, | 699 | static void __cpuinit __set_proc_ids(struct mdesc_handle *hp, const char *exec_unit_name) |
702 | const char *exec_unit_name) | ||
703 | { | 700 | { |
704 | int idx; | 701 | int idx; |
705 | u64 mp; | 702 | u64 mp; |
@@ -720,13 +717,13 @@ static void __devinit __set_proc_ids(struct mdesc_handle *hp, | |||
720 | } | 717 | } |
721 | } | 718 | } |
722 | 719 | ||
723 | static void __devinit set_proc_ids(struct mdesc_handle *hp) | 720 | static void __cpuinit set_proc_ids(struct mdesc_handle *hp) |
724 | { | 721 | { |
725 | __set_proc_ids(hp, "exec_unit"); | 722 | __set_proc_ids(hp, "exec_unit"); |
726 | __set_proc_ids(hp, "exec-unit"); | 723 | __set_proc_ids(hp, "exec-unit"); |
727 | } | 724 | } |
728 | 725 | ||
729 | static void __devinit get_one_mondo_bits(const u64 *p, unsigned int *mask, | 726 | static void __cpuinit get_one_mondo_bits(const u64 *p, unsigned int *mask, |
730 | unsigned char def) | 727 | unsigned char def) |
731 | { | 728 | { |
732 | u64 val; | 729 | u64 val; |
@@ -745,7 +742,7 @@ use_default: | |||
745 | *mask = ((1U << def) * 64U) - 1U; | 742 | *mask = ((1U << def) * 64U) - 1U; |
746 | } | 743 | } |
747 | 744 | ||
748 | static void __devinit get_mondo_data(struct mdesc_handle *hp, u64 mp, | 745 | static void __cpuinit get_mondo_data(struct mdesc_handle *hp, u64 mp, |
749 | struct trap_per_cpu *tb) | 746 | struct trap_per_cpu *tb) |
750 | { | 747 | { |
751 | const u64 *val; | 748 | const u64 *val; |
@@ -763,23 +760,15 @@ static void __devinit get_mondo_data(struct mdesc_handle *hp, u64 mp, | |||
763 | get_one_mondo_bits(val, &tb->nonresum_qmask, 2); | 760 | get_one_mondo_bits(val, &tb->nonresum_qmask, 2); |
764 | } | 761 | } |
765 | 762 | ||
766 | void __cpuinit mdesc_fill_in_cpu_data(cpumask_t mask) | 763 | static void * __cpuinit mdesc_iterate_over_cpus(void *(*func)(struct mdesc_handle *, u64, int, void *), void *arg, cpumask_t *mask) |
767 | { | 764 | { |
768 | struct mdesc_handle *hp = mdesc_grab(); | 765 | struct mdesc_handle *hp = mdesc_grab(); |
766 | void *ret = NULL; | ||
769 | u64 mp; | 767 | u64 mp; |
770 | 768 | ||
771 | ncpus_probed = 0; | ||
772 | mdesc_for_each_node_by_name(hp, mp, "cpu") { | 769 | mdesc_for_each_node_by_name(hp, mp, "cpu") { |
773 | const u64 *id = mdesc_get_property(hp, mp, "id", NULL); | 770 | const u64 *id = mdesc_get_property(hp, mp, "id", NULL); |
774 | const u64 *cfreq = mdesc_get_property(hp, mp, "clock-frequency", NULL); | 771 | int cpuid = *id; |
775 | struct trap_per_cpu *tb; | ||
776 | cpuinfo_sparc *c; | ||
777 | int cpuid; | ||
778 | u64 a; | ||
779 | |||
780 | ncpus_probed++; | ||
781 | |||
782 | cpuid = *id; | ||
783 | 772 | ||
784 | #ifdef CONFIG_SMP | 773 | #ifdef CONFIG_SMP |
785 | if (cpuid >= NR_CPUS) { | 774 | if (cpuid >= NR_CPUS) { |
@@ -788,62 +777,104 @@ void __cpuinit mdesc_fill_in_cpu_data(cpumask_t mask) | |||
788 | cpuid, NR_CPUS); | 777 | cpuid, NR_CPUS); |
789 | continue; | 778 | continue; |
790 | } | 779 | } |
791 | if (!cpu_isset(cpuid, mask)) | 780 | if (!cpu_isset(cpuid, *mask)) |
792 | continue; | 781 | continue; |
793 | #else | ||
794 | /* On uniprocessor we only want the values for the | ||
795 | * real physical cpu the kernel booted onto, however | ||
796 | * cpu_data() only has one entry at index 0. | ||
797 | */ | ||
798 | if (cpuid != real_hard_smp_processor_id()) | ||
799 | continue; | ||
800 | cpuid = 0; | ||
801 | #endif | 782 | #endif |
802 | 783 | ||
803 | c = &cpu_data(cpuid); | 784 | ret = func(hp, mp, cpuid, arg); |
804 | c->clock_tick = *cfreq; | 785 | if (ret) |
786 | goto out; | ||
787 | } | ||
788 | out: | ||
789 | mdesc_release(hp); | ||
790 | return ret; | ||
791 | } | ||
805 | 792 | ||
806 | tb = &trap_block[cpuid]; | 793 | static void * __cpuinit record_one_cpu(struct mdesc_handle *hp, u64 mp, int cpuid, void *arg) |
807 | get_mondo_data(hp, mp, tb); | 794 | { |
795 | ncpus_probed++; | ||
796 | #ifdef CONFIG_SMP | ||
797 | set_cpu_present(cpuid, true); | ||
798 | #endif | ||
799 | return NULL; | ||
800 | } | ||
808 | 801 | ||
809 | mdesc_for_each_arc(a, hp, mp, MDESC_ARC_TYPE_FWD) { | 802 | void __cpuinit mdesc_populate_present_mask(cpumask_t *mask) |
810 | u64 j, t = mdesc_arc_target(hp, a); | 803 | { |
811 | const char *t_name; | 804 | if (tlb_type != hypervisor) |
805 | return; | ||
812 | 806 | ||
813 | t_name = mdesc_node_name(hp, t); | 807 | ncpus_probed = 0; |
814 | if (!strcmp(t_name, "cache")) { | 808 | mdesc_iterate_over_cpus(record_one_cpu, NULL, mask); |
815 | fill_in_one_cache(c, hp, t); | 809 | } |
816 | continue; | ||
817 | } | ||
818 | 810 | ||
819 | mdesc_for_each_arc(j, hp, t, MDESC_ARC_TYPE_FWD) { | 811 | static void * __cpuinit fill_in_one_cpu(struct mdesc_handle *hp, u64 mp, int cpuid, void *arg) |
820 | u64 n = mdesc_arc_target(hp, j); | 812 | { |
821 | const char *n_name; | 813 | const u64 *cfreq = mdesc_get_property(hp, mp, "clock-frequency", NULL); |
814 | struct trap_per_cpu *tb; | ||
815 | cpuinfo_sparc *c; | ||
816 | u64 a; | ||
822 | 817 | ||
823 | n_name = mdesc_node_name(hp, n); | 818 | #ifndef CONFIG_SMP |
824 | if (!strcmp(n_name, "cache")) | 819 | /* On uniprocessor we only want the values for the |
825 | fill_in_one_cache(c, hp, n); | 820 | * real physical cpu the kernel booted onto, however |
826 | } | 821 | * cpu_data() only has one entry at index 0. |
822 | */ | ||
823 | if (cpuid != real_hard_smp_processor_id()) | ||
824 | return NULL; | ||
825 | cpuid = 0; | ||
826 | #endif | ||
827 | |||
828 | c = &cpu_data(cpuid); | ||
829 | c->clock_tick = *cfreq; | ||
830 | |||
831 | tb = &trap_block[cpuid]; | ||
832 | get_mondo_data(hp, mp, tb); | ||
833 | |||
834 | mdesc_for_each_arc(a, hp, mp, MDESC_ARC_TYPE_FWD) { | ||
835 | u64 j, t = mdesc_arc_target(hp, a); | ||
836 | const char *t_name; | ||
837 | |||
838 | t_name = mdesc_node_name(hp, t); | ||
839 | if (!strcmp(t_name, "cache")) { | ||
840 | fill_in_one_cache(c, hp, t); | ||
841 | continue; | ||
827 | } | 842 | } |
828 | 843 | ||
829 | #ifdef CONFIG_SMP | 844 | mdesc_for_each_arc(j, hp, t, MDESC_ARC_TYPE_FWD) { |
830 | cpu_set(cpuid, cpu_present_map); | 845 | u64 n = mdesc_arc_target(hp, j); |
831 | #endif | 846 | const char *n_name; |
832 | 847 | ||
833 | c->core_id = 0; | 848 | n_name = mdesc_node_name(hp, n); |
834 | c->proc_id = -1; | 849 | if (!strcmp(n_name, "cache")) |
850 | fill_in_one_cache(c, hp, n); | ||
851 | } | ||
835 | } | 852 | } |
836 | 853 | ||
854 | c->core_id = 0; | ||
855 | c->proc_id = -1; | ||
856 | |||
857 | return NULL; | ||
858 | } | ||
859 | |||
860 | void __cpuinit mdesc_fill_in_cpu_data(cpumask_t *mask) | ||
861 | { | ||
862 | struct mdesc_handle *hp; | ||
863 | |||
864 | mdesc_iterate_over_cpus(fill_in_one_cpu, NULL, mask); | ||
865 | |||
837 | #ifdef CONFIG_SMP | 866 | #ifdef CONFIG_SMP |
838 | sparc64_multi_core = 1; | 867 | sparc64_multi_core = 1; |
839 | #endif | 868 | #endif |
840 | 869 | ||
870 | hp = mdesc_grab(); | ||
871 | |||
841 | set_core_ids(hp); | 872 | set_core_ids(hp); |
842 | set_proc_ids(hp); | 873 | set_proc_ids(hp); |
843 | 874 | ||
844 | smp_fill_in_sib_core_maps(); | ||
845 | |||
846 | mdesc_release(hp); | 875 | mdesc_release(hp); |
876 | |||
877 | smp_fill_in_sib_core_maps(); | ||
847 | } | 878 | } |
848 | 879 | ||
849 | static ssize_t mdesc_read(struct file *file, char __user *buf, | 880 | static ssize_t mdesc_read(struct file *file, char __user *buf, |
@@ -887,7 +918,6 @@ void __init sun4v_mdesc_init(void) | |||
887 | { | 918 | { |
888 | struct mdesc_handle *hp; | 919 | struct mdesc_handle *hp; |
889 | unsigned long len, real_len, status; | 920 | unsigned long len, real_len, status; |
890 | cpumask_t mask; | ||
891 | 921 | ||
892 | (void) sun4v_mach_desc(0UL, 0UL, &len); | 922 | (void) sun4v_mach_desc(0UL, 0UL, &len); |
893 | 923 | ||
@@ -911,7 +941,4 @@ void __init sun4v_mdesc_init(void) | |||
911 | cur_mdesc = hp; | 941 | cur_mdesc = hp; |
912 | 942 | ||
913 | report_platform_properties(); | 943 | report_platform_properties(); |
914 | |||
915 | cpus_setall(mask); | ||
916 | mdesc_fill_in_cpu_data(mask); | ||
917 | } | 944 | } |
diff --git a/arch/sparc/kernel/of_device_32.c b/arch/sparc/kernel/of_device_32.c index c8f14c1dc521..90396702ea2c 100644 --- a/arch/sparc/kernel/of_device_32.c +++ b/arch/sparc/kernel/of_device_32.c | |||
@@ -6,159 +6,11 @@ | |||
6 | #include <linux/mod_devicetable.h> | 6 | #include <linux/mod_devicetable.h> |
7 | #include <linux/slab.h> | 7 | #include <linux/slab.h> |
8 | #include <linux/errno.h> | 8 | #include <linux/errno.h> |
9 | #include <linux/irq.h> | ||
9 | #include <linux/of_device.h> | 10 | #include <linux/of_device.h> |
10 | #include <linux/of_platform.h> | 11 | #include <linux/of_platform.h> |
11 | 12 | ||
12 | static int node_match(struct device *dev, void *data) | 13 | #include "of_device_common.h" |
13 | { | ||
14 | struct of_device *op = to_of_device(dev); | ||
15 | struct device_node *dp = data; | ||
16 | |||
17 | return (op->node == dp); | ||
18 | } | ||
19 | |||
20 | struct of_device *of_find_device_by_node(struct device_node *dp) | ||
21 | { | ||
22 | struct device *dev = bus_find_device(&of_platform_bus_type, NULL, | ||
23 | dp, node_match); | ||
24 | |||
25 | if (dev) | ||
26 | return to_of_device(dev); | ||
27 | |||
28 | return NULL; | ||
29 | } | ||
30 | EXPORT_SYMBOL(of_find_device_by_node); | ||
31 | |||
32 | unsigned int irq_of_parse_and_map(struct device_node *node, int index) | ||
33 | { | ||
34 | struct of_device *op = of_find_device_by_node(node); | ||
35 | |||
36 | if (!op || index >= op->num_irqs) | ||
37 | return 0; | ||
38 | |||
39 | return op->irqs[index]; | ||
40 | } | ||
41 | EXPORT_SYMBOL(irq_of_parse_and_map); | ||
42 | |||
43 | /* Take the archdata values for IOMMU, STC, and HOSTDATA found in | ||
44 | * BUS and propagate to all child of_device objects. | ||
45 | */ | ||
46 | void of_propagate_archdata(struct of_device *bus) | ||
47 | { | ||
48 | struct dev_archdata *bus_sd = &bus->dev.archdata; | ||
49 | struct device_node *bus_dp = bus->node; | ||
50 | struct device_node *dp; | ||
51 | |||
52 | for (dp = bus_dp->child; dp; dp = dp->sibling) { | ||
53 | struct of_device *op = of_find_device_by_node(dp); | ||
54 | |||
55 | op->dev.archdata.iommu = bus_sd->iommu; | ||
56 | op->dev.archdata.stc = bus_sd->stc; | ||
57 | op->dev.archdata.host_controller = bus_sd->host_controller; | ||
58 | op->dev.archdata.numa_node = bus_sd->numa_node; | ||
59 | |||
60 | if (dp->child) | ||
61 | of_propagate_archdata(op); | ||
62 | } | ||
63 | } | ||
64 | |||
65 | struct bus_type of_platform_bus_type; | ||
66 | EXPORT_SYMBOL(of_platform_bus_type); | ||
67 | |||
68 | static inline u64 of_read_addr(const u32 *cell, int size) | ||
69 | { | ||
70 | u64 r = 0; | ||
71 | while (size--) | ||
72 | r = (r << 32) | *(cell++); | ||
73 | return r; | ||
74 | } | ||
75 | |||
76 | static void __init get_cells(struct device_node *dp, | ||
77 | int *addrc, int *sizec) | ||
78 | { | ||
79 | if (addrc) | ||
80 | *addrc = of_n_addr_cells(dp); | ||
81 | if (sizec) | ||
82 | *sizec = of_n_size_cells(dp); | ||
83 | } | ||
84 | |||
85 | /* Max address size we deal with */ | ||
86 | #define OF_MAX_ADDR_CELLS 4 | ||
87 | |||
88 | struct of_bus { | ||
89 | const char *name; | ||
90 | const char *addr_prop_name; | ||
91 | int (*match)(struct device_node *parent); | ||
92 | void (*count_cells)(struct device_node *child, | ||
93 | int *addrc, int *sizec); | ||
94 | int (*map)(u32 *addr, const u32 *range, | ||
95 | int na, int ns, int pna); | ||
96 | unsigned long (*get_flags)(const u32 *addr, unsigned long); | ||
97 | }; | ||
98 | |||
99 | /* | ||
100 | * Default translator (generic bus) | ||
101 | */ | ||
102 | |||
103 | static void of_bus_default_count_cells(struct device_node *dev, | ||
104 | int *addrc, int *sizec) | ||
105 | { | ||
106 | get_cells(dev, addrc, sizec); | ||
107 | } | ||
108 | |||
109 | /* Make sure the least significant 64-bits are in-range. Even | ||
110 | * for 3 or 4 cell values it is a good enough approximation. | ||
111 | */ | ||
112 | static int of_out_of_range(const u32 *addr, const u32 *base, | ||
113 | const u32 *size, int na, int ns) | ||
114 | { | ||
115 | u64 a = of_read_addr(addr, na); | ||
116 | u64 b = of_read_addr(base, na); | ||
117 | |||
118 | if (a < b) | ||
119 | return 1; | ||
120 | |||
121 | b += of_read_addr(size, ns); | ||
122 | if (a >= b) | ||
123 | return 1; | ||
124 | |||
125 | return 0; | ||
126 | } | ||
127 | |||
128 | static int of_bus_default_map(u32 *addr, const u32 *range, | ||
129 | int na, int ns, int pna) | ||
130 | { | ||
131 | u32 result[OF_MAX_ADDR_CELLS]; | ||
132 | int i; | ||
133 | |||
134 | if (ns > 2) { | ||
135 | printk("of_device: Cannot handle size cells (%d) > 2.", ns); | ||
136 | return -EINVAL; | ||
137 | } | ||
138 | |||
139 | if (of_out_of_range(addr, range, range + na + pna, na, ns)) | ||
140 | return -EINVAL; | ||
141 | |||
142 | /* Start with the parent range base. */ | ||
143 | memcpy(result, range + na, pna * 4); | ||
144 | |||
145 | /* Add in the child address offset. */ | ||
146 | for (i = 0; i < na; i++) | ||
147 | result[pna - 1 - i] += | ||
148 | (addr[na - 1 - i] - | ||
149 | range[na - 1 - i]); | ||
150 | |||
151 | memcpy(addr, result, pna * 4); | ||
152 | |||
153 | return 0; | ||
154 | } | ||
155 | |||
156 | static unsigned long of_bus_default_get_flags(const u32 *addr, unsigned long flags) | ||
157 | { | ||
158 | if (flags) | ||
159 | return flags; | ||
160 | return IORESOURCE_MEM; | ||
161 | } | ||
162 | 14 | ||
163 | /* | 15 | /* |
164 | * PCI bus specific translator | 16 | * PCI bus specific translator |
@@ -240,47 +92,6 @@ static unsigned long of_bus_pci_get_flags(const u32 *addr, unsigned long flags) | |||
240 | return flags; | 92 | return flags; |
241 | } | 93 | } |
242 | 94 | ||
243 | /* | ||
244 | * SBUS bus specific translator | ||
245 | */ | ||
246 | |||
247 | static int of_bus_sbus_match(struct device_node *np) | ||
248 | { | ||
249 | struct device_node *dp = np; | ||
250 | |||
251 | while (dp) { | ||
252 | if (!strcmp(dp->name, "sbus") || | ||
253 | !strcmp(dp->name, "sbi")) | ||
254 | return 1; | ||
255 | |||
256 | /* Have a look at use_1to1_mapping(). We're trying | ||
257 | * to match SBUS if that's the top-level bus and we | ||
258 | * don't have some intervening real bus that provides | ||
259 | * ranges based translations. | ||
260 | */ | ||
261 | if (of_find_property(dp, "ranges", NULL) != NULL) | ||
262 | break; | ||
263 | |||
264 | dp = dp->parent; | ||
265 | } | ||
266 | |||
267 | return 0; | ||
268 | } | ||
269 | |||
270 | static void of_bus_sbus_count_cells(struct device_node *child, | ||
271 | int *addrc, int *sizec) | ||
272 | { | ||
273 | if (addrc) | ||
274 | *addrc = 2; | ||
275 | if (sizec) | ||
276 | *sizec = 1; | ||
277 | } | ||
278 | |||
279 | static int of_bus_sbus_map(u32 *addr, const u32 *range, int na, int ns, int pna) | ||
280 | { | ||
281 | return of_bus_default_map(addr, range, na, ns, pna); | ||
282 | } | ||
283 | |||
284 | static unsigned long of_bus_sbus_get_flags(const u32 *addr, unsigned long flags) | 95 | static unsigned long of_bus_sbus_get_flags(const u32 *addr, unsigned long flags) |
285 | { | 96 | { |
286 | return IORESOURCE_MEM; | 97 | return IORESOURCE_MEM; |
@@ -307,7 +118,7 @@ static struct of_bus of_busses[] = { | |||
307 | .addr_prop_name = "reg", | 118 | .addr_prop_name = "reg", |
308 | .match = of_bus_sbus_match, | 119 | .match = of_bus_sbus_match, |
309 | .count_cells = of_bus_sbus_count_cells, | 120 | .count_cells = of_bus_sbus_count_cells, |
310 | .map = of_bus_sbus_map, | 121 | .map = of_bus_default_map, |
311 | .get_flags = of_bus_sbus_get_flags, | 122 | .get_flags = of_bus_sbus_get_flags, |
312 | }, | 123 | }, |
313 | /* Default */ | 124 | /* Default */ |
diff --git a/arch/sparc/kernel/of_device_64.c b/arch/sparc/kernel/of_device_64.c index 5ac287ac03de..881947e59e95 100644 --- a/arch/sparc/kernel/of_device_64.c +++ b/arch/sparc/kernel/of_device_64.c | |||
@@ -10,6 +10,8 @@ | |||
10 | #include <linux/of_device.h> | 10 | #include <linux/of_device.h> |
11 | #include <linux/of_platform.h> | 11 | #include <linux/of_platform.h> |
12 | 12 | ||
13 | #include "of_device_common.h" | ||
14 | |||
13 | void __iomem *of_ioremap(struct resource *res, unsigned long offset, unsigned long size, char *name) | 15 | void __iomem *of_ioremap(struct resource *res, unsigned long offset, unsigned long size, char *name) |
14 | { | 16 | { |
15 | unsigned long ret = res->start + offset; | 17 | unsigned long ret = res->start + offset; |
@@ -35,156 +37,6 @@ void of_iounmap(struct resource *res, void __iomem *base, unsigned long size) | |||
35 | } | 37 | } |
36 | EXPORT_SYMBOL(of_iounmap); | 38 | EXPORT_SYMBOL(of_iounmap); |
37 | 39 | ||
38 | static int node_match(struct device *dev, void *data) | ||
39 | { | ||
40 | struct of_device *op = to_of_device(dev); | ||
41 | struct device_node *dp = data; | ||
42 | |||
43 | return (op->node == dp); | ||
44 | } | ||
45 | |||
46 | struct of_device *of_find_device_by_node(struct device_node *dp) | ||
47 | { | ||
48 | struct device *dev = bus_find_device(&of_platform_bus_type, NULL, | ||
49 | dp, node_match); | ||
50 | |||
51 | if (dev) | ||
52 | return to_of_device(dev); | ||
53 | |||
54 | return NULL; | ||
55 | } | ||
56 | EXPORT_SYMBOL(of_find_device_by_node); | ||
57 | |||
58 | unsigned int irq_of_parse_and_map(struct device_node *node, int index) | ||
59 | { | ||
60 | struct of_device *op = of_find_device_by_node(node); | ||
61 | |||
62 | if (!op || index >= op->num_irqs) | ||
63 | return 0; | ||
64 | |||
65 | return op->irqs[index]; | ||
66 | } | ||
67 | EXPORT_SYMBOL(irq_of_parse_and_map); | ||
68 | |||
69 | /* Take the archdata values for IOMMU, STC, and HOSTDATA found in | ||
70 | * BUS and propagate to all child of_device objects. | ||
71 | */ | ||
72 | void of_propagate_archdata(struct of_device *bus) | ||
73 | { | ||
74 | struct dev_archdata *bus_sd = &bus->dev.archdata; | ||
75 | struct device_node *bus_dp = bus->node; | ||
76 | struct device_node *dp; | ||
77 | |||
78 | for (dp = bus_dp->child; dp; dp = dp->sibling) { | ||
79 | struct of_device *op = of_find_device_by_node(dp); | ||
80 | |||
81 | op->dev.archdata.iommu = bus_sd->iommu; | ||
82 | op->dev.archdata.stc = bus_sd->stc; | ||
83 | op->dev.archdata.host_controller = bus_sd->host_controller; | ||
84 | op->dev.archdata.numa_node = bus_sd->numa_node; | ||
85 | |||
86 | if (dp->child) | ||
87 | of_propagate_archdata(op); | ||
88 | } | ||
89 | } | ||
90 | |||
91 | struct bus_type of_platform_bus_type; | ||
92 | EXPORT_SYMBOL(of_platform_bus_type); | ||
93 | |||
94 | static inline u64 of_read_addr(const u32 *cell, int size) | ||
95 | { | ||
96 | u64 r = 0; | ||
97 | while (size--) | ||
98 | r = (r << 32) | *(cell++); | ||
99 | return r; | ||
100 | } | ||
101 | |||
102 | static void get_cells(struct device_node *dp, int *addrc, int *sizec) | ||
103 | { | ||
104 | if (addrc) | ||
105 | *addrc = of_n_addr_cells(dp); | ||
106 | if (sizec) | ||
107 | *sizec = of_n_size_cells(dp); | ||
108 | } | ||
109 | |||
110 | /* Max address size we deal with */ | ||
111 | #define OF_MAX_ADDR_CELLS 4 | ||
112 | |||
113 | struct of_bus { | ||
114 | const char *name; | ||
115 | const char *addr_prop_name; | ||
116 | int (*match)(struct device_node *parent); | ||
117 | void (*count_cells)(struct device_node *child, | ||
118 | int *addrc, int *sizec); | ||
119 | int (*map)(u32 *addr, const u32 *range, | ||
120 | int na, int ns, int pna); | ||
121 | unsigned long (*get_flags)(const u32 *addr, unsigned long); | ||
122 | }; | ||
123 | |||
124 | /* | ||
125 | * Default translator (generic bus) | ||
126 | */ | ||
127 | |||
128 | static void of_bus_default_count_cells(struct device_node *dev, | ||
129 | int *addrc, int *sizec) | ||
130 | { | ||
131 | get_cells(dev, addrc, sizec); | ||
132 | } | ||
133 | |||
134 | /* Make sure the least significant 64-bits are in-range. Even | ||
135 | * for 3 or 4 cell values it is a good enough approximation. | ||
136 | */ | ||
137 | static int of_out_of_range(const u32 *addr, const u32 *base, | ||
138 | const u32 *size, int na, int ns) | ||
139 | { | ||
140 | u64 a = of_read_addr(addr, na); | ||
141 | u64 b = of_read_addr(base, na); | ||
142 | |||
143 | if (a < b) | ||
144 | return 1; | ||
145 | |||
146 | b += of_read_addr(size, ns); | ||
147 | if (a >= b) | ||
148 | return 1; | ||
149 | |||
150 | return 0; | ||
151 | } | ||
152 | |||
153 | static int of_bus_default_map(u32 *addr, const u32 *range, | ||
154 | int na, int ns, int pna) | ||
155 | { | ||
156 | u32 result[OF_MAX_ADDR_CELLS]; | ||
157 | int i; | ||
158 | |||
159 | if (ns > 2) { | ||
160 | printk("of_device: Cannot handle size cells (%d) > 2.", ns); | ||
161 | return -EINVAL; | ||
162 | } | ||
163 | |||
164 | if (of_out_of_range(addr, range, range + na + pna, na, ns)) | ||
165 | return -EINVAL; | ||
166 | |||
167 | /* Start with the parent range base. */ | ||
168 | memcpy(result, range + na, pna * 4); | ||
169 | |||
170 | /* Add in the child address offset. */ | ||
171 | for (i = 0; i < na; i++) | ||
172 | result[pna - 1 - i] += | ||
173 | (addr[na - 1 - i] - | ||
174 | range[na - 1 - i]); | ||
175 | |||
176 | memcpy(addr, result, pna * 4); | ||
177 | |||
178 | return 0; | ||
179 | } | ||
180 | |||
181 | static unsigned long of_bus_default_get_flags(const u32 *addr, unsigned long flags) | ||
182 | { | ||
183 | if (flags) | ||
184 | return flags; | ||
185 | return IORESOURCE_MEM; | ||
186 | } | ||
187 | |||
188 | /* | 40 | /* |
189 | * PCI bus specific translator | 41 | * PCI bus specific translator |
190 | */ | 42 | */ |
@@ -295,42 +147,6 @@ static unsigned long of_bus_pci_get_flags(const u32 *addr, unsigned long flags) | |||
295 | } | 147 | } |
296 | 148 | ||
297 | /* | 149 | /* |
298 | * SBUS bus specific translator | ||
299 | */ | ||
300 | |||
301 | static int of_bus_sbus_match(struct device_node *np) | ||
302 | { | ||
303 | struct device_node *dp = np; | ||
304 | |||
305 | while (dp) { | ||
306 | if (!strcmp(dp->name, "sbus") || | ||
307 | !strcmp(dp->name, "sbi")) | ||
308 | return 1; | ||
309 | |||
310 | /* Have a look at use_1to1_mapping(). We're trying | ||
311 | * to match SBUS if that's the top-level bus and we | ||
312 | * don't have some intervening real bus that provides | ||
313 | * ranges based translations. | ||
314 | */ | ||
315 | if (of_find_property(dp, "ranges", NULL) != NULL) | ||
316 | break; | ||
317 | |||
318 | dp = dp->parent; | ||
319 | } | ||
320 | |||
321 | return 0; | ||
322 | } | ||
323 | |||
324 | static void of_bus_sbus_count_cells(struct device_node *child, | ||
325 | int *addrc, int *sizec) | ||
326 | { | ||
327 | if (addrc) | ||
328 | *addrc = 2; | ||
329 | if (sizec) | ||
330 | *sizec = 1; | ||
331 | } | ||
332 | |||
333 | /* | ||
334 | * FHC/Central bus specific translator. | 150 | * FHC/Central bus specific translator. |
335 | * | 151 | * |
336 | * This is just needed to hard-code the address and size cell | 152 | * This is just needed to hard-code the address and size cell |
diff --git a/arch/sparc/kernel/of_device_common.c b/arch/sparc/kernel/of_device_common.c new file mode 100644 index 000000000000..cb8eb799bb6c --- /dev/null +++ b/arch/sparc/kernel/of_device_common.c | |||
@@ -0,0 +1,174 @@ | |||
1 | #include <linux/string.h> | ||
2 | #include <linux/kernel.h> | ||
3 | #include <linux/of.h> | ||
4 | #include <linux/init.h> | ||
5 | #include <linux/module.h> | ||
6 | #include <linux/mod_devicetable.h> | ||
7 | #include <linux/slab.h> | ||
8 | #include <linux/errno.h> | ||
9 | #include <linux/irq.h> | ||
10 | #include <linux/of_device.h> | ||
11 | #include <linux/of_platform.h> | ||
12 | |||
13 | #include "of_device_common.h" | ||
14 | |||
15 | static int node_match(struct device *dev, void *data) | ||
16 | { | ||
17 | struct of_device *op = to_of_device(dev); | ||
18 | struct device_node *dp = data; | ||
19 | |||
20 | return (op->node == dp); | ||
21 | } | ||
22 | |||
23 | struct of_device *of_find_device_by_node(struct device_node *dp) | ||
24 | { | ||
25 | struct device *dev = bus_find_device(&of_platform_bus_type, NULL, | ||
26 | dp, node_match); | ||
27 | |||
28 | if (dev) | ||
29 | return to_of_device(dev); | ||
30 | |||
31 | return NULL; | ||
32 | } | ||
33 | EXPORT_SYMBOL(of_find_device_by_node); | ||
34 | |||
35 | unsigned int irq_of_parse_and_map(struct device_node *node, int index) | ||
36 | { | ||
37 | struct of_device *op = of_find_device_by_node(node); | ||
38 | |||
39 | if (!op || index >= op->num_irqs) | ||
40 | return 0; | ||
41 | |||
42 | return op->irqs[index]; | ||
43 | } | ||
44 | EXPORT_SYMBOL(irq_of_parse_and_map); | ||
45 | |||
46 | /* Take the archdata values for IOMMU, STC, and HOSTDATA found in | ||
47 | * BUS and propagate to all child of_device objects. | ||
48 | */ | ||
49 | void of_propagate_archdata(struct of_device *bus) | ||
50 | { | ||
51 | struct dev_archdata *bus_sd = &bus->dev.archdata; | ||
52 | struct device_node *bus_dp = bus->node; | ||
53 | struct device_node *dp; | ||
54 | |||
55 | for (dp = bus_dp->child; dp; dp = dp->sibling) { | ||
56 | struct of_device *op = of_find_device_by_node(dp); | ||
57 | |||
58 | op->dev.archdata.iommu = bus_sd->iommu; | ||
59 | op->dev.archdata.stc = bus_sd->stc; | ||
60 | op->dev.archdata.host_controller = bus_sd->host_controller; | ||
61 | op->dev.archdata.numa_node = bus_sd->numa_node; | ||
62 | |||
63 | if (dp->child) | ||
64 | of_propagate_archdata(op); | ||
65 | } | ||
66 | } | ||
67 | |||
68 | struct bus_type of_platform_bus_type; | ||
69 | EXPORT_SYMBOL(of_platform_bus_type); | ||
70 | |||
71 | static void get_cells(struct device_node *dp, int *addrc, int *sizec) | ||
72 | { | ||
73 | if (addrc) | ||
74 | *addrc = of_n_addr_cells(dp); | ||
75 | if (sizec) | ||
76 | *sizec = of_n_size_cells(dp); | ||
77 | } | ||
78 | |||
79 | /* | ||
80 | * Default translator (generic bus) | ||
81 | */ | ||
82 | |||
83 | void of_bus_default_count_cells(struct device_node *dev, int *addrc, int *sizec) | ||
84 | { | ||
85 | get_cells(dev, addrc, sizec); | ||
86 | } | ||
87 | |||
88 | /* Make sure the least significant 64-bits are in-range. Even | ||
89 | * for 3 or 4 cell values it is a good enough approximation. | ||
90 | */ | ||
91 | int of_out_of_range(const u32 *addr, const u32 *base, | ||
92 | const u32 *size, int na, int ns) | ||
93 | { | ||
94 | u64 a = of_read_addr(addr, na); | ||
95 | u64 b = of_read_addr(base, na); | ||
96 | |||
97 | if (a < b) | ||
98 | return 1; | ||
99 | |||
100 | b += of_read_addr(size, ns); | ||
101 | if (a >= b) | ||
102 | return 1; | ||
103 | |||
104 | return 0; | ||
105 | } | ||
106 | |||
107 | int of_bus_default_map(u32 *addr, const u32 *range, int na, int ns, int pna) | ||
108 | { | ||
109 | u32 result[OF_MAX_ADDR_CELLS]; | ||
110 | int i; | ||
111 | |||
112 | if (ns > 2) { | ||
113 | printk("of_device: Cannot handle size cells (%d) > 2.", ns); | ||
114 | return -EINVAL; | ||
115 | } | ||
116 | |||
117 | if (of_out_of_range(addr, range, range + na + pna, na, ns)) | ||
118 | return -EINVAL; | ||
119 | |||
120 | /* Start with the parent range base. */ | ||
121 | memcpy(result, range + na, pna * 4); | ||
122 | |||
123 | /* Add in the child address offset. */ | ||
124 | for (i = 0; i < na; i++) | ||
125 | result[pna - 1 - i] += | ||
126 | (addr[na - 1 - i] - | ||
127 | range[na - 1 - i]); | ||
128 | |||
129 | memcpy(addr, result, pna * 4); | ||
130 | |||
131 | return 0; | ||
132 | } | ||
133 | |||
134 | unsigned long of_bus_default_get_flags(const u32 *addr, unsigned long flags) | ||
135 | { | ||
136 | if (flags) | ||
137 | return flags; | ||
138 | return IORESOURCE_MEM; | ||
139 | } | ||
140 | |||
141 | /* | ||
142 | * SBUS bus specific translator | ||
143 | */ | ||
144 | |||
145 | int of_bus_sbus_match(struct device_node *np) | ||
146 | { | ||
147 | struct device_node *dp = np; | ||
148 | |||
149 | while (dp) { | ||
150 | if (!strcmp(dp->name, "sbus") || | ||
151 | !strcmp(dp->name, "sbi")) | ||
152 | return 1; | ||
153 | |||
154 | /* Have a look at use_1to1_mapping(). We're trying | ||
155 | * to match SBUS if that's the top-level bus and we | ||
156 | * don't have some intervening real bus that provides | ||
157 | * ranges based translations. | ||
158 | */ | ||
159 | if (of_find_property(dp, "ranges", NULL) != NULL) | ||
160 | break; | ||
161 | |||
162 | dp = dp->parent; | ||
163 | } | ||
164 | |||
165 | return 0; | ||
166 | } | ||
167 | |||
168 | void of_bus_sbus_count_cells(struct device_node *child, int *addrc, int *sizec) | ||
169 | { | ||
170 | if (addrc) | ||
171 | *addrc = 2; | ||
172 | if (sizec) | ||
173 | *sizec = 1; | ||
174 | } | ||
diff --git a/arch/sparc/kernel/of_device_common.h b/arch/sparc/kernel/of_device_common.h new file mode 100644 index 000000000000..cdfd23992841 --- /dev/null +++ b/arch/sparc/kernel/of_device_common.h | |||
@@ -0,0 +1,36 @@ | |||
1 | #ifndef _OF_DEVICE_COMMON_H | ||
2 | #define _OF_DEVICE_COMMON_H | ||
3 | |||
4 | static inline u64 of_read_addr(const u32 *cell, int size) | ||
5 | { | ||
6 | u64 r = 0; | ||
7 | while (size--) | ||
8 | r = (r << 32) | *(cell++); | ||
9 | return r; | ||
10 | } | ||
11 | |||
12 | void of_bus_default_count_cells(struct device_node *dev, int *addrc, | ||
13 | int *sizec); | ||
14 | int of_out_of_range(const u32 *addr, const u32 *base, | ||
15 | const u32 *size, int na, int ns); | ||
16 | int of_bus_default_map(u32 *addr, const u32 *range, int na, int ns, int pna); | ||
17 | unsigned long of_bus_default_get_flags(const u32 *addr, unsigned long flags); | ||
18 | |||
19 | int of_bus_sbus_match(struct device_node *np); | ||
20 | void of_bus_sbus_count_cells(struct device_node *child, int *addrc, int *sizec); | ||
21 | |||
22 | /* Max address size we deal with */ | ||
23 | #define OF_MAX_ADDR_CELLS 4 | ||
24 | |||
25 | struct of_bus { | ||
26 | const char *name; | ||
27 | const char *addr_prop_name; | ||
28 | int (*match)(struct device_node *parent); | ||
29 | void (*count_cells)(struct device_node *child, | ||
30 | int *addrc, int *sizec); | ||
31 | int (*map)(u32 *addr, const u32 *range, | ||
32 | int na, int ns, int pna); | ||
33 | unsigned long (*get_flags)(const u32 *addr, unsigned long); | ||
34 | }; | ||
35 | |||
36 | #endif /* _OF_DEVICE_COMMON_H */ | ||
diff --git a/arch/sparc/kernel/pci_sun4v.c b/arch/sparc/kernel/pci_sun4v.c index 5db5ebed35da..2485eaa23101 100644 --- a/arch/sparc/kernel/pci_sun4v.c +++ b/arch/sparc/kernel/pci_sun4v.c | |||
@@ -230,8 +230,9 @@ static void dma_4v_free_coherent(struct device *dev, size_t size, void *cpu, | |||
230 | free_pages((unsigned long)cpu, order); | 230 | free_pages((unsigned long)cpu, order); |
231 | } | 231 | } |
232 | 232 | ||
233 | static dma_addr_t dma_4v_map_single(struct device *dev, void *ptr, size_t sz, | 233 | static dma_addr_t dma_4v_map_page(struct device *dev, struct page *page, |
234 | enum dma_data_direction direction) | 234 | unsigned long offset, size_t sz, |
235 | enum dma_data_direction direction) | ||
235 | { | 236 | { |
236 | struct iommu *iommu; | 237 | struct iommu *iommu; |
237 | unsigned long flags, npages, oaddr; | 238 | unsigned long flags, npages, oaddr; |
@@ -245,7 +246,7 @@ static dma_addr_t dma_4v_map_single(struct device *dev, void *ptr, size_t sz, | |||
245 | if (unlikely(direction == DMA_NONE)) | 246 | if (unlikely(direction == DMA_NONE)) |
246 | goto bad; | 247 | goto bad; |
247 | 248 | ||
248 | oaddr = (unsigned long)ptr; | 249 | oaddr = (unsigned long)(page_address(page) + offset); |
249 | npages = IO_PAGE_ALIGN(oaddr + sz) - (oaddr & IO_PAGE_MASK); | 250 | npages = IO_PAGE_ALIGN(oaddr + sz) - (oaddr & IO_PAGE_MASK); |
250 | npages >>= IO_PAGE_SHIFT; | 251 | npages >>= IO_PAGE_SHIFT; |
251 | 252 | ||
@@ -294,8 +295,8 @@ iommu_map_fail: | |||
294 | return DMA_ERROR_CODE; | 295 | return DMA_ERROR_CODE; |
295 | } | 296 | } |
296 | 297 | ||
297 | static void dma_4v_unmap_single(struct device *dev, dma_addr_t bus_addr, | 298 | static void dma_4v_unmap_page(struct device *dev, dma_addr_t bus_addr, |
298 | size_t sz, enum dma_data_direction direction) | 299 | size_t sz, enum dma_data_direction direction) |
299 | { | 300 | { |
300 | struct pci_pbm_info *pbm; | 301 | struct pci_pbm_info *pbm; |
301 | struct iommu *iommu; | 302 | struct iommu *iommu; |
@@ -537,8 +538,8 @@ static void dma_4v_sync_sg_for_cpu(struct device *dev, | |||
537 | static const struct dma_ops sun4v_dma_ops = { | 538 | static const struct dma_ops sun4v_dma_ops = { |
538 | .alloc_coherent = dma_4v_alloc_coherent, | 539 | .alloc_coherent = dma_4v_alloc_coherent, |
539 | .free_coherent = dma_4v_free_coherent, | 540 | .free_coherent = dma_4v_free_coherent, |
540 | .map_single = dma_4v_map_single, | 541 | .map_page = dma_4v_map_page, |
541 | .unmap_single = dma_4v_unmap_single, | 542 | .unmap_page = dma_4v_unmap_page, |
542 | .map_sg = dma_4v_map_sg, | 543 | .map_sg = dma_4v_map_sg, |
543 | .unmap_sg = dma_4v_unmap_sg, | 544 | .unmap_sg = dma_4v_unmap_sg, |
544 | .sync_single_for_cpu = dma_4v_sync_single_for_cpu, | 545 | .sync_single_for_cpu = dma_4v_sync_single_for_cpu, |
diff --git a/arch/sparc/kernel/prom.h b/arch/sparc/kernel/prom.h index bb0f0fda6cab..453397fe5e14 100644 --- a/arch/sparc/kernel/prom.h +++ b/arch/sparc/kernel/prom.h | |||
@@ -22,7 +22,6 @@ static inline int is_root_node(const struct device_node *dp) | |||
22 | 22 | ||
23 | extern char *build_path_component(struct device_node *dp); | 23 | extern char *build_path_component(struct device_node *dp); |
24 | extern void of_console_init(void); | 24 | extern void of_console_init(void); |
25 | extern void of_fill_in_cpu_data(void); | ||
26 | 25 | ||
27 | extern unsigned int prom_early_allocated; | 26 | extern unsigned int prom_early_allocated; |
28 | 27 | ||
diff --git a/arch/sparc/kernel/prom_64.c b/arch/sparc/kernel/prom_64.c index ca55c7012f77..fb06ac2bd38f 100644 --- a/arch/sparc/kernel/prom_64.c +++ b/arch/sparc/kernel/prom_64.c | |||
@@ -374,75 +374,26 @@ static const char *get_mid_prop(void) | |||
374 | return (tlb_type == spitfire ? "upa-portid" : "portid"); | 374 | return (tlb_type == spitfire ? "upa-portid" : "portid"); |
375 | } | 375 | } |
376 | 376 | ||
377 | struct device_node *of_find_node_by_cpuid(int cpuid) | 377 | static void *of_iterate_over_cpus(void *(*func)(struct device_node *, int, int), int arg) |
378 | { | ||
379 | struct device_node *dp; | ||
380 | const char *mid_prop = get_mid_prop(); | ||
381 | |||
382 | for_each_node_by_type(dp, "cpu") { | ||
383 | int id = of_getintprop_default(dp, mid_prop, -1); | ||
384 | const char *this_mid_prop = mid_prop; | ||
385 | |||
386 | if (id < 0) { | ||
387 | this_mid_prop = "cpuid"; | ||
388 | id = of_getintprop_default(dp, this_mid_prop, -1); | ||
389 | } | ||
390 | |||
391 | if (id < 0) { | ||
392 | prom_printf("OF: Serious problem, cpu lacks " | ||
393 | "%s property", this_mid_prop); | ||
394 | prom_halt(); | ||
395 | } | ||
396 | if (cpuid == id) | ||
397 | return dp; | ||
398 | } | ||
399 | return NULL; | ||
400 | } | ||
401 | |||
402 | void __init of_fill_in_cpu_data(void) | ||
403 | { | 378 | { |
404 | struct device_node *dp; | 379 | struct device_node *dp; |
405 | const char *mid_prop; | 380 | const char *mid_prop; |
406 | 381 | ||
407 | if (tlb_type == hypervisor) | ||
408 | return; | ||
409 | |||
410 | mid_prop = get_mid_prop(); | 382 | mid_prop = get_mid_prop(); |
411 | ncpus_probed = 0; | ||
412 | for_each_node_by_type(dp, "cpu") { | 383 | for_each_node_by_type(dp, "cpu") { |
413 | int cpuid = of_getintprop_default(dp, mid_prop, -1); | 384 | int cpuid = of_getintprop_default(dp, mid_prop, -1); |
414 | const char *this_mid_prop = mid_prop; | 385 | const char *this_mid_prop = mid_prop; |
415 | struct device_node *portid_parent; | 386 | void *ret; |
416 | int portid = -1; | ||
417 | 387 | ||
418 | portid_parent = NULL; | ||
419 | if (cpuid < 0) { | 388 | if (cpuid < 0) { |
420 | this_mid_prop = "cpuid"; | 389 | this_mid_prop = "cpuid"; |
421 | cpuid = of_getintprop_default(dp, this_mid_prop, -1); | 390 | cpuid = of_getintprop_default(dp, this_mid_prop, -1); |
422 | if (cpuid >= 0) { | ||
423 | int limit = 2; | ||
424 | |||
425 | portid_parent = dp; | ||
426 | while (limit--) { | ||
427 | portid_parent = portid_parent->parent; | ||
428 | if (!portid_parent) | ||
429 | break; | ||
430 | portid = of_getintprop_default(portid_parent, | ||
431 | "portid", -1); | ||
432 | if (portid >= 0) | ||
433 | break; | ||
434 | } | ||
435 | } | ||
436 | } | 391 | } |
437 | |||
438 | if (cpuid < 0) { | 392 | if (cpuid < 0) { |
439 | prom_printf("OF: Serious problem, cpu lacks " | 393 | prom_printf("OF: Serious problem, cpu lacks " |
440 | "%s property", this_mid_prop); | 394 | "%s property", this_mid_prop); |
441 | prom_halt(); | 395 | prom_halt(); |
442 | } | 396 | } |
443 | |||
444 | ncpus_probed++; | ||
445 | |||
446 | #ifdef CONFIG_SMP | 397 | #ifdef CONFIG_SMP |
447 | if (cpuid >= NR_CPUS) { | 398 | if (cpuid >= NR_CPUS) { |
448 | printk(KERN_WARNING "Ignoring CPU %d which is " | 399 | printk(KERN_WARNING "Ignoring CPU %d which is " |
@@ -450,79 +401,142 @@ void __init of_fill_in_cpu_data(void) | |||
450 | cpuid, NR_CPUS); | 401 | cpuid, NR_CPUS); |
451 | continue; | 402 | continue; |
452 | } | 403 | } |
453 | #else | ||
454 | /* On uniprocessor we only want the values for the | ||
455 | * real physical cpu the kernel booted onto, however | ||
456 | * cpu_data() only has one entry at index 0. | ||
457 | */ | ||
458 | if (cpuid != real_hard_smp_processor_id()) | ||
459 | continue; | ||
460 | cpuid = 0; | ||
461 | #endif | 404 | #endif |
405 | ret = func(dp, cpuid, arg); | ||
406 | if (ret) | ||
407 | return ret; | ||
408 | } | ||
409 | return NULL; | ||
410 | } | ||
462 | 411 | ||
463 | cpu_data(cpuid).clock_tick = | 412 | static void *check_cpu_node(struct device_node *dp, int cpuid, int id) |
464 | of_getintprop_default(dp, "clock-frequency", 0); | 413 | { |
465 | 414 | if (id == cpuid) | |
466 | if (portid_parent) { | 415 | return dp; |
467 | cpu_data(cpuid).dcache_size = | 416 | return NULL; |
468 | of_getintprop_default(dp, "l1-dcache-size", | 417 | } |
469 | 16 * 1024); | 418 | |
470 | cpu_data(cpuid).dcache_line_size = | 419 | struct device_node *of_find_node_by_cpuid(int cpuid) |
471 | of_getintprop_default(dp, "l1-dcache-line-size", | 420 | { |
472 | 32); | 421 | return of_iterate_over_cpus(check_cpu_node, cpuid); |
473 | cpu_data(cpuid).icache_size = | 422 | } |
474 | of_getintprop_default(dp, "l1-icache-size", | 423 | |
475 | 8 * 1024); | 424 | static void *record_one_cpu(struct device_node *dp, int cpuid, int arg) |
476 | cpu_data(cpuid).icache_line_size = | 425 | { |
477 | of_getintprop_default(dp, "l1-icache-line-size", | 426 | ncpus_probed++; |
478 | 32); | ||
479 | cpu_data(cpuid).ecache_size = | ||
480 | of_getintprop_default(dp, "l2-cache-size", 0); | ||
481 | cpu_data(cpuid).ecache_line_size = | ||
482 | of_getintprop_default(dp, "l2-cache-line-size", 0); | ||
483 | if (!cpu_data(cpuid).ecache_size || | ||
484 | !cpu_data(cpuid).ecache_line_size) { | ||
485 | cpu_data(cpuid).ecache_size = | ||
486 | of_getintprop_default(portid_parent, | ||
487 | "l2-cache-size", | ||
488 | (4 * 1024 * 1024)); | ||
489 | cpu_data(cpuid).ecache_line_size = | ||
490 | of_getintprop_default(portid_parent, | ||
491 | "l2-cache-line-size", 64); | ||
492 | } | ||
493 | |||
494 | cpu_data(cpuid).core_id = portid + 1; | ||
495 | cpu_data(cpuid).proc_id = portid; | ||
496 | #ifdef CONFIG_SMP | 427 | #ifdef CONFIG_SMP |
497 | sparc64_multi_core = 1; | 428 | set_cpu_present(cpuid, true); |
429 | set_cpu_possible(cpuid, true); | ||
498 | #endif | 430 | #endif |
499 | } else { | 431 | return NULL; |
500 | cpu_data(cpuid).dcache_size = | 432 | } |
501 | of_getintprop_default(dp, "dcache-size", 16 * 1024); | ||
502 | cpu_data(cpuid).dcache_line_size = | ||
503 | of_getintprop_default(dp, "dcache-line-size", 32); | ||
504 | 433 | ||
505 | cpu_data(cpuid).icache_size = | 434 | void __init of_populate_present_mask(void) |
506 | of_getintprop_default(dp, "icache-size", 16 * 1024); | 435 | { |
507 | cpu_data(cpuid).icache_line_size = | 436 | if (tlb_type == hypervisor) |
508 | of_getintprop_default(dp, "icache-line-size", 32); | 437 | return; |
438 | |||
439 | ncpus_probed = 0; | ||
440 | of_iterate_over_cpus(record_one_cpu, 0); | ||
441 | } | ||
509 | 442 | ||
443 | static void *fill_in_one_cpu(struct device_node *dp, int cpuid, int arg) | ||
444 | { | ||
445 | struct device_node *portid_parent = NULL; | ||
446 | int portid = -1; | ||
447 | |||
448 | if (of_find_property(dp, "cpuid", NULL)) { | ||
449 | int limit = 2; | ||
450 | |||
451 | portid_parent = dp; | ||
452 | while (limit--) { | ||
453 | portid_parent = portid_parent->parent; | ||
454 | if (!portid_parent) | ||
455 | break; | ||
456 | portid = of_getintprop_default(portid_parent, | ||
457 | "portid", -1); | ||
458 | if (portid >= 0) | ||
459 | break; | ||
460 | } | ||
461 | } | ||
462 | |||
463 | #ifndef CONFIG_SMP | ||
464 | /* On uniprocessor we only want the values for the | ||
465 | * real physical cpu the kernel booted onto, however | ||
466 | * cpu_data() only has one entry at index 0. | ||
467 | */ | ||
468 | if (cpuid != real_hard_smp_processor_id()) | ||
469 | return NULL; | ||
470 | cpuid = 0; | ||
471 | #endif | ||
472 | |||
473 | cpu_data(cpuid).clock_tick = | ||
474 | of_getintprop_default(dp, "clock-frequency", 0); | ||
475 | |||
476 | if (portid_parent) { | ||
477 | cpu_data(cpuid).dcache_size = | ||
478 | of_getintprop_default(dp, "l1-dcache-size", | ||
479 | 16 * 1024); | ||
480 | cpu_data(cpuid).dcache_line_size = | ||
481 | of_getintprop_default(dp, "l1-dcache-line-size", | ||
482 | 32); | ||
483 | cpu_data(cpuid).icache_size = | ||
484 | of_getintprop_default(dp, "l1-icache-size", | ||
485 | 8 * 1024); | ||
486 | cpu_data(cpuid).icache_line_size = | ||
487 | of_getintprop_default(dp, "l1-icache-line-size", | ||
488 | 32); | ||
489 | cpu_data(cpuid).ecache_size = | ||
490 | of_getintprop_default(dp, "l2-cache-size", 0); | ||
491 | cpu_data(cpuid).ecache_line_size = | ||
492 | of_getintprop_default(dp, "l2-cache-line-size", 0); | ||
493 | if (!cpu_data(cpuid).ecache_size || | ||
494 | !cpu_data(cpuid).ecache_line_size) { | ||
510 | cpu_data(cpuid).ecache_size = | 495 | cpu_data(cpuid).ecache_size = |
511 | of_getintprop_default(dp, "ecache-size", | 496 | of_getintprop_default(portid_parent, |
497 | "l2-cache-size", | ||
512 | (4 * 1024 * 1024)); | 498 | (4 * 1024 * 1024)); |
513 | cpu_data(cpuid).ecache_line_size = | 499 | cpu_data(cpuid).ecache_line_size = |
514 | of_getintprop_default(dp, "ecache-line-size", 64); | 500 | of_getintprop_default(portid_parent, |
515 | 501 | "l2-cache-line-size", 64); | |
516 | cpu_data(cpuid).core_id = 0; | ||
517 | cpu_data(cpuid).proc_id = -1; | ||
518 | } | 502 | } |
519 | 503 | ||
504 | cpu_data(cpuid).core_id = portid + 1; | ||
505 | cpu_data(cpuid).proc_id = portid; | ||
520 | #ifdef CONFIG_SMP | 506 | #ifdef CONFIG_SMP |
521 | set_cpu_present(cpuid, true); | 507 | sparc64_multi_core = 1; |
522 | set_cpu_possible(cpuid, true); | ||
523 | #endif | 508 | #endif |
509 | } else { | ||
510 | cpu_data(cpuid).dcache_size = | ||
511 | of_getintprop_default(dp, "dcache-size", 16 * 1024); | ||
512 | cpu_data(cpuid).dcache_line_size = | ||
513 | of_getintprop_default(dp, "dcache-line-size", 32); | ||
514 | |||
515 | cpu_data(cpuid).icache_size = | ||
516 | of_getintprop_default(dp, "icache-size", 16 * 1024); | ||
517 | cpu_data(cpuid).icache_line_size = | ||
518 | of_getintprop_default(dp, "icache-line-size", 32); | ||
519 | |||
520 | cpu_data(cpuid).ecache_size = | ||
521 | of_getintprop_default(dp, "ecache-size", | ||
522 | (4 * 1024 * 1024)); | ||
523 | cpu_data(cpuid).ecache_line_size = | ||
524 | of_getintprop_default(dp, "ecache-line-size", 64); | ||
525 | |||
526 | cpu_data(cpuid).core_id = 0; | ||
527 | cpu_data(cpuid).proc_id = -1; | ||
524 | } | 528 | } |
525 | 529 | ||
530 | return NULL; | ||
531 | } | ||
532 | |||
533 | void __init of_fill_in_cpu_data(void) | ||
534 | { | ||
535 | if (tlb_type == hypervisor) | ||
536 | return; | ||
537 | |||
538 | of_iterate_over_cpus(fill_in_one_cpu, 0); | ||
539 | |||
526 | smp_fill_in_sib_core_maps(); | 540 | smp_fill_in_sib_core_maps(); |
527 | } | 541 | } |
528 | 542 | ||
diff --git a/arch/sparc/kernel/prom_common.c b/arch/sparc/kernel/prom_common.c index ff7b591c8946..0fb5789d43c8 100644 --- a/arch/sparc/kernel/prom_common.c +++ b/arch/sparc/kernel/prom_common.c | |||
@@ -313,6 +313,4 @@ void __init prom_build_devicetree(void) | |||
313 | 313 | ||
314 | printk("PROM: Built device tree with %u bytes of memory.\n", | 314 | printk("PROM: Built device tree with %u bytes of memory.\n", |
315 | prom_early_allocated); | 315 | prom_early_allocated); |
316 | |||
317 | of_fill_in_cpu_data(); | ||
318 | } | 316 | } |
diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c index f7642e5a94db..fa44eaf8d897 100644 --- a/arch/sparc/kernel/smp_64.c +++ b/arch/sparc/kernel/smp_64.c | |||
@@ -20,7 +20,8 @@ | |||
20 | #include <linux/cache.h> | 20 | #include <linux/cache.h> |
21 | #include <linux/jiffies.h> | 21 | #include <linux/jiffies.h> |
22 | #include <linux/profile.h> | 22 | #include <linux/profile.h> |
23 | #include <linux/lmb.h> | 23 | #include <linux/bootmem.h> |
24 | #include <linux/vmalloc.h> | ||
24 | #include <linux/cpu.h> | 25 | #include <linux/cpu.h> |
25 | 26 | ||
26 | #include <asm/head.h> | 27 | #include <asm/head.h> |
@@ -47,6 +48,8 @@ | |||
47 | #include <asm/ldc.h> | 48 | #include <asm/ldc.h> |
48 | #include <asm/hypervisor.h> | 49 | #include <asm/hypervisor.h> |
49 | 50 | ||
51 | #include "cpumap.h" | ||
52 | |||
50 | int sparc64_multi_core __read_mostly; | 53 | int sparc64_multi_core __read_mostly; |
51 | 54 | ||
52 | DEFINE_PER_CPU(cpumask_t, cpu_sibling_map) = CPU_MASK_NONE; | 55 | DEFINE_PER_CPU(cpumask_t, cpu_sibling_map) = CPU_MASK_NONE; |
@@ -278,7 +281,7 @@ static unsigned long kimage_addr_to_ra(void *p) | |||
278 | return kern_base + (val - KERNBASE); | 281 | return kern_base + (val - KERNBASE); |
279 | } | 282 | } |
280 | 283 | ||
281 | static void __cpuinit ldom_startcpu_cpuid(unsigned int cpu, unsigned long thread_reg) | 284 | static void __cpuinit ldom_startcpu_cpuid(unsigned int cpu, unsigned long thread_reg, void **descrp) |
282 | { | 285 | { |
283 | extern unsigned long sparc64_ttable_tl0; | 286 | extern unsigned long sparc64_ttable_tl0; |
284 | extern unsigned long kern_locked_tte_data; | 287 | extern unsigned long kern_locked_tte_data; |
@@ -298,12 +301,12 @@ static void __cpuinit ldom_startcpu_cpuid(unsigned int cpu, unsigned long thread | |||
298 | "hvtramp_descr.\n"); | 301 | "hvtramp_descr.\n"); |
299 | return; | 302 | return; |
300 | } | 303 | } |
304 | *descrp = hdesc; | ||
301 | 305 | ||
302 | hdesc->cpu = cpu; | 306 | hdesc->cpu = cpu; |
303 | hdesc->num_mappings = num_kernel_image_mappings; | 307 | hdesc->num_mappings = num_kernel_image_mappings; |
304 | 308 | ||
305 | tb = &trap_block[cpu]; | 309 | tb = &trap_block[cpu]; |
306 | tb->hdesc = hdesc; | ||
307 | 310 | ||
308 | hdesc->fault_info_va = (unsigned long) &tb->fault_info; | 311 | hdesc->fault_info_va = (unsigned long) &tb->fault_info; |
309 | hdesc->fault_info_pa = kimage_addr_to_ra(&tb->fault_info); | 312 | hdesc->fault_info_pa = kimage_addr_to_ra(&tb->fault_info); |
@@ -341,12 +344,12 @@ static struct thread_info *cpu_new_thread = NULL; | |||
341 | 344 | ||
342 | static int __cpuinit smp_boot_one_cpu(unsigned int cpu) | 345 | static int __cpuinit smp_boot_one_cpu(unsigned int cpu) |
343 | { | 346 | { |
344 | struct trap_per_cpu *tb = &trap_block[cpu]; | ||
345 | unsigned long entry = | 347 | unsigned long entry = |
346 | (unsigned long)(&sparc64_cpu_startup); | 348 | (unsigned long)(&sparc64_cpu_startup); |
347 | unsigned long cookie = | 349 | unsigned long cookie = |
348 | (unsigned long)(&cpu_new_thread); | 350 | (unsigned long)(&cpu_new_thread); |
349 | struct task_struct *p; | 351 | struct task_struct *p; |
352 | void *descr = NULL; | ||
350 | int timeout, ret; | 353 | int timeout, ret; |
351 | 354 | ||
352 | p = fork_idle(cpu); | 355 | p = fork_idle(cpu); |
@@ -359,7 +362,8 @@ static int __cpuinit smp_boot_one_cpu(unsigned int cpu) | |||
359 | #if defined(CONFIG_SUN_LDOMS) && defined(CONFIG_HOTPLUG_CPU) | 362 | #if defined(CONFIG_SUN_LDOMS) && defined(CONFIG_HOTPLUG_CPU) |
360 | if (ldom_domaining_enabled) | 363 | if (ldom_domaining_enabled) |
361 | ldom_startcpu_cpuid(cpu, | 364 | ldom_startcpu_cpuid(cpu, |
362 | (unsigned long) cpu_new_thread); | 365 | (unsigned long) cpu_new_thread, |
366 | &descr); | ||
363 | else | 367 | else |
364 | #endif | 368 | #endif |
365 | prom_startcpu_cpuid(cpu, entry, cookie); | 369 | prom_startcpu_cpuid(cpu, entry, cookie); |
@@ -383,10 +387,7 @@ static int __cpuinit smp_boot_one_cpu(unsigned int cpu) | |||
383 | } | 387 | } |
384 | cpu_new_thread = NULL; | 388 | cpu_new_thread = NULL; |
385 | 389 | ||
386 | if (tb->hdesc) { | 390 | kfree(descr); |
387 | kfree(tb->hdesc); | ||
388 | tb->hdesc = NULL; | ||
389 | } | ||
390 | 391 | ||
391 | return ret; | 392 | return ret; |
392 | } | 393 | } |
@@ -1315,6 +1316,8 @@ int __cpu_disable(void) | |||
1315 | cpu_clear(cpu, cpu_online_map); | 1316 | cpu_clear(cpu, cpu_online_map); |
1316 | ipi_call_unlock(); | 1317 | ipi_call_unlock(); |
1317 | 1318 | ||
1319 | cpu_map_rebuild(); | ||
1320 | |||
1318 | return 0; | 1321 | return 0; |
1319 | } | 1322 | } |
1320 | 1323 | ||
@@ -1373,36 +1376,171 @@ void smp_send_stop(void) | |||
1373 | { | 1376 | { |
1374 | } | 1377 | } |
1375 | 1378 | ||
1376 | unsigned long __per_cpu_base __read_mostly; | 1379 | /** |
1377 | unsigned long __per_cpu_shift __read_mostly; | 1380 | * pcpu_alloc_bootmem - NUMA friendly alloc_bootmem wrapper for percpu |
1381 | * @cpu: cpu to allocate for | ||
1382 | * @size: size allocation in bytes | ||
1383 | * @align: alignment | ||
1384 | * | ||
1385 | * Allocate @size bytes aligned at @align for cpu @cpu. This wrapper | ||
1386 | * does the right thing for NUMA regardless of the current | ||
1387 | * configuration. | ||
1388 | * | ||
1389 | * RETURNS: | ||
1390 | * Pointer to the allocated area on success, NULL on failure. | ||
1391 | */ | ||
1392 | static void * __init pcpu_alloc_bootmem(unsigned int cpu, unsigned long size, | ||
1393 | unsigned long align) | ||
1394 | { | ||
1395 | const unsigned long goal = __pa(MAX_DMA_ADDRESS); | ||
1396 | #ifdef CONFIG_NEED_MULTIPLE_NODES | ||
1397 | int node = cpu_to_node(cpu); | ||
1398 | void *ptr; | ||
1399 | |||
1400 | if (!node_online(node) || !NODE_DATA(node)) { | ||
1401 | ptr = __alloc_bootmem(size, align, goal); | ||
1402 | pr_info("cpu %d has no node %d or node-local memory\n", | ||
1403 | cpu, node); | ||
1404 | pr_debug("per cpu data for cpu%d %lu bytes at %016lx\n", | ||
1405 | cpu, size, __pa(ptr)); | ||
1406 | } else { | ||
1407 | ptr = __alloc_bootmem_node(NODE_DATA(node), | ||
1408 | size, align, goal); | ||
1409 | pr_debug("per cpu data for cpu%d %lu bytes on node%d at " | ||
1410 | "%016lx\n", cpu, size, node, __pa(ptr)); | ||
1411 | } | ||
1412 | return ptr; | ||
1413 | #else | ||
1414 | return __alloc_bootmem(size, align, goal); | ||
1415 | #endif | ||
1416 | } | ||
1378 | 1417 | ||
1379 | EXPORT_SYMBOL(__per_cpu_base); | 1418 | static size_t pcpur_size __initdata; |
1380 | EXPORT_SYMBOL(__per_cpu_shift); | 1419 | static void **pcpur_ptrs __initdata; |
1381 | 1420 | ||
1382 | void __init real_setup_per_cpu_areas(void) | 1421 | static struct page * __init pcpur_get_page(unsigned int cpu, int pageno) |
1383 | { | 1422 | { |
1384 | unsigned long paddr, goal, size, i; | 1423 | size_t off = (size_t)pageno << PAGE_SHIFT; |
1385 | char *ptr; | ||
1386 | 1424 | ||
1387 | /* Copy section for each CPU (we discard the original) */ | 1425 | if (off >= pcpur_size) |
1388 | goal = PERCPU_ENOUGH_ROOM; | 1426 | return NULL; |
1389 | 1427 | ||
1390 | __per_cpu_shift = PAGE_SHIFT; | 1428 | return virt_to_page(pcpur_ptrs[cpu] + off); |
1391 | for (size = PAGE_SIZE; size < goal; size <<= 1UL) | 1429 | } |
1392 | __per_cpu_shift++; | 1430 | |
1431 | #define PCPU_CHUNK_SIZE (4UL * 1024UL * 1024UL) | ||
1432 | |||
1433 | static void __init pcpu_map_range(unsigned long start, unsigned long end, | ||
1434 | struct page *page) | ||
1435 | { | ||
1436 | unsigned long pfn = page_to_pfn(page); | ||
1437 | unsigned long pte_base; | ||
1438 | |||
1439 | BUG_ON((pfn<<PAGE_SHIFT)&(PCPU_CHUNK_SIZE - 1UL)); | ||
1440 | |||
1441 | pte_base = (_PAGE_VALID | _PAGE_SZ4MB_4U | | ||
1442 | _PAGE_CP_4U | _PAGE_CV_4U | | ||
1443 | _PAGE_P_4U | _PAGE_W_4U); | ||
1444 | if (tlb_type == hypervisor) | ||
1445 | pte_base = (_PAGE_VALID | _PAGE_SZ4MB_4V | | ||
1446 | _PAGE_CP_4V | _PAGE_CV_4V | | ||
1447 | _PAGE_P_4V | _PAGE_W_4V); | ||
1448 | |||
1449 | while (start < end) { | ||
1450 | pgd_t *pgd = pgd_offset_k(start); | ||
1451 | unsigned long this_end; | ||
1452 | pud_t *pud; | ||
1453 | pmd_t *pmd; | ||
1454 | pte_t *pte; | ||
1455 | |||
1456 | pud = pud_offset(pgd, start); | ||
1457 | if (pud_none(*pud)) { | ||
1458 | pmd_t *new; | ||
1459 | |||
1460 | new = __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, PAGE_SIZE); | ||
1461 | pud_populate(&init_mm, pud, new); | ||
1462 | } | ||
1463 | |||
1464 | pmd = pmd_offset(pud, start); | ||
1465 | if (!pmd_present(*pmd)) { | ||
1466 | pte_t *new; | ||
1467 | |||
1468 | new = __alloc_bootmem(PAGE_SIZE, PAGE_SIZE, PAGE_SIZE); | ||
1469 | pmd_populate_kernel(&init_mm, pmd, new); | ||
1470 | } | ||
1393 | 1471 | ||
1394 | paddr = lmb_alloc(size * NR_CPUS, PAGE_SIZE); | 1472 | pte = pte_offset_kernel(pmd, start); |
1395 | if (!paddr) { | 1473 | this_end = (start + PMD_SIZE) & PMD_MASK; |
1396 | prom_printf("Cannot allocate per-cpu memory.\n"); | 1474 | if (this_end > end) |
1397 | prom_halt(); | 1475 | this_end = end; |
1476 | |||
1477 | while (start < this_end) { | ||
1478 | unsigned long paddr = pfn << PAGE_SHIFT; | ||
1479 | |||
1480 | pte_val(*pte) = (paddr | pte_base); | ||
1481 | |||
1482 | start += PAGE_SIZE; | ||
1483 | pte++; | ||
1484 | pfn++; | ||
1485 | } | ||
1486 | } | ||
1487 | } | ||
1488 | |||
1489 | void __init setup_per_cpu_areas(void) | ||
1490 | { | ||
1491 | size_t dyn_size, static_size = __per_cpu_end - __per_cpu_start; | ||
1492 | static struct vm_struct vm; | ||
1493 | unsigned long delta, cpu; | ||
1494 | size_t pcpu_unit_size; | ||
1495 | size_t ptrs_size; | ||
1496 | |||
1497 | pcpur_size = PFN_ALIGN(static_size + PERCPU_MODULE_RESERVE + | ||
1498 | PERCPU_DYNAMIC_RESERVE); | ||
1499 | dyn_size = pcpur_size - static_size - PERCPU_MODULE_RESERVE; | ||
1500 | |||
1501 | |||
1502 | ptrs_size = PFN_ALIGN(num_possible_cpus() * sizeof(pcpur_ptrs[0])); | ||
1503 | pcpur_ptrs = alloc_bootmem(ptrs_size); | ||
1504 | |||
1505 | for_each_possible_cpu(cpu) { | ||
1506 | pcpur_ptrs[cpu] = pcpu_alloc_bootmem(cpu, PCPU_CHUNK_SIZE, | ||
1507 | PCPU_CHUNK_SIZE); | ||
1508 | |||
1509 | free_bootmem(__pa(pcpur_ptrs[cpu] + pcpur_size), | ||
1510 | PCPU_CHUNK_SIZE - pcpur_size); | ||
1511 | |||
1512 | memcpy(pcpur_ptrs[cpu], __per_cpu_load, static_size); | ||
1398 | } | 1513 | } |
1399 | 1514 | ||
1400 | ptr = __va(paddr); | 1515 | /* allocate address and map */ |
1401 | __per_cpu_base = ptr - __per_cpu_start; | 1516 | vm.flags = VM_ALLOC; |
1517 | vm.size = num_possible_cpus() * PCPU_CHUNK_SIZE; | ||
1518 | vm_area_register_early(&vm, PCPU_CHUNK_SIZE); | ||
1519 | |||
1520 | for_each_possible_cpu(cpu) { | ||
1521 | unsigned long start = (unsigned long) vm.addr; | ||
1522 | unsigned long end; | ||
1523 | |||
1524 | start += cpu * PCPU_CHUNK_SIZE; | ||
1525 | end = start + PCPU_CHUNK_SIZE; | ||
1526 | pcpu_map_range(start, end, virt_to_page(pcpur_ptrs[cpu])); | ||
1527 | } | ||
1402 | 1528 | ||
1403 | for (i = 0; i < NR_CPUS; i++, ptr += size) | 1529 | pcpu_unit_size = pcpu_setup_first_chunk(pcpur_get_page, static_size, |
1404 | memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start); | 1530 | PERCPU_MODULE_RESERVE, dyn_size, |
1531 | PCPU_CHUNK_SIZE, vm.addr, NULL); | ||
1532 | |||
1533 | free_bootmem(__pa(pcpur_ptrs), ptrs_size); | ||
1534 | |||
1535 | delta = (unsigned long)pcpu_base_addr - (unsigned long)__per_cpu_start; | ||
1536 | for_each_possible_cpu(cpu) { | ||
1537 | __per_cpu_offset(cpu) = delta + cpu * pcpu_unit_size; | ||
1538 | } | ||
1405 | 1539 | ||
1406 | /* Setup %g5 for the boot cpu. */ | 1540 | /* Setup %g5 for the boot cpu. */ |
1407 | __local_per_cpu_offset = __per_cpu_offset(smp_processor_id()); | 1541 | __local_per_cpu_offset = __per_cpu_offset(smp_processor_id()); |
1542 | |||
1543 | of_fill_in_cpu_data(); | ||
1544 | if (tlb_type == hypervisor) | ||
1545 | mdesc_fill_in_cpu_data(cpu_all_mask); | ||
1408 | } | 1546 | } |
diff --git a/arch/sparc/kernel/systbls_32.S b/arch/sparc/kernel/systbls_32.S index 00ec3b15f38c..690901657291 100644 --- a/arch/sparc/kernel/systbls_32.S +++ b/arch/sparc/kernel/systbls_32.S | |||
@@ -81,4 +81,6 @@ sys_call_table: | |||
81 | /*305*/ .long sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait | 81 | /*305*/ .long sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait |
82 | /*310*/ .long sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate | 82 | /*310*/ .long sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate |
83 | /*315*/ .long sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 | 83 | /*315*/ .long sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 |
84 | /*320*/ .long sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4, sys_preadv, sys_pwritev | 84 | /*320*/ .long sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4, sys_preadv |
85 | /*325*/ .long sys_pwritev, sys_rt_tgsigqueueinfo | ||
86 | |||
diff --git a/arch/sparc/kernel/systbls_64.S b/arch/sparc/kernel/systbls_64.S index 82b5bf85b9d2..6b3ee88e253c 100644 --- a/arch/sparc/kernel/systbls_64.S +++ b/arch/sparc/kernel/systbls_64.S | |||
@@ -82,7 +82,8 @@ sys_call_table32: | |||
82 | .word compat_sys_set_mempolicy, compat_sys_kexec_load, compat_sys_move_pages, sys_getcpu, compat_sys_epoll_pwait | 82 | .word compat_sys_set_mempolicy, compat_sys_kexec_load, compat_sys_move_pages, sys_getcpu, compat_sys_epoll_pwait |
83 | /*310*/ .word compat_sys_utimensat, compat_sys_signalfd, sys_timerfd_create, sys_eventfd, compat_sys_fallocate | 83 | /*310*/ .word compat_sys_utimensat, compat_sys_signalfd, sys_timerfd_create, sys_eventfd, compat_sys_fallocate |
84 | .word compat_sys_timerfd_settime, compat_sys_timerfd_gettime, compat_sys_signalfd4, sys_eventfd2, sys_epoll_create1 | 84 | .word compat_sys_timerfd_settime, compat_sys_timerfd_gettime, compat_sys_signalfd4, sys_eventfd2, sys_epoll_create1 |
85 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4, compat_sys_preadv, compat_sys_pwritev | 85 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4, compat_sys_preadv |
86 | .word compat_sys_pwritev, compat_sys_rt_tgsigqueueinfo | ||
86 | 87 | ||
87 | #endif /* CONFIG_COMPAT */ | 88 | #endif /* CONFIG_COMPAT */ |
88 | 89 | ||
@@ -156,4 +157,5 @@ sys_call_table: | |||
156 | .word sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait | 157 | .word sys_set_mempolicy, sys_kexec_load, sys_move_pages, sys_getcpu, sys_epoll_pwait |
157 | /*310*/ .word sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate | 158 | /*310*/ .word sys_utimensat, sys_signalfd, sys_timerfd_create, sys_eventfd, sys_fallocate |
158 | .word sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 | 159 | .word sys_timerfd_settime, sys_timerfd_gettime, sys_signalfd4, sys_eventfd2, sys_epoll_create1 |
159 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4, sys_preadv, sys_pwritev | 160 | /*320*/ .word sys_dup3, sys_pipe2, sys_inotify_init1, sys_accept4, sys_preadv |
161 | .word sys_pwritev, sys_rt_tgsigqueueinfo | ||
diff --git a/arch/sparc/kernel/traps_64.c b/arch/sparc/kernel/traps_64.c index d809c4ebb48f..10f7bb9fc140 100644 --- a/arch/sparc/kernel/traps_64.c +++ b/arch/sparc/kernel/traps_64.c | |||
@@ -2509,6 +2509,7 @@ void do_getpsr(struct pt_regs *regs) | |||
2509 | } | 2509 | } |
2510 | 2510 | ||
2511 | struct trap_per_cpu trap_block[NR_CPUS]; | 2511 | struct trap_per_cpu trap_block[NR_CPUS]; |
2512 | EXPORT_SYMBOL(trap_block); | ||
2512 | 2513 | ||
2513 | /* This can get invoked before sched_init() so play it super safe | 2514 | /* This can get invoked before sched_init() so play it super safe |
2514 | * and use hard_smp_processor_id(). | 2515 | * and use hard_smp_processor_id(). |
@@ -2530,84 +2531,97 @@ extern void tsb_config_offsets_are_bolixed_dave(void); | |||
2530 | void __init trap_init(void) | 2531 | void __init trap_init(void) |
2531 | { | 2532 | { |
2532 | /* Compile time sanity check. */ | 2533 | /* Compile time sanity check. */ |
2533 | if (TI_TASK != offsetof(struct thread_info, task) || | 2534 | BUILD_BUG_ON(TI_TASK != offsetof(struct thread_info, task) || |
2534 | TI_FLAGS != offsetof(struct thread_info, flags) || | 2535 | TI_FLAGS != offsetof(struct thread_info, flags) || |
2535 | TI_CPU != offsetof(struct thread_info, cpu) || | 2536 | TI_CPU != offsetof(struct thread_info, cpu) || |
2536 | TI_FPSAVED != offsetof(struct thread_info, fpsaved) || | 2537 | TI_FPSAVED != offsetof(struct thread_info, fpsaved) || |
2537 | TI_KSP != offsetof(struct thread_info, ksp) || | 2538 | TI_KSP != offsetof(struct thread_info, ksp) || |
2538 | TI_FAULT_ADDR != offsetof(struct thread_info, fault_address) || | 2539 | TI_FAULT_ADDR != offsetof(struct thread_info, |
2539 | TI_KREGS != offsetof(struct thread_info, kregs) || | 2540 | fault_address) || |
2540 | TI_UTRAPS != offsetof(struct thread_info, utraps) || | 2541 | TI_KREGS != offsetof(struct thread_info, kregs) || |
2541 | TI_EXEC_DOMAIN != offsetof(struct thread_info, exec_domain) || | 2542 | TI_UTRAPS != offsetof(struct thread_info, utraps) || |
2542 | TI_REG_WINDOW != offsetof(struct thread_info, reg_window) || | 2543 | TI_EXEC_DOMAIN != offsetof(struct thread_info, |
2543 | TI_RWIN_SPTRS != offsetof(struct thread_info, rwbuf_stkptrs) || | 2544 | exec_domain) || |
2544 | TI_GSR != offsetof(struct thread_info, gsr) || | 2545 | TI_REG_WINDOW != offsetof(struct thread_info, |
2545 | TI_XFSR != offsetof(struct thread_info, xfsr) || | 2546 | reg_window) || |
2546 | TI_USER_CNTD0 != offsetof(struct thread_info, user_cntd0) || | 2547 | TI_RWIN_SPTRS != offsetof(struct thread_info, |
2547 | TI_USER_CNTD1 != offsetof(struct thread_info, user_cntd1) || | 2548 | rwbuf_stkptrs) || |
2548 | TI_KERN_CNTD0 != offsetof(struct thread_info, kernel_cntd0) || | 2549 | TI_GSR != offsetof(struct thread_info, gsr) || |
2549 | TI_KERN_CNTD1 != offsetof(struct thread_info, kernel_cntd1) || | 2550 | TI_XFSR != offsetof(struct thread_info, xfsr) || |
2550 | TI_PCR != offsetof(struct thread_info, pcr_reg) || | 2551 | TI_USER_CNTD0 != offsetof(struct thread_info, |
2551 | TI_PRE_COUNT != offsetof(struct thread_info, preempt_count) || | 2552 | user_cntd0) || |
2552 | TI_NEW_CHILD != offsetof(struct thread_info, new_child) || | 2553 | TI_USER_CNTD1 != offsetof(struct thread_info, |
2553 | TI_SYS_NOERROR != offsetof(struct thread_info, syscall_noerror) || | 2554 | user_cntd1) || |
2554 | TI_RESTART_BLOCK != offsetof(struct thread_info, restart_block) || | 2555 | TI_KERN_CNTD0 != offsetof(struct thread_info, |
2555 | TI_KUNA_REGS != offsetof(struct thread_info, kern_una_regs) || | 2556 | kernel_cntd0) || |
2556 | TI_KUNA_INSN != offsetof(struct thread_info, kern_una_insn) || | 2557 | TI_KERN_CNTD1 != offsetof(struct thread_info, |
2557 | TI_FPREGS != offsetof(struct thread_info, fpregs) || | 2558 | kernel_cntd1) || |
2558 | (TI_FPREGS & (64 - 1))) | 2559 | TI_PCR != offsetof(struct thread_info, pcr_reg) || |
2559 | thread_info_offsets_are_bolixed_dave(); | 2560 | TI_PRE_COUNT != offsetof(struct thread_info, |
2560 | 2561 | preempt_count) || | |
2561 | if (TRAP_PER_CPU_THREAD != offsetof(struct trap_per_cpu, thread) || | 2562 | TI_NEW_CHILD != offsetof(struct thread_info, new_child) || |
2562 | (TRAP_PER_CPU_PGD_PADDR != | 2563 | TI_SYS_NOERROR != offsetof(struct thread_info, |
2563 | offsetof(struct trap_per_cpu, pgd_paddr)) || | 2564 | syscall_noerror) || |
2564 | (TRAP_PER_CPU_CPU_MONDO_PA != | 2565 | TI_RESTART_BLOCK != offsetof(struct thread_info, |
2565 | offsetof(struct trap_per_cpu, cpu_mondo_pa)) || | 2566 | restart_block) || |
2566 | (TRAP_PER_CPU_DEV_MONDO_PA != | 2567 | TI_KUNA_REGS != offsetof(struct thread_info, |
2567 | offsetof(struct trap_per_cpu, dev_mondo_pa)) || | 2568 | kern_una_regs) || |
2568 | (TRAP_PER_CPU_RESUM_MONDO_PA != | 2569 | TI_KUNA_INSN != offsetof(struct thread_info, |
2569 | offsetof(struct trap_per_cpu, resum_mondo_pa)) || | 2570 | kern_una_insn) || |
2570 | (TRAP_PER_CPU_RESUM_KBUF_PA != | 2571 | TI_FPREGS != offsetof(struct thread_info, fpregs) || |
2571 | offsetof(struct trap_per_cpu, resum_kernel_buf_pa)) || | 2572 | (TI_FPREGS & (64 - 1))); |
2572 | (TRAP_PER_CPU_NONRESUM_MONDO_PA != | 2573 | |
2573 | offsetof(struct trap_per_cpu, nonresum_mondo_pa)) || | 2574 | BUILD_BUG_ON(TRAP_PER_CPU_THREAD != offsetof(struct trap_per_cpu, |
2574 | (TRAP_PER_CPU_NONRESUM_KBUF_PA != | 2575 | thread) || |
2575 | offsetof(struct trap_per_cpu, nonresum_kernel_buf_pa)) || | 2576 | (TRAP_PER_CPU_PGD_PADDR != |
2576 | (TRAP_PER_CPU_FAULT_INFO != | 2577 | offsetof(struct trap_per_cpu, pgd_paddr)) || |
2577 | offsetof(struct trap_per_cpu, fault_info)) || | 2578 | (TRAP_PER_CPU_CPU_MONDO_PA != |
2578 | (TRAP_PER_CPU_CPU_MONDO_BLOCK_PA != | 2579 | offsetof(struct trap_per_cpu, cpu_mondo_pa)) || |
2579 | offsetof(struct trap_per_cpu, cpu_mondo_block_pa)) || | 2580 | (TRAP_PER_CPU_DEV_MONDO_PA != |
2580 | (TRAP_PER_CPU_CPU_LIST_PA != | 2581 | offsetof(struct trap_per_cpu, dev_mondo_pa)) || |
2581 | offsetof(struct trap_per_cpu, cpu_list_pa)) || | 2582 | (TRAP_PER_CPU_RESUM_MONDO_PA != |
2582 | (TRAP_PER_CPU_TSB_HUGE != | 2583 | offsetof(struct trap_per_cpu, resum_mondo_pa)) || |
2583 | offsetof(struct trap_per_cpu, tsb_huge)) || | 2584 | (TRAP_PER_CPU_RESUM_KBUF_PA != |
2584 | (TRAP_PER_CPU_TSB_HUGE_TEMP != | 2585 | offsetof(struct trap_per_cpu, resum_kernel_buf_pa)) || |
2585 | offsetof(struct trap_per_cpu, tsb_huge_temp)) || | 2586 | (TRAP_PER_CPU_NONRESUM_MONDO_PA != |
2586 | (TRAP_PER_CPU_IRQ_WORKLIST_PA != | 2587 | offsetof(struct trap_per_cpu, nonresum_mondo_pa)) || |
2587 | offsetof(struct trap_per_cpu, irq_worklist_pa)) || | 2588 | (TRAP_PER_CPU_NONRESUM_KBUF_PA != |
2588 | (TRAP_PER_CPU_CPU_MONDO_QMASK != | 2589 | offsetof(struct trap_per_cpu, nonresum_kernel_buf_pa)) || |
2589 | offsetof(struct trap_per_cpu, cpu_mondo_qmask)) || | 2590 | (TRAP_PER_CPU_FAULT_INFO != |
2590 | (TRAP_PER_CPU_DEV_MONDO_QMASK != | 2591 | offsetof(struct trap_per_cpu, fault_info)) || |
2591 | offsetof(struct trap_per_cpu, dev_mondo_qmask)) || | 2592 | (TRAP_PER_CPU_CPU_MONDO_BLOCK_PA != |
2592 | (TRAP_PER_CPU_RESUM_QMASK != | 2593 | offsetof(struct trap_per_cpu, cpu_mondo_block_pa)) || |
2593 | offsetof(struct trap_per_cpu, resum_qmask)) || | 2594 | (TRAP_PER_CPU_CPU_LIST_PA != |
2594 | (TRAP_PER_CPU_NONRESUM_QMASK != | 2595 | offsetof(struct trap_per_cpu, cpu_list_pa)) || |
2595 | offsetof(struct trap_per_cpu, nonresum_qmask))) | 2596 | (TRAP_PER_CPU_TSB_HUGE != |
2596 | trap_per_cpu_offsets_are_bolixed_dave(); | 2597 | offsetof(struct trap_per_cpu, tsb_huge)) || |
2597 | 2598 | (TRAP_PER_CPU_TSB_HUGE_TEMP != | |
2598 | if ((TSB_CONFIG_TSB != | 2599 | offsetof(struct trap_per_cpu, tsb_huge_temp)) || |
2599 | offsetof(struct tsb_config, tsb)) || | 2600 | (TRAP_PER_CPU_IRQ_WORKLIST_PA != |
2600 | (TSB_CONFIG_RSS_LIMIT != | 2601 | offsetof(struct trap_per_cpu, irq_worklist_pa)) || |
2601 | offsetof(struct tsb_config, tsb_rss_limit)) || | 2602 | (TRAP_PER_CPU_CPU_MONDO_QMASK != |
2602 | (TSB_CONFIG_NENTRIES != | 2603 | offsetof(struct trap_per_cpu, cpu_mondo_qmask)) || |
2603 | offsetof(struct tsb_config, tsb_nentries)) || | 2604 | (TRAP_PER_CPU_DEV_MONDO_QMASK != |
2604 | (TSB_CONFIG_REG_VAL != | 2605 | offsetof(struct trap_per_cpu, dev_mondo_qmask)) || |
2605 | offsetof(struct tsb_config, tsb_reg_val)) || | 2606 | (TRAP_PER_CPU_RESUM_QMASK != |
2606 | (TSB_CONFIG_MAP_VADDR != | 2607 | offsetof(struct trap_per_cpu, resum_qmask)) || |
2607 | offsetof(struct tsb_config, tsb_map_vaddr)) || | 2608 | (TRAP_PER_CPU_NONRESUM_QMASK != |
2608 | (TSB_CONFIG_MAP_PTE != | 2609 | offsetof(struct trap_per_cpu, nonresum_qmask)) || |
2609 | offsetof(struct tsb_config, tsb_map_pte))) | 2610 | (TRAP_PER_CPU_PER_CPU_BASE != |
2610 | tsb_config_offsets_are_bolixed_dave(); | 2611 | offsetof(struct trap_per_cpu, __per_cpu_base))); |
2612 | |||
2613 | BUILD_BUG_ON((TSB_CONFIG_TSB != | ||
2614 | offsetof(struct tsb_config, tsb)) || | ||
2615 | (TSB_CONFIG_RSS_LIMIT != | ||
2616 | offsetof(struct tsb_config, tsb_rss_limit)) || | ||
2617 | (TSB_CONFIG_NENTRIES != | ||
2618 | offsetof(struct tsb_config, tsb_nentries)) || | ||
2619 | (TSB_CONFIG_REG_VAL != | ||
2620 | offsetof(struct tsb_config, tsb_reg_val)) || | ||
2621 | (TSB_CONFIG_MAP_VADDR != | ||
2622 | offsetof(struct tsb_config, tsb_map_vaddr)) || | ||
2623 | (TSB_CONFIG_MAP_PTE != | ||
2624 | offsetof(struct tsb_config, tsb_map_pte))); | ||
2611 | 2625 | ||
2612 | /* Attach to the address space of init_task. On SMP we | 2626 | /* Attach to the address space of init_task. On SMP we |
2613 | * do this in smp.c:smp_callin for other cpus. | 2627 | * do this in smp.c:smp_callin for other cpus. |
diff --git a/arch/sparc/mm/init_32.c b/arch/sparc/mm/init_32.c index cbb282dab5a7..26bb3919ff1f 100644 --- a/arch/sparc/mm/init_32.c +++ b/arch/sparc/mm/init_32.c | |||
@@ -358,6 +358,7 @@ void __init paging_init(void) | |||
358 | protection_map[15] = PAGE_SHARED; | 358 | protection_map[15] = PAGE_SHARED; |
359 | btfixup(); | 359 | btfixup(); |
360 | prom_build_devicetree(); | 360 | prom_build_devicetree(); |
361 | of_fill_in_cpu_data(); | ||
361 | device_scan(); | 362 | device_scan(); |
362 | } | 363 | } |
363 | 364 | ||
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index f26a352c08a0..ca92e2f54e4d 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c | |||
@@ -1679,11 +1679,6 @@ pgd_t swapper_pg_dir[2048]; | |||
1679 | static void sun4u_pgprot_init(void); | 1679 | static void sun4u_pgprot_init(void); |
1680 | static void sun4v_pgprot_init(void); | 1680 | static void sun4v_pgprot_init(void); |
1681 | 1681 | ||
1682 | /* Dummy function */ | ||
1683 | void __init setup_per_cpu_areas(void) | ||
1684 | { | ||
1685 | } | ||
1686 | |||
1687 | void __init paging_init(void) | 1682 | void __init paging_init(void) |
1688 | { | 1683 | { |
1689 | unsigned long end_pfn, shift, phys_base; | 1684 | unsigned long end_pfn, shift, phys_base; |
@@ -1799,16 +1794,13 @@ void __init paging_init(void) | |||
1799 | if (tlb_type == hypervisor) | 1794 | if (tlb_type == hypervisor) |
1800 | sun4v_ktsb_register(); | 1795 | sun4v_ktsb_register(); |
1801 | 1796 | ||
1802 | /* We must setup the per-cpu areas before we pull in the | ||
1803 | * PROM and the MDESC. The code there fills in cpu and | ||
1804 | * other information into per-cpu data structures. | ||
1805 | */ | ||
1806 | real_setup_per_cpu_areas(); | ||
1807 | |||
1808 | prom_build_devicetree(); | 1797 | prom_build_devicetree(); |
1798 | of_populate_present_mask(); | ||
1809 | 1799 | ||
1810 | if (tlb_type == hypervisor) | 1800 | if (tlb_type == hypervisor) { |
1811 | sun4v_mdesc_init(); | 1801 | sun4v_mdesc_init(); |
1802 | mdesc_populate_present_mask(cpu_all_mask); | ||
1803 | } | ||
1812 | 1804 | ||
1813 | /* Once the OF device tree and MDESC have been setup, we know | 1805 | /* Once the OF device tree and MDESC have been setup, we know |
1814 | * the list of possible cpus. Therefore we can allocate the | 1806 | * the list of possible cpus. Therefore we can allocate the |
diff --git a/arch/sparc/mm/srmmu.c b/arch/sparc/mm/srmmu.c index 06c9a7d98206..ade4eb373bdd 100644 --- a/arch/sparc/mm/srmmu.c +++ b/arch/sparc/mm/srmmu.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/fs.h> | 19 | #include <linux/fs.h> |
20 | #include <linux/seq_file.h> | 20 | #include <linux/seq_file.h> |
21 | #include <linux/kdebug.h> | 21 | #include <linux/kdebug.h> |
22 | #include <linux/log2.h> | ||
22 | 23 | ||
23 | #include <asm/bitext.h> | 24 | #include <asm/bitext.h> |
24 | #include <asm/page.h> | 25 | #include <asm/page.h> |
@@ -349,7 +350,7 @@ static void srmmu_free_nocache(unsigned long vaddr, int size) | |||
349 | vaddr, srmmu_nocache_end); | 350 | vaddr, srmmu_nocache_end); |
350 | BUG(); | 351 | BUG(); |
351 | } | 352 | } |
352 | if (size & (size-1)) { | 353 | if (!is_power_of_2(size)) { |
353 | printk("Size 0x%x is not a power of 2\n", size); | 354 | printk("Size 0x%x is not a power of 2\n", size); |
354 | BUG(); | 355 | BUG(); |
355 | } | 356 | } |
diff --git a/arch/um/drivers/net_kern.c b/arch/um/drivers/net_kern.c index 434ba121e3c5..3b44b47c7e1d 100644 --- a/arch/um/drivers/net_kern.c +++ b/arch/um/drivers/net_kern.c | |||
@@ -360,7 +360,7 @@ static struct platform_driver uml_net_driver = { | |||
360 | 360 | ||
361 | static void net_device_release(struct device *dev) | 361 | static void net_device_release(struct device *dev) |
362 | { | 362 | { |
363 | struct uml_net *device = dev->driver_data; | 363 | struct uml_net *device = dev_get_drvdata(dev); |
364 | struct net_device *netdev = device->dev; | 364 | struct net_device *netdev = device->dev; |
365 | struct uml_net_private *lp = netdev_priv(netdev); | 365 | struct uml_net_private *lp = netdev_priv(netdev); |
366 | 366 | ||
@@ -440,7 +440,7 @@ static void eth_configure(int n, void *init, char *mac, | |||
440 | device->pdev.id = n; | 440 | device->pdev.id = n; |
441 | device->pdev.name = DRIVER_NAME; | 441 | device->pdev.name = DRIVER_NAME; |
442 | device->pdev.dev.release = net_device_release; | 442 | device->pdev.dev.release = net_device_release; |
443 | device->pdev.dev.driver_data = device; | 443 | dev_set_drvdata(&device->pdev.dev, device); |
444 | if (platform_device_register(&device->pdev)) | 444 | if (platform_device_register(&device->pdev)) |
445 | goto out_free_netdev; | 445 | goto out_free_netdev; |
446 | SET_NETDEV_DEV(dev,&device->pdev.dev); | 446 | SET_NETDEV_DEV(dev,&device->pdev.dev); |
diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c index aa9e926e13d7..8f05d4d9da12 100644 --- a/arch/um/drivers/ubd_kern.c +++ b/arch/um/drivers/ubd_kern.c | |||
@@ -778,7 +778,7 @@ static int ubd_open_dev(struct ubd *ubd_dev) | |||
778 | 778 | ||
779 | static void ubd_device_release(struct device *dev) | 779 | static void ubd_device_release(struct device *dev) |
780 | { | 780 | { |
781 | struct ubd *ubd_dev = dev->driver_data; | 781 | struct ubd *ubd_dev = dev_get_drvdata(dev); |
782 | 782 | ||
783 | blk_cleanup_queue(ubd_dev->queue); | 783 | blk_cleanup_queue(ubd_dev->queue); |
784 | *ubd_dev = ((struct ubd) DEFAULT_UBD); | 784 | *ubd_dev = ((struct ubd) DEFAULT_UBD); |
@@ -807,7 +807,7 @@ static int ubd_disk_register(int major, u64 size, int unit, | |||
807 | ubd_devs[unit].pdev.id = unit; | 807 | ubd_devs[unit].pdev.id = unit; |
808 | ubd_devs[unit].pdev.name = DRIVER_NAME; | 808 | ubd_devs[unit].pdev.name = DRIVER_NAME; |
809 | ubd_devs[unit].pdev.dev.release = ubd_device_release; | 809 | ubd_devs[unit].pdev.dev.release = ubd_device_release; |
810 | ubd_devs[unit].pdev.dev.driver_data = &ubd_devs[unit]; | 810 | dev_set_drvdata(&ubd_devs[unit].pdev.dev, &ubd_devs[unit]); |
811 | platform_device_register(&ubd_devs[unit].pdev); | 811 | platform_device_register(&ubd_devs[unit].pdev); |
812 | disk->driverfs_dev = &ubd_devs[unit].pdev.dev; | 812 | disk->driverfs_dev = &ubd_devs[unit].pdev.dev; |
813 | } | 813 | } |
diff --git a/arch/um/include/shared/init.h b/arch/um/include/shared/init.h index 37dd097c16c0..b3906f860a87 100644 --- a/arch/um/include/shared/init.h +++ b/arch/um/include/shared/init.h | |||
@@ -27,7 +27,7 @@ | |||
27 | * sign followed by value, e.g.: | 27 | * sign followed by value, e.g.: |
28 | * | 28 | * |
29 | * static int init_variable __initdata = 0; | 29 | * static int init_variable __initdata = 0; |
30 | * static char linux_logo[] __initdata = { 0x32, 0x36, ... }; | 30 | * static const char linux_logo[] __initconst = { 0x32, 0x36, ... }; |
31 | * | 31 | * |
32 | * Don't forget to initialize data not at file scope, i.e. within a function, | 32 | * Don't forget to initialize data not at file scope, i.e. within a function, |
33 | * as gcc otherwise puts the data into the bss section and not into the init | 33 | * as gcc otherwise puts the data into the bss section and not into the init |
diff --git a/arch/um/include/shared/net_user.h b/arch/um/include/shared/net_user.h index 63bee158cd8e..3dabbe128e40 100644 --- a/arch/um/include/shared/net_user.h +++ b/arch/um/include/shared/net_user.h | |||
@@ -8,7 +8,7 @@ | |||
8 | 8 | ||
9 | #define ETH_ADDR_LEN (6) | 9 | #define ETH_ADDR_LEN (6) |
10 | #define ETH_HEADER_ETHERTAP (16) | 10 | #define ETH_HEADER_ETHERTAP (16) |
11 | #define ETH_HEADER_OTHER (14) | 11 | #define ETH_HEADER_OTHER (26) /* 14 for ethernet + VLAN + MPLS for crazy people */ |
12 | #define ETH_MAX_PACKET (1500) | 12 | #define ETH_MAX_PACKET (1500) |
13 | 13 | ||
14 | #define UML_NET_VERSION (4) | 14 | #define UML_NET_VERSION (4) |
diff --git a/arch/um/kernel/init_task.c b/arch/um/kernel/init_task.c index 806d381947bf..b25121b537d8 100644 --- a/arch/um/kernel/init_task.c +++ b/arch/um/kernel/init_task.c | |||
@@ -10,11 +10,8 @@ | |||
10 | #include "linux/mqueue.h" | 10 | #include "linux/mqueue.h" |
11 | #include "asm/uaccess.h" | 11 | #include "asm/uaccess.h" |
12 | 12 | ||
13 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
14 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 13 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
15 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 14 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
16 | EXPORT_SYMBOL(init_mm); | ||
17 | |||
18 | /* | 15 | /* |
19 | * Initial task structure. | 16 | * Initial task structure. |
20 | * | 17 | * |
diff --git a/arch/um/kernel/irq.c b/arch/um/kernel/irq.c index 336b61569072..454cdb43e351 100644 --- a/arch/um/kernel/irq.c +++ b/arch/um/kernel/irq.c | |||
@@ -358,7 +358,7 @@ EXPORT_SYMBOL(um_request_irq); | |||
358 | EXPORT_SYMBOL(reactivate_fd); | 358 | EXPORT_SYMBOL(reactivate_fd); |
359 | 359 | ||
360 | /* | 360 | /* |
361 | * hw_interrupt_type must define (startup || enable) && | 361 | * irq_chip must define (startup || enable) && |
362 | * (shutdown || disable) && end | 362 | * (shutdown || disable) && end |
363 | */ | 363 | */ |
364 | static void dummy(unsigned int irq) | 364 | static void dummy(unsigned int irq) |
@@ -366,7 +366,7 @@ static void dummy(unsigned int irq) | |||
366 | } | 366 | } |
367 | 367 | ||
368 | /* This is used for everything else than the timer. */ | 368 | /* This is used for everything else than the timer. */ |
369 | static struct hw_interrupt_type normal_irq_type = { | 369 | static struct irq_chip normal_irq_type = { |
370 | .typename = "SIGIO", | 370 | .typename = "SIGIO", |
371 | .release = free_irq_by_irq_and_dev, | 371 | .release = free_irq_by_irq_and_dev, |
372 | .disable = dummy, | 372 | .disable = dummy, |
@@ -375,7 +375,7 @@ static struct hw_interrupt_type normal_irq_type = { | |||
375 | .end = dummy | 375 | .end = dummy |
376 | }; | 376 | }; |
377 | 377 | ||
378 | static struct hw_interrupt_type SIGVTALRM_irq_type = { | 378 | static struct irq_chip SIGVTALRM_irq_type = { |
379 | .typename = "SIGVTALRM", | 379 | .typename = "SIGVTALRM", |
380 | .release = free_irq_by_irq_and_dev, | 380 | .release = free_irq_by_irq_and_dev, |
381 | .shutdown = dummy, /* never called */ | 381 | .shutdown = dummy, /* never called */ |
diff --git a/arch/um/sys-i386/stub.S b/arch/um/sys-i386/stub.S index c41b04bf5fa0..54a36ec20cb7 100644 --- a/arch/um/sys-i386/stub.S +++ b/arch/um/sys-i386/stub.S | |||
@@ -1,7 +1,7 @@ | |||
1 | #include "as-layout.h" | 1 | #include "as-layout.h" |
2 | 2 | ||
3 | .globl syscall_stub | 3 | .globl syscall_stub |
4 | .section .__syscall_stub, "x" | 4 | .section .__syscall_stub, "ax" |
5 | 5 | ||
6 | .globl batch_syscall_stub | 6 | .globl batch_syscall_stub |
7 | batch_syscall_stub: | 7 | batch_syscall_stub: |
diff --git a/arch/um/sys-x86_64/asm/elf.h b/arch/um/sys-x86_64/asm/elf.h index 6e8a9195e952..04b9e87c8dad 100644 --- a/arch/um/sys-x86_64/asm/elf.h +++ b/arch/um/sys-x86_64/asm/elf.h | |||
@@ -66,28 +66,28 @@ typedef struct user_i387_struct elf_fpregset_t; | |||
66 | PT_REGS_R15(regs) = 0; \ | 66 | PT_REGS_R15(regs) = 0; \ |
67 | } while (0) | 67 | } while (0) |
68 | 68 | ||
69 | #define ELF_CORE_COPY_REGS(pr_reg, regs) \ | 69 | #define ELF_CORE_COPY_REGS(pr_reg, _regs) \ |
70 | (pr_reg)[0] = (regs)->regs.gp[0]; \ | 70 | (pr_reg)[0] = (_regs)->regs.gp[0]; \ |
71 | (pr_reg)[1] = (regs)->regs.gp[1]; \ | 71 | (pr_reg)[1] = (_regs)->regs.gp[1]; \ |
72 | (pr_reg)[2] = (regs)->regs.gp[2]; \ | 72 | (pr_reg)[2] = (_regs)->regs.gp[2]; \ |
73 | (pr_reg)[3] = (regs)->regs.gp[3]; \ | 73 | (pr_reg)[3] = (_regs)->regs.gp[3]; \ |
74 | (pr_reg)[4] = (regs)->regs.gp[4]; \ | 74 | (pr_reg)[4] = (_regs)->regs.gp[4]; \ |
75 | (pr_reg)[5] = (regs)->regs.gp[5]; \ | 75 | (pr_reg)[5] = (_regs)->regs.gp[5]; \ |
76 | (pr_reg)[6] = (regs)->regs.gp[6]; \ | 76 | (pr_reg)[6] = (_regs)->regs.gp[6]; \ |
77 | (pr_reg)[7] = (regs)->regs.gp[7]; \ | 77 | (pr_reg)[7] = (_regs)->regs.gp[7]; \ |
78 | (pr_reg)[8] = (regs)->regs.gp[8]; \ | 78 | (pr_reg)[8] = (_regs)->regs.gp[8]; \ |
79 | (pr_reg)[9] = (regs)->regs.gp[9]; \ | 79 | (pr_reg)[9] = (_regs)->regs.gp[9]; \ |
80 | (pr_reg)[10] = (regs)->regs.gp[10]; \ | 80 | (pr_reg)[10] = (_regs)->regs.gp[10]; \ |
81 | (pr_reg)[11] = (regs)->regs.gp[11]; \ | 81 | (pr_reg)[11] = (_regs)->regs.gp[11]; \ |
82 | (pr_reg)[12] = (regs)->regs.gp[12]; \ | 82 | (pr_reg)[12] = (_regs)->regs.gp[12]; \ |
83 | (pr_reg)[13] = (regs)->regs.gp[13]; \ | 83 | (pr_reg)[13] = (_regs)->regs.gp[13]; \ |
84 | (pr_reg)[14] = (regs)->regs.gp[14]; \ | 84 | (pr_reg)[14] = (_regs)->regs.gp[14]; \ |
85 | (pr_reg)[15] = (regs)->regs.gp[15]; \ | 85 | (pr_reg)[15] = (_regs)->regs.gp[15]; \ |
86 | (pr_reg)[16] = (regs)->regs.gp[16]; \ | 86 | (pr_reg)[16] = (_regs)->regs.gp[16]; \ |
87 | (pr_reg)[17] = (regs)->regs.gp[17]; \ | 87 | (pr_reg)[17] = (_regs)->regs.gp[17]; \ |
88 | (pr_reg)[18] = (regs)->regs.gp[18]; \ | 88 | (pr_reg)[18] = (_regs)->regs.gp[18]; \ |
89 | (pr_reg)[19] = (regs)->regs.gp[19]; \ | 89 | (pr_reg)[19] = (_regs)->regs.gp[19]; \ |
90 | (pr_reg)[20] = (regs)->regs.gp[20]; \ | 90 | (pr_reg)[20] = (_regs)->regs.gp[20]; \ |
91 | (pr_reg)[21] = current->thread.arch.fs; \ | 91 | (pr_reg)[21] = current->thread.arch.fs; \ |
92 | (pr_reg)[22] = 0; \ | 92 | (pr_reg)[22] = 0; \ |
93 | (pr_reg)[23] = 0; \ | 93 | (pr_reg)[23] = 0; \ |
diff --git a/arch/um/sys-x86_64/stub.S b/arch/um/sys-x86_64/stub.S index 6d9edf9fabce..20e4a96a6dcb 100644 --- a/arch/um/sys-x86_64/stub.S +++ b/arch/um/sys-x86_64/stub.S | |||
@@ -1,7 +1,7 @@ | |||
1 | #include "as-layout.h" | 1 | #include "as-layout.h" |
2 | 2 | ||
3 | .globl syscall_stub | 3 | .globl syscall_stub |
4 | .section .__syscall_stub, "x" | 4 | .section .__syscall_stub, "ax" |
5 | syscall_stub: | 5 | syscall_stub: |
6 | syscall | 6 | syscall |
7 | /* We don't have 64-bit constants, so this constructs the address | 7 | /* We don't have 64-bit constants, so this constructs the address |
diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig index 356d2ec8e2fb..cf42fc305419 100644 --- a/arch/x86/Kconfig +++ b/arch/x86/Kconfig | |||
@@ -46,6 +46,7 @@ config X86 | |||
46 | select HAVE_KERNEL_GZIP | 46 | select HAVE_KERNEL_GZIP |
47 | select HAVE_KERNEL_BZIP2 | 47 | select HAVE_KERNEL_BZIP2 |
48 | select HAVE_KERNEL_LZMA | 48 | select HAVE_KERNEL_LZMA |
49 | select HAVE_ARCH_KMEMCHECK | ||
49 | 50 | ||
50 | config OUTPUT_FORMAT | 51 | config OUTPUT_FORMAT |
51 | string | 52 | string |
diff --git a/arch/x86/Makefile b/arch/x86/Makefile index edbd0ca62067..1b68659c41b4 100644 --- a/arch/x86/Makefile +++ b/arch/x86/Makefile | |||
@@ -81,6 +81,11 @@ ifdef CONFIG_CC_STACKPROTECTOR | |||
81 | endif | 81 | endif |
82 | endif | 82 | endif |
83 | 83 | ||
84 | # Don't unroll struct assignments with kmemcheck enabled | ||
85 | ifeq ($(CONFIG_KMEMCHECK),y) | ||
86 | KBUILD_CFLAGS += $(call cc-option,-fno-builtin-memcpy) | ||
87 | endif | ||
88 | |||
84 | # Stackpointer is addressed different for 32 bit and 64 bit x86 | 89 | # Stackpointer is addressed different for 32 bit and 64 bit x86 |
85 | sp-$(CONFIG_X86_32) := esp | 90 | sp-$(CONFIG_X86_32) := esp |
86 | sp-$(CONFIG_X86_64) := rsp | 91 | sp-$(CONFIG_X86_64) := rsp |
diff --git a/arch/x86/include/asm/dma-mapping.h b/arch/x86/include/asm/dma-mapping.h index f82fdc412c64..b93405b228b4 100644 --- a/arch/x86/include/asm/dma-mapping.h +++ b/arch/x86/include/asm/dma-mapping.h | |||
@@ -6,6 +6,7 @@ | |||
6 | * Documentation/DMA-API.txt for documentation. | 6 | * Documentation/DMA-API.txt for documentation. |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <linux/kmemcheck.h> | ||
9 | #include <linux/scatterlist.h> | 10 | #include <linux/scatterlist.h> |
10 | #include <linux/dma-debug.h> | 11 | #include <linux/dma-debug.h> |
11 | #include <linux/dma-attrs.h> | 12 | #include <linux/dma-attrs.h> |
@@ -60,6 +61,7 @@ dma_map_single(struct device *hwdev, void *ptr, size_t size, | |||
60 | dma_addr_t addr; | 61 | dma_addr_t addr; |
61 | 62 | ||
62 | BUG_ON(!valid_dma_direction(dir)); | 63 | BUG_ON(!valid_dma_direction(dir)); |
64 | kmemcheck_mark_initialized(ptr, size); | ||
63 | addr = ops->map_page(hwdev, virt_to_page(ptr), | 65 | addr = ops->map_page(hwdev, virt_to_page(ptr), |
64 | (unsigned long)ptr & ~PAGE_MASK, size, | 66 | (unsigned long)ptr & ~PAGE_MASK, size, |
65 | dir, NULL); | 67 | dir, NULL); |
@@ -87,8 +89,12 @@ dma_map_sg(struct device *hwdev, struct scatterlist *sg, | |||
87 | { | 89 | { |
88 | struct dma_map_ops *ops = get_dma_ops(hwdev); | 90 | struct dma_map_ops *ops = get_dma_ops(hwdev); |
89 | int ents; | 91 | int ents; |
92 | struct scatterlist *s; | ||
93 | int i; | ||
90 | 94 | ||
91 | BUG_ON(!valid_dma_direction(dir)); | 95 | BUG_ON(!valid_dma_direction(dir)); |
96 | for_each_sg(sg, s, nents, i) | ||
97 | kmemcheck_mark_initialized(sg_virt(s), s->length); | ||
92 | ents = ops->map_sg(hwdev, sg, nents, dir, NULL); | 98 | ents = ops->map_sg(hwdev, sg, nents, dir, NULL); |
93 | debug_dma_map_sg(hwdev, sg, nents, ents, dir); | 99 | debug_dma_map_sg(hwdev, sg, nents, ents, dir); |
94 | 100 | ||
@@ -200,6 +206,7 @@ static inline dma_addr_t dma_map_page(struct device *dev, struct page *page, | |||
200 | dma_addr_t addr; | 206 | dma_addr_t addr; |
201 | 207 | ||
202 | BUG_ON(!valid_dma_direction(dir)); | 208 | BUG_ON(!valid_dma_direction(dir)); |
209 | kmemcheck_mark_initialized(page_address(page) + offset, size); | ||
203 | addr = ops->map_page(dev, page, offset, size, dir, NULL); | 210 | addr = ops->map_page(dev, page, offset, size, dir, NULL); |
204 | debug_dma_map_page(dev, page, offset, size, dir, addr, false); | 211 | debug_dma_map_page(dev, page, offset, size, dir, addr, false); |
205 | 212 | ||
diff --git a/arch/x86/include/asm/kmap_types.h b/arch/x86/include/asm/kmap_types.h index 5759c165a5cf..9e00a731a7fb 100644 --- a/arch/x86/include/asm/kmap_types.h +++ b/arch/x86/include/asm/kmap_types.h | |||
@@ -2,28 +2,11 @@ | |||
2 | #define _ASM_X86_KMAP_TYPES_H | 2 | #define _ASM_X86_KMAP_TYPES_H |
3 | 3 | ||
4 | #if defined(CONFIG_X86_32) && defined(CONFIG_DEBUG_HIGHMEM) | 4 | #if defined(CONFIG_X86_32) && defined(CONFIG_DEBUG_HIGHMEM) |
5 | # define D(n) __KM_FENCE_##n , | 5 | #define __WITH_KM_FENCE |
6 | #else | ||
7 | # define D(n) | ||
8 | #endif | 6 | #endif |
9 | 7 | ||
10 | enum km_type { | 8 | #include <asm-generic/kmap_types.h> |
11 | D(0) KM_BOUNCE_READ, | ||
12 | D(1) KM_SKB_SUNRPC_DATA, | ||
13 | D(2) KM_SKB_DATA_SOFTIRQ, | ||
14 | D(3) KM_USER0, | ||
15 | D(4) KM_USER1, | ||
16 | D(5) KM_BIO_SRC_IRQ, | ||
17 | D(6) KM_BIO_DST_IRQ, | ||
18 | D(7) KM_PTE0, | ||
19 | D(8) KM_PTE1, | ||
20 | D(9) KM_IRQ0, | ||
21 | D(10) KM_IRQ1, | ||
22 | D(11) KM_SOFTIRQ0, | ||
23 | D(12) KM_SOFTIRQ1, | ||
24 | D(13) KM_TYPE_NR | ||
25 | }; | ||
26 | 9 | ||
27 | #undef D | 10 | #undef __WITH_KM_FENCE |
28 | 11 | ||
29 | #endif /* _ASM_X86_KMAP_TYPES_H */ | 12 | #endif /* _ASM_X86_KMAP_TYPES_H */ |
diff --git a/arch/x86/include/asm/kmemcheck.h b/arch/x86/include/asm/kmemcheck.h new file mode 100644 index 000000000000..ed01518f297e --- /dev/null +++ b/arch/x86/include/asm/kmemcheck.h | |||
@@ -0,0 +1,42 @@ | |||
1 | #ifndef ASM_X86_KMEMCHECK_H | ||
2 | #define ASM_X86_KMEMCHECK_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | #include <asm/ptrace.h> | ||
6 | |||
7 | #ifdef CONFIG_KMEMCHECK | ||
8 | bool kmemcheck_active(struct pt_regs *regs); | ||
9 | |||
10 | void kmemcheck_show(struct pt_regs *regs); | ||
11 | void kmemcheck_hide(struct pt_regs *regs); | ||
12 | |||
13 | bool kmemcheck_fault(struct pt_regs *regs, | ||
14 | unsigned long address, unsigned long error_code); | ||
15 | bool kmemcheck_trap(struct pt_regs *regs); | ||
16 | #else | ||
17 | static inline bool kmemcheck_active(struct pt_regs *regs) | ||
18 | { | ||
19 | return false; | ||
20 | } | ||
21 | |||
22 | static inline void kmemcheck_show(struct pt_regs *regs) | ||
23 | { | ||
24 | } | ||
25 | |||
26 | static inline void kmemcheck_hide(struct pt_regs *regs) | ||
27 | { | ||
28 | } | ||
29 | |||
30 | static inline bool kmemcheck_fault(struct pt_regs *regs, | ||
31 | unsigned long address, unsigned long error_code) | ||
32 | { | ||
33 | return false; | ||
34 | } | ||
35 | |||
36 | static inline bool kmemcheck_trap(struct pt_regs *regs) | ||
37 | { | ||
38 | return false; | ||
39 | } | ||
40 | #endif /* CONFIG_KMEMCHECK */ | ||
41 | |||
42 | #endif | ||
diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h index 18ef7ebf2631..3cc06e3fceb8 100644 --- a/arch/x86/include/asm/pgtable.h +++ b/arch/x86/include/asm/pgtable.h | |||
@@ -317,6 +317,11 @@ static inline int pte_present(pte_t a) | |||
317 | return pte_flags(a) & (_PAGE_PRESENT | _PAGE_PROTNONE); | 317 | return pte_flags(a) & (_PAGE_PRESENT | _PAGE_PROTNONE); |
318 | } | 318 | } |
319 | 319 | ||
320 | static inline int pte_hidden(pte_t pte) | ||
321 | { | ||
322 | return pte_flags(pte) & _PAGE_HIDDEN; | ||
323 | } | ||
324 | |||
320 | static inline int pmd_present(pmd_t pmd) | 325 | static inline int pmd_present(pmd_t pmd) |
321 | { | 326 | { |
322 | return pmd_flags(pmd) & _PAGE_PRESENT; | 327 | return pmd_flags(pmd) & _PAGE_PRESENT; |
diff --git a/arch/x86/include/asm/pgtable_types.h b/arch/x86/include/asm/pgtable_types.h index 4d258ad76a0f..54cb697f4900 100644 --- a/arch/x86/include/asm/pgtable_types.h +++ b/arch/x86/include/asm/pgtable_types.h | |||
@@ -18,7 +18,7 @@ | |||
18 | #define _PAGE_BIT_GLOBAL 8 /* Global TLB entry PPro+ */ | 18 | #define _PAGE_BIT_GLOBAL 8 /* Global TLB entry PPro+ */ |
19 | #define _PAGE_BIT_UNUSED1 9 /* available for programmer */ | 19 | #define _PAGE_BIT_UNUSED1 9 /* available for programmer */ |
20 | #define _PAGE_BIT_IOMAP 10 /* flag used to indicate IO mapping */ | 20 | #define _PAGE_BIT_IOMAP 10 /* flag used to indicate IO mapping */ |
21 | #define _PAGE_BIT_UNUSED3 11 | 21 | #define _PAGE_BIT_HIDDEN 11 /* hidden by kmemcheck */ |
22 | #define _PAGE_BIT_PAT_LARGE 12 /* On 2MB or 1GB pages */ | 22 | #define _PAGE_BIT_PAT_LARGE 12 /* On 2MB or 1GB pages */ |
23 | #define _PAGE_BIT_SPECIAL _PAGE_BIT_UNUSED1 | 23 | #define _PAGE_BIT_SPECIAL _PAGE_BIT_UNUSED1 |
24 | #define _PAGE_BIT_CPA_TEST _PAGE_BIT_UNUSED1 | 24 | #define _PAGE_BIT_CPA_TEST _PAGE_BIT_UNUSED1 |
@@ -41,13 +41,18 @@ | |||
41 | #define _PAGE_GLOBAL (_AT(pteval_t, 1) << _PAGE_BIT_GLOBAL) | 41 | #define _PAGE_GLOBAL (_AT(pteval_t, 1) << _PAGE_BIT_GLOBAL) |
42 | #define _PAGE_UNUSED1 (_AT(pteval_t, 1) << _PAGE_BIT_UNUSED1) | 42 | #define _PAGE_UNUSED1 (_AT(pteval_t, 1) << _PAGE_BIT_UNUSED1) |
43 | #define _PAGE_IOMAP (_AT(pteval_t, 1) << _PAGE_BIT_IOMAP) | 43 | #define _PAGE_IOMAP (_AT(pteval_t, 1) << _PAGE_BIT_IOMAP) |
44 | #define _PAGE_UNUSED3 (_AT(pteval_t, 1) << _PAGE_BIT_UNUSED3) | ||
45 | #define _PAGE_PAT (_AT(pteval_t, 1) << _PAGE_BIT_PAT) | 44 | #define _PAGE_PAT (_AT(pteval_t, 1) << _PAGE_BIT_PAT) |
46 | #define _PAGE_PAT_LARGE (_AT(pteval_t, 1) << _PAGE_BIT_PAT_LARGE) | 45 | #define _PAGE_PAT_LARGE (_AT(pteval_t, 1) << _PAGE_BIT_PAT_LARGE) |
47 | #define _PAGE_SPECIAL (_AT(pteval_t, 1) << _PAGE_BIT_SPECIAL) | 46 | #define _PAGE_SPECIAL (_AT(pteval_t, 1) << _PAGE_BIT_SPECIAL) |
48 | #define _PAGE_CPA_TEST (_AT(pteval_t, 1) << _PAGE_BIT_CPA_TEST) | 47 | #define _PAGE_CPA_TEST (_AT(pteval_t, 1) << _PAGE_BIT_CPA_TEST) |
49 | #define __HAVE_ARCH_PTE_SPECIAL | 48 | #define __HAVE_ARCH_PTE_SPECIAL |
50 | 49 | ||
50 | #ifdef CONFIG_KMEMCHECK | ||
51 | #define _PAGE_HIDDEN (_AT(pteval_t, 1) << _PAGE_BIT_HIDDEN) | ||
52 | #else | ||
53 | #define _PAGE_HIDDEN (_AT(pteval_t, 0)) | ||
54 | #endif | ||
55 | |||
51 | #if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) | 56 | #if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) |
52 | #define _PAGE_NX (_AT(pteval_t, 1) << _PAGE_BIT_NX) | 57 | #define _PAGE_NX (_AT(pteval_t, 1) << _PAGE_BIT_NX) |
53 | #else | 58 | #else |
diff --git a/arch/x86/include/asm/string_32.h b/arch/x86/include/asm/string_32.h index 0e0e3ba827f7..c86f452256de 100644 --- a/arch/x86/include/asm/string_32.h +++ b/arch/x86/include/asm/string_32.h | |||
@@ -177,10 +177,18 @@ static inline void *__memcpy3d(void *to, const void *from, size_t len) | |||
177 | * No 3D Now! | 177 | * No 3D Now! |
178 | */ | 178 | */ |
179 | 179 | ||
180 | #ifndef CONFIG_KMEMCHECK | ||
180 | #define memcpy(t, f, n) \ | 181 | #define memcpy(t, f, n) \ |
181 | (__builtin_constant_p((n)) \ | 182 | (__builtin_constant_p((n)) \ |
182 | ? __constant_memcpy((t), (f), (n)) \ | 183 | ? __constant_memcpy((t), (f), (n)) \ |
183 | : __memcpy((t), (f), (n))) | 184 | : __memcpy((t), (f), (n))) |
185 | #else | ||
186 | /* | ||
187 | * kmemcheck becomes very happy if we use the REP instructions unconditionally, | ||
188 | * because it means that we know both memory operands in advance. | ||
189 | */ | ||
190 | #define memcpy(t, f, n) __memcpy((t), (f), (n)) | ||
191 | #endif | ||
184 | 192 | ||
185 | #endif | 193 | #endif |
186 | 194 | ||
diff --git a/arch/x86/include/asm/string_64.h b/arch/x86/include/asm/string_64.h index 2afe164bf1e6..19e2c468fc2c 100644 --- a/arch/x86/include/asm/string_64.h +++ b/arch/x86/include/asm/string_64.h | |||
@@ -27,6 +27,7 @@ static __always_inline void *__inline_memcpy(void *to, const void *from, size_t | |||
27 | function. */ | 27 | function. */ |
28 | 28 | ||
29 | #define __HAVE_ARCH_MEMCPY 1 | 29 | #define __HAVE_ARCH_MEMCPY 1 |
30 | #ifndef CONFIG_KMEMCHECK | ||
30 | #if (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4 | 31 | #if (__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4 |
31 | extern void *memcpy(void *to, const void *from, size_t len); | 32 | extern void *memcpy(void *to, const void *from, size_t len); |
32 | #else | 33 | #else |
@@ -42,6 +43,13 @@ extern void *__memcpy(void *to, const void *from, size_t len); | |||
42 | __ret; \ | 43 | __ret; \ |
43 | }) | 44 | }) |
44 | #endif | 45 | #endif |
46 | #else | ||
47 | /* | ||
48 | * kmemcheck becomes very happy if we use the REP instructions unconditionally, | ||
49 | * because it means that we know both memory operands in advance. | ||
50 | */ | ||
51 | #define memcpy(dst, src, len) __inline_memcpy((dst), (src), (len)) | ||
52 | #endif | ||
45 | 53 | ||
46 | #define __HAVE_ARCH_MEMSET | 54 | #define __HAVE_ARCH_MEMSET |
47 | void *memset(void *s, int c, size_t n); | 55 | void *memset(void *s, int c, size_t n); |
diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h index 602c769fc98c..b0783520988b 100644 --- a/arch/x86/include/asm/thread_info.h +++ b/arch/x86/include/asm/thread_info.h | |||
@@ -154,9 +154,9 @@ struct thread_info { | |||
154 | 154 | ||
155 | /* thread information allocation */ | 155 | /* thread information allocation */ |
156 | #ifdef CONFIG_DEBUG_STACK_USAGE | 156 | #ifdef CONFIG_DEBUG_STACK_USAGE |
157 | #define THREAD_FLAGS (GFP_KERNEL | __GFP_ZERO) | 157 | #define THREAD_FLAGS (GFP_KERNEL | __GFP_NOTRACK | __GFP_ZERO) |
158 | #else | 158 | #else |
159 | #define THREAD_FLAGS GFP_KERNEL | 159 | #define THREAD_FLAGS (GFP_KERNEL | __GFP_NOTRACK) |
160 | #endif | 160 | #endif |
161 | 161 | ||
162 | #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR | 162 | #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR |
diff --git a/arch/x86/include/asm/timex.h b/arch/x86/include/asm/timex.h index b5c9d45c981f..1375cfc93960 100644 --- a/arch/x86/include/asm/timex.h +++ b/arch/x86/include/asm/timex.h | |||
@@ -4,9 +4,7 @@ | |||
4 | #include <asm/processor.h> | 4 | #include <asm/processor.h> |
5 | #include <asm/tsc.h> | 5 | #include <asm/tsc.h> |
6 | 6 | ||
7 | /* The PIT ticks at this frequency (in HZ): */ | 7 | /* Assume we use the PIT time source for the clock tick */ |
8 | #define PIT_TICK_RATE 1193182 | ||
9 | |||
10 | #define CLOCK_TICK_RATE PIT_TICK_RATE | 8 | #define CLOCK_TICK_RATE PIT_TICK_RATE |
11 | 9 | ||
12 | #define ARCH_HAS_READ_CURRENT_TIMER | 10 | #define ARCH_HAS_READ_CURRENT_TIMER |
diff --git a/arch/x86/include/asm/xor.h b/arch/x86/include/asm/xor.h index 11b3bb86e17b..7fcf6f3dbcc3 100644 --- a/arch/x86/include/asm/xor.h +++ b/arch/x86/include/asm/xor.h | |||
@@ -1,5 +1,10 @@ | |||
1 | #ifdef CONFIG_KMEMCHECK | ||
2 | /* kmemcheck doesn't handle MMX/SSE/SSE2 instructions */ | ||
3 | # include <asm-generic/xor.h> | ||
4 | #else | ||
1 | #ifdef CONFIG_X86_32 | 5 | #ifdef CONFIG_X86_32 |
2 | # include "xor_32.h" | 6 | # include "xor_32.h" |
3 | #else | 7 | #else |
4 | # include "xor_64.h" | 8 | # include "xor_64.h" |
5 | #endif | 9 | #endif |
10 | #endif | ||
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c index 3ffdcfa9abdf..9fa33886c0d7 100644 --- a/arch/x86/kernel/cpu/common.c +++ b/arch/x86/kernel/cpu/common.c | |||
@@ -487,7 +487,6 @@ out: | |||
487 | static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c) | 487 | static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c) |
488 | { | 488 | { |
489 | char *v = c->x86_vendor_id; | 489 | char *v = c->x86_vendor_id; |
490 | static int printed; | ||
491 | int i; | 490 | int i; |
492 | 491 | ||
493 | for (i = 0; i < X86_VENDOR_NUM; i++) { | 492 | for (i = 0; i < X86_VENDOR_NUM; i++) { |
@@ -504,13 +503,9 @@ static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c) | |||
504 | } | 503 | } |
505 | } | 504 | } |
506 | 505 | ||
507 | if (!printed) { | 506 | printk_once(KERN_ERR |
508 | printed++; | 507 | "CPU: vendor_id '%s' unknown, using generic init.\n" \ |
509 | printk(KERN_ERR | 508 | "CPU: Your system may be unstable.\n", v); |
510 | "CPU: vendor_id '%s' unknown, using generic init.\n", v); | ||
511 | |||
512 | printk(KERN_ERR "CPU: Your system may be unstable.\n"); | ||
513 | } | ||
514 | 509 | ||
515 | c->x86_vendor = X86_VENDOR_UNKNOWN; | 510 | c->x86_vendor = X86_VENDOR_UNKNOWN; |
516 | this_cpu = &default_cpu; | 511 | this_cpu = &default_cpu; |
diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c index daed39ba2614..3260ab044996 100644 --- a/arch/x86/kernel/cpu/intel.c +++ b/arch/x86/kernel/cpu/intel.c | |||
@@ -86,6 +86,29 @@ static void __cpuinit early_init_intel(struct cpuinfo_x86 *c) | |||
86 | */ | 86 | */ |
87 | if (c->x86 == 6 && c->x86_model < 15) | 87 | if (c->x86 == 6 && c->x86_model < 15) |
88 | clear_cpu_cap(c, X86_FEATURE_PAT); | 88 | clear_cpu_cap(c, X86_FEATURE_PAT); |
89 | |||
90 | #ifdef CONFIG_KMEMCHECK | ||
91 | /* | ||
92 | * P4s have a "fast strings" feature which causes single- | ||
93 | * stepping REP instructions to only generate a #DB on | ||
94 | * cache-line boundaries. | ||
95 | * | ||
96 | * Ingo Molnar reported a Pentium D (model 6) and a Xeon | ||
97 | * (model 2) with the same problem. | ||
98 | */ | ||
99 | if (c->x86 == 15) { | ||
100 | u64 misc_enable; | ||
101 | |||
102 | rdmsrl(MSR_IA32_MISC_ENABLE, misc_enable); | ||
103 | |||
104 | if (misc_enable & MSR_IA32_MISC_ENABLE_FAST_STRING) { | ||
105 | printk(KERN_INFO "kmemcheck: Disabling fast string operations\n"); | ||
106 | |||
107 | misc_enable &= ~MSR_IA32_MISC_ENABLE_FAST_STRING; | ||
108 | wrmsrl(MSR_IA32_MISC_ENABLE, misc_enable); | ||
109 | } | ||
110 | } | ||
111 | #endif | ||
89 | } | 112 | } |
90 | 113 | ||
91 | #ifdef CONFIG_X86_32 | 114 | #ifdef CONFIG_X86_32 |
diff --git a/arch/x86/kernel/cpuid.c b/arch/x86/kernel/cpuid.c index 2ac1f0c2beb3..b07af8861244 100644 --- a/arch/x86/kernel/cpuid.c +++ b/arch/x86/kernel/cpuid.c | |||
@@ -182,6 +182,11 @@ static struct notifier_block __refdata cpuid_class_cpu_notifier = | |||
182 | .notifier_call = cpuid_class_cpu_callback, | 182 | .notifier_call = cpuid_class_cpu_callback, |
183 | }; | 183 | }; |
184 | 184 | ||
185 | static char *cpuid_nodename(struct device *dev) | ||
186 | { | ||
187 | return kasprintf(GFP_KERNEL, "cpu/%u/cpuid", MINOR(dev->devt)); | ||
188 | } | ||
189 | |||
185 | static int __init cpuid_init(void) | 190 | static int __init cpuid_init(void) |
186 | { | 191 | { |
187 | int i, err = 0; | 192 | int i, err = 0; |
@@ -198,6 +203,7 @@ static int __init cpuid_init(void) | |||
198 | err = PTR_ERR(cpuid_class); | 203 | err = PTR_ERR(cpuid_class); |
199 | goto out_chrdev; | 204 | goto out_chrdev; |
200 | } | 205 | } |
206 | cpuid_class->nodename = cpuid_nodename; | ||
201 | for_each_online_cpu(i) { | 207 | for_each_online_cpu(i) { |
202 | err = cpuid_device_create(i); | 208 | err = cpuid_device_create(i); |
203 | if (err != 0) | 209 | if (err != 0) |
diff --git a/arch/x86/kernel/i8253.c b/arch/x86/kernel/i8253.c index c2e0bb0890d4..5cf36c053ac4 100644 --- a/arch/x86/kernel/i8253.c +++ b/arch/x86/kernel/i8253.c | |||
@@ -7,6 +7,7 @@ | |||
7 | #include <linux/spinlock.h> | 7 | #include <linux/spinlock.h> |
8 | #include <linux/jiffies.h> | 8 | #include <linux/jiffies.h> |
9 | #include <linux/module.h> | 9 | #include <linux/module.h> |
10 | #include <linux/timex.h> | ||
10 | #include <linux/delay.h> | 11 | #include <linux/delay.h> |
11 | #include <linux/init.h> | 12 | #include <linux/init.h> |
12 | #include <linux/io.h> | 13 | #include <linux/io.h> |
diff --git a/arch/x86/kernel/init_task.c b/arch/x86/kernel/init_task.c index df3bf269beab..270ff83efc11 100644 --- a/arch/x86/kernel/init_task.c +++ b/arch/x86/kernel/init_task.c | |||
@@ -12,7 +12,6 @@ | |||
12 | 12 | ||
13 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 13 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
14 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 14 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
15 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
16 | 15 | ||
17 | /* | 16 | /* |
18 | * Initial thread structure. | 17 | * Initial thread structure. |
diff --git a/arch/x86/kernel/microcode_core.c b/arch/x86/kernel/microcode_core.c index 9c4461501fcb..9371448290ac 100644 --- a/arch/x86/kernel/microcode_core.c +++ b/arch/x86/kernel/microcode_core.c | |||
@@ -236,6 +236,7 @@ static const struct file_operations microcode_fops = { | |||
236 | static struct miscdevice microcode_dev = { | 236 | static struct miscdevice microcode_dev = { |
237 | .minor = MICROCODE_MINOR, | 237 | .minor = MICROCODE_MINOR, |
238 | .name = "microcode", | 238 | .name = "microcode", |
239 | .devnode = "cpu/microcode", | ||
239 | .fops = µcode_fops, | 240 | .fops = µcode_fops, |
240 | }; | 241 | }; |
241 | 242 | ||
diff --git a/arch/x86/kernel/msr.c b/arch/x86/kernel/msr.c index 3cf3413ec626..98fd6cd4e3a4 100644 --- a/arch/x86/kernel/msr.c +++ b/arch/x86/kernel/msr.c | |||
@@ -196,6 +196,11 @@ static struct notifier_block __refdata msr_class_cpu_notifier = { | |||
196 | .notifier_call = msr_class_cpu_callback, | 196 | .notifier_call = msr_class_cpu_callback, |
197 | }; | 197 | }; |
198 | 198 | ||
199 | static char *msr_nodename(struct device *dev) | ||
200 | { | ||
201 | return kasprintf(GFP_KERNEL, "cpu/%u/msr", MINOR(dev->devt)); | ||
202 | } | ||
203 | |||
199 | static int __init msr_init(void) | 204 | static int __init msr_init(void) |
200 | { | 205 | { |
201 | int i, err = 0; | 206 | int i, err = 0; |
@@ -212,6 +217,7 @@ static int __init msr_init(void) | |||
212 | err = PTR_ERR(msr_class); | 217 | err = PTR_ERR(msr_class); |
213 | goto out_chrdev; | 218 | goto out_chrdev; |
214 | } | 219 | } |
220 | msr_class->nodename = msr_nodename; | ||
215 | for_each_online_cpu(i) { | 221 | for_each_online_cpu(i) { |
216 | err = msr_device_create(i); | 222 | err = msr_device_create(i); |
217 | if (err != 0) | 223 | if (err != 0) |
diff --git a/arch/x86/kernel/process.c b/arch/x86/kernel/process.c index 3bb2be1649bd..994dd6a4a2a0 100644 --- a/arch/x86/kernel/process.c +++ b/arch/x86/kernel/process.c | |||
@@ -63,7 +63,7 @@ void arch_task_cache_init(void) | |||
63 | task_xstate_cachep = | 63 | task_xstate_cachep = |
64 | kmem_cache_create("task_xstate", xstate_size, | 64 | kmem_cache_create("task_xstate", xstate_size, |
65 | __alignof__(union thread_xstate), | 65 | __alignof__(union thread_xstate), |
66 | SLAB_PANIC, NULL); | 66 | SLAB_PANIC | SLAB_NOTRACK, NULL); |
67 | } | 67 | } |
68 | 68 | ||
69 | /* | 69 | /* |
diff --git a/arch/x86/kernel/stacktrace.c b/arch/x86/kernel/stacktrace.c index 4aaf7e48394f..c3eb207181fe 100644 --- a/arch/x86/kernel/stacktrace.c +++ b/arch/x86/kernel/stacktrace.c | |||
@@ -77,6 +77,13 @@ void save_stack_trace(struct stack_trace *trace) | |||
77 | } | 77 | } |
78 | EXPORT_SYMBOL_GPL(save_stack_trace); | 78 | EXPORT_SYMBOL_GPL(save_stack_trace); |
79 | 79 | ||
80 | void save_stack_trace_bp(struct stack_trace *trace, unsigned long bp) | ||
81 | { | ||
82 | dump_trace(current, NULL, NULL, bp, &save_stack_ops, trace); | ||
83 | if (trace->nr_entries < trace->max_entries) | ||
84 | trace->entries[trace->nr_entries++] = ULONG_MAX; | ||
85 | } | ||
86 | |||
80 | void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace) | 87 | void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace) |
81 | { | 88 | { |
82 | dump_trace(tsk, NULL, NULL, 0, &save_stack_ops_nosched, trace); | 89 | dump_trace(tsk, NULL, NULL, 0, &save_stack_ops_nosched, trace); |
diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 1e1e27b7d438..5f935f0d5861 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #include <linux/edac.h> | 45 | #include <linux/edac.h> |
46 | #endif | 46 | #endif |
47 | 47 | ||
48 | #include <asm/kmemcheck.h> | ||
48 | #include <asm/stacktrace.h> | 49 | #include <asm/stacktrace.h> |
49 | #include <asm/processor.h> | 50 | #include <asm/processor.h> |
50 | #include <asm/debugreg.h> | 51 | #include <asm/debugreg.h> |
@@ -534,6 +535,10 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code) | |||
534 | 535 | ||
535 | get_debugreg(condition, 6); | 536 | get_debugreg(condition, 6); |
536 | 537 | ||
538 | /* Catch kmemcheck conditions first of all! */ | ||
539 | if (condition & DR_STEP && kmemcheck_trap(regs)) | ||
540 | return; | ||
541 | |||
537 | /* | 542 | /* |
538 | * The processor cleared BTF, so don't mark that we need it set. | 543 | * The processor cleared BTF, so don't mark that we need it set. |
539 | */ | 544 | */ |
diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c index 3e1c057e98fe..ae3180c506a6 100644 --- a/arch/x86/kernel/tsc.c +++ b/arch/x86/kernel/tsc.c | |||
@@ -9,6 +9,7 @@ | |||
9 | #include <linux/delay.h> | 9 | #include <linux/delay.h> |
10 | #include <linux/clocksource.h> | 10 | #include <linux/clocksource.h> |
11 | #include <linux/percpu.h> | 11 | #include <linux/percpu.h> |
12 | #include <linux/timex.h> | ||
12 | 13 | ||
13 | #include <asm/hpet.h> | 14 | #include <asm/hpet.h> |
14 | #include <asm/timer.h> | 15 | #include <asm/timer.h> |
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c index 32d6ae8fb60e..e770bf349ec4 100644 --- a/arch/x86/kvm/vmx.c +++ b/arch/x86/kvm/vmx.c | |||
@@ -1277,7 +1277,7 @@ static struct vmcs *alloc_vmcs_cpu(int cpu) | |||
1277 | struct page *pages; | 1277 | struct page *pages; |
1278 | struct vmcs *vmcs; | 1278 | struct vmcs *vmcs; |
1279 | 1279 | ||
1280 | pages = alloc_pages_node(node, GFP_KERNEL, vmcs_config.order); | 1280 | pages = alloc_pages_exact_node(node, GFP_KERNEL, vmcs_config.order); |
1281 | if (!pages) | 1281 | if (!pages) |
1282 | return NULL; | 1282 | return NULL; |
1283 | vmcs = page_address(pages); | 1283 | vmcs = page_address(pages); |
diff --git a/arch/x86/mm/Makefile b/arch/x86/mm/Makefile index fdd30d08ab52..eefdeee8a871 100644 --- a/arch/x86/mm/Makefile +++ b/arch/x86/mm/Makefile | |||
@@ -10,6 +10,8 @@ obj-$(CONFIG_X86_PTDUMP) += dump_pagetables.o | |||
10 | 10 | ||
11 | obj-$(CONFIG_HIGHMEM) += highmem_32.o | 11 | obj-$(CONFIG_HIGHMEM) += highmem_32.o |
12 | 12 | ||
13 | obj-$(CONFIG_KMEMCHECK) += kmemcheck/ | ||
14 | |||
13 | obj-$(CONFIG_MMIOTRACE) += mmiotrace.o | 15 | obj-$(CONFIG_MMIOTRACE) += mmiotrace.o |
14 | mmiotrace-y := kmmio.o pf_in.o mmio-mod.o | 16 | mmiotrace-y := kmmio.o pf_in.o mmio-mod.o |
15 | obj-$(CONFIG_MMIOTRACE_TEST) += testmmiotrace.o | 17 | obj-$(CONFIG_MMIOTRACE_TEST) += testmmiotrace.o |
diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c index c6acc6326374..baa0e86adfbc 100644 --- a/arch/x86/mm/fault.c +++ b/arch/x86/mm/fault.c | |||
@@ -14,6 +14,7 @@ | |||
14 | 14 | ||
15 | #include <asm/traps.h> /* dotraplinkage, ... */ | 15 | #include <asm/traps.h> /* dotraplinkage, ... */ |
16 | #include <asm/pgalloc.h> /* pgd_*(), ... */ | 16 | #include <asm/pgalloc.h> /* pgd_*(), ... */ |
17 | #include <asm/kmemcheck.h> /* kmemcheck_*(), ... */ | ||
17 | 18 | ||
18 | /* | 19 | /* |
19 | * Page fault error code bits: | 20 | * Page fault error code bits: |
@@ -956,6 +957,13 @@ do_page_fault(struct pt_regs *regs, unsigned long error_code) | |||
956 | /* Get the faulting address: */ | 957 | /* Get the faulting address: */ |
957 | address = read_cr2(); | 958 | address = read_cr2(); |
958 | 959 | ||
960 | /* | ||
961 | * Detect and handle instructions that would cause a page fault for | ||
962 | * both a tracked kernel page and a userspace page. | ||
963 | */ | ||
964 | if (kmemcheck_active(regs)) | ||
965 | kmemcheck_hide(regs); | ||
966 | |||
959 | if (unlikely(kmmio_fault(regs, address))) | 967 | if (unlikely(kmmio_fault(regs, address))) |
960 | return; | 968 | return; |
961 | 969 | ||
@@ -973,9 +981,13 @@ do_page_fault(struct pt_regs *regs, unsigned long error_code) | |||
973 | * protection error (error_code & 9) == 0. | 981 | * protection error (error_code & 9) == 0. |
974 | */ | 982 | */ |
975 | if (unlikely(fault_in_kernel_space(address))) { | 983 | if (unlikely(fault_in_kernel_space(address))) { |
976 | if (!(error_code & (PF_RSVD|PF_USER|PF_PROT)) && | 984 | if (!(error_code & (PF_RSVD | PF_USER | PF_PROT))) { |
977 | vmalloc_fault(address) >= 0) | 985 | if (vmalloc_fault(address) >= 0) |
978 | return; | 986 | return; |
987 | |||
988 | if (kmemcheck_fault(regs, address, error_code)) | ||
989 | return; | ||
990 | } | ||
979 | 991 | ||
980 | /* Can handle a stale RO->RW TLB: */ | 992 | /* Can handle a stale RO->RW TLB: */ |
981 | if (spurious_fault(error_code, address)) | 993 | if (spurious_fault(error_code, address)) |
diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c index 34c1bfb64f1c..f53b57e4086f 100644 --- a/arch/x86/mm/init.c +++ b/arch/x86/mm/init.c | |||
@@ -213,7 +213,7 @@ unsigned long __init_refok init_memory_mapping(unsigned long start, | |||
213 | if (!after_bootmem) | 213 | if (!after_bootmem) |
214 | init_gbpages(); | 214 | init_gbpages(); |
215 | 215 | ||
216 | #ifdef CONFIG_DEBUG_PAGEALLOC | 216 | #if defined(CONFIG_DEBUG_PAGEALLOC) || defined(CONFIG_KMEMCHECK) |
217 | /* | 217 | /* |
218 | * For CONFIG_DEBUG_PAGEALLOC, identity mapping will use small pages. | 218 | * For CONFIG_DEBUG_PAGEALLOC, identity mapping will use small pages. |
219 | * This will simplify cpa(), which otherwise needs to support splitting | 219 | * This will simplify cpa(), which otherwise needs to support splitting |
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index 9ff3c0816d15..3cd7711bb949 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c | |||
@@ -111,7 +111,7 @@ static pte_t * __init one_page_table_init(pmd_t *pmd) | |||
111 | pte_t *page_table = NULL; | 111 | pte_t *page_table = NULL; |
112 | 112 | ||
113 | if (after_bootmem) { | 113 | if (after_bootmem) { |
114 | #ifdef CONFIG_DEBUG_PAGEALLOC | 114 | #if defined(CONFIG_DEBUG_PAGEALLOC) || defined(CONFIG_KMEMCHECK) |
115 | page_table = (pte_t *) alloc_bootmem_pages(PAGE_SIZE); | 115 | page_table = (pte_t *) alloc_bootmem_pages(PAGE_SIZE); |
116 | #endif | 116 | #endif |
117 | if (!page_table) | 117 | if (!page_table) |
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 52bb9519bb86..9c543290a813 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
@@ -104,7 +104,7 @@ static __ref void *spp_getpage(void) | |||
104 | void *ptr; | 104 | void *ptr; |
105 | 105 | ||
106 | if (after_bootmem) | 106 | if (after_bootmem) |
107 | ptr = (void *) get_zeroed_page(GFP_ATOMIC); | 107 | ptr = (void *) get_zeroed_page(GFP_ATOMIC | __GFP_NOTRACK); |
108 | else | 108 | else |
109 | ptr = alloc_bootmem_pages(PAGE_SIZE); | 109 | ptr = alloc_bootmem_pages(PAGE_SIZE); |
110 | 110 | ||
@@ -281,7 +281,7 @@ static __ref void *alloc_low_page(unsigned long *phys) | |||
281 | void *adr; | 281 | void *adr; |
282 | 282 | ||
283 | if (after_bootmem) { | 283 | if (after_bootmem) { |
284 | adr = (void *)get_zeroed_page(GFP_ATOMIC); | 284 | adr = (void *)get_zeroed_page(GFP_ATOMIC | __GFP_NOTRACK); |
285 | *phys = __pa(adr); | 285 | *phys = __pa(adr); |
286 | 286 | ||
287 | return adr; | 287 | return adr; |
diff --git a/arch/x86/mm/kmemcheck/Makefile b/arch/x86/mm/kmemcheck/Makefile new file mode 100644 index 000000000000..520b3bce4095 --- /dev/null +++ b/arch/x86/mm/kmemcheck/Makefile | |||
@@ -0,0 +1 @@ | |||
obj-y := error.o kmemcheck.o opcode.o pte.o selftest.o shadow.o | |||
diff --git a/arch/x86/mm/kmemcheck/error.c b/arch/x86/mm/kmemcheck/error.c new file mode 100644 index 000000000000..4901d0dafda6 --- /dev/null +++ b/arch/x86/mm/kmemcheck/error.c | |||
@@ -0,0 +1,228 @@ | |||
1 | #include <linux/interrupt.h> | ||
2 | #include <linux/kdebug.h> | ||
3 | #include <linux/kmemcheck.h> | ||
4 | #include <linux/kernel.h> | ||
5 | #include <linux/types.h> | ||
6 | #include <linux/ptrace.h> | ||
7 | #include <linux/stacktrace.h> | ||
8 | #include <linux/string.h> | ||
9 | |||
10 | #include "error.h" | ||
11 | #include "shadow.h" | ||
12 | |||
13 | enum kmemcheck_error_type { | ||
14 | KMEMCHECK_ERROR_INVALID_ACCESS, | ||
15 | KMEMCHECK_ERROR_BUG, | ||
16 | }; | ||
17 | |||
18 | #define SHADOW_COPY_SIZE (1 << CONFIG_KMEMCHECK_SHADOW_COPY_SHIFT) | ||
19 | |||
20 | struct kmemcheck_error { | ||
21 | enum kmemcheck_error_type type; | ||
22 | |||
23 | union { | ||
24 | /* KMEMCHECK_ERROR_INVALID_ACCESS */ | ||
25 | struct { | ||
26 | /* Kind of access that caused the error */ | ||
27 | enum kmemcheck_shadow state; | ||
28 | /* Address and size of the erroneous read */ | ||
29 | unsigned long address; | ||
30 | unsigned int size; | ||
31 | }; | ||
32 | }; | ||
33 | |||
34 | struct pt_regs regs; | ||
35 | struct stack_trace trace; | ||
36 | unsigned long trace_entries[32]; | ||
37 | |||
38 | /* We compress it to a char. */ | ||
39 | unsigned char shadow_copy[SHADOW_COPY_SIZE]; | ||
40 | unsigned char memory_copy[SHADOW_COPY_SIZE]; | ||
41 | }; | ||
42 | |||
43 | /* | ||
44 | * Create a ring queue of errors to output. We can't call printk() directly | ||
45 | * from the kmemcheck traps, since this may call the console drivers and | ||
46 | * result in a recursive fault. | ||
47 | */ | ||
48 | static struct kmemcheck_error error_fifo[CONFIG_KMEMCHECK_QUEUE_SIZE]; | ||
49 | static unsigned int error_count; | ||
50 | static unsigned int error_rd; | ||
51 | static unsigned int error_wr; | ||
52 | static unsigned int error_missed_count; | ||
53 | |||
54 | static struct kmemcheck_error *error_next_wr(void) | ||
55 | { | ||
56 | struct kmemcheck_error *e; | ||
57 | |||
58 | if (error_count == ARRAY_SIZE(error_fifo)) { | ||
59 | ++error_missed_count; | ||
60 | return NULL; | ||
61 | } | ||
62 | |||
63 | e = &error_fifo[error_wr]; | ||
64 | if (++error_wr == ARRAY_SIZE(error_fifo)) | ||
65 | error_wr = 0; | ||
66 | ++error_count; | ||
67 | return e; | ||
68 | } | ||
69 | |||
70 | static struct kmemcheck_error *error_next_rd(void) | ||
71 | { | ||
72 | struct kmemcheck_error *e; | ||
73 | |||
74 | if (error_count == 0) | ||
75 | return NULL; | ||
76 | |||
77 | e = &error_fifo[error_rd]; | ||
78 | if (++error_rd == ARRAY_SIZE(error_fifo)) | ||
79 | error_rd = 0; | ||
80 | --error_count; | ||
81 | return e; | ||
82 | } | ||
83 | |||
84 | void kmemcheck_error_recall(void) | ||
85 | { | ||
86 | static const char *desc[] = { | ||
87 | [KMEMCHECK_SHADOW_UNALLOCATED] = "unallocated", | ||
88 | [KMEMCHECK_SHADOW_UNINITIALIZED] = "uninitialized", | ||
89 | [KMEMCHECK_SHADOW_INITIALIZED] = "initialized", | ||
90 | [KMEMCHECK_SHADOW_FREED] = "freed", | ||
91 | }; | ||
92 | |||
93 | static const char short_desc[] = { | ||
94 | [KMEMCHECK_SHADOW_UNALLOCATED] = 'a', | ||
95 | [KMEMCHECK_SHADOW_UNINITIALIZED] = 'u', | ||
96 | [KMEMCHECK_SHADOW_INITIALIZED] = 'i', | ||
97 | [KMEMCHECK_SHADOW_FREED] = 'f', | ||
98 | }; | ||
99 | |||
100 | struct kmemcheck_error *e; | ||
101 | unsigned int i; | ||
102 | |||
103 | e = error_next_rd(); | ||
104 | if (!e) | ||
105 | return; | ||
106 | |||
107 | switch (e->type) { | ||
108 | case KMEMCHECK_ERROR_INVALID_ACCESS: | ||
109 | printk(KERN_ERR "WARNING: kmemcheck: Caught %d-bit read " | ||
110 | "from %s memory (%p)\n", | ||
111 | 8 * e->size, e->state < ARRAY_SIZE(desc) ? | ||
112 | desc[e->state] : "(invalid shadow state)", | ||
113 | (void *) e->address); | ||
114 | |||
115 | printk(KERN_INFO); | ||
116 | for (i = 0; i < SHADOW_COPY_SIZE; ++i) | ||
117 | printk("%02x", e->memory_copy[i]); | ||
118 | printk("\n"); | ||
119 | |||
120 | printk(KERN_INFO); | ||
121 | for (i = 0; i < SHADOW_COPY_SIZE; ++i) { | ||
122 | if (e->shadow_copy[i] < ARRAY_SIZE(short_desc)) | ||
123 | printk(" %c", short_desc[e->shadow_copy[i]]); | ||
124 | else | ||
125 | printk(" ?"); | ||
126 | } | ||
127 | printk("\n"); | ||
128 | printk(KERN_INFO "%*c\n", 2 + 2 | ||
129 | * (int) (e->address & (SHADOW_COPY_SIZE - 1)), '^'); | ||
130 | break; | ||
131 | case KMEMCHECK_ERROR_BUG: | ||
132 | printk(KERN_EMERG "ERROR: kmemcheck: Fatal error\n"); | ||
133 | break; | ||
134 | } | ||
135 | |||
136 | __show_regs(&e->regs, 1); | ||
137 | print_stack_trace(&e->trace, 0); | ||
138 | } | ||
139 | |||
140 | static void do_wakeup(unsigned long data) | ||
141 | { | ||
142 | while (error_count > 0) | ||
143 | kmemcheck_error_recall(); | ||
144 | |||
145 | if (error_missed_count > 0) { | ||
146 | printk(KERN_WARNING "kmemcheck: Lost %d error reports because " | ||
147 | "the queue was too small\n", error_missed_count); | ||
148 | error_missed_count = 0; | ||
149 | } | ||
150 | } | ||
151 | |||
152 | static DECLARE_TASKLET(kmemcheck_tasklet, &do_wakeup, 0); | ||
153 | |||
154 | /* | ||
155 | * Save the context of an error report. | ||
156 | */ | ||
157 | void kmemcheck_error_save(enum kmemcheck_shadow state, | ||
158 | unsigned long address, unsigned int size, struct pt_regs *regs) | ||
159 | { | ||
160 | static unsigned long prev_ip; | ||
161 | |||
162 | struct kmemcheck_error *e; | ||
163 | void *shadow_copy; | ||
164 | void *memory_copy; | ||
165 | |||
166 | /* Don't report several adjacent errors from the same EIP. */ | ||
167 | if (regs->ip == prev_ip) | ||
168 | return; | ||
169 | prev_ip = regs->ip; | ||
170 | |||
171 | e = error_next_wr(); | ||
172 | if (!e) | ||
173 | return; | ||
174 | |||
175 | e->type = KMEMCHECK_ERROR_INVALID_ACCESS; | ||
176 | |||
177 | e->state = state; | ||
178 | e->address = address; | ||
179 | e->size = size; | ||
180 | |||
181 | /* Save regs */ | ||
182 | memcpy(&e->regs, regs, sizeof(*regs)); | ||
183 | |||
184 | /* Save stack trace */ | ||
185 | e->trace.nr_entries = 0; | ||
186 | e->trace.entries = e->trace_entries; | ||
187 | e->trace.max_entries = ARRAY_SIZE(e->trace_entries); | ||
188 | e->trace.skip = 0; | ||
189 | save_stack_trace_bp(&e->trace, regs->bp); | ||
190 | |||
191 | /* Round address down to nearest 16 bytes */ | ||
192 | shadow_copy = kmemcheck_shadow_lookup(address | ||
193 | & ~(SHADOW_COPY_SIZE - 1)); | ||
194 | BUG_ON(!shadow_copy); | ||
195 | |||
196 | memcpy(e->shadow_copy, shadow_copy, SHADOW_COPY_SIZE); | ||
197 | |||
198 | kmemcheck_show_addr(address); | ||
199 | memory_copy = (void *) (address & ~(SHADOW_COPY_SIZE - 1)); | ||
200 | memcpy(e->memory_copy, memory_copy, SHADOW_COPY_SIZE); | ||
201 | kmemcheck_hide_addr(address); | ||
202 | |||
203 | tasklet_hi_schedule_first(&kmemcheck_tasklet); | ||
204 | } | ||
205 | |||
206 | /* | ||
207 | * Save the context of a kmemcheck bug. | ||
208 | */ | ||
209 | void kmemcheck_error_save_bug(struct pt_regs *regs) | ||
210 | { | ||
211 | struct kmemcheck_error *e; | ||
212 | |||
213 | e = error_next_wr(); | ||
214 | if (!e) | ||
215 | return; | ||
216 | |||
217 | e->type = KMEMCHECK_ERROR_BUG; | ||
218 | |||
219 | memcpy(&e->regs, regs, sizeof(*regs)); | ||
220 | |||
221 | e->trace.nr_entries = 0; | ||
222 | e->trace.entries = e->trace_entries; | ||
223 | e->trace.max_entries = ARRAY_SIZE(e->trace_entries); | ||
224 | e->trace.skip = 1; | ||
225 | save_stack_trace(&e->trace); | ||
226 | |||
227 | tasklet_hi_schedule_first(&kmemcheck_tasklet); | ||
228 | } | ||
diff --git a/arch/x86/mm/kmemcheck/error.h b/arch/x86/mm/kmemcheck/error.h new file mode 100644 index 000000000000..0efc2e8d0a20 --- /dev/null +++ b/arch/x86/mm/kmemcheck/error.h | |||
@@ -0,0 +1,15 @@ | |||
1 | #ifndef ARCH__X86__MM__KMEMCHECK__ERROR_H | ||
2 | #define ARCH__X86__MM__KMEMCHECK__ERROR_H | ||
3 | |||
4 | #include <linux/ptrace.h> | ||
5 | |||
6 | #include "shadow.h" | ||
7 | |||
8 | void kmemcheck_error_save(enum kmemcheck_shadow state, | ||
9 | unsigned long address, unsigned int size, struct pt_regs *regs); | ||
10 | |||
11 | void kmemcheck_error_save_bug(struct pt_regs *regs); | ||
12 | |||
13 | void kmemcheck_error_recall(void); | ||
14 | |||
15 | #endif | ||
diff --git a/arch/x86/mm/kmemcheck/kmemcheck.c b/arch/x86/mm/kmemcheck/kmemcheck.c new file mode 100644 index 000000000000..2c55ed098654 --- /dev/null +++ b/arch/x86/mm/kmemcheck/kmemcheck.c | |||
@@ -0,0 +1,640 @@ | |||
1 | /** | ||
2 | * kmemcheck - a heavyweight memory checker for the linux kernel | ||
3 | * Copyright (C) 2007, 2008 Vegard Nossum <vegardno@ifi.uio.no> | ||
4 | * (With a lot of help from Ingo Molnar and Pekka Enberg.) | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License (version 2) as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/init.h> | ||
12 | #include <linux/interrupt.h> | ||
13 | #include <linux/kallsyms.h> | ||
14 | #include <linux/kernel.h> | ||
15 | #include <linux/kmemcheck.h> | ||
16 | #include <linux/mm.h> | ||
17 | #include <linux/module.h> | ||
18 | #include <linux/page-flags.h> | ||
19 | #include <linux/percpu.h> | ||
20 | #include <linux/ptrace.h> | ||
21 | #include <linux/string.h> | ||
22 | #include <linux/types.h> | ||
23 | |||
24 | #include <asm/cacheflush.h> | ||
25 | #include <asm/kmemcheck.h> | ||
26 | #include <asm/pgtable.h> | ||
27 | #include <asm/tlbflush.h> | ||
28 | |||
29 | #include "error.h" | ||
30 | #include "opcode.h" | ||
31 | #include "pte.h" | ||
32 | #include "selftest.h" | ||
33 | #include "shadow.h" | ||
34 | |||
35 | |||
36 | #ifdef CONFIG_KMEMCHECK_DISABLED_BY_DEFAULT | ||
37 | # define KMEMCHECK_ENABLED 0 | ||
38 | #endif | ||
39 | |||
40 | #ifdef CONFIG_KMEMCHECK_ENABLED_BY_DEFAULT | ||
41 | # define KMEMCHECK_ENABLED 1 | ||
42 | #endif | ||
43 | |||
44 | #ifdef CONFIG_KMEMCHECK_ONESHOT_BY_DEFAULT | ||
45 | # define KMEMCHECK_ENABLED 2 | ||
46 | #endif | ||
47 | |||
48 | int kmemcheck_enabled = KMEMCHECK_ENABLED; | ||
49 | |||
50 | int __init kmemcheck_init(void) | ||
51 | { | ||
52 | #ifdef CONFIG_SMP | ||
53 | /* | ||
54 | * Limit SMP to use a single CPU. We rely on the fact that this code | ||
55 | * runs before SMP is set up. | ||
56 | */ | ||
57 | if (setup_max_cpus > 1) { | ||
58 | printk(KERN_INFO | ||
59 | "kmemcheck: Limiting number of CPUs to 1.\n"); | ||
60 | setup_max_cpus = 1; | ||
61 | } | ||
62 | #endif | ||
63 | |||
64 | if (!kmemcheck_selftest()) { | ||
65 | printk(KERN_INFO "kmemcheck: self-tests failed; disabling\n"); | ||
66 | kmemcheck_enabled = 0; | ||
67 | return -EINVAL; | ||
68 | } | ||
69 | |||
70 | printk(KERN_INFO "kmemcheck: Initialized\n"); | ||
71 | return 0; | ||
72 | } | ||
73 | |||
74 | early_initcall(kmemcheck_init); | ||
75 | |||
76 | /* | ||
77 | * We need to parse the kmemcheck= option before any memory is allocated. | ||
78 | */ | ||
79 | static int __init param_kmemcheck(char *str) | ||
80 | { | ||
81 | if (!str) | ||
82 | return -EINVAL; | ||
83 | |||
84 | sscanf(str, "%d", &kmemcheck_enabled); | ||
85 | return 0; | ||
86 | } | ||
87 | |||
88 | early_param("kmemcheck", param_kmemcheck); | ||
89 | |||
90 | int kmemcheck_show_addr(unsigned long address) | ||
91 | { | ||
92 | pte_t *pte; | ||
93 | |||
94 | pte = kmemcheck_pte_lookup(address); | ||
95 | if (!pte) | ||
96 | return 0; | ||
97 | |||
98 | set_pte(pte, __pte(pte_val(*pte) | _PAGE_PRESENT)); | ||
99 | __flush_tlb_one(address); | ||
100 | return 1; | ||
101 | } | ||
102 | |||
103 | int kmemcheck_hide_addr(unsigned long address) | ||
104 | { | ||
105 | pte_t *pte; | ||
106 | |||
107 | pte = kmemcheck_pte_lookup(address); | ||
108 | if (!pte) | ||
109 | return 0; | ||
110 | |||
111 | set_pte(pte, __pte(pte_val(*pte) & ~_PAGE_PRESENT)); | ||
112 | __flush_tlb_one(address); | ||
113 | return 1; | ||
114 | } | ||
115 | |||
116 | struct kmemcheck_context { | ||
117 | bool busy; | ||
118 | int balance; | ||
119 | |||
120 | /* | ||
121 | * There can be at most two memory operands to an instruction, but | ||
122 | * each address can cross a page boundary -- so we may need up to | ||
123 | * four addresses that must be hidden/revealed for each fault. | ||
124 | */ | ||
125 | unsigned long addr[4]; | ||
126 | unsigned long n_addrs; | ||
127 | unsigned long flags; | ||
128 | |||
129 | /* Data size of the instruction that caused a fault. */ | ||
130 | unsigned int size; | ||
131 | }; | ||
132 | |||
133 | static DEFINE_PER_CPU(struct kmemcheck_context, kmemcheck_context); | ||
134 | |||
135 | bool kmemcheck_active(struct pt_regs *regs) | ||
136 | { | ||
137 | struct kmemcheck_context *data = &__get_cpu_var(kmemcheck_context); | ||
138 | |||
139 | return data->balance > 0; | ||
140 | } | ||
141 | |||
142 | /* Save an address that needs to be shown/hidden */ | ||
143 | static void kmemcheck_save_addr(unsigned long addr) | ||
144 | { | ||
145 | struct kmemcheck_context *data = &__get_cpu_var(kmemcheck_context); | ||
146 | |||
147 | BUG_ON(data->n_addrs >= ARRAY_SIZE(data->addr)); | ||
148 | data->addr[data->n_addrs++] = addr; | ||
149 | } | ||
150 | |||
151 | static unsigned int kmemcheck_show_all(void) | ||
152 | { | ||
153 | struct kmemcheck_context *data = &__get_cpu_var(kmemcheck_context); | ||
154 | unsigned int i; | ||
155 | unsigned int n; | ||
156 | |||
157 | n = 0; | ||
158 | for (i = 0; i < data->n_addrs; ++i) | ||
159 | n += kmemcheck_show_addr(data->addr[i]); | ||
160 | |||
161 | return n; | ||
162 | } | ||
163 | |||
164 | static unsigned int kmemcheck_hide_all(void) | ||
165 | { | ||
166 | struct kmemcheck_context *data = &__get_cpu_var(kmemcheck_context); | ||
167 | unsigned int i; | ||
168 | unsigned int n; | ||
169 | |||
170 | n = 0; | ||
171 | for (i = 0; i < data->n_addrs; ++i) | ||
172 | n += kmemcheck_hide_addr(data->addr[i]); | ||
173 | |||
174 | return n; | ||
175 | } | ||
176 | |||
177 | /* | ||
178 | * Called from the #PF handler. | ||
179 | */ | ||
180 | void kmemcheck_show(struct pt_regs *regs) | ||
181 | { | ||
182 | struct kmemcheck_context *data = &__get_cpu_var(kmemcheck_context); | ||
183 | |||
184 | BUG_ON(!irqs_disabled()); | ||
185 | |||
186 | if (unlikely(data->balance != 0)) { | ||
187 | kmemcheck_show_all(); | ||
188 | kmemcheck_error_save_bug(regs); | ||
189 | data->balance = 0; | ||
190 | return; | ||
191 | } | ||
192 | |||
193 | /* | ||
194 | * None of the addresses actually belonged to kmemcheck. Note that | ||
195 | * this is not an error. | ||
196 | */ | ||
197 | if (kmemcheck_show_all() == 0) | ||
198 | return; | ||
199 | |||
200 | ++data->balance; | ||
201 | |||
202 | /* | ||
203 | * The IF needs to be cleared as well, so that the faulting | ||
204 | * instruction can run "uninterrupted". Otherwise, we might take | ||
205 | * an interrupt and start executing that before we've had a chance | ||
206 | * to hide the page again. | ||
207 | * | ||
208 | * NOTE: In the rare case of multiple faults, we must not override | ||
209 | * the original flags: | ||
210 | */ | ||
211 | if (!(regs->flags & X86_EFLAGS_TF)) | ||
212 | data->flags = regs->flags; | ||
213 | |||
214 | regs->flags |= X86_EFLAGS_TF; | ||
215 | regs->flags &= ~X86_EFLAGS_IF; | ||
216 | } | ||
217 | |||
218 | /* | ||
219 | * Called from the #DB handler. | ||
220 | */ | ||
221 | void kmemcheck_hide(struct pt_regs *regs) | ||
222 | { | ||
223 | struct kmemcheck_context *data = &__get_cpu_var(kmemcheck_context); | ||
224 | int n; | ||
225 | |||
226 | BUG_ON(!irqs_disabled()); | ||
227 | |||
228 | if (data->balance == 0) | ||
229 | return; | ||
230 | |||
231 | if (unlikely(data->balance != 1)) { | ||
232 | kmemcheck_show_all(); | ||
233 | kmemcheck_error_save_bug(regs); | ||
234 | data->n_addrs = 0; | ||
235 | data->balance = 0; | ||
236 | |||
237 | if (!(data->flags & X86_EFLAGS_TF)) | ||
238 | regs->flags &= ~X86_EFLAGS_TF; | ||
239 | if (data->flags & X86_EFLAGS_IF) | ||
240 | regs->flags |= X86_EFLAGS_IF; | ||
241 | return; | ||
242 | } | ||
243 | |||
244 | if (kmemcheck_enabled) | ||
245 | n = kmemcheck_hide_all(); | ||
246 | else | ||
247 | n = kmemcheck_show_all(); | ||
248 | |||
249 | if (n == 0) | ||
250 | return; | ||
251 | |||
252 | --data->balance; | ||
253 | |||
254 | data->n_addrs = 0; | ||
255 | |||
256 | if (!(data->flags & X86_EFLAGS_TF)) | ||
257 | regs->flags &= ~X86_EFLAGS_TF; | ||
258 | if (data->flags & X86_EFLAGS_IF) | ||
259 | regs->flags |= X86_EFLAGS_IF; | ||
260 | } | ||
261 | |||
262 | void kmemcheck_show_pages(struct page *p, unsigned int n) | ||
263 | { | ||
264 | unsigned int i; | ||
265 | |||
266 | for (i = 0; i < n; ++i) { | ||
267 | unsigned long address; | ||
268 | pte_t *pte; | ||
269 | unsigned int level; | ||
270 | |||
271 | address = (unsigned long) page_address(&p[i]); | ||
272 | pte = lookup_address(address, &level); | ||
273 | BUG_ON(!pte); | ||
274 | BUG_ON(level != PG_LEVEL_4K); | ||
275 | |||
276 | set_pte(pte, __pte(pte_val(*pte) | _PAGE_PRESENT)); | ||
277 | set_pte(pte, __pte(pte_val(*pte) & ~_PAGE_HIDDEN)); | ||
278 | __flush_tlb_one(address); | ||
279 | } | ||
280 | } | ||
281 | |||
282 | bool kmemcheck_page_is_tracked(struct page *p) | ||
283 | { | ||
284 | /* This will also check the "hidden" flag of the PTE. */ | ||
285 | return kmemcheck_pte_lookup((unsigned long) page_address(p)); | ||
286 | } | ||
287 | |||
288 | void kmemcheck_hide_pages(struct page *p, unsigned int n) | ||
289 | { | ||
290 | unsigned int i; | ||
291 | |||
292 | for (i = 0; i < n; ++i) { | ||
293 | unsigned long address; | ||
294 | pte_t *pte; | ||
295 | unsigned int level; | ||
296 | |||
297 | address = (unsigned long) page_address(&p[i]); | ||
298 | pte = lookup_address(address, &level); | ||
299 | BUG_ON(!pte); | ||
300 | BUG_ON(level != PG_LEVEL_4K); | ||
301 | |||
302 | set_pte(pte, __pte(pte_val(*pte) & ~_PAGE_PRESENT)); | ||
303 | set_pte(pte, __pte(pte_val(*pte) | _PAGE_HIDDEN)); | ||
304 | __flush_tlb_one(address); | ||
305 | } | ||
306 | } | ||
307 | |||
308 | /* Access may NOT cross page boundary */ | ||
309 | static void kmemcheck_read_strict(struct pt_regs *regs, | ||
310 | unsigned long addr, unsigned int size) | ||
311 | { | ||
312 | void *shadow; | ||
313 | enum kmemcheck_shadow status; | ||
314 | |||
315 | shadow = kmemcheck_shadow_lookup(addr); | ||
316 | if (!shadow) | ||
317 | return; | ||
318 | |||
319 | kmemcheck_save_addr(addr); | ||
320 | status = kmemcheck_shadow_test(shadow, size); | ||
321 | if (status == KMEMCHECK_SHADOW_INITIALIZED) | ||
322 | return; | ||
323 | |||
324 | if (kmemcheck_enabled) | ||
325 | kmemcheck_error_save(status, addr, size, regs); | ||
326 | |||
327 | if (kmemcheck_enabled == 2) | ||
328 | kmemcheck_enabled = 0; | ||
329 | |||
330 | /* Don't warn about it again. */ | ||
331 | kmemcheck_shadow_set(shadow, size); | ||
332 | } | ||
333 | |||
334 | /* Access may cross page boundary */ | ||
335 | static void kmemcheck_read(struct pt_regs *regs, | ||
336 | unsigned long addr, unsigned int size) | ||
337 | { | ||
338 | unsigned long page = addr & PAGE_MASK; | ||
339 | unsigned long next_addr = addr + size - 1; | ||
340 | unsigned long next_page = next_addr & PAGE_MASK; | ||
341 | |||
342 | if (likely(page == next_page)) { | ||
343 | kmemcheck_read_strict(regs, addr, size); | ||
344 | return; | ||
345 | } | ||
346 | |||
347 | /* | ||
348 | * What we do is basically to split the access across the | ||
349 | * two pages and handle each part separately. Yes, this means | ||
350 | * that we may now see reads that are 3 + 5 bytes, for | ||
351 | * example (and if both are uninitialized, there will be two | ||
352 | * reports), but it makes the code a lot simpler. | ||
353 | */ | ||
354 | kmemcheck_read_strict(regs, addr, next_page - addr); | ||
355 | kmemcheck_read_strict(regs, next_page, next_addr - next_page); | ||
356 | } | ||
357 | |||
358 | static void kmemcheck_write_strict(struct pt_regs *regs, | ||
359 | unsigned long addr, unsigned int size) | ||
360 | { | ||
361 | void *shadow; | ||
362 | |||
363 | shadow = kmemcheck_shadow_lookup(addr); | ||
364 | if (!shadow) | ||
365 | return; | ||
366 | |||
367 | kmemcheck_save_addr(addr); | ||
368 | kmemcheck_shadow_set(shadow, size); | ||
369 | } | ||
370 | |||
371 | static void kmemcheck_write(struct pt_regs *regs, | ||
372 | unsigned long addr, unsigned int size) | ||
373 | { | ||
374 | unsigned long page = addr & PAGE_MASK; | ||
375 | unsigned long next_addr = addr + size - 1; | ||
376 | unsigned long next_page = next_addr & PAGE_MASK; | ||
377 | |||
378 | if (likely(page == next_page)) { | ||
379 | kmemcheck_write_strict(regs, addr, size); | ||
380 | return; | ||
381 | } | ||
382 | |||
383 | /* See comment in kmemcheck_read(). */ | ||
384 | kmemcheck_write_strict(regs, addr, next_page - addr); | ||
385 | kmemcheck_write_strict(regs, next_page, next_addr - next_page); | ||
386 | } | ||
387 | |||
388 | /* | ||
389 | * Copying is hard. We have two addresses, each of which may be split across | ||
390 | * a page (and each page will have different shadow addresses). | ||
391 | */ | ||
392 | static void kmemcheck_copy(struct pt_regs *regs, | ||
393 | unsigned long src_addr, unsigned long dst_addr, unsigned int size) | ||
394 | { | ||
395 | uint8_t shadow[8]; | ||
396 | enum kmemcheck_shadow status; | ||
397 | |||
398 | unsigned long page; | ||
399 | unsigned long next_addr; | ||
400 | unsigned long next_page; | ||
401 | |||
402 | uint8_t *x; | ||
403 | unsigned int i; | ||
404 | unsigned int n; | ||
405 | |||
406 | BUG_ON(size > sizeof(shadow)); | ||
407 | |||
408 | page = src_addr & PAGE_MASK; | ||
409 | next_addr = src_addr + size - 1; | ||
410 | next_page = next_addr & PAGE_MASK; | ||
411 | |||
412 | if (likely(page == next_page)) { | ||
413 | /* Same page */ | ||
414 | x = kmemcheck_shadow_lookup(src_addr); | ||
415 | if (x) { | ||
416 | kmemcheck_save_addr(src_addr); | ||
417 | for (i = 0; i < size; ++i) | ||
418 | shadow[i] = x[i]; | ||
419 | } else { | ||
420 | for (i = 0; i < size; ++i) | ||
421 | shadow[i] = KMEMCHECK_SHADOW_INITIALIZED; | ||
422 | } | ||
423 | } else { | ||
424 | n = next_page - src_addr; | ||
425 | BUG_ON(n > sizeof(shadow)); | ||
426 | |||
427 | /* First page */ | ||
428 | x = kmemcheck_shadow_lookup(src_addr); | ||
429 | if (x) { | ||
430 | kmemcheck_save_addr(src_addr); | ||
431 | for (i = 0; i < n; ++i) | ||
432 | shadow[i] = x[i]; | ||
433 | } else { | ||
434 | /* Not tracked */ | ||
435 | for (i = 0; i < n; ++i) | ||
436 | shadow[i] = KMEMCHECK_SHADOW_INITIALIZED; | ||
437 | } | ||
438 | |||
439 | /* Second page */ | ||
440 | x = kmemcheck_shadow_lookup(next_page); | ||
441 | if (x) { | ||
442 | kmemcheck_save_addr(next_page); | ||
443 | for (i = n; i < size; ++i) | ||
444 | shadow[i] = x[i - n]; | ||
445 | } else { | ||
446 | /* Not tracked */ | ||
447 | for (i = n; i < size; ++i) | ||
448 | shadow[i] = KMEMCHECK_SHADOW_INITIALIZED; | ||
449 | } | ||
450 | } | ||
451 | |||
452 | page = dst_addr & PAGE_MASK; | ||
453 | next_addr = dst_addr + size - 1; | ||
454 | next_page = next_addr & PAGE_MASK; | ||
455 | |||
456 | if (likely(page == next_page)) { | ||
457 | /* Same page */ | ||
458 | x = kmemcheck_shadow_lookup(dst_addr); | ||
459 | if (x) { | ||
460 | kmemcheck_save_addr(dst_addr); | ||
461 | for (i = 0; i < size; ++i) { | ||
462 | x[i] = shadow[i]; | ||
463 | shadow[i] = KMEMCHECK_SHADOW_INITIALIZED; | ||
464 | } | ||
465 | } | ||
466 | } else { | ||
467 | n = next_page - dst_addr; | ||
468 | BUG_ON(n > sizeof(shadow)); | ||
469 | |||
470 | /* First page */ | ||
471 | x = kmemcheck_shadow_lookup(dst_addr); | ||
472 | if (x) { | ||
473 | kmemcheck_save_addr(dst_addr); | ||
474 | for (i = 0; i < n; ++i) { | ||
475 | x[i] = shadow[i]; | ||
476 | shadow[i] = KMEMCHECK_SHADOW_INITIALIZED; | ||
477 | } | ||
478 | } | ||
479 | |||
480 | /* Second page */ | ||
481 | x = kmemcheck_shadow_lookup(next_page); | ||
482 | if (x) { | ||
483 | kmemcheck_save_addr(next_page); | ||
484 | for (i = n; i < size; ++i) { | ||
485 | x[i - n] = shadow[i]; | ||
486 | shadow[i] = KMEMCHECK_SHADOW_INITIALIZED; | ||
487 | } | ||
488 | } | ||
489 | } | ||
490 | |||
491 | status = kmemcheck_shadow_test(shadow, size); | ||
492 | if (status == KMEMCHECK_SHADOW_INITIALIZED) | ||
493 | return; | ||
494 | |||
495 | if (kmemcheck_enabled) | ||
496 | kmemcheck_error_save(status, src_addr, size, regs); | ||
497 | |||
498 | if (kmemcheck_enabled == 2) | ||
499 | kmemcheck_enabled = 0; | ||
500 | } | ||
501 | |||
502 | enum kmemcheck_method { | ||
503 | KMEMCHECK_READ, | ||
504 | KMEMCHECK_WRITE, | ||
505 | }; | ||
506 | |||
507 | static void kmemcheck_access(struct pt_regs *regs, | ||
508 | unsigned long fallback_address, enum kmemcheck_method fallback_method) | ||
509 | { | ||
510 | const uint8_t *insn; | ||
511 | const uint8_t *insn_primary; | ||
512 | unsigned int size; | ||
513 | |||
514 | struct kmemcheck_context *data = &__get_cpu_var(kmemcheck_context); | ||
515 | |||
516 | /* Recursive fault -- ouch. */ | ||
517 | if (data->busy) { | ||
518 | kmemcheck_show_addr(fallback_address); | ||
519 | kmemcheck_error_save_bug(regs); | ||
520 | return; | ||
521 | } | ||
522 | |||
523 | data->busy = true; | ||
524 | |||
525 | insn = (const uint8_t *) regs->ip; | ||
526 | insn_primary = kmemcheck_opcode_get_primary(insn); | ||
527 | |||
528 | kmemcheck_opcode_decode(insn, &size); | ||
529 | |||
530 | switch (insn_primary[0]) { | ||
531 | #ifdef CONFIG_KMEMCHECK_BITOPS_OK | ||
532 | /* AND, OR, XOR */ | ||
533 | /* | ||
534 | * Unfortunately, these instructions have to be excluded from | ||
535 | * our regular checking since they access only some (and not | ||
536 | * all) bits. This clears out "bogus" bitfield-access warnings. | ||
537 | */ | ||
538 | case 0x80: | ||
539 | case 0x81: | ||
540 | case 0x82: | ||
541 | case 0x83: | ||
542 | switch ((insn_primary[1] >> 3) & 7) { | ||
543 | /* OR */ | ||
544 | case 1: | ||
545 | /* AND */ | ||
546 | case 4: | ||
547 | /* XOR */ | ||
548 | case 6: | ||
549 | kmemcheck_write(regs, fallback_address, size); | ||
550 | goto out; | ||
551 | |||
552 | /* ADD */ | ||
553 | case 0: | ||
554 | /* ADC */ | ||
555 | case 2: | ||
556 | /* SBB */ | ||
557 | case 3: | ||
558 | /* SUB */ | ||
559 | case 5: | ||
560 | /* CMP */ | ||
561 | case 7: | ||
562 | break; | ||
563 | } | ||
564 | break; | ||
565 | #endif | ||
566 | |||
567 | /* MOVS, MOVSB, MOVSW, MOVSD */ | ||
568 | case 0xa4: | ||
569 | case 0xa5: | ||
570 | /* | ||
571 | * These instructions are special because they take two | ||
572 | * addresses, but we only get one page fault. | ||
573 | */ | ||
574 | kmemcheck_copy(regs, regs->si, regs->di, size); | ||
575 | goto out; | ||
576 | |||
577 | /* CMPS, CMPSB, CMPSW, CMPSD */ | ||
578 | case 0xa6: | ||
579 | case 0xa7: | ||
580 | kmemcheck_read(regs, regs->si, size); | ||
581 | kmemcheck_read(regs, regs->di, size); | ||
582 | goto out; | ||
583 | } | ||
584 | |||
585 | /* | ||
586 | * If the opcode isn't special in any way, we use the data from the | ||
587 | * page fault handler to determine the address and type of memory | ||
588 | * access. | ||
589 | */ | ||
590 | switch (fallback_method) { | ||
591 | case KMEMCHECK_READ: | ||
592 | kmemcheck_read(regs, fallback_address, size); | ||
593 | goto out; | ||
594 | case KMEMCHECK_WRITE: | ||
595 | kmemcheck_write(regs, fallback_address, size); | ||
596 | goto out; | ||
597 | } | ||
598 | |||
599 | out: | ||
600 | data->busy = false; | ||
601 | } | ||
602 | |||
603 | bool kmemcheck_fault(struct pt_regs *regs, unsigned long address, | ||
604 | unsigned long error_code) | ||
605 | { | ||
606 | pte_t *pte; | ||
607 | |||
608 | /* | ||
609 | * XXX: Is it safe to assume that memory accesses from virtual 86 | ||
610 | * mode or non-kernel code segments will _never_ access kernel | ||
611 | * memory (e.g. tracked pages)? For now, we need this to avoid | ||
612 | * invoking kmemcheck for PnP BIOS calls. | ||
613 | */ | ||
614 | if (regs->flags & X86_VM_MASK) | ||
615 | return false; | ||
616 | if (regs->cs != __KERNEL_CS) | ||
617 | return false; | ||
618 | |||
619 | pte = kmemcheck_pte_lookup(address); | ||
620 | if (!pte) | ||
621 | return false; | ||
622 | |||
623 | if (error_code & 2) | ||
624 | kmemcheck_access(regs, address, KMEMCHECK_WRITE); | ||
625 | else | ||
626 | kmemcheck_access(regs, address, KMEMCHECK_READ); | ||
627 | |||
628 | kmemcheck_show(regs); | ||
629 | return true; | ||
630 | } | ||
631 | |||
632 | bool kmemcheck_trap(struct pt_regs *regs) | ||
633 | { | ||
634 | if (!kmemcheck_active(regs)) | ||
635 | return false; | ||
636 | |||
637 | /* We're done. */ | ||
638 | kmemcheck_hide(regs); | ||
639 | return true; | ||
640 | } | ||
diff --git a/arch/x86/mm/kmemcheck/opcode.c b/arch/x86/mm/kmemcheck/opcode.c new file mode 100644 index 000000000000..63c19e27aa6f --- /dev/null +++ b/arch/x86/mm/kmemcheck/opcode.c | |||
@@ -0,0 +1,106 @@ | |||
1 | #include <linux/types.h> | ||
2 | |||
3 | #include "opcode.h" | ||
4 | |||
5 | static bool opcode_is_prefix(uint8_t b) | ||
6 | { | ||
7 | return | ||
8 | /* Group 1 */ | ||
9 | b == 0xf0 || b == 0xf2 || b == 0xf3 | ||
10 | /* Group 2 */ | ||
11 | || b == 0x2e || b == 0x36 || b == 0x3e || b == 0x26 | ||
12 | || b == 0x64 || b == 0x65 || b == 0x2e || b == 0x3e | ||
13 | /* Group 3 */ | ||
14 | || b == 0x66 | ||
15 | /* Group 4 */ | ||
16 | || b == 0x67; | ||
17 | } | ||
18 | |||
19 | #ifdef CONFIG_X86_64 | ||
20 | static bool opcode_is_rex_prefix(uint8_t b) | ||
21 | { | ||
22 | return (b & 0xf0) == 0x40; | ||
23 | } | ||
24 | #else | ||
25 | static bool opcode_is_rex_prefix(uint8_t b) | ||
26 | { | ||
27 | return false; | ||
28 | } | ||
29 | #endif | ||
30 | |||
31 | #define REX_W (1 << 3) | ||
32 | |||
33 | /* | ||
34 | * This is a VERY crude opcode decoder. We only need to find the size of the | ||
35 | * load/store that caused our #PF and this should work for all the opcodes | ||
36 | * that we care about. Moreover, the ones who invented this instruction set | ||
37 | * should be shot. | ||
38 | */ | ||
39 | void kmemcheck_opcode_decode(const uint8_t *op, unsigned int *size) | ||
40 | { | ||
41 | /* Default operand size */ | ||
42 | int operand_size_override = 4; | ||
43 | |||
44 | /* prefixes */ | ||
45 | for (; opcode_is_prefix(*op); ++op) { | ||
46 | if (*op == 0x66) | ||
47 | operand_size_override = 2; | ||
48 | } | ||
49 | |||
50 | /* REX prefix */ | ||
51 | if (opcode_is_rex_prefix(*op)) { | ||
52 | uint8_t rex = *op; | ||
53 | |||
54 | ++op; | ||
55 | if (rex & REX_W) { | ||
56 | switch (*op) { | ||
57 | case 0x63: | ||
58 | *size = 4; | ||
59 | return; | ||
60 | case 0x0f: | ||
61 | ++op; | ||
62 | |||
63 | switch (*op) { | ||
64 | case 0xb6: | ||
65 | case 0xbe: | ||
66 | *size = 1; | ||
67 | return; | ||
68 | case 0xb7: | ||
69 | case 0xbf: | ||
70 | *size = 2; | ||
71 | return; | ||
72 | } | ||
73 | |||
74 | break; | ||
75 | } | ||
76 | |||
77 | *size = 8; | ||
78 | return; | ||
79 | } | ||
80 | } | ||
81 | |||
82 | /* escape opcode */ | ||
83 | if (*op == 0x0f) { | ||
84 | ++op; | ||
85 | |||
86 | /* | ||
87 | * This is move with zero-extend and sign-extend, respectively; | ||
88 | * we don't have to think about 0xb6/0xbe, because this is | ||
89 | * already handled in the conditional below. | ||
90 | */ | ||
91 | if (*op == 0xb7 || *op == 0xbf) | ||
92 | operand_size_override = 2; | ||
93 | } | ||
94 | |||
95 | *size = (*op & 1) ? operand_size_override : 1; | ||
96 | } | ||
97 | |||
98 | const uint8_t *kmemcheck_opcode_get_primary(const uint8_t *op) | ||
99 | { | ||
100 | /* skip prefixes */ | ||
101 | while (opcode_is_prefix(*op)) | ||
102 | ++op; | ||
103 | if (opcode_is_rex_prefix(*op)) | ||
104 | ++op; | ||
105 | return op; | ||
106 | } | ||
diff --git a/arch/x86/mm/kmemcheck/opcode.h b/arch/x86/mm/kmemcheck/opcode.h new file mode 100644 index 000000000000..6956aad66b5b --- /dev/null +++ b/arch/x86/mm/kmemcheck/opcode.h | |||
@@ -0,0 +1,9 @@ | |||
1 | #ifndef ARCH__X86__MM__KMEMCHECK__OPCODE_H | ||
2 | #define ARCH__X86__MM__KMEMCHECK__OPCODE_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | |||
6 | void kmemcheck_opcode_decode(const uint8_t *op, unsigned int *size); | ||
7 | const uint8_t *kmemcheck_opcode_get_primary(const uint8_t *op); | ||
8 | |||
9 | #endif | ||
diff --git a/arch/x86/mm/kmemcheck/pte.c b/arch/x86/mm/kmemcheck/pte.c new file mode 100644 index 000000000000..4ead26eeaf96 --- /dev/null +++ b/arch/x86/mm/kmemcheck/pte.c | |||
@@ -0,0 +1,22 @@ | |||
1 | #include <linux/mm.h> | ||
2 | |||
3 | #include <asm/pgtable.h> | ||
4 | |||
5 | #include "pte.h" | ||
6 | |||
7 | pte_t *kmemcheck_pte_lookup(unsigned long address) | ||
8 | { | ||
9 | pte_t *pte; | ||
10 | unsigned int level; | ||
11 | |||
12 | pte = lookup_address(address, &level); | ||
13 | if (!pte) | ||
14 | return NULL; | ||
15 | if (level != PG_LEVEL_4K) | ||
16 | return NULL; | ||
17 | if (!pte_hidden(*pte)) | ||
18 | return NULL; | ||
19 | |||
20 | return pte; | ||
21 | } | ||
22 | |||
diff --git a/arch/x86/mm/kmemcheck/pte.h b/arch/x86/mm/kmemcheck/pte.h new file mode 100644 index 000000000000..9f5966456492 --- /dev/null +++ b/arch/x86/mm/kmemcheck/pte.h | |||
@@ -0,0 +1,10 @@ | |||
1 | #ifndef ARCH__X86__MM__KMEMCHECK__PTE_H | ||
2 | #define ARCH__X86__MM__KMEMCHECK__PTE_H | ||
3 | |||
4 | #include <linux/mm.h> | ||
5 | |||
6 | #include <asm/pgtable.h> | ||
7 | |||
8 | pte_t *kmemcheck_pte_lookup(unsigned long address); | ||
9 | |||
10 | #endif | ||
diff --git a/arch/x86/mm/kmemcheck/selftest.c b/arch/x86/mm/kmemcheck/selftest.c new file mode 100644 index 000000000000..036efbea8b28 --- /dev/null +++ b/arch/x86/mm/kmemcheck/selftest.c | |||
@@ -0,0 +1,69 @@ | |||
1 | #include <linux/kernel.h> | ||
2 | |||
3 | #include "opcode.h" | ||
4 | #include "selftest.h" | ||
5 | |||
6 | struct selftest_opcode { | ||
7 | unsigned int expected_size; | ||
8 | const uint8_t *insn; | ||
9 | const char *desc; | ||
10 | }; | ||
11 | |||
12 | static const struct selftest_opcode selftest_opcodes[] = { | ||
13 | /* REP MOVS */ | ||
14 | {1, "\xf3\xa4", "rep movsb <mem8>, <mem8>"}, | ||
15 | {4, "\xf3\xa5", "rep movsl <mem32>, <mem32>"}, | ||
16 | |||
17 | /* MOVZX / MOVZXD */ | ||
18 | {1, "\x66\x0f\xb6\x51\xf8", "movzwq <mem8>, <reg16>"}, | ||
19 | {1, "\x0f\xb6\x51\xf8", "movzwq <mem8>, <reg32>"}, | ||
20 | |||
21 | /* MOVSX / MOVSXD */ | ||
22 | {1, "\x66\x0f\xbe\x51\xf8", "movswq <mem8>, <reg16>"}, | ||
23 | {1, "\x0f\xbe\x51\xf8", "movswq <mem8>, <reg32>"}, | ||
24 | |||
25 | #ifdef CONFIG_X86_64 | ||
26 | /* MOVZX / MOVZXD */ | ||
27 | {1, "\x49\x0f\xb6\x51\xf8", "movzbq <mem8>, <reg64>"}, | ||
28 | {2, "\x49\x0f\xb7\x51\xf8", "movzbq <mem16>, <reg64>"}, | ||
29 | |||
30 | /* MOVSX / MOVSXD */ | ||
31 | {1, "\x49\x0f\xbe\x51\xf8", "movsbq <mem8>, <reg64>"}, | ||
32 | {2, "\x49\x0f\xbf\x51\xf8", "movsbq <mem16>, <reg64>"}, | ||
33 | {4, "\x49\x63\x51\xf8", "movslq <mem32>, <reg64>"}, | ||
34 | #endif | ||
35 | }; | ||
36 | |||
37 | static bool selftest_opcode_one(const struct selftest_opcode *op) | ||
38 | { | ||
39 | unsigned size; | ||
40 | |||
41 | kmemcheck_opcode_decode(op->insn, &size); | ||
42 | |||
43 | if (size == op->expected_size) | ||
44 | return true; | ||
45 | |||
46 | printk(KERN_WARNING "kmemcheck: opcode %s: expected size %d, got %d\n", | ||
47 | op->desc, op->expected_size, size); | ||
48 | return false; | ||
49 | } | ||
50 | |||
51 | static bool selftest_opcodes_all(void) | ||
52 | { | ||
53 | bool pass = true; | ||
54 | unsigned int i; | ||
55 | |||
56 | for (i = 0; i < ARRAY_SIZE(selftest_opcodes); ++i) | ||
57 | pass = pass && selftest_opcode_one(&selftest_opcodes[i]); | ||
58 | |||
59 | return pass; | ||
60 | } | ||
61 | |||
62 | bool kmemcheck_selftest(void) | ||
63 | { | ||
64 | bool pass = true; | ||
65 | |||
66 | pass = pass && selftest_opcodes_all(); | ||
67 | |||
68 | return pass; | ||
69 | } | ||
diff --git a/arch/x86/mm/kmemcheck/selftest.h b/arch/x86/mm/kmemcheck/selftest.h new file mode 100644 index 000000000000..8fed4fe11f95 --- /dev/null +++ b/arch/x86/mm/kmemcheck/selftest.h | |||
@@ -0,0 +1,6 @@ | |||
1 | #ifndef ARCH_X86_MM_KMEMCHECK_SELFTEST_H | ||
2 | #define ARCH_X86_MM_KMEMCHECK_SELFTEST_H | ||
3 | |||
4 | bool kmemcheck_selftest(void); | ||
5 | |||
6 | #endif | ||
diff --git a/arch/x86/mm/kmemcheck/shadow.c b/arch/x86/mm/kmemcheck/shadow.c new file mode 100644 index 000000000000..e773b6bd0079 --- /dev/null +++ b/arch/x86/mm/kmemcheck/shadow.c | |||
@@ -0,0 +1,162 @@ | |||
1 | #include <linux/kmemcheck.h> | ||
2 | #include <linux/module.h> | ||
3 | #include <linux/mm.h> | ||
4 | #include <linux/module.h> | ||
5 | |||
6 | #include <asm/page.h> | ||
7 | #include <asm/pgtable.h> | ||
8 | |||
9 | #include "pte.h" | ||
10 | #include "shadow.h" | ||
11 | |||
12 | /* | ||
13 | * Return the shadow address for the given address. Returns NULL if the | ||
14 | * address is not tracked. | ||
15 | * | ||
16 | * We need to be extremely careful not to follow any invalid pointers, | ||
17 | * because this function can be called for *any* possible address. | ||
18 | */ | ||
19 | void *kmemcheck_shadow_lookup(unsigned long address) | ||
20 | { | ||
21 | pte_t *pte; | ||
22 | struct page *page; | ||
23 | |||
24 | if (!virt_addr_valid(address)) | ||
25 | return NULL; | ||
26 | |||
27 | pte = kmemcheck_pte_lookup(address); | ||
28 | if (!pte) | ||
29 | return NULL; | ||
30 | |||
31 | page = virt_to_page(address); | ||
32 | if (!page->shadow) | ||
33 | return NULL; | ||
34 | return page->shadow + (address & (PAGE_SIZE - 1)); | ||
35 | } | ||
36 | |||
37 | static void mark_shadow(void *address, unsigned int n, | ||
38 | enum kmemcheck_shadow status) | ||
39 | { | ||
40 | unsigned long addr = (unsigned long) address; | ||
41 | unsigned long last_addr = addr + n - 1; | ||
42 | unsigned long page = addr & PAGE_MASK; | ||
43 | unsigned long last_page = last_addr & PAGE_MASK; | ||
44 | unsigned int first_n; | ||
45 | void *shadow; | ||
46 | |||
47 | /* If the memory range crosses a page boundary, stop there. */ | ||
48 | if (page == last_page) | ||
49 | first_n = n; | ||
50 | else | ||
51 | first_n = page + PAGE_SIZE - addr; | ||
52 | |||
53 | shadow = kmemcheck_shadow_lookup(addr); | ||
54 | if (shadow) | ||
55 | memset(shadow, status, first_n); | ||
56 | |||
57 | addr += first_n; | ||
58 | n -= first_n; | ||
59 | |||
60 | /* Do full-page memset()s. */ | ||
61 | while (n >= PAGE_SIZE) { | ||
62 | shadow = kmemcheck_shadow_lookup(addr); | ||
63 | if (shadow) | ||
64 | memset(shadow, status, PAGE_SIZE); | ||
65 | |||
66 | addr += PAGE_SIZE; | ||
67 | n -= PAGE_SIZE; | ||
68 | } | ||
69 | |||
70 | /* Do the remaining page, if any. */ | ||
71 | if (n > 0) { | ||
72 | shadow = kmemcheck_shadow_lookup(addr); | ||
73 | if (shadow) | ||
74 | memset(shadow, status, n); | ||
75 | } | ||
76 | } | ||
77 | |||
78 | void kmemcheck_mark_unallocated(void *address, unsigned int n) | ||
79 | { | ||
80 | mark_shadow(address, n, KMEMCHECK_SHADOW_UNALLOCATED); | ||
81 | } | ||
82 | |||
83 | void kmemcheck_mark_uninitialized(void *address, unsigned int n) | ||
84 | { | ||
85 | mark_shadow(address, n, KMEMCHECK_SHADOW_UNINITIALIZED); | ||
86 | } | ||
87 | |||
88 | /* | ||
89 | * Fill the shadow memory of the given address such that the memory at that | ||
90 | * address is marked as being initialized. | ||
91 | */ | ||
92 | void kmemcheck_mark_initialized(void *address, unsigned int n) | ||
93 | { | ||
94 | mark_shadow(address, n, KMEMCHECK_SHADOW_INITIALIZED); | ||
95 | } | ||
96 | EXPORT_SYMBOL_GPL(kmemcheck_mark_initialized); | ||
97 | |||
98 | void kmemcheck_mark_freed(void *address, unsigned int n) | ||
99 | { | ||
100 | mark_shadow(address, n, KMEMCHECK_SHADOW_FREED); | ||
101 | } | ||
102 | |||
103 | void kmemcheck_mark_unallocated_pages(struct page *p, unsigned int n) | ||
104 | { | ||
105 | unsigned int i; | ||
106 | |||
107 | for (i = 0; i < n; ++i) | ||
108 | kmemcheck_mark_unallocated(page_address(&p[i]), PAGE_SIZE); | ||
109 | } | ||
110 | |||
111 | void kmemcheck_mark_uninitialized_pages(struct page *p, unsigned int n) | ||
112 | { | ||
113 | unsigned int i; | ||
114 | |||
115 | for (i = 0; i < n; ++i) | ||
116 | kmemcheck_mark_uninitialized(page_address(&p[i]), PAGE_SIZE); | ||
117 | } | ||
118 | |||
119 | void kmemcheck_mark_initialized_pages(struct page *p, unsigned int n) | ||
120 | { | ||
121 | unsigned int i; | ||
122 | |||
123 | for (i = 0; i < n; ++i) | ||
124 | kmemcheck_mark_initialized(page_address(&p[i]), PAGE_SIZE); | ||
125 | } | ||
126 | |||
127 | enum kmemcheck_shadow kmemcheck_shadow_test(void *shadow, unsigned int size) | ||
128 | { | ||
129 | uint8_t *x; | ||
130 | unsigned int i; | ||
131 | |||
132 | x = shadow; | ||
133 | |||
134 | #ifdef CONFIG_KMEMCHECK_PARTIAL_OK | ||
135 | /* | ||
136 | * Make sure _some_ bytes are initialized. Gcc frequently generates | ||
137 | * code to access neighboring bytes. | ||
138 | */ | ||
139 | for (i = 0; i < size; ++i) { | ||
140 | if (x[i] == KMEMCHECK_SHADOW_INITIALIZED) | ||
141 | return x[i]; | ||
142 | } | ||
143 | #else | ||
144 | /* All bytes must be initialized. */ | ||
145 | for (i = 0; i < size; ++i) { | ||
146 | if (x[i] != KMEMCHECK_SHADOW_INITIALIZED) | ||
147 | return x[i]; | ||
148 | } | ||
149 | #endif | ||
150 | |||
151 | return x[0]; | ||
152 | } | ||
153 | |||
154 | void kmemcheck_shadow_set(void *shadow, unsigned int size) | ||
155 | { | ||
156 | uint8_t *x; | ||
157 | unsigned int i; | ||
158 | |||
159 | x = shadow; | ||
160 | for (i = 0; i < size; ++i) | ||
161 | x[i] = KMEMCHECK_SHADOW_INITIALIZED; | ||
162 | } | ||
diff --git a/arch/x86/mm/kmemcheck/shadow.h b/arch/x86/mm/kmemcheck/shadow.h new file mode 100644 index 000000000000..af46d9ab9d86 --- /dev/null +++ b/arch/x86/mm/kmemcheck/shadow.h | |||
@@ -0,0 +1,16 @@ | |||
1 | #ifndef ARCH__X86__MM__KMEMCHECK__SHADOW_H | ||
2 | #define ARCH__X86__MM__KMEMCHECK__SHADOW_H | ||
3 | |||
4 | enum kmemcheck_shadow { | ||
5 | KMEMCHECK_SHADOW_UNALLOCATED, | ||
6 | KMEMCHECK_SHADOW_UNINITIALIZED, | ||
7 | KMEMCHECK_SHADOW_INITIALIZED, | ||
8 | KMEMCHECK_SHADOW_FREED, | ||
9 | }; | ||
10 | |||
11 | void *kmemcheck_shadow_lookup(unsigned long address); | ||
12 | |||
13 | enum kmemcheck_shadow kmemcheck_shadow_test(void *shadow, unsigned int size); | ||
14 | void kmemcheck_shadow_set(void *shadow, unsigned int size); | ||
15 | |||
16 | #endif | ||
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c index 6ce9518fe2ac..3cfe9ced8a4c 100644 --- a/arch/x86/mm/pageattr.c +++ b/arch/x86/mm/pageattr.c | |||
@@ -470,7 +470,7 @@ static int split_large_page(pte_t *kpte, unsigned long address) | |||
470 | 470 | ||
471 | if (!debug_pagealloc) | 471 | if (!debug_pagealloc) |
472 | spin_unlock(&cpa_lock); | 472 | spin_unlock(&cpa_lock); |
473 | base = alloc_pages(GFP_KERNEL, 0); | 473 | base = alloc_pages(GFP_KERNEL | __GFP_NOTRACK, 0); |
474 | if (!debug_pagealloc) | 474 | if (!debug_pagealloc) |
475 | spin_lock(&cpa_lock); | 475 | spin_lock(&cpa_lock); |
476 | if (!base) | 476 | if (!base) |
diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c index 7aa03a5389f5..8e43bdd45456 100644 --- a/arch/x86/mm/pgtable.c +++ b/arch/x86/mm/pgtable.c | |||
@@ -4,9 +4,11 @@ | |||
4 | #include <asm/tlb.h> | 4 | #include <asm/tlb.h> |
5 | #include <asm/fixmap.h> | 5 | #include <asm/fixmap.h> |
6 | 6 | ||
7 | #define PGALLOC_GFP GFP_KERNEL | __GFP_NOTRACK | __GFP_REPEAT | __GFP_ZERO | ||
8 | |||
7 | pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) | 9 | pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address) |
8 | { | 10 | { |
9 | return (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO); | 11 | return (pte_t *)__get_free_page(PGALLOC_GFP); |
10 | } | 12 | } |
11 | 13 | ||
12 | pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address) | 14 | pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address) |
@@ -14,9 +16,9 @@ pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address) | |||
14 | struct page *pte; | 16 | struct page *pte; |
15 | 17 | ||
16 | #ifdef CONFIG_HIGHPTE | 18 | #ifdef CONFIG_HIGHPTE |
17 | pte = alloc_pages(GFP_KERNEL|__GFP_HIGHMEM|__GFP_REPEAT|__GFP_ZERO, 0); | 19 | pte = alloc_pages(PGALLOC_GFP | __GFP_HIGHMEM, 0); |
18 | #else | 20 | #else |
19 | pte = alloc_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, 0); | 21 | pte = alloc_pages(PGALLOC_GFP, 0); |
20 | #endif | 22 | #endif |
21 | if (pte) | 23 | if (pte) |
22 | pgtable_page_ctor(pte); | 24 | pgtable_page_ctor(pte); |
@@ -161,7 +163,7 @@ static int preallocate_pmds(pmd_t *pmds[]) | |||
161 | bool failed = false; | 163 | bool failed = false; |
162 | 164 | ||
163 | for(i = 0; i < PREALLOCATED_PMDS; i++) { | 165 | for(i = 0; i < PREALLOCATED_PMDS; i++) { |
164 | pmd_t *pmd = (pmd_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT); | 166 | pmd_t *pmd = (pmd_t *)__get_free_page(PGALLOC_GFP); |
165 | if (pmd == NULL) | 167 | if (pmd == NULL) |
166 | failed = true; | 168 | failed = true; |
167 | pmds[i] = pmd; | 169 | pmds[i] = pmd; |
@@ -228,7 +230,7 @@ pgd_t *pgd_alloc(struct mm_struct *mm) | |||
228 | pmd_t *pmds[PREALLOCATED_PMDS]; | 230 | pmd_t *pmds[PREALLOCATED_PMDS]; |
229 | unsigned long flags; | 231 | unsigned long flags; |
230 | 232 | ||
231 | pgd = (pgd_t *)__get_free_page(GFP_KERNEL | __GFP_ZERO); | 233 | pgd = (pgd_t *)__get_free_page(PGALLOC_GFP); |
232 | 234 | ||
233 | if (pgd == NULL) | 235 | if (pgd == NULL) |
234 | goto out; | 236 | goto out; |
diff --git a/arch/xtensa/include/asm/kmap_types.h b/arch/xtensa/include/asm/kmap_types.h index 9e822d2e3bce..11c687e527f1 100644 --- a/arch/xtensa/include/asm/kmap_types.h +++ b/arch/xtensa/include/asm/kmap_types.h | |||
@@ -1,31 +1,6 @@ | |||
1 | /* | ||
2 | * include/asm-xtensa/kmap_types.h | ||
3 | * | ||
4 | * This file is subject to the terms and conditions of the GNU General Public | ||
5 | * License. See the file "COPYING" in the main directory of this archive | ||
6 | * for more details. | ||
7 | * | ||
8 | * Copyright (C) 2001 - 2005 Tensilica Inc. | ||
9 | */ | ||
10 | |||
11 | #ifndef _XTENSA_KMAP_TYPES_H | 1 | #ifndef _XTENSA_KMAP_TYPES_H |
12 | #define _XTENSA_KMAP_TYPES_H | 2 | #define _XTENSA_KMAP_TYPES_H |
13 | 3 | ||
14 | enum km_type { | 4 | #include <asm-generic/kmap_types.h> |
15 | KM_BOUNCE_READ, | ||
16 | KM_SKB_SUNRPC_DATA, | ||
17 | KM_SKB_DATA_SOFTIRQ, | ||
18 | KM_USER0, | ||
19 | KM_USER1, | ||
20 | KM_BIO_SRC_IRQ, | ||
21 | KM_BIO_DST_IRQ, | ||
22 | KM_PTE0, | ||
23 | KM_PTE1, | ||
24 | KM_IRQ0, | ||
25 | KM_IRQ1, | ||
26 | KM_SOFTIRQ0, | ||
27 | KM_SOFTIRQ1, | ||
28 | KM_TYPE_NR | ||
29 | }; | ||
30 | 5 | ||
31 | #endif /* _XTENSA_KMAP_TYPES_H */ | 6 | #endif /* _XTENSA_KMAP_TYPES_H */ |
diff --git a/arch/xtensa/kernel/init_task.c b/arch/xtensa/kernel/init_task.c index e07f5c9fcd35..c4302f0e4ba0 100644 --- a/arch/xtensa/kernel/init_task.c +++ b/arch/xtensa/kernel/init_task.c | |||
@@ -23,10 +23,6 @@ | |||
23 | 23 | ||
24 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | 24 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); |
25 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); | 25 | static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand); |
26 | struct mm_struct init_mm = INIT_MM(init_mm); | ||
27 | |||
28 | EXPORT_SYMBOL(init_mm); | ||
29 | |||
30 | union thread_union init_thread_union | 26 | union thread_union init_thread_union |
31 | __attribute__((__section__(".data.init_task"))) = | 27 | __attribute__((__section__(".data.init_task"))) = |
32 | { INIT_THREAD_INFO(init_task) }; | 28 | { INIT_THREAD_INFO(init_task) }; |