1/* 2 * 3 * BRIEF MODULE DESCRIPTION 4 * PROM library initialisation code, supports YAMON and U-Boot. 5 * 6 * Copyright 2000, 2001, 2006 MontaVista Software Inc. 7 * Author: MontaVista Software, Inc. 8 * ppopov@mvista.com or source@mvista.com 9 * 10 * This file was derived from Carsten Langgaard's 11 * arch/mips/mips-boards/xx files. 12 * 13 * Carsten Langgaard, carstenl@mips.com 14 * Copyright (C) 1999,2000 MIPS Technologies, Inc. All rights reserved. 15 * 16 * This program is free software; you can redistribute it and/or modify it 17 * under the terms of the GNU General Public License as published by the 18 * Free Software Foundation; either version 2 of the License, or (at your 19 * option) any later version. 20 * 21 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 22 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 23 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN 24 * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 27 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 28 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 * 32 * You should have received a copy of the GNU General Public License along 33 * with this program; if not, write to the Free Software Foundation, Inc., 34 * 675 Mass Ave, Cambridge, MA 02139, USA. 35 */ 36 37#include <linux/module.h> 38#include <linux/kernel.h> 39#include <linux/init.h> 40#include <linux/string.h> 41 42#include <asm/bootinfo.h> 43 44/* #define DEBUG_CMDLINE */ 45 46extern int prom_argc; 47extern char **prom_argv, **prom_envp; 48 49 50char * __init_or_module prom_getcmdline(void) 51{ 52 return &(arcs_cmdline[0]); 53} 54 55void prom_init_cmdline(void) 56{ 57 char *cp; 58 int actr; 59 60 actr = 1; /* Always ignore argv[0] */ 61 62 cp = &(arcs_cmdline[0]); 63 while(actr < prom_argc) { 64 strcpy(cp, prom_argv[actr]); 65 cp += strlen(prom_argv[actr]); 66 *cp++ = ' '; 67 actr++; 68 } 69 if (cp != &(arcs_cmdline[0])) /* get rid of trailing space */ 70 --cp; 71 if (prom_argc > 1) 72 *cp = '\0'; 73 74} 75 76 77char *prom_getenv(char *envname) 78{ 79 /* 80 * Return a pointer to the given environment variable. 81 * YAMON uses "name", "value" pairs, while U-Boot uses "name=value". 82 */ 83 84 char **env = prom_envp; 85 int i = strlen(envname); 86 int yamon = (*env && strchr(*env, '=') == NULL); 87 88 while (*env) { 89 if (yamon) { 90 if (strcmp(envname, *env++) == 0) 91 return *env; 92 } else { 93 if (strncmp(envname, *env, i) == 0 && (*env)[i] == '=') 94 return *env + i + 1; 95 } 96 env++; 97 } 98 return NULL; 99} 100 101inline unsigned char str2hexnum(unsigned char c) 102{ 103 if(c >= '0' && c <= '9') 104 return c - '0'; 105 if(c >= 'a' && c <= 'f') 106 return c - 'a' + 10; 107 if(c >= 'A' && c <= 'F') 108 return c - 'A' + 10; 109 return 0; /* foo */ 110} 111 112inline void str2eaddr(unsigned char *ea, unsigned char *str) 113{ 114 int i; 115 116 for(i = 0; i < 6; i++) { 117 unsigned char num; 118 119 if((*str == '.') || (*str == ':')) 120 str++; 121 num = str2hexnum(*str++) << 4; 122 num |= (str2hexnum(*str++)); 123 ea[i] = num; 124 } 125} 126 127int get_ethernet_addr(char *ethernet_addr) 128{ 129 char *ethaddr_str; 130 131 ethaddr_str = prom_getenv("ethaddr"); 132 if (!ethaddr_str) { 133 printk("ethaddr not set in boot prom\n"); 134 return -1; 135 } 136 str2eaddr(ethernet_addr, ethaddr_str); 137 138 139 return 0; 140} 141 142void __init prom_free_prom_memory(void) 143{ 144} 145 146EXPORT_SYMBOL(prom_getcmdline); 147EXPORT_SYMBOL(get_ethernet_addr); 148EXPORT_SYMBOL(str2eaddr); 149