1 /* 1 2 * 3 * BRIEF MODULE DESCRIPTION 4 * PROM library initialisation code, suppor 5 * 6 * Copyright 2000-2001, 2006, 2008 MontaVista 7 * Author: MontaVista Software, Inc. <source@m 8 * 9 * This file was derived from Carsten Langgaar 10 * arch/mips/mips-boards/xx files. 11 * 12 * Carsten Langgaard, carstenl@mips.com 13 * Copyright (C) 1999,2000 MIPS Technologies, 14 * 15 * This program is free software; you can red 16 * under the terms of the GNU General Publ 17 * Free Software Foundation; either version 18 * option) any later version. 19 * 20 * THIS SOFTWARE IS PROVIDED ``AS IS'' A 21 * WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * MERCHANTABILITY AND FITNESS FOR A PARTICUL 23 * NO EVENT SHALL THE AUTHOR BE LIABL 24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQU 25 * NOT LIMITED TO, PROCUREMENT OF SUBSTITU 26 * USE, DATA, OR PROFITS; OR BUSINESS INTER 27 * ANY THEORY OF LIABILITY, WHETHER IN CONTR 28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISIN 29 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSS 30 * 31 * You should have received a copy of the GN 32 * with this program; if not, write to the F 33 * 675 Mass Ave, Cambridge, MA 02139, USA. 34 */ 35 36 #include <linux/init.h> 37 #include <linux/kernel.h> 38 #include <linux/memblock.h> 39 #include <linux/sizes.h> 40 #include <linux/string.h> 41 42 #include <asm/bootinfo.h> 43 #include <prom.h> 44 45 int prom_argc; 46 char **prom_argv; 47 char **prom_envp; 48 49 void __init prom_init_cmdline(void) 50 { 51 int i; 52 53 for (i = 1; i < prom_argc; i++) { 54 strlcat(arcs_cmdline, prom_arg 55 if (i < (prom_argc - 1)) 56 strlcat(arcs_cmdline, 57 } 58 } 59 60 char *prom_getenv(char *envname) 61 { 62 /* 63 * Return a pointer to the given envir 64 * YAMON uses "name", "value" pairs, w 65 */ 66 67 char **env = prom_envp; 68 int i = strlen(envname); 69 int yamon = (*env && strchr(*env, '=') 70 71 while (*env) { 72 if (yamon) { 73 if (strcmp(envname, *e 74 return *env; 75 } else if (strncmp(envname, *e 76 return *env + i + 1; 77 env++; 78 } 79 80 return NULL; 81 } 82 83 void __init prom_init(void) 84 { 85 unsigned char *memsize_str; 86 unsigned long memsize; 87 88 prom_argc = (int)fw_arg0; 89 prom_argv = (char **)fw_arg1; 90 prom_envp = (char **)fw_arg2; 91 92 prom_init_cmdline(); 93 94 memsize_str = prom_getenv("memsize"); 95 if (!memsize_str || kstrtoul(memsize_s 96 memsize = SZ_64M; /* minimum m 97 98 memblock_add(0, memsize); 99 } 100 101 static inline unsigned char str2hexnum(unsigne 102 { 103 if (c >= '' && c <= '9') 104 return c - ''; 105 if (c >= 'a' && c <= 'f') 106 return c - 'a' + 10; 107 if (c >= 'A' && c <= 'F') 108 return c - 'A' + 10; 109 110 return 0; /* foo */ 111 } 112 113 static inline void str2eaddr(unsigned char *ea 114 { 115 int i; 116 117 for (i = 0; i < 6; i++) { 118 unsigned char num; 119 120 if ((*str == '.') || (*str == 121 str++; 122 num = str2hexnum(*str++) << 4 123 num |= str2hexnum(*str++); 124 ea[i] = num; 125 } 126 } 127 128 int __init prom_get_ethernet_addr(char *ethern 129 { 130 char *ethaddr_str; 131 132 /* Check the environment variables fir 133 ethaddr_str = prom_getenv("ethaddr"); 134 if (!ethaddr_str) { 135 /* Check command line */ 136 ethaddr_str = strstr(arcs_cmdl 137 if (!ethaddr_str) 138 return -1; 139 140 ethaddr_str += strlen("ethaddr 141 } 142 143 str2eaddr(ethernet_addr, ethaddr_str); 144 145 return 0; 146 } 147
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.