xref: /openbmc/linux/arch/mips/fw/arc/cmdline.c (revision c95baf12f5077419db01313ab61c2aac007d40cd)
12f56cfddSAurelien Jarno /*
22f56cfddSAurelien Jarno  * This file is subject to the terms and conditions of the GNU General Public
32f56cfddSAurelien Jarno  * License.  See the file "COPYING" in the main directory of this archive
42f56cfddSAurelien Jarno  * for more details.
52f56cfddSAurelien Jarno  *
62f56cfddSAurelien Jarno  * cmdline.c: Kernel command line creation using ARCS argc/argv.
72f56cfddSAurelien Jarno  *
879add627SJustin P. Mattock  * Copyright (C) 1996 David S. Miller (davem@davemloft.net)
92f56cfddSAurelien Jarno  */
1050af5eadSPaul Gortmaker #include <linux/bug.h>
112f56cfddSAurelien Jarno #include <linux/init.h>
122f56cfddSAurelien Jarno #include <linux/kernel.h>
132f56cfddSAurelien Jarno #include <linux/string.h>
142f56cfddSAurelien Jarno 
152f56cfddSAurelien Jarno #include <asm/sgialib.h>
162f56cfddSAurelien Jarno #include <asm/bootinfo.h>
172f56cfddSAurelien Jarno 
182f56cfddSAurelien Jarno #undef DEBUG_CMDLINE
192f56cfddSAurelien Jarno 
20*7b16831dSThomas Bogendoerfer /*
21*7b16831dSThomas Bogendoerfer  * A 32-bit ARC PROM pass arguments and environment as 32-bit pointer.
22*7b16831dSThomas Bogendoerfer  * These macro take care of sign extension.
23*7b16831dSThomas Bogendoerfer  */
24*7b16831dSThomas Bogendoerfer #define prom_argv(index) ((char *) (long)argv[(index)])
25*7b16831dSThomas Bogendoerfer 
262f56cfddSAurelien Jarno static char *ignored[] = {
272f56cfddSAurelien Jarno 	"ConsoleIn=",
282f56cfddSAurelien Jarno 	"ConsoleOut=",
292f56cfddSAurelien Jarno 	"SystemPartition=",
302f56cfddSAurelien Jarno 	"OSLoader=",
312f56cfddSAurelien Jarno 	"OSLoadPartition=",
322f56cfddSAurelien Jarno 	"OSLoadFilename=",
332f56cfddSAurelien Jarno 	"OSLoadOptions="
342f56cfddSAurelien Jarno };
352f56cfddSAurelien Jarno 
362f56cfddSAurelien Jarno static char *used_arc[][2] = {
372f56cfddSAurelien Jarno 	{ "OSLoadPartition=", "root=" },
382f56cfddSAurelien Jarno 	{ "OSLoadOptions=", "" }
392f56cfddSAurelien Jarno };
402f56cfddSAurelien Jarno 
move_firmware_args(int argc,LONG * argv,char * cp)41*7b16831dSThomas Bogendoerfer static char __init *move_firmware_args(int argc, LONG *argv, char *cp)
422f56cfddSAurelien Jarno {
432f56cfddSAurelien Jarno 	char *s;
442f56cfddSAurelien Jarno 	int actr, i;
452f56cfddSAurelien Jarno 
462f56cfddSAurelien Jarno 	actr = 1; /* Always ignore argv[0] */
472f56cfddSAurelien Jarno 
48*7b16831dSThomas Bogendoerfer 	while (actr < argc) {
492f56cfddSAurelien Jarno 		for(i = 0; i < ARRAY_SIZE(used_arc); i++) {
502f56cfddSAurelien Jarno 			int len = strlen(used_arc[i][0]);
512f56cfddSAurelien Jarno 
522f56cfddSAurelien Jarno 			if (!strncmp(prom_argv(actr), used_arc[i][0], len)) {
532f56cfddSAurelien Jarno 			/* Ok, we want it. First append the replacement... */
542f56cfddSAurelien Jarno 				strcat(cp, used_arc[i][1]);
552f56cfddSAurelien Jarno 				cp += strlen(used_arc[i][1]);
562f56cfddSAurelien Jarno 				/* ... and now the argument */
57fa09187cSRoel Kluin 				s = strchr(prom_argv(actr), '=');
582f56cfddSAurelien Jarno 				if (s) {
592f56cfddSAurelien Jarno 					s++;
602f56cfddSAurelien Jarno 					strcpy(cp, s);
612f56cfddSAurelien Jarno 					cp += strlen(s);
622f56cfddSAurelien Jarno 				}
632f56cfddSAurelien Jarno 				*cp++ = ' ';
642f56cfddSAurelien Jarno 				break;
652f56cfddSAurelien Jarno 			}
662f56cfddSAurelien Jarno 		}
672f56cfddSAurelien Jarno 		actr++;
682f56cfddSAurelien Jarno 	}
692f56cfddSAurelien Jarno 
702f56cfddSAurelien Jarno 	return cp;
712f56cfddSAurelien Jarno }
722f56cfddSAurelien Jarno 
prom_init_cmdline(int argc,LONG * argv)73*7b16831dSThomas Bogendoerfer void __init prom_init_cmdline(int argc, LONG *argv)
742f56cfddSAurelien Jarno {
752f56cfddSAurelien Jarno 	char *cp;
762f56cfddSAurelien Jarno 	int actr, i;
772f56cfddSAurelien Jarno 
782f56cfddSAurelien Jarno 	actr = 1; /* Always ignore argv[0] */
792f56cfddSAurelien Jarno 
802f56cfddSAurelien Jarno 	cp = arcs_cmdline;
812f56cfddSAurelien Jarno 	/*
822f56cfddSAurelien Jarno 	 * Move ARC variables to the beginning to make sure they can be
832f56cfddSAurelien Jarno 	 * overridden by later arguments.
842f56cfddSAurelien Jarno 	 */
85*7b16831dSThomas Bogendoerfer 	cp = move_firmware_args(argc, argv, cp);
862f56cfddSAurelien Jarno 
87*7b16831dSThomas Bogendoerfer 	while (actr < argc) {
882f56cfddSAurelien Jarno 		for (i = 0; i < ARRAY_SIZE(ignored); i++) {
892f56cfddSAurelien Jarno 			int len = strlen(ignored[i]);
902f56cfddSAurelien Jarno 
912f56cfddSAurelien Jarno 			if (!strncmp(prom_argv(actr), ignored[i], len))
922f56cfddSAurelien Jarno 				goto pic_cont;
932f56cfddSAurelien Jarno 		}
942f56cfddSAurelien Jarno 		/* Ok, we want it. */
952f56cfddSAurelien Jarno 		strcpy(cp, prom_argv(actr));
962f56cfddSAurelien Jarno 		cp += strlen(prom_argv(actr));
972f56cfddSAurelien Jarno 		*cp++ = ' ';
982f56cfddSAurelien Jarno 
992f56cfddSAurelien Jarno 	pic_cont:
1002f56cfddSAurelien Jarno 		actr++;
1012f56cfddSAurelien Jarno 	}
1022f56cfddSAurelien Jarno 
1032f56cfddSAurelien Jarno 	if (cp != arcs_cmdline)		/* get rid of trailing space */
1042f56cfddSAurelien Jarno 		--cp;
1052f56cfddSAurelien Jarno 	*cp = '\0';
1062f56cfddSAurelien Jarno 
1072f56cfddSAurelien Jarno #ifdef DEBUG_CMDLINE
1082f56cfddSAurelien Jarno 	printk(KERN_DEBUG "prom cmdline: %s\n", arcs_cmdline);
1092f56cfddSAurelien Jarno #endif
1102f56cfddSAurelien Jarno }
111