Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
sh
kernel
setup.c
Go to the documentation of this file.
1
/*
2
* arch/sh/kernel/setup.c
3
*
4
* This file handles the architecture-dependent parts of initialization
5
*
6
* Copyright (C) 1999 Niibe Yutaka
7
* Copyright (C) 2002 - 2010 Paul Mundt
8
*/
9
#include <linux/screen_info.h>
10
#include <
linux/ioport.h
>
11
#include <
linux/init.h
>
12
#include <
linux/initrd.h
>
13
#include <
linux/bootmem.h
>
14
#include <
linux/console.h
>
15
#include <
linux/root_dev.h
>
16
#include <linux/utsname.h>
17
#include <
linux/nodemask.h
>
18
#include <
linux/cpu.h
>
19
#include <
linux/pfn.h
>
20
#include <linux/fs.h>
21
#include <
linux/mm.h
>
22
#include <linux/kexec.h>
23
#include <linux/module.h>
24
#include <
linux/smp.h
>
25
#include <
linux/err.h
>
26
#include <
linux/crash_dump.h
>
27
#include <
linux/mmzone.h
>
28
#include <
linux/clk.h
>
29
#include <
linux/delay.h
>
30
#include <
linux/platform_device.h
>
31
#include <
linux/memblock.h
>
32
#include <asm/uaccess.h>
33
#include <asm/io.h>
34
#include <asm/page.h>
35
#include <asm/elf.h>
36
#include <asm/sections.h>
37
#include <asm/irq.h>
38
#include <asm/setup.h>
39
#include <asm/clock.h>
40
#include <asm/smp.h>
41
#include <asm/mmu_context.h>
42
#include <asm/mmzone.h>
43
#include <asm/sparsemem.h>
44
45
/*
46
* Initialize loops_per_jiffy as 10000000 (1000MIPS).
47
* This value will be used at the very early stage of serial setup.
48
* The bigger value means no problem.
49
*/
50
struct
sh_cpuinfo
cpu_data
[
NR_CPUS
]
__read_mostly
= {
51
[0] = {
52
.type =
CPU_SH_NONE
,
53
.family =
CPU_FAMILY_UNKNOWN
,
54
.loops_per_jiffy = 10000000,
55
.phys_bits =
MAX_PHYSMEM_BITS
,
56
},
57
};
58
EXPORT_SYMBOL
(
cpu_data
);
59
60
/*
61
* The machine vector. First entry in .machvec.init, or clobbered by
62
* sh_mv= on the command line, prior to .machvec.init teardown.
63
*/
64
struct
sh_machine_vector
sh_mv
= { .mv_name =
"generic"
, };
65
EXPORT_SYMBOL
(sh_mv);
66
67
#ifdef CONFIG_VT
68
struct
screen_info
screen_info
;
69
#endif
70
71
extern
int
root_mountflags
;
72
73
#define RAMDISK_IMAGE_START_MASK 0x07FF
74
#define RAMDISK_PROMPT_FLAG 0x8000
75
#define RAMDISK_LOAD_FLAG 0x4000
76
77
static
char
__initdata
command_line
[
COMMAND_LINE_SIZE
] = { 0, };
78
79
static
struct
resource
code_resource = {
80
.name =
"Kernel code"
,
81
.flags =
IORESOURCE_BUSY
|
IORESOURCE_MEM
,
82
};
83
84
static
struct
resource
data_resource = {
85
.name =
"Kernel data"
,
86
.flags =
IORESOURCE_BUSY
|
IORESOURCE_MEM
,
87
};
88
89
static
struct
resource
bss_resource = {
90
.name =
"Kernel bss"
,
91
.flags =
IORESOURCE_BUSY
|
IORESOURCE_MEM
,
92
};
93
94
unsigned
long
memory_start
;
95
EXPORT_SYMBOL
(
memory_start
);
96
unsigned
long
memory_end
= 0;
97
EXPORT_SYMBOL
(
memory_end
);
98
unsigned
long
memory_limit
= 0;
99
100
static
struct
resource
mem_resources[
MAX_NUMNODES
];
101
102
int
l1i_cache_shape
,
l1d_cache_shape
,
l2_cache_shape
;
103
104
static
int
__init
early_parse_mem(
char
*
p
)
105
{
106
if
(!p)
107
return
1;
108
109
memory_limit
=
PAGE_ALIGN
(
memparse
(p, &p));
110
111
pr_notice
(
"Memory limited to %ldMB\n"
,
memory_limit
>> 20);
112
113
return
0;
114
}
115
early_param
(
"mem"
, early_parse_mem);
116
117
void
__init
check_for_initrd
(
void
)
118
{
119
#ifdef CONFIG_BLK_DEV_INITRD
120
unsigned
long
start
,
end
;
121
122
/*
123
* Check for the rare cases where boot loaders adhere to the boot
124
* ABI.
125
*/
126
if
(!
LOADER_TYPE
|| !
INITRD_START
|| !
INITRD_SIZE
)
127
goto
disable
;
128
129
start =
INITRD_START
+
__MEMORY_START
;
130
end = start +
INITRD_SIZE
;
131
132
if
(
unlikely
(end <= start))
133
goto
disable
;
134
if
(
unlikely
(start & ~
PAGE_MASK
)) {
135
pr_err
(
"initrd must be page aligned\n"
);
136
goto
disable
;
137
}
138
139
if
(
unlikely
(start < __MEMORY_START)) {
140
pr_err
(
"initrd start (%08lx) < __MEMORY_START(%x)\n"
,
141
start, __MEMORY_START);
142
goto
disable
;
143
}
144
145
if
(
unlikely
(end >
memblock_end_of_DRAM
())) {
146
pr_err
(
"initrd extends beyond end of memory "
147
"(0x%08lx > 0x%08lx)\ndisabling initrd\n"
,
148
end, (
unsigned
long
)
memblock_end_of_DRAM
());
149
goto
disable
;
150
}
151
152
/*
153
* If we got this far in spite of the boot loader's best efforts
154
* to the contrary, assume we actually have a valid initrd and
155
* fix up the root dev.
156
*/
157
ROOT_DEV
=
Root_RAM0
;
158
159
/*
160
* Address sanitization
161
*/
162
initrd_start
= (
unsigned
long
)
__va
(start);
163
initrd_end
=
initrd_start
+
INITRD_SIZE
;
164
165
memblock_reserve
(
__pa
(
initrd_start
), INITRD_SIZE);
166
167
return
;
168
169
disable
:
170
pr_info
(
"initrd disabled\n"
);
171
initrd_start
=
initrd_end
= 0;
172
#endif
173
}
174
175
void
__cpuinit
calibrate_delay
(
void
)
176
{
177
struct
clk
*
clk
=
clk_get
(
NULL
,
"cpu_clk"
);
178
179
if
(IS_ERR(clk))
180
panic
(
"Need a sane CPU clock definition!"
);
181
182
loops_per_jiffy
= (
clk_get_rate
(clk) >> 1) /
HZ
;
183
184
printk
(
KERN_INFO
"Calibrating delay loop (skipped)... "
185
"%lu.%02lu BogoMIPS PRESET (lpj=%lu)\n"
,
186
loops_per_jiffy
/(500000/
HZ
),
187
(
loops_per_jiffy
/(5000/
HZ
)) % 100,
188
loops_per_jiffy
);
189
}
190
191
void
__init
__add_active_range
(
unsigned
int
nid,
unsigned
long
start_pfn,
192
unsigned
long
end_pfn)
193
{
194
struct
resource
*
res
= &mem_resources[nid];
195
unsigned
long
start
,
end
;
196
197
WARN_ON
(res->
name
);
/* max one active range per node for now */
198
199
start = start_pfn <<
PAGE_SHIFT
;
200
end = end_pfn <<
PAGE_SHIFT
;
201
202
res->
name
=
"System RAM"
;
203
res->
start
=
start
;
204
res->
end
= end - 1;
205
res->
flags
=
IORESOURCE_MEM
|
IORESOURCE_BUSY
;
206
207
if
(
request_resource
(&
iomem_resource
, res)) {
208
pr_err
(
"unable to request memory_resource 0x%lx 0x%lx\n"
,
209
start_pfn, end_pfn);
210
return
;
211
}
212
213
/*
214
* We don't know which RAM region contains kernel data or
215
* the reserved crashkernel region, so try it repeatedly
216
* and let the resource manager test it.
217
*/
218
request_resource
(res, &code_resource);
219
request_resource
(res, &data_resource);
220
request_resource
(res, &bss_resource);
221
#ifdef CONFIG_KEXEC
222
request_resource
(res, &
crashk_res
);
223
#endif
224
225
/*
226
* Also make sure that there is a PMB mapping that covers this
227
* range before we attempt to activate it, to avoid reset by MMU.
228
* We can hit this path with NUMA or memory hot-add.
229
*/
230
pmb_bolt_mapping
((
unsigned
long
)
__va
(start), start, end - start,
231
PAGE_KERNEL
);
232
233
memblock_set_node(
PFN_PHYS
(start_pfn),
234
PFN_PHYS
(end_pfn - start_pfn), nid);
235
}
236
237
void
__init
__weak
plat_early_device_setup
(
void
)
238
{
239
}
240
241
void
__init
setup_arch
(
char
**cmdline_p)
242
{
243
enable_mmu();
244
245
ROOT_DEV
= old_decode_dev(
ORIG_ROOT_DEV
);
246
247
printk
(
KERN_NOTICE
"Boot params:\n"
248
"... MOUNT_ROOT_RDONLY - %08lx\n"
249
"... RAMDISK_FLAGS - %08lx\n"
250
"... ORIG_ROOT_DEV - %08lx\n"
251
"... LOADER_TYPE - %08lx\n"
252
"... INITRD_START - %08lx\n"
253
"... INITRD_SIZE - %08lx\n"
,
254
MOUNT_ROOT_RDONLY
,
RAMDISK_FLAGS
,
255
ORIG_ROOT_DEV
,
LOADER_TYPE
,
256
INITRD_START
,
INITRD_SIZE
);
257
258
#ifdef CONFIG_BLK_DEV_RAM
259
rd_image_start
=
RAMDISK_FLAGS
&
RAMDISK_IMAGE_START_MASK
;
260
rd_prompt
= ((
RAMDISK_FLAGS
&
RAMDISK_PROMPT_FLAG
) != 0);
261
rd_doload
= ((
RAMDISK_FLAGS
&
RAMDISK_LOAD_FLAG
) != 0);
262
#endif
263
264
if
(!
MOUNT_ROOT_RDONLY
)
265
root_mountflags
&= ~
MS_RDONLY
;
266
init_mm
.start_code = (
unsigned
long
)
_text
;
267
init_mm
.end_code = (
unsigned
long
)
_etext
;
268
init_mm
.end_data = (
unsigned
long
)
_edata
;
269
init_mm
.brk = (
unsigned
long
)
_end
;
270
271
code_resource.
start
=
virt_to_phys
(
_text
);
272
code_resource.
end
=
virt_to_phys
(
_etext
)-1;
273
data_resource.
start
=
virt_to_phys
(
_etext
);
274
data_resource.
end
=
virt_to_phys
(
_edata
)-1;
275
bss_resource.
start
=
virt_to_phys
(
__bss_start
);
276
bss_resource.
end
=
virt_to_phys
(
__bss_stop
)-1;
277
278
#ifdef CONFIG_CMDLINE_OVERWRITE
279
strlcpy
(
command_line
, CONFIG_CMDLINE,
sizeof
(
command_line
));
280
#else
281
strlcpy
(
command_line
,
COMMAND_LINE
,
sizeof
(
command_line
));
282
#ifdef CONFIG_CMDLINE_EXTEND
283
strlcat
(
command_line
,
" "
,
sizeof
(
command_line
));
284
strlcat
(
command_line
, CONFIG_CMDLINE,
sizeof
(
command_line
));
285
#endif
286
#endif
287
288
/* Save unparsed command line copy for /proc/cmdline */
289
memcpy
(
boot_command_line
,
command_line
,
COMMAND_LINE_SIZE
);
290
*cmdline_p =
command_line
;
291
292
parse_early_param
();
293
294
plat_early_device_setup
();
295
296
sh_mv_setup
();
297
298
/* Let earlyprintk output early console messages */
299
early_platform_driver_probe
(
"earlyprintk"
, 1, 1);
300
301
paging_init
();
302
303
#ifdef CONFIG_DUMMY_CONSOLE
304
conswitchp
= &
dummy_con
;
305
#endif
306
307
/* Perform the machine specific initialisation */
308
if
(
likely
(sh_mv.
mv_setup
))
309
sh_mv.
mv_setup
(cmdline_p);
310
311
plat_smp_setup();
312
}
313
314
/* processor boot mode configuration */
315
int
generic_mode_pins
(
void
)
316
{
317
pr_warning
(
"generic_mode_pins(): missing mode pin configuration\n"
);
318
return
0;
319
}
320
321
int
test_mode_pin
(
int
pin
)
322
{
323
return
sh_mv.
mv_mode_pins
() &
pin
;
324
}
Generated on Thu Jan 10 2013 12:53:00 for Linux Kernel by
1.8.2