]>
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 | 36 | #include <linux/module.h> |
1da177e4 LT |
37 | #include <linux/init.h> |
38 | #include <linux/string.h> | |
39 | ||
40 | #include <asm/bootinfo.h> | |
41 | ||
25b31cb1 YY |
42 | int prom_argc; |
43 | char **prom_argv; | |
44 | char **prom_envp; | |
1da177e4 | 45 | |
2b877a3f | 46 | void __init prom_init_cmdline(void) |
1da177e4 | 47 | { |
10229f37 | 48 | int i; |
1da177e4 | 49 | |
10229f37 YY |
50 | for (i = 1; i < prom_argc; i++) { |
51 | strlcat(arcs_cmdline, prom_argv[i], COMMAND_LINE_SIZE); | |
52 | if (i < (prom_argc - 1)) | |
53 | strlcat(arcs_cmdline, " ", COMMAND_LINE_SIZE); | |
1da177e4 | 54 | } |
1da177e4 LT |
55 | } |
56 | ||
1da177e4 LT |
57 | char *prom_getenv(char *envname) |
58 | { | |
59 | /* | |
60 | * Return a pointer to the given environment variable. | |
6fe725c0 | 61 | * YAMON uses "name", "value" pairs, while U-Boot uses "name=value". |
1da177e4 LT |
62 | */ |
63 | ||
6fe725c0 DP |
64 | char **env = prom_envp; |
65 | int i = strlen(envname); | |
66 | int yamon = (*env && strchr(*env, '=') == NULL); | |
67 | ||
68 | while (*env) { | |
69 | if (yamon) { | |
70 | if (strcmp(envname, *env++) == 0) | |
71 | return *env; | |
c1dcb14e SS |
72 | } else if (strncmp(envname, *env, i) == 0 && (*env)[i] == '=') |
73 | return *env + i + 1; | |
1da177e4 LT |
74 | env++; |
75 | } | |
25b31cb1 | 76 | |
fef6d6a7 | 77 | return NULL; |
1da177e4 LT |
78 | } |
79 | ||
2de88923 | 80 | static inline unsigned char str2hexnum(unsigned char c) |
1da177e4 | 81 | { |
25b31cb1 | 82 | if (c >= '0' && c <= '9') |
1da177e4 | 83 | return c - '0'; |
25b31cb1 | 84 | if (c >= 'a' && c <= 'f') |
1da177e4 | 85 | return c - 'a' + 10; |
25b31cb1 | 86 | if (c >= 'A' && c <= 'F') |
1da177e4 | 87 | return c - 'A' + 10; |
25b31cb1 | 88 | |
1da177e4 LT |
89 | return 0; /* foo */ |
90 | } | |
91 | ||
2de88923 | 92 | static inline void str2eaddr(unsigned char *ea, unsigned char *str) |
1da177e4 LT |
93 | { |
94 | int i; | |
95 | ||
c1dcb14e | 96 | for (i = 0; i < 6; i++) { |
1da177e4 LT |
97 | unsigned char num; |
98 | ||
c1dcb14e | 99 | if ((*str == '.') || (*str == ':')) |
1da177e4 | 100 | str++; |
c1dcb14e SS |
101 | num = str2hexnum(*str++) << 4; |
102 | num |= str2hexnum(*str++); | |
1da177e4 LT |
103 | ea[i] = num; |
104 | } | |
105 | } | |
106 | ||
2b877a3f | 107 | int __init prom_get_ethernet_addr(char *ethernet_addr) |
1da177e4 | 108 | { |
2de88923 | 109 | char *ethaddr_str; |
1da177e4 | 110 | |
2de88923 YY |
111 | /* Check the environment variables first */ |
112 | ethaddr_str = prom_getenv("ethaddr"); | |
1da177e4 | 113 | if (!ethaddr_str) { |
2de88923 | 114 | /* Check command line */ |
ae7cbef5 | 115 | ethaddr_str = strstr(arcs_cmdline, "ethaddr="); |
2de88923 YY |
116 | if (!ethaddr_str) |
117 | return -1; | |
1da177e4 | 118 | |
2de88923 | 119 | ethaddr_str += strlen("ethaddr="); |
1da177e4 | 120 | } |
2de88923 YY |
121 | |
122 | str2eaddr(ethernet_addr, ethaddr_str); | |
1da177e4 LT |
123 | |
124 | return 0; | |
125 | } | |
126 | ||
c44e8d5e | 127 | void __init prom_free_prom_memory(void) |
1da177e4 | 128 | { |
1da177e4 | 129 | } |