hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/drivers/soc/rockchip/mtd_vendor_storage.c
....@@ -16,38 +16,13 @@
1616 #include <linux/soc/rockchip/rk_vendor_storage.h>
1717 #include <linux/uaccess.h>
1818 #include <linux/vmalloc.h>
19
+#include <misc/rkflash_vendor_storage.h>
1920
2021 #define MTD_VENDOR_PART_START 0
21
-#define MTD_VENDOR_PART_SIZE 8
22
+#define MTD_VENDOR_PART_SIZE FLASH_VENDOR_PART_SIZE
23
+#define MTD_VENDOR_NOR_BLOCK_SIZE 128
2224 #define MTD_VENDOR_PART_NUM 1
23
-#define MTD_VENDOR_TAG 0x524B5644
24
-
25
-struct rk_vendor_req {
26
- u32 tag;
27
- u16 id;
28
- u16 len;
29
- u8 data[1024];
30
-};
31
-
32
-struct vendor_item {
33
- u16 id;
34
- u16 offset;
35
- u16 size;
36
- u16 flag;
37
-};
38
-
39
-struct vendor_info {
40
- u32 tag;
41
- u32 version;
42
- u16 next_index;
43
- u16 item_num;
44
- u16 free_offset;
45
- u16 free_size;
46
- struct vendor_item item[62];
47
- u8 data[MTD_VENDOR_PART_SIZE * 512 - 512 - 8];
48
- u32 hash;
49
- u32 version2;
50
-};
25
+#define MTD_VENDOR_TAG VENDOR_HEAD_TAG
5126
5227 struct mtd_nand_info {
5328 u32 blk_offset;
....@@ -65,14 +40,11 @@
6540 #define GET_LOCK_FLAG_IO _IOW('r', 0x53, unsigned int)
6641 #endif
6742
68
-#define VENDOR_REQ_TAG 0x56524551
69
-#define VENDOR_READ_IO _IOW('v', 0x01, unsigned int)
70
-#define VENDOR_WRITE_IO _IOW('v', 0x02, unsigned int)
71
-
7243 static u8 *g_idb_buffer;
73
-static struct vendor_info *g_vendor;
44
+static struct flash_vendor_info *g_vendor;
7445 static DEFINE_MUTEX(vendor_ops_mutex);
7546 static struct mtd_info *mtd;
47
+static u32 mtd_erase_size;
7648 static const char *vendor_mtd_name = "vnvm";
7749 static struct mtd_nand_info nand_info;
7850
....@@ -83,8 +55,8 @@
8355 struct erase_info ei;
8456
8557 re_write:
86
- if (nand_info.page_offset >= mtd->erasesize) {
87
- nand_info.blk_offset += mtd->erasesize;
58
+ if (nand_info.page_offset >= mtd_erase_size) {
59
+ nand_info.blk_offset += mtd_erase_size;
8860 if (nand_info.blk_offset >= mtd->size)
8961 nand_info.blk_offset = 0;
9062 if (mtd_block_isbad(mtd, nand_info.blk_offset))
....@@ -92,7 +64,7 @@
9264
9365 memset(&ei, 0, sizeof(struct erase_info));
9466 ei.addr = nand_info.blk_offset;
95
- ei.len = mtd->erasesize;
67
+ ei.len = mtd_erase_size;
9668 if (mtd_erase(mtd, &ei))
9769 goto re_write;
9870
....@@ -129,7 +101,15 @@
129101 nand_info.ops_size = (sizeof(*g_vendor) + mtd->writesize - 1) / mtd->writesize;
130102 nand_info.ops_size *= mtd->writesize;
131103
132
- for (offset = 0; offset < mtd->size; offset += mtd->erasesize) {
104
+ /*
105
+ * The NOR FLASH erase size maybe config as 4KB, need to re-define
106
+ * and maintain consistency with uboot.
107
+ */
108
+ mtd_erase_size = mtd->erasesize;
109
+ if (mtd_erase_size <= MTD_VENDOR_NOR_BLOCK_SIZE * 512)
110
+ mtd_erase_size = MTD_VENDOR_NOR_BLOCK_SIZE * 512;
111
+
112
+ for (offset = 0; offset < mtd->size; offset += mtd_erase_size) {
133113 if (!mtd_block_isbad(mtd, offset)) {
134114 err = mtd_read(mtd, offset, sizeof(*g_vendor),
135115 &bytes_read, (u8 *)g_vendor);
....@@ -144,11 +124,11 @@
144124 }
145125 }
146126 } else if (nand_info.blk_offset == offset)
147
- nand_info.blk_offset += mtd->erasesize;
127
+ nand_info.blk_offset += mtd_erase_size;
148128 }
149129
150130 if (nand_info.version) {
151
- for (offset = mtd->erasesize - nand_info.ops_size;
131
+ for (offset = mtd_erase_size - nand_info.ops_size;
152132 offset >= 0;
153133 offset -= nand_info.ops_size) {
154134 err = mtd_read(mtd, nand_info.blk_offset + offset,
....@@ -174,7 +154,10 @@
174154 if (bytes_read == sizeof(*g_vendor) &&
175155 g_vendor->tag == MTD_VENDOR_TAG &&
176156 g_vendor->version == g_vendor->version2) {
177
- nand_info.version = g_vendor->version;
157
+ if (nand_info.version > g_vendor->version)
158
+ g_vendor->version = nand_info.version;
159
+ else
160
+ nand_info.version = g_vendor->version;
178161 break;
179162 }
180163 }
....@@ -184,11 +167,11 @@
184167 g_vendor->tag = MTD_VENDOR_TAG;
185168 g_vendor->free_size = sizeof(g_vendor->data);
186169 g_vendor->version2 = g_vendor->version;
187
- for (offset = 0; offset < mtd->size; offset += mtd->erasesize) {
170
+ for (offset = 0; offset < mtd->size; offset += mtd_erase_size) {
188171 if (!mtd_block_isbad(mtd, offset)) {
189172 memset(&ei, 0, sizeof(struct erase_info));
190173 ei.addr = nand_info.blk_offset + offset;
191
- ei.len = mtd->erasesize;
174
+ ei.len = mtd_erase_size;
192175 mtd_erase(mtd, &ei);
193176 }
194177 }
....@@ -305,7 +288,7 @@
305288 {
306289 long ret = -1;
307290 int size;
308
- struct rk_vendor_req *v_req;
291
+ struct RK_VENDOR_REQ *v_req;
309292 u32 *page_buf;
310293
311294 page_buf = kmalloc(4096, GFP_KERNEL);
....@@ -314,7 +297,7 @@
314297
315298 mutex_lock(&vendor_ops_mutex);
316299
317
- v_req = (struct rk_vendor_req *)page_buf;
300
+ v_req = (struct RK_VENDOR_REQ *)page_buf;
318301
319302 switch (cmd) {
320303 case VENDOR_READ_IO: