[libtapi]
[openwrt/svn-archive/archive.git] / target / linux / ifxmips / files / arch / mips / ifxmips / common / prom.c
1 #include <linux/init.h>
2 #include <linux/module.h>
3 #include <linux/bootmem.h>
4 #include <linux/etherdevice.h>
5
6 #include <asm/bootinfo.h>
7 #include <machine.h>
8
9 #include <ifxmips.h>
10 #include <ifxmips_prom.h>
11
12 /* for Multithreading (APRP) on MIPS34K */
13 unsigned long physical_memsize;
14
15 void
16 prom_free_prom_memory(void)
17 {
18 }
19
20 extern unsigned char ifxmips_ethaddr[6];
21 int cmdline_mac = 0;
22
23 static int __init
24 ifxmips_set_ethaddr(char *str)
25 {
26 #define IS_HEX(x) \
27 (((x >= '0' && x <= '9') || (x >= 'a' && x <= 'f') \
28 || (x >= 'A' && x <= 'F')) ? (1) : (0))
29 int i;
30 str = strchr(str, '=');
31 if (!str)
32 goto out;
33 str++;
34 if (strlen(str) != 17)
35 goto out;
36 for (i = 0; i < 6; i++) {
37 if (!IS_HEX(str[3 * i]) || !IS_HEX(str[(3 * i) + 1]))
38 goto out;
39 if ((i != 5) && (str[(3 * i) + 2] != ':'))
40 goto out;
41 ifxmips_ethaddr[i] = simple_strtoul(&str[3 * i], NULL, 16);
42 }
43 if (is_valid_ether_addr(ifxmips_ethaddr))
44 cmdline_mac = 1;
45 out:
46 return 1;
47 }
48 __setup("ethaddr", ifxmips_set_ethaddr);
49
50 static void __init prom_detect_machtype(void)
51 {
52 mips_machtype = IFXMIPS_MACH_EASY50712;
53 }
54
55 static void __init prom_init_cmdline(void)
56 {
57 int argc = fw_arg0;
58 char **argv = (char **) fw_arg1;
59 char **envp = (char **) fw_arg2;
60
61 int memsize = 16; /* assume 16M as default */
62 int i;
63
64 if (argc)
65 {
66 argv = (char **)KSEG1ADDR((unsigned long)argv);
67 arcs_cmdline[0] = '\0';
68 for (i = 1; i < argc; i++)
69 {
70 char *a = (char *)KSEG1ADDR(argv[i]);
71 if (!argv[i])
72 continue;
73 if (strlen(arcs_cmdline) + strlen(a + 1) >= sizeof(arcs_cmdline))
74 {
75 printk("cmdline overflow, skipping: %s\n", a);
76 break;
77 }
78 strcat(arcs_cmdline, a);
79 strcat(arcs_cmdline, " ");
80 }
81 if (!*arcs_cmdline)
82 strcpy(&(arcs_cmdline[0]),
83 "console=ttyS0,115200 rootfstype=squashfs,jffs2");
84 }
85 envp = (char **)KSEG1ADDR((unsigned long)envp);
86 while (*envp)
87 {
88 char *e = (char *)KSEG1ADDR(*envp);
89
90 if (!strncmp(e, "memsize=", 8))
91 {
92 e += 8;
93 memsize = simple_strtoul(e, NULL, 10);
94 }
95 envp++;
96 }
97 memsize *= 1024 * 1024;
98
99 add_memory_region(0x00000000, memsize, BOOT_MEM_RAM);
100 }
101
102 void __init
103 prom_init(void)
104 {
105 prom_detect_machtype();
106 prom_init_cmdline();
107 }