From 1622ff3442ff6aecc1f538cda437379d1f6a4a93 Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 06 Nov 2023 07:25:52 +0000 Subject: [PATCH] rk3568 dts --- kernel/drivers/soc/rockchip/mtd_vendor_storage.c | 73 ++++++++++++++---------------------- 1 files changed, 28 insertions(+), 45 deletions(-) diff --git a/kernel/drivers/soc/rockchip/mtd_vendor_storage.c b/kernel/drivers/soc/rockchip/mtd_vendor_storage.c index c840ead..970db37 100644 --- a/kernel/drivers/soc/rockchip/mtd_vendor_storage.c +++ b/kernel/drivers/soc/rockchip/mtd_vendor_storage.c @@ -16,38 +16,13 @@ #include <linux/soc/rockchip/rk_vendor_storage.h> #include <linux/uaccess.h> #include <linux/vmalloc.h> +#include <misc/rkflash_vendor_storage.h> #define MTD_VENDOR_PART_START 0 -#define MTD_VENDOR_PART_SIZE 8 +#define MTD_VENDOR_PART_SIZE FLASH_VENDOR_PART_SIZE +#define MTD_VENDOR_NOR_BLOCK_SIZE 128 #define MTD_VENDOR_PART_NUM 1 -#define MTD_VENDOR_TAG 0x524B5644 - -struct rk_vendor_req { - u32 tag; - u16 id; - u16 len; - u8 data[1024]; -}; - -struct vendor_item { - u16 id; - u16 offset; - u16 size; - u16 flag; -}; - -struct vendor_info { - u32 tag; - u32 version; - u16 next_index; - u16 item_num; - u16 free_offset; - u16 free_size; - struct vendor_item item[62]; - u8 data[MTD_VENDOR_PART_SIZE * 512 - 512 - 8]; - u32 hash; - u32 version2; -}; +#define MTD_VENDOR_TAG VENDOR_HEAD_TAG struct mtd_nand_info { u32 blk_offset; @@ -65,14 +40,11 @@ #define GET_LOCK_FLAG_IO _IOW('r', 0x53, unsigned int) #endif -#define VENDOR_REQ_TAG 0x56524551 -#define VENDOR_READ_IO _IOW('v', 0x01, unsigned int) -#define VENDOR_WRITE_IO _IOW('v', 0x02, unsigned int) - static u8 *g_idb_buffer; -static struct vendor_info *g_vendor; +static struct flash_vendor_info *g_vendor; static DEFINE_MUTEX(vendor_ops_mutex); static struct mtd_info *mtd; +static u32 mtd_erase_size; static const char *vendor_mtd_name = "vnvm"; static struct mtd_nand_info nand_info; @@ -83,8 +55,8 @@ struct erase_info ei; re_write: - if (nand_info.page_offset >= mtd->erasesize) { - nand_info.blk_offset += mtd->erasesize; + if (nand_info.page_offset >= mtd_erase_size) { + nand_info.blk_offset += mtd_erase_size; if (nand_info.blk_offset >= mtd->size) nand_info.blk_offset = 0; if (mtd_block_isbad(mtd, nand_info.blk_offset)) @@ -92,7 +64,7 @@ memset(&ei, 0, sizeof(struct erase_info)); ei.addr = nand_info.blk_offset; - ei.len = mtd->erasesize; + ei.len = mtd_erase_size; if (mtd_erase(mtd, &ei)) goto re_write; @@ -129,7 +101,15 @@ nand_info.ops_size = (sizeof(*g_vendor) + mtd->writesize - 1) / mtd->writesize; nand_info.ops_size *= mtd->writesize; - for (offset = 0; offset < mtd->size; offset += mtd->erasesize) { + /* + * The NOR FLASH erase size maybe config as 4KB, need to re-define + * and maintain consistency with uboot. + */ + mtd_erase_size = mtd->erasesize; + if (mtd_erase_size <= MTD_VENDOR_NOR_BLOCK_SIZE * 512) + mtd_erase_size = MTD_VENDOR_NOR_BLOCK_SIZE * 512; + + for (offset = 0; offset < mtd->size; offset += mtd_erase_size) { if (!mtd_block_isbad(mtd, offset)) { err = mtd_read(mtd, offset, sizeof(*g_vendor), &bytes_read, (u8 *)g_vendor); @@ -144,11 +124,11 @@ } } } else if (nand_info.blk_offset == offset) - nand_info.blk_offset += mtd->erasesize; + nand_info.blk_offset += mtd_erase_size; } if (nand_info.version) { - for (offset = mtd->erasesize - nand_info.ops_size; + for (offset = mtd_erase_size - nand_info.ops_size; offset >= 0; offset -= nand_info.ops_size) { err = mtd_read(mtd, nand_info.blk_offset + offset, @@ -174,7 +154,10 @@ if (bytes_read == sizeof(*g_vendor) && g_vendor->tag == MTD_VENDOR_TAG && g_vendor->version == g_vendor->version2) { - nand_info.version = g_vendor->version; + if (nand_info.version > g_vendor->version) + g_vendor->version = nand_info.version; + else + nand_info.version = g_vendor->version; break; } } @@ -184,11 +167,11 @@ g_vendor->tag = MTD_VENDOR_TAG; g_vendor->free_size = sizeof(g_vendor->data); g_vendor->version2 = g_vendor->version; - for (offset = 0; offset < mtd->size; offset += mtd->erasesize) { + for (offset = 0; offset < mtd->size; offset += mtd_erase_size) { if (!mtd_block_isbad(mtd, offset)) { memset(&ei, 0, sizeof(struct erase_info)); ei.addr = nand_info.blk_offset + offset; - ei.len = mtd->erasesize; + ei.len = mtd_erase_size; mtd_erase(mtd, &ei); } } @@ -305,7 +288,7 @@ { long ret = -1; int size; - struct rk_vendor_req *v_req; + struct RK_VENDOR_REQ *v_req; u32 *page_buf; page_buf = kmalloc(4096, GFP_KERNEL); @@ -314,7 +297,7 @@ mutex_lock(&vendor_ops_mutex); - v_req = (struct rk_vendor_req *)page_buf; + v_req = (struct RK_VENDOR_REQ *)page_buf; switch (cmd) { case VENDOR_READ_IO: -- Gitblit v1.6.2