1ba0501acSDingqiang Lin /* 2ba0501acSDingqiang Lin * Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd 3ba0501acSDingqiang Lin * 4ba0501acSDingqiang Lin * SPDX-License-Identifier: GPL-2.0 5ba0501acSDingqiang Lin */ 6ba0501acSDingqiang Lin 7ba0501acSDingqiang Lin #ifndef __FLASH_COM_H 8ba0501acSDingqiang Lin #define __FLASH_COM_H 9ba0501acSDingqiang Lin 10ba0501acSDingqiang Lin #include "typedef.h" 11ba0501acSDingqiang Lin 12ba0501acSDingqiang Lin #define NAND_ERROR INVALID_UINT32 13ba0501acSDingqiang Lin #define NAND_OK 0 14ba0501acSDingqiang Lin 15ba0501acSDingqiang Lin #define NAND_STS_OK 0 /* bit 0 ecc error or ok */ 16ba0501acSDingqiang Lin #define NAND_STS_REFRESH 256 /* need refresh */ 17ba0501acSDingqiang Lin #define NAND_STS_EMPTY 512 /* page is not proged */ 18ba0501acSDingqiang Lin #define NAND_STS_ECC_ERR NAND_ERROR 19ba0501acSDingqiang Lin 206f226dcaSJon Lin #define NAND_IDB_START 64 /* 32 KB*/ 216f226dcaSJon Lin #define NAND_IDB_SIZE 512 /* 256 KB*/ 22*9371a438SJon Lin #define NAND_IDB_END (NAND_IDB_START + NAND_IDB_SIZE - 1) 23*9371a438SJon Lin #define DEFAULT_IDB_RESERVED_BLOCK 8 246f226dcaSJon Lin 25ba0501acSDingqiang Lin #define FULL_SLC 0 26ba0501acSDingqiang Lin #define SLC 1 27ba0501acSDingqiang Lin 28ba0501acSDingqiang Lin #define NAND_FLASH_MLC_PAGE_TAG 0xFFFF 29ba0501acSDingqiang Lin #define MAX_FLASH_PAGE_SIZE 0x1000 /* 4KB */ 30ba0501acSDingqiang Lin 31ba0501acSDingqiang Lin #define PAGE_ADDR_BITS 0 32ba0501acSDingqiang Lin #define PAGE_ADDR_MASK ((1u << 11) - 1) 33ba0501acSDingqiang Lin #define BLOCK_ADDR_BITS 11 34ba0501acSDingqiang Lin #define BLOCK_ADDR_MASK ((1u << 14) - 1) 35ba0501acSDingqiang Lin #define DIE_ADDR_BITS 25 36ba0501acSDingqiang Lin #define DIE_ADDR_MASK ((1u << 3) - 1) 37ba0501acSDingqiang Lin #define FLAG_ADDR_BITS 28 38ba0501acSDingqiang Lin #define FLAG_ADDR_MASK ((1u << 4) - 1) 39ba0501acSDingqiang Lin #define PHY_BLK_DIE_ADDR_BITS 14 40ba0501acSDingqiang Lin 41ba0501acSDingqiang Lin struct nand_req { 42ba0501acSDingqiang Lin u32 status; 43ba0501acSDingqiang Lin u32 page_addr; /* 31:28 flag, 27:25: die, 24:11 block, 10:0 page */ 44ba0501acSDingqiang Lin u32 *p_data; 45ba0501acSDingqiang Lin u32 *p_spare; 46ba0501acSDingqiang Lin u32 lpa; 47ba0501acSDingqiang Lin }; 48ba0501acSDingqiang Lin 49ba0501acSDingqiang Lin struct nand_phy_info { 50ba0501acSDingqiang Lin u16 nand_type; /* SLC,MLC,TLC */ 51ba0501acSDingqiang Lin u16 die_num; /* number of LUNs */ 52ba0501acSDingqiang Lin u16 plane_per_die; 53ba0501acSDingqiang Lin u16 blk_per_plane; 54ba0501acSDingqiang Lin u16 blk_per_die; 55ba0501acSDingqiang Lin u16 page_per_blk; /* in MLC mode */ 56ba0501acSDingqiang Lin u16 page_per_slc_blk; /* in SLC mode */ 57ba0501acSDingqiang Lin u16 sec_per_page; /* physical page data size */ 58ba0501acSDingqiang Lin u16 sec_per_blk; /* physical page data size */ 59ba0501acSDingqiang Lin u16 byte_per_sec; /* size of logical sectors */ 60ba0501acSDingqiang Lin u16 reserved_blk; /* reserved for boot loader in die 0*/ 61ba0501acSDingqiang Lin u8 ecc_bits; 62ba0501acSDingqiang Lin }; 63ba0501acSDingqiang Lin 64ba0501acSDingqiang Lin struct nand_ops { 65ba0501acSDingqiang Lin s32 (*get_bad_blk_list)(u16 *table, u32 die); 66ba0501acSDingqiang Lin u32 (*erase_blk)(u8 cs, u32 page_addr); 67ba0501acSDingqiang Lin u32 (*prog_page)(u8 cs, u32 page_addr, u32 *data, u32 *spare); 68ba0501acSDingqiang Lin u32 (*read_page)(u8 cs, u32 page_addr, u32 *data, u32 *spare); 6957d18453Sjon.lin void (*bch_sel)(u8 bits); 7057d18453Sjon.lin void (*set_sec_num)(u8 num); 71ba0501acSDingqiang Lin }; 72ba0501acSDingqiang Lin 73ba0501acSDingqiang Lin #endif 74