aboutsummaryrefslogtreecommitdiffstats
path: root/arch/i386
diff options
context:
space:
mode:
Diffstat (limited to 'arch/i386')
-rw-r--r--arch/i386/kernel/setup.c19
-rw-r--r--arch/i386/mach-default/setup.c43
-rw-r--r--arch/i386/mach-visws/setup.c49
-rw-r--r--arch/i386/mach-voyager/setup.c74
4 files changed, 171 insertions, 14 deletions
diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c
index e6023970aa40..6c1639836e06 100644
--- a/arch/i386/kernel/setup.c
+++ b/arch/i386/kernel/setup.c
@@ -61,7 +61,7 @@
61#include <asm/io_apic.h> 61#include <asm/io_apic.h>
62#include <asm/ist.h> 62#include <asm/ist.h>
63#include <asm/io.h> 63#include <asm/io.h>
64#include "setup_arch_pre.h" 64#include <setup_arch.h>
65#include <bios_ebda.h> 65#include <bios_ebda.h>
66 66
67/* Forward Declaration. */ 67/* Forward Declaration. */
@@ -411,8 +411,8 @@ static void __init limit_regions(unsigned long long size)
411 } 411 }
412} 412}
413 413
414static void __init add_memory_region(unsigned long long start, 414void __init add_memory_region(unsigned long long start,
415 unsigned long long size, int type) 415 unsigned long long size, int type)
416{ 416{
417 int x; 417 int x;
418 418
@@ -475,7 +475,7 @@ static struct change_member *change_point[2*E820MAX] __initdata;
475static struct e820entry *overlap_list[E820MAX] __initdata; 475static struct e820entry *overlap_list[E820MAX] __initdata;
476static struct e820entry new_bios[E820MAX] __initdata; 476static struct e820entry new_bios[E820MAX] __initdata;
477 477
478static int __init sanitize_e820_map(struct e820entry * biosmap, char * pnr_map) 478int __init sanitize_e820_map(struct e820entry * biosmap, char * pnr_map)
479{ 479{
480 struct change_member *change_tmp; 480 struct change_member *change_tmp;
481 unsigned long current_type, last_type; 481 unsigned long current_type, last_type;
@@ -644,7 +644,7 @@ static int __init sanitize_e820_map(struct e820entry * biosmap, char * pnr_map)
644 * thinkpad 560x, for example, does not cooperate with the memory 644 * thinkpad 560x, for example, does not cooperate with the memory
645 * detection code.) 645 * detection code.)
646 */ 646 */
647static int __init copy_e820_map(struct e820entry * biosmap, int nr_map) 647int __init copy_e820_map(struct e820entry * biosmap, int nr_map)
648{ 648{
649 /* Only one memory region (or negative)? Ignore it */ 649 /* Only one memory region (or negative)? Ignore it */
650 if (nr_map < 2) 650 if (nr_map < 2)
@@ -702,12 +702,6 @@ static inline void copy_edd(void)
702} 702}
703#endif 703#endif
704 704
705/*
706 * Do NOT EVER look at the BIOS memory size location.
707 * It does not work on many machines.
708 */
709#define LOWMEMSIZE() (0x9f000)
710
711static void __init parse_cmdline_early (char ** cmdline_p) 705static void __init parse_cmdline_early (char ** cmdline_p)
712{ 706{
713 char c = ' ', *to = command_line, *from = saved_command_line; 707 char c = ' ', *to = command_line, *from = saved_command_line;
@@ -1424,8 +1418,6 @@ static void __init register_memory(void)
1424 pci_mem_start, gapstart, gapsize); 1418 pci_mem_start, gapstart, gapsize);
1425} 1419}
1426 1420
1427static char * __init machine_specific_memory_setup(void);
1428
1429#ifdef CONFIG_MCA 1421#ifdef CONFIG_MCA
1430static void set_mca_bus(int x) 1422static void set_mca_bus(int x)
1431{ 1423{
@@ -1708,7 +1700,6 @@ static __init int add_pcspkr(void)
1708} 1700}
1709device_initcall(add_pcspkr); 1701device_initcall(add_pcspkr);
1710 1702
1711#include "setup_arch_post.h"
1712/* 1703/*
1713 * Local Variables: 1704 * Local Variables:
1714 * mode:c 1705 * mode:c
diff --git a/arch/i386/mach-default/setup.c b/arch/i386/mach-default/setup.c
index b4a7455c6993..004837c58793 100644
--- a/arch/i386/mach-default/setup.c
+++ b/arch/i386/mach-default/setup.c
@@ -8,6 +8,8 @@
8#include <linux/interrupt.h> 8#include <linux/interrupt.h>
9#include <asm/acpi.h> 9#include <asm/acpi.h>
10#include <asm/arch_hooks.h> 10#include <asm/arch_hooks.h>
11#include <asm/e820.h>
12#include <asm/setup.h>
11 13
12#ifdef CONFIG_HOTPLUG_CPU 14#ifdef CONFIG_HOTPLUG_CPU
13#define DEFAULT_SEND_IPI (1) 15#define DEFAULT_SEND_IPI (1)
@@ -130,3 +132,44 @@ static int __init print_ipi_mode(void)
130} 132}
131 133
132late_initcall(print_ipi_mode); 134late_initcall(print_ipi_mode);
135
136/**
137 * machine_specific_memory_setup - Hook for machine specific memory setup.
138 *
139 * Description:
140 * This is included late in kernel/setup.c so that it can make
141 * use of all of the static functions.
142 **/
143
144char * __init machine_specific_memory_setup(void)
145{
146 char *who;
147
148
149 who = "BIOS-e820";
150
151 /*
152 * Try to copy the BIOS-supplied E820-map.
153 *
154 * Otherwise fake a memory map; one section from 0k->640k,
155 * the next section from 1mb->appropriate_mem_k
156 */
157 sanitize_e820_map(E820_MAP, &E820_MAP_NR);
158 if (copy_e820_map(E820_MAP, E820_MAP_NR) < 0) {
159 unsigned long mem_size;
160
161 /* compare results from other methods and take the greater */
162 if (ALT_MEM_K < EXT_MEM_K) {
163 mem_size = EXT_MEM_K;
164 who = "BIOS-88";
165 } else {
166 mem_size = ALT_MEM_K;
167 who = "BIOS-e801";
168 }
169
170 e820.nr_map = 0;
171 add_memory_region(0, LOWMEMSIZE(), E820_RAM);
172 add_memory_region(HIGH_MEMORY, mem_size << 10, E820_RAM);
173 }
174 return who;
175}
diff --git a/arch/i386/mach-visws/setup.c b/arch/i386/mach-visws/setup.c
index 07fac7e749c7..8a9e1a6f745d 100644
--- a/arch/i386/mach-visws/setup.c
+++ b/arch/i386/mach-visws/setup.c
@@ -10,6 +10,8 @@
10#include <asm/fixmap.h> 10#include <asm/fixmap.h>
11#include <asm/arch_hooks.h> 11#include <asm/arch_hooks.h>
12#include <asm/io.h> 12#include <asm/io.h>
13#include <asm/e820.h>
14#include <asm/setup.h>
13#include "cobalt.h" 15#include "cobalt.h"
14#include "piix4.h" 16#include "piix4.h"
15 17
@@ -133,3 +135,50 @@ void __init time_init_hook(void)
133 /* Wire cpu IDT entry to s/w handler (and Cobalt APIC to IDT) */ 135 /* Wire cpu IDT entry to s/w handler (and Cobalt APIC to IDT) */
134 setup_irq(0, &irq0); 136 setup_irq(0, &irq0);
135} 137}
138
139/* Hook for machine specific memory setup. */
140
141#define MB (1024 * 1024)
142
143static unsigned long sgivwfb_mem_phys;
144static unsigned long sgivwfb_mem_size;
145
146long long mem_size __initdata = 0;
147
148char * __init machine_specific_memory_setup(void)
149{
150 long long gfx_mem_size = 8 * MB;
151
152 mem_size = ALT_MEM_K;
153
154 if (!mem_size) {
155 printk(KERN_WARNING "Bootloader didn't set memory size, upgrade it !\n");
156 mem_size = 128 * MB;
157 }
158
159 /*
160 * this hardcodes the graphics memory to 8 MB
161 * it really should be sized dynamically (or at least
162 * set as a boot param)
163 */
164 if (!sgivwfb_mem_size) {
165 printk(KERN_WARNING "Defaulting to 8 MB framebuffer size\n");
166 sgivwfb_mem_size = 8 * MB;
167 }
168
169 /*
170 * Trim to nearest MB
171 */
172 sgivwfb_mem_size &= ~((1 << 20) - 1);
173 sgivwfb_mem_phys = mem_size - gfx_mem_size;
174
175 add_memory_region(0, LOWMEMSIZE(), E820_RAM);
176 add_memory_region(HIGH_MEMORY, mem_size - sgivwfb_mem_size - HIGH_MEMORY, E820_RAM);
177 add_memory_region(sgivwfb_mem_phys, sgivwfb_mem_size, E820_RESERVED);
178
179 return "PROM";
180
181 /* Remove gcc warnings */
182 (void) sanitize_e820_map(NULL, NULL);
183 (void) copy_e820_map(NULL, 0);
184}
diff --git a/arch/i386/mach-voyager/setup.c b/arch/i386/mach-voyager/setup.c
index 7d8a3acb9441..0e225054e222 100644
--- a/arch/i386/mach-voyager/setup.c
+++ b/arch/i386/mach-voyager/setup.c
@@ -7,6 +7,9 @@
7#include <linux/interrupt.h> 7#include <linux/interrupt.h>
8#include <asm/acpi.h> 8#include <asm/acpi.h>
9#include <asm/arch_hooks.h> 9#include <asm/arch_hooks.h>
10#include <asm/voyager.h>
11#include <asm/e820.h>
12#include <asm/setup.h>
10 13
11void __init pre_intr_init_hook(void) 14void __init pre_intr_init_hook(void)
12{ 15{
@@ -45,3 +48,74 @@ void __init time_init_hook(void)
45{ 48{
46 setup_irq(0, &irq0); 49 setup_irq(0, &irq0);
47} 50}
51
52/* Hook for machine specific memory setup. */
53
54char * __init machine_specific_memory_setup(void)
55{
56 char *who;
57
58 who = "NOT VOYAGER";
59
60 if(voyager_level == 5) {
61 __u32 addr, length;
62 int i;
63
64 who = "Voyager-SUS";
65
66 e820.nr_map = 0;
67 for(i=0; voyager_memory_detect(i, &addr, &length); i++) {
68 add_memory_region(addr, length, E820_RAM);
69 }
70 return who;
71 } else if(voyager_level == 4) {
72 __u32 tom;
73 __u16 catbase = inb(VOYAGER_SSPB_RELOCATION_PORT)<<8;
74 /* select the DINO config space */
75 outb(VOYAGER_DINO, VOYAGER_CAT_CONFIG_PORT);
76 /* Read DINO top of memory register */
77 tom = ((inb(catbase + 0x4) & 0xf0) << 16)
78 + ((inb(catbase + 0x5) & 0x7f) << 24);
79
80 if(inb(catbase) != VOYAGER_DINO) {
81 printk(KERN_ERR "Voyager: Failed to get DINO for L4, setting tom to EXT_MEM_K\n");
82 tom = (EXT_MEM_K)<<10;
83 }
84 who = "Voyager-TOM";
85 add_memory_region(0, 0x9f000, E820_RAM);
86 /* map from 1M to top of memory */
87 add_memory_region(1*1024*1024, tom - 1*1024*1024, E820_RAM);
88 /* FIXME: Should check the ASICs to see if I need to
89 * take out the 8M window. Just do it at the moment
90 * */
91 add_memory_region(8*1024*1024, 8*1024*1024, E820_RESERVED);
92 return who;
93 }
94
95 who = "BIOS-e820";
96
97 /*
98 * Try to copy the BIOS-supplied E820-map.
99 *
100 * Otherwise fake a memory map; one section from 0k->640k,
101 * the next section from 1mb->appropriate_mem_k
102 */
103 sanitize_e820_map(E820_MAP, &E820_MAP_NR);
104 if (copy_e820_map(E820_MAP, E820_MAP_NR) < 0) {
105 unsigned long mem_size;
106
107 /* compare results from other methods and take the greater */
108 if (ALT_MEM_K < EXT_MEM_K) {
109 mem_size = EXT_MEM_K;
110 who = "BIOS-88";
111 } else {
112 mem_size = ALT_MEM_K;
113 who = "BIOS-e801";
114 }
115
116 e820.nr_map = 0;
117 add_memory_region(0, LOWMEMSIZE(), E820_RAM);
118 add_memory_region(HIGH_MEMORY, mem_size << 10, E820_RAM);
119 }
120 return who;
121}