1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright © 2000-2010 David Woodhouse <dwmw2@infradead.org> 4 * Steven J. Hill <sjhill@realitydiluted.com> 5 * Thomas Gleixner <tglx@linutronix.de> 6 * 7 * Contains all ONFI related definitions 8 */ 9 10 #ifndef __LINUX_MTD_ONFI_H 11 #define __LINUX_MTD_ONFI_H 12 13 #include <linux/types.h> 14 #include <linux/bitfield.h> 15 16 /* ONFI version bits */ 17 #define ONFI_VERSION_1_0 BIT(1) 18 #define ONFI_VERSION_2_0 BIT(2) 19 #define ONFI_VERSION_2_1 BIT(3) 20 #define ONFI_VERSION_2_2 BIT(4) 21 #define ONFI_VERSION_2_3 BIT(5) 22 #define ONFI_VERSION_3_0 BIT(6) 23 #define ONFI_VERSION_3_1 BIT(7) 24 #define ONFI_VERSION_3_2 BIT(8) 25 #define ONFI_VERSION_4_0 BIT(9) 26 27 /* ONFI features */ 28 #define ONFI_FEATURE_16_BIT_BUS BIT(0) 29 #define ONFI_FEATURE_NV_DDR BIT(5) 30 #define ONFI_FEATURE_EXT_PARAM_PAGE BIT(7) 31 32 /* ONFI timing mode, used in both asynchronous and synchronous mode */ 33 #define ONFI_DATA_INTERFACE_SDR 0 34 #define ONFI_DATA_INTERFACE_NVDDR BIT(4) 35 #define ONFI_DATA_INTERFACE_NVDDR2 BIT(5) 36 #define ONFI_TIMING_MODE_0 BIT(0) 37 #define ONFI_TIMING_MODE_1 BIT(1) 38 #define ONFI_TIMING_MODE_2 BIT(2) 39 #define ONFI_TIMING_MODE_3 BIT(3) 40 #define ONFI_TIMING_MODE_4 BIT(4) 41 #define ONFI_TIMING_MODE_5 BIT(5) 42 #define ONFI_TIMING_MODE_UNKNOWN BIT(6) 43 #define ONFI_TIMING_MODE_PARAM(x) FIELD_GET(GENMASK(3, 0), (x)) 44 45 /* ONFI feature number/address */ 46 #define ONFI_FEATURE_NUMBER 256 47 #define ONFI_FEATURE_ADDR_TIMING_MODE 0x1 48 49 /* Vendor-specific feature address (Micron) */ 50 #define ONFI_FEATURE_ADDR_READ_RETRY 0x89 51 #define ONFI_FEATURE_ON_DIE_ECC 0x90 52 #define ONFI_FEATURE_ON_DIE_ECC_EN BIT(3) 53 54 /* ONFI subfeature parameters length */ 55 #define ONFI_SUBFEATURE_PARAM_LEN 4 56 57 /* ONFI optional commands SET/GET FEATURES supported? */ 58 #define ONFI_OPT_CMD_READ_CACHE BIT(1) 59 #define ONFI_OPT_CMD_SET_GET_FEATURES BIT(2) 60 61 struct nand_onfi_params { 62 /* rev info and features block */ 63 /* 'O' 'N' 'F' 'I' */ 64 u8 sig[4]; 65 __le16 revision; 66 __le16 features; 67 __le16 opt_cmd; 68 u8 reserved0[2]; 69 __le16 ext_param_page_length; /* since ONFI 2.1 */ 70 u8 num_of_param_pages; /* since ONFI 2.1 */ 71 u8 reserved1[17]; 72 73 /* manufacturer information block */ 74 char manufacturer[12]; 75 char model[20]; 76 u8 jedec_id; 77 __le16 date_code; 78 u8 reserved2[13]; 79 80 /* memory organization block */ 81 __le32 byte_per_page; 82 __le16 spare_bytes_per_page; 83 __le32 data_bytes_per_ppage; 84 __le16 spare_bytes_per_ppage; 85 __le32 pages_per_block; 86 __le32 blocks_per_lun; 87 u8 lun_count; 88 u8 addr_cycles; 89 u8 bits_per_cell; 90 __le16 bb_per_lun; 91 __le16 block_endurance; 92 u8 guaranteed_good_blocks; 93 __le16 guaranteed_block_endurance; 94 u8 programs_per_page; 95 u8 ppage_attr; 96 u8 ecc_bits; 97 u8 interleaved_bits; 98 u8 interleaved_ops; 99 u8 reserved3[13]; 100 101 /* electrical parameter block */ 102 u8 io_pin_capacitance_max; 103 __le16 sdr_timing_modes; 104 __le16 program_cache_timing_mode; 105 __le16 t_prog; 106 __le16 t_bers; 107 __le16 t_r; 108 __le16 t_ccs; 109 u8 nvddr_timing_modes; 110 u8 nvddr2_timing_modes; 111 u8 nvddr_nvddr2_features; 112 __le16 clk_pin_capacitance_typ; 113 __le16 io_pin_capacitance_typ; 114 __le16 input_pin_capacitance_typ; 115 u8 input_pin_capacitance_max; 116 u8 driver_strength_support; 117 __le16 t_int_r; 118 __le16 t_adl; 119 u8 reserved4[8]; 120 121 /* vendor */ 122 __le16 vendor_revision; 123 u8 vendor[88]; 124 125 __le16 crc; 126 } __packed; 127 128 #define ONFI_CRC_BASE 0x4F4E 129 130 /* Extended ECC information Block Definition (since ONFI 2.1) */ 131 struct onfi_ext_ecc_info { 132 u8 ecc_bits; 133 u8 codeword_size; 134 __le16 bb_per_lun; 135 __le16 block_endurance; 136 u8 reserved[2]; 137 } __packed; 138 139 #define ONFI_SECTION_TYPE_0 0 /* Unused section. */ 140 #define ONFI_SECTION_TYPE_1 1 /* for additional sections. */ 141 #define ONFI_SECTION_TYPE_2 2 /* for ECC information. */ 142 struct onfi_ext_section { 143 u8 type; 144 u8 length; 145 } __packed; 146 147 #define ONFI_EXT_SECTION_MAX 8 148 149 /* Extended Parameter Page Definition (since ONFI 2.1) */ 150 struct onfi_ext_param_page { 151 __le16 crc; 152 u8 sig[4]; /* 'E' 'P' 'P' 'S' */ 153 u8 reserved0[10]; 154 struct onfi_ext_section sections[ONFI_EXT_SECTION_MAX]; 155 156 /* 157 * The actual size of the Extended Parameter Page is in 158 * @ext_param_page_length of nand_onfi_params{}. 159 * The following are the variable length sections. 160 * So we do not add any fields below. Please see the ONFI spec. 161 */ 162 } __packed; 163 164 /** 165 * struct onfi_params - ONFI specific parameters that will be reused 166 * @version: ONFI version (BCD encoded), 0 if ONFI is not supported 167 * @tPROG: Page program time 168 * @tBERS: Block erase time 169 * @tR: Page read time 170 * @tCCS: Change column setup time 171 * @fast_tCAD: Command/Address/Data slow or fast delay (NV-DDR only) 172 * @sdr_timing_modes: Supported asynchronous/SDR timing modes 173 * @nvddr_timing_modes: Supported source synchronous/NV-DDR timing modes 174 * @vendor_revision: Vendor specific revision number 175 * @vendor: Vendor specific data 176 */ 177 struct onfi_params { 178 int version; 179 u16 tPROG; 180 u16 tBERS; 181 u16 tR; 182 u16 tCCS; 183 bool fast_tCAD; 184 u16 sdr_timing_modes; 185 u16 nvddr_timing_modes; 186 u16 vendor_revision; 187 u8 vendor[88]; 188 }; 189 190 #endif /* __LINUX_MTD_ONFI_H */ 191
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.