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

