diff options
Diffstat (limited to 'arch/mips/powertv/init.c')
-rw-r--r-- | arch/mips/powertv/init.c | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/arch/mips/powertv/init.c b/arch/mips/powertv/init.c new file mode 100644 index 000000000000..0afe227f1d0a --- /dev/null +++ b/arch/mips/powertv/init.c | |||
@@ -0,0 +1,129 @@ | |||
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 | |||
37 | static int *_prom_envp; | ||
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 | { | ||
109 | int prom_argc; | ||
110 | char *prom_argv; | ||
111 | |||
112 | prom_argc = fw_arg0; | ||
113 | prom_argv = (char *) fw_arg1; | ||
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 | |||
120 | if (prom_argc == 1) | ||
121 | strlcat(arcs_cmdline, prom_argv, COMMAND_LINE_SIZE); | ||
122 | |||
123 | configure_platform(); | ||
124 | prom_meminit(); | ||
125 | |||
126 | #ifndef CONFIG_BOOTLOADER_DRIVER | ||
127 | pr_info("\nBootloader driver isn't loaded...\n"); | ||
128 | #endif | ||
129 | } | ||