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