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