[PARISC] PA7200 also supports prefetch for read
[linux-2.6-block.git] / arch / parisc / mm / init.c
CommitLineData
1da177e4
LT
1/*
2 * linux/arch/parisc/mm/init.c
3 *
4 * Copyright (C) 1995 Linus Torvalds
5 * Copyright 1999 SuSE GmbH
6 * changed by Philipp Rumpf
7 * Copyright 1999 Philipp Rumpf (prumpf@tux.org)
8 * Copyright 2004 Randolph Chung (tausq@debian.org)
2fd83038 9 * Copyright 2006 Helge Deller (deller@gmx.de)
1da177e4
LT
10 *
11 */
12
1da177e4
LT
13
14#include <linux/module.h>
15#include <linux/mm.h>
16#include <linux/bootmem.h>
17#include <linux/delay.h>
18#include <linux/init.h>
19#include <linux/pci.h> /* for hppa_dma_ops and pcxl_dma_ops */
20#include <linux/initrd.h>
21#include <linux/swap.h>
22#include <linux/unistd.h>
23#include <linux/nodemask.h> /* for node_online_map */
24#include <linux/pagemap.h> /* for release_pages and page_cache_release */
25
26#include <asm/pgalloc.h>
27#include <asm/tlb.h>
28#include <asm/pdc_chassis.h>
29#include <asm/mmzone.h>
a581c2a4 30#include <asm/sections.h>
1da177e4
LT
31
32DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
33
34extern char _text; /* start of kernel code, defined by linker */
35extern int data_start;
36extern char _end; /* end of BSS, defined by linker */
37extern char __init_begin, __init_end;
38
39#ifdef CONFIG_DISCONTIGMEM
8039de10
HD
40struct node_map_data node_data[MAX_NUMNODES] __read_mostly;
41bootmem_data_t bmem_data[MAX_NUMNODES] __read_mostly;
42unsigned char pfnnid_map[PFNNID_MAP_MAX] __read_mostly;
1da177e4
LT
43#endif
44
45static struct resource data_resource = {
46 .name = "Kernel data",
47 .flags = IORESOURCE_BUSY | IORESOURCE_MEM,
48};
49
50static struct resource code_resource = {
51 .name = "Kernel code",
52 .flags = IORESOURCE_BUSY | IORESOURCE_MEM,
53};
54
55static struct resource pdcdata_resource = {
56 .name = "PDC data (Page Zero)",
57 .start = 0,
58 .end = 0x9ff,
59 .flags = IORESOURCE_BUSY | IORESOURCE_MEM,
60};
61
8039de10 62static struct resource sysram_resources[MAX_PHYSMEM_RANGES] __read_mostly;
1da177e4
LT
63
64/* The following array is initialized from the firmware specific
65 * information retrieved in kernel/inventory.c.
66 */
67
8039de10
HD
68physmem_range_t pmem_ranges[MAX_PHYSMEM_RANGES] __read_mostly;
69int npmem_ranges __read_mostly;
1da177e4
LT
70
71#ifdef __LP64__
72#define MAX_MEM (~0UL)
73#else /* !__LP64__ */
74#define MAX_MEM (3584U*1024U*1024U)
75#endif /* !__LP64__ */
76
8039de10 77static unsigned long mem_limit __read_mostly = MAX_MEM;
1da177e4
LT
78
79static void __init mem_limit_func(void)
80{
81 char *cp, *end;
82 unsigned long limit;
83 extern char saved_command_line[];
84
85 /* We need this before __setup() functions are called */
86
87 limit = MAX_MEM;
88 for (cp = saved_command_line; *cp; ) {
89 if (memcmp(cp, "mem=", 4) == 0) {
90 cp += 4;
91 limit = memparse(cp, &end);
92 if (end != cp)
93 break;
94 cp = end;
95 } else {
96 while (*cp != ' ' && *cp)
97 ++cp;
98 while (*cp == ' ')
99 ++cp;
100 }
101 }
102
103 if (limit < mem_limit)
104 mem_limit = limit;
105}
106
107#define MAX_GAP (0x40000000UL >> PAGE_SHIFT)
108
109static void __init setup_bootmem(void)
110{
111 unsigned long bootmap_size;
112 unsigned long mem_max;
113 unsigned long bootmap_pages;
114 unsigned long bootmap_start_pfn;
115 unsigned long bootmap_pfn;
116#ifndef CONFIG_DISCONTIGMEM
117 physmem_range_t pmem_holes[MAX_PHYSMEM_RANGES - 1];
118 int npmem_holes;
119#endif
120 int i, sysram_resource_count;
121
122 disable_sr_hashing(); /* Turn off space register hashing */
123
124 /*
125 * Sort the ranges. Since the number of ranges is typically
126 * small, and performance is not an issue here, just do
127 * a simple insertion sort.
128 */
129
130 for (i = 1; i < npmem_ranges; i++) {
131 int j;
132
133 for (j = i; j > 0; j--) {
134 unsigned long tmp;
135
136 if (pmem_ranges[j-1].start_pfn <
137 pmem_ranges[j].start_pfn) {
138
139 break;
140 }
141 tmp = pmem_ranges[j-1].start_pfn;
142 pmem_ranges[j-1].start_pfn = pmem_ranges[j].start_pfn;
143 pmem_ranges[j].start_pfn = tmp;
144 tmp = pmem_ranges[j-1].pages;
145 pmem_ranges[j-1].pages = pmem_ranges[j].pages;
146 pmem_ranges[j].pages = tmp;
147 }
148 }
149
150#ifndef CONFIG_DISCONTIGMEM
151 /*
152 * Throw out ranges that are too far apart (controlled by
153 * MAX_GAP).
154 */
155
156 for (i = 1; i < npmem_ranges; i++) {
157 if (pmem_ranges[i].start_pfn -
158 (pmem_ranges[i-1].start_pfn +
159 pmem_ranges[i-1].pages) > MAX_GAP) {
160 npmem_ranges = i;
161 printk("Large gap in memory detected (%ld pages). "
162 "Consider turning on CONFIG_DISCONTIGMEM\n",
163 pmem_ranges[i].start_pfn -
164 (pmem_ranges[i-1].start_pfn +
165 pmem_ranges[i-1].pages));
166 break;
167 }
168 }
169#endif
170
171 if (npmem_ranges > 1) {
172
173 /* Print the memory ranges */
174
175 printk(KERN_INFO "Memory Ranges:\n");
176
177 for (i = 0; i < npmem_ranges; i++) {
178 unsigned long start;
179 unsigned long size;
180
181 size = (pmem_ranges[i].pages << PAGE_SHIFT);
182 start = (pmem_ranges[i].start_pfn << PAGE_SHIFT);
183 printk(KERN_INFO "%2d) Start 0x%016lx End 0x%016lx Size %6ld MB\n",
184 i,start, start + (size - 1), size >> 20);
185 }
186 }
187
188 sysram_resource_count = npmem_ranges;
189 for (i = 0; i < sysram_resource_count; i++) {
190 struct resource *res = &sysram_resources[i];
191 res->name = "System RAM";
192 res->start = pmem_ranges[i].start_pfn << PAGE_SHIFT;
193 res->end = res->start + (pmem_ranges[i].pages << PAGE_SHIFT)-1;
194 res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
195 request_resource(&iomem_resource, res);
196 }
197
198 /*
199 * For 32 bit kernels we limit the amount of memory we can
200 * support, in order to preserve enough kernel address space
201 * for other purposes. For 64 bit kernels we don't normally
202 * limit the memory, but this mechanism can be used to
203 * artificially limit the amount of memory (and it is written
204 * to work with multiple memory ranges).
205 */
206
207 mem_limit_func(); /* check for "mem=" argument */
208
209 mem_max = 0;
210 num_physpages = 0;
211 for (i = 0; i < npmem_ranges; i++) {
212 unsigned long rsize;
213
214 rsize = pmem_ranges[i].pages << PAGE_SHIFT;
215 if ((mem_max + rsize) > mem_limit) {
216 printk(KERN_WARNING "Memory truncated to %ld MB\n", mem_limit >> 20);
217 if (mem_max == mem_limit)
218 npmem_ranges = i;
219 else {
220 pmem_ranges[i].pages = (mem_limit >> PAGE_SHIFT)
221 - (mem_max >> PAGE_SHIFT);
222 npmem_ranges = i + 1;
223 mem_max = mem_limit;
224 }
225 num_physpages += pmem_ranges[i].pages;
226 break;
227 }
228 num_physpages += pmem_ranges[i].pages;
229 mem_max += rsize;
230 }
231
232 printk(KERN_INFO "Total Memory: %ld MB\n",mem_max >> 20);
233
234#ifndef CONFIG_DISCONTIGMEM
235 /* Merge the ranges, keeping track of the holes */
236
237 {
238 unsigned long end_pfn;
239 unsigned long hole_pages;
240
241 npmem_holes = 0;
242 end_pfn = pmem_ranges[0].start_pfn + pmem_ranges[0].pages;
243 for (i = 1; i < npmem_ranges; i++) {
244
245 hole_pages = pmem_ranges[i].start_pfn - end_pfn;
246 if (hole_pages) {
247 pmem_holes[npmem_holes].start_pfn = end_pfn;
248 pmem_holes[npmem_holes++].pages = hole_pages;
249 end_pfn += hole_pages;
250 }
251 end_pfn += pmem_ranges[i].pages;
252 }
253
254 pmem_ranges[0].pages = end_pfn - pmem_ranges[0].start_pfn;
255 npmem_ranges = 1;
256 }
257#endif
258
259 bootmap_pages = 0;
260 for (i = 0; i < npmem_ranges; i++)
261 bootmap_pages += bootmem_bootmap_pages(pmem_ranges[i].pages);
262
263 bootmap_start_pfn = PAGE_ALIGN(__pa((unsigned long) &_end)) >> PAGE_SHIFT;
264
265#ifdef CONFIG_DISCONTIGMEM
266 for (i = 0; i < MAX_PHYSMEM_RANGES; i++) {
267 memset(NODE_DATA(i), 0, sizeof(pg_data_t));
268 NODE_DATA(i)->bdata = &bmem_data[i];
269 }
270 memset(pfnnid_map, 0xff, sizeof(pfnnid_map));
271
272 for (i = 0; i < npmem_ranges; i++)
273 node_set_online(i);
274#endif
275
276 /*
277 * Initialize and free the full range of memory in each range.
278 * Note that the only writing these routines do are to the bootmap,
279 * and we've made sure to locate the bootmap properly so that they
280 * won't be writing over anything important.
281 */
282
283 bootmap_pfn = bootmap_start_pfn;
284 max_pfn = 0;
285 for (i = 0; i < npmem_ranges; i++) {
286 unsigned long start_pfn;
287 unsigned long npages;
288
289 start_pfn = pmem_ranges[i].start_pfn;
290 npages = pmem_ranges[i].pages;
291
292 bootmap_size = init_bootmem_node(NODE_DATA(i),
293 bootmap_pfn,
294 start_pfn,
295 (start_pfn + npages) );
296 free_bootmem_node(NODE_DATA(i),
297 (start_pfn << PAGE_SHIFT),
298 (npages << PAGE_SHIFT) );
299 bootmap_pfn += (bootmap_size + PAGE_SIZE - 1) >> PAGE_SHIFT;
300 if ((start_pfn + npages) > max_pfn)
301 max_pfn = start_pfn + npages;
302 }
303
5cdb8205
GG
304 /* IOMMU is always used to access "high mem" on those boxes
305 * that can support enough mem that a PCI device couldn't
306 * directly DMA to any physical addresses.
307 * ISA DMA support will need to revisit this.
308 */
309 max_low_pfn = max_pfn;
310
1da177e4
LT
311 if ((bootmap_pfn - bootmap_start_pfn) != bootmap_pages) {
312 printk(KERN_WARNING "WARNING! bootmap sizing is messed up!\n");
313 BUG();
314 }
315
316 /* reserve PAGE0 pdc memory, kernel text/data/bss & bootmap */
317
318#define PDC_CONSOLE_IO_IODC_SIZE 32768
319
320 reserve_bootmem_node(NODE_DATA(0), 0UL,
321 (unsigned long)(PAGE0->mem_free + PDC_CONSOLE_IO_IODC_SIZE));
322 reserve_bootmem_node(NODE_DATA(0),__pa((unsigned long)&_text),
323 (unsigned long)(&_end - &_text));
324 reserve_bootmem_node(NODE_DATA(0), (bootmap_start_pfn << PAGE_SHIFT),
325 ((bootmap_pfn - bootmap_start_pfn) << PAGE_SHIFT));
326
327#ifndef CONFIG_DISCONTIGMEM
328
329 /* reserve the holes */
330
331 for (i = 0; i < npmem_holes; i++) {
332 reserve_bootmem_node(NODE_DATA(0),
333 (pmem_holes[i].start_pfn << PAGE_SHIFT),
334 (pmem_holes[i].pages << PAGE_SHIFT));
335 }
336#endif
337
338#ifdef CONFIG_BLK_DEV_INITRD
339 if (initrd_start) {
340 printk(KERN_INFO "initrd: %08lx-%08lx\n", initrd_start, initrd_end);
341 if (__pa(initrd_start) < mem_max) {
342 unsigned long initrd_reserve;
343
344 if (__pa(initrd_end) > mem_max) {
345 initrd_reserve = mem_max - __pa(initrd_start);
346 } else {
347 initrd_reserve = initrd_end - initrd_start;
348 }
349 initrd_below_start_ok = 1;
350 printk(KERN_INFO "initrd: reserving %08lx-%08lx (mem_max %08lx)\n", __pa(initrd_start), __pa(initrd_start) + initrd_reserve, mem_max);
351
352 reserve_bootmem_node(NODE_DATA(0),__pa(initrd_start), initrd_reserve);
353 }
354 }
355#endif
356
357 data_resource.start = virt_to_phys(&data_start);
358 data_resource.end = virt_to_phys(&_end)-1;
359 code_resource.start = virt_to_phys(&_text);
360 code_resource.end = virt_to_phys(&data_start)-1;
361
362 /* We don't know which region the kernel will be in, so try
363 * all of them.
364 */
365 for (i = 0; i < sysram_resource_count; i++) {
366 struct resource *res = &sysram_resources[i];
367 request_resource(res, &code_resource);
368 request_resource(res, &data_resource);
369 }
370 request_resource(&sysram_resources[0], &pdcdata_resource);
371}
372
373void free_initmem(void)
374{
2fd83038
HD
375 unsigned long addr, init_begin, init_end;
376
1da177e4
LT
377 printk(KERN_INFO "Freeing unused kernel memory: ");
378
81a3de3e 379#ifdef CONFIG_DEBUG_KERNEL
1da177e4
LT
380 /* Attempt to catch anyone trying to execute code here
381 * by filling the page with BRK insns.
382 *
383 * If we disable interrupts for all CPUs, then IPI stops working.
384 * Kinda breaks the global cache flushing.
385 */
386 local_irq_disable();
387
388 memset(&__init_begin, 0x00,
389 (unsigned long)&__init_end - (unsigned long)&__init_begin);
390
391 flush_data_cache();
392 asm volatile("sync" : : );
393 flush_icache_range((unsigned long)&__init_begin, (unsigned long)&__init_end);
394 asm volatile("sync" : : );
395
396 local_irq_enable();
397#endif
398
2fd83038
HD
399 /* align __init_begin and __init_end to page size,
400 ignoring linker script where we might have tried to save RAM */
401 init_begin = PAGE_ALIGN((unsigned long)(&__init_begin));
402 init_end = PAGE_ALIGN((unsigned long)(&__init_end));
403 for (addr = init_begin; addr < init_end; addr += PAGE_SIZE) {
1da177e4 404 ClearPageReserved(virt_to_page(addr));
7835e98b 405 init_page_count(virt_to_page(addr));
1da177e4
LT
406 free_page(addr);
407 num_physpages++;
408 totalram_pages++;
409 }
410
411 /* set up a new led state on systems shipped LED State panel */
412 pdc_chassis_send_status(PDC_CHASSIS_DIRECT_BCOMPLETE);
413
2fd83038 414 printk("%luk freed\n", (init_end - init_begin) >> 10);
1da177e4
LT
415}
416
1bcdd854
HD
417
418#ifdef CONFIG_DEBUG_RODATA
419void mark_rodata_ro(void)
420{
1bcdd854
HD
421 /* rodata memory was already mapped with KERNEL_RO access rights by
422 pagetable_init() and map_pages(). No need to do additional stuff here */
423 printk (KERN_INFO "Write protecting the kernel read-only data: %luk\n",
a581c2a4 424 (unsigned long)(__end_rodata - __start_rodata) >> 10);
1bcdd854
HD
425}
426#endif
427
428
1da177e4
LT
429/*
430 * Just an arbitrary offset to serve as a "hole" between mapping areas
431 * (between top of physical memory and a potential pcxl dma mapping
432 * area, and below the vmalloc mapping area).
433 *
434 * The current 32K value just means that there will be a 32K "hole"
435 * between mapping areas. That means that any out-of-bounds memory
436 * accesses will hopefully be caught. The vmalloc() routines leaves
437 * a hole of 4kB between each vmalloced area for the same reason.
438 */
439
440 /* Leave room for gateway page expansion */
441#if KERNEL_MAP_START < GATEWAY_PAGE_SIZE
442#error KERNEL_MAP_START is in gateway reserved region
443#endif
444#define MAP_START (KERNEL_MAP_START)
445
446#define VM_MAP_OFFSET (32*1024)
447#define SET_MAP_OFFSET(x) ((void *)(((unsigned long)(x) + VM_MAP_OFFSET) \
448 & ~(VM_MAP_OFFSET-1)))
449
8039de10 450void *vmalloc_start __read_mostly;
1da177e4
LT
451EXPORT_SYMBOL(vmalloc_start);
452
453#ifdef CONFIG_PA11
8039de10 454unsigned long pcxl_dma_start __read_mostly;
1da177e4
LT
455#endif
456
457void __init mem_init(void)
458{
459 high_memory = __va((max_pfn << PAGE_SHIFT));
460
461#ifndef CONFIG_DISCONTIGMEM
462 max_mapnr = page_to_pfn(virt_to_page(high_memory - 1)) + 1;
463 totalram_pages += free_all_bootmem();
464#else
465 {
466 int i;
467
468 for (i = 0; i < npmem_ranges; i++)
469 totalram_pages += free_all_bootmem_node(NODE_DATA(i));
470 }
471#endif
472
473 printk(KERN_INFO "Memory: %luk available\n", num_physpages << (PAGE_SHIFT-10));
474
475#ifdef CONFIG_PA11
476 if (hppa_dma_ops == &pcxl_dma_ops) {
477 pcxl_dma_start = (unsigned long)SET_MAP_OFFSET(MAP_START);
478 vmalloc_start = SET_MAP_OFFSET(pcxl_dma_start + PCXL_DMA_MAP_SIZE);
479 } else {
480 pcxl_dma_start = 0;
481 vmalloc_start = SET_MAP_OFFSET(MAP_START);
482 }
483#else
484 vmalloc_start = SET_MAP_OFFSET(MAP_START);
485#endif
486
487}
488
8039de10 489unsigned long *empty_zero_page __read_mostly;
1da177e4
LT
490
491void show_mem(void)
492{
493 int i,free = 0,total = 0,reserved = 0;
494 int shared = 0, cached = 0;
495
496 printk(KERN_INFO "Mem-info:\n");
497 show_free_areas();
498 printk(KERN_INFO "Free swap: %6ldkB\n",
499 nr_swap_pages<<(PAGE_SHIFT-10));
500#ifndef CONFIG_DISCONTIGMEM
501 i = max_mapnr;
502 while (i-- > 0) {
503 total++;
504 if (PageReserved(mem_map+i))
505 reserved++;
506 else if (PageSwapCache(mem_map+i))
507 cached++;
508 else if (!page_count(&mem_map[i]))
509 free++;
510 else
511 shared += page_count(&mem_map[i]) - 1;
512 }
513#else
514 for (i = 0; i < npmem_ranges; i++) {
515 int j;
516
517 for (j = node_start_pfn(i); j < node_end_pfn(i); j++) {
518 struct page *p;
208d54e5 519 unsigned long flags;
1da177e4 520
208d54e5 521 pgdat_resize_lock(NODE_DATA(i), &flags);
408fde81 522 p = nid_page_nr(i, j) - node_start_pfn(i);
1da177e4
LT
523
524 total++;
525 if (PageReserved(p))
526 reserved++;
527 else if (PageSwapCache(p))
528 cached++;
529 else if (!page_count(p))
530 free++;
531 else
532 shared += page_count(p) - 1;
208d54e5 533 pgdat_resize_unlock(NODE_DATA(i), &flags);
1da177e4
LT
534 }
535 }
536#endif
537 printk(KERN_INFO "%d pages of RAM\n", total);
538 printk(KERN_INFO "%d reserved pages\n", reserved);
539 printk(KERN_INFO "%d pages shared\n", shared);
540 printk(KERN_INFO "%d pages swap cached\n", cached);
541
542
543#ifdef CONFIG_DISCONTIGMEM
544 {
545 struct zonelist *zl;
546 int i, j, k;
547
548 for (i = 0; i < npmem_ranges; i++) {
549 for (j = 0; j < MAX_NR_ZONES; j++) {
550 zl = NODE_DATA(i)->node_zonelists + j;
551
552 printk("Zone list for zone %d on node %d: ", j, i);
553 for (k = 0; zl->zones[k] != NULL; k++)
89fa3024 554 printk("[%d/%s] ", zone_to_nid(zl->zones[k]), zl->zones[k]->name);
1da177e4
LT
555 printk("\n");
556 }
557 }
558 }
559#endif
560}
561
562
563static void __init map_pages(unsigned long start_vaddr, unsigned long start_paddr, unsigned long size, pgprot_t pgprot)
564{
565 pgd_t *pg_dir;
566 pmd_t *pmd;
567 pte_t *pg_table;
568 unsigned long end_paddr;
569 unsigned long start_pmd;
570 unsigned long start_pte;
571 unsigned long tmp1;
572 unsigned long tmp2;
573 unsigned long address;
574 unsigned long ro_start;
575 unsigned long ro_end;
576 unsigned long fv_addr;
577 unsigned long gw_addr;
578 extern const unsigned long fault_vector_20;
579 extern void * const linux_gateway_page;
580
581 ro_start = __pa((unsigned long)&_text);
582 ro_end = __pa((unsigned long)&data_start);
583 fv_addr = __pa((unsigned long)&fault_vector_20) & PAGE_MASK;
584 gw_addr = __pa((unsigned long)&linux_gateway_page) & PAGE_MASK;
585
586 end_paddr = start_paddr + size;
587
588 pg_dir = pgd_offset_k(start_vaddr);
589
590#if PTRS_PER_PMD == 1
591 start_pmd = 0;
592#else
593 start_pmd = ((start_vaddr >> PMD_SHIFT) & (PTRS_PER_PMD - 1));
594#endif
595 start_pte = ((start_vaddr >> PAGE_SHIFT) & (PTRS_PER_PTE - 1));
596
597 address = start_paddr;
598 while (address < end_paddr) {
599#if PTRS_PER_PMD == 1
600 pmd = (pmd_t *)__pa(pg_dir);
601#else
602 pmd = (pmd_t *)pgd_address(*pg_dir);
603
604 /*
605 * pmd is physical at this point
606 */
607
608 if (!pmd) {
609 pmd = (pmd_t *) alloc_bootmem_low_pages_node(NODE_DATA(0),PAGE_SIZE << PMD_ORDER);
610 pmd = (pmd_t *) __pa(pmd);
611 }
612
613 pgd_populate(NULL, pg_dir, __va(pmd));
614#endif
615 pg_dir++;
616
617 /* now change pmd to kernel virtual addresses */
618
619 pmd = (pmd_t *)__va(pmd) + start_pmd;
620 for (tmp1 = start_pmd; tmp1 < PTRS_PER_PMD; tmp1++,pmd++) {
621
622 /*
623 * pg_table is physical at this point
624 */
625
626 pg_table = (pte_t *)pmd_address(*pmd);
627 if (!pg_table) {
628 pg_table = (pte_t *)
629 alloc_bootmem_low_pages_node(NODE_DATA(0),PAGE_SIZE);
630 pg_table = (pte_t *) __pa(pg_table);
631 }
632
633 pmd_populate_kernel(NULL, pmd, __va(pg_table));
634
635 /* now change pg_table to kernel virtual addresses */
636
637 pg_table = (pte_t *) __va(pg_table) + start_pte;
638 for (tmp2 = start_pte; tmp2 < PTRS_PER_PTE; tmp2++,pg_table++) {
639 pte_t pte;
640
641 /*
642 * Map the fault vector writable so we can
643 * write the HPMC checksum.
644 */
2fd83038 645#if defined(CONFIG_PARISC_PAGE_SIZE_4KB)
1da177e4
LT
646 if (address >= ro_start && address < ro_end
647 && address != fv_addr
648 && address != gw_addr)
649 pte = __mk_pte(address, PAGE_KERNEL_RO);
650 else
2fd83038 651#endif
1da177e4
LT
652 pte = __mk_pte(address, pgprot);
653
654 if (address >= end_paddr)
655 pte_val(pte) = 0;
656
657 set_pte(pg_table, pte);
658
659 address += PAGE_SIZE;
660 }
661 start_pte = 0;
662
663 if (address >= end_paddr)
664 break;
665 }
666 start_pmd = 0;
667 }
668}
669
670/*
671 * pagetable_init() sets up the page tables
672 *
673 * Note that gateway_init() places the Linux gateway page at page 0.
674 * Since gateway pages cannot be dereferenced this has the desirable
675 * side effect of trapping those pesky NULL-reference errors in the
676 * kernel.
677 */
678static void __init pagetable_init(void)
679{
680 int range;
681
682 /* Map each physical memory range to its kernel vaddr */
683
684 for (range = 0; range < npmem_ranges; range++) {
685 unsigned long start_paddr;
686 unsigned long end_paddr;
687 unsigned long size;
688
689 start_paddr = pmem_ranges[range].start_pfn << PAGE_SHIFT;
690 end_paddr = start_paddr + (pmem_ranges[range].pages << PAGE_SHIFT);
691 size = pmem_ranges[range].pages << PAGE_SHIFT;
692
693 map_pages((unsigned long)__va(start_paddr), start_paddr,
694 size, PAGE_KERNEL);
695 }
696
697#ifdef CONFIG_BLK_DEV_INITRD
698 if (initrd_end && initrd_end > mem_limit) {
1bcdd854 699 printk(KERN_INFO "initrd: mapping %08lx-%08lx\n", initrd_start, initrd_end);
1da177e4
LT
700 map_pages(initrd_start, __pa(initrd_start),
701 initrd_end - initrd_start, PAGE_KERNEL);
702 }
703#endif
704
705 empty_zero_page = alloc_bootmem_pages(PAGE_SIZE);
706 memset(empty_zero_page, 0, PAGE_SIZE);
707}
708
709static void __init gateway_init(void)
710{
711 unsigned long linux_gateway_page_addr;
712 /* FIXME: This is 'const' in order to trick the compiler
713 into not treating it as DP-relative data. */
714 extern void * const linux_gateway_page;
715
716 linux_gateway_page_addr = LINUX_GATEWAY_ADDR & PAGE_MASK;
717
718 /*
719 * Setup Linux Gateway page.
720 *
721 * The Linux gateway page will reside in kernel space (on virtual
722 * page 0), so it doesn't need to be aliased into user space.
723 */
724
725 map_pages(linux_gateway_page_addr, __pa(&linux_gateway_page),
726 PAGE_SIZE, PAGE_GATEWAY);
727}
728
729#ifdef CONFIG_HPUX
730void
731map_hpux_gateway_page(struct task_struct *tsk, struct mm_struct *mm)
732{
733 pgd_t *pg_dir;
734 pmd_t *pmd;
735 pte_t *pg_table;
736 unsigned long start_pmd;
737 unsigned long start_pte;
738 unsigned long address;
739 unsigned long hpux_gw_page_addr;
740 /* FIXME: This is 'const' in order to trick the compiler
741 into not treating it as DP-relative data. */
742 extern void * const hpux_gateway_page;
743
744 hpux_gw_page_addr = HPUX_GATEWAY_ADDR & PAGE_MASK;
745
746 /*
747 * Setup HP-UX Gateway page.
748 *
749 * The HP-UX gateway page resides in the user address space,
750 * so it needs to be aliased into each process.
751 */
752
753 pg_dir = pgd_offset(mm,hpux_gw_page_addr);
754
755#if PTRS_PER_PMD == 1
756 start_pmd = 0;
757#else
758 start_pmd = ((hpux_gw_page_addr >> PMD_SHIFT) & (PTRS_PER_PMD - 1));
759#endif
760 start_pte = ((hpux_gw_page_addr >> PAGE_SHIFT) & (PTRS_PER_PTE - 1));
761
762 address = __pa(&hpux_gateway_page);
763#if PTRS_PER_PMD == 1
764 pmd = (pmd_t *)__pa(pg_dir);
765#else
766 pmd = (pmd_t *) pgd_address(*pg_dir);
767
768 /*
769 * pmd is physical at this point
770 */
771
772 if (!pmd) {
773 pmd = (pmd_t *) get_zeroed_page(GFP_KERNEL);
774 pmd = (pmd_t *) __pa(pmd);
775 }
776
777 __pgd_val_set(*pg_dir, PxD_FLAG_PRESENT | PxD_FLAG_VALID | (unsigned long) pmd);
778#endif
779 /* now change pmd to kernel virtual addresses */
780
781 pmd = (pmd_t *)__va(pmd) + start_pmd;
782
783 /*
784 * pg_table is physical at this point
785 */
786
787 pg_table = (pte_t *) pmd_address(*pmd);
788 if (!pg_table)
789 pg_table = (pte_t *) __pa(get_zeroed_page(GFP_KERNEL));
790
791 __pmd_val_set(*pmd, PxD_FLAG_PRESENT | PxD_FLAG_VALID | (unsigned long) pg_table);
792
793 /* now change pg_table to kernel virtual addresses */
794
795 pg_table = (pte_t *) __va(pg_table) + start_pte;
796 set_pte(pg_table, __mk_pte(address, PAGE_GATEWAY));
797}
798EXPORT_SYMBOL(map_hpux_gateway_page);
799#endif
800
1da177e4
LT
801void __init paging_init(void)
802{
803 int i;
804
805 setup_bootmem();
806 pagetable_init();
807 gateway_init();
808 flush_cache_all_local(); /* start with known state */
ce33941f 809 flush_tlb_all_local(NULL);
1da177e4
LT
810
811 for (i = 0; i < npmem_ranges; i++) {
f06a9684 812 unsigned long zones_size[MAX_NR_ZONES] = { 0, };
1da177e4
LT
813
814 /* We have an IOMMU, so all memory can go into a single
815 ZONE_DMA zone. */
816 zones_size[ZONE_DMA] = pmem_ranges[i].pages;
817
818#ifdef CONFIG_DISCONTIGMEM
819 /* Need to initialize the pfnnid_map before we can initialize
820 the zone */
821 {
822 int j;
823 for (j = (pmem_ranges[i].start_pfn >> PFNNID_SHIFT);
824 j <= ((pmem_ranges[i].start_pfn + pmem_ranges[i].pages) >> PFNNID_SHIFT);
825 j++) {
826 pfnnid_map[j] = i;
827 }
828 }
829#endif
830
831 free_area_init_node(i, NODE_DATA(i), zones_size,
832 pmem_ranges[i].start_pfn, NULL);
833 }
834}
835
836#ifdef CONFIG_PA20
837
838/*
839 * Currently, all PA20 chips have 18 bit protection id's, which is the
840 * limiting factor (space ids are 32 bits).
841 */
842
843#define NR_SPACE_IDS 262144
844
845#else
846
847/*
848 * Currently we have a one-to-one relationship between space id's and
849 * protection id's. Older parisc chips (PCXS, PCXT, PCXL, PCXL2) only
850 * support 15 bit protection id's, so that is the limiting factor.
851 * PCXT' has 18 bit protection id's, but only 16 bit spaceids, so it's
852 * probably not worth the effort for a special case here.
853 */
854
855#define NR_SPACE_IDS 32768
856
857#endif /* !CONFIG_PA20 */
858
859#define RECYCLE_THRESHOLD (NR_SPACE_IDS / 2)
860#define SID_ARRAY_SIZE (NR_SPACE_IDS / (8 * sizeof(long)))
861
862static unsigned long space_id[SID_ARRAY_SIZE] = { 1 }; /* disallow space 0 */
863static unsigned long dirty_space_id[SID_ARRAY_SIZE];
864static unsigned long space_id_index;
865static unsigned long free_space_ids = NR_SPACE_IDS - 1;
866static unsigned long dirty_space_ids = 0;
867
868static DEFINE_SPINLOCK(sid_lock);
869
870unsigned long alloc_sid(void)
871{
872 unsigned long index;
873
874 spin_lock(&sid_lock);
875
876 if (free_space_ids == 0) {
877 if (dirty_space_ids != 0) {
878 spin_unlock(&sid_lock);
879 flush_tlb_all(); /* flush_tlb_all() calls recycle_sids() */
880 spin_lock(&sid_lock);
881 }
2fd83038 882 BUG_ON(free_space_ids == 0);
1da177e4
LT
883 }
884
885 free_space_ids--;
886
887 index = find_next_zero_bit(space_id, NR_SPACE_IDS, space_id_index);
888 space_id[index >> SHIFT_PER_LONG] |= (1L << (index & (BITS_PER_LONG - 1)));
889 space_id_index = index;
890
891 spin_unlock(&sid_lock);
892
893 return index << SPACEID_SHIFT;
894}
895
896void free_sid(unsigned long spaceid)
897{
898 unsigned long index = spaceid >> SPACEID_SHIFT;
899 unsigned long *dirty_space_offset;
900
901 dirty_space_offset = dirty_space_id + (index >> SHIFT_PER_LONG);
902 index &= (BITS_PER_LONG - 1);
903
904 spin_lock(&sid_lock);
905
2fd83038 906 BUG_ON(*dirty_space_offset & (1L << index)); /* attempt to free space id twice */
1da177e4
LT
907
908 *dirty_space_offset |= (1L << index);
909 dirty_space_ids++;
910
911 spin_unlock(&sid_lock);
912}
913
914
915#ifdef CONFIG_SMP
916static void get_dirty_sids(unsigned long *ndirtyptr,unsigned long *dirty_array)
917{
918 int i;
919
920 /* NOTE: sid_lock must be held upon entry */
921
922 *ndirtyptr = dirty_space_ids;
923 if (dirty_space_ids != 0) {
924 for (i = 0; i < SID_ARRAY_SIZE; i++) {
925 dirty_array[i] = dirty_space_id[i];
926 dirty_space_id[i] = 0;
927 }
928 dirty_space_ids = 0;
929 }
930
931 return;
932}
933
934static void recycle_sids(unsigned long ndirty,unsigned long *dirty_array)
935{
936 int i;
937
938 /* NOTE: sid_lock must be held upon entry */
939
940 if (ndirty != 0) {
941 for (i = 0; i < SID_ARRAY_SIZE; i++) {
942 space_id[i] ^= dirty_array[i];
943 }
944
945 free_space_ids += ndirty;
946 space_id_index = 0;
947 }
948}
949
950#else /* CONFIG_SMP */
951
952static void recycle_sids(void)
953{
954 int i;
955
956 /* NOTE: sid_lock must be held upon entry */
957
958 if (dirty_space_ids != 0) {
959 for (i = 0; i < SID_ARRAY_SIZE; i++) {
960 space_id[i] ^= dirty_space_id[i];
961 dirty_space_id[i] = 0;
962 }
963
964 free_space_ids += dirty_space_ids;
965 dirty_space_ids = 0;
966 space_id_index = 0;
967 }
968}
969#endif
970
971/*
972 * flush_tlb_all() calls recycle_sids(), since whenever the entire tlb is
973 * purged, we can safely reuse the space ids that were released but
974 * not flushed from the tlb.
975 */
976
977#ifdef CONFIG_SMP
978
979static unsigned long recycle_ndirty;
980static unsigned long recycle_dirty_array[SID_ARRAY_SIZE];
2fd83038 981static unsigned int recycle_inuse;
1da177e4
LT
982
983void flush_tlb_all(void)
984{
985 int do_recycle;
986
987 do_recycle = 0;
988 spin_lock(&sid_lock);
989 if (dirty_space_ids > RECYCLE_THRESHOLD) {
2fd83038 990 BUG_ON(recycle_inuse); /* FIXME: Use a semaphore/wait queue here */
1da177e4
LT
991 get_dirty_sids(&recycle_ndirty,recycle_dirty_array);
992 recycle_inuse++;
993 do_recycle++;
994 }
995 spin_unlock(&sid_lock);
ce33941f 996 on_each_cpu(flush_tlb_all_local, NULL, 1, 1);
1da177e4
LT
997 if (do_recycle) {
998 spin_lock(&sid_lock);
999 recycle_sids(recycle_ndirty,recycle_dirty_array);
1000 recycle_inuse = 0;
1001 spin_unlock(&sid_lock);
1002 }
1003}
1004#else
1005void flush_tlb_all(void)
1006{
1007 spin_lock(&sid_lock);
1b2425e3 1008 flush_tlb_all_local(NULL);
1da177e4
LT
1009 recycle_sids();
1010 spin_unlock(&sid_lock);
1011}
1012#endif
1013
1014#ifdef CONFIG_BLK_DEV_INITRD
1015void free_initrd_mem(unsigned long start, unsigned long end)
1016{
94c3e87a
HD
1017 if (start >= end)
1018 return;
1019 printk(KERN_INFO "Freeing initrd memory: %ldk freed\n", (end - start) >> 10);
1da177e4
LT
1020 for (; start < end; start += PAGE_SIZE) {
1021 ClearPageReserved(virt_to_page(start));
7835e98b 1022 init_page_count(virt_to_page(start));
1da177e4
LT
1023 free_page(start);
1024 num_physpages++;
1025 totalram_pages++;
1026 }
1da177e4
LT
1027}
1028#endif