1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun /* Copyright (c) 2018 Rockchip Electronics Co. Ltd. */ 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #ifndef __RKFLASH_BLK_H 6*4882a593Smuzhiyun #define __RKFLASH_BLK_H 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/semaphore.h> 9*4882a593Smuzhiyun #include "rkflash_api.h" 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun /* RKFLASH Dev Patition Max Count */ 12*4882a593Smuzhiyun #define MAX_PART_COUNT 32 13*4882a593Smuzhiyun #define RK_PARTITION_TAG 0x50464B52 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun struct flash_part { 16*4882a593Smuzhiyun unsigned char name[32]; 17*4882a593Smuzhiyun unsigned int offset; 18*4882a593Smuzhiyun unsigned int size; 19*4882a593Smuzhiyun unsigned char type; 20*4882a593Smuzhiyun }; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun struct flash_blk_ops { 23*4882a593Smuzhiyun char *name; 24*4882a593Smuzhiyun int major; 25*4882a593Smuzhiyun int minorbits; 26*4882a593Smuzhiyun int last_dev_index; 27*4882a593Smuzhiyun struct request_queue *rq; 28*4882a593Smuzhiyun spinlock_t queue_lock; /* queue lock */ 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* block-mq */ 31*4882a593Smuzhiyun struct list_head rq_list; 32*4882a593Smuzhiyun struct blk_mq_tag_set *tag_set; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun struct list_head devs; 35*4882a593Smuzhiyun struct module *owner; 36*4882a593Smuzhiyun }; 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun struct flash_blk_dev { 39*4882a593Smuzhiyun struct flash_blk_ops *blk_ops; 40*4882a593Smuzhiyun struct list_head list; 41*4882a593Smuzhiyun int devnum; 42*4882a593Smuzhiyun unsigned int size; 43*4882a593Smuzhiyun unsigned int off_size; 44*4882a593Smuzhiyun int readonly; 45*4882a593Smuzhiyun int writeonly; 46*4882a593Smuzhiyun int disable_access; 47*4882a593Smuzhiyun void *blkcore_priv; 48*4882a593Smuzhiyun }; 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun enum ENUM_PARTITION_TYPE { 51*4882a593Smuzhiyun PART_VENDOR = 1 << 0, 52*4882a593Smuzhiyun PART_IDBLOCK = 1 << 1, 53*4882a593Smuzhiyun PART_KERNEL = 1 << 2, 54*4882a593Smuzhiyun PART_BOOT = 1 << 3, 55*4882a593Smuzhiyun PART_USER = 1 << 31 56*4882a593Smuzhiyun }; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun struct STRUCT_DATETIME { 59*4882a593Smuzhiyun unsigned short year; 60*4882a593Smuzhiyun unsigned char month; 61*4882a593Smuzhiyun unsigned char day; 62*4882a593Smuzhiyun unsigned char hour; 63*4882a593Smuzhiyun unsigned char min; 64*4882a593Smuzhiyun unsigned char sec; 65*4882a593Smuzhiyun unsigned char reserve; 66*4882a593Smuzhiyun }; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun struct STRUCT_FW_HEADER { 69*4882a593Smuzhiyun unsigned int ui_fw_tag; /* "RKFP" */ 70*4882a593Smuzhiyun struct STRUCT_DATETIME dt_release_data_time; 71*4882a593Smuzhiyun unsigned int ui_fw_ver; 72*4882a593Smuzhiyun unsigned int ui_size; /* size of sturct,unit of u8 */ 73*4882a593Smuzhiyun unsigned int ui_part_entry_offset; /* unit of sector */ 74*4882a593Smuzhiyun unsigned int ui_backup_part_entry_offset; 75*4882a593Smuzhiyun unsigned int ui_part_entry_size; /* unit of u8 */ 76*4882a593Smuzhiyun unsigned int ui_part_entry_count; 77*4882a593Smuzhiyun unsigned int ui_fw_size; /* unit of u8 */ 78*4882a593Smuzhiyun unsigned char reserved[464]; 79*4882a593Smuzhiyun unsigned int ui_part_entry_crc; 80*4882a593Smuzhiyun unsigned int ui_header_crc; 81*4882a593Smuzhiyun }; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun struct STRUCT_PART_ENTRY { 84*4882a593Smuzhiyun unsigned char sz_name[32]; 85*4882a593Smuzhiyun enum ENUM_PARTITION_TYPE em_part_type; 86*4882a593Smuzhiyun unsigned int ui_pt_off; /* unit of sector */ 87*4882a593Smuzhiyun unsigned int ui_pt_sz; /* unit of sector */ 88*4882a593Smuzhiyun unsigned int ui_data_length; /* unit of u8 */ 89*4882a593Smuzhiyun unsigned int ui_part_property; 90*4882a593Smuzhiyun unsigned char reserved[76]; 91*4882a593Smuzhiyun }; 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun struct STRUCT_PART_INFO { 94*4882a593Smuzhiyun struct STRUCT_FW_HEADER hdr; /* 0.5KB */ 95*4882a593Smuzhiyun struct STRUCT_PART_ENTRY part[12]; /* 1.5KB */ 96*4882a593Smuzhiyun } __packed; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun /* Including Dev APIs */ 99*4882a593Smuzhiyun #ifdef CONFIG_RK_SFC_NAND_MTD 100*4882a593Smuzhiyun int sfc_nand_mtd_init(struct SFNAND_DEV *p_dev, struct mutex *lock); 101*4882a593Smuzhiyun #endif 102*4882a593Smuzhiyun #ifdef CONFIG_RK_SFC_NOR_MTD 103*4882a593Smuzhiyun int sfc_nor_mtd_init(struct SFNOR_DEV *p_dev, struct mutex *lock); 104*4882a593Smuzhiyun #endif 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun int rkflash_dev_suspend(void); 107*4882a593Smuzhiyun int rkflash_dev_resume(void __iomem *reg_addr); 108*4882a593Smuzhiyun void rkflash_dev_shutdown(void); 109*4882a593Smuzhiyun void rkflash_dev_flush(void); 110*4882a593Smuzhiyun int rkflash_dev_init(void __iomem *reg_addr, 111*4882a593Smuzhiyun enum flash_type type, 112*4882a593Smuzhiyun const struct flash_boot_ops *ops); 113*4882a593Smuzhiyun int rkflash_dev_exit(void); 114*4882a593Smuzhiyun int rkflash_vendor_read(u32 sec, u32 n_sec, void *p_data); 115*4882a593Smuzhiyun int rkflash_vendor_write(u32 sec, u32 n_sec, void *p_data); 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun #endif 118