summaryrefslogtreecommitdiff
path: root/arch/arm/mach-tegra/include/nvodm_query_nand.h
blob: 0b89648448957e6cae1b2412ae8cc7b1becdd3cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
/*
 * Copyright (c) 2006-2009 NVIDIA Corporation.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * Neither the name of the NVIDIA Corporation nor the names of its contributors
 * may be used to endorse or promote products derived from this software
 * without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 */

/**
 * @file
 * <b>NVIDIA Tegra ODM Kit:
 *         NAND Memory Query Interface</b>
 *
 * @b Description: Defines the ODM query interface for NVIDIA NAND memory adaptation.
 *
 */
#ifndef INCLUDED_NVODM_QUERY_NAND_H
#define INCLUDED_NVODM_QUERY_NAND_H

#include "nvcommon.h"
#include "nvodm_modules.h"

#if defined(__cplusplus)
extern "C" {
#endif

/**
 * @defgroup nvodm_query_Nand NAND Memory Query Interface
 * This is the ODM query interface for NAND configurations.
 * @ingroup nvodm_query
 * @{
 */

#define FLASH_TYPE_SHIFT 16
#define DEVICE_SHIFT 8
#define FOURTH_ID_SHIFT 24
/**
 *  Defines the list of various capabilities of the NAND devices.
 */
typedef enum
{
    /// Specifies detected NAND device has only one plane; interleave not
    /// supported.
    SINGLE_PLANE,
    /// Specifies detected NAND device has only one plane; but interleave is
    /// supported for page programming.
    SINGLE_PLANE_INTERLEAVE,
    /// Specifies all types of multiplane capabilities should be declared after
    /// this.
    MULTI_PLANE,
    /// Specifies detected NAND device has multiple planes, and each plane is
    /// formed with alternate blocks from each bank.
    MULTIPLANE_ALT_BLOCK,
    /// Specifies detected NAND device has multiple planes, and each plane is
    /// formed with sequential blocks from each bank.
    MULTIPLANE_ALT_PLANE,
    /// Specifies detected NAND device has multiple planes, and each plane is
    /// formed with alternate blocks from each bank. Interleaving operation is
    /// supported across the banks.
    MULTIPLANE_ALT_BLOCK_INTERLEAVE,
    /// Specifies detected NAND device has multiple planes, and each plane is
    /// formed with sequential blocks from each bank. Interleaving operation is
    /// supported across the banks.
    MULTIPLANE_ALT_PLANE_INTERLEAVE
}NvOdmNandInterleaveCapability;

/**
 * Specifies the NAND Flash type.
 */
typedef enum
{
    /// Specifies NAND flash type is not known.
    NvOdmNandFlashType_UnKnown,
    /// Specifies SLC NAND flash type.
    NvOdmNandFlashType_Slc,
    /// Specifies MLC NAND flash type.
    NvOdmNandFlashType_Mlc,
    /// Ignore. Forces compilers to make 32-bit enums.
    NvOdmNandFlashType_Force32 = 0x7FFFFFFF
}NvOdmNandFlashType;

/// Defines the type of algorithm for error-correcting code (ECC).
typedef enum
{
    /// Specifies Hamming ECC.
    NvOdmNandECCAlgorithm_Hamming = 0,
    /// Specifies Reed-Solomon ECC.
    NvOdmNandECCAlgorithm_ReedSolomon,
    /// Specifies BCH ECC.
    NvOdmNandECCAlgorithm_BCH,
    /// Specifies to disable ECC, if the the NAND flash part being used
    /// has error correction capability within itself.
    NvOdmNandECCAlgorithm_NoEcc,
    /// Ignore. Forces compilers to make 32-bit enums.
    NvOdmNandECCAlgorithm_Force32 = 0x7FFFFFFF
}NvOdmNandECCAlgorithm;

/// Defines the number of skip spare bytes.
typedef enum
{
    NvOdmNandSkipSpareBytes_0,
    NvOdmNandSkipSpareBytes_4,
    NvOdmNandSkipSpareBytes_8,
    NvOdmNandSkipSpareBytes_12,
    NvOdmNandSkipSpareBytes_16,
    NvOdmNandSkipSpareBytes_Force32 = 0x7FFFFFFF
}NvOdmNandSkipSpareBytes;

/**
 * Defines the number of symbol errors correctable per each 512 continous
 * bytes of the flash area when Reed-Solomon algorithm is chosen for error
 * correction. Here each symbol is of 9 contiguous bits in the flash.
 *
 * @note Based on the chosen number of errors correctable, parity bytes
 * required to be stored in the spare area of NAND flash will vary. For 4
 * correctable errors the number of parity bytes required are 36 bytes.
 * Similarly, for 6 and 8 symbol error correction, 56 and 72 parity bytes
 * must be stored in the spare area. As we also must use the spare area for
 * bad block management and wear levelling, we need to have 12 bytes for that
 * in the spare area. So, the spare area size should be able to accommodate
 * parity bytes and bytes required for bad block management.
 * Hence fill this parameter based on the spare area size of the flash being
 * used.
 */
typedef enum
{
    /// Specifies 4 symbol error correction per 512 byte area of NAND flash.
    NvOdmNandNumberOfCorrectableSymbolErrors_Four,
    /// Specifies 6 symbol error correction per 512 byte area of NAND flash.
    NvOdmNandNumberOfCorrectableSymbolErrors_Six,
    /// Specifies 8 symbol error correction per 512 byte area of NAND flash.
    NvOdmNandNumberOfCorrectableSymbolErrors_Eight,
    /// Ignore. Forces compilers to make 32-bit enums.
    NvOdmNandNumberOfCorrectableSymbolErrors_Force32 = 0x7FFFFFFF
}NvOdmNandNumberOfCorrectableSymbolErrors;

/// Defines the NAND flash command set.
typedef enum
{
    /// Specifies to read command 1st cycle.
    NvOdmNandCommandList_Read = 0x00,
    /// Specifies to read command start 2nd cycle.
    NvOdmNandCommandList_Read_Start = 0x30,
    /// Specifies to read copy back 1st cycle.
    NvOdmNandCommandList_Read_Cpy_Bck = 0x00,
    /// Specifies to read copy back start 2nd cycle.
    NvOdmNandCommandList_Read_Cpy_Bck_Start = 0x35,
    /// Specifies to cache the read command.
    NvOdmNandCommandList_Cache_Read = 0x31,
    /// Specifies the last command to end cache read operation.
    NvOdmNandCommandList_Cache_ReadEnd = 0x3F,
    /// Specifies to read device ID.
    NvOdmNandCommandList_Read_Id = 0x90,
    /// Specifies to reset the device.
    NvOdmNandCommandList_Reset = 0xFF,
    /// Specifies to program/write page 1st cycle.
    NvOdmNandCommandList_Page_Program = 0x80,
    /// Specifies to program/write page 2nd cycle.
    NvOdmNandCommandList_Page_Program_Start = 0x10,
    /// Specifies to cache program 1st cycle.
    NvOdmNandCommandList_Cache_Program = 0x80,
    /// Specifies to cache program 2nd cycle.
    NvOdmNandCommandList_Cache_Program_Start = 0x15,
    /// Specifies to erase block.
    NvOdmNandCommandList_Block_Erase = 0x60,
    /// Specifies erase block start.
    NvOdmNandCommandList_Block_Erase_Start = 0xD0,
    /// Specifies copy back data.
    NvOdmNandCommandList_Copy_Back = 0x85,
    /// Specifies random data write.
    NvOdmNandCommandList_Random_Data_Input = 0x85,
    /// Specifies random data read.
    NvOdmNandCommandList_Random_Data_Out = 0x05,
    /// Specifies random data read start.
    NvOdmNandCommandList_Random_Data_Out_Start = 0xE0,
    /// Specifies multi page command.
    NvOdmNandCommandList_MultiPage = 0x11,
    NvOdmNandCommandList_MultiPageProgPlane2 = 0x81,
    /// Specifies read device status.
    NvOdmNandCommandList_Status = 0x70,
    /// Specifies read status of chip 1.
    NvOdmNandCommandList_Status_1 = 0xF1,
    /// Specifies read status of chip 2.
    NvOdmNandCommandList_Status_2 = 0xF2,
    /// Specifies ONFI read ID command.
    NvOdmNandCommandList_ONFIReadId = 0xEC,
    /// Ignore -- Forces compilers to make 32-bit enums.
    NvOdmNandCommandList_Force32 = 0x7FFFFFFF
}NvOdmNandCommandList;

/// Defines NAND flash types (42nm NAND or normal NAND).
typedef enum
{
    /// Specifies conventional NAND flash (50nm, 60nm).
    NvOdmNandDeviceType_Type1,
    /// Specifies 42nm technology NAND flash.
    NvOdmNandDeviceType_Type2,
    NvOdmNandDeviceType_Force32 = 0x7FFFFFFF
}NvOdmNandDeviceType;

/**
 * This structure holds various NAND flash parameters.
 */
typedef struct NvOdmNandFlashParamsRec
{
    /// Holds the vendor ID code.
    NvU8 VendorId;
    /// Holds the device ID code.
    NvU8 DeviceId;
    /// Holds the device type.
    NvOdmNandFlashType NandType;
    /// Holds the information whether the used NAND flash supports internal
    /// copy back command.
    NvBool IsCopyBackCommandSupported;
    /// Holds the information whether the used NAND flash supports cache
    /// write operations.
    NvBool IsCacheWriteSupported;
    /// Holds the size of the flash (in megabytes).
    NvU32 CapacityInMB;
    /// Holds the Zones per flash device--minimum value possible is 1.
    /// Zone is a group of contiguous blocks among which internal copy back can
    /// be performed, if the chip supports copy-back operation.
    /// Zone is also referred as plane or district by some flashes.
    NvU32 ZonesPerDevice;
    /// Holds the blocks per Zone of the flash.
    NvU32 BlocksPerZone;
    /// Holds the expected flash response for READ STATUS command
    /// when requested previous operation is successful.
    NvU32 OperationSuccessStatus;
    /// Holds the interleave mechanism supported by the flash.
    NvOdmNandInterleaveCapability InterleaveCapability;
    /// Holds the ECC algorithm to be used for error correction.
    NvOdmNandECCAlgorithm EccAlgorithm;
    /// Holds the number of errors that can be corrected per 512 byte area of NAND
    /// flash using Reed-Solomon algorithm.
    NvOdmNandNumberOfCorrectableSymbolErrors ErrorsCorrectable;
    /// Holds the number of bytes to be skipped in spare area, starting from
    /// spare byte 0.
    NvOdmNandSkipSpareBytes SkippedSpareBytes;
    /// Flash timing parameters, which are all to be filled in nSec.
    /// Holds read pulse width in nSec.
    NvU32 TRP;
    /// Holds read hold delay in nSec.
    NvU32 TRH;
    /// Holds write pulse width in nSec.
    NvU32 TWP;
    /// Holds write hold delay in nSec.
    NvU32 TWH;
    /// Holds CE# setup time.
    NvU32 TCS;
    /// Holds write hold to read delay in nSec.
    NvU32 TWHR;
    /// Holds WE to BSY set wait time in nSec.
    NvU32 TWB;
    /// Holds read pulse width for PIO read commands.
    NvU32 TREA;
    /// Holds time from final rising edge of WE of addrress input to
    /// first rising edge of WE for data input.
    NvU32 TADL;
    /*
        tCLH, tALH, tCH, tCLS, tALS params are also
        required to calculate tCS value.
    */
    /// Holds CLE setup time.
    NvU32 TCLS;
    /// Holds CLE hold time.
    NvU32 TCLH;
    /// Holds CE# hold time.
    NvU32 TCH;
    /// Holds ALE setup time.
    NvU32 TALS;
    /// Holds ALE hold time.
    NvU32 TALH;
    /// Holds Read Cycle hold time.
    NvU32 TRC;
    /// Holds Write Cycle hold time.
    NvU32 TWC;
    /// Holds CLE High to Read Delay Some data sheets refer it as TCLR.
    NvU32 TCR;
    /// Holds ALE High to Read Delay 
    NvU32 TAR;
    /// Holds RBSY High to Read Delay 
    NvU32 TRR;
    /// Describes whether the NAND is 42 nm NAND or normal.
    NvOdmNandDeviceType NandDeviceType;

    /// Holds the 4th ID data of the read ID command (as given by the data sheet)
    /// here to differentiate between 42 nm and other flashes that have the
    /// same ManufaturerId, DevId, and Flash type (e.g., K9LBG08U0M & K9LBG08U0D).
    NvU8 ReadIdFourthByte;
}NvOdmNandFlashParams;

/**
 * Gets the NAND flash device information.
 *
 * @param ReadID The NAND flash ID value that is read from the flash.
 * @return NULL if unsuccessful, or the appropriate flash params structure.
 */
NvOdmNandFlashParams *NvOdmNandGetFlashInfo (NvU32 ReadID);

/** @}*/

#if defined(__cplusplus)
}
#endif

#endif  // INCLUDED_NVODM_QUERY_NAND_H