diff options
author | Michal Simek <monstr@monstr.eu> | 2009-03-27 09:25:24 -0400 |
---|---|---|
committer | Michal Simek <monstr@monstr.eu> | 2009-03-27 09:25:24 -0400 |
commit | ec9f91018408617d32dc189cc5e6d030351270c5 (patch) | |
tree | 3ef0ade77ae990038475b83bad4455cd51f84d15 /arch/microblaze | |
parent | ecc6dfc8adfc76d323c513bc88cb260344c11139 (diff) |
microblaze_v8: setup.c, setup.h - system setting
Reviewed-by: Ingo Molnar <mingo@elte.hu>
Reviewed-by: Stephen Neuendorffer <stephen.neuendorffer@xilinx.com>
Acked-by: John Linn <john.linn@xilinx.com>
Acked-by: John Williams <john.williams@petalogix.com>
Signed-off-by: Michal Simek <monstr@monstr.eu>
Diffstat (limited to 'arch/microblaze')
-rw-r--r-- | arch/microblaze/include/asm/setup.h | 44 | ||||
-rw-r--r-- | arch/microblaze/kernel/setup.c | 199 |
2 files changed, 243 insertions, 0 deletions
diff --git a/arch/microblaze/include/asm/setup.h b/arch/microblaze/include/asm/setup.h new file mode 100644 index 000000000000..9b98e8e6abae --- /dev/null +++ b/arch/microblaze/include/asm/setup.h | |||
@@ -0,0 +1,44 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2007-2008 Michal Simek <monstr@monstr.eu> | ||
3 | * Copyright (C) 2006 Atmark Techno, Inc. | ||
4 | * | ||
5 | * This file is subject to the terms and conditions of the GNU General Public | ||
6 | * License. See the file "COPYING" in the main directory of this archive | ||
7 | * for more details. | ||
8 | */ | ||
9 | |||
10 | #ifndef _ASM_MICROBLAZE_SETUP_H | ||
11 | #define _ASM_MICROBLAZE_SETUP_H | ||
12 | |||
13 | #define COMMAND_LINE_SIZE 256 | ||
14 | |||
15 | # ifndef __ASSEMBLY__ | ||
16 | |||
17 | # ifdef __KERNEL__ | ||
18 | extern unsigned int boot_cpuid; /* move to smp.h */ | ||
19 | |||
20 | extern char cmd_line[COMMAND_LINE_SIZE]; | ||
21 | # endif/* __KERNEL__ */ | ||
22 | |||
23 | void early_printk(const char *fmt, ...); | ||
24 | |||
25 | int setup_early_printk(char *opt); | ||
26 | void disable_early_printk(void); | ||
27 | |||
28 | void heartbeat(void); | ||
29 | void setup_heartbeat(void); | ||
30 | |||
31 | unsigned long long sched_clock(void); | ||
32 | |||
33 | void time_init(void); | ||
34 | void init_IRQ(void); | ||
35 | void machine_early_init(const char *cmdline, unsigned int ram, | ||
36 | unsigned int fdt); | ||
37 | |||
38 | void machine_restart(char *cmd); | ||
39 | void machine_shutdown(void); | ||
40 | void machine_halt(void); | ||
41 | void machine_power_off(void); | ||
42 | |||
43 | # endif /* __ASSEMBLY__ */ | ||
44 | #endif /* _ASM_MICROBLAZE_SETUP_H */ | ||
diff --git a/arch/microblaze/kernel/setup.c b/arch/microblaze/kernel/setup.c new file mode 100644 index 000000000000..eb6b41758e23 --- /dev/null +++ b/arch/microblaze/kernel/setup.c | |||
@@ -0,0 +1,199 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu> | ||
3 | * Copyright (C) 2007-2009 PetaLogix | ||
4 | * Copyright (C) 2006 Atmark Techno, Inc. | ||
5 | * | ||
6 | * This file is subject to the terms and conditions of the GNU General Public | ||
7 | * License. See the file "COPYING" in the main directory of this archive | ||
8 | * for more details. | ||
9 | */ | ||
10 | |||
11 | #include <linux/init.h> | ||
12 | #include <linux/string.h> | ||
13 | #include <linux/seq_file.h> | ||
14 | #include <linux/cpu.h> | ||
15 | #include <linux/initrd.h> | ||
16 | #include <linux/console.h> | ||
17 | #include <linux/debugfs.h> | ||
18 | |||
19 | #include <asm/setup.h> | ||
20 | #include <asm/sections.h> | ||
21 | #include <asm/page.h> | ||
22 | #include <linux/io.h> | ||
23 | #include <linux/bug.h> | ||
24 | #include <linux/param.h> | ||
25 | #include <linux/cache.h> | ||
26 | #include <asm/cacheflush.h> | ||
27 | #include <asm/entry.h> | ||
28 | #include <asm/cpuinfo.h> | ||
29 | |||
30 | #include <asm/system.h> | ||
31 | #include <asm/prom.h> | ||
32 | #include <asm/pgtable.h> | ||
33 | |||
34 | DEFINE_PER_CPU(unsigned int, KSP); /* Saved kernel stack pointer */ | ||
35 | DEFINE_PER_CPU(unsigned int, KM); /* Kernel/user mode */ | ||
36 | DEFINE_PER_CPU(unsigned int, ENTRY_SP); /* Saved SP on kernel entry */ | ||
37 | DEFINE_PER_CPU(unsigned int, R11_SAVE); /* Temp variable for entry */ | ||
38 | DEFINE_PER_CPU(unsigned int, CURRENT_SAVE); /* Saved current pointer */ | ||
39 | |||
40 | unsigned int boot_cpuid; | ||
41 | char cmd_line[COMMAND_LINE_SIZE]; | ||
42 | |||
43 | void __init setup_arch(char **cmdline_p) | ||
44 | { | ||
45 | #ifdef CONFIG_CMDLINE_FORCE | ||
46 | strlcpy(cmd_line, CONFIG_CMDLINE, COMMAND_LINE_SIZE); | ||
47 | strlcpy(boot_command_line, CONFIG_CMDLINE, COMMAND_LINE_SIZE); | ||
48 | #endif | ||
49 | *cmdline_p = cmd_line; | ||
50 | |||
51 | console_verbose(); | ||
52 | |||
53 | unflatten_device_tree(); | ||
54 | |||
55 | /* NOTE I think that this function is not necessary to call */ | ||
56 | /* irq_early_init(); */ | ||
57 | setup_cpuinfo(); | ||
58 | |||
59 | __invalidate_icache_all(); | ||
60 | __enable_icache(); | ||
61 | |||
62 | __invalidate_dcache_all(); | ||
63 | __enable_dcache(); | ||
64 | |||
65 | panic_timeout = 120; | ||
66 | |||
67 | setup_memory(); | ||
68 | |||
69 | #if defined(CONFIG_SELFMOD_INTC) || defined(CONFIG_SELFMOD_TIMER) | ||
70 | printk(KERN_NOTICE "Self modified code enable\n"); | ||
71 | #endif | ||
72 | |||
73 | #ifdef CONFIG_VT | ||
74 | #if defined(CONFIG_XILINX_CONSOLE) | ||
75 | conswitchp = &xil_con; | ||
76 | #elif defined(CONFIG_DUMMY_CONSOLE) | ||
77 | conswitchp = &dummy_con; | ||
78 | #endif | ||
79 | #endif | ||
80 | } | ||
81 | |||
82 | #ifdef CONFIG_MTD_UCLINUX | ||
83 | /* Handle both romfs and cramfs types, without generating unnecessary | ||
84 | code (ie no point checking for CRAMFS if it's not even enabled) */ | ||
85 | inline unsigned get_romfs_len(unsigned *addr) | ||
86 | { | ||
87 | #ifdef CONFIG_ROMFS_FS | ||
88 | if (memcmp(&addr[0], "-rom1fs-", 8) == 0) /* romfs */ | ||
89 | return be32_to_cpu(addr[2]); | ||
90 | #endif | ||
91 | |||
92 | #ifdef CONFIG_CRAMFS | ||
93 | if (addr[0] == le32_to_cpu(0x28cd3d45)) /* cramfs */ | ||
94 | return le32_to_cpu(addr[1]); | ||
95 | #endif | ||
96 | return 0; | ||
97 | } | ||
98 | #endif /* CONFIG_MTD_UCLINUX_EBSS */ | ||
99 | |||
100 | void __init machine_early_init(const char *cmdline, unsigned int ram, | ||
101 | unsigned int fdt) | ||
102 | { | ||
103 | unsigned long *src, *dst = (unsigned long *)0x0; | ||
104 | |||
105 | /* clearing bss section */ | ||
106 | memset(__bss_start, 0, __bss_stop-__bss_start); | ||
107 | memset(_ssbss, 0, _esbss-_ssbss); | ||
108 | |||
109 | /* | ||
110 | * Copy command line passed from bootloader, or use default | ||
111 | * if none provided, or forced | ||
112 | */ | ||
113 | #ifndef CONFIG_CMDLINE_BOOL | ||
114 | if (cmdline && cmdline[0] != '\0') | ||
115 | strlcpy(cmd_line, cmdline, COMMAND_LINE_SIZE); | ||
116 | #endif | ||
117 | |||
118 | /* initialize device tree for usage in early_printk */ | ||
119 | early_init_devtree((void *)_fdt_start); | ||
120 | |||
121 | #ifdef CONFIG_EARLY_PRINTK | ||
122 | setup_early_printk(NULL); | ||
123 | #endif | ||
124 | |||
125 | early_printk("Ramdisk addr 0x%08x, FDT 0x%08x\n", ram, fdt); | ||
126 | printk(KERN_NOTICE "Found FDT at 0x%08x\n", fdt); | ||
127 | |||
128 | #ifdef CONFIG_MTD_UCLINUX | ||
129 | { | ||
130 | int size; | ||
131 | unsigned int romfs_base; | ||
132 | romfs_base = (ram ? ram : (unsigned int)&__init_end); | ||
133 | /* if CONFIG_MTD_UCLINUX_EBSS is defined, assume ROMFS is at the | ||
134 | * end of kernel, which is ROMFS_LOCATION defined above. */ | ||
135 | size = PAGE_ALIGN(get_romfs_len((unsigned *)romfs_base)); | ||
136 | early_printk("Found romfs @ 0x%08x (0x%08x)\n", | ||
137 | romfs_base, size); | ||
138 | early_printk("#### klimit %p ####\n", klimit); | ||
139 | BUG_ON(size < 0); /* What else can we do? */ | ||
140 | |||
141 | /* Use memmove to handle likely case of memory overlap */ | ||
142 | early_printk("Moving 0x%08x bytes from 0x%08x to 0x%08x\n", | ||
143 | size, romfs_base, (unsigned)&_ebss); | ||
144 | memmove(&_ebss, (int *)romfs_base, size); | ||
145 | |||
146 | /* update klimit */ | ||
147 | klimit += PAGE_ALIGN(size); | ||
148 | early_printk("New klimit: 0x%08x\n", (unsigned)klimit); | ||
149 | } | ||
150 | #endif | ||
151 | |||
152 | for (src = __ivt_start; src < __ivt_end; src++, dst++) | ||
153 | *dst = *src; | ||
154 | |||
155 | /* Initialize global data */ | ||
156 | per_cpu(KM, 0) = 0x1; /* We start in kernel mode */ | ||
157 | per_cpu(CURRENT_SAVE, 0) = (unsigned long)current; | ||
158 | } | ||
159 | |||
160 | #ifdef CONFIG_DEBUG_FS | ||
161 | struct dentry *of_debugfs_root; | ||
162 | |||
163 | static int microblaze_debugfs_init(void) | ||
164 | { | ||
165 | of_debugfs_root = debugfs_create_dir("microblaze", NULL); | ||
166 | |||
167 | return of_debugfs_root == NULL; | ||
168 | } | ||
169 | arch_initcall(microblaze_debugfs_init); | ||
170 | #endif | ||
171 | |||
172 | void machine_restart(char *cmd) | ||
173 | { | ||
174 | printk(KERN_NOTICE "Machine restart...\n"); | ||
175 | dump_stack(); | ||
176 | while (1) | ||
177 | ; | ||
178 | } | ||
179 | |||
180 | void machine_shutdown(void) | ||
181 | { | ||
182 | printk(KERN_NOTICE "Machine shutdown...\n"); | ||
183 | while (1) | ||
184 | ; | ||
185 | } | ||
186 | |||
187 | void machine_halt(void) | ||
188 | { | ||
189 | printk(KERN_NOTICE "Machine halt...\n"); | ||
190 | while (1) | ||
191 | ; | ||
192 | } | ||
193 | |||
194 | void machine_power_off(void) | ||
195 | { | ||
196 | printk(KERN_NOTICE "Machine power off...\n"); | ||
197 | while (1) | ||
198 | ; | ||
199 | } | ||