xref: /openbmc/linux/arch/mips/fw/arc/cmdline.c (revision e190bfe5)
1 /*
2  * This file is subject to the terms and conditions of the GNU General Public
3  * License.  See the file "COPYING" in the main directory of this archive
4  * for more details.
5  *
6  * cmdline.c: Kernel command line creation using ARCS argc/argv.
7  *
8  * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
9  */
10 #include <linux/init.h>
11 #include <linux/kernel.h>
12 #include <linux/string.h>
13 
14 #include <asm/sgialib.h>
15 #include <asm/bootinfo.h>
16 
17 #undef DEBUG_CMDLINE
18 
19 static char *ignored[] = {
20 	"ConsoleIn=",
21 	"ConsoleOut=",
22 	"SystemPartition=",
23 	"OSLoader=",
24 	"OSLoadPartition=",
25 	"OSLoadFilename=",
26 	"OSLoadOptions="
27 };
28 
29 static char *used_arc[][2] = {
30 	{ "OSLoadPartition=", "root=" },
31 	{ "OSLoadOptions=", "" }
32 };
33 
34 static char * __init move_firmware_args(char* cp)
35 {
36 	char *s;
37 	int actr, i;
38 
39 	actr = 1; /* Always ignore argv[0] */
40 
41 	while (actr < prom_argc) {
42 		for(i = 0; i < ARRAY_SIZE(used_arc); i++) {
43 			int len = strlen(used_arc[i][0]);
44 
45 			if (!strncmp(prom_argv(actr), used_arc[i][0], len)) {
46 			/* Ok, we want it. First append the replacement... */
47 				strcat(cp, used_arc[i][1]);
48 				cp += strlen(used_arc[i][1]);
49 				/* ... and now the argument */
50 				s = strchr(prom_argv(actr), '=');
51 				if (s) {
52 					s++;
53 					strcpy(cp, s);
54 					cp += strlen(s);
55 				}
56 				*cp++ = ' ';
57 				break;
58 			}
59 		}
60 		actr++;
61 	}
62 
63 	return cp;
64 }
65 
66 void __init prom_init_cmdline(void)
67 {
68 	char *cp;
69 	int actr, i;
70 
71 	actr = 1; /* Always ignore argv[0] */
72 
73 	cp = arcs_cmdline;
74 	/*
75 	 * Move ARC variables to the beginning to make sure they can be
76 	 * overridden by later arguments.
77 	 */
78 	cp = move_firmware_args(cp);
79 
80 	while (actr < prom_argc) {
81 		for (i = 0; i < ARRAY_SIZE(ignored); i++) {
82 			int len = strlen(ignored[i]);
83 
84 			if (!strncmp(prom_argv(actr), ignored[i], len))
85 				goto pic_cont;
86 		}
87 		/* Ok, we want it. */
88 		strcpy(cp, prom_argv(actr));
89 		cp += strlen(prom_argv(actr));
90 		*cp++ = ' ';
91 
92 	pic_cont:
93 		actr++;
94 	}
95 
96 	if (cp != arcs_cmdline)		/* get rid of trailing space */
97 		--cp;
98 	*cp = '\0';
99 
100 #ifdef DEBUG_CMDLINE
101 	printk(KERN_DEBUG "prom cmdline: %s\n", arcs_cmdline);
102 #endif
103 }
104