2005-04-16 15:20:36 -07:00
/*
*
* BRIEF MODULE DESCRIPTION
2006-07-03 08:17:09 +02:00
* PROM library initialisation code , supports YAMON and U - Boot .
2005-04-16 15:20:36 -07:00
*
2008-04-30 23:18:41 +04:00
* Copyright 2000 - 2001 , 2006 , 2008 MontaVista Software Inc .
* Author : MontaVista Software , Inc . < source @ mvista . com >
2005-04-16 15:20:36 -07:00
*
* This file was derived from Carsten Langgaard ' s
* arch / mips / mips - boards / xx files .
*
* Carsten Langgaard , carstenl @ mips . com
* Copyright ( C ) 1999 , 2000 MIPS Technologies , Inc . All rights reserved .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation ; either version 2 of the License , or ( at your
* option ) any later version .
*
* THIS SOFTWARE IS PROVIDED ` ` AS IS ' ' AND ANY EXPRESS OR IMPLIED
* WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED . IN
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT , INDIRECT ,
* INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT
* NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF
* USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
* ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*
* You should have received a copy of the GNU General Public License along
* with this program ; if not , write to the Free Software Foundation , Inc . ,
* 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
2008-04-23 22:43:55 +04:00
2005-04-16 15:20:36 -07:00
# include <linux/init.h>
# include <linux/string.h>
# include <asm/bootinfo.h>
2007-10-15 19:11:24 +09:00
int prom_argc ;
char * * prom_argv ;
char * * prom_envp ;
2005-04-16 15:20:36 -07:00
2010-08-19 13:37:13 +02:00
void __init prom_init_cmdline ( void )
2005-04-16 15:20:36 -07:00
{
2010-02-01 22:06:56 +09:00
int i ;
2005-04-16 15:20:36 -07:00
2010-02-01 22:06:56 +09:00
for ( i = 1 ; i < prom_argc ; i + + ) {
strlcat ( arcs_cmdline , prom_argv [ i ] , COMMAND_LINE_SIZE ) ;
if ( i < ( prom_argc - 1 ) )
strlcat ( arcs_cmdline , " " , COMMAND_LINE_SIZE ) ;
2005-04-16 15:20:36 -07:00
}
}
char * prom_getenv ( char * envname )
{
/*
* Return a pointer to the given environment variable .
2006-07-03 08:17:09 +02:00
* YAMON uses " name " , " value " pairs , while U - Boot uses " name=value " .
2005-04-16 15:20:36 -07:00
*/
2006-07-03 08:17:09 +02:00
char * * env = prom_envp ;
int i = strlen ( envname ) ;
int yamon = ( * env & & strchr ( * env , ' = ' ) = = NULL ) ;
while ( * env ) {
if ( yamon ) {
if ( strcmp ( envname , * env + + ) = = 0 )
return * env ;
2008-04-30 23:18:41 +04:00
} else if ( strncmp ( envname , * env , i ) = = 0 & & ( * env ) [ i ] = = ' = ' )
return * env + i + 1 ;
2005-04-16 15:20:36 -07:00
env + + ;
}
2007-10-15 19:11:24 +09:00
2006-05-27 23:36:41 +04:00
return NULL ;
2005-04-16 15:20:36 -07:00
}
2007-10-15 19:06:20 +09:00
static inline unsigned char str2hexnum ( unsigned char c )
2005-04-16 15:20:36 -07:00
{
2007-10-15 19:11:24 +09:00
if ( c > = ' 0 ' & & c < = ' 9 ' )
2005-04-16 15:20:36 -07:00
return c - ' 0 ' ;
2007-10-15 19:11:24 +09:00
if ( c > = ' a ' & & c < = ' f ' )
2005-04-16 15:20:36 -07:00
return c - ' a ' + 10 ;
2007-10-15 19:11:24 +09:00
if ( c > = ' A ' & & c < = ' F ' )
2005-04-16 15:20:36 -07:00
return c - ' A ' + 10 ;
2007-10-15 19:11:24 +09:00
2005-04-16 15:20:36 -07:00
return 0 ; /* foo */
}
2007-10-15 19:06:20 +09:00
static inline void str2eaddr ( unsigned char * ea , unsigned char * str )
2005-04-16 15:20:36 -07:00
{
int i ;
2008-04-30 23:18:41 +04:00
for ( i = 0 ; i < 6 ; i + + ) {
2005-04-16 15:20:36 -07:00
unsigned char num ;
2008-04-30 23:18:41 +04:00
if ( ( * str = = ' . ' ) | | ( * str = = ' : ' ) )
2005-04-16 15:20:36 -07:00
str + + ;
2008-04-30 23:18:41 +04:00
num = str2hexnum ( * str + + ) < < 4 ;
num | = str2hexnum ( * str + + ) ;
2005-04-16 15:20:36 -07:00
ea [ i ] = num ;
}
}
2010-08-19 13:37:13 +02:00
int __init prom_get_ethernet_addr ( char * ethernet_addr )
2005-04-16 15:20:36 -07:00
{
2007-10-15 19:06:20 +09:00
char * ethaddr_str ;
2005-04-16 15:20:36 -07:00
2007-10-15 19:06:20 +09:00
/* Check the environment variables first */
ethaddr_str = prom_getenv ( " ethaddr " ) ;
2005-04-16 15:20:36 -07:00
if ( ! ethaddr_str ) {
2007-10-15 19:06:20 +09:00
/* Check command line */
2010-02-01 22:05:57 +09:00
ethaddr_str = strstr ( arcs_cmdline , " ethaddr= " ) ;
2007-10-15 19:06:20 +09:00
if ( ! ethaddr_str )
return - 1 ;
2005-04-16 15:20:36 -07:00
2007-10-15 19:06:20 +09:00
ethaddr_str + = strlen ( " ethaddr= " ) ;
2005-04-16 15:20:36 -07:00
}
2007-10-15 19:06:20 +09:00
str2eaddr ( ethernet_addr , ethaddr_str ) ;
2005-04-16 15:20:36 -07:00
return 0 ;
}
2006-12-30 00:43:59 +09:00
void __init prom_free_prom_memory ( void )
2005-04-16 15:20:36 -07:00
{
}