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