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