2 * linux/arch/arm/mm/mm-armv.c
4 * Copyright (C) 1998-2005 Russell King
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.
10 * Page table sludge for ARM v3 and v4 processor architectures.
12 #include <linux/module.h>
14 #include <linux/init.h>
15 #include <linux/bootmem.h>
16 #include <linux/highmem.h>
17 #include <linux/nodemask.h>
19 #include <asm/pgalloc.h>
21 #include <asm/setup.h>
22 #include <asm/tlbflush.h>
24 #include <asm/mach/map.h>
26 #define CPOLICY_UNCACHED 0
27 #define CPOLICY_BUFFERED 1
28 #define CPOLICY_WRITETHROUGH 2
29 #define CPOLICY_WRITEBACK 3
30 #define CPOLICY_WRITEALLOC 4
32 static unsigned int cachepolicy __initdata
= CPOLICY_WRITEBACK
;
33 static unsigned int ecc_mask __initdata
= 0;
34 pgprot_t pgprot_kernel
;
36 EXPORT_SYMBOL(pgprot_kernel
);
41 const char policy
[16];
47 static struct cachepolicy cache_policies
[] __initdata
= {
51 .pmd
= PMD_SECT_UNCACHED
,
56 .pmd
= PMD_SECT_BUFFERED
,
57 .pte
= PTE_BUFFERABLE
,
59 .policy
= "writethrough",
64 .policy
= "writeback",
67 .pte
= PTE_BUFFERABLE
|PTE_CACHEABLE
,
69 .policy
= "writealloc",
72 .pte
= PTE_BUFFERABLE
|PTE_CACHEABLE
,
77 * These are useful for identifing cache coherency
78 * problems by allowing the cache or the cache and
79 * writebuffer to be turned off. (Note: the write
80 * buffer should not be on and the cache off).
82 static void __init
early_cachepolicy(char **p
)
86 for (i
= 0; i
< ARRAY_SIZE(cache_policies
); i
++) {
87 int len
= strlen(cache_policies
[i
].policy
);
89 if (memcmp(*p
, cache_policies
[i
].policy
, len
) == 0) {
91 cr_alignment
&= ~cache_policies
[i
].cr_mask
;
92 cr_no_alignment
&= ~cache_policies
[i
].cr_mask
;
97 if (i
== ARRAY_SIZE(cache_policies
))
98 printk(KERN_ERR
"ERROR: unknown or unsupported cache policy\n");
100 set_cr(cr_alignment
);
103 static void __init
early_nocache(char **__unused
)
105 char *p
= "buffered";
106 printk(KERN_WARNING
"nocache is deprecated; use cachepolicy=%s\n", p
);
107 early_cachepolicy(&p
);
110 static void __init
early_nowrite(char **__unused
)
112 char *p
= "uncached";
113 printk(KERN_WARNING
"nowb is deprecated; use cachepolicy=%s\n", p
);
114 early_cachepolicy(&p
);
117 static void __init
early_ecc(char **p
)
119 if (memcmp(*p
, "on", 2) == 0) {
120 ecc_mask
= PMD_PROTECTION
;
122 } else if (memcmp(*p
, "off", 3) == 0) {
128 __early_param("nocache", early_nocache
);
129 __early_param("nowb", early_nowrite
);
130 __early_param("cachepolicy=", early_cachepolicy
);
131 __early_param("ecc=", early_ecc
);
133 static int __init
noalign_setup(char *__unused
)
135 cr_alignment
&= ~CR_A
;
136 cr_no_alignment
&= ~CR_A
;
137 set_cr(cr_alignment
);
141 __setup("noalign", noalign_setup
);
143 #define FIRST_KERNEL_PGD_NR (FIRST_USER_PGD_NR + USER_PTRS_PER_PGD)
145 static inline pmd_t
*pmd_off(pgd_t
*pgd
, unsigned long virt
)
147 return pmd_offset(pgd
, virt
);
150 static inline pmd_t
*pmd_off_k(unsigned long virt
)
152 return pmd_off(pgd_offset_k(virt
), virt
);
156 * need to get a 16k page for level 1
158 pgd_t
*get_pgd_slow(struct mm_struct
*mm
)
160 pgd_t
*new_pgd
, *init_pgd
;
161 pmd_t
*new_pmd
, *init_pmd
;
162 pte_t
*new_pte
, *init_pte
;
164 new_pgd
= (pgd_t
*)__get_free_pages(GFP_KERNEL
, 2);
168 memzero(new_pgd
, FIRST_KERNEL_PGD_NR
* sizeof(pgd_t
));
171 * Copy over the kernel and IO PGD entries
173 init_pgd
= pgd_offset_k(0);
174 memcpy(new_pgd
+ FIRST_KERNEL_PGD_NR
, init_pgd
+ FIRST_KERNEL_PGD_NR
,
175 (PTRS_PER_PGD
- FIRST_KERNEL_PGD_NR
) * sizeof(pgd_t
));
177 clean_dcache_area(new_pgd
, PTRS_PER_PGD
* sizeof(pgd_t
));
179 if (!vectors_high()) {
181 * On ARM, first page must always be allocated since it
182 * contains the machine vectors.
184 new_pmd
= pmd_alloc(mm
, new_pgd
, 0);
188 new_pte
= pte_alloc_map(mm
, new_pmd
, 0);
192 init_pmd
= pmd_offset(init_pgd
, 0);
193 init_pte
= pte_offset_map_nested(init_pmd
, 0);
194 set_pte(new_pte
, *init_pte
);
195 pte_unmap_nested(init_pte
);
204 free_pages((unsigned long)new_pgd
, 2);
209 void free_pgd_slow(pgd_t
*pgd
)
217 /* pgd is always present and good */
218 pmd
= pmd_off(pgd
, 0);
227 pte
= pmd_page(*pmd
);
229 dec_zone_page_state(virt_to_page((unsigned long *)pgd
), NR_PAGETABLE
);
230 pte_lock_deinit(pte
);
234 free_pages((unsigned long) pgd
, 2);
238 * Create a SECTION PGD between VIRT and PHYS in domain
239 * DOMAIN with protection PROT. This operates on half-
240 * pgdir entry increments.
243 alloc_init_section(unsigned long virt
, unsigned long phys
, int prot
)
245 pmd_t
*pmdp
= pmd_off_k(virt
);
247 if (virt
& (1 << 20))
250 *pmdp
= __pmd(phys
| prot
);
251 flush_pmd_entry(pmdp
);
255 * Create a SUPER SECTION PGD between VIRT and PHYS with protection PROT
258 alloc_init_supersection(unsigned long virt
, unsigned long phys
, int prot
)
262 for (i
= 0; i
< 16; i
+= 1) {
263 alloc_init_section(virt
, phys
, prot
| PMD_SECT_SUPER
);
265 virt
+= (PGDIR_SIZE
/ 2);
270 * Add a PAGE mapping between VIRT and PHYS in domain
271 * DOMAIN with protection PROT. Note that due to the
272 * way we map the PTEs, we must allocate two PTE_SIZE'd
273 * blocks - one for the Linux pte table, and one for
274 * the hardware pte table.
277 alloc_init_page(unsigned long virt
, unsigned long phys
, unsigned int prot_l1
, pgprot_t prot
)
279 pmd_t
*pmdp
= pmd_off_k(virt
);
282 if (pmd_none(*pmdp
)) {
283 ptep
= alloc_bootmem_low_pages(2 * PTRS_PER_PTE
*
286 __pmd_populate(pmdp
, __pa(ptep
) | prot_l1
);
288 ptep
= pte_offset_kernel(pmdp
, virt
);
290 set_pte(ptep
, pfn_pte(phys
>> PAGE_SHIFT
, prot
));
294 unsigned int prot_pte
;
295 unsigned int prot_l1
;
296 unsigned int prot_sect
;
300 static struct mem_types mem_types
[] __initdata
= {
302 .prot_pte
= L_PTE_PRESENT
| L_PTE_YOUNG
| L_PTE_DIRTY
|
304 .prot_l1
= PMD_TYPE_TABLE
,
305 .prot_sect
= PMD_TYPE_SECT
| PMD_SECT_UNCACHED
|
310 .prot_sect
= PMD_TYPE_SECT
,
311 .domain
= DOMAIN_KERNEL
,
314 .prot_sect
= PMD_TYPE_SECT
| PMD_SECT_MINICACHE
,
315 .domain
= DOMAIN_KERNEL
,
318 .prot_pte
= L_PTE_PRESENT
| L_PTE_YOUNG
| L_PTE_DIRTY
|
320 .prot_l1
= PMD_TYPE_TABLE
,
321 .domain
= DOMAIN_USER
,
323 [MT_HIGH_VECTORS
] = {
324 .prot_pte
= L_PTE_PRESENT
| L_PTE_YOUNG
| L_PTE_DIRTY
|
325 L_PTE_USER
| L_PTE_EXEC
,
326 .prot_l1
= PMD_TYPE_TABLE
,
327 .domain
= DOMAIN_USER
,
330 .prot_sect
= PMD_TYPE_SECT
| PMD_SECT_AP_WRITE
,
331 .domain
= DOMAIN_KERNEL
,
334 .prot_sect
= PMD_TYPE_SECT
,
335 .domain
= DOMAIN_KERNEL
,
337 [MT_IXP2000_DEVICE
] = { /* IXP2400 requires XCB=101 for on-chip I/O */
338 .prot_pte
= L_PTE_PRESENT
| L_PTE_YOUNG
| L_PTE_DIRTY
|
340 .prot_l1
= PMD_TYPE_TABLE
,
341 .prot_sect
= PMD_TYPE_SECT
| PMD_SECT_UNCACHED
|
342 PMD_SECT_AP_WRITE
| PMD_SECT_BUFFERABLE
|
346 [MT_NONSHARED_DEVICE
] = {
347 .prot_l1
= PMD_TYPE_TABLE
,
348 .prot_sect
= PMD_TYPE_SECT
| PMD_SECT_NONSHARED_DEV
|
355 * Adjust the PMD section entries according to the CPU in use.
357 void __init
build_mem_type_table(void)
359 struct cachepolicy
*cp
;
360 unsigned int cr
= get_cr();
361 unsigned int user_pgprot
, kern_pgprot
;
362 int cpu_arch
= cpu_architecture();
365 #if defined(CONFIG_CPU_DCACHE_DISABLE)
366 if (cachepolicy
> CPOLICY_BUFFERED
)
367 cachepolicy
= CPOLICY_BUFFERED
;
368 #elif defined(CONFIG_CPU_DCACHE_WRITETHROUGH)
369 if (cachepolicy
> CPOLICY_WRITETHROUGH
)
370 cachepolicy
= CPOLICY_WRITETHROUGH
;
372 if (cpu_arch
< CPU_ARCH_ARMv5
) {
373 if (cachepolicy
>= CPOLICY_WRITEALLOC
)
374 cachepolicy
= CPOLICY_WRITEBACK
;
378 if (cpu_arch
<= CPU_ARCH_ARMv5TEJ
&& !cpu_is_xscale()) {
379 for (i
= 0; i
< ARRAY_SIZE(mem_types
); i
++) {
380 if (mem_types
[i
].prot_l1
)
381 mem_types
[i
].prot_l1
|= PMD_BIT4
;
382 if (mem_types
[i
].prot_sect
)
383 mem_types
[i
].prot_sect
|= PMD_BIT4
;
387 cp
= &cache_policies
[cachepolicy
];
388 kern_pgprot
= user_pgprot
= cp
->pte
;
391 * Enable CPU-specific coherency if supported.
392 * (Only available on XSC3 at the moment.)
394 if (arch_is_coherent()) {
396 mem_types
[MT_MEMORY
].prot_sect
|= PMD_SECT_S
;
397 mem_types
[MT_MEMORY
].prot_pte
|= L_PTE_COHERENT
;
402 * ARMv6 and above have extended page tables.
404 if (cpu_arch
>= CPU_ARCH_ARMv6
&& (cr
& CR_XP
)) {
406 * bit 4 becomes XN which we must clear for the
407 * kernel memory mapping.
409 mem_types
[MT_MEMORY
].prot_sect
&= ~PMD_BIT4
;
410 mem_types
[MT_ROM
].prot_sect
&= ~PMD_BIT4
;
413 * Mark cache clean areas and XIP ROM read only
414 * from SVC mode and no access from userspace.
416 mem_types
[MT_ROM
].prot_sect
|= PMD_SECT_APX
|PMD_SECT_AP_WRITE
;
417 mem_types
[MT_MINICLEAN
].prot_sect
|= PMD_SECT_APX
|PMD_SECT_AP_WRITE
;
418 mem_types
[MT_CACHECLEAN
].prot_sect
|= PMD_SECT_APX
|PMD_SECT_AP_WRITE
;
421 * Mark the device area as "shared device"
423 mem_types
[MT_DEVICE
].prot_pte
|= L_PTE_BUFFERABLE
;
424 mem_types
[MT_DEVICE
].prot_sect
|= PMD_SECT_BUFFERED
;
427 * User pages need to be mapped with the ASID
430 user_pgprot
|= L_PTE_ASID
;
434 * Mark memory with the "shared" attribute for SMP systems
436 user_pgprot
|= L_PTE_SHARED
;
437 kern_pgprot
|= L_PTE_SHARED
;
438 mem_types
[MT_MEMORY
].prot_sect
|= PMD_SECT_S
;
442 for (i
= 0; i
< 16; i
++) {
443 unsigned long v
= pgprot_val(protection_map
[i
]);
444 v
= (v
& ~(L_PTE_BUFFERABLE
|L_PTE_CACHEABLE
)) | user_pgprot
;
445 protection_map
[i
] = __pgprot(v
);
448 mem_types
[MT_LOW_VECTORS
].prot_pte
|= kern_pgprot
;
449 mem_types
[MT_HIGH_VECTORS
].prot_pte
|= kern_pgprot
;
451 if (cpu_arch
>= CPU_ARCH_ARMv5
) {
454 * Only use write-through for non-SMP systems
456 mem_types
[MT_LOW_VECTORS
].prot_pte
&= ~L_PTE_BUFFERABLE
;
457 mem_types
[MT_HIGH_VECTORS
].prot_pte
&= ~L_PTE_BUFFERABLE
;
460 mem_types
[MT_MINICLEAN
].prot_sect
&= ~PMD_SECT_TEX(1);
463 pgprot_kernel
= __pgprot(L_PTE_PRESENT
| L_PTE_YOUNG
|
464 L_PTE_DIRTY
| L_PTE_WRITE
|
465 L_PTE_EXEC
| kern_pgprot
);
467 mem_types
[MT_LOW_VECTORS
].prot_l1
|= ecc_mask
;
468 mem_types
[MT_HIGH_VECTORS
].prot_l1
|= ecc_mask
;
469 mem_types
[MT_MEMORY
].prot_sect
|= ecc_mask
| cp
->pmd
;
470 mem_types
[MT_ROM
].prot_sect
|= cp
->pmd
;
474 mem_types
[MT_CACHECLEAN
].prot_sect
|= PMD_SECT_WT
;
478 mem_types
[MT_CACHECLEAN
].prot_sect
|= PMD_SECT_WB
;
481 printk("Memory policy: ECC %sabled, Data cache %s\n",
482 ecc_mask
? "en" : "dis", cp
->policy
);
485 #define vectors_base() (vectors_high() ? 0xffff0000 : 0)
488 * Create the page directory entries and any necessary
489 * page tables for the mapping specified by `md'. We
490 * are able to cope here with varying sizes and address
491 * offsets, and we take full advantage of sections and
494 void __init
create_mapping(struct map_desc
*md
)
496 unsigned long virt
, length
;
497 int prot_sect
, prot_l1
, domain
;
499 unsigned long off
= (u32
)__pfn_to_phys(md
->pfn
);
501 if (md
->virtual != vectors_base() && md
->virtual < TASK_SIZE
) {
502 printk(KERN_WARNING
"BUG: not creating mapping for "
503 "0x%08llx at 0x%08lx in user region\n",
504 __pfn_to_phys((u64
)md
->pfn
), md
->virtual);
508 if ((md
->type
== MT_DEVICE
|| md
->type
== MT_ROM
) &&
509 md
->virtual >= PAGE_OFFSET
&& md
->virtual < VMALLOC_END
) {
510 printk(KERN_WARNING
"BUG: mapping for 0x%08llx at 0x%08lx "
511 "overlaps vmalloc space\n",
512 __pfn_to_phys((u64
)md
->pfn
), md
->virtual);
515 domain
= mem_types
[md
->type
].domain
;
516 prot_pte
= __pgprot(mem_types
[md
->type
].prot_pte
);
517 prot_l1
= mem_types
[md
->type
].prot_l1
| PMD_DOMAIN(domain
);
518 prot_sect
= mem_types
[md
->type
].prot_sect
| PMD_DOMAIN(domain
);
521 * Catch 36-bit addresses
523 if(md
->pfn
>= 0x100000) {
525 printk(KERN_ERR
"MM: invalid domain in supersection "
526 "mapping for 0x%08llx at 0x%08lx\n",
527 __pfn_to_phys((u64
)md
->pfn
), md
->virtual);
530 if((md
->virtual | md
->length
| __pfn_to_phys(md
->pfn
))
531 & ~SUPERSECTION_MASK
) {
532 printk(KERN_ERR
"MM: cannot create mapping for "
533 "0x%08llx at 0x%08lx invalid alignment\n",
534 __pfn_to_phys((u64
)md
->pfn
), md
->virtual);
539 * Shift bits [35:32] of address into bits [23:20] of PMD
542 off
|= (((md
->pfn
>> (32 - PAGE_SHIFT
)) & 0xF) << 20);
549 if (mem_types
[md
->type
].prot_l1
== 0 &&
550 (virt
& 0xfffff || (virt
+ off
) & 0xfffff || (virt
+ length
) & 0xfffff)) {
551 printk(KERN_WARNING
"BUG: map for 0x%08lx at 0x%08lx can not "
552 "be mapped using pages, ignoring.\n",
553 __pfn_to_phys(md
->pfn
), md
->virtual);
557 while ((virt
& 0xfffff || (virt
+ off
) & 0xfffff) && length
>= PAGE_SIZE
) {
558 alloc_init_page(virt
, virt
+ off
, prot_l1
, prot_pte
);
564 /* N.B. ARMv6 supersections are only defined to work with domain 0.
565 * Since domain assignments can in fact be arbitrary, the
566 * 'domain == 0' check below is required to insure that ARMv6
567 * supersections are only allocated for domain 0 regardless
568 * of the actual domain assignments in use.
570 if ((cpu_architecture() >= CPU_ARCH_ARMv6
|| cpu_is_xsc3())
573 * Align to supersection boundary if !high pages.
574 * High pages have already been checked for proper
575 * alignment above and they will fail the SUPSERSECTION_MASK
576 * check because of the way the address is encoded into
579 if (md
->pfn
<= 0x100000) {
580 while ((virt
& ~SUPERSECTION_MASK
||
581 (virt
+ off
) & ~SUPERSECTION_MASK
) &&
582 length
>= (PGDIR_SIZE
/ 2)) {
583 alloc_init_section(virt
, virt
+ off
, prot_sect
);
585 virt
+= (PGDIR_SIZE
/ 2);
586 length
-= (PGDIR_SIZE
/ 2);
590 while (length
>= SUPERSECTION_SIZE
) {
591 alloc_init_supersection(virt
, virt
+ off
, prot_sect
);
593 virt
+= SUPERSECTION_SIZE
;
594 length
-= SUPERSECTION_SIZE
;
599 * A section mapping covers half a "pgdir" entry.
601 while (length
>= (PGDIR_SIZE
/ 2)) {
602 alloc_init_section(virt
, virt
+ off
, prot_sect
);
604 virt
+= (PGDIR_SIZE
/ 2);
605 length
-= (PGDIR_SIZE
/ 2);
608 while (length
>= PAGE_SIZE
) {
609 alloc_init_page(virt
, virt
+ off
, prot_l1
, prot_pte
);
617 * In order to soft-boot, we need to insert a 1:1 mapping in place of
618 * the user-mode pages. This will then ensure that we have predictable
619 * results when turning the mmu off
621 void setup_mm_for_reboot(char mode
)
623 unsigned long base_pmdval
;
627 if (current
->mm
&& current
->mm
->pgd
)
628 pgd
= current
->mm
->pgd
;
632 base_pmdval
= PMD_SECT_AP_WRITE
| PMD_SECT_AP_READ
| PMD_TYPE_SECT
;
633 if (cpu_architecture() <= CPU_ARCH_ARMv5TEJ
&& !cpu_is_xscale())
634 base_pmdval
|= PMD_BIT4
;
636 for (i
= 0; i
< FIRST_USER_PGD_NR
+ USER_PTRS_PER_PGD
; i
++, pgd
++) {
637 unsigned long pmdval
= (i
<< PGDIR_SHIFT
) | base_pmdval
;
640 pmd
= pmd_off(pgd
, i
<< PGDIR_SHIFT
);
641 pmd
[0] = __pmd(pmdval
);
642 pmd
[1] = __pmd(pmdval
+ (1 << (PGDIR_SHIFT
- 1)));
643 flush_pmd_entry(pmd
);
648 * Create the architecture specific mappings
650 void __init
iotable_init(struct map_desc
*io_desc
, int nr
)
654 for (i
= 0; i
< nr
; i
++)
655 create_mapping(io_desc
+ i
);