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