1/*
2 *  Extracted from arch/m68k/kernel/setup.c.
3 *  Should be properly generalized and put somewhere else.
4 *                              Jesper
5 */
6
7#include <linux/types.h>
8#include <linux/kernel.h>
9#include <linux/string.h>
10#include <linux/init.h>
11
12#include <asm/setup.h>
13#include <asm/bootinfo.h>
14
15extern char cmd_line[CL_SIZE];
16
17extern int num_memory;
18extern int m68k_realnum_memory;
19extern struct mem_info memory[NUM_MEMINFO];
20extern struct mem_info m68k_memory[NUM_MEMINFO];
21extern struct mem_info ramdisk;
22
23extern int amiga_parse_bootinfo(const struct bi_record *);
24extern int atari_parse_bootinfo(const struct bi_record *);
25extern int mac_parse_bootinfo(const struct bi_record *);
26
27void __init parse_bootinfo(const struct bi_record *record)
28{
29    while (record->tag != BI_LAST) {
30	int unknown = 0;
31	const u_long *data = record->data;
32	switch (record->tag) {
33	    case BI_MACHTYPE:
34	    case BI_CPUTYPE:
35	    case BI_FPUTYPE:
36	    case BI_MMUTYPE:
37		/* Already set up by head.S */
38		break;
39
40	    case BI_MEMCHUNK:
41		if (num_memory < NUM_MEMINFO) {
42		    memory[num_memory].addr = data[0];
43		    memory[num_memory].size = data[1];
44		    num_memory++;
45
46		    m68k_memory[m68k_realnum_memory].addr = data[0];
47		    m68k_memory[m68k_realnum_memory].size = data[1];
48		    m68k_realnum_memory++;
49		} else
50		    printk("parse_bootinfo: too many memory chunks\n");
51		break;
52
53	    case BI_RAMDISK:
54		ramdisk.addr = data[0];
55		ramdisk.size = data[1];
56		break;
57
58	    case BI_COMMAND_LINE:
59		strlcpy(cmd_line, (const char *)data, sizeof(cmd_line));
60		break;
61
62	    default:
63		if (MACH_IS_AMIGA)
64		    unknown = amiga_parse_bootinfo(record);
65		else if (MACH_IS_ATARI)
66		    unknown = atari_parse_bootinfo(record);
67		else if (MACH_IS_MAC)
68		    unknown = mac_parse_bootinfo(record);
69		else
70		    unknown = 1;
71	}
72	if (unknown)
73	    printk("parse_bootinfo: unknown tag 0x%04x ignored\n",
74		   record->tag);
75	record = (struct bi_record *)((u_long)record+record->size);
76    }
77}
78