1
2
3
4
5
6
7#include <linux/swap.h>
8#include <linux/bootmem.h>
9#include <linux/uaccess.h>
10#include <asm/bfin-global.h>
11#include <asm/pda.h>
12#include <asm/cplbinit.h>
13#include <asm/early_printk.h>
14#include "blackfin_sram.h"
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29static unsigned long empty_bad_page_table;
30
31static unsigned long empty_bad_page;
32
33static unsigned long empty_zero_page;
34
35#ifndef CONFIG_EXCEPTION_L1_SCRATCH
36#if defined CONFIG_SYSCALL_TAB_L1
37__attribute__((l1_data))
38#endif
39static unsigned long exception_stack[NR_CPUS][1024];
40#endif
41
42struct blackfin_pda cpu_pda[NR_CPUS];
43EXPORT_SYMBOL(cpu_pda);
44
45
46
47
48
49
50
51void __init paging_init(void)
52{
53
54
55
56
57 unsigned long end_mem = memory_end & PAGE_MASK;
58
59 pr_debug("start_mem is %#lx virtual_end is %#lx\n", PAGE_ALIGN(memory_start), end_mem);
60
61
62
63
64
65 empty_bad_page_table = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);
66 empty_bad_page = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);
67 empty_zero_page = (unsigned long)alloc_bootmem_pages(PAGE_SIZE);
68 memset((void *)empty_zero_page, 0, PAGE_SIZE);
69
70
71
72
73 set_fs(KERNEL_DS);
74
75 pr_debug("free_area_init -> start_mem is %#lx virtual_end is %#lx\n",
76 PAGE_ALIGN(memory_start), end_mem);
77
78 {
79 unsigned long zones_size[MAX_NR_ZONES] = { 0, };
80
81 zones_size[ZONE_DMA] = (end_mem - PAGE_OFFSET) >> PAGE_SHIFT;
82 zones_size[ZONE_NORMAL] = 0;
83#ifdef CONFIG_HIGHMEM
84 zones_size[ZONE_HIGHMEM] = 0;
85#endif
86 free_area_init(zones_size);
87 }
88}
89
90asmlinkage void __init init_pda(void)
91{
92 unsigned int cpu = raw_smp_processor_id();
93
94 early_shadow_stamp();
95
96
97
98
99
100 memset(&cpu_pda[cpu], 0, sizeof(cpu_pda[cpu]));
101
102 cpu_pda[0].next = &cpu_pda[1];
103 cpu_pda[1].next = &cpu_pda[0];
104
105#ifdef CONFIG_EXCEPTION_L1_SCRATCH
106 cpu_pda[cpu].ex_stack = (unsigned long *)(L1_SCRATCH_START + \
107 L1_SCRATCH_LENGTH);
108#else
109 cpu_pda[cpu].ex_stack = exception_stack[cpu + 1];
110#endif
111
112#ifdef CONFIG_SMP
113 cpu_pda[cpu].imask = 0x1f;
114#endif
115}
116
117void __init mem_init(void)
118{
119 unsigned int codek = 0, datak = 0, initk = 0;
120 unsigned int reservedpages = 0, freepages = 0;
121 unsigned long tmp;
122 unsigned long start_mem = memory_start;
123 unsigned long end_mem = memory_end;
124
125 end_mem &= PAGE_MASK;
126 high_memory = (void *)end_mem;
127
128 start_mem = PAGE_ALIGN(start_mem);
129 max_mapnr = num_physpages = MAP_NR(high_memory);
130 printk(KERN_DEBUG "Kernel managed physical pages: %lu\n", num_physpages);
131
132
133 totalram_pages = free_all_bootmem();
134
135 reservedpages = 0;
136 for (tmp = 0; tmp < max_mapnr; tmp++)
137 if (PageReserved(pfn_to_page(tmp)))
138 reservedpages++;
139 freepages = max_mapnr - reservedpages;
140
141
142 reservedpages -= (_ramstart - _rambase) >> PAGE_SHIFT;
143#if (defined(CONFIG_BFIN_EXTMEM_ICACHEABLE) && ANOMALY_05000263)
144 reservedpages += (_ramend - memory_end - DMA_UNCACHED_REGION) >> PAGE_SHIFT;
145#endif
146
147 codek = (_etext - _stext) >> 10;
148 initk = (__init_end - __init_begin) >> 10;
149 datak = ((_ramstart - _rambase) >> 10) - codek - initk;
150
151 printk(KERN_INFO
152 "Memory available: %luk/%luk RAM, "
153 "(%uk init code, %uk kernel code, %uk data, %uk dma, %uk reserved)\n",
154 (unsigned long) freepages << (PAGE_SHIFT-10), _ramend >> 10,
155 initk, codek, datak, DMA_UNCACHED_REGION >> 10, (reservedpages << (PAGE_SHIFT-10)));
156}
157
158static void __init free_init_pages(const char *what, unsigned long begin, unsigned long end)
159{
160 unsigned long addr;
161
162 for (addr = begin; addr + PAGE_SIZE <= end; addr += PAGE_SIZE) {
163 ClearPageReserved(virt_to_page(addr));
164 init_page_count(virt_to_page(addr));
165 free_page(addr);
166 totalram_pages++;
167 }
168 printk(KERN_INFO "Freeing %s: %ldk freed\n", what, (end - begin) >> 10);
169}
170
171#ifdef CONFIG_BLK_DEV_INITRD
172void __init free_initrd_mem(unsigned long start, unsigned long end)
173{
174#ifndef CONFIG_MPU
175 free_init_pages("initrd memory", start, end);
176#endif
177}
178#endif
179
180void __init_refok free_initmem(void)
181{
182#if defined CONFIG_RAMKERNEL && !defined CONFIG_MPU
183 free_init_pages("unused kernel memory",
184 (unsigned long)(&__init_begin),
185 (unsigned long)(&__init_end));
186#endif
187}
188