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
drivers
mtd
ar7part.c
Go to the documentation of this file.
1
/*
2
* Copyright © 2007 Eugene Konev <
[email protected]
>
3
*
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU General Public License as published by
6
* the Free Software Foundation; either version 2 of the License, or
7
* (at your option) any later version.
8
*
9
* This program is distributed in the hope that it will be useful,
10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
* GNU General Public License for more details.
13
*
14
* You should have received a copy of the GNU General Public License
15
* along with this program; if not, write to the Free Software
16
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
17
*
18
* TI AR7 flash partition table.
19
* Based on ar7 map by Felix Fietkau <
[email protected]
>
20
*
21
*/
22
23
#include <linux/kernel.h>
24
#include <linux/slab.h>
25
26
#include <
linux/mtd/mtd.h
>
27
#include <
linux/mtd/partitions.h
>
28
#include <
linux/bootmem.h
>
29
#include <linux/magic.h>
30
#include <linux/module.h>
31
32
#define AR7_PARTS 4
33
#define ROOT_OFFSET 0xe0000
34
35
#define LOADER_MAGIC1 le32_to_cpu(0xfeedfa42)
36
#define LOADER_MAGIC2 le32_to_cpu(0xfeed1281)
37
38
#ifndef SQUASHFS_MAGIC
39
#define SQUASHFS_MAGIC 0x73717368
40
#endif
41
42
struct
ar7_bin_rec
{
43
unsigned
int
checksum
;
44
unsigned
int
length
;
45
unsigned
int
address
;
46
};
47
48
static
int
create_mtd_partitions(
struct
mtd_info
*master,
49
struct
mtd_partition
**pparts,
50
struct
mtd_part_parser_data
*
data
)
51
{
52
struct
ar7_bin_rec
header;
53
unsigned
int
offset
;
54
size_t
len
;
55
unsigned
int
pre_size = master->
erasesize
, post_size = 0;
56
unsigned
int
root_offset =
ROOT_OFFSET
;
57
58
int
retries
= 10;
59
struct
mtd_partition
*ar7_parts;
60
61
ar7_parts = kzalloc(
sizeof
(*ar7_parts) *
AR7_PARTS
,
GFP_KERNEL
);
62
if
(!ar7_parts)
63
return
-
ENOMEM
;
64
ar7_parts[0].
name
=
"loader"
;
65
ar7_parts[0].
offset
= 0;
66
ar7_parts[0].
size
= master->
erasesize
;
67
ar7_parts[0].
mask_flags
=
MTD_WRITEABLE
;
68
69
ar7_parts[1].
name
=
"config"
;
70
ar7_parts[1].
offset
= 0;
71
ar7_parts[1].
size
= master->
erasesize
;
72
ar7_parts[1].
mask_flags
= 0;
73
74
do
{
/* Try 10 blocks starting from master->erasesize */
75
offset = pre_size;
76
mtd_read
(master, offset,
sizeof
(header), &len,
77
(
uint8_t
*)&header);
78
if
(!
strncmp
((
char
*)&header,
"TIENV0.8"
, 8))
79
ar7_parts[1].
offset
= pre_size;
80
if
(header.
checksum
==
LOADER_MAGIC1
)
81
break
;
82
if
(header.
checksum
==
LOADER_MAGIC2
)
83
break
;
84
pre_size += master->
erasesize
;
85
}
while
(retries--);
86
87
pre_size =
offset
;
88
89
if
(!ar7_parts[1].offset) {
90
ar7_parts[1].
offset
= master->
size
- master->
erasesize
;
91
post_size = master->
erasesize
;
92
}
93
94
switch
(header.
checksum
) {
95
case
LOADER_MAGIC1
:
96
while
(header.
length
) {
97
offset +=
sizeof
(header) + header.
length
;
98
mtd_read
(master, offset,
sizeof
(header), &len,
99
(
uint8_t
*)&header);
100
}
101
root_offset = offset +
sizeof
(header) + 4;
102
break
;
103
case
LOADER_MAGIC2
:
104
while
(header.
length
) {
105
offset +=
sizeof
(header) + header.
length
;
106
mtd_read
(master, offset,
sizeof
(header), &len,
107
(
uint8_t
*)&header);
108
}
109
root_offset = offset +
sizeof
(header) + 4 + 0xff;
110
root_offset &= ~(
uint32_t
)0xff;
111
break
;
112
default
:
113
printk
(
KERN_WARNING
"Unknown magic: %08x\n"
, header.
checksum
);
114
break
;
115
}
116
117
mtd_read
(master, root_offset,
sizeof
(header), &len, (
u8
*)&header);
118
if
(header.
checksum
!=
SQUASHFS_MAGIC
) {
119
root_offset += master->
erasesize
- 1;
120
root_offset &= ~(master->
erasesize
- 1);
121
}
122
123
ar7_parts[2].
name
=
"linux"
;
124
ar7_parts[2].
offset
= pre_size;
125
ar7_parts[2].
size
= master->
size
- pre_size - post_size;
126
ar7_parts[2].
mask_flags
= 0;
127
128
ar7_parts[3].
name
=
"rootfs"
;
129
ar7_parts[3].
offset
= root_offset;
130
ar7_parts[3].
size
= master->
size
- root_offset - post_size;
131
ar7_parts[3].
mask_flags
= 0;
132
133
*pparts = ar7_parts;
134
return
AR7_PARTS
;
135
}
136
137
static
struct
mtd_part_parser
ar7_parser = {
138
.owner =
THIS_MODULE
,
139
.parse_fn = create_mtd_partitions,
140
.name =
"ar7part"
,
141
};
142
143
static
int
__init
ar7_parser_init(
void
)
144
{
145
return
register_mtd_parser
(&ar7_parser);
146
}
147
148
module_init
(ar7_parser_init);
149
150
MODULE_LICENSE
(
"GPL"
);
151
MODULE_AUTHOR
(
"Felix Fietkau <
[email protected]
>, "
152
"Eugene Konev <
[email protected]
>"
);
153
MODULE_DESCRIPTION
(
"MTD partitioning for TI AR7"
);
Generated on Thu Jan 10 2013 13:56:09 for Linux Kernel by
1.8.2