]>
Commit | Line | Data |
---|---|---|
a3a0f8c8 DV |
1 | /* |
2 | * Copyright (C) 1999, 2000, 2004, 2005 MIPS Technologies, Inc. | |
3 | * All rights reserved. | |
4 | * Authors: Carsten Langgaard <carstenl@mips.com> | |
5 | * Maciej W. Rozycki <macro@mips.com> | |
6 | * Portions copyright (C) 2009 Cisco Systems, Inc. | |
7 | * | |
8 | * This program is free software; you can distribute it and/or modify it | |
9 | * under the terms of the GNU General Public License (Version 2) as | |
10 | * published by the Free Software Foundation. | |
11 | * | |
12 | * This program is distributed in the hope it will be useful, but WITHOUT | |
13 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 | * for more details. | |
16 | * | |
17 | * You should have received a copy of the GNU General Public License along | |
18 | * with this program; if not, write to the Free Software Foundation, Inc., | |
19 | * 59 Temple Place - Suite 330, Boston MA 02111-1307, USA. | |
20 | * | |
21 | * PROM library initialisation code. | |
22 | */ | |
23 | #include <linux/init.h> | |
24 | #include <linux/string.h> | |
25 | #include <linux/kernel.h> | |
26 | ||
27 | #include <asm/bootinfo.h> | |
28 | #include <linux/io.h> | |
29 | #include <asm/system.h> | |
30 | #include <asm/cacheflush.h> | |
31 | #include <asm/traps.h> | |
32 | ||
33 | #include <asm/mips-boards/prom.h> | |
34 | #include <asm/mips-boards/generic.h> | |
35 | #include <asm/mach-powertv/asic.h> | |
36 | ||
7e326d68 | 37 | static int *_prom_envp; |
a3a0f8c8 DV |
38 | unsigned long _prom_memsize; |
39 | ||
40 | /* | |
41 | * YAMON (32-bit PROM) pass arguments and environment as 32-bit pointer. | |
42 | * This macro take care of sign extension, if running in 64-bit mode. | |
43 | */ | |
44 | #define prom_envp(index) ((char *)(long)_prom_envp[(index)]) | |
45 | ||
46 | char *prom_getenv(char *envname) | |
47 | { | |
48 | char *result = NULL; | |
49 | ||
50 | if (_prom_envp != NULL) { | |
51 | /* | |
52 | * Return a pointer to the given environment variable. | |
53 | * In 64-bit mode: we're using 64-bit pointers, but all pointers | |
54 | * in the PROM structures are only 32-bit, so we need some | |
55 | * workarounds, if we are running in 64-bit mode. | |
56 | */ | |
57 | int i, index = 0; | |
58 | ||
59 | i = strlen(envname); | |
60 | ||
61 | while (prom_envp(index)) { | |
62 | if (strncmp(envname, prom_envp(index), i) == 0) { | |
63 | result = prom_envp(index + 1); | |
64 | break; | |
65 | } | |
66 | index += 2; | |
67 | } | |
68 | } | |
69 | ||
70 | return result; | |
71 | } | |
72 | ||
73 | /* TODO: Verify on linux-mips mailing list that the following two */ | |
74 | /* functions are correct */ | |
75 | /* TODO: Copy NMI and EJTAG exception vectors to memory from the */ | |
76 | /* BootROM exception vectors. Flush their cache entries. test it. */ | |
77 | ||
78 | static void __init mips_nmi_setup(void) | |
79 | { | |
80 | void *base; | |
81 | #if defined(CONFIG_CPU_MIPS32_R1) | |
82 | base = cpu_has_veic ? | |
83 | (void *)(CAC_BASE + 0xa80) : | |
84 | (void *)(CAC_BASE + 0x380); | |
85 | #elif defined(CONFIG_CPU_MIPS32_R2) | |
86 | base = (void *)0xbfc00000; | |
87 | #else | |
88 | #error NMI exception handler address not defined | |
89 | #endif | |
90 | } | |
91 | ||
92 | static void __init mips_ejtag_setup(void) | |
93 | { | |
94 | void *base; | |
95 | ||
96 | #if defined(CONFIG_CPU_MIPS32_R1) | |
97 | base = cpu_has_veic ? | |
98 | (void *)(CAC_BASE + 0xa00) : | |
99 | (void *)(CAC_BASE + 0x300); | |
100 | #elif defined(CONFIG_CPU_MIPS32_R2) | |
101 | base = (void *)0xbfc00480; | |
102 | #else | |
103 | #error EJTAG exception handler address not defined | |
104 | #endif | |
105 | } | |
106 | ||
107 | void __init prom_init(void) | |
108 | { | |
7e326d68 YY |
109 | int prom_argc; |
110 | char *prom_argv; | |
111 | ||
a3a0f8c8 | 112 | prom_argc = fw_arg0; |
7e326d68 | 113 | prom_argv = (char *) fw_arg1; |
a3a0f8c8 DV |
114 | _prom_envp = (int *) fw_arg2; |
115 | _prom_memsize = (unsigned long) fw_arg3; | |
116 | ||
117 | board_nmi_handler_setup = mips_nmi_setup; | |
118 | board_ejtag_handler_setup = mips_ejtag_setup; | |
119 | ||
7e326d68 YY |
120 | if (prom_argc == 1) |
121 | strlcat(arcs_cmdline, prom_argv, COMMAND_LINE_SIZE); | |
122 | ||
a3a0f8c8 DV |
123 | configure_platform(); |
124 | prom_meminit(); | |
125 | ||
126 | #ifndef CONFIG_BOOTLOADER_DRIVER | |
127 | pr_info("\nBootloader driver isn't loaded...\n"); | |
128 | #endif | |
129 | } |