1/* 2 * 3 * Per Hallsmark, per.hallsmark@mvista.com 4 * 5 * Based on jmr3927/common/prom.c 6 * 7 * 2004 (c) MontaVista Software, Inc. This file is licensed under the 8 * terms of the GNU General Public License version 2. This program is 9 * licensed "as is" without any warranty of any kind, whether express 10 * or implied. 11 */ 12#include <linux/module.h> 13#include <linux/kernel.h> 14#include <linux/init.h> 15#include <linux/string.h> 16#include <linux/serial_pnx8xxx.h> 17 18#include <asm/bootinfo.h> 19#include <uart.h> 20 21/* #define DEBUG_CMDLINE */ 22 23extern int prom_argc; 24extern char **prom_argv, **prom_envp; 25 26typedef struct 27{ 28 char *name; 29/* char *val; */ 30}t_env_var; 31 32 33char * __init prom_getcmdline(void) 34{ 35 return &(arcs_cmdline[0]); 36} 37 38void __init prom_init_cmdline(void) 39{ 40 int i; 41 42 arcs_cmdline[0] = '\0'; 43 for (i = 0; i < prom_argc; i++) { 44 strcat(arcs_cmdline, prom_argv[i]); 45 strcat(arcs_cmdline, " "); 46 } 47} 48 49char *prom_getenv(char *envname) 50{ 51 /* 52 * Return a pointer to the given environment variable. 53 * Environment variables are stored in the form of "memsize=64". 54 */ 55 56 t_env_var *env = (t_env_var *)prom_envp; 57 int i; 58 59 i = strlen(envname); 60 61 while(env->name) { 62 if(strncmp(envname, env->name, i) == 0) { 63 return(env->name + strlen(envname) + 1); 64 } 65 env++; 66 } 67 return(NULL); 68} 69 70inline unsigned char str2hexnum(unsigned char c) 71{ 72 if(c >= '0' && c <= '9') 73 return c - '0'; 74 if(c >= 'a' && c <= 'f') 75 return c - 'a' + 10; 76 if(c >= 'A' && c <= 'F') 77 return c - 'A' + 10; 78 return 0; /* foo */ 79} 80 81inline void str2eaddr(unsigned char *ea, unsigned char *str) 82{ 83 int i; 84 85 for(i = 0; i < 6; i++) { 86 unsigned char num; 87 88 if((*str == '.') || (*str == ':')) 89 str++; 90 num = str2hexnum(*str++) << 4; 91 num |= (str2hexnum(*str++)); 92 ea[i] = num; 93 } 94} 95 96int get_ethernet_addr(char *ethernet_addr) 97{ 98 char *ethaddr_str; 99 100 ethaddr_str = prom_getenv("ethaddr"); 101 if (!ethaddr_str) { 102 printk("ethaddr not set in boot prom\n"); 103 return -1; 104 } 105 str2eaddr(ethernet_addr, ethaddr_str); 106 return 0; 107} 108 109void __init prom_free_prom_memory(void) 110{ 111} 112 113extern int pnx8550_console_port; 114 115/* used by early printk */ 116void prom_putchar(char c) 117{ 118 if (pnx8550_console_port != -1) { 119 /* Wait until FIFO not full */ 120 while( ((ip3106_fifo(UART_BASE, pnx8550_console_port) & PNX8XXX_UART_FIFO_TXFIFO) >> 16) >= 16) 121 ; 122 /* Send one char */ 123 ip3106_fifo(UART_BASE, pnx8550_console_port) = c; 124 } 125} 126 127EXPORT_SYMBOL(get_ethernet_addr); 128EXPORT_SYMBOL(str2eaddr); 129