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