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