blob: 40b9b5c5aedb5ace1220ba62e76416f1474a57a2 [file] [log] [blame]
/*
* Copyright (c) 2012, 2015-2017 The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef QCA_NAND_H
#define QCA_NAND_H
#define IPQ806x_EBI2ND_BASE (0x1ac00000)
#define IPQ40xx_EBI2ND_BASE (0x079b0000)
#define IPQ40xx_QPIC_BAM_CTRL (0x07984000)
struct ebi2nd_regs {
uint32_t flash_cmd; /* 0x00000000 */
uint32_t addr0; /* 0x00000004 */
uint32_t addr1; /* 0x00000008 */
uint32_t flash_chip_select; /* 0x0000000C */
uint32_t exec_cmd; /* 0x00000010 */
uint32_t flash_status; /* 0x00000014 */
uint32_t buffer_status; /* 0x00000018 */
uint32_t sflashc_status; /* 0x0000001C */
uint32_t dev0_cfg0; /* 0x00000020 */
uint32_t dev0_cfg1; /* 0x00000024 */
uint32_t dev0_ecc_cfg; /* 0x00000028 */
uint32_t dev1_ecc_cfg; /* 0x0000002C */
uint32_t dev1_cfg0; /* 0x00000030 */
uint32_t dev1_cfg1; /* 0x00000034 */
uint32_t sflashc_cmd; /* 0x00000038 */
uint32_t sflashc_exec_cmd; /* 0x0000003C */
uint32_t flash_read_id; /* 0x00000040 */
uint32_t flash_read_status; /* 0x00000044 */
uint32_t flash_read_id2; /* 0x00000048 */
uint8_t reserved0[4];
uint32_t flash_config_data; /* 0x00000050 */
uint32_t flash_config; /* 0x00000054 */
uint32_t flash_config_mode; /* 0x00000058 */
uint8_t reserved1[4];
uint32_t flash_config_status; /* 0x00000060 */
uint32_t macro1_reg; /* 0x00000064 */
uint32_t hsddr_nand_cfg; /* 0x00000068 */
uint8_t reserved2[4];
uint32_t xfr_step1; /* 0x00000070 */
uint32_t xfr_step2; /* 0x00000074 */
uint32_t xfr_step3; /* 0x00000078 */
uint32_t xfr_step4; /* 0x0000007C */
uint32_t xfr_step5; /* 0x00000080 */
uint32_t xfr_step6; /* 0x00000084 */
uint32_t xfr_step7; /* 0x00000088 */
uint8_t reserved3[4];
uint32_t genp_reg0; /* 0x00000090 */
uint32_t genp_reg1; /* 0x00000094 */
uint32_t genp_reg2; /* 0x00000098 */
uint32_t genp_reg3; /* 0x0000009C */
uint32_t dev_cmd0; /* 0x000000A0 */
uint32_t dev_cmd1; /* 0x000000A4 */
uint32_t dev_cmd2; /* 0x000000A8 */
uint32_t dev_cmd_vld; /* 0x000000AC */
uint8_t reserved4[16];
uint32_t addr2; /* 0x000000C0 */
uint32_t addr3; /* 0x000000C4 */
uint32_t addr4; /* 0x000000C8 */
uint32_t addr5; /* 0x000000CC */
uint32_t dev_cmd3; /* 0x000000D0 */
uint32_t dev_cmd4; /* 0x000000D4 */
uint32_t dev_cmd5; /* 0x000000D8 */
uint32_t dev_cmd6; /* 0x000000DC */
uint32_t sflashc_burst_cfg; /* 0x000000E0 */
uint32_t addr6; /* 0x000000E4 */
uint32_t erased_cw_detect_cfg; /* 0x000000E8 */
uint32_t erased_cw_detect_status; /* 0x000000EC */
uint32_t ebi2_ecc_buf_cfg; /* 0x000000F0 */
uint32_t dbg_cfg; /* 0x000000F4 */
uint32_t hw_profile_cfg; /* 0x000000F8 */
uint32_t hw_info; /* 0x000000FC */
uint32_t buffn_acc[144]; /* 0x00000100 */
uint8_t reserved5[3008]; /* 0x00000340 */
uint32_t qpic_nand_ctrl; /* 0x00000f00 */
uint32_t qpic_nand_status; /* 0x00000f04 */
uint32_t qpic_nand_version; /* 0x00000f08 */
uint32_t qpic_nand_debug; /* 0x00000f0c */
uint32_t qpic_irq_stts; /* 0x00000f10 */
uint32_t qpic_irq_clr; /* 0x00000f14 */
uint32_t qpic_irq_en; /* 0x00000f18 */
uint32_t qpic_nand_mutex; /* 0x00000f1c */
uint32_t qpic_nand_read_location_0; /* 0x00000f20 */
uint32_t qpic_nand_read_location_1; /* 0x00000f24 */
uint32_t qpic_nand_read_location_2; /* 0x00000f28 */
uint32_t qpic_nand_read_location_3; /* 0x00000f2c */
uint32_t qpic_nand_read_location_4; /* 0x00000f30 */
uint8_t reserved6[12]; /* 0x00000f34 */
uint32_t qpic_nand_config_bits; /* 0x00000f40 */
uint32_t qpic_nand_mpu_bypass; /* 0x00000f44 */
};
#define QCA_NAND_IPQ 0
#define QCA_NAND_QPIC 1
/* Register: NAND_DEVn_CFG0 */
#define SET_RD_MODE_AFTER_STATUS_MASK 0x80000000
#define SET_RD_MODE_AFTER_STATUS_SEND_READ_CMD 0x80000000
#define SET_RD_MODE_AFTER_STATUS_DO_NOT_SEND 0x00000000
#define SET_RD_MODE_AFTER_STATUS(i) ((i) << 31)
#define STATUS_BFR_READ_MASK 0x40000000
#define STATUS_BFR_READ_DO_NOT_READ_STATUS 0x00000000
#define STATUS_BFR_READ_READ_STATUS_BEFORE_DATA 0x40000000
#define STATUS_BFR_READ(i) ((i) << 30)
#define NUM_ADDR_CYCLES_MASK 0x38000000
#define NUM_ADDR_CYCLES_NO_ADDRESS_CYCLES 0x00000000
#define NUM_ADDR_CYCLES(i) ((i) << 27)
#define SPARE_SIZE_BYTES_MASK 0x07800000
#define SPARE_SIZE_BYTES(i) ((i) << 23)
#define RS_ECC_PARITY_SIZE_BYTES_MASK 0x00780000
#define RS_ECC_PARITY_SIZE_BYTES(i) ((i) << 19)
#define UD_SIZE_BYTES_MASK 0x0007fe00
#define UD_SIZE_BYTES(i) ((i) << 9)
#define CW_PER_PAGE_MASK 0x000001c0
#define CW_PER_PAGE_1_CODEWORD_PER_PAGE 0x00000000
#define CW_PER_PAGE_2_CODEWORDS_PER_PAGE 0x00000040
#define CW_PER_PAGE_3_CODEWORDS_PER_PAGE 0x00000080
#define CW_PER_PAGE_4_CODEWORDS_PER_PAGE 0x000000C0
#define CW_PER_PAGE_5_CODEWORDS_PER_PAGE 0x00000100
#define CW_PER_PAGE_6_CODEWORDS_PER_PAGE 0x00000140
#define CW_PER_PAGE_7_CODEWORDS_PER_PAGE 0x00000180
#define CW_PER_PAGE_8_CODEWORDS_PER_PAGE 0x000001C0
#define CW_PER_PAGE(i) ((i) << 6)
#define MSB_CW_PER_PAGE_MASK 0x00000020
#define MSB_CW_PER_PAGE(i) ((i) << 5)
#define DISABLE_STATUS_AFTER_WRITE_MASK 0x00000010
#define DISABLE_STATUS_AFTER_WRITE(i) ((i) << 4)
#define BUSY_TIMEOUT_ERROR_SELECT_MASK 0x0000000f
#define BUSY_TIMEOUT_ERROR_SELECT_16_MS 0x00000000
#define BUSY_TIMEOUT_ERROR_SELECT_32_MS 0x00000001
#define BUSY_TIMEOUT_ERROR_SELECT_64_MS 0x00000002
#define BUSY_TIMEOUT_ERROR_SELECT_128_MS 0x00000003
#define BUSY_TIMEOUT_ERROR_SELECT_256_MS 0x00000004
#define BUSY_TIMEOUT_ERROR_SELECT_512_MS 0x00000005
#define BUSY_TIMEOUT_ERROR_SELECT_1_SEC 0x00000006
#define BUSY_TIMEOUT_ERROR_SELECT_2_SEC 0x00000007
#define BUSY_TIMEOUT_ERROR_SELECT_1_MS 0x00000008
#define BUSY_TIMEOUT_ERROR_SELECT(i) ((i) << 0)
/* Register: NAND_DEVn_CFG1 */
#define RS_ECC_MODE_MASK 0x30000000
#define RS_ECC_MODE(i) ((i) << 28)
#define ENABLE_BCH_ECC_MASK 0x08000000
#define ENABLE_BCH_ECC_ENABLES_TAVOR_ECC_CORE_WITH_BCH_ENCODING_DECODING 0x08000000
#define ENABLE_BCH_ECC(i) ((i) << 27)
#define DISABLE_ECC_RESET_AFTER_OPDONE_MASK 0x02000000
#define DISABLE_ECC_RESET_AFTER_OPDONE(i) ((i) << 25)
#define ECC_DECODER_CGC_EN_MASK 0x01000000
#define ECC_DECODER_CGC_EN_FREE_RUNNING_CLOCK 0x01000000
#define ECC_DECODER_CGC_EN(i) ((i) << 24)
#define ECC_ENCODER_CGC_EN_MASK 0x00800000
#define ECC_ENCODER_CGC_EN_FREE_RUNNING_CLOCK 0x00800000
#define ECC_ENCODER_CGC_EN(i) ((i) << 23)
#define WR_RD_BSY_GAP_MASK 0x007e0000
#define WR_RD_BSY_GAP_2_CLOCK_CYCLE_GAP 0x00000000
#define WR_RD_BSY_GAP_4_CLOCK_CYCLES_GAP 0x00020000
#define WR_RD_BSY_GAP_6_CLOCK_CYCLES_GAP 0x00040000
#define WR_RD_BSY_GAP_8_CLOCK_CYCLES_GAP 0x00060000
#define WR_RD_BSY_GAP_10_CLOCK_CYCLES_GAP 0x00080000
#define WR_RD_BSY_GAP_128_CLOCK_CYCLES_GAP 0x007E0000
#define WR_RD_BSY_GAP(i) ((i) << 17)
#define BAD_BLOCK_IN_SPARE_AREA_MASK 0x00010000
#define BAD_BLOCK_IN_SPARE_AREA_IN_USER_DATA_AREA 0x00000000
#define BAD_BLOCK_IN_SPARE_AREA_IN_SPARE_AREA 0x00010000
#define BAD_BLOCK_IN_SPARE_AREA(i) ((i) << 16)
#define BAD_BLOCK_BYTE_NUM_MASK 0x0000ffc0
#define BAD_BLOCK_BYTE_NUM(i) ((i) << 6)
#define CS_ACTIVE_BSY_MASK 0x00000020
#define CS_ACTIVE_BSY_ASSERT_CS_DURING_BUSY 0x00000020
#define CS_ACTIVE_BSY_ALLOW_CS_DE_ASSERTION 0x00000000
#define CS_ACTIVE_BSY(i) ((i) << 5)
#define NAND_RECOVERY_CYCLES_MASK 0x0000001c
#define NAND_RECOVERY_CYCLES_1_RECOVERY_CYCLE 0x00000000
#define NAND_RECOVERY_CYCLES_2_RECOVERY_CYCLES 0x00000004
#define NAND_RECOVERY_CYCLES_3_RECOVERY_CYCLES 0x00000008
#define NAND_RECOVERY_CYCLES_8_RECOVERY_CYCLES 0x0000001C
#define NAND_RECOVERY_CYCLES(i) ((i) << 2)
#define WIDE_FLASH_MASK 0x00000002
#define WIDE_FLASH_8_BIT_DATA_BUS 0x00000000
#define WIDE_FLASH_16_BIT_DATA_BUS 0x00000002
#define WIDE_FLASH(i) ((i) << 1)
#define ECC_DISABLE_MASK 0x00000001
#define ECC_DISABLE_ECC_ENABLED 0x00000000
#define ECC_DISABLE_ECC_DISABLED 0x00000001
#define ECC_DISABLE(i) ((i) << 0)
/* Register: NAND_DEVn_ECC_CFG */
#define ECC_FORCE_CLK_OPEN_MASK 0x40000000
#define ECC_FORCE_CLK_OPEN(i) ((i) << 30)
#define ECC_DEC_CLK_SHUTDOWN_MASK 0x20000000
#define ECC_DEC_CLK_SHUTDOWN(i) ((i) << 29)
#define ECC_ENC_CLK_SHUTDOWN_MASK 0x10000000
#define ECC_ENC_CLK_SHUTDOWN(i) ((i) << 28)
#define ECC_NUM_DATA_BYTES_MASK 0x03ff0000
#define ECC_NUM_DATA_BYTES_516_BYTES 0x02040000
#define ECC_NUM_DATA_BYTES_517_BYTES 0x02050000
#define ECC_NUM_DATA_BYTES(i) ((i) << 16)
#define BCH_ECC_PARITY_SIZE_BYTES_MASK 0x00001f00
#define BCH_ECC_PARITY_SIZE_BYTES(i) ((i) << 8)
#define BCH_ECC_MODE_MASK 0x00000030
#define BCH_ECC_MODE_8_BIT_ECC_ERROR_DETECTION_CORRECTION 0x00000010
#define BCH_ECC_MODE_12_BIT_ECC_ERROR_DETECTION_CORRECTION 0x00000020
#define BCH_ECC_MODE_16_BIT_ECC_ERROR_DETECTION_CORRECTION 0x00000030
#define BCH_ECC_MODE(i) ((i) << 4)
#define ECC_SW_RESET_MASK 0x00000002
#define ECC_SW_RESET_SOFTWARE_RESET_TO_ECC 0x00000002
#define ECC_SW_RESET(i) ((i) << 1)
#define BCH_ECC_DISABLE_MASK 0x00000001
#define BCH_ECC_DISABLE_ECC_ENABLED 0x00000000
#define BCH_ECC_DISABLE(i) ((i) << 0)
/* Register: EBI2_ECC_BUF_CFG */
#define NUM_STEPS_MASK 0x000003ff
#define NUM_STEPS(i) ((i) << 0)
/* Register: FLASH_DEV_CMD_VLD */
#define SEQ_READ_START_VLD_MASK 0x00000010
#define SEQ_READ_START_VLD(i) ((i) << 4)
#define ERASE_START_VLD_MASK 0x00000008
#define ERASE_START_VLD(i) ((i) << 3)
#define WRITE_START_VLD_MASK 0x00000004
#define WRITE_START_VLD(i) ((i) << 2)
#define READ_STOP_VLD_MASK 0x00000002
#define READ_STOP_VLD(i) ((i) << 1)
#define READ_START_VLD_MASK 0x00000001
#define READ_START_VLD(i) ((i) << 0)
/* Register: NAND_ADDR0 */
#define DEV_ADDR0_MASK 0xffffffff
#define DEV_ADDR0(i) ((i) << 0)
/* Register: NAND_ADDR1 */
#define DEV_ADDR1_MASK 0xffffffff
#define DEV_ADDR1(i) ((i) << 0)
/* Register: NANDC_EXEC_CMD */
#define EXEC_CMD_MASK 0x00000001
#define EXEC_CMD_EXECUTE_THE_COMMAND 0x00000001
#define EXEC_CMD(i) ((i) << 0)
/* Register: NAND_ERASED_CW_DETECT_CFG */
#define ERASED_CW_ECC_MASK_MASK 0x00000002
#define ERASED_CW_ECC_MASK(i) ((i) << 1)
#define AUTO_DETECT_RES_MASK 0x00000001
#define AUTO_DETECT_RES(i) ((i) << 0)
/* Register: NAND_ERASED_CW_DETECT_STATUS */
#define PAGE_ERASED_MASK 0x00000020
#define PAGE_ERASED(i) ((i) << 5)
#define CODEWORD_ERASED_MASK 0x00000010
#define CODEWORD_ERASED(i) ((i) << 4)
#define ERASED_CW_ECC_MASK_MASK 0x00000002
#define ERASED_CW_ECC_MASK(i) ((i) << 1)
#define AUTO_DETECT_RES_MASK 0x00000001
#define AUTO_DETECT_RES(i) ((i) << 0)
/* Register: NAND_FLASH_CMD */
#define ONE_NAND_INTR_STATUS_MASK 0x00040000
#define ONE_NAND_INTR_STATUS(i) ((i) << 18)
#define ONE_NAND_HOST_CFG_MASK 0x00020000
#define ONE_NAND_HOST_CFG(i) ((i) << 17)
#define AUTO_DETECT_DATA_XFR_SIZE_MASK 0x0001ff80
#define AUTO_DETECT_DATA_XFR_SIZE(i) ((i) << 7)
#define AUTO_DETECT_MASK 0x00000040
#define AUTO_DETECT(i) ((i) << 6)
#define LAST_PAGE_MASK 0x00000020
#define LAST_PAGE(i) ((i) << 5)
#define PAGE_ACC_MASK 0x00000010
#define PAGE_ACC_PAGE_ACCESS_COMMAND 0x00000010
#define PAGE_ACC_NON_PAGE_ACCESS_COMMAND 0x00000000
#define PAGE_ACC(i) ((i) << 4)
#define OP_CMD_MASK 0x0000000f
#define OP_CMD_RESERVED_0 0x00000000
#define OP_CMD_ABORT_TRANSACTION 0x00000001
#define OP_CMD_PAGE_READ 0x00000002
#define OP_CMD_PAGE_READ_WITH_ECC 0x00000003
#define OP_CMD_PAGE_READ_WITH_ECC_SPARE 0x00000004
#define OP_CMD_RESERVED_5 0x00000005
#define OP_CMD_PROGRAM_PAGE 0x00000006
#define OP_CMD_PAGE_PROGRAM_WITH_ECC 0x00000007
#define OP_CMD_RESERVED_8 0x00000008
#define OP_CMD_PROGRAM_PAGE_WITH_SPARE 0x00000009
#define OP_CMD_BLOCK_ERASE 0x0000000A
#define OP_CMD_FETCH_ID 0x0000000B
#define OP_CMD_CHECK_STATUS 0x0000000C
#define OP_CMD_RESET_NAND_FLASH_DEVICE 0x0000000D
#define OP_CMD_RESERVED_E 0x0000000E
#define OP_CMD_RESERVED_F 0x0000000F
#define OP_CMD(i) ((i) << 0)
/* Register: NAND_FLASH_STATUS */
#define DEV_STATUS_MASK 0xffff0000
#define DEV_STATUS(i) ((i) << 16)
#define CODEWORD_CNTR_MASK 0x0000f000
#define CODEWORD_CNTR(i) ((i) << 12)
#define DEVICE_2KBYTE_MASK 0x00000800
#define DEVICE_2KBYTE_2K_BYTE_PAGE_DEVICE 0x00000800
#define DEVICE_2KBYTE_NOT_A_2K_BYTE_PAGE_DEVICE 0x00000000
#define DEVICE_2KBYTE(i) ((i) << 11)
#define DEVICE_512BYTE_MASK 0x00000400
#define DEVICE_512BYTE_512_BYTE_PAGE_DEVICE 0x00000400
#define DEVICE_512BYTE_NOT_A_512_BYTE_PAGE_DEVICE 0x00000000
#define DEVICE_512BYTE(i) ((i) << 10)
#define AUTO_DETECT_DONE_MASK 0x00000200
#define AUTO_DETECT_DONE(i) ((i) << 9)
#define MPU_ERROR_MASK 0x00000100
#define MPU_ERROR_MPU_ERROR_FOR_THE_ACCESS 0x00000100
#define MPU_ERROR_NO_ERROR 0x00000000
#define MPU_ERROR(i) ((i) << 8)
#define PROG_ERASE_OP_RESULT_MASK 0x00000080
#define PROG_ERASE_OP_RESULT_SUCCESSFUL 0x00000000
#define PROG_ERASE_OP_RESULT_NOT_SUCCESSFUL 0x00000080
#define PROG_ERASE_OP_RESULT(i) ((i) << 7)
#define NANDC_TIMEOUT_ERR_MASK 0x00000040
#define NANDC_TIMEOUT_ERR_NO_ERROR 0x00000000
#define NANDC_TIMEOUT_ERR_ERROR 0x00000040
#define NANDC_TIMEOUT_ERR(i) ((i) << 6)
#define READY_BSY_N_MASK 0x00000020
#define READY_BSY_N_EXTERNAL_FLASH_IS_BUSY 0x00000000
#define READY_BSY_N_EXTERNAL_FLASH_IS_READY 0x00000020
#define READY_BSY_N(i) ((i) << 5)
#define OP_ERR_MASK 0x00000010
#define OP_ERR(i) ((i) << 4)
#define OPER_STATUS_MASK 0x0000000f
#define OPER_STATUS_IDLE_STATE 0x00000000
#define OPER_STATUS_ABORT_TRANSACTION 0x00000001
#define OPER_STATUS_PAGE_READ 0x00000002
#define OPER_STATUS_PAGE_READ_WITH_ECC 0x00000003
#define OPER_STATUS_PAGE_READ_WITH_ECC_AND_SPARE_DATA 0x00000004
#define OPER_STATUS_SEQUENTIAL_PAGE_READ 0x00000005
#define OPER_STATUS_PROGRAM_PAGE 0x00000006
#define OPER_STATUS_PROGRAM_PAGE_WITH_ECC 0x00000007
#define OPER_STATUS_RESERVED_PROGRAMMING 0x00000008
#define OPER_STATUS_PROGRAM_PAGE_WITH_SPARE 0x00000009
#define OPER_STATUS_BLOCK_ERASE 0x0000000A
#define OPER_STATUS_FETCH_ID 0x0000000B
#define OPER_STATUS_CHECK_STATUS 0x0000000C
#define OPER_STATUS_RESET_FLASH_DEVICE 0x0000000D
#define OPER_STATUS(i) ((i) << 0)
/* Register: NANDC_BUFFER_STATUS */
#define BAD_BLOCK_STATUS_MASK 0xffff0000
#define BAD_BLOCK_STATUS(i) ((i) << 16)
#define XFR_STEP2_REG_UPDATE_DONE_MASK 0x00000200
#define XFR_STEP2_REG_UPDATE_DONE(i) ((i) << 9)
#define UNCORRECTABLE_MASK 0x00000100
#define UNCORRECTABLE(i) ((i) << 8)
#define NUM_ERRORS_MASK 0x0000001f
#define NUM_ERRORS(i) ((i) << 0)
/* Register: FLASH_DEV_CMD1 */
#define SEQ_READ_MODE_START_MASK 0xff000000
#define SEQ_READ_MODE_START(i) ((i) << 24)
#define SEQ_READ_MODE_ADDR_MASK 0x00ff0000
#define SEQ_READ_MODE_ADDR(i) ((i) << 16)
#define READ_START_MASK 0x0000ff00
#define READ_START(i) ((i) << 8)
#define READ_ADDR_MASK 0x000000ff
#define READ_ADDR(i) ((i) << 0)
/* Register: NAND_DEBUG */
#define BAM_MODE_BIT_RESET (1 << 31)
/* Register: NAND_CTRL */
#define BAM_MODE_EN 0x1
/* Register: BAM_CTRL */
#define BAM_CTRL_CGC 0x00020000
#endif