diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /arch/m68k/kernel/setup.c |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'arch/m68k/kernel/setup.c')
-rw-r--r-- | arch/m68k/kernel/setup.c | 545 |
1 files changed, 545 insertions, 0 deletions
diff --git a/arch/m68k/kernel/setup.c b/arch/m68k/kernel/setup.c new file mode 100644 index 000000000000..d6ca99242e5a --- /dev/null +++ b/arch/m68k/kernel/setup.c | |||
@@ -0,0 +1,545 @@ | |||
1 | /* | ||
2 | * linux/arch/m68k/kernel/setup.c | ||
3 | * | ||
4 | * Copyright (C) 1995 Hamish Macdonald | ||
5 | */ | ||
6 | |||
7 | /* | ||
8 | * This file handles the architecture-dependent parts of system setup | ||
9 | */ | ||
10 | |||
11 | #include <linux/config.h> | ||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/mm.h> | ||
14 | #include <linux/sched.h> | ||
15 | #include <linux/delay.h> | ||
16 | #include <linux/interrupt.h> | ||
17 | #include <linux/fs.h> | ||
18 | #include <linux/console.h> | ||
19 | #include <linux/genhd.h> | ||
20 | #include <linux/errno.h> | ||
21 | #include <linux/string.h> | ||
22 | #include <linux/init.h> | ||
23 | #include <linux/bootmem.h> | ||
24 | #include <linux/seq_file.h> | ||
25 | #include <linux/module.h> | ||
26 | #include <linux/initrd.h> | ||
27 | |||
28 | #include <asm/bootinfo.h> | ||
29 | #include <asm/setup.h> | ||
30 | #include <asm/irq.h> | ||
31 | #include <asm/io.h> | ||
32 | #include <asm/machdep.h> | ||
33 | #ifdef CONFIG_AMIGA | ||
34 | #include <asm/amigahw.h> | ||
35 | #endif | ||
36 | #ifdef CONFIG_ATARI | ||
37 | #include <asm/atarihw.h> | ||
38 | #include <asm/atari_stram.h> | ||
39 | #endif | ||
40 | #ifdef CONFIG_SUN3X | ||
41 | #include <asm/dvma.h> | ||
42 | #endif | ||
43 | |||
44 | unsigned long m68k_machtype; | ||
45 | unsigned long m68k_cputype; | ||
46 | unsigned long m68k_fputype; | ||
47 | unsigned long m68k_mmutype; | ||
48 | #ifdef CONFIG_VME | ||
49 | unsigned long vme_brdtype; | ||
50 | #endif | ||
51 | |||
52 | int m68k_is040or060; | ||
53 | |||
54 | extern int end; | ||
55 | extern unsigned long availmem; | ||
56 | |||
57 | int m68k_num_memory; | ||
58 | int m68k_realnum_memory; | ||
59 | unsigned long m68k_memoffset; | ||
60 | struct mem_info m68k_memory[NUM_MEMINFO]; | ||
61 | |||
62 | static struct mem_info m68k_ramdisk; | ||
63 | |||
64 | static char m68k_command_line[CL_SIZE]; | ||
65 | |||
66 | char m68k_debug_device[6] = ""; | ||
67 | |||
68 | void (*mach_sched_init) (irqreturn_t (*handler)(int, void *, struct pt_regs *)) __initdata = NULL; | ||
69 | /* machine dependent irq functions */ | ||
70 | void (*mach_init_IRQ) (void) __initdata = NULL; | ||
71 | irqreturn_t (*(*mach_default_handler)[]) (int, void *, struct pt_regs *); | ||
72 | void (*mach_get_model) (char *model); | ||
73 | int (*mach_get_hardware_list) (char *buffer); | ||
74 | int (*mach_get_irq_list) (struct seq_file *, void *); | ||
75 | irqreturn_t (*mach_process_int) (int, struct pt_regs *); | ||
76 | /* machine dependent timer functions */ | ||
77 | unsigned long (*mach_gettimeoffset) (void); | ||
78 | int (*mach_hwclk) (int, struct rtc_time*); | ||
79 | int (*mach_set_clock_mmss) (unsigned long); | ||
80 | unsigned int (*mach_get_ss)(void); | ||
81 | int (*mach_get_rtc_pll)(struct rtc_pll_info *); | ||
82 | int (*mach_set_rtc_pll)(struct rtc_pll_info *); | ||
83 | void (*mach_reset)( void ); | ||
84 | void (*mach_halt)( void ); | ||
85 | void (*mach_power_off)( void ); | ||
86 | long mach_max_dma_address = 0x00ffffff; /* default set to the lower 16MB */ | ||
87 | #if defined(CONFIG_AMIGA_FLOPPY) || defined(CONFIG_ATARI_FLOPPY) | ||
88 | void (*mach_floppy_setup) (char *, int *) __initdata = NULL; | ||
89 | #endif | ||
90 | #ifdef CONFIG_HEARTBEAT | ||
91 | void (*mach_heartbeat) (int); | ||
92 | EXPORT_SYMBOL(mach_heartbeat); | ||
93 | #endif | ||
94 | #ifdef CONFIG_M68K_L2_CACHE | ||
95 | void (*mach_l2_flush) (int); | ||
96 | #endif | ||
97 | #if defined(CONFIG_INPUT_M68K_BEEP) || defined(CONFIG_INPUT_M68K_BEEP_MODULE) | ||
98 | void (*mach_beep)(unsigned int, unsigned int); | ||
99 | #endif | ||
100 | #if defined(CONFIG_ISA) && defined(MULTI_ISA) | ||
101 | int isa_type; | ||
102 | int isa_sex; | ||
103 | #endif | ||
104 | |||
105 | extern int amiga_parse_bootinfo(const struct bi_record *); | ||
106 | extern int atari_parse_bootinfo(const struct bi_record *); | ||
107 | extern int mac_parse_bootinfo(const struct bi_record *); | ||
108 | extern int q40_parse_bootinfo(const struct bi_record *); | ||
109 | extern int bvme6000_parse_bootinfo(const struct bi_record *); | ||
110 | extern int mvme16x_parse_bootinfo(const struct bi_record *); | ||
111 | extern int mvme147_parse_bootinfo(const struct bi_record *); | ||
112 | extern int hp300_parse_bootinfo(const struct bi_record *); | ||
113 | |||
114 | extern void config_amiga(void); | ||
115 | extern void config_atari(void); | ||
116 | extern void config_mac(void); | ||
117 | extern void config_sun3(void); | ||
118 | extern void config_apollo(void); | ||
119 | extern void config_mvme147(void); | ||
120 | extern void config_mvme16x(void); | ||
121 | extern void config_bvme6000(void); | ||
122 | extern void config_hp300(void); | ||
123 | extern void config_q40(void); | ||
124 | extern void config_sun3x(void); | ||
125 | |||
126 | extern void mac_debugging_short (int, short); | ||
127 | extern void mac_debugging_long (int, long); | ||
128 | |||
129 | #define MASK_256K 0xfffc0000 | ||
130 | |||
131 | extern void paging_init(void); | ||
132 | |||
133 | static void __init m68k_parse_bootinfo(const struct bi_record *record) | ||
134 | { | ||
135 | while (record->tag != BI_LAST) { | ||
136 | int unknown = 0; | ||
137 | const unsigned long *data = record->data; | ||
138 | switch (record->tag) { | ||
139 | case BI_MACHTYPE: | ||
140 | case BI_CPUTYPE: | ||
141 | case BI_FPUTYPE: | ||
142 | case BI_MMUTYPE: | ||
143 | /* Already set up by head.S */ | ||
144 | break; | ||
145 | |||
146 | case BI_MEMCHUNK: | ||
147 | if (m68k_num_memory < NUM_MEMINFO) { | ||
148 | m68k_memory[m68k_num_memory].addr = data[0]; | ||
149 | m68k_memory[m68k_num_memory].size = data[1]; | ||
150 | m68k_num_memory++; | ||
151 | } else | ||
152 | printk("m68k_parse_bootinfo: too many memory chunks\n"); | ||
153 | break; | ||
154 | |||
155 | case BI_RAMDISK: | ||
156 | m68k_ramdisk.addr = data[0]; | ||
157 | m68k_ramdisk.size = data[1]; | ||
158 | break; | ||
159 | |||
160 | case BI_COMMAND_LINE: | ||
161 | strlcpy(m68k_command_line, (const char *)data, sizeof(m68k_command_line)); | ||
162 | break; | ||
163 | |||
164 | default: | ||
165 | if (MACH_IS_AMIGA) | ||
166 | unknown = amiga_parse_bootinfo(record); | ||
167 | else if (MACH_IS_ATARI) | ||
168 | unknown = atari_parse_bootinfo(record); | ||
169 | else if (MACH_IS_MAC) | ||
170 | unknown = mac_parse_bootinfo(record); | ||
171 | else if (MACH_IS_Q40) | ||
172 | unknown = q40_parse_bootinfo(record); | ||
173 | else if (MACH_IS_BVME6000) | ||
174 | unknown = bvme6000_parse_bootinfo(record); | ||
175 | else if (MACH_IS_MVME16x) | ||
176 | unknown = mvme16x_parse_bootinfo(record); | ||
177 | else if (MACH_IS_MVME147) | ||
178 | unknown = mvme147_parse_bootinfo(record); | ||
179 | else if (MACH_IS_HP300) | ||
180 | unknown = hp300_parse_bootinfo(record); | ||
181 | else | ||
182 | unknown = 1; | ||
183 | } | ||
184 | if (unknown) | ||
185 | printk("m68k_parse_bootinfo: unknown tag 0x%04x ignored\n", | ||
186 | record->tag); | ||
187 | record = (struct bi_record *)((unsigned long)record+record->size); | ||
188 | } | ||
189 | |||
190 | m68k_realnum_memory = m68k_num_memory; | ||
191 | #ifdef CONFIG_SINGLE_MEMORY_CHUNK | ||
192 | if (m68k_num_memory > 1) { | ||
193 | printk("Ignoring last %i chunks of physical memory\n", | ||
194 | (m68k_num_memory - 1)); | ||
195 | m68k_num_memory = 1; | ||
196 | } | ||
197 | m68k_memoffset = m68k_memory[0].addr-PAGE_OFFSET; | ||
198 | #endif | ||
199 | } | ||
200 | |||
201 | void __init setup_arch(char **cmdline_p) | ||
202 | { | ||
203 | extern int _etext, _edata, _end; | ||
204 | #ifndef CONFIG_SUN3 | ||
205 | unsigned long endmem, startmem; | ||
206 | #endif | ||
207 | int i; | ||
208 | char *p, *q; | ||
209 | |||
210 | /* The bootinfo is located right after the kernel bss */ | ||
211 | m68k_parse_bootinfo((const struct bi_record *)&_end); | ||
212 | |||
213 | if (CPU_IS_040) | ||
214 | m68k_is040or060 = 4; | ||
215 | else if (CPU_IS_060) | ||
216 | m68k_is040or060 = 6; | ||
217 | |||
218 | /* FIXME: m68k_fputype is passed in by Penguin booter, which can | ||
219 | * be confused by software FPU emulation. BEWARE. | ||
220 | * We should really do our own FPU check at startup. | ||
221 | * [what do we do with buggy 68LC040s? if we have problems | ||
222 | * with them, we should add a test to check_bugs() below] */ | ||
223 | #ifndef CONFIG_M68KFPU_EMU_ONLY | ||
224 | /* clear the fpu if we have one */ | ||
225 | if (m68k_fputype & (FPU_68881|FPU_68882|FPU_68040|FPU_68060)) { | ||
226 | volatile int zero = 0; | ||
227 | asm __volatile__ ("frestore %0" : : "m" (zero)); | ||
228 | } | ||
229 | #endif | ||
230 | |||
231 | if (CPU_IS_060) { | ||
232 | u32 pcr; | ||
233 | |||
234 | asm (".chip 68060; movec %%pcr,%0; .chip 68k" | ||
235 | : "=d" (pcr)); | ||
236 | if (((pcr >> 8) & 0xff) <= 5) { | ||
237 | printk("Enabling workaround for errata I14\n"); | ||
238 | asm (".chip 68060; movec %0,%%pcr; .chip 68k" | ||
239 | : : "d" (pcr | 0x20)); | ||
240 | } | ||
241 | } | ||
242 | |||
243 | init_mm.start_code = PAGE_OFFSET; | ||
244 | init_mm.end_code = (unsigned long) &_etext; | ||
245 | init_mm.end_data = (unsigned long) &_edata; | ||
246 | init_mm.brk = (unsigned long) &_end; | ||
247 | |||
248 | *cmdline_p = m68k_command_line; | ||
249 | memcpy(saved_command_line, *cmdline_p, CL_SIZE); | ||
250 | |||
251 | /* Parse the command line for arch-specific options. | ||
252 | * For the m68k, this is currently only "debug=xxx" to enable printing | ||
253 | * certain kernel messages to some machine-specific device. | ||
254 | */ | ||
255 | for( p = *cmdline_p; p && *p; ) { | ||
256 | i = 0; | ||
257 | if (!strncmp( p, "debug=", 6 )) { | ||
258 | strlcpy( m68k_debug_device, p+6, sizeof(m68k_debug_device) ); | ||
259 | if ((q = strchr( m68k_debug_device, ' ' ))) *q = 0; | ||
260 | i = 1; | ||
261 | } | ||
262 | #ifdef CONFIG_ATARI | ||
263 | /* This option must be parsed very early */ | ||
264 | if (!strncmp( p, "switches=", 9 )) { | ||
265 | extern void atari_switches_setup( const char *, int ); | ||
266 | atari_switches_setup( p+9, (q = strchr( p+9, ' ' )) ? | ||
267 | (q - (p+9)) : strlen(p+9) ); | ||
268 | i = 1; | ||
269 | } | ||
270 | #endif | ||
271 | |||
272 | if (i) { | ||
273 | /* option processed, delete it */ | ||
274 | if ((q = strchr( p, ' ' ))) | ||
275 | strcpy( p, q+1 ); | ||
276 | else | ||
277 | *p = 0; | ||
278 | } else { | ||
279 | if ((p = strchr( p, ' ' ))) ++p; | ||
280 | } | ||
281 | } | ||
282 | |||
283 | switch (m68k_machtype) { | ||
284 | #ifdef CONFIG_AMIGA | ||
285 | case MACH_AMIGA: | ||
286 | config_amiga(); | ||
287 | break; | ||
288 | #endif | ||
289 | #ifdef CONFIG_ATARI | ||
290 | case MACH_ATARI: | ||
291 | config_atari(); | ||
292 | break; | ||
293 | #endif | ||
294 | #ifdef CONFIG_MAC | ||
295 | case MACH_MAC: | ||
296 | config_mac(); | ||
297 | break; | ||
298 | #endif | ||
299 | #ifdef CONFIG_SUN3 | ||
300 | case MACH_SUN3: | ||
301 | config_sun3(); | ||
302 | break; | ||
303 | #endif | ||
304 | #ifdef CONFIG_APOLLO | ||
305 | case MACH_APOLLO: | ||
306 | config_apollo(); | ||
307 | break; | ||
308 | #endif | ||
309 | #ifdef CONFIG_MVME147 | ||
310 | case MACH_MVME147: | ||
311 | config_mvme147(); | ||
312 | break; | ||
313 | #endif | ||
314 | #ifdef CONFIG_MVME16x | ||
315 | case MACH_MVME16x: | ||
316 | config_mvme16x(); | ||
317 | break; | ||
318 | #endif | ||
319 | #ifdef CONFIG_BVME6000 | ||
320 | case MACH_BVME6000: | ||
321 | config_bvme6000(); | ||
322 | break; | ||
323 | #endif | ||
324 | #ifdef CONFIG_HP300 | ||
325 | case MACH_HP300: | ||
326 | config_hp300(); | ||
327 | break; | ||
328 | #endif | ||
329 | #ifdef CONFIG_Q40 | ||
330 | case MACH_Q40: | ||
331 | config_q40(); | ||
332 | break; | ||
333 | #endif | ||
334 | #ifdef CONFIG_SUN3X | ||
335 | case MACH_SUN3X: | ||
336 | config_sun3x(); | ||
337 | break; | ||
338 | #endif | ||
339 | default: | ||
340 | panic ("No configuration setup"); | ||
341 | } | ||
342 | |||
343 | #ifndef CONFIG_SUN3 | ||
344 | startmem= m68k_memory[0].addr; | ||
345 | endmem = startmem + m68k_memory[0].size; | ||
346 | high_memory = (void *)PAGE_OFFSET; | ||
347 | for (i = 0; i < m68k_num_memory; i++) { | ||
348 | m68k_memory[i].size &= MASK_256K; | ||
349 | if (m68k_memory[i].addr < startmem) | ||
350 | startmem = m68k_memory[i].addr; | ||
351 | if (m68k_memory[i].addr+m68k_memory[i].size > endmem) | ||
352 | endmem = m68k_memory[i].addr+m68k_memory[i].size; | ||
353 | high_memory += m68k_memory[i].size; | ||
354 | } | ||
355 | |||
356 | availmem += init_bootmem_node(NODE_DATA(0), availmem >> PAGE_SHIFT, | ||
357 | startmem >> PAGE_SHIFT, endmem >> PAGE_SHIFT); | ||
358 | |||
359 | for (i = 0; i < m68k_num_memory; i++) | ||
360 | free_bootmem(m68k_memory[i].addr, m68k_memory[i].size); | ||
361 | |||
362 | reserve_bootmem(m68k_memory[0].addr, availmem - m68k_memory[0].addr); | ||
363 | |||
364 | #ifdef CONFIG_BLK_DEV_INITRD | ||
365 | if (m68k_ramdisk.size) { | ||
366 | reserve_bootmem(m68k_ramdisk.addr, m68k_ramdisk.size); | ||
367 | initrd_start = (unsigned long)phys_to_virt(m68k_ramdisk.addr); | ||
368 | initrd_end = initrd_start + m68k_ramdisk.size; | ||
369 | printk ("initrd: %08lx - %08lx\n", initrd_start, initrd_end); | ||
370 | } | ||
371 | #endif | ||
372 | |||
373 | #ifdef CONFIG_ATARI | ||
374 | if (MACH_IS_ATARI) | ||
375 | atari_stram_reserve_pages((void *)availmem); | ||
376 | #endif | ||
377 | #ifdef CONFIG_SUN3X | ||
378 | if (MACH_IS_SUN3X) { | ||
379 | dvma_init(); | ||
380 | } | ||
381 | #endif | ||
382 | |||
383 | #endif /* !CONFIG_SUN3 */ | ||
384 | |||
385 | paging_init(); | ||
386 | |||
387 | /* set ISA defs early as possible */ | ||
388 | #if defined(CONFIG_ISA) && defined(MULTI_ISA) | ||
389 | #if defined(CONFIG_Q40) | ||
390 | if (MACH_IS_Q40) { | ||
391 | isa_type = Q40_ISA; | ||
392 | isa_sex = 0; | ||
393 | } | ||
394 | #elif defined(CONFIG_GG2) | ||
395 | if (MACH_IS_AMIGA && AMIGAHW_PRESENT(GG2_ISA)){ | ||
396 | isa_type = GG2_ISA; | ||
397 | isa_sex = 0; | ||
398 | } | ||
399 | #elif defined(CONFIG_AMIGA_PCMCIA) | ||
400 | if (MACH_IS_AMIGA && AMIGAHW_PRESENT(PCMCIA)){ | ||
401 | isa_type = AG_ISA; | ||
402 | isa_sex = 1; | ||
403 | } | ||
404 | #endif | ||
405 | #endif | ||
406 | } | ||
407 | |||
408 | static int show_cpuinfo(struct seq_file *m, void *v) | ||
409 | { | ||
410 | const char *cpu, *mmu, *fpu; | ||
411 | unsigned long clockfreq, clockfactor; | ||
412 | |||
413 | #define LOOP_CYCLES_68020 (8) | ||
414 | #define LOOP_CYCLES_68030 (8) | ||
415 | #define LOOP_CYCLES_68040 (3) | ||
416 | #define LOOP_CYCLES_68060 (1) | ||
417 | |||
418 | if (CPU_IS_020) { | ||
419 | cpu = "68020"; | ||
420 | clockfactor = LOOP_CYCLES_68020; | ||
421 | } else if (CPU_IS_030) { | ||
422 | cpu = "68030"; | ||
423 | clockfactor = LOOP_CYCLES_68030; | ||
424 | } else if (CPU_IS_040) { | ||
425 | cpu = "68040"; | ||
426 | clockfactor = LOOP_CYCLES_68040; | ||
427 | } else if (CPU_IS_060) { | ||
428 | cpu = "68060"; | ||
429 | clockfactor = LOOP_CYCLES_68060; | ||
430 | } else { | ||
431 | cpu = "680x0"; | ||
432 | clockfactor = 0; | ||
433 | } | ||
434 | |||
435 | #ifdef CONFIG_M68KFPU_EMU_ONLY | ||
436 | fpu="none(soft float)"; | ||
437 | #else | ||
438 | if (m68k_fputype & FPU_68881) | ||
439 | fpu = "68881"; | ||
440 | else if (m68k_fputype & FPU_68882) | ||
441 | fpu = "68882"; | ||
442 | else if (m68k_fputype & FPU_68040) | ||
443 | fpu = "68040"; | ||
444 | else if (m68k_fputype & FPU_68060) | ||
445 | fpu = "68060"; | ||
446 | else if (m68k_fputype & FPU_SUNFPA) | ||
447 | fpu = "Sun FPA"; | ||
448 | else | ||
449 | fpu = "none"; | ||
450 | #endif | ||
451 | |||
452 | if (m68k_mmutype & MMU_68851) | ||
453 | mmu = "68851"; | ||
454 | else if (m68k_mmutype & MMU_68030) | ||
455 | mmu = "68030"; | ||
456 | else if (m68k_mmutype & MMU_68040) | ||
457 | mmu = "68040"; | ||
458 | else if (m68k_mmutype & MMU_68060) | ||
459 | mmu = "68060"; | ||
460 | else if (m68k_mmutype & MMU_SUN3) | ||
461 | mmu = "Sun-3"; | ||
462 | else if (m68k_mmutype & MMU_APOLLO) | ||
463 | mmu = "Apollo"; | ||
464 | else | ||
465 | mmu = "unknown"; | ||
466 | |||
467 | clockfreq = loops_per_jiffy*HZ*clockfactor; | ||
468 | |||
469 | seq_printf(m, "CPU:\t\t%s\n" | ||
470 | "MMU:\t\t%s\n" | ||
471 | "FPU:\t\t%s\n" | ||
472 | "Clocking:\t%lu.%1luMHz\n" | ||
473 | "BogoMips:\t%lu.%02lu\n" | ||
474 | "Calibration:\t%lu loops\n", | ||
475 | cpu, mmu, fpu, | ||
476 | clockfreq/1000000,(clockfreq/100000)%10, | ||
477 | loops_per_jiffy/(500000/HZ),(loops_per_jiffy/(5000/HZ))%100, | ||
478 | loops_per_jiffy); | ||
479 | return 0; | ||
480 | } | ||
481 | |||
482 | static void *c_start(struct seq_file *m, loff_t *pos) | ||
483 | { | ||
484 | return *pos < 1 ? (void *)1 : NULL; | ||
485 | } | ||
486 | static void *c_next(struct seq_file *m, void *v, loff_t *pos) | ||
487 | { | ||
488 | ++*pos; | ||
489 | return NULL; | ||
490 | } | ||
491 | static void c_stop(struct seq_file *m, void *v) | ||
492 | { | ||
493 | } | ||
494 | struct seq_operations cpuinfo_op = { | ||
495 | .start = c_start, | ||
496 | .next = c_next, | ||
497 | .stop = c_stop, | ||
498 | .show = show_cpuinfo, | ||
499 | }; | ||
500 | |||
501 | int get_hardware_list(char *buffer) | ||
502 | { | ||
503 | int len = 0; | ||
504 | char model[80]; | ||
505 | unsigned long mem; | ||
506 | int i; | ||
507 | |||
508 | if (mach_get_model) | ||
509 | mach_get_model(model); | ||
510 | else | ||
511 | strcpy(model, "Unknown m68k"); | ||
512 | |||
513 | len += sprintf(buffer+len, "Model:\t\t%s\n", model); | ||
514 | for (mem = 0, i = 0; i < m68k_num_memory; i++) | ||
515 | mem += m68k_memory[i].size; | ||
516 | len += sprintf(buffer+len, "System Memory:\t%ldK\n", mem>>10); | ||
517 | |||
518 | if (mach_get_hardware_list) | ||
519 | len += mach_get_hardware_list(buffer+len); | ||
520 | |||
521 | return(len); | ||
522 | } | ||
523 | |||
524 | |||
525 | #if defined(CONFIG_AMIGA_FLOPPY) || defined(CONFIG_ATARI_FLOPPY) | ||
526 | void __init floppy_setup(char *str, int *ints) | ||
527 | { | ||
528 | if (mach_floppy_setup) | ||
529 | mach_floppy_setup (str, ints); | ||
530 | } | ||
531 | |||
532 | #endif | ||
533 | |||
534 | void check_bugs(void) | ||
535 | { | ||
536 | #ifndef CONFIG_M68KFPU_EMU | ||
537 | if (m68k_fputype == 0) { | ||
538 | printk( KERN_EMERG "*** YOU DO NOT HAVE A FLOATING POINT UNIT, " | ||
539 | "WHICH IS REQUIRED BY LINUX/M68K ***\n" ); | ||
540 | printk( KERN_EMERG "Upgrade your hardware or join the FPU " | ||
541 | "emulation project\n" ); | ||
542 | panic( "no FPU" ); | ||
543 | } | ||
544 | #endif /* !CONFIG_M68KFPU_EMU */ | ||
545 | } | ||