aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mm
diff options
context:
space:
mode:
authorJeremy Erickson <jerickso@cs.unc.edu>2014-04-11 13:24:45 -0400
committerJeremy Erickson <jerickso@cs.unc.edu>2014-04-11 13:24:45 -0400
commit438145c7ef5c9445f25bb8fc4d52e2c9d11fdc7c (patch)
tree76941991e36f4a32bf1be0db3854959053f24619 /arch/arm/mm
parent9ddd1b8ad8abd321964b8add5581910de6d67c2a (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.S28
-rw-r--r--arch/arm/mm/fault-armv.c28
-rw-r--r--arch/arm/mm/init.c6
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 */
198v6_dma_inv_range: 198v6_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
2131: 2211:
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 */
258ENTRY(v6_dma_flush_range) 266ENTRY(v6_dma_flush_range)
259 bic r0, r0, #D_CACHE_LINE_SIZE - 1
2601:
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
2721:
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 */
74static 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
83static inline void do_pte_unlock(spinlock_t *ptl)
84{
85 spin_unlock(ptl);
86}
87#else /* !USE_SPLIT_PTLOCKS */
88static inline void do_pte_lock(spinlock_t *ptl) {}
89static inline void do_pte_unlock(spinlock_t *ptl) {}
90#endif /* USE_SPLIT_PTLOCKS */
91
68static int adjust_pte(struct vm_area_struct *vma, unsigned long address, 92static 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