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 * Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved. 7 */ 8 #include <linux/init.h> 9 #include <linux/kernel.h> 10 #include <linux/string.h> 11 12 #include <asm/addrspace.h> 13 #include <asm/fw/fw.h> 14 15 int fw_argc; 16 int *_fw_argv; 17 int *_fw_envp; 18 19 void __init fw_init_cmdline(void) 20 { 21 int i; 22 23 /* Validate command line parameters. */ 24 if ((fw_arg0 >= CKSEG0) || (fw_arg1 < CKSEG0)) { 25 fw_argc = 0; 26 _fw_argv = NULL; 27 } else { 28 fw_argc = (fw_arg0 & 0x0000ffff); 29 _fw_argv = (int *)fw_arg1; 30 } 31 32 /* Validate environment pointer. */ 33 if (fw_arg2 < CKSEG0) 34 _fw_envp = NULL; 35 else 36 _fw_envp = (int *)fw_arg2; 37 38 for (i = 1; i < fw_argc; i++) { 39 strlcat(arcs_cmdline, fw_argv(i), COMMAND_LINE_SIZE); 40 if (i < (fw_argc - 1)) 41 strlcat(arcs_cmdline, " ", COMMAND_LINE_SIZE); 42 } 43 } 44 45 char * __init fw_getcmdline(void) 46 { 47 return &(arcs_cmdline[0]); 48 } 49 50 char *fw_getenv(char *envname) 51 { 52 char *result = NULL; 53 54 if (_fw_envp != NULL) { 55 /* 56 * Return a pointer to the given environment variable. 57 * YAMON uses "name", "value" pairs, while U-Boot uses 58 * "name=value". 59 */ 60 int i, yamon, index = 0; 61 62 yamon = (strchr(fw_envp(index), '=') == NULL); 63 i = strlen(envname); 64 65 while (fw_envp(index)) { 66 if (strncmp(envname, fw_envp(index), i) == 0) { 67 if (yamon) { 68 result = fw_envp(index + 1); 69 break; 70 } else if (fw_envp(index)[i] == '=') { 71 result = (fw_envp(index + 1) + i); 72 break; 73 } 74 } 75 76 /* Increment array index. */ 77 if (yamon) 78 index += 2; 79 else 80 index += 1; 81 } 82 } 83 84 return result; 85 } 86 87 unsigned long fw_getenvl(char *envname) 88 { 89 unsigned long envl = 0UL; 90 char *str; 91 long val; 92 int tmp; 93 94 str = fw_getenv(envname); 95 if (str) { 96 tmp = kstrtol(str, 0, &val); 97 envl = (unsigned long)val; 98 } 99 100 return envl; 101 } 102