1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * (C) Copyright 2011 NVIDIA Corporation <www.nvidia.com> 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun /* register offset */ 8*4882a593Smuzhiyun #define COMMAND_0 0x00 9*4882a593Smuzhiyun #define CMD_GO (1 << 31) 10*4882a593Smuzhiyun #define CMD_CLE (1 << 30) 11*4882a593Smuzhiyun #define CMD_ALE (1 << 29) 12*4882a593Smuzhiyun #define CMD_PIO (1 << 28) 13*4882a593Smuzhiyun #define CMD_TX (1 << 27) 14*4882a593Smuzhiyun #define CMD_RX (1 << 26) 15*4882a593Smuzhiyun #define CMD_SEC_CMD (1 << 25) 16*4882a593Smuzhiyun #define CMD_AFT_DAT_MASK (1 << 24) 17*4882a593Smuzhiyun #define CMD_AFT_DAT_DISABLE 0 18*4882a593Smuzhiyun #define CMD_AFT_DAT_ENABLE (1 << 24) 19*4882a593Smuzhiyun #define CMD_TRANS_SIZE_SHIFT 20 20*4882a593Smuzhiyun #define CMD_TRANS_SIZE_PAGE 8 21*4882a593Smuzhiyun #define CMD_A_VALID (1 << 19) 22*4882a593Smuzhiyun #define CMD_B_VALID (1 << 18) 23*4882a593Smuzhiyun #define CMD_RD_STATUS_CHK (1 << 17) 24*4882a593Smuzhiyun #define CMD_R_BSY_CHK (1 << 16) 25*4882a593Smuzhiyun #define CMD_CE7 (1 << 15) 26*4882a593Smuzhiyun #define CMD_CE6 (1 << 14) 27*4882a593Smuzhiyun #define CMD_CE5 (1 << 13) 28*4882a593Smuzhiyun #define CMD_CE4 (1 << 12) 29*4882a593Smuzhiyun #define CMD_CE3 (1 << 11) 30*4882a593Smuzhiyun #define CMD_CE2 (1 << 10) 31*4882a593Smuzhiyun #define CMD_CE1 (1 << 9) 32*4882a593Smuzhiyun #define CMD_CE0 (1 << 8) 33*4882a593Smuzhiyun #define CMD_CLE_BYTE_SIZE_SHIFT 4 34*4882a593Smuzhiyun enum { 35*4882a593Smuzhiyun CMD_CLE_BYTES1 = 0, 36*4882a593Smuzhiyun CMD_CLE_BYTES2, 37*4882a593Smuzhiyun CMD_CLE_BYTES3, 38*4882a593Smuzhiyun CMD_CLE_BYTES4, 39*4882a593Smuzhiyun }; 40*4882a593Smuzhiyun #define CMD_ALE_BYTE_SIZE_SHIFT 0 41*4882a593Smuzhiyun enum { 42*4882a593Smuzhiyun CMD_ALE_BYTES1 = 0, 43*4882a593Smuzhiyun CMD_ALE_BYTES2, 44*4882a593Smuzhiyun CMD_ALE_BYTES3, 45*4882a593Smuzhiyun CMD_ALE_BYTES4, 46*4882a593Smuzhiyun CMD_ALE_BYTES5, 47*4882a593Smuzhiyun CMD_ALE_BYTES6, 48*4882a593Smuzhiyun CMD_ALE_BYTES7, 49*4882a593Smuzhiyun CMD_ALE_BYTES8 50*4882a593Smuzhiyun }; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun #define STATUS_0 0x04 53*4882a593Smuzhiyun #define STATUS_RBSY0 (1 << 8) 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun #define ISR_0 0x08 56*4882a593Smuzhiyun #define ISR_IS_CMD_DONE (1 << 5) 57*4882a593Smuzhiyun #define ISR_IS_ECC_ERR (1 << 4) 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun #define IER_0 0x0C 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun #define CFG_0 0x10 62*4882a593Smuzhiyun #define CFG_HW_ECC_MASK (1 << 31) 63*4882a593Smuzhiyun #define CFG_HW_ECC_DISABLE 0 64*4882a593Smuzhiyun #define CFG_HW_ECC_ENABLE (1 << 31) 65*4882a593Smuzhiyun #define CFG_HW_ECC_SEL_MASK (1 << 30) 66*4882a593Smuzhiyun #define CFG_HW_ECC_SEL_HAMMING 0 67*4882a593Smuzhiyun #define CFG_HW_ECC_SEL_RS (1 << 30) 68*4882a593Smuzhiyun #define CFG_HW_ECC_CORRECTION_MASK (1 << 29) 69*4882a593Smuzhiyun #define CFG_HW_ECC_CORRECTION_DISABLE 0 70*4882a593Smuzhiyun #define CFG_HW_ECC_CORRECTION_ENABLE (1 << 29) 71*4882a593Smuzhiyun #define CFG_PIPELINE_EN_MASK (1 << 28) 72*4882a593Smuzhiyun #define CFG_PIPELINE_EN_DISABLE 0 73*4882a593Smuzhiyun #define CFG_PIPELINE_EN_ENABLE (1 << 28) 74*4882a593Smuzhiyun #define CFG_ECC_EN_TAG_MASK (1 << 27) 75*4882a593Smuzhiyun #define CFG_ECC_EN_TAG_DISABLE 0 76*4882a593Smuzhiyun #define CFG_ECC_EN_TAG_ENABLE (1 << 27) 77*4882a593Smuzhiyun #define CFG_TVALUE_MASK (3 << 24) 78*4882a593Smuzhiyun enum { 79*4882a593Smuzhiyun CFG_TVAL4 = 0 << 24, 80*4882a593Smuzhiyun CFG_TVAL6 = 1 << 24, 81*4882a593Smuzhiyun CFG_TVAL8 = 2 << 24 82*4882a593Smuzhiyun }; 83*4882a593Smuzhiyun #define CFG_SKIP_SPARE_MASK (1 << 23) 84*4882a593Smuzhiyun #define CFG_SKIP_SPARE_DISABLE 0 85*4882a593Smuzhiyun #define CFG_SKIP_SPARE_ENABLE (1 << 23) 86*4882a593Smuzhiyun #define CFG_COM_BSY_MASK (1 << 22) 87*4882a593Smuzhiyun #define CFG_COM_BSY_DISABLE 0 88*4882a593Smuzhiyun #define CFG_COM_BSY_ENABLE (1 << 22) 89*4882a593Smuzhiyun #define CFG_BUS_WIDTH_MASK (1 << 21) 90*4882a593Smuzhiyun #define CFG_BUS_WIDTH_8BIT 0 91*4882a593Smuzhiyun #define CFG_BUS_WIDTH_16BIT (1 << 21) 92*4882a593Smuzhiyun #define CFG_LPDDR1_MODE_MASK (1 << 20) 93*4882a593Smuzhiyun #define CFG_LPDDR1_MODE_DISABLE 0 94*4882a593Smuzhiyun #define CFG_LPDDR1_MODE_ENABLE (1 << 20) 95*4882a593Smuzhiyun #define CFG_EDO_MODE_MASK (1 << 19) 96*4882a593Smuzhiyun #define CFG_EDO_MODE_DISABLE 0 97*4882a593Smuzhiyun #define CFG_EDO_MODE_ENABLE (1 << 19) 98*4882a593Smuzhiyun #define CFG_PAGE_SIZE_SEL_MASK (7 << 16) 99*4882a593Smuzhiyun enum { 100*4882a593Smuzhiyun CFG_PAGE_SIZE_256 = 0 << 16, 101*4882a593Smuzhiyun CFG_PAGE_SIZE_512 = 1 << 16, 102*4882a593Smuzhiyun CFG_PAGE_SIZE_1024 = 2 << 16, 103*4882a593Smuzhiyun CFG_PAGE_SIZE_2048 = 3 << 16, 104*4882a593Smuzhiyun CFG_PAGE_SIZE_4096 = 4 << 16 105*4882a593Smuzhiyun }; 106*4882a593Smuzhiyun #define CFG_SKIP_SPARE_SEL_MASK (3 << 14) 107*4882a593Smuzhiyun enum { 108*4882a593Smuzhiyun CFG_SKIP_SPARE_SEL_4 = 0 << 14, 109*4882a593Smuzhiyun CFG_SKIP_SPARE_SEL_8 = 1 << 14, 110*4882a593Smuzhiyun CFG_SKIP_SPARE_SEL_12 = 2 << 14, 111*4882a593Smuzhiyun CFG_SKIP_SPARE_SEL_16 = 3 << 14 112*4882a593Smuzhiyun }; 113*4882a593Smuzhiyun #define CFG_TAG_BYTE_SIZE_MASK 0x1FF 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun #define TIMING_0 0x14 116*4882a593Smuzhiyun #define TIMING_TRP_RESP_CNT_SHIFT 28 117*4882a593Smuzhiyun #define TIMING_TRP_RESP_CNT_MASK (0xf << TIMING_TRP_RESP_CNT_SHIFT) 118*4882a593Smuzhiyun #define TIMING_TWB_CNT_SHIFT 24 119*4882a593Smuzhiyun #define TIMING_TWB_CNT_MASK (0xf << TIMING_TWB_CNT_SHIFT) 120*4882a593Smuzhiyun #define TIMING_TCR_TAR_TRR_CNT_SHIFT 20 121*4882a593Smuzhiyun #define TIMING_TCR_TAR_TRR_CNT_MASK (0xf << TIMING_TCR_TAR_TRR_CNT_SHIFT) 122*4882a593Smuzhiyun #define TIMING_TWHR_CNT_SHIFT 16 123*4882a593Smuzhiyun #define TIMING_TWHR_CNT_MASK (0xf << TIMING_TWHR_CNT_SHIFT) 124*4882a593Smuzhiyun #define TIMING_TCS_CNT_SHIFT 14 125*4882a593Smuzhiyun #define TIMING_TCS_CNT_MASK (3 << TIMING_TCS_CNT_SHIFT) 126*4882a593Smuzhiyun #define TIMING_TWH_CNT_SHIFT 12 127*4882a593Smuzhiyun #define TIMING_TWH_CNT_MASK (3 << TIMING_TWH_CNT_SHIFT) 128*4882a593Smuzhiyun #define TIMING_TWP_CNT_SHIFT 8 129*4882a593Smuzhiyun #define TIMING_TWP_CNT_MASK (0xf << TIMING_TWP_CNT_SHIFT) 130*4882a593Smuzhiyun #define TIMING_TRH_CNT_SHIFT 4 131*4882a593Smuzhiyun #define TIMING_TRH_CNT_MASK (3 << TIMING_TRH_CNT_SHIFT) 132*4882a593Smuzhiyun #define TIMING_TRP_CNT_SHIFT 0 133*4882a593Smuzhiyun #define TIMING_TRP_CNT_MASK (0xf << TIMING_TRP_CNT_SHIFT) 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun #define RESP_0 0x18 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun #define TIMING2_0 0x1C 138*4882a593Smuzhiyun #define TIMING2_TADL_CNT_SHIFT 0 139*4882a593Smuzhiyun #define TIMING2_TADL_CNT_MASK (0xf << TIMING2_TADL_CNT_SHIFT) 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun #define CMD_REG1_0 0x20 142*4882a593Smuzhiyun #define CMD_REG2_0 0x24 143*4882a593Smuzhiyun #define ADDR_REG1_0 0x28 144*4882a593Smuzhiyun #define ADDR_REG2_0 0x2C 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun #define DMA_MST_CTRL_0 0x30 147*4882a593Smuzhiyun #define DMA_MST_CTRL_GO_MASK (1 << 31) 148*4882a593Smuzhiyun #define DMA_MST_CTRL_GO_DISABLE 0 149*4882a593Smuzhiyun #define DMA_MST_CTRL_GO_ENABLE (1 << 31) 150*4882a593Smuzhiyun #define DMA_MST_CTRL_DIR_MASK (1 << 30) 151*4882a593Smuzhiyun #define DMA_MST_CTRL_DIR_READ 0 152*4882a593Smuzhiyun #define DMA_MST_CTRL_DIR_WRITE (1 << 30) 153*4882a593Smuzhiyun #define DMA_MST_CTRL_PERF_EN_MASK (1 << 29) 154*4882a593Smuzhiyun #define DMA_MST_CTRL_PERF_EN_DISABLE 0 155*4882a593Smuzhiyun #define DMA_MST_CTRL_PERF_EN_ENABLE (1 << 29) 156*4882a593Smuzhiyun #define DMA_MST_CTRL_REUSE_BUFFER_MASK (1 << 27) 157*4882a593Smuzhiyun #define DMA_MST_CTRL_REUSE_BUFFER_DISABLE 0 158*4882a593Smuzhiyun #define DMA_MST_CTRL_REUSE_BUFFER_ENABLE (1 << 27) 159*4882a593Smuzhiyun #define DMA_MST_CTRL_BURST_SIZE_SHIFT 24 160*4882a593Smuzhiyun #define DMA_MST_CTRL_BURST_SIZE_MASK (7 << DMA_MST_CTRL_BURST_SIZE_SHIFT) 161*4882a593Smuzhiyun enum { 162*4882a593Smuzhiyun DMA_MST_CTRL_BURST_1WORDS = 2 << DMA_MST_CTRL_BURST_SIZE_SHIFT, 163*4882a593Smuzhiyun DMA_MST_CTRL_BURST_4WORDS = 3 << DMA_MST_CTRL_BURST_SIZE_SHIFT, 164*4882a593Smuzhiyun DMA_MST_CTRL_BURST_8WORDS = 4 << DMA_MST_CTRL_BURST_SIZE_SHIFT, 165*4882a593Smuzhiyun DMA_MST_CTRL_BURST_16WORDS = 5 << DMA_MST_CTRL_BURST_SIZE_SHIFT 166*4882a593Smuzhiyun }; 167*4882a593Smuzhiyun #define DMA_MST_CTRL_IS_DMA_DONE (1 << 20) 168*4882a593Smuzhiyun #define DMA_MST_CTRL_EN_A_MASK (1 << 2) 169*4882a593Smuzhiyun #define DMA_MST_CTRL_EN_A_DISABLE 0 170*4882a593Smuzhiyun #define DMA_MST_CTRL_EN_A_ENABLE (1 << 2) 171*4882a593Smuzhiyun #define DMA_MST_CTRL_EN_B_MASK (1 << 1) 172*4882a593Smuzhiyun #define DMA_MST_CTRL_EN_B_DISABLE 0 173*4882a593Smuzhiyun #define DMA_MST_CTRL_EN_B_ENABLE (1 << 1) 174*4882a593Smuzhiyun 175*4882a593Smuzhiyun #define DMA_CFG_A_0 0x34 176*4882a593Smuzhiyun #define DMA_CFG_B_0 0x38 177*4882a593Smuzhiyun #define FIFO_CTRL_0 0x3C 178*4882a593Smuzhiyun #define DATA_BLOCK_PTR_0 0x40 179*4882a593Smuzhiyun #define TAG_PTR_0 0x44 180*4882a593Smuzhiyun #define ECC_PTR_0 0x48 181*4882a593Smuzhiyun 182*4882a593Smuzhiyun #define DEC_STATUS_0 0x4C 183*4882a593Smuzhiyun #define DEC_STATUS_A_ECC_FAIL (1 << 1) 184*4882a593Smuzhiyun #define DEC_STATUS_B_ECC_FAIL (1 << 0) 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun #define BCH_CONFIG_0 0xCC 187*4882a593Smuzhiyun #define BCH_CONFIG_BCH_TVALUE_SHIFT 4 188*4882a593Smuzhiyun #define BCH_CONFIG_BCH_TVALUE_MASK (3 << BCH_CONFIG_BCH_TVALUE_SHIFT) 189*4882a593Smuzhiyun enum { 190*4882a593Smuzhiyun BCH_CONFIG_BCH_TVAL4 = 0 << BCH_CONFIG_BCH_TVALUE_SHIFT, 191*4882a593Smuzhiyun BCH_CONFIG_BCH_TVAL8 = 1 << BCH_CONFIG_BCH_TVALUE_SHIFT, 192*4882a593Smuzhiyun BCH_CONFIG_BCH_TVAL14 = 2 << BCH_CONFIG_BCH_TVALUE_SHIFT, 193*4882a593Smuzhiyun BCH_CONFIG_BCH_TVAL16 = 3 << BCH_CONFIG_BCH_TVALUE_SHIFT 194*4882a593Smuzhiyun }; 195*4882a593Smuzhiyun #define BCH_CONFIG_BCH_ECC_MASK (1 << 0) 196*4882a593Smuzhiyun #define BCH_CONFIG_BCH_ECC_DISABLE 0 197*4882a593Smuzhiyun #define BCH_CONFIG_BCH_ECC_ENABLE (1 << 0) 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun #define BCH_DEC_RESULT_0 0xD0 200*4882a593Smuzhiyun #define BCH_DEC_RESULT_CORRFAIL_ERR_MASK (1 << 8) 201*4882a593Smuzhiyun #define BCH_DEC_RESULT_PAGE_COUNT_MASK 0xFF 202*4882a593Smuzhiyun 203*4882a593Smuzhiyun #define BCH_DEC_STATUS_BUF_0 0xD4 204*4882a593Smuzhiyun #define BCH_DEC_STATUS_FAIL_SEC_FLAG_MASK 0xFF000000 205*4882a593Smuzhiyun #define BCH_DEC_STATUS_CORR_SEC_FLAG_MASK 0x00FF0000 206*4882a593Smuzhiyun #define BCH_DEC_STATUS_FAIL_TAG_MASK (1 << 14) 207*4882a593Smuzhiyun #define BCH_DEC_STATUS_CORR_TAG_MASK (1 << 13) 208*4882a593Smuzhiyun #define BCH_DEC_STATUS_MAX_CORR_CNT_MASK (0x1f << 8) 209*4882a593Smuzhiyun #define BCH_DEC_STATUS_PAGE_NUMBER_MASK 0xFF 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun #define LP_OPTIONS 0 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun struct nand_ctlr { 214*4882a593Smuzhiyun u32 command; /* offset 00h */ 215*4882a593Smuzhiyun u32 status; /* offset 04h */ 216*4882a593Smuzhiyun u32 isr; /* offset 08h */ 217*4882a593Smuzhiyun u32 ier; /* offset 0Ch */ 218*4882a593Smuzhiyun u32 config; /* offset 10h */ 219*4882a593Smuzhiyun u32 timing; /* offset 14h */ 220*4882a593Smuzhiyun u32 resp; /* offset 18h */ 221*4882a593Smuzhiyun u32 timing2; /* offset 1Ch */ 222*4882a593Smuzhiyun u32 cmd_reg1; /* offset 20h */ 223*4882a593Smuzhiyun u32 cmd_reg2; /* offset 24h */ 224*4882a593Smuzhiyun u32 addr_reg1; /* offset 28h */ 225*4882a593Smuzhiyun u32 addr_reg2; /* offset 2Ch */ 226*4882a593Smuzhiyun u32 dma_mst_ctrl; /* offset 30h */ 227*4882a593Smuzhiyun u32 dma_cfg_a; /* offset 34h */ 228*4882a593Smuzhiyun u32 dma_cfg_b; /* offset 38h */ 229*4882a593Smuzhiyun u32 fifo_ctrl; /* offset 3Ch */ 230*4882a593Smuzhiyun u32 data_block_ptr; /* offset 40h */ 231*4882a593Smuzhiyun u32 tag_ptr; /* offset 44h */ 232*4882a593Smuzhiyun u32 resv1; /* offset 48h */ 233*4882a593Smuzhiyun u32 dec_status; /* offset 4Ch */ 234*4882a593Smuzhiyun u32 hwstatus_cmd; /* offset 50h */ 235*4882a593Smuzhiyun u32 hwstatus_mask; /* offset 54h */ 236*4882a593Smuzhiyun u32 resv2[29]; 237*4882a593Smuzhiyun u32 bch_config; /* offset CCh */ 238*4882a593Smuzhiyun u32 bch_dec_result; /* offset D0h */ 239*4882a593Smuzhiyun u32 bch_dec_status_buf; 240*4882a593Smuzhiyun /* offset D4h */ 241*4882a593Smuzhiyun }; 242