[PATCH] ARM: Add inline functions to find the pmd from virtual address

Add pmd_off() and pmd_off_k() to obtain the pmd pointer for a
virtual address, and use them throughout the mm initialisation.

Signed-off-by: Russell King <rmk@arm.linux.org.uk>

+15 -8
+15 -8
arch/arm/mm/mm-armv.c
··· 142 143 #define FIRST_KERNEL_PGD_NR (FIRST_USER_PGD_NR + USER_PTRS_PER_PGD) 144 145 /* 146 * need to get a 16k page for level 1 147 */ ··· 230 return; 231 232 /* pgd is always present and good */ 233 - pmd = (pmd_t *)pgd; 234 if (pmd_none(*pmd)) 235 goto free; 236 if (pmd_bad(*pmd)) { ··· 256 static inline void 257 alloc_init_section(unsigned long virt, unsigned long phys, int prot) 258 { 259 - pmd_t *pmdp; 260 261 - pmdp = pmd_offset(pgd_offset_k(virt), virt); 262 if (virt & (1 << 20)) 263 pmdp++; 264 ··· 292 static inline void 293 alloc_init_page(unsigned long virt, unsigned long phys, unsigned int prot_l1, pgprot_t prot) 294 { 295 - pmd_t *pmdp; 296 pte_t *ptep; 297 - 298 - pmdp = pmd_offset(pgd_offset_k(virt), virt); 299 300 if (pmd_none(*pmdp)) { 301 unsigned long pmdval; ··· 317 */ 318 static inline void clear_mapping(unsigned long virt) 319 { 320 - pmd_clear(pmd_offset(pgd_offset_k(virt), virt)); 321 } 322 323 struct mem_types { ··· 585 PMD_TYPE_SECT; 586 if (cpu_arch <= CPU_ARCH_ARMv5) 587 pmdval |= PMD_BIT4; 588 - pmd = pmd_offset(pgd + i, i << PGDIR_SHIFT); 589 pmd[0] = __pmd(pmdval); 590 pmd[1] = __pmd(pmdval + (1 << (PGDIR_SHIFT - 1))); 591 flush_pmd_entry(pmd);
··· 142 143 #define FIRST_KERNEL_PGD_NR (FIRST_USER_PGD_NR + USER_PTRS_PER_PGD) 144 145 + static inline pmd_t *pmd_off(pgd_t *pgd, unsigned long virt) 146 + { 147 + return pmd_offset(pgd, virt); 148 + } 149 + 150 + static inline pmd_t *pmd_off_k(unsigned long virt) 151 + { 152 + return pmd_off(pgd_offset_k(virt), virt); 153 + } 154 + 155 /* 156 * need to get a 16k page for level 1 157 */ ··· 220 return; 221 222 /* pgd is always present and good */ 223 + pmd = pmd_off(pgd, 0); 224 if (pmd_none(*pmd)) 225 goto free; 226 if (pmd_bad(*pmd)) { ··· 246 static inline void 247 alloc_init_section(unsigned long virt, unsigned long phys, int prot) 248 { 249 + pmd_t *pmdp = pmd_off_k(virt); 250 251 if (virt & (1 << 20)) 252 pmdp++; 253 ··· 283 static inline void 284 alloc_init_page(unsigned long virt, unsigned long phys, unsigned int prot_l1, pgprot_t prot) 285 { 286 + pmd_t *pmdp = pmd_off_k(virt); 287 pte_t *ptep; 288 289 if (pmd_none(*pmdp)) { 290 unsigned long pmdval; ··· 310 */ 311 static inline void clear_mapping(unsigned long virt) 312 { 313 + pmd_clear(pmd_off_k(virt)); 314 } 315 316 struct mem_types { ··· 578 PMD_TYPE_SECT; 579 if (cpu_arch <= CPU_ARCH_ARMv5) 580 pmdval |= PMD_BIT4; 581 + pmd = pmd_off(pgd, i << PGDIR_SHIFT); 582 pmd[0] = __pmd(pmdval); 583 pmd[1] = __pmd(pmdval + (1 << (PGDIR_SHIFT - 1))); 584 flush_pmd_entry(pmd);