diff options
Diffstat (limited to 'arch/arm/include')
| -rw-r--r-- | arch/arm/include/asm/cacheflush.h | 133 | ||||
| -rw-r--r-- | arch/arm/include/asm/cpu-multi32.h | 69 | ||||
| -rw-r--r-- | arch/arm/include/asm/cpu-single.h | 44 | ||||
| -rw-r--r-- | arch/arm/include/asm/fncpy.h | 94 | ||||
| -rw-r--r-- | arch/arm/include/asm/glue-cache.h | 146 | ||||
| -rw-r--r-- | arch/arm/include/asm/glue-df.h | 110 | ||||
| -rw-r--r-- | arch/arm/include/asm/glue-pf.h | 57 | ||||
| -rw-r--r-- | arch/arm/include/asm/glue-proc.h | 264 | ||||
| -rw-r--r-- | arch/arm/include/asm/glue.h | 138 | ||||
| -rw-r--r-- | arch/arm/include/asm/hardware/cache-l2x0.h | 1 | ||||
| -rw-r--r-- | arch/arm/include/asm/hardware/sp810.h | 3 | ||||
| -rw-r--r-- | arch/arm/include/asm/mach/arch.h | 4 | ||||
| -rw-r--r-- | arch/arm/include/asm/pgalloc.h | 2 | ||||
| -rw-r--r-- | arch/arm/include/asm/proc-fns.h | 306 | ||||
| -rw-r--r-- | arch/arm/include/asm/processor.h | 2 | ||||
| -rw-r--r-- | arch/arm/include/asm/smp_scu.h | 7 | ||||
| -rw-r--r-- | arch/arm/include/asm/tlb.h | 105 | ||||
| -rw-r--r-- | arch/arm/include/asm/tlbflush.h | 7 |
18 files changed, 851 insertions, 641 deletions
diff --git a/arch/arm/include/asm/cacheflush.h b/arch/arm/include/asm/cacheflush.h index 3acd8fa25e34..18a56640d97d 100644 --- a/arch/arm/include/asm/cacheflush.h +++ b/arch/arm/include/asm/cacheflush.h | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | #include <linux/mm.h> | 13 | #include <linux/mm.h> |
| 14 | 14 | ||
| 15 | #include <asm/glue.h> | 15 | #include <asm/glue-cache.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 | #include <asm/outercache.h> |
| @@ -20,123 +20,6 @@ | |||
| 20 | #define CACHE_COLOUR(vaddr) ((vaddr & (SHMLBA - 1)) >> PAGE_SHIFT) | 20 | #define CACHE_COLOUR(vaddr) ((vaddr & (SHMLBA - 1)) >> PAGE_SHIFT) |
| 21 | 21 | ||
| 22 | /* | 22 | /* |
| 23 | * Cache Model | ||
| 24 | * =========== | ||
| 25 | */ | ||
| 26 | #undef _CACHE | ||
| 27 | #undef MULTI_CACHE | ||
| 28 | |||
| 29 | #if defined(CONFIG_CPU_CACHE_V3) | ||
| 30 | # ifdef _CACHE | ||
| 31 | # define MULTI_CACHE 1 | ||
| 32 | # else | ||
| 33 | # define _CACHE v3 | ||
| 34 | # endif | ||
| 35 | #endif | ||
| 36 | |||
| 37 | #if defined(CONFIG_CPU_CACHE_V4) | ||
| 38 | # ifdef _CACHE | ||
| 39 | # define MULTI_CACHE 1 | ||
| 40 | # else | ||
| 41 | # define _CACHE v4 | ||
| 42 | # endif | ||
| 43 | #endif | ||
| 44 | |||
| 45 | #if defined(CONFIG_CPU_ARM920T) || defined(CONFIG_CPU_ARM922T) || \ | ||
| 46 | defined(CONFIG_CPU_ARM925T) || defined(CONFIG_CPU_ARM1020) || \ | ||
| 47 | defined(CONFIG_CPU_ARM1026) | ||
| 48 | # define MULTI_CACHE 1 | ||
| 49 | #endif | ||
| 50 | |||
| 51 | #if defined(CONFIG_CPU_FA526) | ||
| 52 | # ifdef _CACHE | ||
| 53 | # define MULTI_CACHE 1 | ||
| 54 | # else | ||
| 55 | # define _CACHE fa | ||
| 56 | # endif | ||
| 57 | #endif | ||
| 58 | |||
| 59 | #if defined(CONFIG_CPU_ARM926T) | ||
| 60 | # ifdef _CACHE | ||
| 61 | # define MULTI_CACHE 1 | ||
| 62 | # else | ||
| 63 | # define _CACHE arm926 | ||
| 64 | # endif | ||
| 65 | #endif | ||
| 66 | |||
| 67 | #if defined(CONFIG_CPU_ARM940T) | ||
| 68 | # ifdef _CACHE | ||
| 69 | # define MULTI_CACHE 1 | ||
| 70 | # else | ||
| 71 | # define _CACHE arm940 | ||
| 72 | # endif | ||
| 73 | #endif | ||
| 74 | |||
| 75 | #if defined(CONFIG_CPU_ARM946E) | ||
| 76 | # ifdef _CACHE | ||
| 77 | # define MULTI_CACHE 1 | ||
| 78 | # else | ||
| 79 | # define _CACHE arm946 | ||
| 80 | # endif | ||
| 81 | #endif | ||
| 82 | |||
| 83 | #if defined(CONFIG_CPU_CACHE_V4WB) | ||
| 84 | # ifdef _CACHE | ||
| 85 | # define MULTI_CACHE 1 | ||
| 86 | # else | ||
| 87 | # define _CACHE v4wb | ||
| 88 | # endif | ||
| 89 | #endif | ||
| 90 | |||
| 91 | #if defined(CONFIG_CPU_XSCALE) | ||
| 92 | # ifdef _CACHE | ||
| 93 | # define MULTI_CACHE 1 | ||
| 94 | # else | ||
| 95 | # define _CACHE xscale | ||
| 96 | # endif | ||
| 97 | #endif | ||
| 98 | |||
| 99 | #if defined(CONFIG_CPU_XSC3) | ||
| 100 | # ifdef _CACHE | ||
| 101 | # define MULTI_CACHE 1 | ||
| 102 | # else | ||
| 103 | # define _CACHE xsc3 | ||
| 104 | # endif | ||
| 105 | #endif | ||
| 106 | |||
| 107 | #if defined(CONFIG_CPU_MOHAWK) | ||
| 108 | # ifdef _CACHE | ||
| 109 | # define MULTI_CACHE 1 | ||
| 110 | # else | ||
| 111 | # define _CACHE mohawk | ||
| 112 | # endif | ||
| 113 | #endif | ||
| 114 | |||
| 115 | #if defined(CONFIG_CPU_FEROCEON) | ||
| 116 | # define MULTI_CACHE 1 | ||
| 117 | #endif | ||
| 118 | |||
| 119 | #if defined(CONFIG_CPU_V6) | ||
| 120 | //# ifdef _CACHE | ||
| 121 | # define MULTI_CACHE 1 | ||
| 122 | //# else | ||
| 123 | //# define _CACHE v6 | ||
| 124 | //# endif | ||
| 125 | #endif | ||
| 126 | |||
| 127 | #if defined(CONFIG_CPU_V7) | ||
| 128 | //# ifdef _CACHE | ||
| 129 | # define MULTI_CACHE 1 | ||
| 130 | //# else | ||
| 131 | //# define _CACHE v7 | ||
| 132 | //# endif | ||
| 133 | #endif | ||
| 134 | |||
| 135 | #if !defined(_CACHE) && !defined(MULTI_CACHE) | ||
| 136 | #error Unknown cache maintainence model | ||
| 137 | #endif | ||
| 138 | |||
| 139 | /* | ||
| 140 | * This flag is used to indicate that the page pointed to by a pte is clean | 23 | * This flag is used to indicate that the page pointed to by a pte is clean |
| 141 | * and does not require cleaning before returning it to the user. | 24 | * and does not require cleaning before returning it to the user. |
| 142 | */ | 25 | */ |
| @@ -249,19 +132,11 @@ extern struct cpu_cache_fns cpu_cache; | |||
| 249 | * visible to the CPU. | 132 | * visible to the CPU. |
| 250 | */ | 133 | */ |
| 251 | #define dmac_map_area cpu_cache.dma_map_area | 134 | #define dmac_map_area cpu_cache.dma_map_area |
| 252 | #define dmac_unmap_area cpu_cache.dma_unmap_area | 135 | #define dmac_unmap_area cpu_cache.dma_unmap_area |
| 253 | #define dmac_flush_range cpu_cache.dma_flush_range | 136 | #define dmac_flush_range cpu_cache.dma_flush_range |
| 254 | 137 | ||
| 255 | #else | 138 | #else |
| 256 | 139 | ||
| 257 | #define __cpuc_flush_icache_all __glue(_CACHE,_flush_icache_all) | ||
| 258 | #define __cpuc_flush_kern_all __glue(_CACHE,_flush_kern_cache_all) | ||
| 259 | #define __cpuc_flush_user_all __glue(_CACHE,_flush_user_cache_all) | ||
| 260 | #define __cpuc_flush_user_range __glue(_CACHE,_flush_user_cache_range) | ||
| 261 | #define __cpuc_coherent_kern_range __glue(_CACHE,_coherent_kern_range) | ||
| 262 | #define __cpuc_coherent_user_range __glue(_CACHE,_coherent_user_range) | ||
| 263 | #define __cpuc_flush_dcache_area __glue(_CACHE,_flush_kern_dcache_area) | ||
| 264 | |||
| 265 | extern void __cpuc_flush_icache_all(void); | 140 | extern void __cpuc_flush_icache_all(void); |
| 266 | extern void __cpuc_flush_kern_all(void); | 141 | extern void __cpuc_flush_kern_all(void); |
| 267 | extern void __cpuc_flush_user_all(void); | 142 | extern void __cpuc_flush_user_all(void); |
| @@ -276,10 +151,6 @@ extern void __cpuc_flush_dcache_area(void *, size_t); | |||
| 276 | * is visible to DMA, or data written by DMA to system memory is | 151 | * is visible to DMA, or data written by DMA to system memory is |
| 277 | * visible to the CPU. | 152 | * visible to the CPU. |
| 278 | */ | 153 | */ |
| 279 | #define dmac_map_area __glue(_CACHE,_dma_map_area) | ||
| 280 | #define dmac_unmap_area __glue(_CACHE,_dma_unmap_area) | ||
| 281 | #define dmac_flush_range __glue(_CACHE,_dma_flush_range) | ||
| 282 | |||
| 283 | extern void dmac_map_area(const void *, size_t, int); | 154 | extern void dmac_map_area(const void *, size_t, int); |
| 284 | extern void dmac_unmap_area(const void *, size_t, int); | 155 | extern void dmac_unmap_area(const void *, size_t, int); |
| 285 | extern void dmac_flush_range(const void *, const void *); | 156 | extern void dmac_flush_range(const void *, const void *); |
diff --git a/arch/arm/include/asm/cpu-multi32.h b/arch/arm/include/asm/cpu-multi32.h deleted file mode 100644 index e2b5b0b2116a..000000000000 --- a/arch/arm/include/asm/cpu-multi32.h +++ /dev/null | |||
| @@ -1,69 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * arch/arm/include/asm/cpu-multi32.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 2000 Russell King | ||
| 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 | #include <asm/page.h> | ||
| 11 | |||
| 12 | struct mm_struct; | ||
| 13 | |||
| 14 | /* | ||
| 15 | * Don't change this structure - ASM code | ||
| 16 | * relies on it. | ||
| 17 | */ | ||
| 18 | extern struct processor { | ||
| 19 | /* MISC | ||
| 20 | * get data abort address/flags | ||
| 21 | */ | ||
| 22 | void (*_data_abort)(unsigned long pc); | ||
| 23 | /* | ||
| 24 | * Retrieve prefetch fault address | ||
| 25 | */ | ||
| 26 | unsigned long (*_prefetch_abort)(unsigned long lr); | ||
| 27 | /* | ||
| 28 | * Set up any processor specifics | ||
| 29 | */ | ||
| 30 | void (*_proc_init)(void); | ||
| 31 | /* | ||
| 32 | * Disable any processor specifics | ||
| 33 | */ | ||
| 34 | void (*_proc_fin)(void); | ||
| 35 | /* | ||
| 36 | * Special stuff for a reset | ||
| 37 | */ | ||
| 38 | void (*reset)(unsigned long addr) __attribute__((noreturn)); | ||
| 39 | /* | ||
| 40 | * Idle the processor | ||
| 41 | */ | ||
| 42 | int (*_do_idle)(void); | ||
| 43 | /* | ||
| 44 | * Processor architecture specific | ||
| 45 | */ | ||
| 46 | /* | ||
| 47 | * clean a virtual address range from the | ||
| 48 | * D-cache without flushing the cache. | ||
| 49 | */ | ||
| 50 | void (*dcache_clean_area)(void *addr, int size); | ||
| 51 | |||
| 52 | /* | ||
| 53 | * Set the page table | ||
| 54 | */ | ||
| 55 | void (*switch_mm)(unsigned long pgd_phys, struct mm_struct *mm); | ||
| 56 | /* | ||
| 57 | * Set a possibly extended PTE. Non-extended PTEs should | ||
| 58 | * ignore 'ext'. | ||
| 59 | */ | ||
| 60 | void (*set_pte_ext)(pte_t *ptep, pte_t pte, unsigned int ext); | ||
| 61 | } processor; | ||
| 62 | |||
| 63 | #define cpu_proc_init() processor._proc_init() | ||
| 64 | #define cpu_proc_fin() processor._proc_fin() | ||
| 65 | #define cpu_reset(addr) processor.reset(addr) | ||
| 66 | #define cpu_do_idle() processor._do_idle() | ||
| 67 | #define cpu_dcache_clean_area(addr,sz) processor.dcache_clean_area(addr,sz) | ||
| 68 | #define cpu_set_pte_ext(ptep,pte,ext) processor.set_pte_ext(ptep,pte,ext) | ||
| 69 | #define cpu_do_switch_mm(pgd,mm) processor.switch_mm(pgd,mm) | ||
diff --git a/arch/arm/include/asm/cpu-single.h b/arch/arm/include/asm/cpu-single.h deleted file mode 100644 index f073a6d2a406..000000000000 --- a/arch/arm/include/asm/cpu-single.h +++ /dev/null | |||
| @@ -1,44 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * arch/arm/include/asm/cpu-single.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 2000 Russell King | ||
| 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 | * Single CPU | ||
| 12 | */ | ||
| 13 | #ifdef __STDC__ | ||
| 14 | #define __catify_fn(name,x) name##x | ||
| 15 | #else | ||
| 16 | #define __catify_fn(name,x) name/**/x | ||
| 17 | #endif | ||
| 18 | #define __cpu_fn(name,x) __catify_fn(name,x) | ||
| 19 | |||
| 20 | /* | ||
| 21 | * If we are supporting multiple CPUs, then we must use a table of | ||
| 22 | * function pointers for this lot. Otherwise, we can optimise the | ||
| 23 | * table away. | ||
| 24 | */ | ||
| 25 | #define cpu_proc_init __cpu_fn(CPU_NAME,_proc_init) | ||
| 26 | #define cpu_proc_fin __cpu_fn(CPU_NAME,_proc_fin) | ||
| 27 | #define cpu_reset __cpu_fn(CPU_NAME,_reset) | ||
| 28 | #define cpu_do_idle __cpu_fn(CPU_NAME,_do_idle) | ||
| 29 | #define cpu_dcache_clean_area __cpu_fn(CPU_NAME,_dcache_clean_area) | ||
| 30 | #define cpu_do_switch_mm __cpu_fn(CPU_NAME,_switch_mm) | ||
| 31 | #define cpu_set_pte_ext __cpu_fn(CPU_NAME,_set_pte_ext) | ||
| 32 | |||
| 33 | #include <asm/page.h> | ||
| 34 | |||
| 35 | struct mm_struct; | ||
| 36 | |||
| 37 | /* declare all the functions as extern */ | ||
| 38 | extern void cpu_proc_init(void); | ||
| 39 | extern void cpu_proc_fin(void); | ||
| 40 | extern int cpu_do_idle(void); | ||
| 41 | extern void cpu_dcache_clean_area(void *, int); | ||
| 42 | extern void cpu_do_switch_mm(unsigned long pgd_phys, struct mm_struct *mm); | ||
| 43 | extern void cpu_set_pte_ext(pte_t *ptep, pte_t pte, unsigned int ext); | ||
| 44 | extern void cpu_reset(unsigned long addr) __attribute__((noreturn)); | ||
diff --git a/arch/arm/include/asm/fncpy.h b/arch/arm/include/asm/fncpy.h new file mode 100644 index 000000000000..de5354746924 --- /dev/null +++ b/arch/arm/include/asm/fncpy.h | |||
| @@ -0,0 +1,94 @@ | |||
| 1 | /* | ||
| 2 | * arch/arm/include/asm/fncpy.h - helper macros for function body copying | ||
| 3 | * | ||
| 4 | * Copyright (C) 2011 Linaro Limited | ||
| 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 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | * You should have received a copy of the GNU General Public License | ||
| 16 | * along with this program; if not, write to the Free Software | ||
| 17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 18 | */ | ||
| 19 | |||
| 20 | /* | ||
| 21 | * These macros are intended for use when there is a need to copy a low-level | ||
| 22 | * function body into special memory. | ||
| 23 | * | ||
| 24 | * For example, when reconfiguring the SDRAM controller, the code doing the | ||
| 25 | * reconfiguration may need to run from SRAM. | ||
| 26 | * | ||
| 27 | * NOTE: that the copied function body must be entirely self-contained and | ||
| 28 | * position-independent in order for this to work properly. | ||
| 29 | * | ||
| 30 | * NOTE: in order for embedded literals and data to get referenced correctly, | ||
| 31 | * the alignment of functions must be preserved when copying. To ensure this, | ||
| 32 | * the source and destination addresses for fncpy() must be aligned to a | ||
| 33 | * multiple of 8 bytes: you will be get a BUG() if this condition is not met. | ||
| 34 | * You will typically need a ".align 3" directive in the assembler where the | ||
| 35 | * function to be copied is defined, and ensure that your allocator for the | ||
| 36 | * destination buffer returns 8-byte-aligned pointers. | ||
| 37 | * | ||
| 38 | * Typical usage example: | ||
| 39 | * | ||
| 40 | * extern int f(args); | ||
| 41 | * extern uint32_t size_of_f; | ||
| 42 | * int (*copied_f)(args); | ||
| 43 | * void *sram_buffer; | ||
| 44 | * | ||
| 45 | * copied_f = fncpy(sram_buffer, &f, size_of_f); | ||
| 46 | * | ||
| 47 | * ... later, call the function: ... | ||
| 48 | * | ||
| 49 | * copied_f(args); | ||
| 50 | * | ||
| 51 | * The size of the function to be copied can't be determined from C: | ||
| 52 | * this must be determined by other means, such as adding assmbler directives | ||
| 53 | * in the file where f is defined. | ||
| 54 | */ | ||
| 55 | |||
| 56 | #ifndef __ASM_FNCPY_H | ||
| 57 | #define __ASM_FNCPY_H | ||
| 58 | |||
| 59 | #include <linux/types.h> | ||
| 60 | #include <linux/string.h> | ||
| 61 | |||
| 62 | #include <asm/bug.h> | ||
| 63 | #include <asm/cacheflush.h> | ||
| 64 | |||
| 65 | /* | ||
| 66 | * Minimum alignment requirement for the source and destination addresses | ||
| 67 | * for function copying. | ||
| 68 | */ | ||
| 69 | #define FNCPY_ALIGN 8 | ||
| 70 | |||
| 71 | #define fncpy(dest_buf, funcp, size) ({ \ | ||
| 72 | uintptr_t __funcp_address; \ | ||
| 73 | typeof(funcp) __result; \ | ||
| 74 | \ | ||
| 75 | asm("" : "=r" (__funcp_address) : "0" (funcp)); \ | ||
| 76 | \ | ||
| 77 | /* \ | ||
| 78 | * Ensure alignment of source and destination addresses, \ | ||
| 79 | * disregarding the function's Thumb bit: \ | ||
| 80 | */ \ | ||
| 81 | BUG_ON((uintptr_t)(dest_buf) & (FNCPY_ALIGN - 1) || \ | ||
| 82 | (__funcp_address & ~(uintptr_t)1 & (FNCPY_ALIGN - 1))); \ | ||
| 83 | \ | ||
| 84 | memcpy(dest_buf, (void const *)(__funcp_address & ~1), size); \ | ||
| 85 | flush_icache_range((unsigned long)(dest_buf), \ | ||
| 86 | (unsigned long)(dest_buf) + (size)); \ | ||
| 87 | \ | ||
| 88 | asm("" : "=r" (__result) \ | ||
| 89 | : "0" ((uintptr_t)(dest_buf) | (__funcp_address & 1))); \ | ||
| 90 | \ | ||
| 91 | __result; \ | ||
| 92 | }) | ||
| 93 | |||
| 94 | #endif /* !__ASM_FNCPY_H */ | ||
diff --git a/arch/arm/include/asm/glue-cache.h b/arch/arm/include/asm/glue-cache.h new file mode 100644 index 000000000000..0591d35001e5 --- /dev/null +++ b/arch/arm/include/asm/glue-cache.h | |||
| @@ -0,0 +1,146 @@ | |||
| 1 | /* | ||
| 2 | * arch/arm/include/asm/glue-cache.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 1999-2002 Russell King | ||
| 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 | #ifndef ASM_GLUE_CACHE_H | ||
| 11 | #define ASM_GLUE_CACHE_H | ||
| 12 | |||
| 13 | #include <asm/glue.h> | ||
| 14 | |||
| 15 | /* | ||
| 16 | * Cache Model | ||
| 17 | * =========== | ||
| 18 | */ | ||
| 19 | #undef _CACHE | ||
| 20 | #undef MULTI_CACHE | ||
| 21 | |||
| 22 | #if defined(CONFIG_CPU_CACHE_V3) | ||
| 23 | # ifdef _CACHE | ||
| 24 | # define MULTI_CACHE 1 | ||
| 25 | # else | ||
| 26 | # define _CACHE v3 | ||
| 27 | # endif | ||
| 28 | #endif | ||
| 29 | |||
| 30 | #if defined(CONFIG_CPU_CACHE_V4) | ||
| 31 | # ifdef _CACHE | ||
| 32 | # define MULTI_CACHE 1 | ||
| 33 | # else | ||
| 34 | # define _CACHE v4 | ||
| 35 | # endif | ||
| 36 | #endif | ||
| 37 | |||
| 38 | #if defined(CONFIG_CPU_ARM920T) || defined(CONFIG_CPU_ARM922T) || \ | ||
| 39 | defined(CONFIG_CPU_ARM925T) || defined(CONFIG_CPU_ARM1020) || \ | ||
| 40 | defined(CONFIG_CPU_ARM1026) | ||
| 41 | # define MULTI_CACHE 1 | ||
| 42 | #endif | ||
| 43 | |||
| 44 | #if defined(CONFIG_CPU_FA526) | ||
| 45 | # ifdef _CACHE | ||
| 46 | # define MULTI_CACHE 1 | ||
| 47 | # else | ||
| 48 | # define _CACHE fa | ||
| 49 | # endif | ||
| 50 | #endif | ||
| 51 | |||
| 52 | #if defined(CONFIG_CPU_ARM926T) | ||
| 53 | # ifdef _CACHE | ||
| 54 | # define MULTI_CACHE 1 | ||
| 55 | # else | ||
| 56 | # define _CACHE arm926 | ||
| 57 | # endif | ||
| 58 | #endif | ||
| 59 | |||
| 60 | #if defined(CONFIG_CPU_ARM940T) | ||
| 61 | # ifdef _CACHE | ||
| 62 | # define MULTI_CACHE 1 | ||
| 63 | # else | ||
| 64 | # define _CACHE arm940 | ||
| 65 | # endif | ||
| 66 | #endif | ||
| 67 | |||
| 68 | #if defined(CONFIG_CPU_ARM946E) | ||
| 69 | # ifdef _CACHE | ||
| 70 | # define MULTI_CACHE 1 | ||
| 71 | # else | ||
| 72 | # define _CACHE arm946 | ||
| 73 | # endif | ||
| 74 | #endif | ||
| 75 | |||
| 76 | #if defined(CONFIG_CPU_CACHE_V4WB) | ||
| 77 | # ifdef _CACHE | ||
| 78 | # define MULTI_CACHE 1 | ||
| 79 | # else | ||
| 80 | # define _CACHE v4wb | ||
| 81 | # endif | ||
| 82 | #endif | ||
| 83 | |||
| 84 | #if defined(CONFIG_CPU_XSCALE) | ||
| 85 | # ifdef _CACHE | ||
| 86 | # define MULTI_CACHE 1 | ||
| 87 | # else | ||
| 88 | # define _CACHE xscale | ||
| 89 | # endif | ||
| 90 | #endif | ||
| 91 | |||
| 92 | #if defined(CONFIG_CPU_XSC3) | ||
| 93 | # ifdef _CACHE | ||
| 94 | # define MULTI_CACHE 1 | ||
| 95 | # else | ||
| 96 | # define _CACHE xsc3 | ||
| 97 | # endif | ||
| 98 | #endif | ||
| 99 | |||
| 100 | #if defined(CONFIG_CPU_MOHAWK) | ||
| 101 | # ifdef _CACHE | ||
| 102 | # define MULTI_CACHE 1 | ||
| 103 | # else | ||
| 104 | # define _CACHE mohawk | ||
| 105 | # endif | ||
| 106 | #endif | ||
| 107 | |||
| 108 | #if defined(CONFIG_CPU_FEROCEON) | ||
| 109 | # define MULTI_CACHE 1 | ||
| 110 | #endif | ||
| 111 | |||
| 112 | #if defined(CONFIG_CPU_V6) | ||
| 113 | //# ifdef _CACHE | ||
| 114 | # define MULTI_CACHE 1 | ||
| 115 | //# else | ||
| 116 | //# define _CACHE v6 | ||
| 117 | //# endif | ||
| 118 | #endif | ||
| 119 | |||
| 120 | #if defined(CONFIG_CPU_V7) | ||
| 121 | //# ifdef _CACHE | ||
| 122 | # define MULTI_CACHE 1 | ||
| 123 | //# else | ||
| 124 | //# define _CACHE v7 | ||
| 125 | //# endif | ||
| 126 | #endif | ||
| 127 | |||
| 128 | #if !defined(_CACHE) && !defined(MULTI_CACHE) | ||
| 129 | #error Unknown cache maintainence model | ||
| 130 | #endif | ||
| 131 | |||
| 132 | #ifndef MULTI_CACHE | ||
| 133 | #define __cpuc_flush_icache_all __glue(_CACHE,_flush_icache_all) | ||
| 134 | #define __cpuc_flush_kern_all __glue(_CACHE,_flush_kern_cache_all) | ||
| 135 | #define __cpuc_flush_user_all __glue(_CACHE,_flush_user_cache_all) | ||
| 136 | #define __cpuc_flush_user_range __glue(_CACHE,_flush_user_cache_range) | ||
| 137 | #define __cpuc_coherent_kern_range __glue(_CACHE,_coherent_kern_range) | ||
| 138 | #define __cpuc_coherent_user_range __glue(_CACHE,_coherent_user_range) | ||
| 139 | #define __cpuc_flush_dcache_area __glue(_CACHE,_flush_kern_dcache_area) | ||
| 140 | |||
| 141 | #define dmac_map_area __glue(_CACHE,_dma_map_area) | ||
| 142 | #define dmac_unmap_area __glue(_CACHE,_dma_unmap_area) | ||
| 143 | #define dmac_flush_range __glue(_CACHE,_dma_flush_range) | ||
| 144 | #endif | ||
| 145 | |||
| 146 | #endif | ||
diff --git a/arch/arm/include/asm/glue-df.h b/arch/arm/include/asm/glue-df.h new file mode 100644 index 000000000000..354d571e8bcc --- /dev/null +++ b/arch/arm/include/asm/glue-df.h | |||
| @@ -0,0 +1,110 @@ | |||
| 1 | /* | ||
| 2 | * arch/arm/include/asm/glue-df.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 1997-1999 Russell King | ||
| 5 | * Copyright (C) 2000-2002 Deep Blue Solutions Ltd. | ||
| 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 | #ifndef ASM_GLUE_DF_H | ||
| 12 | #define ASM_GLUE_DF_H | ||
| 13 | |||
| 14 | #include <asm/glue.h> | ||
| 15 | |||
| 16 | /* | ||
| 17 | * Data Abort Model | ||
| 18 | * ================ | ||
| 19 | * | ||
| 20 | * We have the following to choose from: | ||
| 21 | * arm6 - ARM6 style | ||
| 22 | * arm7 - ARM7 style | ||
| 23 | * v4_early - ARMv4 without Thumb early abort handler | ||
| 24 | * v4t_late - ARMv4 with Thumb late abort handler | ||
| 25 | * v4t_early - ARMv4 with Thumb early abort handler | ||
| 26 | * v5tej_early - ARMv5 with Thumb and Java early abort handler | ||
| 27 | * xscale - ARMv5 with Thumb with Xscale extensions | ||
| 28 | * v6_early - ARMv6 generic early abort handler | ||
| 29 | * v7_early - ARMv7 generic early abort handler | ||
| 30 | */ | ||
| 31 | #undef CPU_DABORT_HANDLER | ||
| 32 | #undef MULTI_DABORT | ||
| 33 | |||
| 34 | #if defined(CONFIG_CPU_ARM610) | ||
| 35 | # ifdef CPU_DABORT_HANDLER | ||
| 36 | # define MULTI_DABORT 1 | ||
| 37 | # else | ||
| 38 | # define CPU_DABORT_HANDLER cpu_arm6_data_abort | ||
| 39 | # endif | ||
| 40 | #endif | ||
| 41 | |||
| 42 | #if defined(CONFIG_CPU_ARM710) | ||
| 43 | # ifdef CPU_DABORT_HANDLER | ||
| 44 | # define MULTI_DABORT 1 | ||
| 45 | # else | ||
| 46 | # define CPU_DABORT_HANDLER cpu_arm7_data_abort | ||
| 47 | # endif | ||
| 48 | #endif | ||
| 49 | |||
| 50 | #ifdef CONFIG_CPU_ABRT_LV4T | ||
| 51 | # ifdef CPU_DABORT_HANDLER | ||
| 52 | # define MULTI_DABORT 1 | ||
| 53 | # else | ||
| 54 | # define CPU_DABORT_HANDLER v4t_late_abort | ||
| 55 | # endif | ||
| 56 | #endif | ||
| 57 | |||
| 58 | #ifdef CONFIG_CPU_ABRT_EV4 | ||
| 59 | # ifdef CPU_DABORT_HANDLER | ||
| 60 | # define MULTI_DABORT 1 | ||
| 61 | # else | ||
| 62 | # define CPU_DABORT_HANDLER v4_early_abort | ||
| 63 | # endif | ||
| 64 | #endif | ||
| 65 | |||
| 66 | #ifdef CONFIG_CPU_ABRT_EV4T | ||
| 67 | # ifdef CPU_DABORT_HANDLER | ||
| 68 | # define MULTI_DABORT 1 | ||
| 69 | # else | ||
| 70 | # define CPU_DABORT_HANDLER v4t_early_abort | ||
| 71 | # endif | ||
| 72 | #endif | ||
| 73 | |||
| 74 | #ifdef CONFIG_CPU_ABRT_EV5TJ | ||
| 75 | # ifdef CPU_DABORT_HANDLER | ||
| 76 | # define MULTI_DABORT 1 | ||
| 77 | # else | ||
| 78 | # define CPU_DABORT_HANDLER v5tj_early_abort | ||
| 79 | # endif | ||
| 80 | #endif | ||
| 81 | |||
| 82 | #ifdef CONFIG_CPU_ABRT_EV5T | ||
| 83 | # ifdef CPU_DABORT_HANDLER | ||
| 84 | # define MULTI_DABORT 1 | ||
| 85 | # else | ||
| 86 | # define CPU_DABORT_HANDLER v5t_early_abort | ||
| 87 | # endif | ||
| 88 | #endif | ||
| 89 | |||
| 90 | #ifdef CONFIG_CPU_ABRT_EV6 | ||
| 91 | # ifdef CPU_DABORT_HANDLER | ||
| 92 | # define MULTI_DABORT 1 | ||
| 93 | # else | ||
| 94 | # define CPU_DABORT_HANDLER v6_early_abort | ||
| 95 | # endif | ||
| 96 | #endif | ||
| 97 | |||
| 98 | #ifdef CONFIG_CPU_ABRT_EV7 | ||
| 99 | # ifdef CPU_DABORT_HANDLER | ||
| 100 | # define MULTI_DABORT 1 | ||
| 101 | # else | ||
| 102 | # define CPU_DABORT_HANDLER v7_early_abort | ||
| 103 | # endif | ||
| 104 | #endif | ||
| 105 | |||
| 106 | #ifndef CPU_DABORT_HANDLER | ||
| 107 | #error Unknown data abort handler type | ||
| 108 | #endif | ||
| 109 | |||
| 110 | #endif | ||
diff --git a/arch/arm/include/asm/glue-pf.h b/arch/arm/include/asm/glue-pf.h new file mode 100644 index 000000000000..d385f37c13f0 --- /dev/null +++ b/arch/arm/include/asm/glue-pf.h | |||
| @@ -0,0 +1,57 @@ | |||
| 1 | /* | ||
| 2 | * arch/arm/include/asm/glue-pf.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 1997-1999 Russell King | ||
| 5 | * Copyright (C) 2000-2002 Deep Blue Solutions Ltd. | ||
| 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 | #ifndef ASM_GLUE_PF_H | ||
| 12 | #define ASM_GLUE_PF_H | ||
| 13 | |||
| 14 | #include <asm/glue.h> | ||
| 15 | |||
| 16 | /* | ||
| 17 | * Prefetch Abort Model | ||
| 18 | * ================ | ||
| 19 | * | ||
| 20 | * We have the following to choose from: | ||
| 21 | * legacy - no IFSR, no IFAR | ||
| 22 | * v6 - ARMv6: IFSR, no IFAR | ||
| 23 | * v7 - ARMv7: IFSR and IFAR | ||
| 24 | */ | ||
| 25 | |||
| 26 | #undef CPU_PABORT_HANDLER | ||
| 27 | #undef MULTI_PABORT | ||
| 28 | |||
| 29 | #ifdef CONFIG_CPU_PABRT_LEGACY | ||
| 30 | # ifdef CPU_PABORT_HANDLER | ||
| 31 | # define MULTI_PABORT 1 | ||
| 32 | # else | ||
| 33 | # define CPU_PABORT_HANDLER legacy_pabort | ||
| 34 | # endif | ||
| 35 | #endif | ||
| 36 | |||
| 37 | #ifdef CONFIG_CPU_PABRT_V6 | ||
| 38 | # ifdef CPU_PABORT_HANDLER | ||
| 39 | # define MULTI_PABORT 1 | ||
| 40 | # else | ||
| 41 | # define CPU_PABORT_HANDLER v6_pabort | ||
| 42 | # endif | ||
| 43 | #endif | ||
| 44 | |||
| 45 | #ifdef CONFIG_CPU_PABRT_V7 | ||
| 46 | # ifdef CPU_PABORT_HANDLER | ||
| 47 | # define MULTI_PABORT 1 | ||
| 48 | # else | ||
| 49 | # define CPU_PABORT_HANDLER v7_pabort | ||
| 50 | # endif | ||
| 51 | #endif | ||
| 52 | |||
| 53 | #ifndef CPU_PABORT_HANDLER | ||
| 54 | #error Unknown prefetch abort handler type | ||
| 55 | #endif | ||
| 56 | |||
| 57 | #endif | ||
diff --git a/arch/arm/include/asm/glue-proc.h b/arch/arm/include/asm/glue-proc.h new file mode 100644 index 000000000000..6469521d092f --- /dev/null +++ b/arch/arm/include/asm/glue-proc.h | |||
| @@ -0,0 +1,264 @@ | |||
| 1 | /* | ||
| 2 | * arch/arm/include/asm/glue-proc.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 1997-1999 Russell King | ||
| 5 | * Copyright (C) 2000 Deep Blue Solutions Ltd | ||
| 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 | #ifndef ASM_GLUE_PROC_H | ||
| 12 | #define ASM_GLUE_PROC_H | ||
| 13 | |||
| 14 | #include <asm/glue.h> | ||
| 15 | |||
| 16 | /* | ||
| 17 | * Work out if we need multiple CPU support | ||
| 18 | */ | ||
| 19 | #undef MULTI_CPU | ||
| 20 | #undef CPU_NAME | ||
| 21 | |||
| 22 | /* | ||
| 23 | * CPU_NAME - the prefix for CPU related functions | ||
| 24 | */ | ||
| 25 | |||
| 26 | #ifdef CONFIG_CPU_ARM610 | ||
| 27 | # ifdef CPU_NAME | ||
| 28 | # undef MULTI_CPU | ||
| 29 | # define MULTI_CPU | ||
| 30 | # else | ||
| 31 | # define CPU_NAME cpu_arm6 | ||
| 32 | # endif | ||
| 33 | #endif | ||
| 34 | |||
| 35 | #ifdef CONFIG_CPU_ARM7TDMI | ||
| 36 | # ifdef CPU_NAME | ||
| 37 | # undef MULTI_CPU | ||
| 38 | # define MULTI_CPU | ||
| 39 | # else | ||
| 40 | # define CPU_NAME cpu_arm7tdmi | ||
| 41 | # endif | ||
| 42 | #endif | ||
| 43 | |||
| 44 | #ifdef CONFIG_CPU_ARM710 | ||
| 45 | # ifdef CPU_NAME | ||
| 46 | # undef MULTI_CPU | ||
| 47 | # define MULTI_CPU | ||
| 48 | # else | ||
| 49 | # define CPU_NAME cpu_arm7 | ||
| 50 | # endif | ||
| 51 | #endif | ||
| 52 | |||
| 53 | #ifdef CONFIG_CPU_ARM720T | ||
| 54 | # ifdef CPU_NAME | ||
| 55 | # undef MULTI_CPU | ||
| 56 | # define MULTI_CPU | ||
| 57 | # else | ||
| 58 | # define CPU_NAME cpu_arm720 | ||
| 59 | # endif | ||
| 60 | #endif | ||
| 61 | |||
| 62 | #ifdef CONFIG_CPU_ARM740T | ||
| 63 | # ifdef CPU_NAME | ||
| 64 | # undef MULTI_CPU | ||
| 65 | # define MULTI_CPU | ||
| 66 | # else | ||
| 67 | # define CPU_NAME cpu_arm740 | ||
| 68 | # endif | ||
| 69 | #endif | ||
| 70 | |||
| 71 | #ifdef CONFIG_CPU_ARM9TDMI | ||
| 72 | # ifdef CPU_NAME | ||
| 73 | # undef MULTI_CPU | ||
| 74 | # define MULTI_CPU | ||
| 75 | # else | ||
| 76 | # define CPU_NAME cpu_arm9tdmi | ||
| 77 | # endif | ||
| 78 | #endif | ||
| 79 | |||
| 80 | #ifdef CONFIG_CPU_ARM920T | ||
| 81 | # ifdef CPU_NAME | ||
| 82 | # undef MULTI_CPU | ||
| 83 | # define MULTI_CPU | ||
| 84 | # else | ||
| 85 | # define CPU_NAME cpu_arm920 | ||
| 86 | # endif | ||
| 87 | #endif | ||
| 88 | |||
| 89 | #ifdef CONFIG_CPU_ARM922T | ||
| 90 | # ifdef CPU_NAME | ||
| 91 | # undef MULTI_CPU | ||
| 92 | # define MULTI_CPU | ||
| 93 | # else | ||
| 94 | # define CPU_NAME cpu_arm922 | ||
| 95 | # endif | ||
| 96 | #endif | ||
| 97 | |||
| 98 | #ifdef CONFIG_CPU_FA526 | ||
| 99 | # ifdef CPU_NAME | ||
| 100 | # undef MULTI_CPU | ||
| 101 | # define MULTI_CPU | ||
| 102 | # else | ||
| 103 | # define CPU_NAME cpu_fa526 | ||
| 104 | # endif | ||
| 105 | #endif | ||
| 106 | |||
| 107 | #ifdef CONFIG_CPU_ARM925T | ||
| 108 | # ifdef CPU_NAME | ||
| 109 | # undef MULTI_CPU | ||
| 110 | # define MULTI_CPU | ||
| 111 | # else | ||
| 112 | # define CPU_NAME cpu_arm925 | ||
| 113 | # endif | ||
| 114 | #endif | ||
| 115 | |||
| 116 | #ifdef CONFIG_CPU_ARM926T | ||
| 117 | # ifdef CPU_NAME | ||
| 118 | # undef MULTI_CPU | ||
| 119 | # define MULTI_CPU | ||
| 120 | # else | ||
| 121 | # define CPU_NAME cpu_arm926 | ||
| 122 | # endif | ||
| 123 | #endif | ||
| 124 | |||
| 125 | #ifdef CONFIG_CPU_ARM940T | ||
| 126 | # ifdef CPU_NAME | ||
| 127 | # undef MULTI_CPU | ||
| 128 | # define MULTI_CPU | ||
| 129 | # else | ||
| 130 | # define CPU_NAME cpu_arm940 | ||
| 131 | # endif | ||
| 132 | #endif | ||
| 133 | |||
| 134 | #ifdef CONFIG_CPU_ARM946E | ||
| 135 | # ifdef CPU_NAME | ||
| 136 | # undef MULTI_CPU | ||
| 137 | # define MULTI_CPU | ||
| 138 | # else | ||
| 139 | # define CPU_NAME cpu_arm946 | ||
| 140 | # endif | ||
| 141 | #endif | ||
| 142 | |||
| 143 | #ifdef CONFIG_CPU_SA110 | ||
| 144 | # ifdef CPU_NAME | ||
| 145 | # undef MULTI_CPU | ||
| 146 | # define MULTI_CPU | ||
| 147 | # else | ||
| 148 | # define CPU_NAME cpu_sa110 | ||
| 149 | # endif | ||
| 150 | #endif | ||
| 151 | |||
| 152 | #ifdef CONFIG_CPU_SA1100 | ||
| 153 | # ifdef CPU_NAME | ||
| 154 | # undef MULTI_CPU | ||
| 155 | # define MULTI_CPU | ||
| 156 | # else | ||
| 157 | # define CPU_NAME cpu_sa1100 | ||
| 158 | # endif | ||
| 159 | #endif | ||
| 160 | |||
| 161 | #ifdef CONFIG_CPU_ARM1020 | ||
| 162 | # ifdef CPU_NAME | ||
| 163 | # undef MULTI_CPU | ||
| 164 | # define MULTI_CPU | ||
| 165 | # else | ||
| 166 | # define CPU_NAME cpu_arm1020 | ||
| 167 | # endif | ||
| 168 | #endif | ||
| 169 | |||
| 170 | #ifdef CONFIG_CPU_ARM1020E | ||
| 171 | # ifdef CPU_NAME | ||
| 172 | # undef MULTI_CPU | ||
| 173 | # define MULTI_CPU | ||
| 174 | # else | ||
| 175 | # define CPU_NAME cpu_arm1020e | ||
| 176 | # endif | ||
| 177 | #endif | ||
| 178 | |||
| 179 | #ifdef CONFIG_CPU_ARM1022 | ||
| 180 | # ifdef CPU_NAME | ||
| 181 | # undef MULTI_CPU | ||
| 182 | # define MULTI_CPU | ||
| 183 | # else | ||
| 184 | # define CPU_NAME cpu_arm1022 | ||
| 185 | # endif | ||
| 186 | #endif | ||
| 187 | |||
| 188 | #ifdef CONFIG_CPU_ARM1026 | ||
| 189 | # ifdef CPU_NAME | ||
| 190 | # undef MULTI_CPU | ||
| 191 | # define MULTI_CPU | ||
| 192 | # else | ||
| 193 | # define CPU_NAME cpu_arm1026 | ||
| 194 | # endif | ||
| 195 | #endif | ||
| 196 | |||
| 197 | #ifdef CONFIG_CPU_XSCALE | ||
| 198 | # ifdef CPU_NAME | ||
| 199 | # undef MULTI_CPU | ||
| 200 | # define MULTI_CPU | ||
| 201 | # else | ||
| 202 | # define CPU_NAME cpu_xscale | ||
| 203 | # endif | ||
| 204 | #endif | ||
| 205 | |||
| 206 | #ifdef CONFIG_CPU_XSC3 | ||
| 207 | # ifdef CPU_NAME | ||
| 208 | # undef MULTI_CPU | ||
| 209 | # define MULTI_CPU | ||
| 210 | # else | ||
| 211 | # define CPU_NAME cpu_xsc3 | ||
| 212 | # endif | ||
| 213 | #endif | ||
| 214 | |||
| 215 | #ifdef CONFIG_CPU_MOHAWK | ||
| 216 | # ifdef CPU_NAME | ||
| 217 | # undef MULTI_CPU | ||
| 218 | # define MULTI_CPU | ||
| 219 | # else | ||
| 220 | # define CPU_NAME cpu_mohawk | ||
| 221 | # endif | ||
| 222 | #endif | ||
| 223 | |||
| 224 | #ifdef CONFIG_CPU_FEROCEON | ||
| 225 | # ifdef CPU_NAME | ||
| 226 | # undef MULTI_CPU | ||
| 227 | # define MULTI_CPU | ||
| 228 | # else | ||
| 229 | # define CPU_NAME cpu_feroceon | ||
| 230 | # endif | ||
| 231 | #endif | ||
| 232 | |||
| 233 | #ifdef CONFIG_CPU_V6 | ||
| 234 | # ifdef CPU_NAME | ||
| 235 | # undef MULTI_CPU | ||
| 236 | # define MULTI_CPU | ||
| 237 | # else | ||
| 238 | # define CPU_NAME cpu_v6 | ||
| 239 | # endif | ||
| 240 | #endif | ||
| 241 | |||
| 242 | #ifdef CONFIG_CPU_V7 | ||
| 243 | # ifdef CPU_NAME | ||
| 244 | # undef MULTI_CPU | ||
| 245 | # define MULTI_CPU | ||
| 246 | # else | ||
| 247 | # define CPU_NAME cpu_v7 | ||
| 248 | # endif | ||
| 249 | #endif | ||
| 250 | |||
| 251 | #ifndef MULTI_CPU | ||
| 252 | #define cpu_proc_init __glue(CPU_NAME,_proc_init) | ||
| 253 | #define cpu_proc_fin __glue(CPU_NAME,_proc_fin) | ||
| 254 | #define cpu_reset __glue(CPU_NAME,_reset) | ||
| 255 | #define cpu_do_idle __glue(CPU_NAME,_do_idle) | ||
| 256 | #define cpu_dcache_clean_area __glue(CPU_NAME,_dcache_clean_area) | ||
| 257 | #define cpu_do_switch_mm __glue(CPU_NAME,_switch_mm) | ||
| 258 | #define cpu_set_pte_ext __glue(CPU_NAME,_set_pte_ext) | ||
| 259 | #define cpu_suspend_size __glue(CPU_NAME,_suspend_size) | ||
| 260 | #define cpu_do_suspend __glue(CPU_NAME,_do_suspend) | ||
| 261 | #define cpu_do_resume __glue(CPU_NAME,_do_resume) | ||
| 262 | #endif | ||
| 263 | |||
| 264 | #endif | ||
diff --git a/arch/arm/include/asm/glue.h b/arch/arm/include/asm/glue.h index 234a3fc1c78e..0ec35d1698aa 100644 --- a/arch/arm/include/asm/glue.h +++ b/arch/arm/include/asm/glue.h | |||
| @@ -15,7 +15,6 @@ | |||
| 15 | */ | 15 | */ |
| 16 | #ifdef __KERNEL__ | 16 | #ifdef __KERNEL__ |
| 17 | 17 | ||
| 18 | |||
| 19 | #ifdef __STDC__ | 18 | #ifdef __STDC__ |
| 20 | #define ____glue(name,fn) name##fn | 19 | #define ____glue(name,fn) name##fn |
| 21 | #else | 20 | #else |
| @@ -23,141 +22,4 @@ | |||
| 23 | #endif | 22 | #endif |
| 24 | #define __glue(name,fn) ____glue(name,fn) | 23 | #define __glue(name,fn) ____glue(name,fn) |
| 25 | 24 | ||
| 26 | |||
| 27 | |||
| 28 | /* | ||
| 29 | * Data Abort Model | ||
| 30 | * ================ | ||
| 31 | * | ||
| 32 | * We have the following to choose from: | ||
| 33 | * arm6 - ARM6 style | ||
| 34 | * arm7 - ARM7 style | ||
| 35 | * v4_early - ARMv4 without Thumb early abort handler | ||
| 36 | * v4t_late - ARMv4 with Thumb late abort handler | ||
| 37 | * v4t_early - ARMv4 with Thumb early abort handler | ||
| 38 | * v5tej_early - ARMv5 with Thumb and Java early abort handler | ||
| 39 | * xscale - ARMv5 with Thumb with Xscale extensions | ||
| 40 | * v6_early - ARMv6 generic early abort handler | ||
| 41 | * v7_early - ARMv7 generic early abort handler | ||
| 42 | */ | ||
| 43 | #undef CPU_DABORT_HANDLER | ||
| 44 | #undef MULTI_DABORT | ||
| 45 | |||
| 46 | #if defined(CONFIG_CPU_ARM610) | ||
| 47 | # ifdef CPU_DABORT_HANDLER | ||
| 48 | # define MULTI_DABORT 1 | ||
| 49 | # else | ||
| 50 | # define CPU_DABORT_HANDLER cpu_arm6_data_abort | ||
| 51 | # endif | ||
| 52 | #endif | ||
| 53 | |||
| 54 | #if defined(CONFIG_CPU_ARM710) | ||
| 55 | # ifdef CPU_DABORT_HANDLER | ||
| 56 | # define MULTI_DABORT 1 | ||
| 57 | # else | ||
| 58 | # define CPU_DABORT_HANDLER cpu_arm7_data_abort | ||
| 59 | # endif | ||
| 60 | #endif | ||
| 61 | |||
| 62 | #ifdef CONFIG_CPU_ABRT_LV4T | ||
| 63 | # ifdef CPU_DABORT_HANDLER | ||
| 64 | # define MULTI_DABORT 1 | ||
| 65 | # else | ||
| 66 | # define CPU_DABORT_HANDLER v4t_late_abort | ||
| 67 | # endif | ||
| 68 | #endif | ||
| 69 | |||
| 70 | #ifdef CONFIG_CPU_ABRT_EV4 | ||
| 71 | # ifdef CPU_DABORT_HANDLER | ||
| 72 | # define MULTI_DABORT 1 | ||
| 73 | # else | ||
| 74 | # define CPU_DABORT_HANDLER v4_early_abort | ||
| 75 | # endif | ||
| 76 | #endif | ||
| 77 | |||
| 78 | #ifdef CONFIG_CPU_ABRT_EV4T | ||
| 79 | # ifdef CPU_DABORT_HANDLER | ||
| 80 | # define MULTI_DABORT 1 | ||
| 81 | # else | ||
| 82 | # define CPU_DABORT_HANDLER v4t_early_abort | ||
| 83 | # endif | ||
| 84 | #endif | ||
| 85 | |||
| 86 | #ifdef CONFIG_CPU_ABRT_EV5TJ | ||
| 87 | # ifdef CPU_DABORT_HANDLER | ||
| 88 | # define MULTI_DABORT 1 | ||
| 89 | # else | ||
| 90 | # define CPU_DABORT_HANDLER v5tj_early_abort | ||
| 91 | # endif | ||
| 92 | #endif | ||
| 93 | |||
| 94 | #ifdef CONFIG_CPU_ABRT_EV5T | ||
| 95 | # ifdef CPU_DABORT_HANDLER | ||
| 96 | # define MULTI_DABORT 1 | ||
| 97 | # else | ||
| 98 | # define CPU_DABORT_HANDLER v5t_early_abort | ||
| 99 | # endif | ||
| 100 | #endif | ||
| 101 | |||
| 102 | #ifdef CONFIG_CPU_ABRT_EV6 | ||
| 103 | # ifdef CPU_DABORT_HANDLER | ||
| 104 | # define MULTI_DABORT 1 | ||
| 105 | # else | ||
| 106 | # define CPU_DABORT_HANDLER v6_early_abort | ||
| 107 | # endif | ||
| 108 | #endif | ||
| 109 | |||
| 110 | #ifdef CONFIG_CPU_ABRT_EV7 | ||
| 111 | # ifdef CPU_DABORT_HANDLER | ||
| 112 | # define MULTI_DABORT 1 | ||
| 113 | # else | ||
| 114 | # define CPU_DABORT_HANDLER v7_early_abort | ||
| 115 | # endif | ||
| 116 | #endif | ||
| 117 | |||
| 118 | #ifndef CPU_DABORT_HANDLER | ||
| 119 | #error Unknown data abort handler type | ||
| 120 | #endif | ||
| 121 | |||
| 122 | /* | ||
| 123 | * Prefetch Abort Model | ||
| 124 | * ================ | ||
| 125 | * | ||
| 126 | * We have the following to choose from: | ||
| 127 | * legacy - no IFSR, no IFAR | ||
| 128 | * v6 - ARMv6: IFSR, no IFAR | ||
| 129 | * v7 - ARMv7: IFSR and IFAR | ||
| 130 | */ | ||
| 131 | |||
| 132 | #undef CPU_PABORT_HANDLER | ||
| 133 | #undef MULTI_PABORT | ||
| 134 | |||
| 135 | #ifdef CONFIG_CPU_PABRT_LEGACY | ||
| 136 | # ifdef CPU_PABORT_HANDLER | ||
| 137 | # define MULTI_PABORT 1 | ||
| 138 | # else | ||
| 139 | # define CPU_PABORT_HANDLER legacy_pabort | ||
| 140 | # endif | ||
| 141 | #endif | ||
| 142 | |||
| 143 | #ifdef CONFIG_CPU_PABRT_V6 | ||
| 144 | # ifdef CPU_PABORT_HANDLER | ||
| 145 | # define MULTI_PABORT 1 | ||
| 146 | # else | ||
| 147 | # define CPU_PABORT_HANDLER v6_pabort | ||
| 148 | # endif | ||
| 149 | #endif | ||
| 150 | |||
| 151 | #ifdef CONFIG_CPU_PABRT_V7 | ||
| 152 | # ifdef CPU_PABORT_HANDLER | ||
| 153 | # define MULTI_PABORT 1 | ||
| 154 | # else | ||
| 155 | # define CPU_PABORT_HANDLER v7_pabort | ||
| 156 | # endif | ||
| 157 | #endif | ||
| 158 | |||
| 159 | #ifndef CPU_PABORT_HANDLER | ||
| 160 | #error Unknown prefetch abort handler type | ||
| 161 | #endif | ||
| 162 | |||
| 163 | #endif | 25 | #endif |
diff --git a/arch/arm/include/asm/hardware/cache-l2x0.h b/arch/arm/include/asm/hardware/cache-l2x0.h index 5aeec1e1735c..16bd48031583 100644 --- a/arch/arm/include/asm/hardware/cache-l2x0.h +++ b/arch/arm/include/asm/hardware/cache-l2x0.h | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #define L2X0_RAW_INTR_STAT 0x21C | 36 | #define L2X0_RAW_INTR_STAT 0x21C |
| 37 | #define L2X0_INTR_CLEAR 0x220 | 37 | #define L2X0_INTR_CLEAR 0x220 |
| 38 | #define L2X0_CACHE_SYNC 0x730 | 38 | #define L2X0_CACHE_SYNC 0x730 |
| 39 | #define L2X0_DUMMY_REG 0x740 | ||
| 39 | #define L2X0_INV_LINE_PA 0x770 | 40 | #define L2X0_INV_LINE_PA 0x770 |
| 40 | #define L2X0_INV_WAY 0x77C | 41 | #define L2X0_INV_WAY 0x77C |
| 41 | #define L2X0_CLEAN_LINE_PA 0x7B0 | 42 | #define L2X0_CLEAN_LINE_PA 0x7B0 |
diff --git a/arch/arm/include/asm/hardware/sp810.h b/arch/arm/include/asm/hardware/sp810.h index 721847dc68ab..e0d1c0cfa548 100644 --- a/arch/arm/include/asm/hardware/sp810.h +++ b/arch/arm/include/asm/hardware/sp810.h | |||
| @@ -58,6 +58,9 @@ | |||
| 58 | 58 | ||
| 59 | static inline void sysctl_soft_reset(void __iomem *base) | 59 | static inline void sysctl_soft_reset(void __iomem *base) |
| 60 | { | 60 | { |
| 61 | /* switch to slow mode */ | ||
| 62 | writel(0x2, base + SCCTRL); | ||
| 63 | |||
| 61 | /* writing any value to SCSYSSTAT reg will reset system */ | 64 | /* writing any value to SCSYSSTAT reg will reset system */ |
| 62 | writel(0, base + SCSYSSTAT); | 65 | writel(0, base + SCSYSSTAT); |
| 63 | } | 66 | } |
diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h index 3a0893a76a3b..bf13b814c1b8 100644 --- a/arch/arm/include/asm/mach/arch.h +++ b/arch/arm/include/asm/mach/arch.h | |||
| @@ -15,10 +15,6 @@ struct meminfo; | |||
| 15 | struct sys_timer; | 15 | struct sys_timer; |
| 16 | 16 | ||
| 17 | struct machine_desc { | 17 | struct machine_desc { |
| 18 | /* | ||
| 19 | * Note! The first two elements are used | ||
| 20 | * by assembler code in head.S, head-common.S | ||
| 21 | */ | ||
| 22 | unsigned int nr; /* architecture number */ | 18 | unsigned int nr; /* architecture number */ |
| 23 | const char *name; /* architecture name */ | 19 | const char *name; /* architecture name */ |
| 24 | unsigned long boot_params; /* tagged list */ | 20 | unsigned long boot_params; /* tagged list */ |
diff --git a/arch/arm/include/asm/pgalloc.h b/arch/arm/include/asm/pgalloc.h index 9763be04f77e..22de005f159c 100644 --- a/arch/arm/include/asm/pgalloc.h +++ b/arch/arm/include/asm/pgalloc.h | |||
| @@ -10,6 +10,8 @@ | |||
| 10 | #ifndef _ASMARM_PGALLOC_H | 10 | #ifndef _ASMARM_PGALLOC_H |
| 11 | #define _ASMARM_PGALLOC_H | 11 | #define _ASMARM_PGALLOC_H |
| 12 | 12 | ||
| 13 | #include <linux/pagemap.h> | ||
| 14 | |||
| 13 | #include <asm/domain.h> | 15 | #include <asm/domain.h> |
| 14 | #include <asm/pgtable-hwdef.h> | 16 | #include <asm/pgtable-hwdef.h> |
| 15 | #include <asm/processor.h> | 17 | #include <asm/processor.h> |
diff --git a/arch/arm/include/asm/proc-fns.h b/arch/arm/include/asm/proc-fns.h index 8fdae9bc9abb..8ec535e11fd7 100644 --- a/arch/arm/include/asm/proc-fns.h +++ b/arch/arm/include/asm/proc-fns.h | |||
| @@ -13,250 +13,86 @@ | |||
| 13 | 13 | ||
| 14 | #ifdef __KERNEL__ | 14 | #ifdef __KERNEL__ |
| 15 | 15 | ||
| 16 | #include <asm/glue-proc.h> | ||
| 17 | #include <asm/page.h> | ||
| 16 | 18 | ||
| 17 | /* | 19 | #ifndef __ASSEMBLY__ |
| 18 | * Work out if we need multiple CPU support | 20 | |
| 19 | */ | 21 | struct mm_struct; |
| 20 | #undef MULTI_CPU | ||
| 21 | #undef CPU_NAME | ||
| 22 | 22 | ||
| 23 | /* | 23 | /* |
| 24 | * CPU_NAME - the prefix for CPU related functions | 24 | * Don't change this structure - ASM code relies on it. |
| 25 | */ | 25 | */ |
| 26 | 26 | extern struct processor { | |
| 27 | #ifdef CONFIG_CPU_ARM610 | 27 | /* MISC |
| 28 | # ifdef CPU_NAME | 28 | * get data abort address/flags |
| 29 | # undef MULTI_CPU | 29 | */ |
| 30 | # define MULTI_CPU | 30 | void (*_data_abort)(unsigned long pc); |
| 31 | # else | 31 | /* |
| 32 | # define CPU_NAME cpu_arm6 | 32 | * Retrieve prefetch fault address |
| 33 | # endif | 33 | */ |
| 34 | #endif | 34 | unsigned long (*_prefetch_abort)(unsigned long lr); |
| 35 | 35 | /* | |
| 36 | #ifdef CONFIG_CPU_ARM7TDMI | 36 | * Set up any processor specifics |
| 37 | # ifdef CPU_NAME | 37 | */ |
| 38 | # undef MULTI_CPU | 38 | void (*_proc_init)(void); |
| 39 | # define MULTI_CPU | 39 | /* |
| 40 | # else | 40 | * Disable any processor specifics |
| 41 | # define CPU_NAME cpu_arm7tdmi | 41 | */ |
| 42 | # endif | 42 | void (*_proc_fin)(void); |
| 43 | #endif | 43 | /* |
| 44 | 44 | * Special stuff for a reset | |
| 45 | #ifdef CONFIG_CPU_ARM710 | 45 | */ |
| 46 | # ifdef CPU_NAME | 46 | void (*reset)(unsigned long addr) __attribute__((noreturn)); |
| 47 | # undef MULTI_CPU | 47 | /* |
| 48 | # define MULTI_CPU | 48 | * Idle the processor |
| 49 | # else | 49 | */ |
| 50 | # define CPU_NAME cpu_arm7 | 50 | int (*_do_idle)(void); |
| 51 | # endif | 51 | /* |
| 52 | #endif | 52 | * Processor architecture specific |
| 53 | 53 | */ | |
| 54 | #ifdef CONFIG_CPU_ARM720T | 54 | /* |
| 55 | # ifdef CPU_NAME | 55 | * clean a virtual address range from the |
| 56 | # undef MULTI_CPU | 56 | * D-cache without flushing the cache. |
| 57 | # define MULTI_CPU | 57 | */ |
| 58 | # else | 58 | void (*dcache_clean_area)(void *addr, int size); |
| 59 | # define CPU_NAME cpu_arm720 | 59 | |
| 60 | # endif | 60 | /* |
| 61 | #endif | 61 | * Set the page table |
| 62 | 62 | */ | |
| 63 | #ifdef CONFIG_CPU_ARM740T | 63 | void (*switch_mm)(unsigned long pgd_phys, struct mm_struct *mm); |
| 64 | # ifdef CPU_NAME | 64 | /* |
| 65 | # undef MULTI_CPU | 65 | * Set a possibly extended PTE. Non-extended PTEs should |
| 66 | # define MULTI_CPU | 66 | * ignore 'ext'. |
| 67 | # else | 67 | */ |
| 68 | # define CPU_NAME cpu_arm740 | 68 | void (*set_pte_ext)(pte_t *ptep, pte_t pte, unsigned int ext); |
| 69 | # endif | 69 | |
| 70 | #endif | 70 | /* Suspend/resume */ |
| 71 | 71 | unsigned int suspend_size; | |
| 72 | #ifdef CONFIG_CPU_ARM9TDMI | 72 | void (*do_suspend)(void *); |
| 73 | # ifdef CPU_NAME | 73 | void (*do_resume)(void *); |
| 74 | # undef MULTI_CPU | 74 | } processor; |
| 75 | # define MULTI_CPU | ||
| 76 | # else | ||
| 77 | # define CPU_NAME cpu_arm9tdmi | ||
| 78 | # endif | ||
| 79 | #endif | ||
| 80 | |||
| 81 | #ifdef CONFIG_CPU_ARM920T | ||
| 82 | # ifdef CPU_NAME | ||
| 83 | # undef MULTI_CPU | ||
| 84 | # define MULTI_CPU | ||
| 85 | # else | ||
| 86 | # define CPU_NAME cpu_arm920 | ||
| 87 | # endif | ||
| 88 | #endif | ||
| 89 | |||
| 90 | #ifdef CONFIG_CPU_ARM922T | ||
| 91 | # ifdef CPU_NAME | ||
| 92 | # undef MULTI_CPU | ||
| 93 | # define MULTI_CPU | ||
| 94 | # else | ||
| 95 | # define CPU_NAME cpu_arm922 | ||
| 96 | # endif | ||
| 97 | #endif | ||
| 98 | |||
| 99 | #ifdef CONFIG_CPU_FA526 | ||
| 100 | # ifdef CPU_NAME | ||
| 101 | # undef MULTI_CPU | ||
| 102 | # define MULTI_CPU | ||
| 103 | # else | ||
| 104 | # define CPU_NAME cpu_fa526 | ||
| 105 | # endif | ||
| 106 | #endif | ||
| 107 | |||
| 108 | #ifdef CONFIG_CPU_ARM925T | ||
| 109 | # ifdef CPU_NAME | ||
| 110 | # undef MULTI_CPU | ||
| 111 | # define MULTI_CPU | ||
| 112 | # else | ||
| 113 | # define CPU_NAME cpu_arm925 | ||
| 114 | # endif | ||
| 115 | #endif | ||
| 116 | |||
| 117 | #ifdef CONFIG_CPU_ARM926T | ||
| 118 | # ifdef CPU_NAME | ||
| 119 | # undef MULTI_CPU | ||
| 120 | # define MULTI_CPU | ||
| 121 | # else | ||
| 122 | # define CPU_NAME cpu_arm926 | ||
| 123 | # endif | ||
| 124 | #endif | ||
| 125 | |||
| 126 | #ifdef CONFIG_CPU_ARM940T | ||
| 127 | # ifdef CPU_NAME | ||
| 128 | # undef MULTI_CPU | ||
| 129 | # define MULTI_CPU | ||
| 130 | # else | ||
| 131 | # define CPU_NAME cpu_arm940 | ||
| 132 | # endif | ||
| 133 | #endif | ||
| 134 | |||
| 135 | #ifdef CONFIG_CPU_ARM946E | ||
| 136 | # ifdef CPU_NAME | ||
| 137 | # undef MULTI_CPU | ||
| 138 | # define MULTI_CPU | ||
| 139 | # else | ||
| 140 | # define CPU_NAME cpu_arm946 | ||
| 141 | # endif | ||
| 142 | #endif | ||
| 143 | |||
| 144 | #ifdef CONFIG_CPU_SA110 | ||
| 145 | # ifdef CPU_NAME | ||
| 146 | # undef MULTI_CPU | ||
| 147 | # define MULTI_CPU | ||
| 148 | # else | ||
| 149 | # define CPU_NAME cpu_sa110 | ||
| 150 | # endif | ||
| 151 | #endif | ||
| 152 | |||
| 153 | #ifdef CONFIG_CPU_SA1100 | ||
| 154 | # ifdef CPU_NAME | ||
| 155 | # undef MULTI_CPU | ||
| 156 | # define MULTI_CPU | ||
| 157 | # else | ||
| 158 | # define CPU_NAME cpu_sa1100 | ||
| 159 | # endif | ||
| 160 | #endif | ||
| 161 | |||
| 162 | #ifdef CONFIG_CPU_ARM1020 | ||
| 163 | # ifdef CPU_NAME | ||
| 164 | # undef MULTI_CPU | ||
| 165 | # define MULTI_CPU | ||
| 166 | # else | ||
| 167 | # define CPU_NAME cpu_arm1020 | ||
| 168 | # endif | ||
| 169 | #endif | ||
| 170 | |||
| 171 | #ifdef CONFIG_CPU_ARM1020E | ||
| 172 | # ifdef CPU_NAME | ||
| 173 | # undef MULTI_CPU | ||
| 174 | # define MULTI_CPU | ||
| 175 | # else | ||
| 176 | # define CPU_NAME cpu_arm1020e | ||
| 177 | # endif | ||
| 178 | #endif | ||
| 179 | |||
| 180 | #ifdef CONFIG_CPU_ARM1022 | ||
| 181 | # ifdef CPU_NAME | ||
| 182 | # undef MULTI_CPU | ||
| 183 | # define MULTI_CPU | ||
| 184 | # else | ||
| 185 | # define CPU_NAME cpu_arm1022 | ||
| 186 | # endif | ||
| 187 | #endif | ||
| 188 | |||
| 189 | #ifdef CONFIG_CPU_ARM1026 | ||
| 190 | # ifdef CPU_NAME | ||
| 191 | # undef MULTI_CPU | ||
| 192 | # define MULTI_CPU | ||
| 193 | # else | ||
| 194 | # define CPU_NAME cpu_arm1026 | ||
| 195 | # endif | ||
| 196 | #endif | ||
| 197 | |||
| 198 | #ifdef CONFIG_CPU_XSCALE | ||
| 199 | # ifdef CPU_NAME | ||
| 200 | # undef MULTI_CPU | ||
| 201 | # define MULTI_CPU | ||
| 202 | # else | ||
| 203 | # define CPU_NAME cpu_xscale | ||
| 204 | # endif | ||
| 205 | #endif | ||
| 206 | |||
| 207 | #ifdef CONFIG_CPU_XSC3 | ||
| 208 | # ifdef CPU_NAME | ||
| 209 | # undef MULTI_CPU | ||
| 210 | # define MULTI_CPU | ||
| 211 | # else | ||
| 212 | # define CPU_NAME cpu_xsc3 | ||
| 213 | # endif | ||
| 214 | #endif | ||
| 215 | |||
| 216 | #ifdef CONFIG_CPU_MOHAWK | ||
| 217 | # ifdef CPU_NAME | ||
| 218 | # undef MULTI_CPU | ||
| 219 | # define MULTI_CPU | ||
| 220 | # else | ||
| 221 | # define CPU_NAME cpu_mohawk | ||
| 222 | # endif | ||
| 223 | #endif | ||
| 224 | |||
| 225 | #ifdef CONFIG_CPU_FEROCEON | ||
| 226 | # ifdef CPU_NAME | ||
| 227 | # undef MULTI_CPU | ||
| 228 | # define MULTI_CPU | ||
| 229 | # else | ||
| 230 | # define CPU_NAME cpu_feroceon | ||
| 231 | # endif | ||
| 232 | #endif | ||
| 233 | |||
| 234 | #ifdef CONFIG_CPU_V6 | ||
| 235 | # ifdef CPU_NAME | ||
| 236 | # undef MULTI_CPU | ||
| 237 | # define MULTI_CPU | ||
| 238 | # else | ||
| 239 | # define CPU_NAME cpu_v6 | ||
| 240 | # endif | ||
| 241 | #endif | ||
| 242 | |||
| 243 | #ifdef CONFIG_CPU_V7 | ||
| 244 | # ifdef CPU_NAME | ||
| 245 | # undef MULTI_CPU | ||
| 246 | # define MULTI_CPU | ||
| 247 | # else | ||
| 248 | # define CPU_NAME cpu_v7 | ||
| 249 | # endif | ||
| 250 | #endif | ||
| 251 | |||
| 252 | #ifndef __ASSEMBLY__ | ||
| 253 | 75 | ||
| 254 | #ifndef MULTI_CPU | 76 | #ifndef MULTI_CPU |
| 255 | #include <asm/cpu-single.h> | 77 | extern void cpu_proc_init(void); |
| 78 | extern void cpu_proc_fin(void); | ||
| 79 | extern int cpu_do_idle(void); | ||
| 80 | extern void cpu_dcache_clean_area(void *, int); | ||
| 81 | extern void cpu_do_switch_mm(unsigned long pgd_phys, struct mm_struct *mm); | ||
| 82 | extern void cpu_set_pte_ext(pte_t *ptep, pte_t pte, unsigned int ext); | ||
| 83 | extern void cpu_reset(unsigned long addr) __attribute__((noreturn)); | ||
| 256 | #else | 84 | #else |
| 257 | #include <asm/cpu-multi32.h> | 85 | #define cpu_proc_init() processor._proc_init() |
| 86 | #define cpu_proc_fin() processor._proc_fin() | ||
| 87 | #define cpu_reset(addr) processor.reset(addr) | ||
| 88 | #define cpu_do_idle() processor._do_idle() | ||
| 89 | #define cpu_dcache_clean_area(addr,sz) processor.dcache_clean_area(addr,sz) | ||
| 90 | #define cpu_set_pte_ext(ptep,pte,ext) processor.set_pte_ext(ptep,pte,ext) | ||
| 91 | #define cpu_do_switch_mm(pgd,mm) processor.switch_mm(pgd,mm) | ||
| 258 | #endif | 92 | #endif |
| 259 | 93 | ||
| 94 | extern void cpu_resume(void); | ||
| 95 | |||
| 260 | #include <asm/memory.h> | 96 | #include <asm/memory.h> |
| 261 | 97 | ||
| 262 | #ifdef CONFIG_MMU | 98 | #ifdef CONFIG_MMU |
diff --git a/arch/arm/include/asm/processor.h b/arch/arm/include/asm/processor.h index b439b41aeac1..b2d9df5667af 100644 --- a/arch/arm/include/asm/processor.h +++ b/arch/arm/include/asm/processor.h | |||
| @@ -83,7 +83,7 @@ extern void release_thread(struct task_struct *); | |||
| 83 | 83 | ||
| 84 | unsigned long get_wchan(struct task_struct *p); | 84 | unsigned long get_wchan(struct task_struct *p); |
| 85 | 85 | ||
| 86 | #if __LINUX_ARM_ARCH__ == 6 | 86 | #if __LINUX_ARM_ARCH__ == 6 || defined(CONFIG_ARM_ERRATA_754327) |
| 87 | #define cpu_relax() smp_mb() | 87 | #define cpu_relax() smp_mb() |
| 88 | #else | 88 | #else |
| 89 | #define cpu_relax() barrier() | 89 | #define cpu_relax() barrier() |
diff --git a/arch/arm/include/asm/smp_scu.h b/arch/arm/include/asm/smp_scu.h index 2376835015d6..4eb6d005ffaa 100644 --- a/arch/arm/include/asm/smp_scu.h +++ b/arch/arm/include/asm/smp_scu.h | |||
| @@ -1,7 +1,14 @@ | |||
| 1 | #ifndef __ASMARM_ARCH_SCU_H | 1 | #ifndef __ASMARM_ARCH_SCU_H |
| 2 | #define __ASMARM_ARCH_SCU_H | 2 | #define __ASMARM_ARCH_SCU_H |
| 3 | 3 | ||
| 4 | #define SCU_PM_NORMAL 0 | ||
| 5 | #define SCU_PM_DORMANT 2 | ||
| 6 | #define SCU_PM_POWEROFF 3 | ||
| 7 | |||
| 8 | #ifndef __ASSEMBLER__ | ||
| 4 | unsigned int scu_get_core_count(void __iomem *); | 9 | unsigned int scu_get_core_count(void __iomem *); |
| 5 | void scu_enable(void __iomem *); | 10 | void scu_enable(void __iomem *); |
| 11 | int scu_power_mode(void __iomem *, unsigned int); | ||
| 12 | #endif | ||
| 6 | 13 | ||
| 7 | #endif | 14 | #endif |
diff --git a/arch/arm/include/asm/tlb.h b/arch/arm/include/asm/tlb.h index f41a6f57cd12..82dfe5d0c41e 100644 --- a/arch/arm/include/asm/tlb.h +++ b/arch/arm/include/asm/tlb.h | |||
| @@ -18,16 +18,34 @@ | |||
| 18 | #define __ASMARM_TLB_H | 18 | #define __ASMARM_TLB_H |
| 19 | 19 | ||
| 20 | #include <asm/cacheflush.h> | 20 | #include <asm/cacheflush.h> |
| 21 | #include <asm/tlbflush.h> | ||
| 22 | 21 | ||
| 23 | #ifndef CONFIG_MMU | 22 | #ifndef CONFIG_MMU |
| 24 | 23 | ||
| 25 | #include <linux/pagemap.h> | 24 | #include <linux/pagemap.h> |
| 25 | |||
| 26 | #define tlb_flush(tlb) ((void) tlb) | ||
| 27 | |||
| 26 | #include <asm-generic/tlb.h> | 28 | #include <asm-generic/tlb.h> |
| 27 | 29 | ||
| 28 | #else /* !CONFIG_MMU */ | 30 | #else /* !CONFIG_MMU */ |
| 29 | 31 | ||
| 32 | #include <linux/swap.h> | ||
| 30 | #include <asm/pgalloc.h> | 33 | #include <asm/pgalloc.h> |
| 34 | #include <asm/tlbflush.h> | ||
| 35 | |||
| 36 | /* | ||
| 37 | * We need to delay page freeing for SMP as other CPUs can access pages | ||
| 38 | * which have been removed but not yet had their TLB entries invalidated. | ||
| 39 | * Also, as ARMv7 speculative prefetch can drag new entries into the TLB, | ||
| 40 | * we need to apply this same delaying tactic to ensure correct operation. | ||
| 41 | */ | ||
| 42 | #if defined(CONFIG_SMP) || defined(CONFIG_CPU_32v7) | ||
| 43 | #define tlb_fast_mode(tlb) 0 | ||
| 44 | #define FREE_PTE_NR 500 | ||
| 45 | #else | ||
| 46 | #define tlb_fast_mode(tlb) 1 | ||
| 47 | #define FREE_PTE_NR 0 | ||
| 48 | #endif | ||
| 31 | 49 | ||
| 32 | /* | 50 | /* |
| 33 | * TLB handling. This allows us to remove pages from the page | 51 | * TLB handling. This allows us to remove pages from the page |
| @@ -36,12 +54,58 @@ | |||
| 36 | struct mmu_gather { | 54 | struct mmu_gather { |
| 37 | struct mm_struct *mm; | 55 | struct mm_struct *mm; |
| 38 | unsigned int fullmm; | 56 | unsigned int fullmm; |
| 57 | struct vm_area_struct *vma; | ||
| 39 | unsigned long range_start; | 58 | unsigned long range_start; |
| 40 | unsigned long range_end; | 59 | unsigned long range_end; |
| 60 | unsigned int nr; | ||
| 61 | struct page *pages[FREE_PTE_NR]; | ||
| 41 | }; | 62 | }; |
| 42 | 63 | ||
| 43 | DECLARE_PER_CPU(struct mmu_gather, mmu_gathers); | 64 | DECLARE_PER_CPU(struct mmu_gather, mmu_gathers); |
| 44 | 65 | ||
| 66 | /* | ||
| 67 | * This is unnecessarily complex. There's three ways the TLB shootdown | ||
| 68 | * code is used: | ||
| 69 | * 1. Unmapping a range of vmas. See zap_page_range(), unmap_region(). | ||
| 70 | * tlb->fullmm = 0, and tlb_start_vma/tlb_end_vma will be called. | ||
| 71 | * tlb->vma will be non-NULL. | ||
| 72 | * 2. Unmapping all vmas. See exit_mmap(). | ||
| 73 | * tlb->fullmm = 1, and tlb_start_vma/tlb_end_vma will be called. | ||
| 74 | * tlb->vma will be non-NULL. Additionally, page tables will be freed. | ||
| 75 | * 3. Unmapping argument pages. See shift_arg_pages(). | ||
| 76 | * tlb->fullmm = 0, but tlb_start_vma/tlb_end_vma will not be called. | ||
| 77 | * tlb->vma will be NULL. | ||
| 78 | */ | ||
| 79 | static inline void tlb_flush(struct mmu_gather *tlb) | ||
| 80 | { | ||
| 81 | if (tlb->fullmm || !tlb->vma) | ||
| 82 | flush_tlb_mm(tlb->mm); | ||
| 83 | else if (tlb->range_end > 0) { | ||
| 84 | flush_tlb_range(tlb->vma, tlb->range_start, tlb->range_end); | ||
| 85 | tlb->range_start = TASK_SIZE; | ||
| 86 | tlb->range_end = 0; | ||
| 87 | } | ||
| 88 | } | ||
| 89 | |||
| 90 | static inline void tlb_add_flush(struct mmu_gather *tlb, unsigned long addr) | ||
| 91 | { | ||
| 92 | if (!tlb->fullmm) { | ||
| 93 | if (addr < tlb->range_start) | ||
| 94 | tlb->range_start = addr; | ||
| 95 | if (addr + PAGE_SIZE > tlb->range_end) | ||
| 96 | tlb->range_end = addr + PAGE_SIZE; | ||
| 97 | } | ||
| 98 | } | ||
| 99 | |||
| 100 | static inline void tlb_flush_mmu(struct mmu_gather *tlb) | ||
| 101 | { | ||
| 102 | tlb_flush(tlb); | ||
| 103 | if (!tlb_fast_mode(tlb)) { | ||
| 104 | free_pages_and_swap_cache(tlb->pages, tlb->nr); | ||
| 105 | tlb->nr = 0; | ||
| 106 | } | ||
| 107 | } | ||
| 108 | |||
| 45 | static inline struct mmu_gather * | 109 | static inline struct mmu_gather * |
| 46 | tlb_gather_mmu(struct mm_struct *mm, unsigned int full_mm_flush) | 110 | tlb_gather_mmu(struct mm_struct *mm, unsigned int full_mm_flush) |
| 47 | { | 111 | { |
| @@ -49,6 +113,8 @@ tlb_gather_mmu(struct mm_struct *mm, unsigned int full_mm_flush) | |||
| 49 | 113 | ||
| 50 | tlb->mm = mm; | 114 | tlb->mm = mm; |
| 51 | tlb->fullmm = full_mm_flush; | 115 | tlb->fullmm = full_mm_flush; |
| 116 | tlb->vma = NULL; | ||
| 117 | tlb->nr = 0; | ||
| 52 | 118 | ||
| 53 | return tlb; | 119 | return tlb; |
| 54 | } | 120 | } |
| @@ -56,8 +122,7 @@ tlb_gather_mmu(struct mm_struct *mm, unsigned int full_mm_flush) | |||
| 56 | static inline void | 122 | static inline void |
| 57 | tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end) | 123 | tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end) |
| 58 | { | 124 | { |
| 59 | if (tlb->fullmm) | 125 | tlb_flush_mmu(tlb); |
| 60 | flush_tlb_mm(tlb->mm); | ||
| 61 | 126 | ||
| 62 | /* keep the page table cache within bounds */ | 127 | /* keep the page table cache within bounds */ |
| 63 | check_pgt_cache(); | 128 | check_pgt_cache(); |
| @@ -71,12 +136,7 @@ tlb_finish_mmu(struct mmu_gather *tlb, unsigned long start, unsigned long end) | |||
| 71 | static inline void | 136 | static inline void |
| 72 | tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep, unsigned long addr) | 137 | tlb_remove_tlb_entry(struct mmu_gather *tlb, pte_t *ptep, unsigned long addr) |
| 73 | { | 138 | { |
| 74 | if (!tlb->fullmm) { | 139 | tlb_add_flush(tlb, addr); |
| 75 | if (addr < tlb->range_start) | ||
| 76 | tlb->range_start = addr; | ||
| 77 | if (addr + PAGE_SIZE > tlb->range_end) | ||
| 78 | tlb->range_end = addr + PAGE_SIZE; | ||
| 79 | } | ||
| 80 | } | 140 | } |
| 81 | 141 | ||
| 82 | /* | 142 | /* |
| @@ -89,6 +149,7 @@ tlb_start_vma(struct mmu_gather *tlb, struct vm_area_struct *vma) | |||
| 89 | { | 149 | { |
| 90 | if (!tlb->fullmm) { | 150 | if (!tlb->fullmm) { |
| 91 | flush_cache_range(vma, vma->vm_start, vma->vm_end); | 151 | flush_cache_range(vma, vma->vm_start, vma->vm_end); |
| 152 | tlb->vma = vma; | ||
| 92 | tlb->range_start = TASK_SIZE; | 153 | tlb->range_start = TASK_SIZE; |
| 93 | tlb->range_end = 0; | 154 | tlb->range_end = 0; |
| 94 | } | 155 | } |
| @@ -97,12 +158,30 @@ tlb_start_vma(struct mmu_gather *tlb, struct vm_area_struct *vma) | |||
| 97 | static inline void | 158 | static inline void |
| 98 | tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma) | 159 | tlb_end_vma(struct mmu_gather *tlb, struct vm_area_struct *vma) |
| 99 | { | 160 | { |
| 100 | if (!tlb->fullmm && tlb->range_end > 0) | 161 | if (!tlb->fullmm) |
| 101 | flush_tlb_range(vma, tlb->range_start, tlb->range_end); | 162 | tlb_flush(tlb); |
| 163 | } | ||
| 164 | |||
| 165 | static inline void tlb_remove_page(struct mmu_gather *tlb, struct page *page) | ||
| 166 | { | ||
| 167 | if (tlb_fast_mode(tlb)) { | ||
| 168 | free_page_and_swap_cache(page); | ||
| 169 | } else { | ||
| 170 | tlb->pages[tlb->nr++] = page; | ||
| 171 | if (tlb->nr >= FREE_PTE_NR) | ||
| 172 | tlb_flush_mmu(tlb); | ||
| 173 | } | ||
| 174 | } | ||
| 175 | |||
| 176 | static inline void __pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte, | ||
| 177 | unsigned long addr) | ||
| 178 | { | ||
| 179 | pgtable_page_dtor(pte); | ||
| 180 | tlb_add_flush(tlb, addr); | ||
| 181 | tlb_remove_page(tlb, pte); | ||
| 102 | } | 182 | } |
| 103 | 183 | ||
| 104 | #define tlb_remove_page(tlb,page) free_page_and_swap_cache(page) | 184 | #define pte_free_tlb(tlb, ptep, addr) __pte_free_tlb(tlb, ptep, addr) |
| 105 | #define pte_free_tlb(tlb, ptep, addr) pte_free((tlb)->mm, ptep) | ||
| 106 | #define pmd_free_tlb(tlb, pmdp, addr) pmd_free((tlb)->mm, pmdp) | 185 | #define pmd_free_tlb(tlb, pmdp, addr) pmd_free((tlb)->mm, pmdp) |
| 107 | 186 | ||
| 108 | #define tlb_migrate_finish(mm) do { } while (0) | 187 | #define tlb_migrate_finish(mm) do { } while (0) |
diff --git a/arch/arm/include/asm/tlbflush.h b/arch/arm/include/asm/tlbflush.h index ce7378ea15a2..d2005de383b8 100644 --- a/arch/arm/include/asm/tlbflush.h +++ b/arch/arm/include/asm/tlbflush.h | |||
| @@ -10,12 +10,7 @@ | |||
| 10 | #ifndef _ASMARM_TLBFLUSH_H | 10 | #ifndef _ASMARM_TLBFLUSH_H |
| 11 | #define _ASMARM_TLBFLUSH_H | 11 | #define _ASMARM_TLBFLUSH_H |
| 12 | 12 | ||
| 13 | 13 | #ifdef CONFIG_MMU | |
| 14 | #ifndef CONFIG_MMU | ||
| 15 | |||
| 16 | #define tlb_flush(tlb) ((void) tlb) | ||
| 17 | |||
| 18 | #else /* CONFIG_MMU */ | ||
| 19 | 14 | ||
| 20 | #include <asm/glue.h> | 15 | #include <asm/glue.h> |
| 21 | 16 | ||
