u-boot-2016/arch/arm/include/asm/arch-qca-common/bam.h
Md Sadre Alam 599391c231 driver: mtd: qpic: Enable support for page_scope & multi_page read command.
This change will enable page_scope_read & multipage_read support for
QPIC.
QPIC version 2.0 onwards , QPIC support page_scope_read &
multipage_read command to enhance the read performance.
In normal page read command SW is needed to write EXEC_CMD register
for each Code word and collect any Status related to that CW before
issueing EXEC_CMD for next CW.

For page_scope read command SW is required to issue EXEC_CMD
only once for a page. Controller HW takes care of Codeword specific
details and automatically returns status associated with each CW to
BAM pipe, dedicated for status deposition.

enabling all bits in NAND_AUTO_STATUS_EN will require 4 data
descriptors of 24 bytes each. This will publish all NANDc status
registers in system memory.

For multipage_read command SW is required to issue EXEC_CMD only
once for all the pages which configured in QPIC_NAND_MULTI_PAGE_CMD
register.
All interrupts will be operational and valid in these modes.

To check the status for each codeword, it is not possible to access
the status registers while the read command is operational in
page_scope & multi_page read  modes. Hence, another feature to publish the
status data (for all NAND status registers) by programming the
NAND_AUTO_STATUS_EN register.

For serial NAND:
Read command for page_scope_read = 0x78800032 (QPIC_NAND_FLASH_CMD)
Read command for multi_page_read = 0x78400032 (QPIC_NAND_FLASH_CMD)

For Parallel NAND:
Read command for page_scope_read = 0x00800032 (QPIC_NAND_FLASH_CMD)
Read command for multi_page_read = 0x00400032 (QPIC_NAND_FLASH_CMD)

Now we fixed maximum data bytes read in one go 128KiB(2KiB page),
256KiB (4KiB page), 512 KiB (8kiB page), because from upper layer
we are getting more than 128KiB data bytes request in one go. if so
just changing the value of "MAX_MULTI_PAGE" macro will increase the
maximum data bytes in one go.

Change-Id: I48eea51ff8f5f79f3490d8a538c295ecc3eeee19
Signed-off-by: Md Sadre Alam <mdalam@codeaurora.org>
2020-03-06 15:52:15 +05:30

294 lines
10 KiB
C

/* Copyright (c) 2012, 2015-2017 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.
* * Neither the name of The Linux Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* 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 __BAM_H
#define __BAM_H
#include <compiler.h>
#define BAM_V170 1
#if BAM_V170
#define BAM_IRQ_SRCS(x, n) (0x00003000 + 0x1000 * (n) + (x))
#define BAM_IRQ_SRCS_MSK(x, n) (0x00003004 + 0x1000 * (n) + (x))
#define BAM_IRQ_SRCS_UNMASKED(x) (0x00003018 + (x))
#define BAM_TRUST_REG(x) (0x00002000 + (x))
#define BAM_P_CTRLn(n, x) (0x00013000 + 0x1000 * (n) + (x))
#define BAM_P_RSTn(n, x) (0x00013000 + 0x4 + 0x1000 * (n) + (x))
#define BAM_P_IRQ_STTSn(n, x) (0x00013000 + 0x10 + 0x1000 * (n) + (x))
#define BAM_P_IRQ_CLRn(n, x) (0x00013000 + 0x14 + 0x1000 * (n) + (x))
#define BAM_P_IRQ_ENn(n, x) (0x00013000 + 0x18 + 0x1000 * (n) + (x))
#define BAM_P_TRUST_REGn(n, x) (0x2020 + 0x4* (n) + (x))
#define BAM_P_SW_OFSTSn(n, x) (0x00013800 + 0x1000 * (n) + (x))
#define BAM_P_EVNT_REGn(n, x) (0x00013818 + 0x1000 * (n) + (x))
#define BAM_P_DESC_FIFO_ADDRn(n, x) (0x0001381C + 0x1000 * (n) + (x))
#define BAM_P_FIFO_SIZESn(n, x) (0x00013820 + 0x1000 * (n) + (x))
#else
#define BAM_IRQ_SRCS(x, n) (0x00000800 + (0x80 * (n)) + (x))
#define BAM_IRQ_SRCS_MSK(x, n) (0x00000804 + (0x80 * (n)) + (x))
#define BAM_IRQ_SRCS_UNMASKED(x) (0x00000030 + (x))
#define BAM_TRUST_REG(x) (0x00000070 + (x))
#define BAM_P_CTRLn(n, x) (0x00001000 + 0x1000 * (n) + (x))
#define BAM_P_RSTn(n, x) (0x00001000 + 0x4 + 0x1000 * (n) + (x))
#define BAM_P_IRQ_STTSn(n, x) (0x00001000 + 0x10 + 0x1000 * (n) + (x))
#define BAM_P_IRQ_CLRn(n, x) (0x00001000 + 0x14 + 0x1000 * (n) + (x))
#define BAM_P_IRQ_ENn(n, x) (0x00001000 + 0x18 + 0x1000 * (n) + (x))
#define BAM_P_TRUST_REGn(n, x) (0x00001000 + 0x30 + 0x1000 * (n) + (x))
#define BAM_P_SW_OFSTSn(n, x) (0x00001800 + 0x1000 * (n) + (x))
#define BAM_P_EVNT_REGn(n, x) (0x00001818 + 0x1000 * (n) + (x))
#define BAM_P_DESC_FIFO_ADDRn(n, x) (0x0000181C + 0x1000 * (n) + (x))
#define BAM_P_FIFO_SIZESn(n, x) (0x00001820 + 0x1000 * (n) + (x))
#endif
#define BAM_DESC_SIZE 8
#define BAM_CE_SIZE 16
#define BAM_MAX_DESC_DATA_LEN 0xFFFF
#define BAM_NDP_MAX_DESC_DATA_LEN 0x7FFF
#define BAM_DATA_READ 0
#define BAM_DATA_WRITE 1
#define BAM_CTRL_REG(x) (0x0000 + (x))
#define BAM_SW_RST_BIT_MASK 1
#define BAM_ENABLE_BIT_MASK (1 << 1)
#define BAM_DESC_CNT_TRSHLD_REG(x) (0x0008 + (x))
#define COUNT_TRESHOLD_MASK 0xFF
#define BAM_IRQ_MASK (1 << 31)
#define BAM_IRQ_EN (1 << 31)
#define P_IRQ_MASK (1)
#define BAM_IRQ_SRCS_PIPE_MASK 0x7FFF
#define BAM_IRQ_STTS(x) (0x00000014 + (x))
#define BAM_IRQ_EN_REG(x) (0x001C + (x))
#define BAM_TIMER_EN_MASK (1 << 4)
/* Available only in BAM-Lite */
#define BAM_EMPTY_EN_MASK (1 << 3)
#define BAM_ERROR_EN_MASK (1 << 2)
/* Available only in BAM */
#define BAM_HRESP_ERR_EN_MASK (1 << 1)
#define BAM_EE_MASK (7 << 0)
#define BAM_RESET_BLK_MASK (1 << 7)
#define BAM_LOCK_EE_CTRL_MASK (1 << 13)
#define BAM_CNFG_BITS(x) (0x0000007C + (x))
#define P_SYS_MODE_MASK (1 << 5)
/* 1: Producer mode 0: Consumer mode */
#define P_DIRECTION_SHIFT 3
#define P_LOCK_GRP_SHIFT 16
#define P_ENABLE (1 << 1)
#define P_DESC_FIFO_PEER_OFST_MASK 0xFF
/* Flags for descriptors */
#define BAM_DESC_INT_FLAG (1 << 7)
#define BAM_DESC_EOT_FLAG (1 << 6)
#define BAM_DESC_EOB_FLAG (1 << 5)
#define BAM_DESC_NWD_FLAG (1 << 4)
#define BAM_DESC_CMD_FLAG (1 << 3)
#define BAM_DESC_LOCK_FLAG (1 << 2)
#define BAM_DESC_UNLOCK_FLAG (1 << 1)
#define BAM_CE_REG_ADDR_MASK 0xFF000000
#define BAM_CE_REG_MASK 0xFFFFFFFF
#define BAM_CE_CMD_TYPE_SHIFT 24
typedef unsigned long addr_t;
static inline int ispow2(uint val)
{
return ((val - 1) & val) == 0;
}
/* Pipe Interrupt masks */
enum p_int_type
{
P_PRCSD_DESC_EN_MASK = 1,
P_OUT_OF_DESC_EN_MASK = (1 << 3),
P_ERR_EN_MASK = (1 << 4),
P_TRNSFR_END_EN_MASK = (1 << 5)
};
enum bam_ce_cmd_t{
CE_WRITE_TYPE = 0,
CE_READ_TYPE = 1
};
/* result type */
typedef enum {
BAM_RESULT_SUCCESS = 0,
BAM_RESULT_FAILURE = 1,
BAM_RESULT_TIMEOUT = 2
} bam_result_t;
/* Enum to define the BAM type:
* BAM2BAM:Producer BAM to Consumer BAM.
* SYS2BAM:Producer System to Consumer BAM.
* BAM2SYS:Producer BAM to Consumer System.
*/
enum bam_transaction_type {
SYS2BAM,
BAM2SYS,
BAM2BAM,
};
/* Enum to define BAM mode:
* SPS:Use BAM pipes.
* DIRECT:Pipes are disabled.
* LEGACY:BAM is not used.
*/
enum bam_mode {
SPS,
DIRECT,
LEGACY,
};
/* Enum to define BAM pipe states:
* ENABLED:Producer and Consumer pipes are enabled.
* HALT:Consumer pipe is halted. (Preferred type)
* FULL_HALT:Both Producer and Consumer pipes are halted.
*/
enum bam_pipe_state {
ENABLED,
HALT,
FULL_HALT,
};
enum bam_type {
BAM_LITE,
BAM,
};
/* Structure to define BAM descriptors that describe the data
* descriptors written to the data FIFO.
* addr:Descriptor address.
* size:Each descriptor is 8 bytes. Size of the descriptor fifo must
* contain an integer number of Descriptors.
*/
struct bam_desc {
uint32_t addr;
uint16_t size;
uint8_t reserved;
uint8_t flags;
} __attribute__ ((packed));
struct bam_desc_fifo {
struct bam_desc *head;
struct bam_desc *current;
uint16_t size;
uint16_t offset;
};
/* Structure to define BAM pipes
* pipe_state: BAM pipe states.
* trans_type: BAM tranaction type.
* evt_gen_threshold: This register configures the threshold value for
* Read/Write event generation by the BAM
* towards another BAM.
* fifo: Circular fifo associated with this pipe.
* num_pipe: Number of pipes used in this bam.
* pipe: Pipe number for this pipe.
* spi_num: SPI number for the BAM interrupt.
* int_mode: Specifies the pipe mode.
* 1: Interrupt mode
* 0: Polling mode
*/
struct bam_pipe {
enum bam_pipe_state state;
enum bam_transaction_type trans_type;
struct bam_desc_fifo fifo;
uint16_t evt_gen_threshold;
uint8_t pipe_num;
uint8_t spi_num;
uint8_t int_mode;
uint8_t initialized;
uint8_t lock_grp;
};
/* Structure to define a BAM instance being used
* base:Base address for the BAM.
* type:BAM type.
* mode:BAM mode.
* pipe_pair:The pipe pairs to be used to access the BAM.
* threshold:This Register holds a threshold value for the
* counter summing the Size of the Descriptors Provided.
* ee:Execution Environment for the BAM.
* desc_len: Max desc length for the current BAM.
*/
struct bam_instance {
uint32_t base;
enum bam_type type;
enum bam_mode mode;
uint8_t num_of_pipes;
struct bam_pipe pipe[4];
uint16_t threshold;
uint32_t ee;
uint16_t max_desc_len;
void (*callback)(int);
};
/* Command element(CE) structure*/
struct cmd_element {
uint32_t addr_n_cmd;
uint32_t reg_data;
uint32_t reg_mask;
uint32_t reserve;
} __attribute__ ((packed));
void bam_init(struct bam_instance *bam);
void bam_sys_pipe_init(struct bam_instance *bam,
uint8_t pipe_num);
int bam_pipe_fifo_init(struct bam_instance *bam,
uint8_t pipe_num);
struct cmd_element* bam_add_cmd_element(struct cmd_element *ptr,
uint32_t addr,
uint32_t data,
enum bam_ce_cmd_t cmd_type);
int bam_add_desc(struct bam_instance *bam,
unsigned int pipe_num,
unsigned char *data_ptr,
unsigned int data_len,
unsigned flags);
int bam_add_one_desc(struct bam_instance *bam,
unsigned int pipe_num,
unsigned char*,
uint32_t len,
uint8_t flags);
void bam_sys_gen_event(struct bam_instance *bam,
uint8_t pipe_num,
unsigned int num_desc);
int bam_wait_for_interrupt(struct bam_instance *bam,
uint8_t pipe_num,
enum p_int_type interrupt);
void bam_read_offset_update(struct bam_instance *bam, unsigned int pipe_num);
void bam_pipe_reset(struct bam_instance *bam,
uint8_t pipe_num);
#endif