summaryrefslogtreecommitdiffstats
path: root/target/linux/brcm63xx/patches-3.2/040-bcm963xx_flashmap.patch
blob: 2babb9e58101595ddb6ab1183f1cb337424d98ab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
From a4d005c91d403d9f3d0272db6cc46202c06ec774 Mon Sep 17 00:00:00 2001
From: Axel Gembe <ago@bastart.eu.org>
Date: Mon, 12 May 2008 18:54:09 +0200
Subject: [PATCH] bcm963xx: flashmap support

Signed-off-by: Axel Gembe <ago@bastart.eu.org>
---
 arch/mips/bcm63xx/boards/board_bcm963xx.c |   19 +----------------
 drivers/mtd/maps/bcm963xx-flash.c         |   32 ++++++++++++++++++++++++----
 drivers/mtd/redboot.c                     |   13 +++++++++--
 3 files changed, 38 insertions(+), 26 deletions(-)

--- a/arch/mips/bcm63xx/boards/board_bcm963xx.c
+++ b/arch/mips/bcm63xx/boards/board_bcm963xx.c
@@ -822,20 +822,6 @@ void __init board_setup(void)
 		panic("unexpected CPU for bcm963xx board");
 }
 
-static struct mtd_partition mtd_partitions[] = {
-	{
-		.name		= "cfe",
-		.offset		= 0x0,
-		.size		= 0x40000,
-	}
-};
-
-static struct physmap_flash_data flash_data = {
-	.width			= 2,
-	.nr_parts		= ARRAY_SIZE(mtd_partitions),
-	.parts			= mtd_partitions,
-};
-
 static struct resource mtd_resources[] = {
 	{
 		.start		= 0,	/* filled at runtime */
@@ -845,12 +831,9 @@ static struct resource mtd_resources[] =
 };
 
 static struct platform_device mtd_dev = {
-	.name			= "physmap-flash",
+	.name			= "bcm963xx-flash",
 	.resource		= mtd_resources,
 	.num_resources		= ARRAY_SIZE(mtd_resources),
-	.dev			= {
-		.platform_data	= &flash_data,
-	},
 };
 
 static struct gpio_led_platform_data bcm63xx_led_data;
--- a/drivers/mtd/maps/bcm963xx-flash.c
+++ b/drivers/mtd/maps/bcm963xx-flash.c
@@ -28,6 +28,8 @@
 #include <linux/vmalloc.h>
 #include <linux/platform_device.h>
 #include <linux/io.h>
+#include <linux/magic.h>
+#include <linux/jffs2.h>
 
 #include <asm/mach-bcm63xx/bcm963xx_tag.h>
 
@@ -36,6 +38,14 @@
 
 #define PFX KBUILD_MODNAME ": "
 
+struct squashfs_super_block {
+	__le32 s_magic;
+	__le32 pad0[9];
+	__le64 bytes_used;
+};
+
+extern int parse_redboot_partitions(struct mtd_info *master, struct mtd_partition **pparts, unsigned long fis_origin);
+
 static struct mtd_partition *parsed_parts;
 
 static struct mtd_info *bcm963xx_mtd_info;
@@ -220,9 +230,21 @@ probe_ok:
 			}
 		}
 	} else {
-		dev_info(&pdev->dev, "unsupported bootloader\n");
-		err = -ENODEV;
-		goto err_probe;
+		printk(KERN_INFO PFX "assuming RedBoot bootloader\n");
+		if (bcm963xx_mtd_info->size > 0x00400000) {
+			printk(KERN_INFO PFX "Support for extended flash memory size : 0x%lx ; ONLY 64MBIT SUPPORT\n", bcm963xx_mtd_info->size);
+			bcm963xx_map.virt = (u32)(BCM63XX_EXTENDED_SIZE);
+		}
+
+#ifdef CONFIG_MTD_REDBOOT_PARTS
+		if (parsed_nr_parts == 0) {
+			int ret = parse_redboot_partitions(bcm963xx_mtd_info, &parsed_parts, 0);
+			if (ret > 0) {
+				part_type = "RedBoot";
+				parsed_nr_parts = ret;
+			}
+		}
+#endif
 	}
 
 	return mtd_device_register(bcm963xx_mtd_info, parsed_parts,
--- a/drivers/mtd/redboot.c
+++ b/drivers/mtd/redboot.c
@@ -58,7 +58,7 @@ static inline int redboot_checksum(struc
 	return 1;
 }
 
-static int parse_redboot_partitions(struct mtd_info *master,
+int parse_redboot_partitions(struct mtd_info *master,
 				    struct mtd_partition **pparts,
 				    struct mtd_part_parser_data *data)
 {
@@ -75,6 +75,7 @@ static int parse_redboot_partitions(stru
 	int nulllen = 0;
 	int numslots;
 	unsigned long offset;
+	unsigned long fis_origin = 0;
 #ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
 	static char nullstring[] = "unallocated";
 #endif
@@ -181,6 +182,16 @@ static int parse_redboot_partitions(stru
 		goto out;
 	}
 
+	if (data && data->origin) {
+		fis_origin = data->origin;
+	} else {
+		for (i = 0; i < numslots; i++) {
+			if (!strncmp(buf[i].name, "RedBoot", 8)) {
+				fis_origin = (buf[i].flash_base & (master->size << 1) - 1);
+			}
+		}
+	}
+
 	for (i = 0; i < numslots; i++) {
 		struct fis_list *new_fl, **prev;
 
@@ -201,10 +212,10 @@ static int parse_redboot_partitions(stru
 			goto out;
 		}
 		new_fl->img = &buf[i];
-		if (data && data->origin)
-			buf[i].flash_base -= data->origin;
-		else
-			buf[i].flash_base &= master->size-1;
+		if (fis_origin)
+			buf[i].flash_base -= fis_origin;
+
+		buf[i].flash_base &= (master->size << 1) - 1;
 
 		/* I'm sure the JFFS2 code has done me permanent damage.
 		 * I now think the following is _normal_