diff options
Diffstat (limited to 'arch/arm/include/asm')
| -rw-r--r-- | arch/arm/include/asm/cacheflush.h | 38 | ||||
| -rw-r--r-- | arch/arm/include/asm/clkdev.h | 1 | ||||
| -rw-r--r-- | arch/arm/include/asm/irq.h | 1 | ||||
| -rw-r--r-- | arch/arm/include/asm/outercache.h | 75 | ||||
| -rw-r--r-- | arch/arm/include/asm/system.h | 16 |
5 files changed, 88 insertions, 43 deletions
diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h index 72da7e045c6b..0d08d4170b64 100644 --- a/arch/arm/include/asm/cacheflush.h +++ b/arch/arm/include/asm/cacheflush.h | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | #include <asm/glue.h> | 15 | #include <asm/glue.h> |
| 16 | #include <asm/shmparam.h> | 16 | #include <asm/shmparam.h> |
| 17 | #include <asm/cachetype.h> | 17 | #include <asm/cachetype.h> |
| 18 | #include <asm/outercache.h> | ||
| 18 | 19 | ||
| 19 | #define CACHE_COLOUR(vaddr) ((vaddr & (SHMLBA - 1)) >> PAGE_SHIFT) | 20 | #define CACHE_COLOUR(vaddr) ((vaddr & (SHMLBA - 1)) >> PAGE_SHIFT) |
| 20 | 21 | ||
| @@ -219,12 +220,6 @@ struct cpu_cache_fns { | |||
| 219 | void (*dma_flush_range)(const void *, const void *); | 220 | void (*dma_flush_range)(const void *, const void *); |
| 220 | }; | 221 | }; |
| 221 | 222 | ||
| 222 | struct outer_cache_fns { | ||
| 223 | void (*inv_range)(unsigned long, unsigned long); | ||
| 224 | void (*clean_range)(unsigned long, unsigned long); | ||
| 225 | void (*flush_range)(unsigned long, unsigned long); | ||
| 226 | }; | ||
| 227 | |||
| 228 | /* | 223 | /* |
| 229 | * Select the calling method | 224 | * Select the calling method |
| 230 | */ | 225 | */ |
| @@ -281,37 +276,6 @@ extern void dmac_flush_range(const void *, const void *); | |||
| 281 | 276 | ||
| 282 | #endif | 277 | #endif |
| 283 | 278 | ||
| 284 | #ifdef CONFIG_OUTER_CACHE | ||
| 285 | |||
| 286 | extern struct outer_cache_fns outer_cache; | ||
| 287 | |||
| 288 | static inline void outer_inv_range(unsigned long start, unsigned long end) | ||
| 289 | { | ||
| 290 | if (outer_cache.inv_range) | ||
| 291 | outer_cache.inv_range(start, end); | ||
| 292 | } | ||
| 293 | static inline void outer_clean_range(unsigned long start, unsigned long end) | ||
| 294 | { | ||
| 295 | if (outer_cache.clean_range) | ||
| 296 | outer_cache.clean_range(start, end); | ||
| 297 | } | ||
| 298 | static inline void outer_flush_range(unsigned long start, unsigned long end) | ||
| 299 | { | ||
| 300 | if (outer_cache.flush_range) | ||
| 301 | outer_cache.flush_range(start, end); | ||
| 302 | } | ||
| 303 | |||
| 304 | #else | ||
| 305 | |||
| 306 | static inline void outer_inv_range(unsigned long start, unsigned long end) | ||
| 307 | { } | ||
| 308 | static inline void outer_clean_range(unsigned long start, unsigned long end) | ||
| 309 | { } | ||
| 310 | static inline void outer_flush_range(unsigned long start, unsigned long end) | ||
| 311 | { } | ||
| 312 | |||
| 313 | #endif | ||
| 314 | |||
| 315 | /* | 279 | /* |
| 316 | * Copy user data from/to a page which is mapped into a different | 280 | * Copy user data from/to a page which is mapped into a different |
| 317 | * processes address space. Really, we want to allow our "user | 281 | * processes address space. Really, we want to allow our "user |
diff --git a/arch/arm/include/asm/clkdev.h b/arch/arm/include/asm/clkdev.h index 7a0690da5e63..b56c1389b6fa 100644 --- a/arch/arm/include/asm/clkdev.h +++ b/arch/arm/include/asm/clkdev.h | |||
| @@ -13,6 +13,7 @@ | |||
| 13 | #define __ASM_CLKDEV_H | 13 | #define __ASM_CLKDEV_H |
| 14 | 14 | ||
| 15 | struct clk; | 15 | struct clk; |
| 16 | struct device; | ||
| 16 | 17 | ||
| 17 | struct clk_lookup { | 18 | struct clk_lookup { |
| 18 | struct list_head node; | 19 | struct list_head node; |
diff --git a/arch/arm/include/asm/irq.h b/arch/arm/include/asm/irq.h index 328f14a8b790..237282f7c762 100644 --- a/arch/arm/include/asm/irq.h +++ b/arch/arm/include/asm/irq.h | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | 17 | ||
| 18 | #ifndef __ASSEMBLY__ | 18 | #ifndef __ASSEMBLY__ |
| 19 | struct irqaction; | 19 | struct irqaction; |
| 20 | struct pt_regs; | ||
| 20 | extern void migrate_irqs(void); | 21 | extern void migrate_irqs(void); |
| 21 | 22 | ||
| 22 | extern void asm_do_IRQ(unsigned int, struct pt_regs *); | 23 | extern void asm_do_IRQ(unsigned int, struct pt_regs *); |
diff --git a/arch/arm/include/asm/outercache.h b/arch/arm/include/asm/outercache.h new file mode 100644 index 000000000000..25f76bae57ab --- /dev/null +++ b/arch/arm/include/asm/outercache.h | |||
| @@ -0,0 +1,75 @@ | |||
| 1 | /* | ||
| 2 | * arch/arm/include/asm/outercache.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 2010 ARM Ltd. | ||
| 5 | * Written by Catalin Marinas <catalin.marinas@arm.com> | ||
| 6 | * | ||
| 7 | * This program is free software; you can redistribute it and/or modify | ||
| 8 | * it under the terms of the GNU General Public License version 2 as | ||
| 9 | * published by the Free Software Foundation. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, | ||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 14 | * GNU General Public License for more details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU General Public License | ||
| 17 | * along with this program; if not, write to the Free Software | ||
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 19 | */ | ||
| 20 | |||
| 21 | #ifndef __ASM_OUTERCACHE_H | ||
| 22 | #define __ASM_OUTERCACHE_H | ||
| 23 | |||
| 24 | struct outer_cache_fns { | ||
| 25 | void (*inv_range)(unsigned long, unsigned long); | ||
| 26 | void (*clean_range)(unsigned long, unsigned long); | ||
| 27 | void (*flush_range)(unsigned long, unsigned long); | ||
| 28 | #ifdef CONFIG_OUTER_CACHE_SYNC | ||
| 29 | void (*sync)(void); | ||
| 30 | #endif | ||
| 31 | }; | ||
| 32 | |||
| 33 | #ifdef CONFIG_OUTER_CACHE | ||
| 34 | |||
| 35 | extern struct outer_cache_fns outer_cache; | ||
| 36 | |||
| 37 | static inline void outer_inv_range(unsigned long start, unsigned long end) | ||
| 38 | { | ||
| 39 | if (outer_cache.inv_range) | ||
| 40 | outer_cache.inv_range(start, end); | ||
| 41 | } | ||
| 42 | static inline void outer_clean_range(unsigned long start, unsigned long end) | ||
| 43 | { | ||
| 44 | if (outer_cache.clean_range) | ||
| 45 | outer_cache.clean_range(start, end); | ||
| 46 | } | ||
| 47 | static inline void outer_flush_range(unsigned long start, unsigned long end) | ||
| 48 | { | ||
| 49 | if (outer_cache.flush_range) | ||
| 50 | outer_cache.flush_range(start, end); | ||
| 51 | } | ||
| 52 | |||
| 53 | #else | ||
| 54 | |||
| 55 | static inline void outer_inv_range(unsigned long start, unsigned long end) | ||
| 56 | { } | ||
| 57 | static inline void outer_clean_range(unsigned long start, unsigned long end) | ||
| 58 | { } | ||
| 59 | static inline void outer_flush_range(unsigned long start, unsigned long end) | ||
| 60 | { } | ||
| 61 | |||
| 62 | #endif | ||
| 63 | |||
| 64 | #ifdef CONFIG_OUTER_CACHE_SYNC | ||
| 65 | static inline void outer_sync(void) | ||
| 66 | { | ||
| 67 | if (outer_cache.sync) | ||
| 68 | outer_cache.sync(); | ||
| 69 | } | ||
| 70 | #else | ||
| 71 | static inline void outer_sync(void) | ||
| 72 | { } | ||
| 73 | #endif | ||
| 74 | |||
| 75 | #endif /* __ASM_OUTERCACHE_H */ | ||
diff --git a/arch/arm/include/asm/system.h b/arch/arm/include/asm/system.h index ca88e6a84707..4ace45ec3ef8 100644 --- a/arch/arm/include/asm/system.h +++ b/arch/arm/include/asm/system.h | |||
| @@ -60,6 +60,8 @@ | |||
| 60 | #include <linux/linkage.h> | 60 | #include <linux/linkage.h> |
| 61 | #include <linux/irqflags.h> | 61 | #include <linux/irqflags.h> |
| 62 | 62 | ||
| 63 | #include <asm/outercache.h> | ||
| 64 | |||
| 63 | #define __exception __attribute__((section(".exception.text"))) | 65 | #define __exception __attribute__((section(".exception.text"))) |
| 64 | 66 | ||
| 65 | struct thread_info; | 67 | struct thread_info; |
| @@ -137,10 +139,12 @@ extern unsigned int user_debug; | |||
| 137 | #define dmb() __asm__ __volatile__ ("" : : : "memory") | 139 | #define dmb() __asm__ __volatile__ ("" : : : "memory") |
| 138 | #endif | 140 | #endif |
| 139 | 141 | ||
| 140 | #if __LINUX_ARM_ARCH__ >= 7 || defined(CONFIG_SMP) | 142 | #ifdef CONFIG_ARCH_HAS_BARRIERS |
| 141 | #define mb() dmb() | 143 | #include <mach/barriers.h> |
| 144 | #elif __LINUX_ARM_ARCH__ >= 7 || defined(CONFIG_SMP) | ||
| 145 | #define mb() do { dsb(); outer_sync(); } while (0) | ||
| 142 | #define rmb() dmb() | 146 | #define rmb() dmb() |
| 143 | #define wmb() dmb() | 147 | #define wmb() mb() |
| 144 | #else | 148 | #else |
| 145 | #define mb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0) | 149 | #define mb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0) |
| 146 | #define rmb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0) | 150 | #define rmb() do { if (arch_is_coherent()) dmb(); else barrier(); } while (0) |
| @@ -152,9 +156,9 @@ extern unsigned int user_debug; | |||
| 152 | #define smp_rmb() barrier() | 156 | #define smp_rmb() barrier() |
| 153 | #define smp_wmb() barrier() | 157 | #define smp_wmb() barrier() |
| 154 | #else | 158 | #else |
| 155 | #define smp_mb() mb() | 159 | #define smp_mb() dmb() |
| 156 | #define smp_rmb() rmb() | 160 | #define smp_rmb() dmb() |
| 157 | #define smp_wmb() wmb() | 161 | #define smp_wmb() dmb() |
| 158 | #endif | 162 | #endif |
| 159 | 163 | ||
| 160 | #define read_barrier_depends() do { } while(0) | 164 | #define read_barrier_depends() do { } while(0) |
