diff options
author | Jeremy Erickson <jerickso@cs.unc.edu> | 2014-04-11 13:24:45 -0400 |
---|---|---|
committer | Jeremy Erickson <jerickso@cs.unc.edu> | 2014-04-11 13:24:45 -0400 |
commit | 438145c7ef5c9445f25bb8fc4d52e2c9d11fdc7c (patch) | |
tree | 76941991e36f4a32bf1be0db3854959053f24619 /arch/arm/mm | |
parent | 9ddd1b8ad8abd321964b8add5581910de6d67c2a (diff) |
Update from 2.6.36 to 2.6.36.4wip-dissipation-jerickso
Diffstat (limited to 'arch/arm/mm')
-rw-r--r-- | arch/arm/mm/cache-v6.S | 28 | ||||
-rw-r--r-- | arch/arm/mm/fault-armv.c | 28 | ||||
-rw-r--r-- | arch/arm/mm/init.c | 6 |
3 files changed, 52 insertions, 10 deletions
diff --git a/arch/arm/mm/cache-v6.S b/arch/arm/mm/cache-v6.S index 86aa689ef1aa..47010d8114b0 100644 --- a/arch/arm/mm/cache-v6.S +++ b/arch/arm/mm/cache-v6.S | |||
@@ -196,6 +196,10 @@ ENTRY(v6_flush_kern_dcache_area) | |||
196 | * - end - virtual end address of region | 196 | * - end - virtual end address of region |
197 | */ | 197 | */ |
198 | v6_dma_inv_range: | 198 | v6_dma_inv_range: |
199 | #ifdef CONFIG_DMA_CACHE_RWFO | ||
200 | ldrb r2, [r0] @ read for ownership | ||
201 | strb r2, [r0] @ write for ownership | ||
202 | #endif | ||
199 | tst r0, #D_CACHE_LINE_SIZE - 1 | 203 | tst r0, #D_CACHE_LINE_SIZE - 1 |
200 | bic r0, r0, #D_CACHE_LINE_SIZE - 1 | 204 | bic r0, r0, #D_CACHE_LINE_SIZE - 1 |
201 | #ifdef HARVARD_CACHE | 205 | #ifdef HARVARD_CACHE |
@@ -204,6 +208,10 @@ v6_dma_inv_range: | |||
204 | mcrne p15, 0, r0, c7, c11, 1 @ clean unified line | 208 | mcrne p15, 0, r0, c7, c11, 1 @ clean unified line |
205 | #endif | 209 | #endif |
206 | tst r1, #D_CACHE_LINE_SIZE - 1 | 210 | tst r1, #D_CACHE_LINE_SIZE - 1 |
211 | #ifdef CONFIG_DMA_CACHE_RWFO | ||
212 | ldrneb r2, [r1, #-1] @ read for ownership | ||
213 | strneb r2, [r1, #-1] @ write for ownership | ||
214 | #endif | ||
207 | bic r1, r1, #D_CACHE_LINE_SIZE - 1 | 215 | bic r1, r1, #D_CACHE_LINE_SIZE - 1 |
208 | #ifdef HARVARD_CACHE | 216 | #ifdef HARVARD_CACHE |
209 | mcrne p15, 0, r1, c7, c14, 1 @ clean & invalidate D line | 217 | mcrne p15, 0, r1, c7, c14, 1 @ clean & invalidate D line |
@@ -211,10 +219,6 @@ v6_dma_inv_range: | |||
211 | mcrne p15, 0, r1, c7, c15, 1 @ clean & invalidate unified line | 219 | mcrne p15, 0, r1, c7, c15, 1 @ clean & invalidate unified line |
212 | #endif | 220 | #endif |
213 | 1: | 221 | 1: |
214 | #ifdef CONFIG_DMA_CACHE_RWFO | ||
215 | ldr r2, [r0] @ read for ownership | ||
216 | str r2, [r0] @ write for ownership | ||
217 | #endif | ||
218 | #ifdef HARVARD_CACHE | 222 | #ifdef HARVARD_CACHE |
219 | mcr p15, 0, r0, c7, c6, 1 @ invalidate D line | 223 | mcr p15, 0, r0, c7, c6, 1 @ invalidate D line |
220 | #else | 224 | #else |
@@ -222,6 +226,10 @@ v6_dma_inv_range: | |||
222 | #endif | 226 | #endif |
223 | add r0, r0, #D_CACHE_LINE_SIZE | 227 | add r0, r0, #D_CACHE_LINE_SIZE |
224 | cmp r0, r1 | 228 | cmp r0, r1 |
229 | #ifdef CONFIG_DMA_CACHE_RWFO | ||
230 | ldrlo r2, [r0] @ read for ownership | ||
231 | strlo r2, [r0] @ write for ownership | ||
232 | #endif | ||
225 | blo 1b | 233 | blo 1b |
226 | mov r0, #0 | 234 | mov r0, #0 |
227 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer | 235 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer |
@@ -256,12 +264,12 @@ v6_dma_clean_range: | |||
256 | * - end - virtual end address of region | 264 | * - end - virtual end address of region |
257 | */ | 265 | */ |
258 | ENTRY(v6_dma_flush_range) | 266 | ENTRY(v6_dma_flush_range) |
259 | bic r0, r0, #D_CACHE_LINE_SIZE - 1 | ||
260 | 1: | ||
261 | #ifdef CONFIG_DMA_CACHE_RWFO | 267 | #ifdef CONFIG_DMA_CACHE_RWFO |
262 | ldr r2, [r0] @ read for ownership | 268 | ldrb r2, [r0] @ read for ownership |
263 | str r2, [r0] @ write for ownership | 269 | strb r2, [r0] @ write for ownership |
264 | #endif | 270 | #endif |
271 | bic r0, r0, #D_CACHE_LINE_SIZE - 1 | ||
272 | 1: | ||
265 | #ifdef HARVARD_CACHE | 273 | #ifdef HARVARD_CACHE |
266 | mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D line | 274 | mcr p15, 0, r0, c7, c14, 1 @ clean & invalidate D line |
267 | #else | 275 | #else |
@@ -269,6 +277,10 @@ ENTRY(v6_dma_flush_range) | |||
269 | #endif | 277 | #endif |
270 | add r0, r0, #D_CACHE_LINE_SIZE | 278 | add r0, r0, #D_CACHE_LINE_SIZE |
271 | cmp r0, r1 | 279 | cmp r0, r1 |
280 | #ifdef CONFIG_DMA_CACHE_RWFO | ||
281 | ldrlob r2, [r0] @ read for ownership | ||
282 | strlob r2, [r0] @ write for ownership | ||
283 | #endif | ||
272 | blo 1b | 284 | blo 1b |
273 | mov r0, #0 | 285 | mov r0, #0 |
274 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer | 286 | mcr p15, 0, r0, c7, c10, 4 @ drain write buffer |
diff --git a/arch/arm/mm/fault-armv.c b/arch/arm/mm/fault-armv.c index 9b906dec1ca1..56036ff04deb 100644 --- a/arch/arm/mm/fault-armv.c +++ b/arch/arm/mm/fault-armv.c | |||
@@ -65,6 +65,30 @@ static int do_adjust_pte(struct vm_area_struct *vma, unsigned long address, | |||
65 | return ret; | 65 | return ret; |
66 | } | 66 | } |
67 | 67 | ||
68 | #if USE_SPLIT_PTLOCKS | ||
69 | /* | ||
70 | * If we are using split PTE locks, then we need to take the page | ||
71 | * lock here. Otherwise we are using shared mm->page_table_lock | ||
72 | * which is already locked, thus cannot take it. | ||
73 | */ | ||
74 | static inline void do_pte_lock(spinlock_t *ptl) | ||
75 | { | ||
76 | /* | ||
77 | * Use nested version here to indicate that we are already | ||
78 | * holding one similar spinlock. | ||
79 | */ | ||
80 | spin_lock_nested(ptl, SINGLE_DEPTH_NESTING); | ||
81 | } | ||
82 | |||
83 | static inline void do_pte_unlock(spinlock_t *ptl) | ||
84 | { | ||
85 | spin_unlock(ptl); | ||
86 | } | ||
87 | #else /* !USE_SPLIT_PTLOCKS */ | ||
88 | static inline void do_pte_lock(spinlock_t *ptl) {} | ||
89 | static inline void do_pte_unlock(spinlock_t *ptl) {} | ||
90 | #endif /* USE_SPLIT_PTLOCKS */ | ||
91 | |||
68 | static int adjust_pte(struct vm_area_struct *vma, unsigned long address, | 92 | static int adjust_pte(struct vm_area_struct *vma, unsigned long address, |
69 | unsigned long pfn) | 93 | unsigned long pfn) |
70 | { | 94 | { |
@@ -89,11 +113,11 @@ static int adjust_pte(struct vm_area_struct *vma, unsigned long address, | |||
89 | */ | 113 | */ |
90 | ptl = pte_lockptr(vma->vm_mm, pmd); | 114 | ptl = pte_lockptr(vma->vm_mm, pmd); |
91 | pte = pte_offset_map_nested(pmd, address); | 115 | pte = pte_offset_map_nested(pmd, address); |
92 | spin_lock(ptl); | 116 | do_pte_lock(ptl); |
93 | 117 | ||
94 | ret = do_adjust_pte(vma, address, pfn, pte); | 118 | ret = do_adjust_pte(vma, address, pfn, pte); |
95 | 119 | ||
96 | spin_unlock(ptl); | 120 | do_pte_unlock(ptl); |
97 | pte_unmap_nested(pte); | 121 | pte_unmap_nested(pte); |
98 | 122 | ||
99 | return ret; | 123 | return ret; |
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c index 7185b00650fe..4e2f620de09b 100644 --- a/arch/arm/mm/init.c +++ b/arch/arm/mm/init.c | |||
@@ -282,6 +282,12 @@ void __init arm_memblock_init(struct meminfo *mi, struct machine_desc *mdesc) | |||
282 | memblock_reserve(__pa(_stext), _end - _stext); | 282 | memblock_reserve(__pa(_stext), _end - _stext); |
283 | #endif | 283 | #endif |
284 | #ifdef CONFIG_BLK_DEV_INITRD | 284 | #ifdef CONFIG_BLK_DEV_INITRD |
285 | if (phys_initrd_size && | ||
286 | memblock_is_region_reserved(phys_initrd_start, phys_initrd_size)) { | ||
287 | pr_err("INITRD: 0x%08lx+0x%08lx overlaps in-use memory region - disabling initrd\n", | ||
288 | phys_initrd_start, phys_initrd_size); | ||
289 | phys_initrd_start = phys_initrd_size = 0; | ||
290 | } | ||
285 | if (phys_initrd_size) { | 291 | if (phys_initrd_size) { |
286 | memblock_reserve(phys_initrd_start, phys_initrd_size); | 292 | memblock_reserve(phys_initrd_start, phys_initrd_size); |
287 | 293 | ||