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