1 #include <linux/init.h>
2 #include <linux/module.h>
3 #include <linux/bootmem.h>
4 #include <linux/etherdevice.h>
6 #include <asm/bootinfo.h>
10 #include <ifxmips_prom.h>
12 /* for voice cpu (MIPS24K) */
13 unsigned int *prom_cp1_base;
14 unsigned int prom_cp1_size;
16 /* for Multithreading (APRP) on MIPS34K */
17 unsigned long physical_memsize;
20 prom_free_prom_memory(void)
25 prom_get_cp1_base(void)
29 EXPORT_SYMBOL(prom_get_cp1_base);
32 prom_get_cp1_size(void)
34 /* return size im MB */
35 return prom_cp1_size>>20;
37 EXPORT_SYMBOL(prom_get_cp1_size);
39 extern unsigned char ifxmips_ethaddr[6];
43 ifxmips_set_ethaddr(char *str)
46 (((x >= '0' && x <= '9') || (x >= 'a' && x <= 'f') \
47 || (x >= 'A' && x <= 'F')) ? (1) : (0))
49 str = strchr(str, '=');
53 if (strlen(str) != 17)
55 for (i = 0; i < 6; i++) {
56 if (!IS_HEX(str[3 * i]) || !IS_HEX(str[(3 * i) + 1]))
58 if ((i != 5) && (str[(3 * i) + 2] != ':'))
60 ifxmips_ethaddr[i] = simple_strtoul(&str[3 * i], NULL, 16);
62 if (is_valid_ether_addr(ifxmips_ethaddr))
67 __setup("ethaddr", ifxmips_set_ethaddr);
69 static void __init prom_detect_machtype(void)
71 mips_machtype = IFXMIPS_MACH_EASY50712;
74 static void __init prom_init_cmdline(void)
77 char **argv = (char **) fw_arg1;
78 char **envp = (char **) fw_arg2;
80 int memsize = 16; /* assume 16M as default */
85 argv = (char **)KSEG1ADDR((unsigned long)argv);
86 arcs_cmdline[0] = '\0';
87 for (i = 1; i < argc; i++)
89 char *a = (char *)KSEG1ADDR(argv[i]);
92 /* for voice cpu on Twinpass/Danube */
93 if (cpu_data[0].cputype == CPU_24K)
94 if (!strncmp(a, "cp1_size=", 9))
96 prom_cp1_size = memparse(a + 9, &a);
99 if (strlen(arcs_cmdline) + strlen(a + 1) >= sizeof(arcs_cmdline))
101 early_printf("cmdline overflow, skipping: %s\n", a);
104 strcat(arcs_cmdline, a);
105 strcat(arcs_cmdline, " ");
108 strcpy(&(arcs_cmdline[0]),
109 "console=ttyS0,115200 rootfstype=squashfs,jffs2");
111 envp = (char **)KSEG1ADDR((unsigned long)envp);
114 char *e = (char *)KSEG1ADDR(*envp);
116 if (!strncmp(e, "memsize=", 8))
119 memsize = simple_strtoul(e, NULL, 10);
123 memsize *= 1024 * 1024;
125 /* only on Twinpass/Danube a second CPU is used for Voice */
126 if ((cpu_data[0].cputype == CPU_24K) && (prom_cp1_size))
128 memsize -= prom_cp1_size;
129 prom_cp1_base = (unsigned int *)KSEG1ADDR(memsize);
131 early_printf("Using %dMB Ram and reserving %dMB for cp1\n",
132 memsize>>20, prom_cp1_size>>20);
135 add_memory_region(0x00000000, memsize, BOOT_MEM_RAM);
141 prom_detect_machtype();