diff options
| author | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-03-25 13:02:59 -0400 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2010-07-16 06:06:42 -0400 |
| commit | 3abe9d33b382cb9eee7bfee8d90b10078f4baa4d (patch) | |
| tree | 80c3307c1297405c64f1ab4efbba5195bba48b6d | |
| parent | 71ee7dad9b69917079f24d42aff796bad7932914 (diff) | |
ARM: early_alloc()
Add a common early allocator function, in preparation for switching
over to LMB. When we do, this function will need to do a little more
than just allocating memory; we need it zero initialized too.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
| -rw-r--r-- | arch/arm/mm/mmu.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index 1676d017a93a..3079d0fd9cea 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c | |||
| @@ -487,6 +487,11 @@ static void __init build_mem_type_table(void) | |||
| 487 | 487 | ||
| 488 | #define vectors_base() (vectors_high() ? 0xffff0000 : 0) | 488 | #define vectors_base() (vectors_high() ? 0xffff0000 : 0) |
| 489 | 489 | ||
| 490 | static void __init *early_alloc(unsigned long sz) | ||
| 491 | { | ||
| 492 | return alloc_bootmem_low_pages(sz); | ||
| 493 | } | ||
| 494 | |||
| 490 | static void __init alloc_init_pte(pmd_t *pmd, unsigned long addr, | 495 | static void __init alloc_init_pte(pmd_t *pmd, unsigned long addr, |
| 491 | unsigned long end, unsigned long pfn, | 496 | unsigned long end, unsigned long pfn, |
| 492 | const struct mem_type *type) | 497 | const struct mem_type *type) |
| @@ -494,7 +499,7 @@ static void __init alloc_init_pte(pmd_t *pmd, unsigned long addr, | |||
| 494 | pte_t *pte; | 499 | pte_t *pte; |
| 495 | 500 | ||
| 496 | if (pmd_none(*pmd)) { | 501 | if (pmd_none(*pmd)) { |
| 497 | pte = alloc_bootmem_low_pages(2 * PTRS_PER_PTE * sizeof(pte_t)); | 502 | pte = early_alloc(2 * PTRS_PER_PTE * sizeof(pte_t)); |
| 498 | __pmd_populate(pmd, __pa(pte) | type->prot_l1); | 503 | __pmd_populate(pmd, __pa(pte) | type->prot_l1); |
| 499 | } | 504 | } |
| 500 | 505 | ||
| @@ -873,7 +878,7 @@ static void __init devicemaps_init(struct machine_desc *mdesc) | |||
| 873 | /* | 878 | /* |
| 874 | * Allocate the vector page early. | 879 | * Allocate the vector page early. |
| 875 | */ | 880 | */ |
| 876 | vectors = alloc_bootmem_low_pages(PAGE_SIZE); | 881 | vectors = early_alloc(PAGE_SIZE); |
| 877 | 882 | ||
| 878 | for (addr = VMALLOC_END; addr; addr += PGDIR_SIZE) | 883 | for (addr = VMALLOC_END; addr; addr += PGDIR_SIZE) |
| 879 | pmd_clear(pmd_off_k(addr)); | 884 | pmd_clear(pmd_off_k(addr)); |
| @@ -945,7 +950,7 @@ static void __init kmap_init(void) | |||
| 945 | { | 950 | { |
| 946 | #ifdef CONFIG_HIGHMEM | 951 | #ifdef CONFIG_HIGHMEM |
| 947 | pmd_t *pmd = pmd_off_k(PKMAP_BASE); | 952 | pmd_t *pmd = pmd_off_k(PKMAP_BASE); |
| 948 | pte_t *pte = alloc_bootmem_low_pages(2 * PTRS_PER_PTE * sizeof(pte_t)); | 953 | pte_t *pte = early_alloc(2 * PTRS_PER_PTE * sizeof(pte_t)); |
| 949 | BUG_ON(!pmd_none(*pmd) || !pte); | 954 | BUG_ON(!pmd_none(*pmd) || !pte); |
| 950 | __pmd_populate(pmd, __pa(pte) | _PAGE_KERNEL_TABLE); | 955 | __pmd_populate(pmd, __pa(pte) | _PAGE_KERNEL_TABLE); |
| 951 | pkmap_page_table = pte + PTRS_PER_PTE; | 956 | pkmap_page_table = pte + PTRS_PER_PTE; |
| @@ -1005,11 +1010,8 @@ void __init paging_init(struct machine_desc *mdesc) | |||
| 1005 | 1010 | ||
| 1006 | top_pmd = pmd_off_k(0xffff0000); | 1011 | top_pmd = pmd_off_k(0xffff0000); |
| 1007 | 1012 | ||
| 1008 | /* | 1013 | /* allocate the zero page. */ |
| 1009 | * allocate the zero page. Note that this always succeeds and | 1014 | zero_page = early_alloc(PAGE_SIZE); |
| 1010 | * returns a zeroed result. | ||
| 1011 | */ | ||
| 1012 | zero_page = alloc_bootmem_low_pages(PAGE_SIZE); | ||
| 1013 | empty_zero_page = virt_to_page(zero_page); | 1015 | empty_zero_page = virt_to_page(zero_page); |
| 1014 | __flush_dcache_page(NULL, empty_zero_page); | 1016 | __flush_dcache_page(NULL, empty_zero_page); |
| 1015 | } | 1017 | } |
