/*1*2* BRIEF MODULE DESCRIPTION3* PROM library initialisation code, supports YAMON and U-Boot.4*5* Copyright 2000-2001, 2006, 2008 MontaVista Software Inc.6* Author: MontaVista Software, Inc. <[email protected]>7*8* This file was derived from Carsten Langgaard's9* arch/mips/mips-boards/xx files.10*11* Carsten Langgaard, [email protected]12* Copyright (C) 1999,2000 MIPS Technologies, Inc. All rights reserved.13*14* This program is free software; you can redistribute it and/or modify it15* under the terms of the GNU General Public License as published by the16* Free Software Foundation; either version 2 of the License, or (at your17* option) any later version.18*19* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED20* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF21* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN22* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,23* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT24* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF25* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON26* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT27* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF28* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.29*30* You should have received a copy of the GNU General Public License along31* with this program; if not, write to the Free Software Foundation, Inc.,32* 675 Mass Ave, Cambridge, MA 02139, USA.33*/3435#include <linux/module.h>36#include <linux/init.h>37#include <linux/string.h>3839#include <asm/bootinfo.h>4041int prom_argc;42char **prom_argv;43char **prom_envp;4445void __init prom_init_cmdline(void)46{47int i;4849for (i = 1; i < prom_argc; i++) {50strlcat(arcs_cmdline, prom_argv[i], COMMAND_LINE_SIZE);51if (i < (prom_argc - 1))52strlcat(arcs_cmdline, " ", COMMAND_LINE_SIZE);53}54}5556char *prom_getenv(char *envname)57{58/*59* Return a pointer to the given environment variable.60* YAMON uses "name", "value" pairs, while U-Boot uses "name=value".61*/6263char **env = prom_envp;64int i = strlen(envname);65int yamon = (*env && strchr(*env, '=') == NULL);6667while (*env) {68if (yamon) {69if (strcmp(envname, *env++) == 0)70return *env;71} else if (strncmp(envname, *env, i) == 0 && (*env)[i] == '=')72return *env + i + 1;73env++;74}7576return NULL;77}7879static inline unsigned char str2hexnum(unsigned char c)80{81if (c >= '0' && c <= '9')82return c - '0';83if (c >= 'a' && c <= 'f')84return c - 'a' + 10;85if (c >= 'A' && c <= 'F')86return c - 'A' + 10;8788return 0; /* foo */89}9091static inline void str2eaddr(unsigned char *ea, unsigned char *str)92{93int i;9495for (i = 0; i < 6; i++) {96unsigned char num;9798if ((*str == '.') || (*str == ':'))99str++;100num = str2hexnum(*str++) << 4;101num |= str2hexnum(*str++);102ea[i] = num;103}104}105106int __init prom_get_ethernet_addr(char *ethernet_addr)107{108char *ethaddr_str;109110/* Check the environment variables first */111ethaddr_str = prom_getenv("ethaddr");112if (!ethaddr_str) {113/* Check command line */114ethaddr_str = strstr(arcs_cmdline, "ethaddr=");115if (!ethaddr_str)116return -1;117118ethaddr_str += strlen("ethaddr=");119}120121str2eaddr(ethernet_addr, ethaddr_str);122123return 0;124}125126void __init prom_free_prom_memory(void)127{128}129130131