1*54fd6939SJiyong Park /* 2*54fd6939SJiyong Park * Copyright (c) 2019-2020, STMicroelectronics - All Rights Reserved 3*54fd6939SJiyong Park * 4*54fd6939SJiyong Park * SPDX-License-Identifier: BSD-3-Clause 5*54fd6939SJiyong Park */ 6*54fd6939SJiyong Park 7*54fd6939SJiyong Park #ifndef DRIVERS_RAW_NAND_H 8*54fd6939SJiyong Park #define DRIVERS_RAW_NAND_H 9*54fd6939SJiyong Park 10*54fd6939SJiyong Park #include <cdefs.h> 11*54fd6939SJiyong Park #include <stdint.h> 12*54fd6939SJiyong Park 13*54fd6939SJiyong Park #include <drivers/nand.h> 14*54fd6939SJiyong Park 15*54fd6939SJiyong Park /* NAND ONFI default value mode 0 in picosecond */ 16*54fd6939SJiyong Park #define NAND_TADL_MIN 400000UL 17*54fd6939SJiyong Park #define NAND_TALH_MIN 20000UL 18*54fd6939SJiyong Park #define NAND_TALS_MIN 50000UL 19*54fd6939SJiyong Park #define NAND_TAR_MIN 25000UL 20*54fd6939SJiyong Park #define NAND_TCCS_MIN 500000UL 21*54fd6939SJiyong Park #define NAND_TCEA_MIN 100000UL 22*54fd6939SJiyong Park #define NAND_TCEH_MIN 20000UL 23*54fd6939SJiyong Park #define NAND_TCH_MIN 20000UL 24*54fd6939SJiyong Park #define NAND_TCHZ_MAX 100000UL 25*54fd6939SJiyong Park #define NAND_TCLH_MIN 20000UL 26*54fd6939SJiyong Park #define NAND_TCLR_MIN 20000UL 27*54fd6939SJiyong Park #define NAND_TCLS_MIN 50000UL 28*54fd6939SJiyong Park #define NAND_TCOH_MIN 0UL 29*54fd6939SJiyong Park #define NAND_TCS_MIN 70000UL 30*54fd6939SJiyong Park #define NAND_TDH_MIN 20000UL 31*54fd6939SJiyong Park #define NAND_TDS_MIN 40000UL 32*54fd6939SJiyong Park #define NAND_TFEAT_MAX 1000000UL 33*54fd6939SJiyong Park #define NAND_TIR_MIN 10000UL 34*54fd6939SJiyong Park #define NAND_TITC_MIN 1000000UL 35*54fd6939SJiyong Park #define NAND_TR_MAX 200000000UL 36*54fd6939SJiyong Park #define NAND_TRC_MIN 100000UL 37*54fd6939SJiyong Park #define NAND_TREA_MAX 40000UL 38*54fd6939SJiyong Park #define NAND_TREH_MIN 30000UL 39*54fd6939SJiyong Park #define NAND_TRHOH_MIN 0UL 40*54fd6939SJiyong Park #define NAND_TRHW_MIN 200000UL 41*54fd6939SJiyong Park #define NAND_TRHZ_MAX 200000UL 42*54fd6939SJiyong Park #define NAND_TRLOH_MIN 0UL 43*54fd6939SJiyong Park #define NAND_TRP_MIN 50000UL 44*54fd6939SJiyong Park #define NAND_TRR_MIN 40000UL 45*54fd6939SJiyong Park #define NAND_TRST_MAX 250000000000ULL 46*54fd6939SJiyong Park #define NAND_TWB_MAX 200000UL 47*54fd6939SJiyong Park #define NAND_TWC_MIN 100000UL 48*54fd6939SJiyong Park #define NAND_TWH_MIN 30000UL 49*54fd6939SJiyong Park #define NAND_TWHR_MIN 120000UL 50*54fd6939SJiyong Park #define NAND_TWP_MIN 50000UL 51*54fd6939SJiyong Park #define NAND_TWW_MIN 100000UL 52*54fd6939SJiyong Park 53*54fd6939SJiyong Park /* NAND request types */ 54*54fd6939SJiyong Park #define NAND_REQ_CMD 0x0000U 55*54fd6939SJiyong Park #define NAND_REQ_ADDR 0x1000U 56*54fd6939SJiyong Park #define NAND_REQ_DATAIN 0x2000U 57*54fd6939SJiyong Park #define NAND_REQ_DATAOUT 0x3000U 58*54fd6939SJiyong Park #define NAND_REQ_WAIT 0x4000U 59*54fd6939SJiyong Park #define NAND_REQ_MASK GENMASK(14, 12) 60*54fd6939SJiyong Park #define NAND_REQ_BUS_WIDTH_8 BIT(15) 61*54fd6939SJiyong Park 62*54fd6939SJiyong Park #define PARAM_PAGE_SIZE 256 63*54fd6939SJiyong Park 64*54fd6939SJiyong Park /* NAND ONFI commands */ 65*54fd6939SJiyong Park #define NAND_CMD_READ_1ST 0x00U 66*54fd6939SJiyong Park #define NAND_CMD_CHANGE_1ST 0x05U 67*54fd6939SJiyong Park #define NAND_CMD_READID_SIG_ADDR 0x20U 68*54fd6939SJiyong Park #define NAND_CMD_READ_2ND 0x30U 69*54fd6939SJiyong Park #define NAND_CMD_STATUS 0x70U 70*54fd6939SJiyong Park #define NAND_CMD_READID 0x90U 71*54fd6939SJiyong Park #define NAND_CMD_CHANGE_2ND 0xE0U 72*54fd6939SJiyong Park #define NAND_CMD_READ_PARAM_PAGE 0xECU 73*54fd6939SJiyong Park #define NAND_CMD_RESET 0xFFU 74*54fd6939SJiyong Park 75*54fd6939SJiyong Park #define ONFI_REV_21 BIT(3) 76*54fd6939SJiyong Park #define ONFI_FEAT_BUS_WIDTH_16 BIT(0) 77*54fd6939SJiyong Park #define ONFI_FEAT_EXTENDED_PARAM BIT(7) 78*54fd6939SJiyong Park 79*54fd6939SJiyong Park /* NAND ECC type */ 80*54fd6939SJiyong Park #define NAND_ECC_NONE U(0) 81*54fd6939SJiyong Park #define NAND_ECC_HW U(1) 82*54fd6939SJiyong Park #define NAND_ECC_ONDIE U(2) 83*54fd6939SJiyong Park 84*54fd6939SJiyong Park /* NAND bus width */ 85*54fd6939SJiyong Park #define NAND_BUS_WIDTH_8 U(0) 86*54fd6939SJiyong Park #define NAND_BUS_WIDTH_16 U(1) 87*54fd6939SJiyong Park 88*54fd6939SJiyong Park struct nand_req { 89*54fd6939SJiyong Park struct nand_device *nand; 90*54fd6939SJiyong Park uint16_t type; 91*54fd6939SJiyong Park uint8_t *addr; 92*54fd6939SJiyong Park unsigned int length; 93*54fd6939SJiyong Park unsigned int delay_ms; 94*54fd6939SJiyong Park unsigned int inst_delay; 95*54fd6939SJiyong Park }; 96*54fd6939SJiyong Park 97*54fd6939SJiyong Park struct nand_param_page { 98*54fd6939SJiyong Park /* Rev information and feature block */ 99*54fd6939SJiyong Park uint32_t page_sig; 100*54fd6939SJiyong Park uint16_t rev; 101*54fd6939SJiyong Park uint16_t features; 102*54fd6939SJiyong Park uint16_t opt_cmd; 103*54fd6939SJiyong Park uint8_t jtg; 104*54fd6939SJiyong Park uint8_t train_cmd; 105*54fd6939SJiyong Park uint16_t ext_param_length; 106*54fd6939SJiyong Park uint8_t nb_param_pages; 107*54fd6939SJiyong Park uint8_t reserved1[17]; 108*54fd6939SJiyong Park /* Manufacturer information */ 109*54fd6939SJiyong Park uint8_t manufacturer[12]; 110*54fd6939SJiyong Park uint8_t model[20]; 111*54fd6939SJiyong Park uint8_t manufacturer_id; 112*54fd6939SJiyong Park uint16_t data_code; 113*54fd6939SJiyong Park uint8_t reserved2[13]; 114*54fd6939SJiyong Park /* Memory organization */ 115*54fd6939SJiyong Park uint32_t bytes_per_page; 116*54fd6939SJiyong Park uint16_t spare_per_page; 117*54fd6939SJiyong Park uint32_t bytes_per_partial; 118*54fd6939SJiyong Park uint16_t spare_per_partial; 119*54fd6939SJiyong Park uint32_t num_pages_per_blk; 120*54fd6939SJiyong Park uint32_t num_blk_in_lun; 121*54fd6939SJiyong Park uint8_t num_lun; 122*54fd6939SJiyong Park uint8_t num_addr_cycles; 123*54fd6939SJiyong Park uint8_t bit_per_cell; 124*54fd6939SJiyong Park uint16_t max_bb_per_lun; 125*54fd6939SJiyong Park uint16_t blk_endur; 126*54fd6939SJiyong Park uint8_t valid_blk_begin; 127*54fd6939SJiyong Park uint16_t blk_enbur_valid; 128*54fd6939SJiyong Park uint8_t nb_prog_page; 129*54fd6939SJiyong Park uint8_t partial_prog_attr; 130*54fd6939SJiyong Park uint8_t nb_ecc_bits; 131*54fd6939SJiyong Park uint8_t plane_addr; 132*54fd6939SJiyong Park uint8_t mplanes_ops; 133*54fd6939SJiyong Park uint8_t ez_nand; 134*54fd6939SJiyong Park uint8_t reserved3[12]; 135*54fd6939SJiyong Park /* Electrical parameters */ 136*54fd6939SJiyong Park uint8_t io_pin_cap_max; 137*54fd6939SJiyong Park uint16_t sdr_timing_mode; 138*54fd6939SJiyong Park uint16_t sdr_prog_cache_timing; 139*54fd6939SJiyong Park uint16_t tprog; 140*54fd6939SJiyong Park uint16_t tbers; 141*54fd6939SJiyong Park uint16_t tr; 142*54fd6939SJiyong Park uint16_t tccs; 143*54fd6939SJiyong Park uint8_t nvddr_timing_mode; 144*54fd6939SJiyong Park uint8_t nvddr2_timing_mode; 145*54fd6939SJiyong Park uint8_t nvddr_features; 146*54fd6939SJiyong Park uint16_t clk_input_cap_typ; 147*54fd6939SJiyong Park uint16_t io_pin_cap_typ; 148*54fd6939SJiyong Park uint16_t input_pin_cap_typ; 149*54fd6939SJiyong Park uint8_t input_pin_cap_max; 150*54fd6939SJiyong Park uint8_t drv_strength_support; 151*54fd6939SJiyong Park uint16_t tr_max; 152*54fd6939SJiyong Park uint16_t tadl; 153*54fd6939SJiyong Park uint16_t tr_typ; 154*54fd6939SJiyong Park uint8_t reserved4[6]; 155*54fd6939SJiyong Park /* Vendor block */ 156*54fd6939SJiyong Park uint16_t vendor_revision; 157*54fd6939SJiyong Park uint8_t vendor[88]; 158*54fd6939SJiyong Park uint16_t crc16; 159*54fd6939SJiyong Park } __packed; 160*54fd6939SJiyong Park 161*54fd6939SJiyong Park struct nand_ctrl_ops { 162*54fd6939SJiyong Park int (*exec)(struct nand_req *req); 163*54fd6939SJiyong Park void (*setup)(struct nand_device *nand); 164*54fd6939SJiyong Park }; 165*54fd6939SJiyong Park 166*54fd6939SJiyong Park struct rawnand_device { 167*54fd6939SJiyong Park struct nand_device *nand_dev; 168*54fd6939SJiyong Park const struct nand_ctrl_ops *ops; 169*54fd6939SJiyong Park }; 170*54fd6939SJiyong Park 171*54fd6939SJiyong Park int nand_raw_init(unsigned long long *size, unsigned int *erase_size); 172*54fd6939SJiyong Park int nand_wait_ready(unsigned int delay_ms); 173*54fd6939SJiyong Park int nand_read_page_cmd(unsigned int page, unsigned int offset, 174*54fd6939SJiyong Park uintptr_t buffer, unsigned int len); 175*54fd6939SJiyong Park int nand_change_read_column_cmd(unsigned int offset, uintptr_t buffer, 176*54fd6939SJiyong Park unsigned int len); 177*54fd6939SJiyong Park void nand_raw_ctrl_init(const struct nand_ctrl_ops *ops); 178*54fd6939SJiyong Park 179*54fd6939SJiyong Park /* 180*54fd6939SJiyong Park * Platform can implement this to override default raw NAND instance 181*54fd6939SJiyong Park * configuration. 182*54fd6939SJiyong Park * 183*54fd6939SJiyong Park * @device: target raw NAND instance. 184*54fd6939SJiyong Park * Return 0 on success, negative value otherwise. 185*54fd6939SJiyong Park */ 186*54fd6939SJiyong Park int plat_get_raw_nand_data(struct rawnand_device *device); 187*54fd6939SJiyong Park 188*54fd6939SJiyong Park #endif /* DRIVERS_RAW_NAND_H */ 189