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
mips
rb532
prom.c
Go to the documentation of this file.
1
/*
2
* RouterBoard 500 specific prom routines
3
*
4
* Copyright (C) 2003, Peter Sadik <
[email protected]
>
5
* Copyright (C) 2005-2006, P.Christeas <
[email protected]
>
6
* Copyright (C) 2007, Gabor Juhos <
[email protected]
>
7
* Felix Fietkau <
[email protected]
>
8
* Florian Fainelli <
[email protected]
>
9
*
10
* This program is free software; you can redistribute it and/or
11
* modify it under the terms of the GNU General Public License
12
* as published by the Free Software Foundation; either version 2
13
* of the License, or (at your option) any later version.
14
*
15
* This program is distributed in the hope that it will be useful,
16
* but WITHOUT ANY WARRANTY; without even the implied warranty of
17
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
* GNU General Public License for more details.
19
*
20
* You should have received a copy of the GNU General Public License
21
* along with this program; if not, write to the
22
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
23
* Boston, MA 02110-1301, USA.
24
*
25
*/
26
27
#include <
linux/init.h
>
28
#include <
linux/mm.h
>
29
#include <linux/module.h>
30
#include <linux/string.h>
31
#include <
linux/console.h
>
32
#include <
linux/bootmem.h
>
33
#include <
linux/ioport.h
>
34
#include <
linux/blkdev.h
>
35
36
#include <asm/bootinfo.h>
37
#include <
asm/mach-rc32434/ddr.h
>
38
#include <
asm/mach-rc32434/prom.h
>
39
40
unsigned
int
idt_cpu_freq
= 132000000;
41
EXPORT_SYMBOL
(
idt_cpu_freq
);
42
43
static
struct
resource
ddr_reg[] = {
44
{
45
.name =
"ddr-reg"
,
46
.start =
DDR0_PHYS_ADDR
,
47
.end =
DDR0_PHYS_ADDR
+
sizeof
(
struct
ddr_ram
),
48
.
flags
=
IORESOURCE_MEM
,
49
}
50
};
51
52
void
__init
prom_free_prom_memory
(
void
)
53
{
54
/* No prom memory to free */
55
}
56
57
static
inline
int
match_tag(
char
*
arg
,
const
char
*
tag
)
58
{
59
return
strncmp
(arg, tag,
strlen
(tag)) == 0;
60
}
61
62
static
inline
unsigned
long
tag2ul(
char
*arg,
const
char
*tag)
63
{
64
char
*
num
;
65
66
num = arg +
strlen
(tag);
67
return
simple_strtoul
(num, 0, 10);
68
}
69
70
void
__init
prom_setup_cmdline
(
void
)
71
{
72
static
char
cmd_line
[
COMMAND_LINE_SIZE
]
__initdata
;
73
char
*
cp
, *
board
;
74
int
prom_argc
;
75
char
**
prom_argv
, **
prom_envp
;
76
int
i
;
77
78
prom_argc =
fw_arg0
;
79
prom_argv = (
char
**)
fw_arg1
;
80
prom_envp = (
char
**)
fw_arg2
;
81
82
cp =
cmd_line
;
83
/* Note: it is common that parameters start
84
* at argv[1] and not argv[0],
85
* however, our elf loader starts at [0] */
86
for
(i = 0; i <
prom_argc
; i++) {
87
if
(match_tag(prom_argv[i],
FREQ_TAG
)) {
88
idt_cpu_freq
= tag2ul(prom_argv[i],
FREQ_TAG
);
89
continue
;
90
}
91
#ifdef IGNORE_CMDLINE_MEM
92
/* parses out the "mem=xx" arg */
93
if
(match_tag(prom_argv[i],
MEM_TAG
))
94
continue
;
95
#endif
96
if
(i > 0)
97
*(cp++) =
' '
;
98
if
(match_tag(prom_argv[i],
BOARD_TAG
)) {
99
board = prom_argv[
i
] +
strlen
(
BOARD_TAG
);
100
101
if
(match_tag(board,
BOARD_RB532A
))
102
mips_machtype
=
MACH_MIKROTIK_RB532A
;
103
else
104
mips_machtype
=
MACH_MIKROTIK_RB532
;
105
}
106
107
strcpy
(cp, prom_argv[i]);
108
cp +=
strlen
(prom_argv[i]);
109
}
110
*(cp++) =
' '
;
111
112
i =
strlen
(
arcs_cmdline
);
113
if
(i > 0) {
114
*(cp++) =
' '
;
115
strcpy
(cp,
arcs_cmdline
);
116
cp +=
strlen
(
arcs_cmdline
);
117
}
118
cmd_line
[
COMMAND_LINE_SIZE
- 1] =
'\0'
;
119
120
strcpy
(
arcs_cmdline
,
cmd_line
);
121
}
122
123
void
__init
prom_init
(
void
)
124
{
125
struct
ddr_ram
__iomem *
ddr
;
126
phys_t
memsize
;
127
phys_t
ddrbase
;
128
129
ddr =
ioremap_nocache
(ddr_reg[0].
start
,
130
ddr_reg[0].
end
- ddr_reg[0].start);
131
132
if
(!ddr) {
133
printk
(
KERN_ERR
"Unable to remap DDR register\n"
);
134
return
;
135
}
136
137
ddrbase = (
phys_t
)&ddr->
ddrbase
;
138
memsize = (
phys_t
)&ddr->
ddrmask
;
139
memsize = 0 -
memsize
;
140
141
prom_setup_cmdline
();
142
143
/* give all RAM to boot allocator,
144
* except for the first 0x400 and the last 0x200 bytes */
145
add_memory_region
(ddrbase + 0x400, memsize - 0x600,
BOOT_MEM_RAM
);
146
}
Generated on Thu Jan 10 2013 13:08:33 for Linux Kernel by
1.8.2