diff options
Diffstat (limited to 'arch/sh/include/asm')
65 files changed, 1006 insertions, 705 deletions
diff --git a/arch/sh/include/asm/Kbuild b/arch/sh/include/asm/Kbuild index e121c30f797d..46cb93477bcb 100644 --- a/arch/sh/include/asm/Kbuild +++ b/arch/sh/include/asm/Kbuild | |||
@@ -1,6 +1,8 @@ | |||
1 | include include/asm-generic/Kbuild.asm | 1 | include include/asm-generic/Kbuild.asm |
2 | 2 | ||
3 | header-y += cachectl.h cpu-features.h | 3 | header-y += cachectl.h |
4 | header-y += cpu-features.h | ||
5 | header-y += hw_breakpoint.h | ||
4 | 6 | ||
5 | unifdef-y += unistd_32.h | 7 | unifdef-y += unistd_32.h |
6 | unifdef-y += unistd_64.h | 8 | unifdef-y += unistd_64.h |
diff --git a/arch/sh/include/asm/addrspace.h b/arch/sh/include/asm/addrspace.h index 99d6b3ecbe22..446b3831c214 100644 --- a/arch/sh/include/asm/addrspace.h +++ b/arch/sh/include/asm/addrspace.h | |||
@@ -28,7 +28,7 @@ | |||
28 | /* Returns the privileged segment base of a given address */ | 28 | /* Returns the privileged segment base of a given address */ |
29 | #define PXSEG(a) (((unsigned long)(a)) & 0xe0000000) | 29 | #define PXSEG(a) (((unsigned long)(a)) & 0xe0000000) |
30 | 30 | ||
31 | #if defined(CONFIG_29BIT) || defined(CONFIG_PMB_FIXED) | 31 | #ifdef CONFIG_29BIT |
32 | /* | 32 | /* |
33 | * Map an address to a certain privileged segment | 33 | * Map an address to a certain privileged segment |
34 | */ | 34 | */ |
@@ -40,7 +40,15 @@ | |||
40 | ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P3SEG)) | 40 | ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P3SEG)) |
41 | #define P4SEGADDR(a) \ | 41 | #define P4SEGADDR(a) \ |
42 | ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P4SEG)) | 42 | ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P4SEG)) |
43 | #endif /* 29BIT || PMB_FIXED */ | 43 | #else |
44 | /* | ||
45 | * These will never work in 32-bit, don't even bother. | ||
46 | */ | ||
47 | #define P1SEGADDR(a) __futile_remapping_attempt | ||
48 | #define P2SEGADDR(a) __futile_remapping_attempt | ||
49 | #define P3SEGADDR(a) __futile_remapping_attempt | ||
50 | #define P4SEGADDR(a) __futile_remapping_attempt | ||
51 | #endif | ||
44 | #endif /* P1SEG */ | 52 | #endif /* P1SEG */ |
45 | 53 | ||
46 | /* Check if an address can be reached in 29 bits */ | 54 | /* Check if an address can be reached in 29 bits */ |
@@ -57,11 +65,5 @@ | |||
57 | #define P3_ADDR_MAX P4SEG | 65 | #define P3_ADDR_MAX P4SEG |
58 | #endif | 66 | #endif |
59 | 67 | ||
60 | #ifndef __ASSEMBLY__ | ||
61 | #ifdef CONFIG_PMB | ||
62 | extern int __in_29bit_mode(void); | ||
63 | #endif /* CONFIG_PMB */ | ||
64 | #endif /* __ASSEMBLY__ */ | ||
65 | |||
66 | #endif /* __KERNEL__ */ | 68 | #endif /* __KERNEL__ */ |
67 | #endif /* __ASM_SH_ADDRSPACE_H */ | 69 | #endif /* __ASM_SH_ADDRSPACE_H */ |
diff --git a/arch/sh/include/asm/alignment.h b/arch/sh/include/asm/alignment.h new file mode 100644 index 000000000000..b12efecf5294 --- /dev/null +++ b/arch/sh/include/asm/alignment.h | |||
@@ -0,0 +1,21 @@ | |||
1 | #ifndef __ASM_SH_ALIGNMENT_H | ||
2 | #define __ASM_SH_ALIGNMENT_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | |||
6 | extern void inc_unaligned_byte_access(void); | ||
7 | extern void inc_unaligned_word_access(void); | ||
8 | extern void inc_unaligned_dword_access(void); | ||
9 | extern void inc_unaligned_multi_access(void); | ||
10 | extern void inc_unaligned_user_access(void); | ||
11 | extern void inc_unaligned_kernel_access(void); | ||
12 | |||
13 | #define UM_WARN (1 << 0) | ||
14 | #define UM_FIXUP (1 << 1) | ||
15 | #define UM_SIGNAL (1 << 2) | ||
16 | |||
17 | extern unsigned int unaligned_user_action(void); | ||
18 | |||
19 | extern void unaligned_fixups_notify(struct task_struct *, insn_size_t, struct pt_regs *); | ||
20 | |||
21 | #endif /* __ASM_SH_ALIGNMENT_H */ | ||
diff --git a/arch/sh/include/asm/atomic-grb.h b/arch/sh/include/asm/atomic-grb.h index 4c5b7dbfcedb..a273c88578fc 100644 --- a/arch/sh/include/asm/atomic-grb.h +++ b/arch/sh/include/asm/atomic-grb.h | |||
@@ -120,50 +120,4 @@ static inline void atomic_set_mask(unsigned int mask, atomic_t *v) | |||
120 | : "memory" , "r0", "r1"); | 120 | : "memory" , "r0", "r1"); |
121 | } | 121 | } |
122 | 122 | ||
123 | static inline int atomic_cmpxchg(atomic_t *v, int old, int new) | ||
124 | { | ||
125 | int ret; | ||
126 | |||
127 | __asm__ __volatile__ ( | ||
128 | " .align 2 \n\t" | ||
129 | " mova 1f, r0 \n\t" | ||
130 | " nop \n\t" | ||
131 | " mov r15, r1 \n\t" | ||
132 | " mov #-8, r15 \n\t" | ||
133 | " mov.l @%1, %0 \n\t" | ||
134 | " cmp/eq %2, %0 \n\t" | ||
135 | " bf 1f \n\t" | ||
136 | " mov.l %3, @%1 \n\t" | ||
137 | "1: mov r1, r15 \n\t" | ||
138 | : "=&r" (ret) | ||
139 | : "r" (v), "r" (old), "r" (new) | ||
140 | : "memory" , "r0", "r1" , "t"); | ||
141 | |||
142 | return ret; | ||
143 | } | ||
144 | |||
145 | static inline int atomic_add_unless(atomic_t *v, int a, int u) | ||
146 | { | ||
147 | int ret; | ||
148 | unsigned long tmp; | ||
149 | |||
150 | __asm__ __volatile__ ( | ||
151 | " .align 2 \n\t" | ||
152 | " mova 1f, r0 \n\t" | ||
153 | " nop \n\t" | ||
154 | " mov r15, r1 \n\t" | ||
155 | " mov #-12, r15 \n\t" | ||
156 | " mov.l @%2, %1 \n\t" | ||
157 | " mov %1, %0 \n\t" | ||
158 | " cmp/eq %4, %0 \n\t" | ||
159 | " bt/s 1f \n\t" | ||
160 | " add %3, %1 \n\t" | ||
161 | " mov.l %1, @%2 \n\t" | ||
162 | "1: mov r1, r15 \n\t" | ||
163 | : "=&r" (ret), "=&r" (tmp) | ||
164 | : "r" (v), "r" (a), "r" (u) | ||
165 | : "memory" , "r0", "r1" , "t"); | ||
166 | |||
167 | return ret != u; | ||
168 | } | ||
169 | #endif /* __ASM_SH_ATOMIC_GRB_H */ | 123 | #endif /* __ASM_SH_ATOMIC_GRB_H */ |
diff --git a/arch/sh/include/asm/atomic-llsc.h b/arch/sh/include/asm/atomic-llsc.h index b040e1e08610..4b00b78e3f4f 100644 --- a/arch/sh/include/asm/atomic-llsc.h +++ b/arch/sh/include/asm/atomic-llsc.h | |||
@@ -104,31 +104,4 @@ static inline void atomic_set_mask(unsigned int mask, atomic_t *v) | |||
104 | : "t"); | 104 | : "t"); |
105 | } | 105 | } |
106 | 106 | ||
107 | #define atomic_cmpxchg(v, o, n) (cmpxchg(&((v)->counter), (o), (n))) | ||
108 | |||
109 | /** | ||
110 | * atomic_add_unless - add unless the number is a given value | ||
111 | * @v: pointer of type atomic_t | ||
112 | * @a: the amount to add to v... | ||
113 | * @u: ...unless v is equal to u. | ||
114 | * | ||
115 | * Atomically adds @a to @v, so long as it was not @u. | ||
116 | * Returns non-zero if @v was not @u, and zero otherwise. | ||
117 | */ | ||
118 | static inline int atomic_add_unless(atomic_t *v, int a, int u) | ||
119 | { | ||
120 | int c, old; | ||
121 | c = atomic_read(v); | ||
122 | for (;;) { | ||
123 | if (unlikely(c == (u))) | ||
124 | break; | ||
125 | old = atomic_cmpxchg((v), c, c + (a)); | ||
126 | if (likely(old == c)) | ||
127 | break; | ||
128 | c = old; | ||
129 | } | ||
130 | |||
131 | return c != (u); | ||
132 | } | ||
133 | |||
134 | #endif /* __ASM_SH_ATOMIC_LLSC_H */ | 107 | #endif /* __ASM_SH_ATOMIC_LLSC_H */ |
diff --git a/arch/sh/include/asm/atomic.h b/arch/sh/include/asm/atomic.h index b16388d71954..c7983124d99d 100644 --- a/arch/sh/include/asm/atomic.h +++ b/arch/sh/include/asm/atomic.h | |||
@@ -13,7 +13,7 @@ | |||
13 | 13 | ||
14 | #define ATOMIC_INIT(i) ( (atomic_t) { (i) } ) | 14 | #define ATOMIC_INIT(i) ( (atomic_t) { (i) } ) |
15 | 15 | ||
16 | #define atomic_read(v) ((v)->counter) | 16 | #define atomic_read(v) (*(volatile int *)&(v)->counter) |
17 | #define atomic_set(v,i) ((v)->counter = (i)) | 17 | #define atomic_set(v,i) ((v)->counter = (i)) |
18 | 18 | ||
19 | #if defined(CONFIG_GUSA_RB) | 19 | #if defined(CONFIG_GUSA_RB) |
@@ -25,58 +25,43 @@ | |||
25 | #endif | 25 | #endif |
26 | 26 | ||
27 | #define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0) | 27 | #define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0) |
28 | #define atomic_dec_return(v) atomic_sub_return(1, (v)) | ||
29 | #define atomic_inc_return(v) atomic_add_return(1, (v)) | ||
30 | #define atomic_inc_and_test(v) (atomic_inc_return(v) == 0) | ||
31 | #define atomic_sub_and_test(i,v) (atomic_sub_return((i), (v)) == 0) | ||
32 | #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) | ||
33 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) | ||
28 | 34 | ||
29 | #define atomic_dec_return(v) atomic_sub_return(1,(v)) | 35 | #define atomic_inc(v) atomic_add(1, (v)) |
30 | #define atomic_inc_return(v) atomic_add_return(1,(v)) | 36 | #define atomic_dec(v) atomic_sub(1, (v)) |
31 | 37 | ||
32 | /* | 38 | #define atomic_xchg(v, new) (xchg(&((v)->counter), new)) |
33 | * atomic_inc_and_test - increment and test | 39 | #define atomic_cmpxchg(v, o, n) (cmpxchg(&((v)->counter), (o), (n))) |
40 | |||
41 | /** | ||
42 | * atomic_add_unless - add unless the number is a given value | ||
34 | * @v: pointer of type atomic_t | 43 | * @v: pointer of type atomic_t |
44 | * @a: the amount to add to v... | ||
45 | * @u: ...unless v is equal to u. | ||
35 | * | 46 | * |
36 | * Atomically increments @v by 1 | 47 | * Atomically adds @a to @v, so long as it was not @u. |
37 | * and returns true if the result is zero, or false for all | 48 | * Returns non-zero if @v was not @u, and zero otherwise. |
38 | * other cases. | ||
39 | */ | 49 | */ |
40 | #define atomic_inc_and_test(v) (atomic_inc_return(v) == 0) | ||
41 | |||
42 | #define atomic_sub_and_test(i,v) (atomic_sub_return((i), (v)) == 0) | ||
43 | #define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0) | ||
44 | |||
45 | #define atomic_inc(v) atomic_add(1,(v)) | ||
46 | #define atomic_dec(v) atomic_sub(1,(v)) | ||
47 | |||
48 | #if !defined(CONFIG_GUSA_RB) && !defined(CONFIG_CPU_SH4A) | ||
49 | static inline int atomic_cmpxchg(atomic_t *v, int old, int new) | ||
50 | { | ||
51 | int ret; | ||
52 | unsigned long flags; | ||
53 | |||
54 | local_irq_save(flags); | ||
55 | ret = v->counter; | ||
56 | if (likely(ret == old)) | ||
57 | v->counter = new; | ||
58 | local_irq_restore(flags); | ||
59 | |||
60 | return ret; | ||
61 | } | ||
62 | |||
63 | static inline int atomic_add_unless(atomic_t *v, int a, int u) | 50 | static inline int atomic_add_unless(atomic_t *v, int a, int u) |
64 | { | 51 | { |
65 | int ret; | 52 | int c, old; |
66 | unsigned long flags; | 53 | c = atomic_read(v); |
67 | 54 | for (;;) { | |
68 | local_irq_save(flags); | 55 | if (unlikely(c == (u))) |
69 | ret = v->counter; | 56 | break; |
70 | if (ret != u) | 57 | old = atomic_cmpxchg((v), c, c + (a)); |
71 | v->counter += a; | 58 | if (likely(old == c)) |
72 | local_irq_restore(flags); | 59 | break; |
73 | 60 | c = old; | |
74 | return ret != u; | 61 | } |
62 | |||
63 | return c != (u); | ||
75 | } | 64 | } |
76 | #endif /* !CONFIG_GUSA_RB && !CONFIG_CPU_SH4A */ | ||
77 | |||
78 | #define atomic_xchg(v, new) (xchg(&((v)->counter), new)) | ||
79 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) | ||
80 | 65 | ||
81 | #define smp_mb__before_atomic_dec() smp_mb() | 66 | #define smp_mb__before_atomic_dec() smp_mb() |
82 | #define smp_mb__after_atomic_dec() smp_mb() | 67 | #define smp_mb__after_atomic_dec() smp_mb() |
diff --git a/arch/sh/include/asm/bug.h b/arch/sh/include/asm/bug.h index d02c01b3e6b9..6323f864d111 100644 --- a/arch/sh/include/asm/bug.h +++ b/arch/sh/include/asm/bug.h | |||
@@ -48,7 +48,7 @@ do { \ | |||
48 | "i" (sizeof(struct bug_entry))); \ | 48 | "i" (sizeof(struct bug_entry))); \ |
49 | } while (0) | 49 | } while (0) |
50 | 50 | ||
51 | #define __WARN() \ | 51 | #define __WARN_TAINT(taint) \ |
52 | do { \ | 52 | do { \ |
53 | __asm__ __volatile__ ( \ | 53 | __asm__ __volatile__ ( \ |
54 | "1:\t.short %O0\n" \ | 54 | "1:\t.short %O0\n" \ |
@@ -57,7 +57,7 @@ do { \ | |||
57 | : "n" (TRAPA_BUG_OPCODE), \ | 57 | : "n" (TRAPA_BUG_OPCODE), \ |
58 | "i" (__FILE__), \ | 58 | "i" (__FILE__), \ |
59 | "i" (__LINE__), \ | 59 | "i" (__LINE__), \ |
60 | "i" (BUGFLAG_WARNING), \ | 60 | "i" (BUGFLAG_TAINT(taint)), \ |
61 | "i" (sizeof(struct bug_entry))); \ | 61 | "i" (sizeof(struct bug_entry))); \ |
62 | } while (0) | 62 | } while (0) |
63 | 63 | ||
diff --git a/arch/sh/include/asm/cache.h b/arch/sh/include/asm/cache.h index 455a9a9bd7dd..ef9e555aafba 100644 --- a/arch/sh/include/asm/cache.h +++ b/arch/sh/include/asm/cache.h | |||
@@ -38,14 +38,10 @@ struct cache_info { | |||
38 | * 2. those in the physical page number. | 38 | * 2. those in the physical page number. |
39 | */ | 39 | */ |
40 | unsigned int alias_mask; | 40 | unsigned int alias_mask; |
41 | |||
42 | unsigned int n_aliases; /* Number of aliases */ | 41 | unsigned int n_aliases; /* Number of aliases */ |
43 | 42 | ||
44 | unsigned long flags; | 43 | unsigned long flags; |
45 | }; | 44 | }; |
46 | |||
47 | int __init detect_cpu_and_cache_system(void); | ||
48 | |||
49 | #endif /* __ASSEMBLY__ */ | 45 | #endif /* __ASSEMBLY__ */ |
50 | #endif /* __KERNEL__ */ | 46 | #endif /* __KERNEL__ */ |
51 | #endif /* __ASM_SH_CACHE_H */ | 47 | #endif /* __ASM_SH_CACHE_H */ |
diff --git a/arch/sh/include/asm/cacheflush.h b/arch/sh/include/asm/cacheflush.h index dda96eb3e7c0..1f4e562c5e8c 100644 --- a/arch/sh/include/asm/cacheflush.h +++ b/arch/sh/include/asm/cacheflush.h | |||
@@ -63,6 +63,14 @@ static inline void flush_anon_page(struct vm_area_struct *vma, | |||
63 | if (boot_cpu_data.dcache.n_aliases && PageAnon(page)) | 63 | if (boot_cpu_data.dcache.n_aliases && PageAnon(page)) |
64 | __flush_anon_page(page, vmaddr); | 64 | __flush_anon_page(page, vmaddr); |
65 | } | 65 | } |
66 | static inline void flush_kernel_vmap_range(void *addr, int size) | ||
67 | { | ||
68 | __flush_wback_region(addr, size); | ||
69 | } | ||
70 | static inline void invalidate_kernel_vmap_range(void *addr, int size) | ||
71 | { | ||
72 | __flush_invalidate_region(addr, size); | ||
73 | } | ||
66 | 74 | ||
67 | #define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE | 75 | #define ARCH_HAS_FLUSH_KERNEL_DCACHE_PAGE |
68 | static inline void flush_kernel_dcache_page(struct page *page) | 76 | static inline void flush_kernel_dcache_page(struct page *page) |
@@ -78,8 +86,8 @@ extern void copy_from_user_page(struct vm_area_struct *vma, | |||
78 | struct page *page, unsigned long vaddr, void *dst, const void *src, | 86 | struct page *page, unsigned long vaddr, void *dst, const void *src, |
79 | unsigned long len); | 87 | unsigned long len); |
80 | 88 | ||
81 | #define flush_cache_vmap(start, end) flush_cache_all() | 89 | #define flush_cache_vmap(start, end) local_flush_cache_all(NULL) |
82 | #define flush_cache_vunmap(start, end) flush_cache_all() | 90 | #define flush_cache_vunmap(start, end) local_flush_cache_all(NULL) |
83 | 91 | ||
84 | #define flush_dcache_mmap_lock(mapping) do { } while (0) | 92 | #define flush_dcache_mmap_lock(mapping) do { } while (0) |
85 | #define flush_dcache_mmap_unlock(mapping) do { } while (0) | 93 | #define flush_dcache_mmap_unlock(mapping) do { } while (0) |
diff --git a/arch/sh/include/asm/clkdev.h b/arch/sh/include/asm/clkdev.h new file mode 100644 index 000000000000..5645f358128b --- /dev/null +++ b/arch/sh/include/asm/clkdev.h | |||
@@ -0,0 +1,35 @@ | |||
1 | /* | ||
2 | * arch/sh/include/asm/clkdev.h | ||
3 | * | ||
4 | * Cloned from arch/arm/include/asm/clkdev.h: | ||
5 | * | ||
6 | * Copyright (C) 2008 Russell King. | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License version 2 as | ||
10 | * published by the Free Software Foundation. | ||
11 | * | ||
12 | * Helper for the clk API to assist looking up a struct clk. | ||
13 | */ | ||
14 | #ifndef __ASM_CLKDEV_H | ||
15 | #define __ASM_CLKDEV_H | ||
16 | |||
17 | struct clk; | ||
18 | |||
19 | struct clk_lookup { | ||
20 | struct list_head node; | ||
21 | const char *dev_id; | ||
22 | const char *con_id; | ||
23 | struct clk *clk; | ||
24 | }; | ||
25 | |||
26 | struct clk_lookup *clkdev_alloc(struct clk *clk, const char *con_id, | ||
27 | const char *dev_fmt, ...); | ||
28 | |||
29 | void clkdev_add(struct clk_lookup *cl); | ||
30 | void clkdev_drop(struct clk_lookup *cl); | ||
31 | |||
32 | void clkdev_add_table(struct clk_lookup *, size_t); | ||
33 | int clk_add_alias(const char *, const char *, char *, struct device *); | ||
34 | |||
35 | #endif | ||
diff --git a/arch/sh/include/asm/clock.h b/arch/sh/include/asm/clock.h index 9fe7d7f8af40..803d4c7f09dc 100644 --- a/arch/sh/include/asm/clock.h +++ b/arch/sh/include/asm/clock.h | |||
@@ -1,162 +1,16 @@ | |||
1 | #ifndef __ASM_SH_CLOCK_H | 1 | #ifndef __ASM_SH_CLOCK_H |
2 | #define __ASM_SH_CLOCK_H | 2 | #define __ASM_SH_CLOCK_H |
3 | 3 | ||
4 | #include <linux/list.h> | 4 | #include <linux/sh_clk.h> |
5 | #include <linux/seq_file.h> | ||
6 | #include <linux/cpufreq.h> | ||
7 | #include <linux/clk.h> | ||
8 | #include <linux/err.h> | ||
9 | |||
10 | struct clk; | ||
11 | |||
12 | struct clk_ops { | ||
13 | void (*init)(struct clk *clk); | ||
14 | int (*enable)(struct clk *clk); | ||
15 | void (*disable)(struct clk *clk); | ||
16 | unsigned long (*recalc)(struct clk *clk); | ||
17 | int (*set_rate)(struct clk *clk, unsigned long rate, int algo_id); | ||
18 | int (*set_parent)(struct clk *clk, struct clk *parent); | ||
19 | long (*round_rate)(struct clk *clk, unsigned long rate); | ||
20 | }; | ||
21 | |||
22 | struct clk { | ||
23 | struct list_head node; | ||
24 | const char *name; | ||
25 | int id; | ||
26 | struct module *owner; | ||
27 | |||
28 | struct clk *parent; | ||
29 | struct clk_ops *ops; | ||
30 | |||
31 | struct list_head children; | ||
32 | struct list_head sibling; /* node for children */ | ||
33 | |||
34 | int usecount; | ||
35 | |||
36 | unsigned long rate; | ||
37 | unsigned long flags; | ||
38 | |||
39 | void __iomem *enable_reg; | ||
40 | unsigned int enable_bit; | ||
41 | |||
42 | unsigned long arch_flags; | ||
43 | void *priv; | ||
44 | struct dentry *dentry; | ||
45 | struct cpufreq_frequency_table *freq_table; | ||
46 | }; | ||
47 | |||
48 | struct clk_lookup { | ||
49 | struct list_head node; | ||
50 | const char *dev_id; | ||
51 | const char *con_id; | ||
52 | struct clk *clk; | ||
53 | }; | ||
54 | |||
55 | #define CLK_ENABLE_ON_INIT (1 << 0) | ||
56 | 5 | ||
57 | /* Should be defined by processor-specific code */ | 6 | /* Should be defined by processor-specific code */ |
58 | void __deprecated arch_init_clk_ops(struct clk_ops **, int type); | 7 | void __deprecated arch_init_clk_ops(struct clk_ops **, int type); |
59 | int __init arch_clk_init(void); | 8 | int __init arch_clk_init(void); |
60 | 9 | ||
61 | /* arch/sh/kernel/cpu/clock.c */ | ||
62 | int clk_init(void); | ||
63 | unsigned long followparent_recalc(struct clk *); | ||
64 | void recalculate_root_clocks(void); | ||
65 | void propagate_rate(struct clk *); | ||
66 | int clk_reparent(struct clk *child, struct clk *parent); | ||
67 | int clk_register(struct clk *); | ||
68 | void clk_unregister(struct clk *); | ||
69 | |||
70 | /* arch/sh/kernel/cpu/clock-cpg.c */ | 10 | /* arch/sh/kernel/cpu/clock-cpg.c */ |
71 | int __init __deprecated cpg_clk_init(void); | 11 | int __init __deprecated cpg_clk_init(void); |
72 | 12 | ||
73 | /* the exported API, in addition to clk_set_rate */ | 13 | /* arch/sh/kernel/cpu/clock.c */ |
74 | /** | 14 | int clk_init(void); |
75 | * clk_set_rate_ex - set the clock rate for a clock source, with additional parameter | ||
76 | * @clk: clock source | ||
77 | * @rate: desired clock rate in Hz | ||
78 | * @algo_id: algorithm id to be passed down to ops->set_rate | ||
79 | * | ||
80 | * Returns success (0) or negative errno. | ||
81 | */ | ||
82 | int clk_set_rate_ex(struct clk *clk, unsigned long rate, int algo_id); | ||
83 | |||
84 | enum clk_sh_algo_id { | ||
85 | NO_CHANGE = 0, | ||
86 | |||
87 | IUS_N1_N1, | ||
88 | IUS_322, | ||
89 | IUS_522, | ||
90 | IUS_N11, | ||
91 | |||
92 | SB_N1, | ||
93 | |||
94 | SB3_N1, | ||
95 | SB3_32, | ||
96 | SB3_43, | ||
97 | SB3_54, | ||
98 | |||
99 | BP_N1, | ||
100 | |||
101 | IP_N1, | ||
102 | }; | ||
103 | |||
104 | struct clk_div_mult_table { | ||
105 | unsigned int *divisors; | ||
106 | unsigned int nr_divisors; | ||
107 | unsigned int *multipliers; | ||
108 | unsigned int nr_multipliers; | ||
109 | }; | ||
110 | |||
111 | struct cpufreq_frequency_table; | ||
112 | void clk_rate_table_build(struct clk *clk, | ||
113 | struct cpufreq_frequency_table *freq_table, | ||
114 | int nr_freqs, | ||
115 | struct clk_div_mult_table *src_table, | ||
116 | unsigned long *bitmap); | ||
117 | |||
118 | long clk_rate_table_round(struct clk *clk, | ||
119 | struct cpufreq_frequency_table *freq_table, | ||
120 | unsigned long rate); | ||
121 | |||
122 | int clk_rate_table_find(struct clk *clk, | ||
123 | struct cpufreq_frequency_table *freq_table, | ||
124 | unsigned long rate); | ||
125 | |||
126 | #define SH_CLK_MSTP32(_name, _id, _parent, _enable_reg, \ | ||
127 | _enable_bit, _flags) \ | ||
128 | { \ | ||
129 | .name = _name, \ | ||
130 | .id = _id, \ | ||
131 | .parent = _parent, \ | ||
132 | .enable_reg = (void __iomem *)_enable_reg, \ | ||
133 | .enable_bit = _enable_bit, \ | ||
134 | .flags = _flags, \ | ||
135 | } | ||
136 | |||
137 | int sh_clk_mstp32_register(struct clk *clks, int nr); | ||
138 | |||
139 | #define SH_CLK_DIV4(_name, _parent, _reg, _shift, _div_bitmap, _flags) \ | ||
140 | { \ | ||
141 | .name = _name, \ | ||
142 | .parent = _parent, \ | ||
143 | .enable_reg = (void __iomem *)_reg, \ | ||
144 | .enable_bit = _shift, \ | ||
145 | .arch_flags = _div_bitmap, \ | ||
146 | .flags = _flags, \ | ||
147 | } | ||
148 | |||
149 | int sh_clk_div4_register(struct clk *clks, int nr, | ||
150 | struct clk_div_mult_table *table); | ||
151 | |||
152 | #define SH_CLK_DIV6(_name, _parent, _reg, _flags) \ | ||
153 | { \ | ||
154 | .name = _name, \ | ||
155 | .parent = _parent, \ | ||
156 | .enable_reg = (void __iomem *)_reg, \ | ||
157 | .flags = _flags, \ | ||
158 | } | ||
159 | |||
160 | int sh_clk_div6_register(struct clk *clks, int nr); | ||
161 | 15 | ||
162 | #endif /* __ASM_SH_CLOCK_H */ | 16 | #endif /* __ASM_SH_CLOCK_H */ |
diff --git a/arch/sh/include/asm/cmpxchg-grb.h b/arch/sh/include/asm/cmpxchg-grb.h index e2681abe764f..4676bf57693a 100644 --- a/arch/sh/include/asm/cmpxchg-grb.h +++ b/arch/sh/include/asm/cmpxchg-grb.h | |||
@@ -57,11 +57,10 @@ static inline unsigned long __cmpxchg_u32(volatile int *m, unsigned long old, | |||
57 | " mov.l @%1, %0 \n\t" /* load old value */ | 57 | " mov.l @%1, %0 \n\t" /* load old value */ |
58 | " cmp/eq %0, %2 \n\t" | 58 | " cmp/eq %0, %2 \n\t" |
59 | " bf 1f \n\t" /* if not equal */ | 59 | " bf 1f \n\t" /* if not equal */ |
60 | " mov.l %2, @%1 \n\t" /* store new value */ | 60 | " mov.l %3, @%1 \n\t" /* store new value */ |
61 | "1: mov r1, r15 \n\t" /* LOGOUT */ | 61 | "1: mov r1, r15 \n\t" /* LOGOUT */ |
62 | : "=&r" (retval), | 62 | : "=&r" (retval) |
63 | "+r" (m) | 63 | : "r" (m), "r" (old), "r" (new) |
64 | : "r" (new) | ||
65 | : "memory" , "r0", "r1", "t"); | 64 | : "memory" , "r0", "r1", "t"); |
66 | 65 | ||
67 | return retval; | 66 | return retval; |
diff --git a/arch/sh/include/asm/dma-mapping.h b/arch/sh/include/asm/dma-mapping.h index 87ced133a363..bea3337a426a 100644 --- a/arch/sh/include/asm/dma-mapping.h +++ b/arch/sh/include/asm/dma-mapping.h | |||
@@ -89,8 +89,6 @@ static inline void dma_free_coherent(struct device *dev, size_t size, | |||
89 | { | 89 | { |
90 | struct dma_map_ops *ops = get_dma_ops(dev); | 90 | struct dma_map_ops *ops = get_dma_ops(dev); |
91 | 91 | ||
92 | WARN_ON(irqs_disabled()); /* for portability */ | ||
93 | |||
94 | if (dma_release_from_coherent(dev, get_order(size), vaddr)) | 92 | if (dma_release_from_coherent(dev, get_order(size), vaddr)) |
95 | return; | 93 | return; |
96 | 94 | ||
diff --git a/arch/sh/include/asm/dma-register.h b/arch/sh/include/asm/dma-register.h new file mode 100644 index 000000000000..51cd78feacff --- /dev/null +++ b/arch/sh/include/asm/dma-register.h | |||
@@ -0,0 +1,51 @@ | |||
1 | /* | ||
2 | * Common header for the legacy SH DMA driver and the new dmaengine driver | ||
3 | * | ||
4 | * extracted from arch/sh/include/asm/dma-sh.h: | ||
5 | * | ||
6 | * Copyright (C) 2000 Takashi YOSHII | ||
7 | * Copyright (C) 2003 Paul Mundt | ||
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 | #ifndef DMA_REGISTER_H | ||
14 | #define DMA_REGISTER_H | ||
15 | |||
16 | /* DMA register */ | ||
17 | #define SAR 0x00 | ||
18 | #define DAR 0x04 | ||
19 | #define TCR 0x08 | ||
20 | #define CHCR 0x0C | ||
21 | #define DMAOR 0x40 | ||
22 | |||
23 | /* DMAOR definitions */ | ||
24 | #define DMAOR_AE 0x00000004 | ||
25 | #define DMAOR_NMIF 0x00000002 | ||
26 | #define DMAOR_DME 0x00000001 | ||
27 | |||
28 | /* Definitions for the SuperH DMAC */ | ||
29 | #define REQ_L 0x00000000 | ||
30 | #define REQ_E 0x00080000 | ||
31 | #define RACK_H 0x00000000 | ||
32 | #define RACK_L 0x00040000 | ||
33 | #define ACK_R 0x00000000 | ||
34 | #define ACK_W 0x00020000 | ||
35 | #define ACK_H 0x00000000 | ||
36 | #define ACK_L 0x00010000 | ||
37 | #define DM_INC 0x00004000 | ||
38 | #define DM_DEC 0x00008000 | ||
39 | #define DM_FIX 0x0000c000 | ||
40 | #define SM_INC 0x00001000 | ||
41 | #define SM_DEC 0x00002000 | ||
42 | #define SM_FIX 0x00003000 | ||
43 | #define RS_IN 0x00000200 | ||
44 | #define RS_OUT 0x00000300 | ||
45 | #define TS_BLK 0x00000040 | ||
46 | #define TM_BUR 0x00000020 | ||
47 | #define CHCR_DE 0x00000001 | ||
48 | #define CHCR_TE 0x00000002 | ||
49 | #define CHCR_IE 0x00000004 | ||
50 | |||
51 | #endif | ||
diff --git a/arch/sh/include/asm/dma-sh.h b/arch/sh/include/asm/dma-sh.h index 78eed3e0bdf5..f3acb8e34c6b 100644 --- a/arch/sh/include/asm/dma-sh.h +++ b/arch/sh/include/asm/dma-sh.h | |||
@@ -11,7 +11,8 @@ | |||
11 | #ifndef __DMA_SH_H | 11 | #ifndef __DMA_SH_H |
12 | #define __DMA_SH_H | 12 | #define __DMA_SH_H |
13 | 13 | ||
14 | #include <asm/dma.h> | 14 | #include <asm/dma-register.h> |
15 | #include <cpu/dma-register.h> | ||
15 | #include <cpu/dma.h> | 16 | #include <cpu/dma.h> |
16 | 17 | ||
17 | /* DMAOR contorl: The DMAOR access size is different by CPU.*/ | 18 | /* DMAOR contorl: The DMAOR access size is different by CPU.*/ |
@@ -20,14 +21,14 @@ | |||
20 | defined(CONFIG_CPU_SUBTYPE_SH7780) || \ | 21 | defined(CONFIG_CPU_SUBTYPE_SH7780) || \ |
21 | defined(CONFIG_CPU_SUBTYPE_SH7785) | 22 | defined(CONFIG_CPU_SUBTYPE_SH7785) |
22 | #define dmaor_read_reg(n) \ | 23 | #define dmaor_read_reg(n) \ |
23 | (n ? ctrl_inw(SH_DMAC_BASE1 + DMAOR) \ | 24 | (n ? __raw_readw(SH_DMAC_BASE1 + DMAOR) \ |
24 | : ctrl_inw(SH_DMAC_BASE0 + DMAOR)) | 25 | : __raw_readw(SH_DMAC_BASE0 + DMAOR)) |
25 | #define dmaor_write_reg(n, data) \ | 26 | #define dmaor_write_reg(n, data) \ |
26 | (n ? ctrl_outw(data, SH_DMAC_BASE1 + DMAOR) \ | 27 | (n ? __raw_writew(data, SH_DMAC_BASE1 + DMAOR) \ |
27 | : ctrl_outw(data, SH_DMAC_BASE0 + DMAOR)) | 28 | : __raw_writew(data, SH_DMAC_BASE0 + DMAOR)) |
28 | #else /* Other CPU */ | 29 | #else /* Other CPU */ |
29 | #define dmaor_read_reg(n) ctrl_inw(SH_DMAC_BASE0 + DMAOR) | 30 | #define dmaor_read_reg(n) __raw_readw(SH_DMAC_BASE0 + DMAOR) |
30 | #define dmaor_write_reg(n, data) ctrl_outw(data, SH_DMAC_BASE0 + DMAOR) | 31 | #define dmaor_write_reg(n, data) __raw_writew(data, SH_DMAC_BASE0 + DMAOR) |
31 | #endif | 32 | #endif |
32 | 33 | ||
33 | static int dmte_irq_map[] __maybe_unused = { | 34 | static int dmte_irq_map[] __maybe_unused = { |
@@ -53,37 +54,11 @@ static int dmte_irq_map[] __maybe_unused = { | |||
53 | #endif | 54 | #endif |
54 | }; | 55 | }; |
55 | 56 | ||
56 | /* Definitions for the SuperH DMAC */ | ||
57 | #define REQ_L 0x00000000 | ||
58 | #define REQ_E 0x00080000 | ||
59 | #define RACK_H 0x00000000 | ||
60 | #define RACK_L 0x00040000 | ||
61 | #define ACK_R 0x00000000 | ||
62 | #define ACK_W 0x00020000 | ||
63 | #define ACK_H 0x00000000 | ||
64 | #define ACK_L 0x00010000 | ||
65 | #define DM_INC 0x00004000 | ||
66 | #define DM_DEC 0x00008000 | ||
67 | #define SM_INC 0x00001000 | ||
68 | #define SM_DEC 0x00002000 | ||
69 | #define RS_IN 0x00000200 | ||
70 | #define RS_OUT 0x00000300 | ||
71 | #define TS_BLK 0x00000040 | ||
72 | #define TM_BUR 0x00000020 | ||
73 | #define CHCR_DE 0x00000001 | ||
74 | #define CHCR_TE 0x00000002 | ||
75 | #define CHCR_IE 0x00000004 | ||
76 | |||
77 | /* DMAOR definitions */ | ||
78 | #define DMAOR_AE 0x00000004 | ||
79 | #define DMAOR_NMIF 0x00000002 | ||
80 | #define DMAOR_DME 0x00000001 | ||
81 | |||
82 | /* | 57 | /* |
83 | * Define the default configuration for dual address memory-memory transfer. | 58 | * Define the default configuration for dual address memory-memory transfer. |
84 | * The 0x400 value represents auto-request, external->external. | 59 | * The 0x400 value represents auto-request, external->external. |
85 | */ | 60 | */ |
86 | #define RS_DUAL (DM_INC | SM_INC | 0x400 | TS_32) | 61 | #define RS_DUAL (DM_INC | SM_INC | 0x400 | TS_INDEX2VAL(XMIT_SZ_32BIT)) |
87 | 62 | ||
88 | /* DMA base address */ | 63 | /* DMA base address */ |
89 | static u32 dma_base_addr[] __maybe_unused = { | 64 | static u32 dma_base_addr[] __maybe_unused = { |
@@ -109,24 +84,4 @@ static u32 dma_base_addr[] __maybe_unused = { | |||
109 | #endif | 84 | #endif |
110 | }; | 85 | }; |
111 | 86 | ||
112 | /* DMA register */ | ||
113 | #define SAR 0x00 | ||
114 | #define DAR 0x04 | ||
115 | #define TCR 0x08 | ||
116 | #define CHCR 0x0C | ||
117 | #define DMAOR 0x40 | ||
118 | |||
119 | /* | ||
120 | * for dma engine | ||
121 | * | ||
122 | * SuperH DMA mode | ||
123 | */ | ||
124 | #define SHDMA_MIX_IRQ (1 << 1) | ||
125 | #define SHDMA_DMAOR1 (1 << 2) | ||
126 | #define SHDMA_DMAE1 (1 << 3) | ||
127 | |||
128 | struct sh_dmae_pdata { | ||
129 | unsigned int mode; | ||
130 | }; | ||
131 | |||
132 | #endif /* __DMA_SH_H */ | 87 | #endif /* __DMA_SH_H */ |
diff --git a/arch/sh/include/asm/dwarf.h b/arch/sh/include/asm/dwarf.h index bdccbbfdc0bd..d62abd1d0c05 100644 --- a/arch/sh/include/asm/dwarf.h +++ b/arch/sh/include/asm/dwarf.h | |||
@@ -243,16 +243,13 @@ struct dwarf_cie { | |||
243 | 243 | ||
244 | unsigned long cie_pointer; | 244 | unsigned long cie_pointer; |
245 | 245 | ||
246 | struct list_head link; | ||
247 | |||
248 | unsigned long flags; | 246 | unsigned long flags; |
249 | #define DWARF_CIE_Z_AUGMENTATION (1 << 0) | 247 | #define DWARF_CIE_Z_AUGMENTATION (1 << 0) |
250 | 248 | ||
251 | /* | 249 | /* linked-list entry if this CIE is from a module */ |
252 | * 'mod' will be non-NULL if this CIE came from a module's | 250 | struct list_head link; |
253 | * .eh_frame section. | 251 | |
254 | */ | 252 | struct rb_node node; |
255 | struct module *mod; | ||
256 | }; | 253 | }; |
257 | 254 | ||
258 | /** | 255 | /** |
@@ -266,13 +263,11 @@ struct dwarf_fde { | |||
266 | unsigned long address_range; | 263 | unsigned long address_range; |
267 | unsigned char *instructions; | 264 | unsigned char *instructions; |
268 | unsigned char *end; | 265 | unsigned char *end; |
266 | |||
267 | /* linked-list entry if this FDE is from a module */ | ||
269 | struct list_head link; | 268 | struct list_head link; |
270 | 269 | ||
271 | /* | 270 | struct rb_node node; |
272 | * 'mod' will be non-NULL if this FDE came from a module's | ||
273 | * .eh_frame section. | ||
274 | */ | ||
275 | struct module *mod; | ||
276 | }; | 271 | }; |
277 | 272 | ||
278 | /** | 273 | /** |
diff --git a/arch/sh/include/asm/elf.h b/arch/sh/include/asm/elf.h index ac04255022b6..ce830faeebbf 100644 --- a/arch/sh/include/asm/elf.h +++ b/arch/sh/include/asm/elf.h | |||
@@ -211,7 +211,9 @@ extern void __kernel_vsyscall; | |||
211 | 211 | ||
212 | #define VSYSCALL_AUX_ENT \ | 212 | #define VSYSCALL_AUX_ENT \ |
213 | if (vdso_enabled) \ | 213 | if (vdso_enabled) \ |
214 | NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_BASE); | 214 | NEW_AUX_ENT(AT_SYSINFO_EHDR, VDSO_BASE); \ |
215 | else \ | ||
216 | NEW_AUX_ENT(AT_IGNORE, 0); | ||
215 | #else | 217 | #else |
216 | #define VSYSCALL_AUX_ENT | 218 | #define VSYSCALL_AUX_ENT |
217 | #endif /* CONFIG_VSYSCALL */ | 219 | #endif /* CONFIG_VSYSCALL */ |
@@ -219,7 +221,7 @@ extern void __kernel_vsyscall; | |||
219 | #ifdef CONFIG_SH_FPU | 221 | #ifdef CONFIG_SH_FPU |
220 | #define FPU_AUX_ENT NEW_AUX_ENT(AT_FPUCW, FPSCR_INIT) | 222 | #define FPU_AUX_ENT NEW_AUX_ENT(AT_FPUCW, FPSCR_INIT) |
221 | #else | 223 | #else |
222 | #define FPU_AUX_ENT | 224 | #define FPU_AUX_ENT NEW_AUX_ENT(AT_IGNORE, 0) |
223 | #endif | 225 | #endif |
224 | 226 | ||
225 | extern int l1i_cache_shape, l1d_cache_shape, l2_cache_shape; | 227 | extern int l1i_cache_shape, l1d_cache_shape, l2_cache_shape; |
diff --git a/arch/sh/include/asm/fixmap.h b/arch/sh/include/asm/fixmap.h index 5ac1e40a511c..6e7cea453895 100644 --- a/arch/sh/include/asm/fixmap.h +++ b/arch/sh/include/asm/fixmap.h | |||
@@ -55,16 +55,29 @@ enum fixed_addresses { | |||
55 | #define FIX_N_COLOURS 8 | 55 | #define FIX_N_COLOURS 8 |
56 | FIX_CMAP_BEGIN, | 56 | FIX_CMAP_BEGIN, |
57 | FIX_CMAP_END = FIX_CMAP_BEGIN + (FIX_N_COLOURS * NR_CPUS) - 1, | 57 | FIX_CMAP_END = FIX_CMAP_BEGIN + (FIX_N_COLOURS * NR_CPUS) - 1, |
58 | FIX_UNCACHED, | 58 | |
59 | #ifdef CONFIG_HIGHMEM | 59 | #ifdef CONFIG_HIGHMEM |
60 | FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */ | 60 | FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */ |
61 | FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1, | 61 | FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1, |
62 | #endif | 62 | #endif |
63 | |||
64 | #ifdef CONFIG_IOREMAP_FIXED | ||
65 | /* | ||
66 | * FIX_IOREMAP entries are useful for mapping physical address | ||
67 | * space before ioremap() is useable, e.g. really early in boot | ||
68 | * before kmalloc() is working. | ||
69 | */ | ||
70 | #define FIX_N_IOREMAPS 32 | ||
71 | FIX_IOREMAP_BEGIN, | ||
72 | FIX_IOREMAP_END = FIX_IOREMAP_BEGIN + FIX_N_IOREMAPS, | ||
73 | #endif | ||
74 | |||
63 | __end_of_fixed_addresses | 75 | __end_of_fixed_addresses |
64 | }; | 76 | }; |
65 | 77 | ||
66 | extern void __set_fixmap(enum fixed_addresses idx, | 78 | extern void __set_fixmap(enum fixed_addresses idx, |
67 | unsigned long phys, pgprot_t flags); | 79 | unsigned long phys, pgprot_t flags); |
80 | extern void __clear_fixmap(enum fixed_addresses idx, pgprot_t flags); | ||
68 | 81 | ||
69 | #define set_fixmap(idx, phys) \ | 82 | #define set_fixmap(idx, phys) \ |
70 | __set_fixmap(idx, phys, PAGE_KERNEL) | 83 | __set_fixmap(idx, phys, PAGE_KERNEL) |
diff --git a/arch/sh/include/asm/fpu.h b/arch/sh/include/asm/fpu.h index fb6bbb9b1cc8..06c4281aab65 100644 --- a/arch/sh/include/asm/fpu.h +++ b/arch/sh/include/asm/fpu.h | |||
@@ -2,8 +2,8 @@ | |||
2 | #define __ASM_SH_FPU_H | 2 | #define __ASM_SH_FPU_H |
3 | 3 | ||
4 | #ifndef __ASSEMBLY__ | 4 | #ifndef __ASSEMBLY__ |
5 | #include <linux/preempt.h> | 5 | |
6 | #include <asm/ptrace.h> | 6 | struct task_struct; |
7 | 7 | ||
8 | #ifdef CONFIG_SH_FPU | 8 | #ifdef CONFIG_SH_FPU |
9 | static inline void release_fpu(struct pt_regs *regs) | 9 | static inline void release_fpu(struct pt_regs *regs) |
@@ -16,22 +16,23 @@ static inline void grab_fpu(struct pt_regs *regs) | |||
16 | regs->sr &= ~SR_FD; | 16 | regs->sr &= ~SR_FD; |
17 | } | 17 | } |
18 | 18 | ||
19 | struct task_struct; | ||
20 | |||
21 | extern void save_fpu(struct task_struct *__tsk); | 19 | extern void save_fpu(struct task_struct *__tsk); |
22 | void fpu_state_restore(struct pt_regs *regs); | 20 | extern void restore_fpu(struct task_struct *__tsk); |
21 | extern void fpu_state_restore(struct pt_regs *regs); | ||
22 | extern void __fpu_state_restore(void); | ||
23 | #else | 23 | #else |
24 | 24 | #define save_fpu(tsk) do { } while (0) | |
25 | #define save_fpu(tsk) do { } while (0) | 25 | #define restore_fpu(tsk) do { } while (0) |
26 | #define release_fpu(regs) do { } while (0) | 26 | #define release_fpu(regs) do { } while (0) |
27 | #define grab_fpu(regs) do { } while (0) | 27 | #define grab_fpu(regs) do { } while (0) |
28 | #define fpu_state_restore(regs) do { } while (0) | 28 | #define fpu_state_restore(regs) do { } while (0) |
29 | 29 | #define __fpu_state_restore(regs) do { } while (0) | |
30 | #endif | 30 | #endif |
31 | 31 | ||
32 | struct user_regset; | 32 | struct user_regset; |
33 | 33 | ||
34 | extern int do_fpu_inst(unsigned short, struct pt_regs *); | 34 | extern int do_fpu_inst(unsigned short, struct pt_regs *); |
35 | extern int init_fpu(struct task_struct *); | ||
35 | 36 | ||
36 | extern int fpregs_get(struct task_struct *target, | 37 | extern int fpregs_get(struct task_struct *target, |
37 | const struct user_regset *regset, | 38 | const struct user_regset *regset, |
@@ -65,18 +66,6 @@ static inline void clear_fpu(struct task_struct *tsk, struct pt_regs *regs) | |||
65 | preempt_enable(); | 66 | preempt_enable(); |
66 | } | 67 | } |
67 | 68 | ||
68 | static inline int init_fpu(struct task_struct *tsk) | ||
69 | { | ||
70 | if (tsk_used_math(tsk)) { | ||
71 | if ((boot_cpu_data.flags & CPU_HAS_FPU) && tsk == current) | ||
72 | unlazy_fpu(tsk, task_pt_regs(tsk)); | ||
73 | return 0; | ||
74 | } | ||
75 | |||
76 | set_stopped_child_used_math(tsk); | ||
77 | return 0; | ||
78 | } | ||
79 | |||
80 | #endif /* __ASSEMBLY__ */ | 69 | #endif /* __ASSEMBLY__ */ |
81 | 70 | ||
82 | #endif /* __ASM_SH_FPU_H */ | 71 | #endif /* __ASM_SH_FPU_H */ |
diff --git a/arch/sh/include/asm/hw_breakpoint.h b/arch/sh/include/asm/hw_breakpoint.h new file mode 100644 index 000000000000..89890f61a7b9 --- /dev/null +++ b/arch/sh/include/asm/hw_breakpoint.h | |||
@@ -0,0 +1,70 @@ | |||
1 | #ifndef __ASM_SH_HW_BREAKPOINT_H | ||
2 | #define __ASM_SH_HW_BREAKPOINT_H | ||
3 | |||
4 | #ifdef __KERNEL__ | ||
5 | #define __ARCH_HW_BREAKPOINT_H | ||
6 | |||
7 | #include <linux/kdebug.h> | ||
8 | #include <linux/types.h> | ||
9 | |||
10 | struct arch_hw_breakpoint { | ||
11 | char *name; /* Contains name of the symbol to set bkpt */ | ||
12 | unsigned long address; | ||
13 | u16 len; | ||
14 | u16 type; | ||
15 | }; | ||
16 | |||
17 | enum { | ||
18 | SH_BREAKPOINT_READ = (1 << 1), | ||
19 | SH_BREAKPOINT_WRITE = (1 << 2), | ||
20 | SH_BREAKPOINT_RW = SH_BREAKPOINT_READ | SH_BREAKPOINT_WRITE, | ||
21 | |||
22 | SH_BREAKPOINT_LEN_1 = (1 << 12), | ||
23 | SH_BREAKPOINT_LEN_2 = (1 << 13), | ||
24 | SH_BREAKPOINT_LEN_4 = SH_BREAKPOINT_LEN_1 | SH_BREAKPOINT_LEN_2, | ||
25 | SH_BREAKPOINT_LEN_8 = (1 << 14), | ||
26 | }; | ||
27 | |||
28 | struct sh_ubc { | ||
29 | const char *name; | ||
30 | unsigned int num_events; | ||
31 | unsigned int trap_nr; | ||
32 | void (*enable)(struct arch_hw_breakpoint *, int); | ||
33 | void (*disable)(struct arch_hw_breakpoint *, int); | ||
34 | void (*enable_all)(unsigned long); | ||
35 | void (*disable_all)(void); | ||
36 | unsigned long (*active_mask)(void); | ||
37 | unsigned long (*triggered_mask)(void); | ||
38 | void (*clear_triggered_mask)(unsigned long); | ||
39 | struct clk *clk; /* optional interface clock / MSTP bit */ | ||
40 | }; | ||
41 | |||
42 | struct perf_event; | ||
43 | struct task_struct; | ||
44 | struct pmu; | ||
45 | |||
46 | /* Maximum number of UBC channels */ | ||
47 | #define HBP_NUM 2 | ||
48 | |||
49 | static inline int hw_breakpoint_slots(int type) | ||
50 | { | ||
51 | return HBP_NUM; | ||
52 | } | ||
53 | |||
54 | /* arch/sh/kernel/hw_breakpoint.c */ | ||
55 | extern int arch_check_bp_in_kernelspace(struct perf_event *bp); | ||
56 | extern int arch_validate_hwbkpt_settings(struct perf_event *bp); | ||
57 | extern int hw_breakpoint_exceptions_notify(struct notifier_block *unused, | ||
58 | unsigned long val, void *data); | ||
59 | |||
60 | int arch_install_hw_breakpoint(struct perf_event *bp); | ||
61 | void arch_uninstall_hw_breakpoint(struct perf_event *bp); | ||
62 | void hw_breakpoint_pmu_read(struct perf_event *bp); | ||
63 | |||
64 | extern void arch_fill_perf_breakpoint(struct perf_event *bp); | ||
65 | extern int register_sh_ubc(struct sh_ubc *); | ||
66 | |||
67 | extern struct pmu perf_ops_bp; | ||
68 | |||
69 | #endif /* __KERNEL__ */ | ||
70 | #endif /* __ASM_SH_HW_BREAKPOINT_H */ | ||
diff --git a/arch/sh/include/asm/hwblk.h b/arch/sh/include/asm/hwblk.h index 5d3ccae4202b..855e945c6199 100644 --- a/arch/sh/include/asm/hwblk.h +++ b/arch/sh/include/asm/hwblk.h | |||
@@ -58,13 +58,11 @@ void hwblk_cnt_inc(struct hwblk_info *info, int hwblk, int cnt); | |||
58 | void hwblk_cnt_dec(struct hwblk_info *info, int hwblk, int cnt); | 58 | void hwblk_cnt_dec(struct hwblk_info *info, int hwblk, int cnt); |
59 | 59 | ||
60 | /* allow clocks to enable and disable hardware blocks */ | 60 | /* allow clocks to enable and disable hardware blocks */ |
61 | #define SH_HWBLK_CLK(_name, _id, _parent, _hwblk, _flags) \ | 61 | #define SH_HWBLK_CLK(_hwblk, _parent, _flags) \ |
62 | { \ | 62 | [_hwblk] = { \ |
63 | .name = _name, \ | 63 | .parent = _parent, \ |
64 | .id = _id, \ | 64 | .arch_flags = _hwblk, \ |
65 | .parent = _parent, \ | 65 | .flags = _flags, \ |
66 | .arch_flags = _hwblk, \ | ||
67 | .flags = _flags, \ | ||
68 | } | 66 | } |
69 | 67 | ||
70 | int sh_hwblk_clk_register(struct clk *clks, int nr); | 68 | int sh_hwblk_clk_register(struct clk *clks, int nr); |
diff --git a/arch/sh/include/asm/io.h b/arch/sh/include/asm/io.h index 026dd659a640..f689554e17c1 100644 --- a/arch/sh/include/asm/io.h +++ b/arch/sh/include/asm/io.h | |||
@@ -22,6 +22,7 @@ | |||
22 | * for old compat code for I/O offseting to SuperIOs, all of which are | 22 | * for old compat code for I/O offseting to SuperIOs, all of which are |
23 | * better handled through the machvec ioport mapping routines these days. | 23 | * better handled through the machvec ioport mapping routines these days. |
24 | */ | 24 | */ |
25 | #include <linux/errno.h> | ||
25 | #include <asm/cache.h> | 26 | #include <asm/cache.h> |
26 | #include <asm/system.h> | 27 | #include <asm/system.h> |
27 | #include <asm/addrspace.h> | 28 | #include <asm/addrspace.h> |
@@ -79,16 +80,51 @@ | |||
79 | #define writel(v,a) ({ __raw_writel((v),(a)); mb(); }) | 80 | #define writel(v,a) ({ __raw_writel((v),(a)); mb(); }) |
80 | #define writeq(v,a) ({ __raw_writeq((v),(a)); mb(); }) | 81 | #define writeq(v,a) ({ __raw_writeq((v),(a)); mb(); }) |
81 | 82 | ||
82 | /* SuperH on-chip I/O functions */ | 83 | /* |
83 | #define ctrl_inb __raw_readb | 84 | * Legacy SuperH on-chip I/O functions |
84 | #define ctrl_inw __raw_readw | 85 | * |
85 | #define ctrl_inl __raw_readl | 86 | * These are all deprecated, all new (and especially cross-platform) code |
86 | #define ctrl_inq __raw_readq | 87 | * should be using the __raw_xxx() routines directly. |
88 | */ | ||
89 | static inline u8 __deprecated ctrl_inb(unsigned long addr) | ||
90 | { | ||
91 | return __raw_readb(addr); | ||
92 | } | ||
93 | |||
94 | static inline u16 __deprecated ctrl_inw(unsigned long addr) | ||
95 | { | ||
96 | return __raw_readw(addr); | ||
97 | } | ||
98 | |||
99 | static inline u32 __deprecated ctrl_inl(unsigned long addr) | ||
100 | { | ||
101 | return __raw_readl(addr); | ||
102 | } | ||
87 | 103 | ||
88 | #define ctrl_outb __raw_writeb | 104 | static inline u64 __deprecated ctrl_inq(unsigned long addr) |
89 | #define ctrl_outw __raw_writew | 105 | { |
90 | #define ctrl_outl __raw_writel | 106 | return __raw_readq(addr); |
91 | #define ctrl_outq __raw_writeq | 107 | } |
108 | |||
109 | static inline void __deprecated ctrl_outb(u8 v, unsigned long addr) | ||
110 | { | ||
111 | __raw_writeb(v, addr); | ||
112 | } | ||
113 | |||
114 | static inline void __deprecated ctrl_outw(u16 v, unsigned long addr) | ||
115 | { | ||
116 | __raw_writew(v, addr); | ||
117 | } | ||
118 | |||
119 | static inline void __deprecated ctrl_outl(u32 v, unsigned long addr) | ||
120 | { | ||
121 | __raw_writel(v, addr); | ||
122 | } | ||
123 | |||
124 | static inline void __deprecated ctrl_outq(u64 v, unsigned long addr) | ||
125 | { | ||
126 | __raw_writeq(v, addr); | ||
127 | } | ||
92 | 128 | ||
93 | extern unsigned long generic_io_base; | 129 | extern unsigned long generic_io_base; |
94 | 130 | ||
@@ -97,6 +133,28 @@ static inline void ctrl_delay(void) | |||
97 | __raw_readw(generic_io_base); | 133 | __raw_readw(generic_io_base); |
98 | } | 134 | } |
99 | 135 | ||
136 | #define __BUILD_UNCACHED_IO(bwlq, type) \ | ||
137 | static inline type read##bwlq##_uncached(unsigned long addr) \ | ||
138 | { \ | ||
139 | type ret; \ | ||
140 | jump_to_uncached(); \ | ||
141 | ret = __raw_read##bwlq(addr); \ | ||
142 | back_to_cached(); \ | ||
143 | return ret; \ | ||
144 | } \ | ||
145 | \ | ||
146 | static inline void write##bwlq##_uncached(type v, unsigned long addr) \ | ||
147 | { \ | ||
148 | jump_to_uncached(); \ | ||
149 | __raw_write##bwlq(v, addr); \ | ||
150 | back_to_cached(); \ | ||
151 | } | ||
152 | |||
153 | __BUILD_UNCACHED_IO(b, u8) | ||
154 | __BUILD_UNCACHED_IO(w, u16) | ||
155 | __BUILD_UNCACHED_IO(l, u32) | ||
156 | __BUILD_UNCACHED_IO(q, u64) | ||
157 | |||
100 | #define __BUILD_MEMORY_STRING(bwlq, type) \ | 158 | #define __BUILD_MEMORY_STRING(bwlq, type) \ |
101 | \ | 159 | \ |
102 | static inline void __raw_writes##bwlq(volatile void __iomem *mem, \ | 160 | static inline void __raw_writes##bwlq(volatile void __iomem *mem, \ |
@@ -233,29 +291,22 @@ unsigned long long poke_real_address_q(unsigned long long addr, | |||
233 | * doesn't exist, so everything must go through page tables. | 291 | * doesn't exist, so everything must go through page tables. |
234 | */ | 292 | */ |
235 | #ifdef CONFIG_MMU | 293 | #ifdef CONFIG_MMU |
236 | void __iomem *__ioremap_caller(unsigned long offset, unsigned long size, | 294 | void __iomem *__ioremap_caller(phys_addr_t offset, unsigned long size, |
237 | unsigned long flags, void *caller); | 295 | pgprot_t prot, void *caller); |
238 | void __iounmap(void __iomem *addr); | 296 | void __iounmap(void __iomem *addr); |
239 | 297 | ||
240 | static inline void __iomem * | 298 | static inline void __iomem * |
241 | __ioremap(unsigned long offset, unsigned long size, unsigned long flags) | 299 | __ioremap(phys_addr_t offset, unsigned long size, pgprot_t prot) |
242 | { | 300 | { |
243 | return __ioremap_caller(offset, size, flags, __builtin_return_address(0)); | 301 | return __ioremap_caller(offset, size, prot, __builtin_return_address(0)); |
244 | } | 302 | } |
245 | 303 | ||
246 | static inline void __iomem * | 304 | static inline void __iomem * |
247 | __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags) | 305 | __ioremap_29bit(phys_addr_t offset, unsigned long size, pgprot_t prot) |
248 | { | 306 | { |
249 | #if defined(CONFIG_SUPERH32) && !defined(CONFIG_PMB_FIXED) && !defined(CONFIG_PMB) | 307 | #ifdef CONFIG_29BIT |
250 | unsigned long last_addr = offset + size - 1; | 308 | phys_addr_t last_addr = offset + size - 1; |
251 | #endif | ||
252 | void __iomem *ret; | ||
253 | |||
254 | ret = __ioremap_trapped(offset, size); | ||
255 | if (ret) | ||
256 | return ret; | ||
257 | 309 | ||
258 | #if defined(CONFIG_SUPERH32) && !defined(CONFIG_PMB_FIXED) && !defined(CONFIG_PMB) | ||
259 | /* | 310 | /* |
260 | * For P1 and P2 space this is trivial, as everything is already | 311 | * For P1 and P2 space this is trivial, as everything is already |
261 | * mapped. Uncached access for P1 addresses are done through P2. | 312 | * mapped. Uncached access for P1 addresses are done through P2. |
@@ -263,7 +314,7 @@ __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags) | |||
263 | * mapping must be done by the PMB or by using page tables. | 314 | * mapping must be done by the PMB or by using page tables. |
264 | */ | 315 | */ |
265 | if (likely(PXSEG(offset) < P3SEG && PXSEG(last_addr) < P3SEG)) { | 316 | if (likely(PXSEG(offset) < P3SEG && PXSEG(last_addr) < P3SEG)) { |
266 | if (unlikely(flags & _PAGE_CACHABLE)) | 317 | if (unlikely(pgprot_val(prot) & _PAGE_CACHABLE)) |
267 | return (void __iomem *)P1SEGADDR(offset); | 318 | return (void __iomem *)P1SEGADDR(offset); |
268 | 319 | ||
269 | return (void __iomem *)P2SEGADDR(offset); | 320 | return (void __iomem *)P2SEGADDR(offset); |
@@ -274,26 +325,67 @@ __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags) | |||
274 | return (void __iomem *)P4SEGADDR(offset); | 325 | return (void __iomem *)P4SEGADDR(offset); |
275 | #endif | 326 | #endif |
276 | 327 | ||
277 | return __ioremap(offset, size, flags); | 328 | return NULL; |
329 | } | ||
330 | |||
331 | static inline void __iomem * | ||
332 | __ioremap_mode(phys_addr_t offset, unsigned long size, pgprot_t prot) | ||
333 | { | ||
334 | void __iomem *ret; | ||
335 | |||
336 | ret = __ioremap_trapped(offset, size); | ||
337 | if (ret) | ||
338 | return ret; | ||
339 | |||
340 | ret = __ioremap_29bit(offset, size, prot); | ||
341 | if (ret) | ||
342 | return ret; | ||
343 | |||
344 | return __ioremap(offset, size, prot); | ||
278 | } | 345 | } |
279 | #else | 346 | #else |
280 | #define __ioremap(offset, size, flags) ((void __iomem *)(offset)) | 347 | #define __ioremap(offset, size, prot) ((void __iomem *)(offset)) |
281 | #define __ioremap_mode(offset, size, flags) ((void __iomem *)(offset)) | 348 | #define __ioremap_mode(offset, size, prot) ((void __iomem *)(offset)) |
282 | #define __iounmap(addr) do { } while (0) | 349 | #define __iounmap(addr) do { } while (0) |
283 | #endif /* CONFIG_MMU */ | 350 | #endif /* CONFIG_MMU */ |
284 | 351 | ||
285 | #define ioremap(offset, size) \ | 352 | static inline void __iomem *ioremap(phys_addr_t offset, unsigned long size) |
286 | __ioremap_mode((offset), (size), 0) | 353 | { |
287 | #define ioremap_nocache(offset, size) \ | 354 | return __ioremap_mode(offset, size, PAGE_KERNEL_NOCACHE); |
288 | __ioremap_mode((offset), (size), 0) | 355 | } |
289 | #define ioremap_cache(offset, size) \ | 356 | |
290 | __ioremap_mode((offset), (size), _PAGE_CACHABLE) | 357 | static inline void __iomem * |
291 | #define p3_ioremap(offset, size, flags) \ | 358 | ioremap_cache(phys_addr_t offset, unsigned long size) |
292 | __ioremap((offset), (size), (flags)) | 359 | { |
293 | #define ioremap_prot(offset, size, flags) \ | 360 | return __ioremap_mode(offset, size, PAGE_KERNEL); |
294 | __ioremap_mode((offset), (size), (flags)) | 361 | } |
295 | #define iounmap(addr) \ | 362 | |
296 | __iounmap((addr)) | 363 | #ifdef CONFIG_HAVE_IOREMAP_PROT |
364 | static inline void __iomem * | ||
365 | ioremap_prot(phys_addr_t offset, unsigned long size, unsigned long flags) | ||
366 | { | ||
367 | return __ioremap_mode(offset, size, __pgprot(flags)); | ||
368 | } | ||
369 | #endif | ||
370 | |||
371 | #ifdef CONFIG_IOREMAP_FIXED | ||
372 | extern void __iomem *ioremap_fixed(phys_addr_t, unsigned long, pgprot_t); | ||
373 | extern int iounmap_fixed(void __iomem *); | ||
374 | extern void ioremap_fixed_init(void); | ||
375 | #else | ||
376 | static inline void __iomem * | ||
377 | ioremap_fixed(phys_addr_t phys_addr, unsigned long size, pgprot_t prot) | ||
378 | { | ||
379 | BUG(); | ||
380 | return NULL; | ||
381 | } | ||
382 | |||
383 | static inline void ioremap_fixed_init(void) { } | ||
384 | static inline int iounmap_fixed(void __iomem *addr) { return -EINVAL; } | ||
385 | #endif | ||
386 | |||
387 | #define ioremap_nocache ioremap | ||
388 | #define iounmap __iounmap | ||
297 | 389 | ||
298 | #define maybebadio(port) \ | 390 | #define maybebadio(port) \ |
299 | printk(KERN_ERR "bad PC-like io %s:%u for port 0x%lx at 0x%08x\n", \ | 391 | printk(KERN_ERR "bad PC-like io %s:%u for port 0x%lx at 0x%08x\n", \ |
diff --git a/arch/sh/include/asm/io_generic.h b/arch/sh/include/asm/io_generic.h index 1e5d375f55dc..491df93cbf8e 100644 --- a/arch/sh/include/asm/io_generic.h +++ b/arch/sh/include/asm/io_generic.h | |||
@@ -38,5 +38,6 @@ void IO_CONCAT(__IO_PREFIX,iounmap)(void *addr); | |||
38 | 38 | ||
39 | void __iomem *IO_CONCAT(__IO_PREFIX,ioport_map)(unsigned long addr, unsigned int size); | 39 | void __iomem *IO_CONCAT(__IO_PREFIX,ioport_map)(unsigned long addr, unsigned int size); |
40 | void IO_CONCAT(__IO_PREFIX,ioport_unmap)(void __iomem *addr); | 40 | void IO_CONCAT(__IO_PREFIX,ioport_unmap)(void __iomem *addr); |
41 | void IO_CONCAT(__IO_PREFIX,mem_init)(void); | ||
41 | 42 | ||
42 | #undef __IO_PREFIX | 43 | #undef __IO_PREFIX |
diff --git a/arch/sh/include/asm/irq.h b/arch/sh/include/asm/irq.h index df8e1500527c..02c2f0102cfa 100644 --- a/arch/sh/include/asm/irq.h +++ b/arch/sh/include/asm/irq.h | |||
@@ -1,6 +1,7 @@ | |||
1 | #ifndef __ASM_SH_IRQ_H | 1 | #ifndef __ASM_SH_IRQ_H |
2 | #define __ASM_SH_IRQ_H | 2 | #define __ASM_SH_IRQ_H |
3 | 3 | ||
4 | #include <linux/cpumask.h> | ||
4 | #include <asm/machvec.h> | 5 | #include <asm/machvec.h> |
5 | 6 | ||
6 | /* | 7 | /* |
@@ -12,6 +13,14 @@ | |||
12 | #define NR_IRQS_LEGACY 8 /* Legacy external IRQ0-7 */ | 13 | #define NR_IRQS_LEGACY 8 /* Legacy external IRQ0-7 */ |
13 | 14 | ||
14 | /* | 15 | /* |
16 | * This is a special IRQ number for indicating that no IRQ has been | ||
17 | * triggered and to simply ignore the IRQ dispatch. This is a special | ||
18 | * case that can happen with IRQ auto-distribution when multiple CPUs | ||
19 | * are woken up and signalled in parallel. | ||
20 | */ | ||
21 | #define NO_IRQ_IGNORE ((unsigned int)-1) | ||
22 | |||
23 | /* | ||
15 | * Convert back and forth between INTEVT and IRQ values. | 24 | * Convert back and forth between INTEVT and IRQ values. |
16 | */ | 25 | */ |
17 | #ifdef CONFIG_CPU_HAS_INTEVT | 26 | #ifdef CONFIG_CPU_HAS_INTEVT |
@@ -42,6 +51,8 @@ static inline int generic_irq_demux(int irq) | |||
42 | #define irq_demux(irq) sh_mv.mv_irq_demux(irq) | 51 | #define irq_demux(irq) sh_mv.mv_irq_demux(irq) |
43 | 52 | ||
44 | void init_IRQ(void); | 53 | void init_IRQ(void); |
54 | void migrate_irqs(void); | ||
55 | |||
45 | asmlinkage int do_IRQ(unsigned int irq, struct pt_regs *regs); | 56 | asmlinkage int do_IRQ(unsigned int irq, struct pt_regs *regs); |
46 | 57 | ||
47 | #ifdef CONFIG_IRQSTACKS | 58 | #ifdef CONFIG_IRQSTACKS |
@@ -53,6 +64,14 @@ extern void irq_ctx_exit(int cpu); | |||
53 | # define irq_ctx_exit(cpu) do { } while (0) | 64 | # define irq_ctx_exit(cpu) do { } while (0) |
54 | #endif | 65 | #endif |
55 | 66 | ||
67 | #ifdef CONFIG_INTC_BALANCING | ||
68 | extern unsigned int irq_lookup(unsigned int irq); | ||
69 | extern void irq_finish(unsigned int irq); | ||
70 | #else | ||
71 | #define irq_lookup(irq) (irq) | ||
72 | #define irq_finish(irq) do { } while (0) | ||
73 | #endif | ||
74 | |||
56 | #include <asm-generic/irq.h> | 75 | #include <asm-generic/irq.h> |
57 | #ifdef CONFIG_CPU_SH5 | 76 | #ifdef CONFIG_CPU_SH5 |
58 | #include <cpu/irq.h> | 77 | #include <cpu/irq.h> |
diff --git a/arch/sh/include/asm/kdebug.h b/arch/sh/include/asm/kdebug.h index 985219f9759e..5f6d2e9ccb7c 100644 --- a/arch/sh/include/asm/kdebug.h +++ b/arch/sh/include/asm/kdebug.h | |||
@@ -6,6 +6,8 @@ enum die_val { | |||
6 | DIE_TRAP, | 6 | DIE_TRAP, |
7 | DIE_NMI, | 7 | DIE_NMI, |
8 | DIE_OOPS, | 8 | DIE_OOPS, |
9 | DIE_BREAKPOINT, | ||
10 | DIE_SSTEP, | ||
9 | }; | 11 | }; |
10 | 12 | ||
11 | #endif /* __ASM_SH_KDEBUG_H */ | 13 | #endif /* __ASM_SH_KDEBUG_H */ |
diff --git a/arch/sh/include/asm/kexec.h b/arch/sh/include/asm/kexec.h index 765a5e1660fc..ad6ef8a275ee 100644 --- a/arch/sh/include/asm/kexec.h +++ b/arch/sh/include/asm/kexec.h | |||
@@ -26,6 +26,10 @@ | |||
26 | /* The native architecture */ | 26 | /* The native architecture */ |
27 | #define KEXEC_ARCH KEXEC_ARCH_SH | 27 | #define KEXEC_ARCH KEXEC_ARCH_SH |
28 | 28 | ||
29 | #ifdef CONFIG_KEXEC | ||
30 | /* arch/sh/kernel/machine_kexec.c */ | ||
31 | void reserve_crashkernel(void); | ||
32 | |||
29 | static inline void crash_setup_regs(struct pt_regs *newregs, | 33 | static inline void crash_setup_regs(struct pt_regs *newregs, |
30 | struct pt_regs *oldregs) | 34 | struct pt_regs *oldregs) |
31 | { | 35 | { |
@@ -59,4 +63,8 @@ static inline void crash_setup_regs(struct pt_regs *newregs, | |||
59 | newregs->pc = (unsigned long)current_text_addr(); | 63 | newregs->pc = (unsigned long)current_text_addr(); |
60 | } | 64 | } |
61 | } | 65 | } |
66 | #else | ||
67 | static inline void reserve_crashkernel(void) { } | ||
68 | #endif /* CONFIG_KEXEC */ | ||
69 | |||
62 | #endif /* __ASM_SH_KEXEC_H */ | 70 | #endif /* __ASM_SH_KEXEC_H */ |
diff --git a/arch/sh/include/asm/machvec.h b/arch/sh/include/asm/machvec.h index 9c30955630ff..bc0218cb72e1 100644 --- a/arch/sh/include/asm/machvec.h +++ b/arch/sh/include/asm/machvec.h | |||
@@ -49,6 +49,8 @@ struct sh_machine_vector { | |||
49 | 49 | ||
50 | int (*mv_clk_init)(void); | 50 | int (*mv_clk_init)(void); |
51 | int (*mv_mode_pins)(void); | 51 | int (*mv_mode_pins)(void); |
52 | |||
53 | void (*mv_mem_init)(void); | ||
52 | }; | 54 | }; |
53 | 55 | ||
54 | extern struct sh_machine_vector sh_mv; | 56 | extern struct sh_machine_vector sh_mv; |
diff --git a/arch/sh/include/asm/mmu.h b/arch/sh/include/asm/mmu.h index c7426ad9926e..56e4418c19b9 100644 --- a/arch/sh/include/asm/mmu.h +++ b/arch/sh/include/asm/mmu.h | |||
@@ -11,7 +11,9 @@ | |||
11 | 11 | ||
12 | #define PMB_ADDR 0xf6100000 | 12 | #define PMB_ADDR 0xf6100000 |
13 | #define PMB_DATA 0xf7100000 | 13 | #define PMB_DATA 0xf7100000 |
14 | #define PMB_ENTRY_MAX 16 | 14 | |
15 | #define NR_PMB_ENTRIES 16 | ||
16 | |||
15 | #define PMB_E_MASK 0x0000000f | 17 | #define PMB_E_MASK 0x0000000f |
16 | #define PMB_E_SHIFT 8 | 18 | #define PMB_E_SHIFT 8 |
17 | 19 | ||
@@ -25,11 +27,15 @@ | |||
25 | #define PMB_C 0x00000008 | 27 | #define PMB_C 0x00000008 |
26 | #define PMB_WT 0x00000001 | 28 | #define PMB_WT 0x00000001 |
27 | #define PMB_UB 0x00000200 | 29 | #define PMB_UB 0x00000200 |
30 | #define PMB_CACHE_MASK (PMB_C | PMB_WT | PMB_UB) | ||
28 | #define PMB_V 0x00000100 | 31 | #define PMB_V 0x00000100 |
29 | 32 | ||
30 | #define PMB_NO_ENTRY (-1) | 33 | #define PMB_NO_ENTRY (-1) |
31 | 34 | ||
32 | #ifndef __ASSEMBLY__ | 35 | #ifndef __ASSEMBLY__ |
36 | #include <linux/errno.h> | ||
37 | #include <linux/threads.h> | ||
38 | #include <asm/page.h> | ||
33 | 39 | ||
34 | /* Default "unsigned long" context */ | 40 | /* Default "unsigned long" context */ |
35 | typedef unsigned long mm_context_id_t[NR_CPUS]; | 41 | typedef unsigned long mm_context_id_t[NR_CPUS]; |
@@ -47,29 +53,54 @@ typedef struct { | |||
47 | #endif | 53 | #endif |
48 | } mm_context_t; | 54 | } mm_context_t; |
49 | 55 | ||
50 | struct pmb_entry; | 56 | #ifdef CONFIG_PMB |
57 | /* arch/sh/mm/pmb.c */ | ||
58 | bool __in_29bit_mode(void); | ||
51 | 59 | ||
52 | struct pmb_entry { | 60 | void pmb_init(void); |
53 | unsigned long vpn; | 61 | int pmb_bolt_mapping(unsigned long virt, phys_addr_t phys, |
54 | unsigned long ppn; | 62 | unsigned long size, pgprot_t prot); |
55 | unsigned long flags; | 63 | void __iomem *pmb_remap_caller(phys_addr_t phys, unsigned long size, |
64 | pgprot_t prot, void *caller); | ||
65 | int pmb_unmap(void __iomem *addr); | ||
56 | 66 | ||
57 | /* | 67 | #else |
58 | * 0 .. NR_PMB_ENTRIES for specific entry selection, or | ||
59 | * PMB_NO_ENTRY to search for a free one | ||
60 | */ | ||
61 | int entry; | ||
62 | 68 | ||
63 | struct pmb_entry *next; | 69 | static inline int |
64 | /* Adjacent entry link for contiguous multi-entry mappings */ | 70 | pmb_bolt_mapping(unsigned long virt, phys_addr_t phys, |
65 | struct pmb_entry *link; | 71 | unsigned long size, pgprot_t prot) |
66 | }; | 72 | { |
73 | return -EINVAL; | ||
74 | } | ||
75 | |||
76 | static inline void __iomem * | ||
77 | pmb_remap_caller(phys_addr_t phys, unsigned long size, | ||
78 | pgprot_t prot, void *caller) | ||
79 | { | ||
80 | return NULL; | ||
81 | } | ||
82 | |||
83 | static inline int pmb_unmap(void __iomem *addr) | ||
84 | { | ||
85 | return -EINVAL; | ||
86 | } | ||
87 | |||
88 | #define pmb_init(addr) do { } while (0) | ||
89 | |||
90 | #ifdef CONFIG_29BIT | ||
91 | #define __in_29bit_mode() (1) | ||
92 | #else | ||
93 | #define __in_29bit_mode() (0) | ||
94 | #endif | ||
95 | |||
96 | #endif /* CONFIG_PMB */ | ||
97 | |||
98 | static inline void __iomem * | ||
99 | pmb_remap(phys_addr_t phys, unsigned long size, pgprot_t prot) | ||
100 | { | ||
101 | return pmb_remap_caller(phys, size, prot, __builtin_return_address(0)); | ||
102 | } | ||
67 | 103 | ||
68 | /* arch/sh/mm/pmb.c */ | ||
69 | long pmb_remap(unsigned long virt, unsigned long phys, | ||
70 | unsigned long size, unsigned long flags); | ||
71 | void pmb_unmap(unsigned long addr); | ||
72 | int pmb_init(void); | ||
73 | #endif /* __ASSEMBLY__ */ | 104 | #endif /* __ASSEMBLY__ */ |
74 | 105 | ||
75 | #endif /* __MMU_H */ | 106 | #endif /* __MMU_H */ |
diff --git a/arch/sh/include/asm/mmu_context.h b/arch/sh/include/asm/mmu_context.h index 41080b173a7a..384c7471a374 100644 --- a/arch/sh/include/asm/mmu_context.h +++ b/arch/sh/include/asm/mmu_context.h | |||
@@ -158,7 +158,7 @@ static inline void enable_mmu(void) | |||
158 | unsigned int cpu = smp_processor_id(); | 158 | unsigned int cpu = smp_processor_id(); |
159 | 159 | ||
160 | /* Enable MMU */ | 160 | /* Enable MMU */ |
161 | ctrl_outl(MMU_CONTROL_INIT, MMUCR); | 161 | __raw_writel(MMU_CONTROL_INIT, MMUCR); |
162 | ctrl_barrier(); | 162 | ctrl_barrier(); |
163 | 163 | ||
164 | if (asid_cache(cpu) == NO_CONTEXT) | 164 | if (asid_cache(cpu) == NO_CONTEXT) |
@@ -171,9 +171,9 @@ static inline void disable_mmu(void) | |||
171 | { | 171 | { |
172 | unsigned long cr; | 172 | unsigned long cr; |
173 | 173 | ||
174 | cr = ctrl_inl(MMUCR); | 174 | cr = __raw_readl(MMUCR); |
175 | cr &= ~MMU_CONTROL_INIT; | 175 | cr &= ~MMU_CONTROL_INIT; |
176 | ctrl_outl(cr, MMUCR); | 176 | __raw_writel(cr, MMUCR); |
177 | 177 | ||
178 | ctrl_barrier(); | 178 | ctrl_barrier(); |
179 | } | 179 | } |
diff --git a/arch/sh/include/asm/mmu_context_32.h b/arch/sh/include/asm/mmu_context_32.h index 8ef800c549ab..10e2e17210d2 100644 --- a/arch/sh/include/asm/mmu_context_32.h +++ b/arch/sh/include/asm/mmu_context_32.h | |||
@@ -49,11 +49,11 @@ static inline unsigned long get_asid(void) | |||
49 | /* MMU_TTB is used for optimizing the fault handling. */ | 49 | /* MMU_TTB is used for optimizing the fault handling. */ |
50 | static inline void set_TTB(pgd_t *pgd) | 50 | static inline void set_TTB(pgd_t *pgd) |
51 | { | 51 | { |
52 | ctrl_outl((unsigned long)pgd, MMU_TTB); | 52 | __raw_writel((unsigned long)pgd, MMU_TTB); |
53 | } | 53 | } |
54 | 54 | ||
55 | static inline pgd_t *get_TTB(void) | 55 | static inline pgd_t *get_TTB(void) |
56 | { | 56 | { |
57 | return (pgd_t *)ctrl_inl(MMU_TTB); | 57 | return (pgd_t *)__raw_readl(MMU_TTB); |
58 | } | 58 | } |
59 | #endif /* __ASM_SH_MMU_CONTEXT_32_H */ | 59 | #endif /* __ASM_SH_MMU_CONTEXT_32_H */ |
diff --git a/arch/sh/include/asm/mmzone.h b/arch/sh/include/asm/mmzone.h index 7f5363b29ba0..8887baff5eff 100644 --- a/arch/sh/include/asm/mmzone.h +++ b/arch/sh/include/asm/mmzone.h | |||
@@ -42,9 +42,10 @@ setup_bootmem_node(int nid, unsigned long start, unsigned long end) | |||
42 | void __init plat_mem_setup(void); | 42 | void __init plat_mem_setup(void); |
43 | 43 | ||
44 | /* arch/sh/kernel/setup.c */ | 44 | /* arch/sh/kernel/setup.c */ |
45 | void __init setup_bootmem_allocator(unsigned long start_pfn); | ||
46 | void __init __add_active_range(unsigned int nid, unsigned long start_pfn, | 45 | void __init __add_active_range(unsigned int nid, unsigned long start_pfn, |
47 | unsigned long end_pfn); | 46 | unsigned long end_pfn); |
47 | /* arch/sh/mm/init.c */ | ||
48 | void __init allocate_pgdat(unsigned int nid); | ||
48 | 49 | ||
49 | #endif /* __KERNEL__ */ | 50 | #endif /* __KERNEL__ */ |
50 | #endif /* __ASM_SH_MMZONE_H */ | 51 | #endif /* __ASM_SH_MMZONE_H */ |
diff --git a/arch/sh/include/asm/module.h b/arch/sh/include/asm/module.h index 068bf1659750..b7927de86f9f 100644 --- a/arch/sh/include/asm/module.h +++ b/arch/sh/include/asm/module.h | |||
@@ -1,7 +1,22 @@ | |||
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 | #include <asm-generic/module.h> | 4 | struct mod_arch_specific { |
5 | #ifdef CONFIG_DWARF_UNWINDER | ||
6 | struct list_head fde_list; | ||
7 | struct list_head cie_list; | ||
8 | #endif | ||
9 | }; | ||
10 | |||
11 | #ifdef CONFIG_64BIT | ||
12 | #define Elf_Shdr Elf64_Shdr | ||
13 | #define Elf_Sym Elf64_Sym | ||
14 | #define Elf_Ehdr Elf64_Ehdr | ||
15 | #else | ||
16 | #define Elf_Shdr Elf32_Shdr | ||
17 | #define Elf_Sym Elf32_Sym | ||
18 | #define Elf_Ehdr Elf32_Ehdr | ||
19 | #endif | ||
5 | 20 | ||
6 | #ifdef CONFIG_CPU_LITTLE_ENDIAN | 21 | #ifdef CONFIG_CPU_LITTLE_ENDIAN |
7 | # ifdef CONFIG_CPU_SH2 | 22 | # ifdef CONFIG_CPU_SH2 |
diff --git a/arch/sh/include/asm/page.h b/arch/sh/include/asm/page.h index 81bffc0d6860..fb703d120d09 100644 --- a/arch/sh/include/asm/page.h +++ b/arch/sh/include/asm/page.h | |||
@@ -45,10 +45,11 @@ | |||
45 | #endif | 45 | #endif |
46 | 46 | ||
47 | #ifndef __ASSEMBLY__ | 47 | #ifndef __ASSEMBLY__ |
48 | #include <asm/uncached.h> | ||
48 | 49 | ||
49 | extern unsigned long shm_align_mask; | 50 | extern unsigned long shm_align_mask; |
50 | extern unsigned long max_low_pfn, min_low_pfn; | 51 | extern unsigned long max_low_pfn, min_low_pfn; |
51 | extern unsigned long memory_start, memory_end; | 52 | extern unsigned long memory_start, memory_end, memory_limit; |
52 | 53 | ||
53 | static inline unsigned long | 54 | static inline unsigned long |
54 | pages_do_alias(unsigned long addr1, unsigned long addr2) | 55 | pages_do_alias(unsigned long addr1, unsigned long addr2) |
@@ -56,7 +57,6 @@ pages_do_alias(unsigned long addr1, unsigned long addr2) | |||
56 | return (addr1 ^ addr2) & shm_align_mask; | 57 | return (addr1 ^ addr2) & shm_align_mask; |
57 | } | 58 | } |
58 | 59 | ||
59 | |||
60 | #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) | 60 | #define clear_page(page) memset((void *)(page), 0, PAGE_SIZE) |
61 | extern void copy_page(void *to, void *from); | 61 | extern void copy_page(void *to, void *from); |
62 | 62 | ||
@@ -88,7 +88,7 @@ typedef struct { unsigned long pgd; } pgd_t; | |||
88 | #define __pte(x) ((pte_t) { (x) } ) | 88 | #define __pte(x) ((pte_t) { (x) } ) |
89 | #else | 89 | #else |
90 | typedef struct { unsigned long long pte_low; } pte_t; | 90 | typedef struct { unsigned long long pte_low; } pte_t; |
91 | typedef struct { unsigned long pgprot; } pgprot_t; | 91 | typedef struct { unsigned long long pgprot; } pgprot_t; |
92 | typedef struct { unsigned long pgd; } pgd_t; | 92 | typedef struct { unsigned long pgd; } pgd_t; |
93 | #define pte_val(x) ((x).pte_low) | 93 | #define pte_val(x) ((x).pte_low) |
94 | #define __pte(x) ((pte_t) { (x) } ) | 94 | #define __pte(x) ((pte_t) { (x) } ) |
@@ -127,17 +127,25 @@ typedef struct page *pgtable_t; | |||
127 | * is not visible (it is part of the PMB mapping) and so needs to be | 127 | * is not visible (it is part of the PMB mapping) and so needs to be |
128 | * added or subtracted as required. | 128 | * added or subtracted as required. |
129 | */ | 129 | */ |
130 | #if defined(CONFIG_PMB_FIXED) | 130 | #ifdef CONFIG_PMB |
131 | /* phys = virt - PAGE_OFFSET - (__MEMORY_START & 0xe0000000) */ | 131 | #define ___pa(x) ((x)-PAGE_OFFSET+__MEMORY_START) |
132 | #define PMB_OFFSET (PAGE_OFFSET - PXSEG(__MEMORY_START)) | 132 | #define ___va(x) ((x)+PAGE_OFFSET-__MEMORY_START) |
133 | #define __pa(x) ((unsigned long)(x) - PMB_OFFSET) | 133 | #else |
134 | #define __va(x) ((void *)((unsigned long)(x) + PMB_OFFSET)) | 134 | #define ___pa(x) ((x)-PAGE_OFFSET) |
135 | #elif defined(CONFIG_32BIT) | 135 | #define ___va(x) ((x)+PAGE_OFFSET) |
136 | #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET+__MEMORY_START) | 136 | #endif |
137 | #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET-__MEMORY_START)) | 137 | |
138 | #ifndef __ASSEMBLY__ | ||
139 | #define __pa(x) ___pa((unsigned long)x) | ||
140 | #define __va(x) (void *)___va((unsigned long)x) | ||
141 | #endif /* !__ASSEMBLY__ */ | ||
142 | |||
143 | #ifdef CONFIG_UNCACHED_MAPPING | ||
144 | #define UNCAC_ADDR(addr) ((addr) - PAGE_OFFSET + uncached_start) | ||
145 | #define CAC_ADDR(addr) ((addr) - uncached_start + PAGE_OFFSET) | ||
138 | #else | 146 | #else |
139 | #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) | 147 | #define UNCAC_ADDR(addr) ((addr)) |
140 | #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET)) | 148 | #define CAC_ADDR(addr) ((addr)) |
141 | #endif | 149 | #endif |
142 | 150 | ||
143 | #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) | 151 | #define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) |
diff --git a/arch/sh/include/asm/pci.h b/arch/sh/include/asm/pci.h index 67f3999b544e..8bd952fcf3ba 100644 --- a/arch/sh/include/asm/pci.h +++ b/arch/sh/include/asm/pci.h | |||
@@ -15,20 +15,49 @@ | |||
15 | */ | 15 | */ |
16 | struct pci_channel { | 16 | struct pci_channel { |
17 | struct pci_channel *next; | 17 | struct pci_channel *next; |
18 | struct pci_bus *bus; | ||
18 | 19 | ||
19 | struct pci_ops *pci_ops; | 20 | struct pci_ops *pci_ops; |
20 | struct resource *io_resource; | 21 | |
21 | struct resource *mem_resource; | 22 | struct resource *resources; |
23 | unsigned int nr_resources; | ||
22 | 24 | ||
23 | unsigned long io_offset; | 25 | unsigned long io_offset; |
24 | unsigned long mem_offset; | 26 | unsigned long mem_offset; |
25 | 27 | ||
26 | unsigned long reg_base; | 28 | unsigned long reg_base; |
27 | |||
28 | unsigned long io_map_base; | 29 | unsigned long io_map_base; |
30 | |||
31 | unsigned int index; | ||
32 | unsigned int need_domain_info; | ||
33 | |||
34 | /* Optional error handling */ | ||
35 | struct timer_list err_timer, serr_timer; | ||
36 | unsigned int err_irq, serr_irq; | ||
29 | }; | 37 | }; |
30 | 38 | ||
31 | extern void register_pci_controller(struct pci_channel *hose); | 39 | /* arch/sh/drivers/pci/pci.c */ |
40 | extern int register_pci_controller(struct pci_channel *hose); | ||
41 | extern void pcibios_report_status(unsigned int status_mask, int warn); | ||
42 | |||
43 | /* arch/sh/drivers/pci/common.c */ | ||
44 | extern int early_read_config_byte(struct pci_channel *hose, int top_bus, | ||
45 | int bus, int devfn, int offset, u8 *value); | ||
46 | extern int early_read_config_word(struct pci_channel *hose, int top_bus, | ||
47 | int bus, int devfn, int offset, u16 *value); | ||
48 | extern int early_read_config_dword(struct pci_channel *hose, int top_bus, | ||
49 | int bus, int devfn, int offset, u32 *value); | ||
50 | extern int early_write_config_byte(struct pci_channel *hose, int top_bus, | ||
51 | int bus, int devfn, int offset, u8 value); | ||
52 | extern int early_write_config_word(struct pci_channel *hose, int top_bus, | ||
53 | int bus, int devfn, int offset, u16 value); | ||
54 | extern int early_write_config_dword(struct pci_channel *hose, int top_bus, | ||
55 | int bus, int devfn, int offset, u32 value); | ||
56 | extern void pcibios_enable_timers(struct pci_channel *hose); | ||
57 | extern unsigned int pcibios_handle_status_errors(unsigned long addr, | ||
58 | unsigned int status, struct pci_channel *hose); | ||
59 | extern int pci_is_66mhz_capable(struct pci_channel *hose, | ||
60 | int top_bus, int current_bus); | ||
32 | 61 | ||
33 | extern unsigned long PCIBIOS_MIN_IO, PCIBIOS_MIN_MEM; | 62 | extern unsigned long PCIBIOS_MIN_IO, PCIBIOS_MIN_MEM; |
34 | 63 | ||
@@ -54,25 +83,6 @@ static inline void pcibios_penalize_isa_irq(int irq, int active) | |||
54 | */ | 83 | */ |
55 | #define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) | 84 | #define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys) |
56 | 85 | ||
57 | /* pci_unmap_{single,page} being a nop depends upon the | ||
58 | * configuration. | ||
59 | */ | ||
60 | #ifdef CONFIG_DMA_NONCOHERENT | ||
61 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) dma_addr_t ADDR_NAME; | ||
62 | #define DECLARE_PCI_UNMAP_LEN(LEN_NAME) __u32 LEN_NAME; | ||
63 | #define pci_unmap_addr(PTR, ADDR_NAME) ((PTR)->ADDR_NAME) | ||
64 | #define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) (((PTR)->ADDR_NAME) = (VAL)) | ||
65 | #define pci_unmap_len(PTR, LEN_NAME) ((PTR)->LEN_NAME) | ||
66 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) (((PTR)->LEN_NAME) = (VAL)) | ||
67 | #else | ||
68 | #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME) | ||
69 | #define DECLARE_PCI_UNMAP_LEN(LEN_NAME) | ||
70 | #define pci_unmap_addr(PTR, ADDR_NAME) (0) | ||
71 | #define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do { } while (0) | ||
72 | #define pci_unmap_len(PTR, LEN_NAME) (0) | ||
73 | #define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0) | ||
74 | #endif | ||
75 | |||
76 | #ifdef CONFIG_PCI | 86 | #ifdef CONFIG_PCI |
77 | /* | 87 | /* |
78 | * None of the SH PCI controllers support MWI, it is always treated as a | 88 | * None of the SH PCI controllers support MWI, it is always treated as a |
@@ -99,20 +109,6 @@ static inline void pci_dma_burst_advice(struct pci_dev *pdev, | |||
99 | } | 109 | } |
100 | #endif | 110 | #endif |
101 | 111 | ||
102 | #ifdef CONFIG_SUPERH32 | ||
103 | /* | ||
104 | * If we're on an SH7751 or SH7780 PCI controller, PCI memory is mapped | ||
105 | * at the end of the address space in a special non-translatable area. | ||
106 | */ | ||
107 | #define PCI_MEM_FIXED_START 0xfd000000 | ||
108 | #define PCI_MEM_FIXED_END (PCI_MEM_FIXED_START + 0x01000000) | ||
109 | |||
110 | #define is_pci_memory_fixed_range(s, e) \ | ||
111 | ((s) >= PCI_MEM_FIXED_START && (e) < PCI_MEM_FIXED_END) | ||
112 | #else | ||
113 | #define is_pci_memory_fixed_range(s, e) (0) | ||
114 | #endif | ||
115 | |||
116 | /* Board-specific fixup routines. */ | 112 | /* Board-specific fixup routines. */ |
117 | int pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin); | 113 | int pcibios_map_platform_irq(struct pci_dev *dev, u8 slot, u8 pin); |
118 | 114 | ||
@@ -122,6 +118,14 @@ extern void pcibios_resource_to_bus(struct pci_dev *dev, | |||
122 | extern void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | 118 | extern void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, |
123 | struct pci_bus_region *region); | 119 | struct pci_bus_region *region); |
124 | 120 | ||
121 | #define pci_domain_nr(bus) ((struct pci_channel *)(bus)->sysdata)->index | ||
122 | |||
123 | static inline int pci_proc_domain(struct pci_bus *bus) | ||
124 | { | ||
125 | struct pci_channel *hose = bus->sysdata; | ||
126 | return hose->need_domain_info; | ||
127 | } | ||
128 | |||
125 | /* Chances are this interrupt is wired PC-style ... */ | 129 | /* Chances are this interrupt is wired PC-style ... */ |
126 | static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) | 130 | static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) |
127 | { | 131 | { |
diff --git a/arch/sh/include/asm/pgalloc.h b/arch/sh/include/asm/pgalloc.h index 63ca37bd9a95..8c00785c60d5 100644 --- a/arch/sh/include/asm/pgalloc.h +++ b/arch/sh/include/asm/pgalloc.h | |||
@@ -4,8 +4,16 @@ | |||
4 | #include <linux/quicklist.h> | 4 | #include <linux/quicklist.h> |
5 | #include <asm/page.h> | 5 | #include <asm/page.h> |
6 | 6 | ||
7 | #define QUICK_PGD 0 /* We preserve special mappings over free */ | 7 | #define QUICK_PT 0 /* Other page table pages that are zero on free */ |
8 | #define QUICK_PT 1 /* Other page table pages that are zero on free */ | 8 | |
9 | extern pgd_t *pgd_alloc(struct mm_struct *); | ||
10 | extern void pgd_free(struct mm_struct *mm, pgd_t *pgd); | ||
11 | |||
12 | #if PAGETABLE_LEVELS > 2 | ||
13 | extern void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmd); | ||
14 | extern pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address); | ||
15 | extern void pmd_free(struct mm_struct *mm, pmd_t *pmd); | ||
16 | #endif | ||
9 | 17 | ||
10 | static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, | 18 | static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, |
11 | pte_t *pte) | 19 | pte_t *pte) |
@@ -20,28 +28,9 @@ static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, | |||
20 | } | 28 | } |
21 | #define pmd_pgtable(pmd) pmd_page(pmd) | 29 | #define pmd_pgtable(pmd) pmd_page(pmd) |
22 | 30 | ||
23 | static inline void pgd_ctor(void *x) | ||
24 | { | ||
25 | pgd_t *pgd = x; | ||
26 | |||
27 | memcpy(pgd + USER_PTRS_PER_PGD, | ||
28 | swapper_pg_dir + USER_PTRS_PER_PGD, | ||
29 | (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t)); | ||
30 | } | ||
31 | |||
32 | /* | 31 | /* |
33 | * Allocate and free page tables. | 32 | * Allocate and free page tables. |
34 | */ | 33 | */ |
35 | static inline pgd_t *pgd_alloc(struct mm_struct *mm) | ||
36 | { | ||
37 | return quicklist_alloc(QUICK_PGD, GFP_KERNEL | __GFP_REPEAT, pgd_ctor); | ||
38 | } | ||
39 | |||
40 | static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd) | ||
41 | { | ||
42 | quicklist_free(QUICK_PGD, NULL, pgd); | ||
43 | } | ||
44 | |||
45 | static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, | 34 | static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, |
46 | unsigned long address) | 35 | unsigned long address) |
47 | { | 36 | { |
@@ -81,7 +70,6 @@ do { \ | |||
81 | 70 | ||
82 | static inline void check_pgt_cache(void) | 71 | static inline void check_pgt_cache(void) |
83 | { | 72 | { |
84 | quicklist_trim(QUICK_PGD, NULL, 25, 16); | ||
85 | quicklist_trim(QUICK_PT, NULL, 25, 16); | 73 | quicklist_trim(QUICK_PT, NULL, 25, 16); |
86 | } | 74 | } |
87 | 75 | ||
diff --git a/arch/sh/include/asm/pgtable-2level.h b/arch/sh/include/asm/pgtable-2level.h new file mode 100644 index 000000000000..19bd89db17e7 --- /dev/null +++ b/arch/sh/include/asm/pgtable-2level.h | |||
@@ -0,0 +1,23 @@ | |||
1 | #ifndef __ASM_SH_PGTABLE_2LEVEL_H | ||
2 | #define __ASM_SH_PGTABLE_2LEVEL_H | ||
3 | |||
4 | #include <asm-generic/pgtable-nopmd.h> | ||
5 | |||
6 | /* | ||
7 | * traditional two-level paging structure | ||
8 | */ | ||
9 | #define PAGETABLE_LEVELS 2 | ||
10 | |||
11 | /* PTE bits */ | ||
12 | #define PTE_MAGNITUDE 2 /* 32-bit PTEs */ | ||
13 | |||
14 | #define PTE_SHIFT PAGE_SHIFT | ||
15 | #define PTE_BITS (PTE_SHIFT - PTE_MAGNITUDE) | ||
16 | |||
17 | /* PGD bits */ | ||
18 | #define PGDIR_SHIFT (PTE_SHIFT + PTE_BITS) | ||
19 | |||
20 | #define PTRS_PER_PGD (PAGE_SIZE / (1 << PTE_MAGNITUDE)) | ||
21 | #define USER_PTRS_PER_PGD (TASK_SIZE/PGDIR_SIZE) | ||
22 | |||
23 | #endif /* __ASM_SH_PGTABLE_2LEVEL_H */ | ||
diff --git a/arch/sh/include/asm/pgtable-3level.h b/arch/sh/include/asm/pgtable-3level.h new file mode 100644 index 000000000000..249a985d9648 --- /dev/null +++ b/arch/sh/include/asm/pgtable-3level.h | |||
@@ -0,0 +1,56 @@ | |||
1 | #ifndef __ASM_SH_PGTABLE_3LEVEL_H | ||
2 | #define __ASM_SH_PGTABLE_3LEVEL_H | ||
3 | |||
4 | #include <asm-generic/pgtable-nopud.h> | ||
5 | |||
6 | /* | ||
7 | * Some cores need a 3-level page table layout, for example when using | ||
8 | * 64-bit PTEs and 4K pages. | ||
9 | */ | ||
10 | #define PAGETABLE_LEVELS 3 | ||
11 | |||
12 | #define PTE_MAGNITUDE 3 /* 64-bit PTEs on SH-X2 TLB */ | ||
13 | |||
14 | /* PGD bits */ | ||
15 | #define PGDIR_SHIFT 30 | ||
16 | |||
17 | #define PTRS_PER_PGD 4 | ||
18 | #define USER_PTRS_PER_PGD 2 | ||
19 | |||
20 | /* PMD bits */ | ||
21 | #define PMD_SHIFT (PAGE_SHIFT + (PAGE_SHIFT - PTE_MAGNITUDE)) | ||
22 | #define PMD_SIZE (1UL << PMD_SHIFT) | ||
23 | #define PMD_MASK (~(PMD_SIZE-1)) | ||
24 | |||
25 | #define PTRS_PER_PMD ((1 << PGDIR_SHIFT) / PMD_SIZE) | ||
26 | |||
27 | #define pmd_ERROR(e) \ | ||
28 | printk("%s:%d: bad pmd %016llx.\n", __FILE__, __LINE__, pmd_val(e)) | ||
29 | |||
30 | typedef struct { unsigned long long pmd; } pmd_t; | ||
31 | #define pmd_val(x) ((x).pmd) | ||
32 | #define __pmd(x) ((pmd_t) { (x) } ) | ||
33 | |||
34 | static inline unsigned long pud_page_vaddr(pud_t pud) | ||
35 | { | ||
36 | return pud_val(pud); | ||
37 | } | ||
38 | |||
39 | #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1)) | ||
40 | static inline pmd_t *pmd_offset(pud_t *pud, unsigned long address) | ||
41 | { | ||
42 | return (pmd_t *)pud_page_vaddr(*pud) + pmd_index(address); | ||
43 | } | ||
44 | |||
45 | #define pud_none(x) (!pud_val(x)) | ||
46 | #define pud_present(x) (pud_val(x)) | ||
47 | #define pud_clear(xp) do { set_pud(xp, __pud(0)); } while (0) | ||
48 | #define pud_bad(x) (pud_val(x) & ~PAGE_MASK) | ||
49 | |||
50 | /* | ||
51 | * (puds are folded into pgds so this doesn't get actually called, | ||
52 | * but the define is needed for a generic inline function.) | ||
53 | */ | ||
54 | #define set_pud(pudptr, pudval) do { *(pudptr) = (pudval); } while(0) | ||
55 | |||
56 | #endif /* __ASM_SH_PGTABLE_3LEVEL_H */ | ||
diff --git a/arch/sh/include/asm/pgtable.h b/arch/sh/include/asm/pgtable.h index ba3046e4f06f..02f77450cd8f 100644 --- a/arch/sh/include/asm/pgtable.h +++ b/arch/sh/include/asm/pgtable.h | |||
@@ -12,7 +12,11 @@ | |||
12 | #ifndef __ASM_SH_PGTABLE_H | 12 | #ifndef __ASM_SH_PGTABLE_H |
13 | #define __ASM_SH_PGTABLE_H | 13 | #define __ASM_SH_PGTABLE_H |
14 | 14 | ||
15 | #include <asm-generic/pgtable-nopmd.h> | 15 | #ifdef CONFIG_X2TLB |
16 | #include <asm/pgtable-3level.h> | ||
17 | #else | ||
18 | #include <asm/pgtable-2level.h> | ||
19 | #endif | ||
16 | #include <asm/page.h> | 20 | #include <asm/page.h> |
17 | 21 | ||
18 | #ifndef __ASSEMBLY__ | 22 | #ifndef __ASSEMBLY__ |
@@ -51,28 +55,12 @@ static inline unsigned long long neff_sign_extend(unsigned long val) | |||
51 | #define NPHYS_SIGN (1LL << (NPHYS - 1)) | 55 | #define NPHYS_SIGN (1LL << (NPHYS - 1)) |
52 | #define NPHYS_MASK (-1LL << NPHYS) | 56 | #define NPHYS_MASK (-1LL << NPHYS) |
53 | 57 | ||
54 | /* | ||
55 | * traditional two-level paging structure | ||
56 | */ | ||
57 | /* PTE bits */ | ||
58 | #if defined(CONFIG_X2TLB) || defined(CONFIG_SUPERH64) | ||
59 | # define PTE_MAGNITUDE 3 /* 64-bit PTEs on extended mode SH-X2 TLB */ | ||
60 | #else | ||
61 | # define PTE_MAGNITUDE 2 /* 32-bit PTEs */ | ||
62 | #endif | ||
63 | #define PTE_SHIFT PAGE_SHIFT | ||
64 | #define PTE_BITS (PTE_SHIFT - PTE_MAGNITUDE) | ||
65 | |||
66 | /* PGD bits */ | ||
67 | #define PGDIR_SHIFT (PTE_SHIFT + PTE_BITS) | ||
68 | #define PGDIR_SIZE (1UL << PGDIR_SHIFT) | 58 | #define PGDIR_SIZE (1UL << PGDIR_SHIFT) |
69 | #define PGDIR_MASK (~(PGDIR_SIZE-1)) | 59 | #define PGDIR_MASK (~(PGDIR_SIZE-1)) |
70 | 60 | ||
71 | /* Entries per level */ | 61 | /* Entries per level */ |
72 | #define PTRS_PER_PTE (PAGE_SIZE / (1 << PTE_MAGNITUDE)) | 62 | #define PTRS_PER_PTE (PAGE_SIZE / (1 << PTE_MAGNITUDE)) |
73 | #define PTRS_PER_PGD (PAGE_SIZE / sizeof(pgd_t)) | ||
74 | 63 | ||
75 | #define USER_PTRS_PER_PGD (TASK_SIZE/PGDIR_SIZE) | ||
76 | #define FIRST_USER_ADDRESS 0 | 64 | #define FIRST_USER_ADDRESS 0 |
77 | 65 | ||
78 | #define PHYS_ADDR_MASK29 0x1fffffff | 66 | #define PHYS_ADDR_MASK29 0x1fffffff |
@@ -153,9 +141,9 @@ typedef pte_t *pte_addr_t; | |||
153 | #define pte_pfn(x) ((unsigned long)(((x).pte_low >> PAGE_SHIFT))) | 141 | #define pte_pfn(x) ((unsigned long)(((x).pte_low >> PAGE_SHIFT))) |
154 | 142 | ||
155 | /* | 143 | /* |
156 | * No page table caches to initialise | 144 | * Initialise the page table caches |
157 | */ | 145 | */ |
158 | #define pgtable_cache_init() do { } while (0) | 146 | extern void pgtable_cache_init(void); |
159 | 147 | ||
160 | struct vm_area_struct; | 148 | struct vm_area_struct; |
161 | 149 | ||
@@ -165,8 +153,9 @@ extern void __update_tlb(struct vm_area_struct *vma, | |||
165 | unsigned long address, pte_t pte); | 153 | unsigned long address, pte_t pte); |
166 | 154 | ||
167 | static inline void | 155 | static inline void |
168 | update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte) | 156 | update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t *ptep) |
169 | { | 157 | { |
158 | pte_t pte = *ptep; | ||
170 | __update_cache(vma, address, pte); | 159 | __update_cache(vma, address, pte); |
171 | __update_tlb(vma, address, pte); | 160 | __update_tlb(vma, address, pte); |
172 | } | 161 | } |
diff --git a/arch/sh/include/asm/pgtable_32.h b/arch/sh/include/asm/pgtable_32.h index 5003ee86f67b..e172d696e52b 100644 --- a/arch/sh/include/asm/pgtable_32.h +++ b/arch/sh/include/asm/pgtable_32.h | |||
@@ -71,6 +71,8 @@ | |||
71 | #define _PAGE_EXT_KERN_WRITE 0x1000 /* EPR4-bit: Kernel space writable */ | 71 | #define _PAGE_EXT_KERN_WRITE 0x1000 /* EPR4-bit: Kernel space writable */ |
72 | #define _PAGE_EXT_KERN_READ 0x2000 /* EPR5-bit: Kernel space readable */ | 72 | #define _PAGE_EXT_KERN_READ 0x2000 /* EPR5-bit: Kernel space readable */ |
73 | 73 | ||
74 | #define _PAGE_EXT_WIRED 0x4000 /* software: Wire TLB entry */ | ||
75 | |||
74 | /* Wrapper for extended mode pgprot twiddling */ | 76 | /* Wrapper for extended mode pgprot twiddling */ |
75 | #define _PAGE_EXT(x) ((unsigned long long)(x) << 32) | 77 | #define _PAGE_EXT(x) ((unsigned long long)(x) << 32) |
76 | 78 | ||
@@ -141,12 +143,14 @@ static inline unsigned long copy_ptea_attributes(unsigned long x) | |||
141 | # elif defined(CONFIG_HUGETLB_PAGE_SIZE_64MB) | 143 | # elif defined(CONFIG_HUGETLB_PAGE_SIZE_64MB) |
142 | # define _PAGE_SZHUGE (_PAGE_EXT_ESZ2 | _PAGE_EXT_ESZ3) | 144 | # define _PAGE_SZHUGE (_PAGE_EXT_ESZ2 | _PAGE_EXT_ESZ3) |
143 | # endif | 145 | # endif |
146 | # define _PAGE_WIRED (_PAGE_EXT(_PAGE_EXT_WIRED)) | ||
144 | #else | 147 | #else |
145 | # if defined(CONFIG_HUGETLB_PAGE_SIZE_64K) | 148 | # if defined(CONFIG_HUGETLB_PAGE_SIZE_64K) |
146 | # define _PAGE_SZHUGE (_PAGE_SZ1) | 149 | # define _PAGE_SZHUGE (_PAGE_SZ1) |
147 | # elif defined(CONFIG_HUGETLB_PAGE_SIZE_1MB) | 150 | # elif defined(CONFIG_HUGETLB_PAGE_SIZE_1MB) |
148 | # define _PAGE_SZHUGE (_PAGE_SZ0 | _PAGE_SZ1) | 151 | # define _PAGE_SZHUGE (_PAGE_SZ0 | _PAGE_SZ1) |
149 | # endif | 152 | # endif |
153 | # define _PAGE_WIRED (0) | ||
150 | #endif | 154 | #endif |
151 | 155 | ||
152 | /* | 156 | /* |
diff --git a/arch/sh/include/asm/pgtable_64.h b/arch/sh/include/asm/pgtable_64.h index 17cdbecc3adc..0ee46776dad6 100644 --- a/arch/sh/include/asm/pgtable_64.h +++ b/arch/sh/include/asm/pgtable_64.h | |||
@@ -43,11 +43,6 @@ static __inline__ void set_pte(pte_t *pteptr, pte_t pteval) | |||
43 | } | 43 | } |
44 | #define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) | 44 | #define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) |
45 | 45 | ||
46 | static __inline__ void pmd_set(pmd_t *pmdp,pte_t *ptep) | ||
47 | { | ||
48 | pmd_val(*pmdp) = (unsigned long) ptep; | ||
49 | } | ||
50 | |||
51 | /* | 46 | /* |
52 | * PGD defines. Top level. | 47 | * PGD defines. Top level. |
53 | */ | 48 | */ |
@@ -128,8 +123,21 @@ static __inline__ void pmd_set(pmd_t *pmdp,pte_t *ptep) | |||
128 | #define _PAGE_DIRTY 0x400 /* software: page accessed in write */ | 123 | #define _PAGE_DIRTY 0x400 /* software: page accessed in write */ |
129 | #define _PAGE_ACCESSED 0x800 /* software: page referenced */ | 124 | #define _PAGE_ACCESSED 0x800 /* software: page referenced */ |
130 | 125 | ||
126 | /* Wrapper for extended mode pgprot twiddling */ | ||
127 | #define _PAGE_EXT(x) ((unsigned long long)(x) << 32) | ||
128 | |||
129 | /* | ||
130 | * We can use the sign-extended bits in the PTEL to get 32 bits of | ||
131 | * software flags. This works for now because no implementations uses | ||
132 | * anything above the PPN field. | ||
133 | */ | ||
134 | #define _PAGE_WIRED _PAGE_EXT(0x001) /* software: wire the tlb entry */ | ||
135 | |||
136 | #define _PAGE_CLEAR_FLAGS (_PAGE_PRESENT | _PAGE_FILE | _PAGE_SHARED | \ | ||
137 | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_WIRED) | ||
138 | |||
131 | /* Mask which drops software flags */ | 139 | /* Mask which drops software flags */ |
132 | #define _PAGE_FLAGS_HARDWARE_MASK 0xfffffffffffff3dbLL | 140 | #define _PAGE_FLAGS_HARDWARE_MASK (NEFF_MASK & ~(_PAGE_CLEAR_FLAGS)) |
133 | 141 | ||
134 | /* | 142 | /* |
135 | * HugeTLB support | 143 | * HugeTLB support |
@@ -203,12 +211,6 @@ static __inline__ void pmd_set(pmd_t *pmdp,pte_t *ptep) | |||
203 | #define pgprot_writecombine(prot) __pgprot(pgprot_val(prot) & ~_PAGE_CACHABLE) | 211 | #define pgprot_writecombine(prot) __pgprot(pgprot_val(prot) & ~_PAGE_CACHABLE) |
204 | 212 | ||
205 | /* | 213 | /* |
206 | * Handling allocation failures during page table setup. | ||
207 | */ | ||
208 | extern void __handle_bad_pmd_kernel(pmd_t * pmd); | ||
209 | #define __handle_bad_pmd(x) __handle_bad_pmd_kernel(x) | ||
210 | |||
211 | /* | ||
212 | * PTE level access routines. | 214 | * PTE level access routines. |
213 | * | 215 | * |
214 | * Note1: | 216 | * Note1: |
diff --git a/arch/sh/include/asm/processor.h b/arch/sh/include/asm/processor.h index 017e0c1807b2..0a58cb25a658 100644 --- a/arch/sh/include/asm/processor.h +++ b/arch/sh/include/asm/processor.h | |||
@@ -85,6 +85,10 @@ struct sh_cpuinfo { | |||
85 | struct tlb_info itlb; | 85 | struct tlb_info itlb; |
86 | struct tlb_info dtlb; | 86 | struct tlb_info dtlb; |
87 | 87 | ||
88 | #ifdef CONFIG_SMP | ||
89 | struct task_struct *idle; | ||
90 | #endif | ||
91 | |||
88 | unsigned long flags; | 92 | unsigned long flags; |
89 | } __attribute__ ((aligned(L1_CACHE_BYTES))); | 93 | } __attribute__ ((aligned(L1_CACHE_BYTES))); |
90 | 94 | ||
@@ -98,13 +102,37 @@ extern struct sh_cpuinfo cpu_data[]; | |||
98 | 102 | ||
99 | /* Forward decl */ | 103 | /* Forward decl */ |
100 | struct seq_operations; | 104 | struct seq_operations; |
105 | struct task_struct; | ||
101 | 106 | ||
102 | extern struct pt_regs fake_swapper_regs; | 107 | extern struct pt_regs fake_swapper_regs; |
103 | 108 | ||
109 | extern void cpu_init(void); | ||
110 | extern void cpu_probe(void); | ||
111 | |||
112 | /* arch/sh/kernel/process.c */ | ||
113 | extern unsigned int xstate_size; | ||
114 | extern void free_thread_xstate(struct task_struct *); | ||
115 | extern struct kmem_cache *task_xstate_cachep; | ||
116 | |||
117 | /* arch/sh/mm/alignment.c */ | ||
118 | extern int get_unalign_ctl(struct task_struct *, unsigned long addr); | ||
119 | extern int set_unalign_ctl(struct task_struct *, unsigned int val); | ||
120 | |||
121 | #define GET_UNALIGN_CTL(tsk, addr) get_unalign_ctl((tsk), (addr)) | ||
122 | #define SET_UNALIGN_CTL(tsk, val) set_unalign_ctl((tsk), (val)) | ||
123 | |||
124 | /* arch/sh/mm/init.c */ | ||
125 | extern unsigned int mem_init_done; | ||
126 | |||
104 | /* arch/sh/kernel/setup.c */ | 127 | /* arch/sh/kernel/setup.c */ |
105 | const char *get_cpu_subtype(struct sh_cpuinfo *c); | 128 | const char *get_cpu_subtype(struct sh_cpuinfo *c); |
106 | extern const struct seq_operations cpuinfo_op; | 129 | extern const struct seq_operations cpuinfo_op; |
107 | 130 | ||
131 | /* thread_struct flags */ | ||
132 | #define SH_THREAD_UAC_NOPRINT (1 << 0) | ||
133 | #define SH_THREAD_UAC_SIGBUS (1 << 1) | ||
134 | #define SH_THREAD_UAC_MASK (SH_THREAD_UAC_NOPRINT | SH_THREAD_UAC_SIGBUS) | ||
135 | |||
108 | /* processor boot mode configuration */ | 136 | /* processor boot mode configuration */ |
109 | #define MODE_PIN0 (1 << 0) | 137 | #define MODE_PIN0 (1 << 0) |
110 | #define MODE_PIN1 (1 << 1) | 138 | #define MODE_PIN1 (1 << 1) |
diff --git a/arch/sh/include/asm/processor_32.h b/arch/sh/include/asm/processor_32.h index 1f3d6fab660c..61a445d2d02a 100644 --- a/arch/sh/include/asm/processor_32.h +++ b/arch/sh/include/asm/processor_32.h | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <asm/page.h> | 14 | #include <asm/page.h> |
15 | #include <asm/types.h> | 15 | #include <asm/types.h> |
16 | #include <asm/ptrace.h> | 16 | #include <asm/ptrace.h> |
17 | #include <asm/hw_breakpoint.h> | ||
17 | 18 | ||
18 | /* | 19 | /* |
19 | * Default implementation of macro that returns current | 20 | * Default implementation of macro that returns current |
@@ -26,8 +27,6 @@ | |||
26 | #define CCN_CVR 0xff000040 | 27 | #define CCN_CVR 0xff000040 |
27 | #define CCN_PRR 0xff000044 | 28 | #define CCN_PRR 0xff000044 |
28 | 29 | ||
29 | asmlinkage void __init sh_cpu_init(void); | ||
30 | |||
31 | /* | 30 | /* |
32 | * User space process size: 2GB. | 31 | * User space process size: 2GB. |
33 | * | 32 | * |
@@ -90,9 +89,9 @@ struct sh_fpu_soft_struct { | |||
90 | unsigned long entry_pc; | 89 | unsigned long entry_pc; |
91 | }; | 90 | }; |
92 | 91 | ||
93 | union sh_fpu_union { | 92 | union thread_xstate { |
94 | struct sh_fpu_hard_struct hard; | 93 | struct sh_fpu_hard_struct hardfpu; |
95 | struct sh_fpu_soft_struct soft; | 94 | struct sh_fpu_soft_struct softfpu; |
96 | }; | 95 | }; |
97 | 96 | ||
98 | struct thread_struct { | 97 | struct thread_struct { |
@@ -100,38 +99,30 @@ struct thread_struct { | |||
100 | unsigned long sp; | 99 | unsigned long sp; |
101 | unsigned long pc; | 100 | unsigned long pc; |
102 | 101 | ||
103 | /* Hardware debugging registers */ | 102 | /* Various thread flags, see SH_THREAD_xxx */ |
104 | unsigned long ubc_pc; | 103 | unsigned long flags; |
105 | 104 | ||
106 | /* floating point info */ | 105 | /* Save middle states of ptrace breakpoints */ |
107 | union sh_fpu_union fpu; | 106 | struct perf_event *ptrace_bps[HBP_NUM]; |
108 | 107 | ||
109 | #ifdef CONFIG_SH_DSP | 108 | #ifdef CONFIG_SH_DSP |
110 | /* Dsp status information */ | 109 | /* Dsp status information */ |
111 | struct sh_dsp_struct dsp_status; | 110 | struct sh_dsp_struct dsp_status; |
112 | #endif | 111 | #endif |
113 | }; | ||
114 | 112 | ||
115 | /* Count of active tasks with UBC settings */ | 113 | /* Extended processor state */ |
116 | extern int ubc_usercnt; | 114 | union thread_xstate *xstate; |
115 | }; | ||
117 | 116 | ||
118 | #define INIT_THREAD { \ | 117 | #define INIT_THREAD { \ |
119 | .sp = sizeof(init_stack) + (long) &init_stack, \ | 118 | .sp = sizeof(init_stack) + (long) &init_stack, \ |
119 | .flags = 0, \ | ||
120 | } | 120 | } |
121 | 121 | ||
122 | /* | ||
123 | * Do necessary setup to start up a newly executed thread. | ||
124 | */ | ||
125 | #define start_thread(_regs, new_pc, new_sp) \ | ||
126 | set_fs(USER_DS); \ | ||
127 | _regs->pr = 0; \ | ||
128 | _regs->sr = SR_FD; /* User mode. */ \ | ||
129 | _regs->pc = new_pc; \ | ||
130 | _regs->regs[15] = new_sp | ||
131 | |||
132 | /* Forward declaration, a strange C thing */ | 122 | /* Forward declaration, a strange C thing */ |
133 | struct task_struct; | 123 | struct task_struct; |
134 | struct mm_struct; | 124 | |
125 | extern void start_thread(struct pt_regs *regs, unsigned long new_pc, unsigned long new_sp); | ||
135 | 126 | ||
136 | /* Free all resources held by a thread. */ | 127 | /* Free all resources held by a thread. */ |
137 | extern void release_thread(struct task_struct *); | 128 | extern void release_thread(struct task_struct *); |
diff --git a/arch/sh/include/asm/processor_64.h b/arch/sh/include/asm/processor_64.h index 5727d31b0ccf..621bc4618c6b 100644 --- a/arch/sh/include/asm/processor_64.h +++ b/arch/sh/include/asm/processor_64.h | |||
@@ -87,26 +87,31 @@ struct sh_fpu_hard_struct { | |||
87 | /* long status; * software status information */ | 87 | /* long status; * software status information */ |
88 | }; | 88 | }; |
89 | 89 | ||
90 | #if 0 | ||
91 | /* Dummy fpu emulator */ | 90 | /* Dummy fpu emulator */ |
92 | struct sh_fpu_soft_struct { | 91 | struct sh_fpu_soft_struct { |
93 | unsigned long long fp_regs[32]; | 92 | unsigned long fp_regs[64]; |
94 | unsigned int fpscr; | 93 | unsigned int fpscr; |
95 | unsigned char lookahead; | 94 | unsigned char lookahead; |
96 | unsigned long entry_pc; | 95 | unsigned long entry_pc; |
97 | }; | 96 | }; |
98 | #endif | ||
99 | 97 | ||
100 | union sh_fpu_union { | 98 | union thread_xstate { |
101 | struct sh_fpu_hard_struct hard; | 99 | struct sh_fpu_hard_struct hardfpu; |
102 | /* 'hard' itself only produces 32 bit alignment, yet we need | 100 | struct sh_fpu_soft_struct softfpu; |
103 | to access it using 64 bit load/store as well. */ | 101 | /* |
102 | * The structure definitions only produce 32 bit alignment, yet we need | ||
103 | * to access them using 64 bit load/store as well. | ||
104 | */ | ||
104 | unsigned long long alignment_dummy; | 105 | unsigned long long alignment_dummy; |
105 | }; | 106 | }; |
106 | 107 | ||
107 | struct thread_struct { | 108 | struct thread_struct { |
108 | unsigned long sp; | 109 | unsigned long sp; |
109 | unsigned long pc; | 110 | unsigned long pc; |
111 | |||
112 | /* Various thread flags, see SH_THREAD_xxx */ | ||
113 | unsigned long flags; | ||
114 | |||
110 | /* This stores the address of the pt_regs built during a context | 115 | /* This stores the address of the pt_regs built during a context |
111 | switch, or of the register save area built for a kernel mode | 116 | switch, or of the register save area built for a kernel mode |
112 | exception. It is used for backtracing the stack of a sleeping task | 117 | exception. It is used for backtracing the stack of a sleeping task |
@@ -122,7 +127,7 @@ struct thread_struct { | |||
122 | /* Hardware debugging registers may come here */ | 127 | /* Hardware debugging registers may come here */ |
123 | 128 | ||
124 | /* floating point info */ | 129 | /* floating point info */ |
125 | union sh_fpu_union fpu; | 130 | union thread_xstate *xstate; |
126 | }; | 131 | }; |
127 | 132 | ||
128 | #define INIT_MMAP \ | 133 | #define INIT_MMAP \ |
@@ -137,7 +142,7 @@ struct thread_struct { | |||
137 | .trap_no = 0, \ | 142 | .trap_no = 0, \ |
138 | .error_code = 0, \ | 143 | .error_code = 0, \ |
139 | .address = 0, \ | 144 | .address = 0, \ |
140 | .fpu = { { { 0, } }, } \ | 145 | .flags = 0, \ |
141 | } | 146 | } |
142 | 147 | ||
143 | /* | 148 | /* |
diff --git a/arch/sh/include/asm/ptrace.h b/arch/sh/include/asm/ptrace.h index 1dc12cb44a2d..2168fde25611 100644 --- a/arch/sh/include/asm/ptrace.h +++ b/arch/sh/include/asm/ptrace.h | |||
@@ -102,13 +102,15 @@ struct pt_dspregs { | |||
102 | #define PTRACE_GETDSPREGS 55 /* DSP registers */ | 102 | #define PTRACE_GETDSPREGS 55 /* DSP registers */ |
103 | #define PTRACE_SETDSPREGS 56 | 103 | #define PTRACE_SETDSPREGS 56 |
104 | 104 | ||
105 | #define PT_TEXT_END_ADDR 240 | 105 | #define PT_TEXT_END_ADDR 240 |
106 | #define PT_TEXT_ADDR 244 /* &(struct user)->start_code */ | 106 | #define PT_TEXT_ADDR 244 /* &(struct user)->start_code */ |
107 | #define PT_DATA_ADDR 248 /* &(struct user)->start_data */ | 107 | #define PT_DATA_ADDR 248 /* &(struct user)->start_data */ |
108 | #define PT_TEXT_LEN 252 | 108 | #define PT_TEXT_LEN 252 |
109 | 109 | ||
110 | #ifdef __KERNEL__ | 110 | #ifdef __KERNEL__ |
111 | #include <asm/addrspace.h> | 111 | #include <asm/addrspace.h> |
112 | #include <asm/page.h> | ||
113 | #include <asm/system.h> | ||
112 | 114 | ||
113 | #define user_mode(regs) (((regs)->sr & 0x40000000)==0) | 115 | #define user_mode(regs) (((regs)->sr & 0x40000000)==0) |
114 | #define instruction_pointer(regs) ((unsigned long)(regs)->pc) | 116 | #define instruction_pointer(regs) ((unsigned long)(regs)->pc) |
@@ -121,8 +123,12 @@ extern void show_regs(struct pt_regs *); | |||
121 | struct task_struct; | 123 | struct task_struct; |
122 | 124 | ||
123 | #define arch_has_single_step() (1) | 125 | #define arch_has_single_step() (1) |
124 | extern void user_enable_single_step(struct task_struct *); | 126 | |
125 | extern void user_disable_single_step(struct task_struct *); | 127 | struct perf_event; |
128 | struct perf_sample_data; | ||
129 | |||
130 | extern void ptrace_triggered(struct perf_event *bp, int nmi, | ||
131 | struct perf_sample_data *data, struct pt_regs *regs); | ||
126 | 132 | ||
127 | #define task_pt_regs(task) \ | 133 | #define task_pt_regs(task) \ |
128 | ((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE) - 1) | 134 | ((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE) - 1) |
@@ -131,10 +137,8 @@ static inline unsigned long profile_pc(struct pt_regs *regs) | |||
131 | { | 137 | { |
132 | unsigned long pc = instruction_pointer(regs); | 138 | unsigned long pc = instruction_pointer(regs); |
133 | 139 | ||
134 | #ifdef P2SEG | 140 | if (virt_addr_uncached(pc)) |
135 | if (pc >= P2SEG && pc < P3SEG) | 141 | return CAC_ADDR(pc); |
136 | pc -= 0x20000000; | ||
137 | #endif | ||
138 | 142 | ||
139 | return pc; | 143 | return pc; |
140 | } | 144 | } |
diff --git a/arch/sh/include/asm/reboot.h b/arch/sh/include/asm/reboot.h new file mode 100644 index 000000000000..b3da0c63fc3d --- /dev/null +++ b/arch/sh/include/asm/reboot.h | |||
@@ -0,0 +1,21 @@ | |||
1 | #ifndef __ASM_SH_REBOOT_H | ||
2 | #define __ASM_SH_REBOOT_H | ||
3 | |||
4 | #include <linux/kdebug.h> | ||
5 | |||
6 | struct pt_regs; | ||
7 | |||
8 | struct machine_ops { | ||
9 | void (*restart)(char *cmd); | ||
10 | void (*halt)(void); | ||
11 | void (*power_off)(void); | ||
12 | void (*shutdown)(void); | ||
13 | void (*crash_shutdown)(struct pt_regs *); | ||
14 | }; | ||
15 | |||
16 | extern struct machine_ops machine_ops; | ||
17 | |||
18 | /* arch/sh/kernel/machine_kexec.c */ | ||
19 | void native_machine_crash_shutdown(struct pt_regs *regs); | ||
20 | |||
21 | #endif /* __ASM_SH_REBOOT_H */ | ||
diff --git a/arch/sh/include/asm/setup.h b/arch/sh/include/asm/setup.h index ce3743599b27..01fa17a3d759 100644 --- a/arch/sh/include/asm/setup.h +++ b/arch/sh/include/asm/setup.h | |||
@@ -18,8 +18,8 @@ | |||
18 | /* ... */ | 18 | /* ... */ |
19 | #define COMMAND_LINE ((char *) (PARAM+0x100)) | 19 | #define COMMAND_LINE ((char *) (PARAM+0x100)) |
20 | 20 | ||
21 | int setup_early_printk(char *); | ||
22 | void sh_mv_setup(void); | 21 | void sh_mv_setup(void); |
22 | void check_for_initrd(void); | ||
23 | 23 | ||
24 | #endif /* __KERNEL__ */ | 24 | #endif /* __KERNEL__ */ |
25 | 25 | ||
diff --git a/arch/sh/include/asm/sh_bios.h b/arch/sh/include/asm/sh_bios.h index d9c96d7cf6c7..95714c28422b 100644 --- a/arch/sh/include/asm/sh_bios.h +++ b/arch/sh/include/asm/sh_bios.h | |||
@@ -1,18 +1,27 @@ | |||
1 | #ifndef __ASM_SH_BIOS_H | 1 | #ifndef __ASM_SH_BIOS_H |
2 | #define __ASM_SH_BIOS_H | 2 | #define __ASM_SH_BIOS_H |
3 | 3 | ||
4 | #ifdef CONFIG_SH_STANDARD_BIOS | ||
5 | |||
4 | /* | 6 | /* |
5 | * Copyright (C) 2000 Greg Banks, Mitch Davis | 7 | * Copyright (C) 2000 Greg Banks, Mitch Davis |
6 | * C API to interface to the standard LinuxSH BIOS | 8 | * C API to interface to the standard LinuxSH BIOS |
7 | * usually from within the early stages of kernel boot. | 9 | * usually from within the early stages of kernel boot. |
8 | */ | 10 | */ |
9 | |||
10 | |||
11 | extern void sh_bios_console_write(const char *buf, unsigned int len); | 11 | extern void sh_bios_console_write(const char *buf, unsigned int len); |
12 | extern void sh_bios_char_out(char ch); | ||
13 | extern void sh_bios_gdb_detach(void); | 12 | extern void sh_bios_gdb_detach(void); |
14 | 13 | ||
15 | extern void sh_bios_get_node_addr(unsigned char *node_addr); | 14 | extern void sh_bios_get_node_addr(unsigned char *node_addr); |
16 | extern void sh_bios_shutdown(unsigned int how); | 15 | extern void sh_bios_shutdown(unsigned int how); |
17 | 16 | ||
17 | extern void sh_bios_vbr_init(void); | ||
18 | extern void sh_bios_vbr_reload(void); | ||
19 | |||
20 | #else | ||
21 | |||
22 | static inline void sh_bios_vbr_init(void) { } | ||
23 | static inline void sh_bios_vbr_reload(void) { } | ||
24 | |||
25 | #endif /* CONFIG_SH_STANDARD_BIOS */ | ||
26 | |||
18 | #endif /* __ASM_SH_BIOS_H */ | 27 | #endif /* __ASM_SH_BIOS_H */ |
diff --git a/arch/sh/include/asm/siu.h b/arch/sh/include/asm/siu.h new file mode 100644 index 000000000000..1d95c78808d1 --- /dev/null +++ b/arch/sh/include/asm/siu.h | |||
@@ -0,0 +1,24 @@ | |||
1 | /* | ||
2 | * platform header for the SIU ASoC driver | ||
3 | * | ||
4 | * Copyright (C) 2009-2010 Guennadi Liakhovetski <g.liakhovetski@gmx.de> | ||
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 | #ifndef ASM_SIU_H | ||
12 | #define ASM_SIU_H | ||
13 | |||
14 | struct device; | ||
15 | |||
16 | struct siu_platform { | ||
17 | struct device *dma_dev; | ||
18 | unsigned int dma_slave_tx_a; | ||
19 | unsigned int dma_slave_rx_a; | ||
20 | unsigned int dma_slave_tx_b; | ||
21 | unsigned int dma_slave_rx_b; | ||
22 | }; | ||
23 | |||
24 | #endif /* ASM_SIU_H */ | ||
diff --git a/arch/sh/include/asm/smp-ops.h b/arch/sh/include/asm/smp-ops.h new file mode 100644 index 000000000000..c590f76856f1 --- /dev/null +++ b/arch/sh/include/asm/smp-ops.h | |||
@@ -0,0 +1,51 @@ | |||
1 | #ifndef __ASM_SH_SMP_OPS_H | ||
2 | #define __ASM_SH_SMP_OPS_H | ||
3 | |||
4 | struct plat_smp_ops { | ||
5 | void (*smp_setup)(void); | ||
6 | unsigned int (*smp_processor_id)(void); | ||
7 | void (*prepare_cpus)(unsigned int max_cpus); | ||
8 | void (*start_cpu)(unsigned int cpu, unsigned long entry_point); | ||
9 | void (*send_ipi)(unsigned int cpu, unsigned int message); | ||
10 | int (*cpu_disable)(unsigned int cpu); | ||
11 | void (*cpu_die)(unsigned int cpu); | ||
12 | void (*play_dead)(void); | ||
13 | }; | ||
14 | |||
15 | extern struct plat_smp_ops *mp_ops; | ||
16 | extern struct plat_smp_ops shx3_smp_ops; | ||
17 | |||
18 | #ifdef CONFIG_SMP | ||
19 | |||
20 | static inline void plat_smp_setup(void) | ||
21 | { | ||
22 | BUG_ON(!mp_ops); | ||
23 | mp_ops->smp_setup(); | ||
24 | } | ||
25 | |||
26 | static inline void play_dead(void) | ||
27 | { | ||
28 | mp_ops->play_dead(); | ||
29 | } | ||
30 | |||
31 | extern void register_smp_ops(struct plat_smp_ops *ops); | ||
32 | |||
33 | #else | ||
34 | |||
35 | static inline void plat_smp_setup(void) | ||
36 | { | ||
37 | /* UP, nothing to do ... */ | ||
38 | } | ||
39 | |||
40 | static inline void register_smp_ops(struct plat_smp_ops *ops) | ||
41 | { | ||
42 | } | ||
43 | |||
44 | static inline void play_dead(void) | ||
45 | { | ||
46 | BUG(); | ||
47 | } | ||
48 | |||
49 | #endif /* CONFIG_SMP */ | ||
50 | |||
51 | #endif /* __ASM_SH_SMP_OPS_H */ | ||
diff --git a/arch/sh/include/asm/smp.h b/arch/sh/include/asm/smp.h index 53ef26ced75f..9070d943ddde 100644 --- a/arch/sh/include/asm/smp.h +++ b/arch/sh/include/asm/smp.h | |||
@@ -3,15 +3,16 @@ | |||
3 | 3 | ||
4 | #include <linux/bitops.h> | 4 | #include <linux/bitops.h> |
5 | #include <linux/cpumask.h> | 5 | #include <linux/cpumask.h> |
6 | #include <asm/smp-ops.h> | ||
6 | 7 | ||
7 | #ifdef CONFIG_SMP | 8 | #ifdef CONFIG_SMP |
8 | 9 | ||
9 | #include <linux/spinlock.h> | 10 | #include <linux/spinlock.h> |
10 | #include <asm/atomic.h> | 11 | #include <asm/atomic.h> |
11 | #include <asm/current.h> | 12 | #include <asm/current.h> |
13 | #include <asm/percpu.h> | ||
12 | 14 | ||
13 | #define raw_smp_processor_id() (current_thread_info()->cpu) | 15 | #define raw_smp_processor_id() (current_thread_info()->cpu) |
14 | #define hard_smp_processor_id() plat_smp_processor_id() | ||
15 | 16 | ||
16 | /* Map from cpu id to sequential logical cpu number. */ | 17 | /* Map from cpu id to sequential logical cpu number. */ |
17 | extern int __cpu_number_map[NR_CPUS]; | 18 | extern int __cpu_number_map[NR_CPUS]; |
@@ -30,20 +31,43 @@ enum { | |||
30 | SMP_MSG_NR, /* must be last */ | 31 | SMP_MSG_NR, /* must be last */ |
31 | }; | 32 | }; |
32 | 33 | ||
34 | DECLARE_PER_CPU(int, cpu_state); | ||
35 | |||
33 | void smp_message_recv(unsigned int msg); | 36 | void smp_message_recv(unsigned int msg); |
34 | void smp_timer_broadcast(const struct cpumask *mask); | 37 | void smp_timer_broadcast(const struct cpumask *mask); |
35 | 38 | ||
36 | void local_timer_interrupt(void); | 39 | void local_timer_interrupt(void); |
37 | void local_timer_setup(unsigned int cpu); | 40 | void local_timer_setup(unsigned int cpu); |
38 | 41 | void local_timer_stop(unsigned int cpu); | |
39 | void plat_smp_setup(void); | ||
40 | void plat_prepare_cpus(unsigned int max_cpus); | ||
41 | int plat_smp_processor_id(void); | ||
42 | void plat_start_cpu(unsigned int cpu, unsigned long entry_point); | ||
43 | void plat_send_ipi(unsigned int cpu, unsigned int message); | ||
44 | 42 | ||
45 | void arch_send_call_function_single_ipi(int cpu); | 43 | void arch_send_call_function_single_ipi(int cpu); |
46 | extern void arch_send_call_function_ipi_mask(const struct cpumask *mask); | 44 | void arch_send_call_function_ipi_mask(const struct cpumask *mask); |
45 | |||
46 | void native_play_dead(void); | ||
47 | void native_cpu_die(unsigned int cpu); | ||
48 | int native_cpu_disable(unsigned int cpu); | ||
49 | |||
50 | #ifdef CONFIG_HOTPLUG_CPU | ||
51 | void play_dead_common(void); | ||
52 | extern int __cpu_disable(void); | ||
53 | |||
54 | static inline void __cpu_die(unsigned int cpu) | ||
55 | { | ||
56 | extern struct plat_smp_ops *mp_ops; /* private */ | ||
57 | |||
58 | mp_ops->cpu_die(cpu); | ||
59 | } | ||
60 | #endif | ||
61 | |||
62 | static inline int hard_smp_processor_id(void) | ||
63 | { | ||
64 | extern struct plat_smp_ops *mp_ops; /* private */ | ||
65 | |||
66 | if (!mp_ops) | ||
67 | return 0; /* boot CPU */ | ||
68 | |||
69 | return mp_ops->smp_processor_id(); | ||
70 | } | ||
47 | 71 | ||
48 | #else | 72 | #else |
49 | 73 | ||
diff --git a/arch/sh/include/asm/suspend.h b/arch/sh/include/asm/suspend.h index fe9c2a1ad047..64eb41a063e8 100644 --- a/arch/sh/include/asm/suspend.h +++ b/arch/sh/include/asm/suspend.h | |||
@@ -92,5 +92,6 @@ extern unsigned long sh_mobile_sleep_supported; | |||
92 | #define SUSP_SH_USTANDBY (1 << 3) /* SH-Mobile U-standby mode */ | 92 | #define SUSP_SH_USTANDBY (1 << 3) /* SH-Mobile U-standby mode */ |
93 | #define SUSP_SH_SF (1 << 4) /* Enable self-refresh */ | 93 | #define SUSP_SH_SF (1 << 4) /* Enable self-refresh */ |
94 | #define SUSP_SH_MMU (1 << 5) /* Save/restore MMU and cache */ | 94 | #define SUSP_SH_MMU (1 << 5) /* Save/restore MMU and cache */ |
95 | #define SUSP_SH_REGS (1 << 6) /* Save/restore registers */ | ||
95 | 96 | ||
96 | #endif /* _ASM_SH_SUSPEND_H */ | 97 | #endif /* _ASM_SH_SUSPEND_H */ |
diff --git a/arch/sh/include/asm/syscall.h b/arch/sh/include/asm/syscall.h index 6a381429ee9d..aa7777bdc370 100644 --- a/arch/sh/include/asm/syscall.h +++ b/arch/sh/include/asm/syscall.h | |||
@@ -1,6 +1,8 @@ | |||
1 | #ifndef __ASM_SH_SYSCALL_H | 1 | #ifndef __ASM_SH_SYSCALL_H |
2 | #define __ASM_SH_SYSCALL_H | 2 | #define __ASM_SH_SYSCALL_H |
3 | 3 | ||
4 | extern const unsigned long sys_call_table[]; | ||
5 | |||
4 | #ifdef CONFIG_SUPERH32 | 6 | #ifdef CONFIG_SUPERH32 |
5 | # include "syscall_32.h" | 7 | # include "syscall_32.h" |
6 | #else | 8 | #else |
diff --git a/arch/sh/include/asm/syscalls.h b/arch/sh/include/asm/syscalls.h index c1e2b8deb837..507725af2e54 100644 --- a/arch/sh/include/asm/syscalls.h +++ b/arch/sh/include/asm/syscalls.h | |||
@@ -3,17 +3,12 @@ | |||
3 | 3 | ||
4 | #ifdef __KERNEL__ | 4 | #ifdef __KERNEL__ |
5 | 5 | ||
6 | struct old_utsname; | ||
7 | |||
8 | asmlinkage int old_mmap(unsigned long addr, unsigned long len, | 6 | asmlinkage int old_mmap(unsigned long addr, unsigned long len, |
9 | unsigned long prot, unsigned long flags, | 7 | unsigned long prot, unsigned long flags, |
10 | int fd, unsigned long off); | 8 | int fd, unsigned long off); |
11 | asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, | 9 | asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, |
12 | unsigned long prot, unsigned long flags, | 10 | unsigned long prot, unsigned long flags, |
13 | unsigned long fd, unsigned long pgoff); | 11 | unsigned long fd, unsigned long pgoff); |
14 | asmlinkage int sys_ipc(uint call, int first, int second, | ||
15 | int third, void __user *ptr, long fifth); | ||
16 | asmlinkage int sys_uname(struct old_utsname __user *name); | ||
17 | 12 | ||
18 | #ifdef CONFIG_SUPERH32 | 13 | #ifdef CONFIG_SUPERH32 |
19 | # include "syscalls_32.h" | 14 | # include "syscalls_32.h" |
diff --git a/arch/sh/include/asm/system.h b/arch/sh/include/asm/system.h index c15415b4b169..0bd7a17d5e1a 100644 --- a/arch/sh/include/asm/system.h +++ b/arch/sh/include/asm/system.h | |||
@@ -10,7 +10,6 @@ | |||
10 | #include <linux/compiler.h> | 10 | #include <linux/compiler.h> |
11 | #include <linux/linkage.h> | 11 | #include <linux/linkage.h> |
12 | #include <asm/types.h> | 12 | #include <asm/types.h> |
13 | #include <asm/ptrace.h> | ||
14 | 13 | ||
15 | #define AT_VECTOR_SIZE_ARCH 5 /* entries in ARCH_DLINFO */ | 14 | #define AT_VECTOR_SIZE_ARCH 5 /* entries in ARCH_DLINFO */ |
16 | 15 | ||
@@ -32,7 +31,7 @@ | |||
32 | #define mb() __asm__ __volatile__ ("synco": : :"memory") | 31 | #define mb() __asm__ __volatile__ ("synco": : :"memory") |
33 | #define rmb() mb() | 32 | #define rmb() mb() |
34 | #define wmb() __asm__ __volatile__ ("synco": : :"memory") | 33 | #define wmb() __asm__ __volatile__ ("synco": : :"memory") |
35 | #define ctrl_barrier() __icbi(0xa8000000) | 34 | #define ctrl_barrier() __icbi(PAGE_OFFSET) |
36 | #define read_barrier_depends() do { } while(0) | 35 | #define read_barrier_depends() do { } while(0) |
37 | #else | 36 | #else |
38 | #define mb() __asm__ __volatile__ ("": : :"memory") | 37 | #define mb() __asm__ __volatile__ ("": : :"memory") |
@@ -114,6 +113,8 @@ static inline unsigned long __cmpxchg(volatile void * ptr, unsigned long old, | |||
114 | (unsigned long)_n_, sizeof(*(ptr))); \ | 113 | (unsigned long)_n_, sizeof(*(ptr))); \ |
115 | }) | 114 | }) |
116 | 115 | ||
116 | struct pt_regs; | ||
117 | |||
117 | extern void die(const char *str, struct pt_regs *regs, long err) __attribute__ ((noreturn)); | 118 | extern void die(const char *str, struct pt_regs *regs, long err) __attribute__ ((noreturn)); |
118 | void free_initmem(void); | 119 | void free_initmem(void); |
119 | void free_initrd_mem(unsigned long start, unsigned long end); | 120 | void free_initrd_mem(unsigned long start, unsigned long end); |
@@ -137,14 +138,14 @@ extern unsigned int instruction_size(unsigned int insn); | |||
137 | #endif | 138 | #endif |
138 | 139 | ||
139 | extern unsigned long cached_to_uncached; | 140 | extern unsigned long cached_to_uncached; |
141 | extern unsigned long uncached_size; | ||
140 | 142 | ||
141 | extern struct dentry *sh_debugfs_root; | 143 | extern struct dentry *sh_debugfs_root; |
142 | 144 | ||
143 | void per_cpu_trap_init(void); | 145 | void per_cpu_trap_init(void); |
144 | void default_idle(void); | 146 | void default_idle(void); |
145 | void cpu_idle_wait(void); | 147 | void cpu_idle_wait(void); |
146 | 148 | void stop_this_cpu(void *); | |
147 | asmlinkage void break_point_trap(void); | ||
148 | 149 | ||
149 | #ifdef CONFIG_SUPERH32 | 150 | #ifdef CONFIG_SUPERH32 |
150 | #define BUILD_TRAP_HANDLER(name) \ | 151 | #define BUILD_TRAP_HANDLER(name) \ |
diff --git a/arch/sh/include/asm/system_32.h b/arch/sh/include/asm/system_32.h index 06814f5b59c7..51296b36770e 100644 --- a/arch/sh/include/asm/system_32.h +++ b/arch/sh/include/asm/system_32.h | |||
@@ -2,6 +2,7 @@ | |||
2 | #define __ASM_SH_SYSTEM_32_H | 2 | #define __ASM_SH_SYSTEM_32_H |
3 | 3 | ||
4 | #include <linux/types.h> | 4 | #include <linux/types.h> |
5 | #include <asm/mmu.h> | ||
5 | 6 | ||
6 | #ifdef CONFIG_SH_DSP | 7 | #ifdef CONFIG_SH_DSP |
7 | 8 | ||
@@ -144,9 +145,6 @@ do { \ | |||
144 | __restore_dsp(prev); \ | 145 | __restore_dsp(prev); \ |
145 | } while (0) | 146 | } while (0) |
146 | 147 | ||
147 | #define __uses_jump_to_uncached \ | ||
148 | noinline __attribute__ ((__section__ (".uncached.text"))) | ||
149 | |||
150 | /* | 148 | /* |
151 | * Jump to uncached area. | 149 | * Jump to uncached area. |
152 | * When handling TLB or caches, we need to do it from an uncached area. | 150 | * When handling TLB or caches, we need to do it from an uncached area. |
@@ -216,6 +214,17 @@ static inline reg_size_t register_align(void *val) | |||
216 | int handle_unaligned_access(insn_size_t instruction, struct pt_regs *regs, | 214 | int handle_unaligned_access(insn_size_t instruction, struct pt_regs *regs, |
217 | struct mem_access *ma, int); | 215 | struct mem_access *ma, int); |
218 | 216 | ||
217 | static inline void trigger_address_error(void) | ||
218 | { | ||
219 | if (__in_29bit_mode()) | ||
220 | __asm__ __volatile__ ( | ||
221 | "ldc %0, sr\n\t" | ||
222 | "mov.l @%1, %0" | ||
223 | : | ||
224 | : "r" (0x10000000), "r" (0x80000001) | ||
225 | ); | ||
226 | } | ||
227 | |||
219 | asmlinkage void do_address_error(struct pt_regs *regs, | 228 | asmlinkage void do_address_error(struct pt_regs *regs, |
220 | unsigned long writeaccess, | 229 | unsigned long writeaccess, |
221 | unsigned long address); | 230 | unsigned long address); |
diff --git a/arch/sh/include/asm/system_64.h b/arch/sh/include/asm/system_64.h index ab1dd917ea87..36338646dfc8 100644 --- a/arch/sh/include/asm/system_64.h +++ b/arch/sh/include/asm/system_64.h | |||
@@ -18,6 +18,7 @@ | |||
18 | /* | 18 | /* |
19 | * switch_to() should switch tasks to task nr n, first | 19 | * switch_to() should switch tasks to task nr n, first |
20 | */ | 20 | */ |
21 | struct thread_struct; | ||
21 | struct task_struct *sh64_switch_to(struct task_struct *prev, | 22 | struct task_struct *sh64_switch_to(struct task_struct *prev, |
22 | struct thread_struct *prev_thread, | 23 | struct thread_struct *prev_thread, |
23 | struct task_struct *next, | 24 | struct task_struct *next, |
@@ -33,8 +34,6 @@ do { \ | |||
33 | &next->thread); \ | 34 | &next->thread); \ |
34 | } while (0) | 35 | } while (0) |
35 | 36 | ||
36 | #define __uses_jump_to_uncached | ||
37 | |||
38 | #define jump_to_uncached() do { } while (0) | 37 | #define jump_to_uncached() do { } while (0) |
39 | #define back_to_cached() do { } while (0) | 38 | #define back_to_cached() do { } while (0) |
40 | 39 | ||
@@ -48,6 +47,13 @@ static inline reg_size_t register_align(void *val) | |||
48 | return (unsigned long long)(signed long long)(signed long)val; | 47 | return (unsigned long long)(signed long long)(signed long)val; |
49 | } | 48 | } |
50 | 49 | ||
50 | extern void phys_stext(void); | ||
51 | |||
52 | static inline void trigger_address_error(void) | ||
53 | { | ||
54 | phys_stext(); | ||
55 | } | ||
56 | |||
51 | #define SR_BL_LL 0x0000000010000000LL | 57 | #define SR_BL_LL 0x0000000010000000LL |
52 | 58 | ||
53 | static inline void set_bl_bit(void) | 59 | static inline void set_bl_bit(void) |
diff --git a/arch/sh/include/asm/thread_info.h b/arch/sh/include/asm/thread_info.h index 1f3d927e2265..c228946926ed 100644 --- a/arch/sh/include/asm/thread_info.h +++ b/arch/sh/include/asm/thread_info.h | |||
@@ -93,14 +93,16 @@ static inline struct thread_info *current_thread_info(void) | |||
93 | 93 | ||
94 | #define THREAD_SIZE_ORDER (THREAD_SHIFT - PAGE_SHIFT) | 94 | #define THREAD_SIZE_ORDER (THREAD_SHIFT - PAGE_SHIFT) |
95 | 95 | ||
96 | #else /* THREAD_SHIFT < PAGE_SHIFT */ | 96 | #endif |
97 | |||
98 | #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR | ||
99 | 97 | ||
100 | extern struct thread_info *alloc_thread_info(struct task_struct *tsk); | 98 | extern struct thread_info *alloc_thread_info(struct task_struct *tsk); |
101 | extern void free_thread_info(struct thread_info *ti); | 99 | extern void free_thread_info(struct thread_info *ti); |
100 | extern void arch_task_cache_init(void); | ||
101 | #define arch_task_cache_init arch_task_cache_init | ||
102 | extern int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src); | ||
103 | extern void init_thread_xstate(void); | ||
102 | 104 | ||
103 | #endif /* THREAD_SHIFT < PAGE_SHIFT */ | 105 | #define __HAVE_ARCH_THREAD_INFO_ALLOCATOR |
104 | 106 | ||
105 | #endif /* __ASSEMBLY__ */ | 107 | #endif /* __ASSEMBLY__ */ |
106 | 108 | ||
@@ -119,7 +121,7 @@ extern void free_thread_info(struct thread_info *ti); | |||
119 | #define TIF_NOTIFY_RESUME 7 /* callback before returning to user */ | 121 | #define TIF_NOTIFY_RESUME 7 /* callback before returning to user */ |
120 | #define TIF_SYSCALL_TRACEPOINT 8 /* for ftrace syscall instrumentation */ | 122 | #define TIF_SYSCALL_TRACEPOINT 8 /* for ftrace syscall instrumentation */ |
121 | #define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling TIF_NEED_RESCHED */ | 123 | #define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling TIF_NEED_RESCHED */ |
122 | #define TIF_MEMDIE 18 | 124 | #define TIF_MEMDIE 18 /* is terminating due to OOM killer */ |
123 | #define TIF_FREEZE 19 /* Freezing for suspend */ | 125 | #define TIF_FREEZE 19 /* Freezing for suspend */ |
124 | 126 | ||
125 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) | 127 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) |
diff --git a/arch/sh/include/asm/tlb.h b/arch/sh/include/asm/tlb.h index da8fe7ab8728..75abb38dffd5 100644 --- a/arch/sh/include/asm/tlb.h +++ b/arch/sh/include/asm/tlb.h | |||
@@ -11,6 +11,7 @@ | |||
11 | #ifdef CONFIG_MMU | 11 | #ifdef CONFIG_MMU |
12 | #include <asm/pgalloc.h> | 12 | #include <asm/pgalloc.h> |
13 | #include <asm/tlbflush.h> | 13 | #include <asm/tlbflush.h> |
14 | #include <asm/mmu_context.h> | ||
14 | 15 | ||
15 | /* | 16 | /* |
16 | * TLB handling. This allows us to remove pages from the page | 17 | * TLB handling. This allows us to remove pages from the page |
@@ -97,6 +98,22 @@ tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma) | |||
97 | 98 | ||
98 | #define tlb_migrate_finish(mm) do { } while (0) | 99 | #define tlb_migrate_finish(mm) do { } while (0) |
99 | 100 | ||
101 | #if defined(CONFIG_CPU_SH4) || defined(CONFIG_SUPERH64) | ||
102 | extern void tlb_wire_entry(struct vm_area_struct *, unsigned long, pte_t); | ||
103 | extern void tlb_unwire_entry(void); | ||
104 | #else | ||
105 | static inline void tlb_wire_entry(struct vm_area_struct *vma , | ||
106 | unsigned long addr, pte_t pte) | ||
107 | { | ||
108 | BUG(); | ||
109 | } | ||
110 | |||
111 | static inline void tlb_unwire_entry(void) | ||
112 | { | ||
113 | BUG(); | ||
114 | } | ||
115 | #endif | ||
116 | |||
100 | #else /* CONFIG_MMU */ | 117 | #else /* CONFIG_MMU */ |
101 | 118 | ||
102 | #define tlb_start_vma(tlb, vma) do { } while (0) | 119 | #define tlb_start_vma(tlb, vma) do { } while (0) |
diff --git a/arch/sh/include/asm/topology.h b/arch/sh/include/asm/topology.h index 37cdadd975ac..88e734069fa6 100644 --- a/arch/sh/include/asm/topology.h +++ b/arch/sh/include/asm/topology.h | |||
@@ -35,7 +35,7 @@ | |||
35 | 35 | ||
36 | #define pcibus_to_node(bus) ((void)(bus), -1) | 36 | #define pcibus_to_node(bus) ((void)(bus), -1) |
37 | #define cpumask_of_pcibus(bus) (pcibus_to_node(bus) == -1 ? \ | 37 | #define cpumask_of_pcibus(bus) (pcibus_to_node(bus) == -1 ? \ |
38 | CPU_MASK_ALL_PTR : \ | 38 | cpu_all_mask : \ |
39 | cpumask_of_node(pcibus_to_node(bus))) | 39 | cpumask_of_node(pcibus_to_node(bus))) |
40 | 40 | ||
41 | #endif | 41 | #endif |
diff --git a/arch/sh/include/asm/ubc.h b/arch/sh/include/asm/ubc.h deleted file mode 100644 index 9bf961684431..000000000000 --- a/arch/sh/include/asm/ubc.h +++ /dev/null | |||
@@ -1,64 +0,0 @@ | |||
1 | /* | ||
2 | * include/asm-sh/ubc.h | ||
3 | * | ||
4 | * Copyright (C) 1999 Niibe Yutaka | ||
5 | * Copyright (C) 2002, 2003 Paul Mundt | ||
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 __ASM_SH_UBC_H | ||
12 | #define __ASM_SH_UBC_H | ||
13 | #ifdef __KERNEL__ | ||
14 | |||
15 | #include <cpu/ubc.h> | ||
16 | |||
17 | /* User Break Controller */ | ||
18 | #if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) | ||
19 | #define UBC_TYPE_SH7729 (current_cpu_data.type == CPU_SH7729) | ||
20 | #else | ||
21 | #define UBC_TYPE_SH7729 0 | ||
22 | #endif | ||
23 | |||
24 | #define BAMR_ASID (1 << 2) | ||
25 | #define BAMR_NONE 0 | ||
26 | #define BAMR_10 0x1 | ||
27 | #define BAMR_12 0x2 | ||
28 | #define BAMR_ALL 0x3 | ||
29 | #define BAMR_16 0x8 | ||
30 | #define BAMR_20 0x9 | ||
31 | |||
32 | #define BBR_INST (1 << 4) | ||
33 | #define BBR_DATA (2 << 4) | ||
34 | #define BBR_READ (1 << 2) | ||
35 | #define BBR_WRITE (2 << 2) | ||
36 | #define BBR_BYTE 0x1 | ||
37 | #define BBR_HALF 0x2 | ||
38 | #define BBR_LONG 0x3 | ||
39 | #define BBR_QUAD (1 << 6) /* SH7750 */ | ||
40 | #define BBR_CPU (1 << 6) /* SH7709A,SH7729 */ | ||
41 | #define BBR_DMA (2 << 6) /* SH7709A,SH7729 */ | ||
42 | |||
43 | #define BRCR_CMFA (1 << 15) | ||
44 | #define BRCR_CMFB (1 << 14) | ||
45 | |||
46 | #if defined CONFIG_CPU_SH2A | ||
47 | #define BRCR_CMFCA (1 << 15) | ||
48 | #define BRCR_CMFCB (1 << 14) | ||
49 | #define BRCR_CMFDA (1 << 13) | ||
50 | #define BRCR_CMFDB (1 << 12) | ||
51 | #define BRCR_PCBB (1 << 6) /* 1: after execution */ | ||
52 | #define BRCR_PCBA (1 << 5) /* 1: after execution */ | ||
53 | #define BRCR_PCTE 0 | ||
54 | #else | ||
55 | #define BRCR_PCTE (1 << 11) | ||
56 | #define BRCR_PCBA (1 << 10) /* 1: after execution */ | ||
57 | #define BRCR_DBEB (1 << 7) | ||
58 | #define BRCR_PCBB (1 << 6) | ||
59 | #define BRCR_SEQ (1 << 3) | ||
60 | #define BRCR_UBDE (1 << 0) | ||
61 | #endif | ||
62 | |||
63 | #endif /* __KERNEL__ */ | ||
64 | #endif /* __ASM_SH_UBC_H */ | ||
diff --git a/arch/sh/include/asm/uncached.h b/arch/sh/include/asm/uncached.h new file mode 100644 index 000000000000..e3419f96626a --- /dev/null +++ b/arch/sh/include/asm/uncached.h | |||
@@ -0,0 +1,18 @@ | |||
1 | #ifndef __ASM_SH_UNCACHED_H | ||
2 | #define __ASM_SH_UNCACHED_H | ||
3 | |||
4 | #include <linux/bug.h> | ||
5 | |||
6 | #ifdef CONFIG_UNCACHED_MAPPING | ||
7 | extern unsigned long uncached_start, uncached_end; | ||
8 | |||
9 | extern int virt_addr_uncached(unsigned long kaddr); | ||
10 | extern void uncached_init(void); | ||
11 | extern void uncached_resize(unsigned long size); | ||
12 | #else | ||
13 | #define virt_addr_uncached(kaddr) (0) | ||
14 | #define uncached_init() do { } while (0) | ||
15 | #define uncached_resize(size) BUG() | ||
16 | #endif | ||
17 | |||
18 | #endif /* __ASM_SH_UNCACHED_H */ | ||
diff --git a/arch/sh/include/asm/unistd_32.h b/arch/sh/include/asm/unistd_32.h index 365744b05269..0e7f0fc8f086 100644 --- a/arch/sh/include/asm/unistd_32.h +++ b/arch/sh/include/asm/unistd_32.h | |||
@@ -358,6 +358,7 @@ | |||
358 | #define __ARCH_WANT_STAT64 | 358 | #define __ARCH_WANT_STAT64 |
359 | #define __ARCH_WANT_SYS_ALARM | 359 | #define __ARCH_WANT_SYS_ALARM |
360 | #define __ARCH_WANT_SYS_GETHOSTNAME | 360 | #define __ARCH_WANT_SYS_GETHOSTNAME |
361 | #define __ARCH_WANT_SYS_IPC | ||
361 | #define __ARCH_WANT_SYS_PAUSE | 362 | #define __ARCH_WANT_SYS_PAUSE |
362 | #define __ARCH_WANT_SYS_SGETMASK | 363 | #define __ARCH_WANT_SYS_SGETMASK |
363 | #define __ARCH_WANT_SYS_SIGNAL | 364 | #define __ARCH_WANT_SYS_SIGNAL |
@@ -370,6 +371,7 @@ | |||
370 | #define __ARCH_WANT_SYS_LLSEEK | 371 | #define __ARCH_WANT_SYS_LLSEEK |
371 | #define __ARCH_WANT_SYS_NICE | 372 | #define __ARCH_WANT_SYS_NICE |
372 | #define __ARCH_WANT_SYS_OLD_GETRLIMIT | 373 | #define __ARCH_WANT_SYS_OLD_GETRLIMIT |
374 | #define __ARCH_WANT_SYS_OLD_UNAME | ||
373 | #define __ARCH_WANT_SYS_OLDUMOUNT | 375 | #define __ARCH_WANT_SYS_OLDUMOUNT |
374 | #define __ARCH_WANT_SYS_SIGPENDING | 376 | #define __ARCH_WANT_SYS_SIGPENDING |
375 | #define __ARCH_WANT_SYS_SIGPROCMASK | 377 | #define __ARCH_WANT_SYS_SIGPROCMASK |
diff --git a/arch/sh/include/asm/unistd_64.h b/arch/sh/include/asm/unistd_64.h index 25de158aac3a..0580c33a1e04 100644 --- a/arch/sh/include/asm/unistd_64.h +++ b/arch/sh/include/asm/unistd_64.h | |||
@@ -398,6 +398,7 @@ | |||
398 | #define __ARCH_WANT_STAT64 | 398 | #define __ARCH_WANT_STAT64 |
399 | #define __ARCH_WANT_SYS_ALARM | 399 | #define __ARCH_WANT_SYS_ALARM |
400 | #define __ARCH_WANT_SYS_GETHOSTNAME | 400 | #define __ARCH_WANT_SYS_GETHOSTNAME |
401 | #define __ARCH_WANT_SYS_IPC | ||
401 | #define __ARCH_WANT_SYS_PAUSE | 402 | #define __ARCH_WANT_SYS_PAUSE |
402 | #define __ARCH_WANT_SYS_SGETMASK | 403 | #define __ARCH_WANT_SYS_SGETMASK |
403 | #define __ARCH_WANT_SYS_SIGNAL | 404 | #define __ARCH_WANT_SYS_SIGNAL |
@@ -410,6 +411,7 @@ | |||
410 | #define __ARCH_WANT_SYS_LLSEEK | 411 | #define __ARCH_WANT_SYS_LLSEEK |
411 | #define __ARCH_WANT_SYS_NICE | 412 | #define __ARCH_WANT_SYS_NICE |
412 | #define __ARCH_WANT_SYS_OLD_GETRLIMIT | 413 | #define __ARCH_WANT_SYS_OLD_GETRLIMIT |
414 | #define __ARCH_WANT_SYS_OLD_UNAME | ||
413 | #define __ARCH_WANT_SYS_OLDUMOUNT | 415 | #define __ARCH_WANT_SYS_OLDUMOUNT |
414 | #define __ARCH_WANT_SYS_SIGPENDING | 416 | #define __ARCH_WANT_SYS_SIGPENDING |
415 | #define __ARCH_WANT_SYS_SIGPROCMASK | 417 | #define __ARCH_WANT_SYS_SIGPROCMASK |
diff --git a/arch/sh/include/asm/vmlinux.lds.h b/arch/sh/include/asm/vmlinux.lds.h index 244ec4ad9a79..d58ad493b3a6 100644 --- a/arch/sh/include/asm/vmlinux.lds.h +++ b/arch/sh/include/asm/vmlinux.lds.h | |||
@@ -14,4 +14,12 @@ | |||
14 | #define DWARF_EH_FRAME | 14 | #define DWARF_EH_FRAME |
15 | #endif | 15 | #endif |
16 | 16 | ||
17 | #ifdef CONFIG_SUPERH64 | ||
18 | #define EXTRA_TEXT \ | ||
19 | *(.text64) \ | ||
20 | *(.text..SHmedia32) | ||
21 | #else | ||
22 | #define EXTRA_TEXT | ||
23 | #endif | ||
24 | |||
17 | #endif /* __ASM_SH_VMLINUX_LDS_H */ | 25 | #endif /* __ASM_SH_VMLINUX_LDS_H */ |
diff --git a/arch/sh/include/asm/watchdog.h b/arch/sh/include/asm/watchdog.h index 19dfff5c8511..85a7aca7fb8f 100644 --- a/arch/sh/include/asm/watchdog.h +++ b/arch/sh/include/asm/watchdog.h | |||
@@ -70,7 +70,7 @@ | |||
70 | */ | 70 | */ |
71 | static inline __u32 sh_wdt_read_cnt(void) | 71 | static inline __u32 sh_wdt_read_cnt(void) |
72 | { | 72 | { |
73 | return ctrl_inl(WTCNT_R); | 73 | return __raw_readl(WTCNT_R); |
74 | } | 74 | } |
75 | 75 | ||
76 | /** | 76 | /** |
@@ -82,7 +82,7 @@ static inline __u32 sh_wdt_read_cnt(void) | |||
82 | */ | 82 | */ |
83 | static inline void sh_wdt_write_cnt(__u32 val) | 83 | static inline void sh_wdt_write_cnt(__u32 val) |
84 | { | 84 | { |
85 | ctrl_outl((WTCNT_HIGH << 24) | (__u32)val, WTCNT); | 85 | __raw_writel((WTCNT_HIGH << 24) | (__u32)val, WTCNT); |
86 | } | 86 | } |
87 | 87 | ||
88 | /** | 88 | /** |
@@ -94,7 +94,7 @@ static inline void sh_wdt_write_cnt(__u32 val) | |||
94 | */ | 94 | */ |
95 | static inline void sh_wdt_write_bst(__u32 val) | 95 | static inline void sh_wdt_write_bst(__u32 val) |
96 | { | 96 | { |
97 | ctrl_outl((WTBST_HIGH << 24) | (__u32)val, WTBST); | 97 | __raw_writel((WTBST_HIGH << 24) | (__u32)val, WTBST); |
98 | } | 98 | } |
99 | /** | 99 | /** |
100 | * sh_wdt_read_csr - Read from Control/Status Register | 100 | * sh_wdt_read_csr - Read from Control/Status Register |
@@ -103,7 +103,7 @@ static inline void sh_wdt_write_bst(__u32 val) | |||
103 | */ | 103 | */ |
104 | static inline __u32 sh_wdt_read_csr(void) | 104 | static inline __u32 sh_wdt_read_csr(void) |
105 | { | 105 | { |
106 | return ctrl_inl(WTCSR_R); | 106 | return __raw_readl(WTCSR_R); |
107 | } | 107 | } |
108 | 108 | ||
109 | /** | 109 | /** |
@@ -115,7 +115,7 @@ static inline __u32 sh_wdt_read_csr(void) | |||
115 | */ | 115 | */ |
116 | static inline void sh_wdt_write_csr(__u32 val) | 116 | static inline void sh_wdt_write_csr(__u32 val) |
117 | { | 117 | { |
118 | ctrl_outl((WTCSR_HIGH << 24) | (__u32)val, WTCSR); | 118 | __raw_writel((WTCSR_HIGH << 24) | (__u32)val, WTCSR); |
119 | } | 119 | } |
120 | #else | 120 | #else |
121 | /** | 121 | /** |
@@ -124,7 +124,7 @@ static inline void sh_wdt_write_csr(__u32 val) | |||
124 | */ | 124 | */ |
125 | static inline __u8 sh_wdt_read_cnt(void) | 125 | static inline __u8 sh_wdt_read_cnt(void) |
126 | { | 126 | { |
127 | return ctrl_inb(WTCNT_R); | 127 | return __raw_readb(WTCNT_R); |
128 | } | 128 | } |
129 | 129 | ||
130 | /** | 130 | /** |
@@ -136,7 +136,7 @@ static inline __u8 sh_wdt_read_cnt(void) | |||
136 | */ | 136 | */ |
137 | static inline void sh_wdt_write_cnt(__u8 val) | 137 | static inline void sh_wdt_write_cnt(__u8 val) |
138 | { | 138 | { |
139 | ctrl_outw((WTCNT_HIGH << 8) | (__u16)val, WTCNT); | 139 | __raw_writew((WTCNT_HIGH << 8) | (__u16)val, WTCNT); |
140 | } | 140 | } |
141 | 141 | ||
142 | /** | 142 | /** |
@@ -146,7 +146,7 @@ static inline void sh_wdt_write_cnt(__u8 val) | |||
146 | */ | 146 | */ |
147 | static inline __u8 sh_wdt_read_csr(void) | 147 | static inline __u8 sh_wdt_read_csr(void) |
148 | { | 148 | { |
149 | return ctrl_inb(WTCSR_R); | 149 | return __raw_readb(WTCSR_R); |
150 | } | 150 | } |
151 | 151 | ||
152 | /** | 152 | /** |
@@ -158,7 +158,7 @@ static inline __u8 sh_wdt_read_csr(void) | |||
158 | */ | 158 | */ |
159 | static inline void sh_wdt_write_csr(__u8 val) | 159 | static inline void sh_wdt_write_csr(__u8 val) |
160 | { | 160 | { |
161 | ctrl_outw((WTCSR_HIGH << 8) | (__u16)val, WTCSR); | 161 | __raw_writew((WTCSR_HIGH << 8) | (__u16)val, WTCSR); |
162 | } | 162 | } |
163 | #endif /* CONFIG_CPU_SUBTYPE_SH7785 || CONFIG_CPU_SUBTYPE_SH7780 */ | 163 | #endif /* CONFIG_CPU_SUBTYPE_SH7785 || CONFIG_CPU_SUBTYPE_SH7780 */ |
164 | #endif /* __KERNEL__ */ | 164 | #endif /* __KERNEL__ */ |