diff options
| author | Jeff Garzik <jgarzik@pobox.com> | 2005-10-04 10:16:31 -0400 |
|---|---|---|
| committer | Jeff Garzik <jgarzik@pobox.com> | 2005-10-04 10:16:31 -0400 |
| commit | 2ee73cc2d507df7b28050fba5d08bd33dd34848c (patch) | |
| tree | af5f33b265318e0f4b61f788691fe4f780ec402c /arch/arm/mm | |
| parent | c1d9728ecc5b560465df3c0c0d3b3825c2710b40 (diff) | |
| parent | ed39f731ab2e77e58122232f6e27333331d7793d (diff) | |
Merge /spare/repo/linux-2.6/
Diffstat (limited to 'arch/arm/mm')
| -rw-r--r-- | arch/arm/mm/abort-ev6.S | 5 | ||||
| -rw-r--r-- | arch/arm/mm/cache-v6.S | 9 | ||||
| -rw-r--r-- | arch/arm/mm/flush.c | 36 |
3 files changed, 31 insertions, 19 deletions
diff --git a/arch/arm/mm/abort-ev6.S b/arch/arm/mm/abort-ev6.S index 8f76f3df7b4c..dbd346033122 100644 --- a/arch/arm/mm/abort-ev6.S +++ b/arch/arm/mm/abort-ev6.S | |||
| @@ -20,6 +20,11 @@ | |||
| 20 | */ | 20 | */ |
| 21 | .align 5 | 21 | .align 5 |
| 22 | ENTRY(v6_early_abort) | 22 | ENTRY(v6_early_abort) |
| 23 | #ifdef CONFIG_CPU_MPCORE | ||
| 24 | clrex | ||
| 25 | #else | ||
| 26 | strex r0, r1, [sp] @ Clear the exclusive monitor | ||
| 27 | #endif | ||
| 23 | mrc p15, 0, r1, c5, c0, 0 @ get FSR | 28 | mrc p15, 0, r1, c5, c0, 0 @ get FSR |
| 24 | mrc p15, 0, r0, c6, c0, 0 @ get FAR | 29 | mrc p15, 0, r0, c6, c0, 0 @ get FAR |
| 25 | /* | 30 | /* |
diff --git a/arch/arm/mm/cache-v6.S b/arch/arm/mm/cache-v6.S index 85c10a71e7c6..72966d90e956 100644 --- a/arch/arm/mm/cache-v6.S +++ b/arch/arm/mm/cache-v6.S | |||
| @@ -18,6 +18,7 @@ | |||
| 18 | #define HARVARD_CACHE | 18 | #define HARVARD_CACHE |
| 19 | #define CACHE_LINE_SIZE 32 | 19 | #define CACHE_LINE_SIZE 32 |
| 20 | #define D_CACHE_LINE_SIZE 32 | 20 | #define D_CACHE_LINE_SIZE 32 |
| 21 | #define BTB_FLUSH_SIZE 8 | ||
| 21 | 22 | ||
| 22 | /* | 23 | /* |
| 23 | * v6_flush_cache_all() | 24 | * v6_flush_cache_all() |
| @@ -98,7 +99,13 @@ ENTRY(v6_coherent_user_range) | |||
| 98 | mcr p15, 0, r0, c7, c5, 1 @ invalidate I line | 99 | mcr p15, 0, r0, c7, c5, 1 @ invalidate I line |
| 99 | #endif | 100 | #endif |
| 100 | mcr p15, 0, r0, c7, c5, 7 @ invalidate BTB entry | 101 | mcr p15, 0, r0, c7, c5, 7 @ invalidate BTB entry |
| 101 | add r0, r0, #CACHE_LINE_SIZE | 102 | add r0, r0, #BTB_FLUSH_SIZE |
| 103 | mcr p15, 0, r0, c7, c5, 7 @ invalidate BTB entry | ||
| 104 | add r0, r0, #BTB_FLUSH_SIZE | ||
| 105 | mcr p15, 0, r0, c7, c5, 7 @ invalidate BTB entry | ||
| 106 | add r0, r0, #BTB_FLUSH_SIZE | ||
| 107 | mcr p15, 0, r0, c7, c5, 7 @ invalidate BTB entry | ||
| 108 | add r0, r0, #BTB_FLUSH_SIZE | ||
| 102 | cmp r0, r1 | 109 | cmp r0, r1 |
| 103 | blo 1b | 110 | blo 1b |
| 104 | #ifdef HARVARD_CACHE | 111 | #ifdef HARVARD_CACHE |
diff --git a/arch/arm/mm/flush.c b/arch/arm/mm/flush.c index b0208c992576..c9a03981b785 100644 --- a/arch/arm/mm/flush.c +++ b/arch/arm/mm/flush.c | |||
| @@ -17,6 +17,24 @@ | |||
| 17 | 17 | ||
| 18 | #ifdef CONFIG_CPU_CACHE_VIPT | 18 | #ifdef CONFIG_CPU_CACHE_VIPT |
| 19 | 19 | ||
| 20 | #define ALIAS_FLUSH_START 0xffff4000 | ||
| 21 | |||
| 22 | #define TOP_PTE(x) pte_offset_kernel(top_pmd, x) | ||
| 23 | |||
| 24 | static void flush_pfn_alias(unsigned long pfn, unsigned long vaddr) | ||
| 25 | { | ||
| 26 | unsigned long to = ALIAS_FLUSH_START + (CACHE_COLOUR(vaddr) << PAGE_SHIFT); | ||
| 27 | |||
| 28 | set_pte(TOP_PTE(to), pfn_pte(pfn, PAGE_KERNEL)); | ||
| 29 | flush_tlb_kernel_page(to); | ||
| 30 | |||
| 31 | asm( "mcrr p15, 0, %1, %0, c14\n" | ||
| 32 | " mcrr p15, 0, %1, %0, c5\n" | ||
| 33 | : | ||
| 34 | : "r" (to), "r" (to + PAGE_SIZE - L1_CACHE_BYTES) | ||
| 35 | : "cc"); | ||
| 36 | } | ||
| 37 | |||
| 20 | void flush_cache_mm(struct mm_struct *mm) | 38 | void flush_cache_mm(struct mm_struct *mm) |
| 21 | { | 39 | { |
| 22 | if (cache_is_vivt()) { | 40 | if (cache_is_vivt()) { |
| @@ -67,24 +85,6 @@ void flush_cache_page(struct vm_area_struct *vma, unsigned long user_addr, unsig | |||
| 67 | if (cache_is_vipt_aliasing()) | 85 | if (cache_is_vipt_aliasing()) |
| 68 | flush_pfn_alias(pfn, user_addr); | 86 | flush_pfn_alias(pfn, user_addr); |
| 69 | } | 87 | } |
| 70 | |||
| 71 | #define ALIAS_FLUSH_START 0xffff4000 | ||
| 72 | |||
| 73 | #define TOP_PTE(x) pte_offset_kernel(top_pmd, x) | ||
| 74 | |||
| 75 | static void flush_pfn_alias(unsigned long pfn, unsigned long vaddr) | ||
| 76 | { | ||
| 77 | unsigned long to = ALIAS_FLUSH_START + (CACHE_COLOUR(vaddr) << PAGE_SHIFT); | ||
| 78 | |||
| 79 | set_pte(TOP_PTE(to), pfn_pte(pfn, PAGE_KERNEL)); | ||
| 80 | flush_tlb_kernel_page(to); | ||
| 81 | |||
| 82 | asm( "mcrr p15, 0, %1, %0, c14\n" | ||
| 83 | " mcrr p15, 0, %1, %0, c5\n" | ||
| 84 | : | ||
| 85 | : "r" (to), "r" (to + PAGE_SIZE - L1_CACHE_BYTES) | ||
| 86 | : "cc"); | ||
| 87 | } | ||
| 88 | #else | 88 | #else |
| 89 | #define flush_pfn_alias(pfn,vaddr) do { } while (0) | 89 | #define flush_pfn_alias(pfn,vaddr) do { } while (0) |
| 90 | #endif | 90 | #endif |
