hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/soc/rockchip/mtd_vendor_storage.c
....@@ -20,6 +20,7 @@
2020
2121 #define MTD_VENDOR_PART_START 0
2222 #define MTD_VENDOR_PART_SIZE FLASH_VENDOR_PART_SIZE
23
+#define MTD_VENDOR_NOR_BLOCK_SIZE 128
2324 #define MTD_VENDOR_PART_NUM 1
2425 #define MTD_VENDOR_TAG VENDOR_HEAD_TAG
2526
....@@ -43,6 +44,7 @@
4344 static struct flash_vendor_info *g_vendor;
4445 static DEFINE_MUTEX(vendor_ops_mutex);
4546 static struct mtd_info *mtd;
47
+static u32 mtd_erase_size;
4648 static const char *vendor_mtd_name = "vnvm";
4749 static struct mtd_nand_info nand_info;
4850 static struct platform_device *g_pdev;
....@@ -54,8 +56,8 @@
5456 struct erase_info ei;
5557
5658 re_write:
57
- if (nand_info.page_offset >= mtd->erasesize) {
58
- nand_info.blk_offset += mtd->erasesize;
59
+ if (nand_info.page_offset >= mtd_erase_size) {
60
+ nand_info.blk_offset += mtd_erase_size;
5961 if (nand_info.blk_offset >= mtd->size)
6062 nand_info.blk_offset = 0;
6163 if (mtd_block_isbad(mtd, nand_info.blk_offset))
....@@ -63,7 +65,7 @@
6365
6466 memset(&ei, 0, sizeof(struct erase_info));
6567 ei.addr = nand_info.blk_offset;
66
- ei.len = mtd->erasesize;
68
+ ei.len = mtd_erase_size;
6769 if (mtd_erase(mtd, &ei))
6870 goto re_write;
6971
....@@ -100,7 +102,15 @@
100102 nand_info.ops_size = (sizeof(*g_vendor) + mtd->writesize - 1) / mtd->writesize;
101103 nand_info.ops_size *= mtd->writesize;
102104
103
- for (offset = 0; offset < mtd->size; offset += mtd->erasesize) {
105
+ /*
106
+ * The NOR FLASH erase size maybe config as 4KB, need to re-define
107
+ * and maintain consistency with uboot.
108
+ */
109
+ mtd_erase_size = mtd->erasesize;
110
+ if (mtd_erase_size <= MTD_VENDOR_NOR_BLOCK_SIZE * 512)
111
+ mtd_erase_size = MTD_VENDOR_NOR_BLOCK_SIZE * 512;
112
+
113
+ for (offset = 0; offset < mtd->size; offset += mtd_erase_size) {
104114 if (!mtd_block_isbad(mtd, offset)) {
105115 err = mtd_read(mtd, offset, sizeof(*g_vendor),
106116 &bytes_read, (u8 *)g_vendor);
....@@ -115,11 +125,11 @@
115125 }
116126 }
117127 } else if (nand_info.blk_offset == offset)
118
- nand_info.blk_offset += mtd->erasesize;
128
+ nand_info.blk_offset += mtd_erase_size;
119129 }
120130
121131 if (nand_info.version) {
122
- for (offset = mtd->erasesize - nand_info.ops_size;
132
+ for (offset = mtd_erase_size - nand_info.ops_size;
123133 offset >= 0;
124134 offset -= nand_info.ops_size) {
125135 err = mtd_read(mtd, nand_info.blk_offset + offset,
....@@ -145,7 +155,10 @@
145155 if (bytes_read == sizeof(*g_vendor) &&
146156 g_vendor->tag == MTD_VENDOR_TAG &&
147157 g_vendor->version == g_vendor->version2) {
148
- nand_info.version = g_vendor->version;
158
+ if (nand_info.version > g_vendor->version)
159
+ g_vendor->version = nand_info.version;
160
+ else
161
+ nand_info.version = g_vendor->version;
149162 break;
150163 }
151164 }
....@@ -155,11 +168,11 @@
155168 g_vendor->tag = MTD_VENDOR_TAG;
156169 g_vendor->free_size = sizeof(g_vendor->data);
157170 g_vendor->version2 = g_vendor->version;
158
- for (offset = 0; offset < mtd->size; offset += mtd->erasesize) {
171
+ for (offset = 0; offset < mtd->size; offset += mtd_erase_size) {
159172 if (!mtd_block_isbad(mtd, offset)) {
160173 memset(&ei, 0, sizeof(struct erase_info));
161174 ei.addr = nand_info.blk_offset + offset;
162
- ei.len = mtd->erasesize;
175
+ ei.len = mtd_erase_size;
163176 mtd_erase(mtd, &ei);
164177 }
165178 }