2 * NAND Flash Controller Device Driver
3 * Copyright (c) 2009, Intel Corporation and its suppliers.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
9 * This program is distributed in the hope it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
20 #ifndef _FLASH_INTERFACE_
21 #define _FLASH_INTERFACE_
24 #include "spectraswconfig.h"
26 #define MAX_BYTE_VALUE 0xFF
27 #define MAX_WORD_VALUE 0xFFFF
28 #define MAX_U32_VALUE 0xFFFFFFFF
30 #define MAX_BLOCKNODE_VALUE 0xFFFFFF
31 #define DISCARD_BLOCK 0x800000
32 #define SPARE_BLOCK 0x400000
33 #define BAD_BLOCK 0xC00000
35 #define UNHIT_CACHE_ITEM 0xFFFF
37 #define NAND_CACHE_INIT_ADDR 0xffffffffffffffffULL
39 #define IN_PROGRESS_BLOCK_TABLE 0x00
40 #define CURRENT_BLOCK_TABLE 0x01
42 #define BTSIG_OFFSET (0)
43 #define BTSIG_BYTES (5)
44 #define BTSIG_DELTA (3)
46 #define MAX_READ_COUNTER 0x2710
48 #define FIRST_BT_ID (1)
49 #define LAST_BT_ID (254)
50 #define BTBLOCK_INVAL (u32)(0xFFFFFFFF)
52 struct device_info_tag
{
56 u32 wSpectraStartBlock
;
63 u16 wNumPageSpareFlag
;
64 u16 wECCBytesPerSector
;
69 u16 wDeviceMainAreaSize
;
70 u16 wDeviceSpareAreaSize
;
71 u16 wDevicesConnected
;
79 u16 wONFIPgmCacheTimingMode
;
85 u8 nBitsInPageDataSize
;
86 u8 nBitsInBlockDataSize
;
89 extern struct device_info_tag DeviceInfo
;
91 /* Cache item format */
92 struct flash_cache_item_tag
{
99 struct flash_cache_tag
{
100 u32 cache_item_size
; /* Size in bytes of each cache item */
101 u16 pages_per_item
; /* How many NAND pages in each cache item */
102 u16 LRU
; /* No. of the least recently used cache item */
103 struct flash_cache_item_tag array
[CACHE_ITEM_NUM
];
107 *Data structure for each list node of the management table
108 * used for the Level 2 Cache. Each node maps one logical NAND block.
110 struct spectra_l2_cache_list
{
111 struct list_head list
;
112 u32 logical_blk_num
; /* Logical block number */
113 u32 pages_array
[]; /* Page map array of this logical block.
114 * Array index is the logical block number,
115 * and for every item of this arry:
116 * high 16 bit is index of the L2 cache block num,
117 * low 16 bit is the phy page num
118 * of the above L2 cache block.
119 * This array will be kmalloc during run time.
123 struct spectra_l2_cache_info
{
124 u32 blk_array
[BLK_NUM_FOR_L2_CACHE
];
125 u16 cur_blk_idx
; /* idx to the phy block number of current using */
126 u16 cur_page_num
; /* pages number of current using */
127 struct spectra_l2_cache_list table
; /* First node of the table */
130 #define RESTORE_CACHE_ON_CDMA_CHAIN_FAILURE 1
132 #if RESTORE_CACHE_ON_CDMA_CHAIN_FAILURE
133 struct flash_cache_mod_item_tag
{
138 struct flash_cache_delta_list_tag
{
139 u8 item
; /* used cache item */
140 struct flash_cache_mod_item_tag cache
;
144 extern struct flash_cache_tag Cache
;
146 extern u8
*buf_read_page_main_spare
;
147 extern u8
*buf_write_page_main_spare
;
148 extern u8
*buf_read_page_spare
;
149 extern u8
*buf_get_bad_block
;
150 extern u8
*cdma_desc_buf
;
151 extern u8
*memcp_desc_buf
;
153 /* struture used for IndentfyDevice function */
154 struct spectra_indentfy_dev_tag
{
158 u16 wECCBytesPerSector
;
162 int GLOB_FTL_Flash_Init(void);
163 int GLOB_FTL_Flash_Release(void);
164 /*void GLOB_FTL_Erase_Flash(void);*/
165 int GLOB_FTL_Block_Erase(u64 block_addr
);
166 int GLOB_FTL_Is_BadBlock(u32 block_num
);
167 int GLOB_FTL_IdentifyDevice(struct spectra_indentfy_dev_tag
*dev_data
);
168 int GLOB_FTL_Event_Status(int *);
169 u16
glob_ftl_execute_cmds(void);
171 /*int FTL_Read_Disturbance(ADDRESSTYPE dwBlockAddr);*/
172 int FTL_Read_Disturbance(u32 dwBlockAddr
);
174 /*Flash r/w based on cache*/
175 int GLOB_FTL_Page_Read(u8
*read_data
, u64 page_addr
);
176 int GLOB_FTL_Page_Write(u8
*write_data
, u64 page_addr
);
177 int GLOB_FTL_Wear_Leveling(void);
178 int GLOB_FTL_Flash_Format(void);
179 int GLOB_FTL_Init(void);
180 int GLOB_FTL_Flush_Cache(void);
181 int GLOB_FTL_Garbage_Collection(void);
182 int GLOB_FTL_BT_Garbage_Collection(void);
183 void GLOB_FTL_Cache_Release(void);
184 u8
*get_blk_table_start_addr(void);
185 u8
*get_wear_leveling_table_start_addr(void);
186 unsigned long get_blk_table_len(void);
187 unsigned long get_wear_leveling_table_len(void);
190 void debug_boundary_lineno_error(int chnl
, int limit
, int no
, int lineno
,
192 #define debug_boundary_error(chnl, limit, no) debug_boundary_lineno_error(chnl,\
193 limit, no, __LINE__, __FILE__)
195 #define debug_boundary_error(chnl, limit, no) ;
198 #endif /*_FLASH_INTERFACE_*/