mirror of
https://git.codelinaro.org/clo/qsdk/oss/boot/u-boot-2016.git
synced 2025-12-10 07:44:53 +01:00
Change-Id: I2893089a3b0ca91ea22d49417934f126398a6a58 Signed-off-by: anusha <anusharao@codeaurora.org>
773 lines
25 KiB
C
773 lines
25 KiB
C
/*
|
|
* Copyright (c) 2008, Google Inc.
|
|
* All rights reserved.
|
|
* Copyright (c) 2009-2020 The Linux Foundation. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* * Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in
|
|
* the documentation and/or other materials provided with the
|
|
* distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*/
|
|
|
|
#ifndef __QPIC_NAND_H
|
|
#define __QPIC_NAND_H
|
|
|
|
#if defined(CONFIG_IPQ40XX) || defined(CONFIG_IPQ_RUMI) \
|
|
|| defined(CONFIG_IPQ6018) || defined(CONFIG_IPQ5018) \
|
|
|| defined(CONFIG_IPQ9574)
|
|
#define QPIC_EBI2ND_BASE (0x079b0000)
|
|
#else
|
|
#error "QPIC NAND not supported"
|
|
#endif
|
|
|
|
#define QPIC_BAM_CTRL_BASE (0x07984000)
|
|
|
|
#define NAND_REG(off) (QPIC_EBI2ND_BASE + (off))
|
|
|
|
#define NAND_FLASH_CMD NAND_REG(0x0000)
|
|
#define NAND_ADDR0 NAND_REG(0x0004)
|
|
#define NAND_ADDR1 NAND_REG(0x0008)
|
|
#define NAND_FLASH_CHIP_SELECT NAND_REG(0x000C)
|
|
#define NAND_EXEC_CMD NAND_REG(0x0010)
|
|
#define NAND_FLASH_STATUS NAND_REG(0x0014)
|
|
#define NAND_BUFFER_STATUS NAND_REG(0x0018)
|
|
#define NAND_DEV0_CFG0 NAND_REG(0x0020)
|
|
#define NAND_DEV0_CFG1 NAND_REG(0x0024)
|
|
#define NAND_DEV0_ECC_CFG NAND_REG(0x0028)
|
|
#define NAND_DEV1_CFG0 NAND_REG(0x0030)
|
|
#define NAND_DEV1_CFG1 NAND_REG(0x0034)
|
|
#define NAND_SFLASHC_CMD NAND_REG(0x0038)
|
|
#define NAND_SFLASHC_EXEC_CMD NAND_REG(0x003C)
|
|
#define NAND_READ_ID NAND_REG(0x0040)
|
|
#define NAND_READ_STATUS NAND_REG(0x0044)
|
|
#define NAND_CONFIG_DATA NAND_REG(0x0050)
|
|
#define NAND_CONFIG NAND_REG(0x0054)
|
|
#define NAND_CONFIG_MODE NAND_REG(0x0058)
|
|
#define NAND_CONFIG_STATUS NAND_REG(0x0060)
|
|
#define NAND_MACRO1_REG NAND_REG(0x0064)
|
|
#define NAND_XFR_STEP1 NAND_REG(0x0070)
|
|
#define NAND_XFR_STEP2 NAND_REG(0x0074)
|
|
#define NAND_XFR_STEP3 NAND_REG(0x0078)
|
|
#define NAND_XFR_STEP4 NAND_REG(0x007C)
|
|
#define NAND_XFR_STEP5 NAND_REG(0x0080)
|
|
#define NAND_XFR_STEP6 NAND_REG(0x0084)
|
|
#define NAND_XFR_STEP7 NAND_REG(0x0088)
|
|
#define NAND_GENP_REG0 NAND_REG(0x0090)
|
|
#define NAND_GENP_REG1 NAND_REG(0x0094)
|
|
#define NAND_GENP_REG2 NAND_REG(0x0098)
|
|
#define NAND_GENP_REG3 NAND_REG(0x009C)
|
|
#define NAND_SFLASHC_STATUS NAND_REG(0x001C)
|
|
#define NAND_DEV_CMD0 NAND_REG(0x00A0)
|
|
#define NAND_DEV_CMD1_V1_4_20 NAND_REG(0x00A4)
|
|
#define NAND_DEV_CMD2 NAND_REG(0x00A8)
|
|
#define NAND_DEV_CMD_VLD_V1_4_20 NAND_REG(0x00AC)
|
|
#define NAND_EBI2_MISR_SIG_REG NAND_REG(0x00B0)
|
|
#define NAND_ADDR2 NAND_REG(0x00C0)
|
|
#define NAND_ADDR3 NAND_REG(0x00C4)
|
|
#define NAND_ADDR4 NAND_REG(0x00C8)
|
|
#define NAND_ADDR5 NAND_REG(0x00CC)
|
|
#define NAND_DEV_CMD3 NAND_REG(0x00D0)
|
|
#define NAND_DEV_CMD4 NAND_REG(0x00D4)
|
|
#define NAND_DEV_CMD5 NAND_REG(0x00D8)
|
|
#define NAND_DEV_CMD6 NAND_REG(0x00DC)
|
|
#define NAND_SFLASHC_BURST_CFG NAND_REG(0x00E0)
|
|
#define NAND_ADDR6 NAND_REG(0x00E4)
|
|
#define NAND_ERASED_CW_DETECT_CFG NAND_REG(0x00E8)
|
|
#define NAND_ERASED_CW_DETECT_STATUS NAND_REG(0x00EC)
|
|
#define NAND_EBI2_ECC_BUF_CFG NAND_REG(0x00F0)
|
|
#define NAND_HW_INFO NAND_REG(0x00FC)
|
|
#define NAND_FLASH_BUFFER NAND_REG(0x0100)
|
|
#define NAND_MULTI_PAGE_CMD NAND_REG(0x0F60)
|
|
#define NAND_FLASH_FEATURES NAND_REG(0x0F64)
|
|
#define QPIC_NAND_CTRL NAND_REG(0x0F00)
|
|
#define QPIC_NAND_DEBUG NAND_REG(0x0F0C)
|
|
/* Additional Register set for Serial NAND */
|
|
#define NAND_AUTO_STATUS_EN NAND_REG(0x002C)
|
|
#define NAND_VERSION NAND_REG(0x4F08)
|
|
#define SPI_NAND_DEV_CMD0 NAND_REG(0x70A0)
|
|
#define SPI_NAND_DEV_CMD1 NAND_REG(0x70A4)
|
|
#define SPI_NAND_DEV_CMD2 NAND_REG(0x70A8)
|
|
#define SPI_NAND_DEV_CMD3 NAND_REG(0x70D0)
|
|
#define NAND_FLASH_DEV_CMD_VLD NAND_REG(0x70AC)
|
|
#define SPI_NAND_DEV_CMD7 NAND_REG(0x70B0)
|
|
#define SPI_NAND_DEV_CMD8 NAND_REG(0x70B4)
|
|
#define SPI_NAND_DEV_CMD9 NAND_REG(0x70B8)
|
|
#define NAND_FLASH_SPI_CFG NAND_REG(0x70C0)
|
|
#define NAND_SPI_NUM_ADDR_CYCLES NAND_REG(0x70C4)
|
|
#define NAND_SPI_BUSY_CHECK_WAIT_CNT NAND_REG(0x70C8)
|
|
#define NAND_QSPI_MSTR_CONFIG NAND_REG(0x7f60)
|
|
|
|
/* Register mask & shift value used in SPI transfer mode */
|
|
#define SPI_TRANSFER_MODE_1X 0x1
|
|
#define SPI_TRANSFER_MODE_4X 0x3
|
|
/* These value as per HPG , these value as per 2K device*/
|
|
#define SPI_NAND_DEVn_CFG0 0x1A5408D0
|
|
#define SPI_NAND_DEVn_CFG1 0x08287440
|
|
#define SPI_NAND_DEVn_CFG1_RESET 0x087476B1
|
|
/* value for below register according to HPG : 0x42040702 for reset
|
|
* and 0x42040700 for reset disable
|
|
*/
|
|
#define SPI_NAND_DEVn_ECC_CFG 0x42040702
|
|
#define SPI_NAND_DEVn_ECC_CFG_RST_DIS 0x42040700
|
|
#define FLASH_DEV_CMD_VLD 0x0000000D
|
|
/* These Value as per HPG */
|
|
#define NAND_FLASH_DEV_CMD0_VAL 0x1080D8D8
|
|
#define NAND_FLASH_DEV_CMD1_VAL 0xF00F3000
|
|
#define NAND_FLASH_DEV_CMD2_VAL 0xF0FF709F
|
|
#define NAND_FLASH_DEV_CMD3_VAL 0x3F310015
|
|
/* For Micron NAND_FLASH_DEV_CMD3_VAL value should
|
|
* be 0x3F300015
|
|
*/
|
|
#define NAND_FLASH_DEV_CMD7_VAL 0x04061F0F
|
|
#define NAND_FLASH_DEV_CMD7_WE 0x60000
|
|
#define NAND_FLASH_DEV_CMD7_WD 0x40000000
|
|
#define NAND_FLASH_DEV_CMD7_SET_FTR 0x1F00
|
|
#define NAND_FLASH_DEV_CMD7_GET_FTR 0x0F
|
|
#define SPI_BUSY_CHECK_WAIT_CNT 0x00000010
|
|
#define SPI_CFG_VAL 0x1924C00D
|
|
#define SPI_LOAD_CLK_CNTR_INIT_EN (1 << 28)
|
|
#define SPI_NUM_ADDR_CYCLES 0x000DA4DB
|
|
#define NAND_FLASH_SET_FEATURE_MASK 0xB800000E
|
|
#define NAND_FLASH_GET_FEATURE_MASK 0x3800000E
|
|
#define QPIC_HARDWARE_VERSION_2_0 0x20000000
|
|
#define NAND_FLASH_STATUS_MASK 0xC
|
|
#define QPIC_SERIAL_ERROR 517
|
|
#define QPIC_SPI_SET_FEATURE (1 << 31)
|
|
#define QPIC_SPI_GET_FEATURE ~(1 << 31)
|
|
#define QPIC_SPI_WP_SET (1 << 28)
|
|
#define QPIC_SPI_HOLD_SET (1 << 27)
|
|
#define QPIC_SPI_TRANSFER_MODE_X1 (1 << 29)
|
|
#define QPIC_SPI_TRANSFER_MODE_X4 (3 << 29)
|
|
#define QPIC_SPI_BOOST_MODE (1 << 11)
|
|
#define QPIC_SPI_NAND_CTRL_VAL 0x341
|
|
#define QPIC_PAGE_SCOPE_CMD_EN (1 << 23)
|
|
#define QPIC_MULTIPAGE_CMD_EN (1 << 22)
|
|
#define QPIC_LAST_PAGE_MASK (1 << 5)
|
|
/* For all status
|
|
* #define QPIC_SPI_NAND_AUTO_STATUS_VAL 0x003F003F
|
|
*/
|
|
#define QPIC_SPI_NAND_AUTO_STATUS_VAL 0x000B000B
|
|
#define QPIC_SPI_MAX_CODE_WORD_2K_PAGE 0x4
|
|
#define QPIC_SPI_MAX_STATUS_REG 12
|
|
#define QPIC_AUTO_STATUS_BUFFER_SIZE (QPIC_SPI_MAX_CODE_WORD_2K_PAGE * \
|
|
QPIC_SPI_MAX_STATUS_REG)
|
|
#define QPIC_NAND_FLASH_CMD_WE_VAL 0XB800000F
|
|
#define QPIC_NAND_FLASH_CMD_WD_VAL 0x3800000F
|
|
#define WR_EN 0x1
|
|
#define WR_DIS 0x0
|
|
|
|
#define PAGE_2KiB_STATUS_BUF_SIZE 48
|
|
#define PAGE_4KiB_STATUS_BUF_SIZE 96
|
|
#define PAGE_8KiB_STATUS_BUF_SIZE 192
|
|
#define PAGE_2KiB 2048
|
|
#define PAGE_4KiB 4096
|
|
#define PAGE_8KiB 8192
|
|
#define MAX_MULTI_PAGE 64
|
|
#define GET_STATUS_BUFF_PARSE_SIZE_PER_PAGE(page_size, parse_size) ({ \
|
|
switch(page_size) { \
|
|
case PAGE_2KiB: \
|
|
parse_size = PAGE_2KiB_STATUS_BUF_SIZE; \
|
|
break; \
|
|
case PAGE_4KiB: \
|
|
parse_size = PAGE_4KiB_STATUS_BUF_SIZE; \
|
|
break; \
|
|
case PAGE_8KiB: \
|
|
parse_size = PAGE_8KiB_STATUS_BUF_SIZE; \
|
|
break; \
|
|
default: \
|
|
break; \
|
|
} \
|
|
})
|
|
|
|
#define GET_STATUS_BUFF_ALLOC_SIZE(page_size, status_buf_size) ({ \
|
|
switch(page_size) { \
|
|
case PAGE_2KiB: \
|
|
status_buf_size = PAGE_2KiB_STATUS_BUF_SIZE * \
|
|
MAX_MULTI_PAGE; \
|
|
break; \
|
|
case PAGE_4KiB: \
|
|
status_buf_size = PAGE_4KiB_STATUS_BUF_SIZE * \
|
|
MAX_MULTI_PAGE; \
|
|
break; \
|
|
case PAGE_8KiB: \
|
|
status_buf_size = PAGE_8KiB_STATUS_BUF_SIZE * \
|
|
MAX_MULTI_PAGE; \
|
|
break; \
|
|
default: \
|
|
break; \
|
|
} \
|
|
})
|
|
|
|
/* According to GigaDevice data sheet Block Protection Register is:
|
|
* ____________________________________________
|
|
* | | | | | | | | |
|
|
* |BRWD |RSVD| BP2| BP1| BP0| INV | CMP |RSVD |
|
|
* | | | | | | | | |
|
|
* |______|____|____|____|____|_____|_____|_____|
|
|
*
|
|
* NOTE: RSVD = Reserved.
|
|
*
|
|
* After power-up the device is in "locked" state i.e feature bits
|
|
* BP0, BP1, BP2 are set to 1. ENV, CMP, BRWD are set to 0.
|
|
* When BRWD is set to 1 and WP# is LOW i.e 0, none of the writable
|
|
* protection feature bits can be set.
|
|
* When an ERASE command is issued to a locked block, the erase failure,
|
|
* 04H, is returned.
|
|
*
|
|
* With CMP = X, INV = X, BP2 = 0, BP1 = 0, BP0 = 0 : There will be no
|
|
* block protection functionality.
|
|
*
|
|
* When WP# is not LOW, user can issue bellows commands to alter the
|
|
* protection.
|
|
*
|
|
* Issue SET FEATURES register write (1FH)
|
|
* Issue the feature bit address (A0h)
|
|
*/
|
|
#define FLASH_SPI_NAND_BLK_PROCT_ADDR 0xA0
|
|
#define FLASH_SPI_NAND_BLK_PROCT_DISABLE 0x00
|
|
#define FLASH_SPI_NAND_BLK_PROCT_ENABLE 0x78
|
|
/* According to GigaDevice data sheet Feature Register is:
|
|
* _________________________________________________
|
|
* | | | | | | | | |
|
|
* |OTP-PRT|OTP_EN| RSVD|ECC-EN|RSVD|RSVD |RSVD |QE |
|
|
* | | | | | | | | |
|
|
* |_______|______|_____|______|____|_____|_____|____|
|
|
*
|
|
*
|
|
* NOTE : When a feature is set, it remains active until the
|
|
* device is power cycled or the feature is written to.once
|
|
* the device is set, it remains set, even if a RESET (FFH)
|
|
* command is issued.
|
|
*
|
|
* OTP-PRT = X , OTP_EN = 0 : Normal Operation
|
|
* OTP-PRT = 0, OTP_EN = 1 : Access OTP region, read and program data.
|
|
*
|
|
* ECC-EN : ECC is enabled after device power up, so the default
|
|
* READ and PROGRAM commands operate with internal ECC in the “active”
|
|
* state. To enable/disable ECC, perform the following command sequence:
|
|
*
|
|
* 1) Issue the SET FEATURES command (1FH).
|
|
* 2) Set the feature bit ECC_EN as you want:
|
|
* a) To enable ECC, Set ECC_EN to 1.
|
|
* b) To disable ECC, Clear ECC_EN to 0.
|
|
*
|
|
* NOTE: For this device GD5F1GQ4xExxG
|
|
* --> Internal ECC Off (ECC_EN=0):
|
|
* 2048-Byte+128-Byte Full Access.
|
|
*
|
|
* --> Internal ECC On (ECC_EN=1, default):
|
|
* Program: 2048-Byte+64-Byte.
|
|
* Read: 2048-Byte+128-Byte.
|
|
*
|
|
* QE : If QE is enabled, the quad IO operations can be executed.
|
|
*
|
|
*/
|
|
#define FLASH_SPI_NAND_FR_ADDR 0xB0
|
|
#define FLASH_SPI_NAND_FR_ECC_ENABLE (1 << 4)
|
|
#define FLASH_SPI_NAND_FR_BUFF_ENABLE (1 << 3)
|
|
#define FLASH_SPI_NAND_FR_QUAD_ENABLE 0x1
|
|
/* According to GigaDevice data sheet Status Register(0xC0) is:
|
|
* _________________________________________________
|
|
* | | | | | | | | |
|
|
* |RSVD |RSVD |ECCS1|ECCS0|P-FAIL|E-FAIL|WEL |OIP |
|
|
* | | | | | | | | |
|
|
* |______|______|_____|_____|_____ |______|____|____|
|
|
*
|
|
*
|
|
* NOTE: RSVD = Reserved.
|
|
*
|
|
* P-FAIL : This bit indicates that a program failure has occurred
|
|
* (P_FAIL set to 1). It will also be set if the user attempts to
|
|
* program an invalid address or a protected region, including
|
|
* the OTP area.
|
|
*
|
|
* E-FAIL : This bit indicates that an erase failure has occurred
|
|
* (E_FAIL set to 1). It will also be set if the user attempts to
|
|
* erase a locked region.
|
|
*
|
|
* WEL : This bit indicates the current status of the write enable
|
|
* latch (WEL) and must be set (WEL = 1), prior to issuing a
|
|
* PROGRAM EXECUTE or BLOCK ERASE command. It is set by issuing the
|
|
* WRITE ENABLE command. WEL can also be disabled (WEL = 0), by issuing
|
|
* the WRITE DISABLE command.
|
|
*
|
|
* OIP : This bit is set (OIP = 1 ) when a PROGRAM EXECUTE, PAGE READ,
|
|
* BLOCK ERASE, or RESET command is executing, indicating the device
|
|
* is busy. When the bit is 0, the interface is in the ready state.
|
|
*
|
|
* ECC Status : ECCS and ECCSE are set to 00b either following a RESET,
|
|
* or at the beginning of the READ.ECCS and ECCSE are invalid if internal
|
|
* ECC is disabled (via a SET FEATURES command to reset ECC_EN to 0).
|
|
*
|
|
* NOTE: After power-on RESET, ECC status is set to reflect the contents
|
|
* of block 0, page 0.
|
|
*/
|
|
#define FLASH_SPI_NAND_SR_ADDR 0xC0
|
|
#define FLASH_SPI_NAND_SR_DATA 0x00
|
|
|
|
/* According to GigaDevice data sheet Feature Register(0xD0) is:
|
|
* _________________________________________________
|
|
* | | | | | | | | |
|
|
* |RSVD |DS-S1|DS-S0|RSVD |RSVD |RSVD |RSVD |RSVD|
|
|
* | | | | | | | | |
|
|
* |______|_____|_____|_____|______|______|_____|____|
|
|
*
|
|
* DS-S1 = 0 , DS-S0 = 0 : Drive strength is 50%
|
|
* DS-S1 = 0 , DS-S0 = 1 : Drive strength is 25%
|
|
* DS-S1 = 1 , DS-S0 = 0 : Drive strength is 75%
|
|
* DS-S1 = 1 , DS-S0 = 1 : Drive strength is 100%
|
|
*
|
|
* 00 is the default data byte value for Output Driver Register after power-up
|
|
*/
|
|
#define FLASH_SPI_NAND_FR_DS_ADDR 0xD0
|
|
#define FLASH_SPI_NAND_FR_DS_DATA 0x00
|
|
|
|
|
|
/* NANDc registers used during BAM transfer */
|
|
#define NAND_READ_LOCATION_n(n) (NAND_REG(0xF20) + 4 * (n))
|
|
#define NAND_READ_LOCATION_LAST_CW_n(n) (NAND_REG(0xF40) + 4 * (n))
|
|
#define NAND_RD_LOC_LAST_BIT(x) ((x) << 31)
|
|
#define NAND_RD_LOC_SIZE(x) ((x) << 16)
|
|
#define NAND_RD_LOC_OFFSET(x) ((x) << 0)
|
|
|
|
#define NAND_DEV_CMD_VLD_V1_5_20 NAND_REG(0x70AC)
|
|
#define NAND_DEV_CMD1_V1_5_20 NAND_REG(0x70A4)
|
|
#define NAND_XFR_STEPS_V1_5_20 NAND_REG(0x7070)
|
|
|
|
/* Shift Values */
|
|
#define NAND_DEV0_CFG1_WIDE_BUS_SHIFT 1
|
|
#define NAND_DEV0_CFG0_DIS_STS_AFTER_WR_SHIFT 4
|
|
#define NAND_DEV0_CFG0_CW_PER_PAGE_SHIFT 6
|
|
#define NAND_DEV0_CFG0_UD_SIZE_BYTES_SHIFT 9
|
|
#define NAND_DEV0_CFG0_ADDR_CYCLE_SHIFT 27
|
|
#define NAND_DEV0_CFG0_SPARE_SZ_BYTES_SHIFT 23
|
|
|
|
#define NAND_DEV0_CFG1_RECOVERY_CYCLES_SHIFT 2
|
|
#define NAND_DEV0_CFG1_CS_ACTIVE_BSY_SHIFT 5
|
|
#define NAND_DEV0_CFG1_BAD_BLK_BYTE_NUM_SHIFT 6
|
|
#define NAND_DEV0_CFG1_BAD_BLK_IN_SPARE_SHIFT 16
|
|
#define NAND_DEV0_CFG1_WR_RD_BSY_GAP_SHIFT 17
|
|
#define NAND_DEV0_ECC_DISABLE_SHIFT 0
|
|
#define NAND_DEV0_ECC_SW_RESET_SHIFT 1
|
|
#define NAND_DEV0_ECC_MODE_SHIFT 4
|
|
#define NAND_DEV0_ECC_DISABLE_SHIFT 0
|
|
#define NAND_DEV0_ECC_PARITY_SZ_BYTES_SHIFT 8
|
|
#define NAND_DEV0_ECC_NUM_DATA_BYTES 16
|
|
#define NAND_DEV0_ECC_FORCE_CLK_OPEN_SHIFT 30
|
|
|
|
#define NAND_ERASED_CW_DETECT_STATUS_PAGE_ALL_ERASED 7
|
|
#define NAND_ERASED_CW_DETECT_STATUS_CODEWORD_ALL_ERASED 6
|
|
#define NAND_ERASED_CW_DETECT_STATUS_CODEWORD_ERASED 4
|
|
#define NAND_CW_ERASED (BIT(NAND_ERASED_CW_DETECT_STATUS_CODEWORD_ERASED) | \
|
|
BIT(NAND_ERASED_CW_DETECT_STATUS_CODEWORD_ALL_ERASED))
|
|
|
|
#define NAND_ERASED_CW_DETECT_CFG_RESET_CTRL 1
|
|
#define NAND_ERASED_CW_DETECT_CFG_ACTIVATE_CTRL 0
|
|
#define NAND_ERASED_CW_DETECT_ERASED_CW_ECC_MASK (1 << 1)
|
|
#define NAND_ERASED_CW_DETECT_ERASED_CW_ECC_NO_MASK (0 << 1)
|
|
|
|
/* device commands */
|
|
#define NAND_CMD_SOFT_RESET 0x01
|
|
#define NAND_CMD_PAGE_READ 0x32
|
|
#define NAND_CMD_PAGE_READ_ECC 0x33
|
|
#define NAND_CMD_PAGE_READ_ALL 0x34
|
|
#define NAND_CMD_SEQ_PAGE_READ 0x15
|
|
#define NAND_CMD_PRG_PAGE 0x36
|
|
#define NAND_CMD_PRG_PAGE_ECC 0x37
|
|
#define NAND_CMD_PRG_PAGE_ALL 0x39
|
|
#define NAND_CMD_BLOCK_ERASE 0x3A
|
|
#define NAND_CMD_FETCH_ID 0x0B
|
|
#define NAND_CMD_RESET_DEVICE 0x0D
|
|
#define NAND_CMD_SET_FEATURE 0x1F
|
|
#define NAND_CMD_GET_FEATURE 0x0F
|
|
#define NAND_CMD_ACC_FEATURE 0x0E
|
|
/* Serial NAND Device command */
|
|
#define SERIAL_NAND_CMD_READ_FROM_CACHE_X4 0x6B
|
|
#define SERIAL_NAND_CMD_READ_FROM_CACHE_DUAL_IO 0xBB
|
|
#define SERIAL_NAND_CMD_READ_FROM_CACHE_QUAD_IO 0xEB
|
|
#define SERIAL_NAND_CMD_READ_ID 0x9F
|
|
#define SERIAL_NAND_CMD_PROGRAM_LOAD 0x02
|
|
#define SERIAL_NAND_CMD_PROGRAM_LOAD_X4 0x32
|
|
#define SERIAL_NAND_CMD_PROGRAM_EXECUTE 0x10
|
|
#define SERIAL_NAND_CMD_PROGRAM_LOAD_RND_DATA 0x84
|
|
#define SERIAL_NAND_CMD_PROGRAM_LOAD_RND_DATA_X4 0xC4 /* Or 0x34 */
|
|
#define SERIAL_NAND_CMD_PROGRAM_LOAD_QUAD_IO 0x72
|
|
#define SERIAL_NAND_CMD_BLOCK_ERASE 0xD8
|
|
#define SERIAL_NAND_CMD_RESET 0xFF
|
|
|
|
/* NAND Status errors */
|
|
#define NAND_FLASH_MPU_ERR (1 << 8)
|
|
#define NAND_FLASH_TIMEOUT_ERR (1 << 6)
|
|
#define NAND_FLASH_OP_ERR (1 << 4)
|
|
|
|
#define NAND_FLASH_ERR (NAND_FLASH_MPU_ERR | \
|
|
NAND_FLASH_TIMEOUT_ERR | \
|
|
NAND_FLASH_OP_ERR)
|
|
|
|
#define PROG_ERASE_OP_RESULT (1 << 7)
|
|
|
|
/* NAND buffer status */
|
|
#define NAND_BUFFER_UNCORRECTABLE (1 << 8)
|
|
#define NUM_ERRORS_MASK 0x0000001f
|
|
#define NUM_ERRORS(i) ((i) << 0)
|
|
|
|
#define DATA_CONSUMER_PIPE_INDEX 0
|
|
#define DATA_PRODUCER_PIPE_INDEX 1
|
|
#define CMD_PIPE_INDEX 2
|
|
#define BAM_STATUS_PIPE_INDEX 3
|
|
|
|
#define QPIC_AUTO_STATUS_DES_SIZE 12
|
|
|
|
/* Define BAM pipe lock groups for NANDc*/
|
|
#define P_LOCK_GROUP_0 0
|
|
|
|
/* Define BAM pipe lock super groups for NANDc
|
|
* Note: This is configured by TZ.
|
|
*/
|
|
#define P_LOCK_SUPERGROUP_0 0
|
|
#define P_LOCK_SUPERGROUP_1 1
|
|
|
|
#define ONFI_SIGNATURE 0x49464E4F
|
|
|
|
#define ONFI_CRC_POLYNOMIAL 0x8005
|
|
#define ONFI_CRC_INIT_VALUE 0x4F4E
|
|
|
|
#define ONFI_READ_PARAM_PAGE_ADDR_CYCLES 1
|
|
#define ONFI_READ_ID_ADDR_CYCLES 1
|
|
|
|
#define ONFI_READ_ID_CMD 0x90
|
|
#define ONFI_READ_PARAM_PAGE_CMD 0xEC
|
|
#define ONFI_READ_ID_ADDR 0x20
|
|
#define ONFI_READ_PARAM_PAGE_ADDR 0x00
|
|
|
|
#define NAND_CFG0_RAW_ONFI_ID 0x88000800
|
|
#define NAND_CFG0_RAW_ONFI_PARAM_PAGE 0x88040000
|
|
#define NAND_CFG1_RAW_ONFI_ID 0x0005045D
|
|
#define NAND_CFG1_RAW_ONFI_PARAM_PAGE 0x0005045D
|
|
#define NAND_CFG0 0x290409c0
|
|
#define NAND_CFG1 0x08045d5c
|
|
#define NAND_ECC_BCH_CFG 0x42040d10
|
|
#define NAND_Bad_Block 0x00000175
|
|
#define NAND_ECC_BUF_CFG 0x00000203
|
|
|
|
#define ONFI_READ_ID_BUFFER_SIZE 0x4
|
|
#define ONFI_READ_PARAM_PAGE_BUFFER_SIZE 0x200
|
|
#define ONFI_PARAM_PAGE_SIZE 0x100
|
|
|
|
#define NAND_8BIT_DEVICE 0x01
|
|
#define NAND_16BIT_DEVICE 0x02
|
|
|
|
#define NAND_CW_SIZE_4_BIT_ECC 528
|
|
#define NAND_CW_SIZE_8_BIT_ECC 532
|
|
/* Indicates the data bytes in the user data portion of the code word. */
|
|
#define USER_DATA_BYTES_PER_CW 512
|
|
|
|
#define NAND_CW_SPARE_SIZE_8_BIT_ECC (NAND_CW_SIZE_8_BIT_ECC - \
|
|
USER_DATA_BYTES_PER_CW)
|
|
|
|
/* Indicates the number of bytes covered by BCH ECC logic when
|
|
* a codeword is written to a NAND flash device.
|
|
* This is also the number of bytes that are part of the image in CW.
|
|
* 516 bytes = (512 bytes of user data and 4 bytes of spare data)
|
|
*/
|
|
#define DATA_BYTES_IN_IMG_PER_CW 516
|
|
|
|
#define NAND_CW_DIV_RIGHT_SHIFT 9
|
|
|
|
/* Number of max cw's the driver allows to flash. */
|
|
#define QPIC_NAND_MAX_CWS_IN_PAGE 10
|
|
|
|
/* Reset Values for Status registers */
|
|
#define NAND_FLASH_STATUS_RESET 0x00000020
|
|
#define NAND_READ_STATUS_RESET 0x000000C0
|
|
|
|
/* NANDc BAM pipe numbers */
|
|
#define DATA_CONSUMER_PIPE 0
|
|
#define DATA_PRODUCER_PIPE 1
|
|
#define CMD_PIPE 2
|
|
#define NAND_BAM_STATUS_PIPE 3
|
|
|
|
/* NANDc BAM pipe groups */
|
|
#define DATA_PRODUCER_PIPE_GRP 0
|
|
#define DATA_CONSUMER_PIPE_GRP 0
|
|
#define CMD_PIPE_GRP 1
|
|
#define NAND_BAM_STATUS_PIPE_GRP 0
|
|
|
|
/* NANDc EE */
|
|
#define QPIC_NAND_EE 0
|
|
|
|
/* NANDc max desc length. */
|
|
#define QPIC_NAND_MAX_DESC_LEN 0x7FFF
|
|
|
|
/* Register: NAND_CTRL */
|
|
#define BAM_MODE_EN 0x1
|
|
#define NANDC_READ_DELAY_COUNTER_VAL 0x340
|
|
|
|
/* Register: NAND_DEBUG */
|
|
#define BAM_MODE_BIT_RESET (1 << 31)
|
|
|
|
/* CMD Valid */
|
|
#define NAND_CMD_VALID_BASE 0x1D
|
|
|
|
#define NAND_ID_MAN(id) ((id) & 0xFF)
|
|
#define NAND_ID_DEV(id) (((id) >> 8) & 0xFF)
|
|
#define NAND_ID_CFG(id) (((id) >> 24) & 0xFF)
|
|
|
|
#define NAND_CFG_PAGE_SIZE(id) (((id) >> 0) & 0x3)
|
|
#define NAND_CFG_SPARE_SIZE(id) (((id) >> 2) & 0x3)
|
|
#define NAND_CFG_BLOCK_SIZE(id) (((id) >> 4) & 0x3)
|
|
|
|
#define CHUNK_SIZE 512
|
|
|
|
#define MB_TO_BYTES(mb) (((uint64_t)(mb)) << 20)
|
|
#define KB_TO_BYTES(kb) ((kb) << 10)
|
|
|
|
#define MTD_NAND_CHIP(mtd) ((struct nand_chip *)((mtd)->priv))
|
|
#define MTD_QPIC_NAND_DEV(mtd) (MTD_NAND_CHIP(mtd)->priv)
|
|
|
|
#ifdef CONFIG_PAGE_SCOPE_MULTI_PAGE_READ
|
|
#define QPIC_BAM_DATA_FIFO_SIZE 512
|
|
#define QPIC_BAM_CMD_FIFO_SIZE 128
|
|
#define QPIC_BAM_STATUS_FIFO_SIZE 512
|
|
#else
|
|
#define QPIC_BAM_DATA_FIFO_SIZE 64
|
|
#define QPIC_BAM_CMD_FIFO_SIZE 64
|
|
#define QPIC_BAM_STATUS_FIFO_SIZE 64
|
|
#endif
|
|
|
|
#define QPIC_MAX_ONFI_MODES 4
|
|
#define QPIC_NUM_XFER_STEPS 7
|
|
|
|
enum qpic_verion{
|
|
QCA_QPIC_V1_4_20,
|
|
QCA_QPIC_V1_5_20,
|
|
QCA_QPIC_V2_1_1,
|
|
};
|
|
|
|
extern unsigned int qpic_frequency, qpic_phase, qpic_training_offset;
|
|
|
|
/* result type */
|
|
typedef enum {
|
|
NANDC_RESULT_SUCCESS = 0,
|
|
NANDC_RESULT_FAILURE = 1,
|
|
NANDC_RESULT_TIMEOUT = 2,
|
|
NANDC_RESULT_PARAM_INVALID = 3,
|
|
NANDC_RESULT_DEV_NOT_SUPPORTED = 4,
|
|
NANDC_RESULT_BAD_BLOCK = 5,
|
|
} nand_result_t;
|
|
|
|
enum nand_bad_block_value
|
|
{
|
|
NAND_BAD_BLK_VALUE_NOT_READ,
|
|
NAND_BAD_BLK_VALUE_IS_BAD,
|
|
NAND_BAD_BLK_VALUE_IS_GOOD,
|
|
};
|
|
|
|
enum nand_cfg_value
|
|
{
|
|
NAND_CFG_RAW,
|
|
NAND_CFG,
|
|
};
|
|
|
|
/* Structure for Serial nand parameter */
|
|
struct qpic_serial_nand_params {
|
|
u8 id[4];
|
|
u16 page_size;
|
|
u16 pgs_per_blk;
|
|
u32 spare_size;
|
|
u32 erase_blk_size;
|
|
u16 no_of_blocks;
|
|
u32 density;
|
|
u32 otp_region;
|
|
u8 no_of_addr_cycle;
|
|
u8 no_of_dies;
|
|
u8 num_bits_ecc_correctability;
|
|
u8 timing_mode_support;
|
|
bool quad_mode;
|
|
bool check_quad_config;
|
|
int prev_die_id;
|
|
u8 protec_bpx;
|
|
u64 pages_per_die;
|
|
const char *name;
|
|
};
|
|
|
|
struct onfi_param_page
|
|
{
|
|
uint32_t signature;
|
|
uint16_t rev;
|
|
uint16_t feature_supported;
|
|
uint16_t opt_cmd_supported;
|
|
uint8_t reserved_1[22];
|
|
uint8_t mib[12];
|
|
uint8_t device_model[20];
|
|
uint8_t manufacturer_id;
|
|
uint16_t date_code;
|
|
uint8_t reserved_2[13];
|
|
uint32_t data_per_pg;
|
|
uint16_t spare_per_pg;
|
|
uint32_t data_per_partial_pg;
|
|
uint16_t spare_per_partial_pg;
|
|
uint32_t pgs_per_blk;
|
|
uint32_t blks_per_LUN;
|
|
uint8_t num_LUN;
|
|
uint8_t num_addr_cycles;
|
|
uint8_t num_bits_per_cell;
|
|
uint16_t bad_blks_max_per_LUN;
|
|
uint16_t blk_endurance;
|
|
uint8_t guaranteed_vld_blks_at_start;
|
|
uint16_t blk_endurance_for_garunteed_vld_blks;
|
|
uint8_t num_prg_per_pg;
|
|
uint8_t partial_prog_attr;
|
|
uint8_t num_bits_ecc_correctability;
|
|
uint8_t num_interleaved_addr_bits;
|
|
uint8_t interleaved_op_attr;
|
|
uint8_t reserved_3[13];
|
|
uint8_t io_pin_capcacitance;
|
|
uint16_t timing_mode_support;
|
|
uint16_t prog_cache_timing_mode_support;
|
|
uint16_t max_pg_prog_time_us;
|
|
uint16_t max_blk_erase_time_us;
|
|
uint16_t max_pr_rd_time_us;
|
|
uint16_t min_chg_col_setup_time_us;
|
|
uint8_t reserved_4[23];
|
|
uint16_t vendor_rev;
|
|
uint8_t vendor_specific[88];
|
|
uint16_t interity_crc;
|
|
}__packed;
|
|
|
|
struct cfg_params
|
|
{
|
|
uint32_t addr0;
|
|
uint32_t addr1;
|
|
uint32_t cfg0;
|
|
uint32_t cfg1;
|
|
uint32_t cmd;
|
|
uint32_t ecc_cfg;
|
|
uint32_t addr_loc_0;
|
|
uint32_t exec;
|
|
};
|
|
|
|
struct onfi_probe_params
|
|
{
|
|
uint32_t vld;
|
|
uint32_t dev_cmd1;
|
|
struct cfg_params cfg;
|
|
};
|
|
|
|
/* This stucture is used to create a static list of devices we support.
|
|
* This include a subset of values defined in the flash_info struct as
|
|
* other values can be derived.
|
|
*/
|
|
struct flash_id
|
|
{
|
|
unsigned flash_id;
|
|
unsigned mask;
|
|
unsigned density;
|
|
unsigned widebus;
|
|
unsigned pagesize;
|
|
unsigned blksize;
|
|
unsigned oobsize;
|
|
unsigned ecc_8_bits;
|
|
};
|
|
|
|
/* Structure to hold the pipe numbers */
|
|
struct qpic_nand_bam_pipes
|
|
{
|
|
unsigned read_pipe;
|
|
unsigned write_pipe;
|
|
unsigned cmd_pipe;
|
|
#ifdef CONFIG_PAGE_SCOPE_MULTI_PAGE_READ
|
|
unsigned status_pipe;
|
|
#endif
|
|
uint8_t read_pipe_grp;
|
|
uint8_t write_pipe_grp;
|
|
uint8_t cmd_pipe_grp;
|
|
#ifdef CONFIG_PAGE_SCOPE_MULTI_PAGE_READ
|
|
uint8_t status_pipe_grp;
|
|
#endif
|
|
};
|
|
|
|
/* Structure to define the initial nand config */
|
|
struct qpic_nand_init_config
|
|
{
|
|
uint32_t nand_base;
|
|
uint32_t bam_base;
|
|
uint32_t ee;
|
|
uint32_t max_desc_len;
|
|
struct qpic_nand_bam_pipes pipes;
|
|
};
|
|
|
|
struct read_stats {
|
|
uint32_t flash_sts;
|
|
uint32_t buffer_sts;
|
|
uint32_t erased_cw_sts;
|
|
};
|
|
|
|
struct qpic_nand_dev {
|
|
unsigned id;
|
|
unsigned type;
|
|
unsigned vendor;
|
|
unsigned device;
|
|
unsigned page_size;
|
|
unsigned block_size;
|
|
unsigned spare_size;
|
|
unsigned num_blocks;
|
|
unsigned num_pages_per_blk;
|
|
unsigned num_pages_per_blk_mask;
|
|
unsigned widebus;
|
|
unsigned density;
|
|
unsigned cw_size;
|
|
unsigned cws_per_page;
|
|
unsigned bad_blk_loc;
|
|
unsigned ecc_bytes_hw;
|
|
unsigned spare_bytes;
|
|
unsigned bbm_size;
|
|
unsigned dev_cfg;
|
|
uint32_t cfg0;
|
|
uint32_t cfg1;
|
|
uint32_t cfg0_raw;
|
|
uint32_t cfg1_raw;
|
|
uint32_t ecc_bch_cfg;
|
|
#ifdef CONFIG_QPIC_SERIAL
|
|
bool quad_mode;
|
|
bool check_quad_config;
|
|
#endif
|
|
unsigned oob_per_page;
|
|
unsigned char *buffers;
|
|
unsigned char *pad_dat;
|
|
unsigned char *pad_oob;
|
|
unsigned char *zero_page;
|
|
unsigned char *zero_oob;
|
|
unsigned char *tmp_datbuf;
|
|
unsigned char *tmp_oobbuf;
|
|
#ifdef CONFIG_PAGE_SCOPE_MULTI_PAGE_READ
|
|
bool multi_page_copy;
|
|
uint32_t multi_page_req_len;
|
|
unsigned char *status_buff;
|
|
uint32_t status_buf_size;
|
|
#endif
|
|
uint16_t timing_mode_support;
|
|
struct read_stats stats[QPIC_NAND_MAX_CWS_IN_PAGE];
|
|
};
|
|
|
|
void qpic_nand_init(qpic_nand_cfg_t *qpic_nand_cfg);
|
|
|
|
#endif
|