2 * redwood.c - mapper for IBM Redwood-4/5/6 board.
5 * Copyright 2001 - 2002 MontaVista Softare Inc.
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
12 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
13 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
15 * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
16 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
17 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
18 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
19 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
20 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
21 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 * You should have received a copy of the GNU General Public License along
24 * with this program; if not, write to the Free Software Foundation, Inc.,
25 * 675 Mass Ave, Cambridge, MA 02139, USA.
27 * History: 12/17/2001 - Armin
28 * migrated to use do_map_probe
31 * added redwood 6 support
35 #include <linux/config.h>
36 #include <linux/module.h>
37 #include <linux/types.h>
38 #include <linux/kernel.h>
40 #include <linux/mtd/mtd.h>
41 #include <linux/mtd/map.h>
42 #include <linux/mtd/partitions.h>
45 #define STBXX_VPD_SZ 0x10000
46 #define STBXX_OB_SZ 0x20000
47 #define STBXX_4MB 0x4000000
49 #if !defined (CONFIG_REDWOOD_6)
51 #define WINDOW_ADDR 0xffc00000
52 #define WINDOW_SIZE 0x00400000
55 #define RW_PART0_SZ 0x10000
56 #define RW_PART1_OF RW_PART0_SZ
57 #define RW_PART1_SZ 0x200000 - 0x10000
58 #define RW_PART2_OF 0x200000
59 #define RW_PART2_SZ 0x10000
60 #define RW_PART3_OF 0x210000
61 #define RW_PART3_SZ 0x200000 - (0x10000 + 0x20000)
62 #define RW_PART4_OF 0x3e0000
63 #define RW_PART4_SZ 0x20000
64 static struct mtd_partition redwood_flash_partitions[] = {
66 name: "Redwood OpenBIOS Vital Product Data",
69 mask_flags: MTD_WRITEABLE /* force read-only */
72 name: "Redwood kernel",
77 name: "Redwood OpenBIOS non-volatile storage",
80 mask_flags: MTD_WRITEABLE /* force read-only */
83 name: "Redwood filesystem",
88 name: "Redwood OpenBIOS",
91 mask_flags: MTD_WRITEABLE /* force read-only */
97 /* FIXME: the window is bigger - armin */
100 * Change4VideoDongle - H. Lin
101 * Warnning: What effects would be if not end on erase block size??
102 * Thus combine VPD,NVRAM,into one 64KB partition, named VPD
106 /* Supported Devices on HCW MediaMVP */
112 #define MB4_WINDOW_ADDR 0xffc00000 /* 4MB part */
113 #define MB4_WINDOW_SIZE 0x00400000 /* to hook GPIO Pin26 (BI_ADDR10) to A20 */
115 #define MB4_RW_PART0_OF 0x000000
116 #define MB4_RW_PART0_SZ 0x2c0000
118 #define MB4_RW_PART0_SZ 0x2c0000
120 #define MB4_RW_PART5_OF MB4_RW_PART0_OF + MB4_RW_PART0_SZ
121 #define MB4_RW_PART5_SZ 0x200000
123 #define MB4_RW_PART4_OF MB4_RW_PART5_OF + MB4_RW_PART5_SZ
125 #define MB4_RW_PART4_OF MB4_RW_PART0_OF + MB4_RW_PART0_SZ
126 #define MB4_RW_PART4_SZ 0x100000
128 #define MB4_RW_PART1_OF MB4_RW_PART4_OF + MB4_RW_PART4_SZ
129 #define MB4_RW_PART1_SZ 0x010000 /* 64KB VPD = 4KB VPD + 4KB NVRAM */
131 #define MB4_RW_PART2_OF MB4_RW_PART1_OF + MB4_RW_PART1_SZ
132 #define MB4_RW_PART2_SZ 0x010000 /* 64KB LOGO = 56KB LOGO + 8KB XXX */
134 #define MB4_RW_PART3_OF MB4_RW_PART2_OF + MB4_RW_PART2_SZ /* 128KB Bootloader(Open BIOS) */
135 #define MB4_RW_PART3_SZ 0x020000
137 static struct mtd_partition mb4_redwood_flash_partitions[] = {
139 name: "HCW MediaMVP KERN",
140 offset: MB4_RW_PART0_OF,
141 size: MB4_RW_PART0_SZ,
145 name: "HCW MediaMVP FS",
146 offset: MB4_RW_PART5_OF,
147 size: MB4_RW_PART5_SZ,
151 name: "HCW MediaMVP DATA",
152 offset: MB4_RW_PART4_OF,
153 size: MB4_RW_PART4_SZ,
156 name: "HCW MediaMVP VPD",
157 offset: MB4_RW_PART1_OF,
158 size: MB4_RW_PART1_SZ,
161 name: "HCW MediaMVP LOGO",
162 offset: MB4_RW_PART2_OF,
163 size: MB4_RW_PART2_SZ,
166 name: "HCW MediaMVP BOOT",
167 offset: MB4_RW_PART3_OF,
168 size: MB4_RW_PART3_SZ,
177 #define MB1_WINDOW_ADDR 0xfff00000
178 #define MB1_WINDOW_SIZE 0x00100000
180 #define MB1_RW_PART0_OF 0
181 #define MB1_RW_PART0_SZ 0x80000 /* 8*64 = 512KB data */
183 #define MB1_RW_PART1_OF MB1_RW_PART0_OF + MB1_RW_PART0_SZ
184 #define MB1_RW_PART1_SZ 0x10000 /* 64KB VPD = 4KB VPD + 4KB NVRAM */
186 #define MB1_RW_PART2_OF MB1_RW_PART1_OF + MB1_RW_PART1_SZ
187 #define MB1_RW_PART2_SZ 0x10000 /* 64KB LOGO = 56KB LOGO + 8KB XXX */
189 #define MB1_RW_PART3_OF MB1_RW_PART2_OF + MB1_RW_PART2_SZ
190 #define MB1_RW_PART3_SZ 0x80000-0x20000-0x20000 /* 320 - 64 = 256KB File System */
192 #define MB1_RW_PART4_OF MB1_RW_PART3_OF + MB1_RW_PART3_SZ /* 128KB Bootloader(Open BIOS) */
193 #define MB1_RW_PART4_SZ 0x20000
195 static struct mtd_partition mb1_redwood_flash_partitions[] = {
197 name: "HCW MediaMVP KERN",
198 offset: MB1_RW_PART0_OF,
199 size: MB1_RW_PART0_SZ,
202 name: "HCW MediaMVP VPD",
203 offset: MB1_RW_PART1_OF,
204 size: MB1_RW_PART1_SZ,
205 //mask_flags: MTD_WRITEABLE /* force read-only */
208 name: "HCW MediaMVP LOGO",
209 offset: MB1_RW_PART2_OF,
210 size: MB1_RW_PART2_SZ,
211 //mask_flags: MTD_WRITEABLE /* force read-only */
214 name: "HCW MediaMVP FS",
215 offset: MB1_RW_PART3_OF,
216 size: MB1_RW_PART3_SZ,
219 name: "HCW MediaMVP BOOT",
220 offset: MB1_RW_PART4_OF,
221 size: MB1_RW_PART4_SZ,
222 //mask_flags: MTD_WRITEABLE /* force read-only */
229 #define MBQ_WINDOW_ADDR 0xfffC0000
230 #define MBQ_WINDOW_SIZE 0x00040000
232 #define MBQ_RW_PART0_OF 0
233 #define MBQ_RW_PART0_SZ 0x10000 /* 64KB VPD (4KB VPD + 4KB NVRAM) */
235 #define MBQ_RW_PART1_OF MBQ_RW_PART0_OF + MBQ_RW_PART0_SZ
236 #define MBQ_RW_PART1_SZ 0x10000 /* 64KB Logo */
238 #define MBQ_RW_PART2_OF MBQ_RW_PART1_OF + MBQ_RW_PART1_SZ
239 #define MBQ_RW_PART2_SZ 0x20000 /* 128KB Bootloader(Open BIOS) */
242 static struct mtd_partition mbq_redwood_flash_partitions[] = {
244 name: "HCW MediaMVP VPD",
245 offset: MBQ_RW_PART0_OF,
246 size: MBQ_RW_PART0_SZ,
247 //mask_flags: MTD_WRITEABLE /* force read-only */
250 name: "HCW MediaMVP LOGO",
251 offset: MBQ_RW_PART1_OF,
252 size: MBQ_RW_PART1_SZ,
253 //mask_flags: MTD_WRITEABLE /* force read-only */
256 name: "HCW MediaMVP BOOT",
257 offset: MBQ_RW_PART2_OF,
258 size: MBQ_RW_PART2_SZ,
259 //mask_flags: MTD_WRITEABLE /* force read-only */
267 #define WINDOW_ADDR 0xff800000
268 #define WINDOW_SIZE 0x00800000
270 #define RW_PART0_OF 0
271 #define RW_PART0_SZ 0x400000 /* 4 MB data */
272 #define RW_PART1_OF RW_PART0_OF + RW_PART0_SZ
273 #define RW_PART1_SZ 0x10000 /* 64K VPD */
274 #define RW_PART2_OF RW_PART1_OF + RW_PART1_SZ
275 #define RW_PART2_SZ 0x400000 - (0x10000 + 0x20000)
276 #define RW_PART3_OF RW_PART2_OF + RW_PART2_SZ
277 #define RW_PART3_SZ 0x20000
279 static struct mtd_partition redwood_flash_partitions[] = {
281 name: "Redwood kernel",
286 name: "Redwood OpenBIOS Vital Product Data",
289 mask_flags: MTD_WRITEABLE /* force read-only */
292 name: "Redwood filesystem",
297 name: "Redwood OpenBIOS",
300 mask_flags: MTD_WRITEABLE /* force read-only */
308 __u8 redwood_flash_read8(struct map_info *map, unsigned long ofs)
310 return *(__u8 *)(map->map_priv_1 + ofs);
313 __u16 redwood_flash_read16(struct map_info *map, unsigned long ofs)
315 return *(__u16 *)(map->map_priv_1 + ofs);
318 __u32 redwood_flash_read32(struct map_info *map, unsigned long ofs)
320 return *(volatile unsigned int *)(map->map_priv_1 + ofs);
323 void redwood_flash_copy_from(struct map_info *map, void *to,
324 unsigned long from, ssize_t len)
326 memcpy(to, (void *)(map->map_priv_1 + from), len);
329 void redwood_flash_write8(struct map_info *map, __u8 d, unsigned long adr)
331 *(__u8 *)(map->map_priv_1 + adr) = d;
334 void redwood_flash_write16(struct map_info *map, __u16 d, unsigned long adr)
336 *(__u16 *)(map->map_priv_1 + adr) = d;
339 void redwood_flash_write32(struct map_info *map, __u32 d, unsigned long adr)
341 *(__u32 *)(map->map_priv_1 + adr) = d;
344 void redwood_flash_copy_to(struct map_info *map, unsigned long to,
345 const void *from, ssize_t len)
347 memcpy((void *)(map->map_priv_1 + to), from, len);
352 struct map_info redwood_flash_map = {
353 name: "HCW MediaMVP",
354 // size: WINDOW_SIZE,
356 read8: redwood_flash_read8,
357 read16: redwood_flash_read16,
358 read32: redwood_flash_read32,
359 copy_from: redwood_flash_copy_from,
360 write8: redwood_flash_write8,
361 write16: redwood_flash_write16,
362 write32: redwood_flash_write32,
363 copy_to: redwood_flash_copy_to
366 #define NUM_REDWOOD_FLASH_PARTITIONS(flash_partitions) \
367 (sizeof(flash_partitions)/sizeof((flash_partitions)[0]))
370 static struct mtd_info *redwood_mtd;
372 int __init init_redwood_flash(void)
375 struct mtd_partition *redwood_flash_partitions;
379 * Am29LV800/200BT does NOT seem to do CFI
381 redwood_flash_map.map_priv_1 =
382 (unsigned long)ioremap(MB1_WINDOW_ADDR, MB1_WINDOW_SIZE);
384 if (!redwood_flash_map.map_priv_1) {
385 printk("init_redwood_flash: failed to ioremap\n");
389 printk(KERN_NOTICE "HCW MediaMVP: flash mapping: %x at %x to %lx\n",
390 MB1_WINDOW_SIZE, MB1_WINDOW_ADDR, redwood_flash_map.map_priv_1);
392 redwood_flash_map.size = MB1_WINDOW_SIZE;
393 redwood_mtd = do_map_probe("jedec_probe",&redwood_flash_map);
395 printk("jedec_probe: found redwood_mtd size = %08x\n", redwood_mtd->size);
396 if( redwood_mtd->size == 0x00100000 ) {
397 redwood_flash_partitions = mb1_redwood_flash_partitions;
398 numparts = NUM_REDWOOD_FLASH_PARTITIONS(mb1_redwood_flash_partitions);
399 printk(KERN_NOTICE "HCW MediaMVP: jedec_probe: add [%d]parts\n", numparts);
402 map_destroy( redwood_mtd );
405 printk(KERN_NOTICE "HCW MediaMVP: jedec_probe: no known JEDEC part found\n");
406 iounmap((void*)(redwood_flash_map.map_priv_1));
413 redwood_flash_map.map_priv_1 =
414 (unsigned long)ioremap(MB4_WINDOW_ADDR, MB4_WINDOW_SIZE);
416 if (!redwood_flash_map.map_priv_1) {
417 printk("init_redwood_flash: failed to ioremap\n");
421 printk(KERN_NOTICE "HCW MediaMVP: flash mapping: %x at %x to %lx\n",
422 MB4_WINDOW_SIZE, MB4_WINDOW_ADDR, redwood_flash_map.map_priv_1);
428 redwood_flash_map.size = MB4_WINDOW_SIZE;
429 redwood_mtd = do_map_probe("cfi_probe",&redwood_flash_map);
431 printk("cfi_probe: found redwood_mtd size = %08x\n", redwood_mtd->size);
432 redwood_flash_partitions = mb4_redwood_flash_partitions;
433 numparts = NUM_REDWOOD_FLASH_PARTITIONS(mb4_redwood_flash_partitions);
434 printk(KERN_NOTICE "HCW MediaMVP: cfi_probe: adding [%d]parts\n", numparts);
438 printk(KERN_NOTICE "HCW MediaMVP: cfi_probe: no known CFI part found\n");
439 iounmap((void*)(redwood_flash_map.map_priv_1));
445 * try jedec too for ST320DT???
447 redwood_flash_map.map_priv_1 =
448 (unsigned long)ioremap(MB4_WINDOW_ADDR, MB4_WINDOW_SIZE);
450 if (!redwood_flash_map.map_priv_1) {
451 printk("init_redwood_flash: failed to ioremap\n");
455 printk(KERN_NOTICE "HCW MediaMVP: flash mapping: %x at %x to %lx\n",
456 MB4_WINDOW_SIZE, MB4_WINDOW_ADDR, redwood_flash_map.map_priv_1);
458 redwood_flash_map.size = MB4_WINDOW_SIZE;
459 redwood_mtd = do_map_probe("jedec_probe",&redwood_flash_map);
461 printk("jedec_probe: found redwood_mtd size = %08x\n", redwood_mtd->size);
462 redwood_flash_partitions = mb4_redwood_flash_partitions;
463 numparts = NUM_REDWOOD_FLASH_PARTITIONS(mb4_redwood_flash_partitions);
464 printk(KERN_NOTICE "HCW MediaMVP: jedec_probe: adding [%d]parts\n", numparts);
468 printk(KERN_NOTICE "HCW MediaMVP: jedec_probe: no known CFI part found\n");
469 iounmap((void*)(redwood_flash_map.map_priv_1));
477 redwood_mtd->module = THIS_MODULE;
478 return add_mtd_partitions(redwood_mtd, redwood_flash_partitions, numparts);
484 static void __exit cleanup_redwood_flash(void)
487 del_mtd_partitions(redwood_mtd);
488 /* moved iounmap after map_destroy -armin*/
489 map_destroy(redwood_mtd);
490 iounmap((void *)redwood_flash_map.map_priv_1);
494 module_init(init_redwood_flash);
495 module_exit(cleanup_redwood_flash);
497 MODULE_LICENSE("GPL");
498 MODULE_AUTHOR("Armin Kuster <akuster@mvista.com>");
499 MODULE_DESCRIPTION("MTD map driver for the IBM Redwood reference boards");