ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / include / asm-i386 / mach-voyager / setup_arch_post.h
1 /* Hook for machine specific memory setup.
2  *
3  * This is included late in kernel/setup.c so that it can make use of all of
4  * the static functions. */
5
6 static inline char * __init machine_specific_memory_setup(void)
7 {
8         char *who;
9
10         who = "NOT VOYAGER";
11
12         if(voyager_level == 5) {
13                 __u32 addr, length;
14                 int i;
15
16                 who = "Voyager-SUS";
17
18                 e820.nr_map = 0;
19                 for(i=0; voyager_memory_detect(i, &addr, &length); i++) {
20                         add_memory_region(addr, length, E820_RAM);
21                 }
22                 return who;
23         } else if(voyager_level == 4) {
24                 __u32 tom;
25                 __u16 catbase = inb(VOYAGER_SSPB_RELOCATION_PORT)<<8;
26                 /* select the DINO config space */
27                 outb(VOYAGER_DINO, VOYAGER_CAT_CONFIG_PORT);
28                 /* Read DINO top of memory register */
29                 tom = ((inb(catbase + 0x4) & 0xf0) << 16)
30                         + ((inb(catbase + 0x5) & 0x7f) << 24);
31
32                 if(inb(catbase) != VOYAGER_DINO) {
33                         printk(KERN_ERR "Voyager: Failed to get DINO for L4, setting tom to EXT_MEM_K\n");
34                         tom = (EXT_MEM_K)<<10;
35                 }
36                 who = "Voyager-TOM";
37                 add_memory_region(0, 0x9f000, E820_RAM);
38                 /* map from 1M to top of memory */
39                 add_memory_region(1*1024*1024, tom - 1*1024*1024, E820_RAM);
40                 /* FIXME: Should check the ASICs to see if I need to
41                  * take out the 8M window.  Just do it at the moment
42                  * */
43                 add_memory_region(8*1024*1024, 8*1024*1024, E820_RESERVED);
44                 return who;
45         }
46
47         who = "BIOS-e820";
48
49         /*
50          * Try to copy the BIOS-supplied E820-map.
51          *
52          * Otherwise fake a memory map; one section from 0k->640k,
53          * the next section from 1mb->appropriate_mem_k
54          */
55         sanitize_e820_map(E820_MAP, &E820_MAP_NR);
56         if (copy_e820_map(E820_MAP, E820_MAP_NR) < 0) {
57                 unsigned long mem_size;
58
59                 /* compare results from other methods and take the greater */
60                 if (ALT_MEM_K < EXT_MEM_K) {
61                         mem_size = EXT_MEM_K;
62                         who = "BIOS-88";
63                 } else {
64                         mem_size = ALT_MEM_K;
65                         who = "BIOS-e801";
66                 }
67
68                 e820.nr_map = 0;
69                 add_memory_region(0, LOWMEMSIZE(), E820_RAM);
70                 add_memory_region(HIGH_MEMORY, mem_size << 10, E820_RAM);
71         }
72         return who;
73 }