uboot/drivers/spi/cadence_qspi.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/*
   3 * Copyright (C) 2012
   4 * Altera Corporation <www.altera.com>
   5 */
   6
   7#ifndef __CADENCE_QSPI_H__
   8#define __CADENCE_QSPI_H__
   9
  10#include <reset.h>
  11
  12#define CQSPI_IS_ADDR(cmd_len)          (cmd_len > 1 ? 1 : 0)
  13
  14#define CQSPI_NO_DECODER_MAX_CS         4
  15#define CQSPI_DECODER_MAX_CS            16
  16#define CQSPI_READ_CAPTURE_MAX_DELAY    16
  17
  18#define CQSPI_REG_POLL_US                       1 /* 1us */
  19#define CQSPI_REG_RETRY                         10000
  20#define CQSPI_POLL_IDLE_RETRY                   3
  21
  22/* Transfer mode */
  23#define CQSPI_INST_TYPE_SINGLE                  0
  24#define CQSPI_INST_TYPE_DUAL                    1
  25#define CQSPI_INST_TYPE_QUAD                    2
  26#define CQSPI_INST_TYPE_OCTAL                   3
  27
  28#define CQSPI_STIG_DATA_LEN_MAX                 8
  29
  30#define CQSPI_DUMMY_CLKS_PER_BYTE               8
  31#define CQSPI_DUMMY_BYTES_MAX                   4
  32
  33/****************************************************************************
  34 * Controller's configuration and status register (offset from QSPI_BASE)
  35 ****************************************************************************/
  36#define CQSPI_REG_CONFIG                        0x00
  37#define CQSPI_REG_CONFIG_ENABLE                 BIT(0)
  38#define CQSPI_REG_CONFIG_CLK_POL                BIT(1)
  39#define CQSPI_REG_CONFIG_CLK_PHA                BIT(2)
  40#define CQSPI_REG_CONFIG_PHY_ENABLE_MASK        BIT(3)
  41#define CQSPI_REG_CONFIG_DIRECT                 BIT(7)
  42#define CQSPI_REG_CONFIG_DECODE                 BIT(9)
  43#define CQSPI_REG_CONFIG_ENBL_DMA               BIT(15)
  44#define CQSPI_REG_CONFIG_XIP_IMM                BIT(18)
  45#define CQSPI_REG_CONFIG_DTR_PROT_EN_MASK       BIT(24)
  46#define CQSPI_REG_CONFIG_CHIPSELECT_LSB         10
  47#define CQSPI_REG_CONFIG_BAUD_LSB               19
  48#define CQSPI_REG_CONFIG_IDLE_LSB               31
  49#define CQSPI_REG_CONFIG_CHIPSELECT_MASK        0xF
  50#define CQSPI_REG_CONFIG_BAUD_MASK              0xF
  51
  52#define CQSPI_REG_RD_INSTR                      0x04
  53#define CQSPI_REG_RD_INSTR_OPCODE_LSB           0
  54#define CQSPI_REG_RD_INSTR_TYPE_INSTR_LSB       8
  55#define CQSPI_REG_RD_INSTR_TYPE_ADDR_LSB        12
  56#define CQSPI_REG_RD_INSTR_TYPE_DATA_LSB        16
  57#define CQSPI_REG_RD_INSTR_MODE_EN_LSB          20
  58#define CQSPI_REG_RD_INSTR_DUMMY_LSB            24
  59#define CQSPI_REG_RD_INSTR_TYPE_INSTR_MASK      0x3
  60#define CQSPI_REG_RD_INSTR_TYPE_ADDR_MASK       0x3
  61#define CQSPI_REG_RD_INSTR_TYPE_DATA_MASK       0x3
  62#define CQSPI_REG_RD_INSTR_DUMMY_MASK           0x1F
  63
  64#define CQSPI_REG_WR_INSTR                      0x08
  65#define CQSPI_REG_WR_INSTR_OPCODE_LSB           0
  66#define CQSPI_REG_WR_INSTR_TYPE_DATA_LSB        16
  67
  68#define CQSPI_REG_DELAY                         0x0C
  69#define CQSPI_REG_DELAY_TSLCH_LSB               0
  70#define CQSPI_REG_DELAY_TCHSH_LSB               8
  71#define CQSPI_REG_DELAY_TSD2D_LSB               16
  72#define CQSPI_REG_DELAY_TSHSL_LSB               24
  73#define CQSPI_REG_DELAY_TSLCH_MASK              0xFF
  74#define CQSPI_REG_DELAY_TCHSH_MASK              0xFF
  75#define CQSPI_REG_DELAY_TSD2D_MASK              0xFF
  76#define CQSPI_REG_DELAY_TSHSL_MASK              0xFF
  77
  78#define CQSPI_REG_RD_DATA_CAPTURE               0x10
  79#define CQSPI_REG_RD_DATA_CAPTURE_BYPASS        BIT(0)
  80#define CQSPI_REG_READCAPTURE_DQS_ENABLE        BIT(8)
  81#define CQSPI_REG_RD_DATA_CAPTURE_DELAY_LSB     1
  82#define CQSPI_REG_RD_DATA_CAPTURE_DELAY_MASK    0xF
  83
  84#define CQSPI_REG_SIZE                          0x14
  85#define CQSPI_REG_SIZE_ADDRESS_LSB              0
  86#define CQSPI_REG_SIZE_PAGE_LSB                 4
  87#define CQSPI_REG_SIZE_BLOCK_LSB                16
  88#define CQSPI_REG_SIZE_ADDRESS_MASK             0xF
  89#define CQSPI_REG_SIZE_PAGE_MASK                0xFFF
  90#define CQSPI_REG_SIZE_BLOCK_MASK               0x3F
  91
  92#define CQSPI_REG_SRAMPARTITION                 0x18
  93#define CQSPI_REG_INDIRECTTRIGGER               0x1C
  94
  95#define CQSPI_REG_REMAP                         0x24
  96#define CQSPI_REG_MODE_BIT                      0x28
  97
  98#define CQSPI_REG_SDRAMLEVEL                    0x2C
  99#define CQSPI_REG_SDRAMLEVEL_RD_LSB             0
 100#define CQSPI_REG_SDRAMLEVEL_WR_LSB             16
 101#define CQSPI_REG_SDRAMLEVEL_RD_MASK            0xFFFF
 102#define CQSPI_REG_SDRAMLEVEL_WR_MASK            0xFFFF
 103
 104#define CQSPI_REG_IRQSTATUS                     0x40
 105#define CQSPI_REG_IRQMASK                       0x44
 106
 107#define CQSPI_REG_INDIRECTRD                    0x60
 108#define CQSPI_REG_INDIRECTRD_START              BIT(0)
 109#define CQSPI_REG_INDIRECTRD_CANCEL             BIT(1)
 110#define CQSPI_REG_INDIRECTRD_INPROGRESS         BIT(2)
 111#define CQSPI_REG_INDIRECTRD_DONE               BIT(5)
 112
 113#define CQSPI_REG_INDIRECTRDWATERMARK           0x64
 114#define CQSPI_REG_INDIRECTRDSTARTADDR           0x68
 115#define CQSPI_REG_INDIRECTRDBYTES               0x6C
 116
 117#define CQSPI_REG_CMDCTRL                       0x90
 118#define CQSPI_REG_CMDCTRL_EXECUTE               BIT(0)
 119#define CQSPI_REG_CMDCTRL_INPROGRESS            BIT(1)
 120#define CQSPI_REG_CMDCTRL_DUMMY_LSB             7
 121#define CQSPI_REG_CMDCTRL_WR_BYTES_LSB          12
 122#define CQSPI_REG_CMDCTRL_WR_EN_LSB             15
 123#define CQSPI_REG_CMDCTRL_ADD_BYTES_LSB         16
 124#define CQSPI_REG_CMDCTRL_ADDR_EN_LSB           19
 125#define CQSPI_REG_CMDCTRL_RD_BYTES_LSB          20
 126#define CQSPI_REG_CMDCTRL_RD_EN_LSB             23
 127#define CQSPI_REG_CMDCTRL_OPCODE_LSB            24
 128#define CQSPI_REG_CMDCTRL_DUMMY_MASK            0x1F
 129#define CQSPI_REG_CMDCTRL_WR_BYTES_MASK         0x7
 130#define CQSPI_REG_CMDCTRL_ADD_BYTES_MASK        0x3
 131#define CQSPI_REG_CMDCTRL_RD_BYTES_MASK         0x7
 132#define CQSPI_REG_CMDCTRL_OPCODE_MASK           0xFF
 133
 134#define CQSPI_REG_INDIRECTWR                    0x70
 135#define CQSPI_REG_INDIRECTWR_START              BIT(0)
 136#define CQSPI_REG_INDIRECTWR_CANCEL             BIT(1)
 137#define CQSPI_REG_INDIRECTWR_INPROGRESS         BIT(2)
 138#define CQSPI_REG_INDIRECTWR_DONE               BIT(5)
 139
 140#define CQSPI_REG_INDIRECTWRWATERMARK           0x74
 141#define CQSPI_REG_INDIRECTWRSTARTADDR           0x78
 142#define CQSPI_REG_INDIRECTWRBYTES               0x7C
 143
 144#define CQSPI_REG_CMDADDRESS                    0x94
 145#define CQSPI_REG_CMDREADDATALOWER              0xA0
 146#define CQSPI_REG_CMDREADDATAUPPER              0xA4
 147#define CQSPI_REG_CMDWRITEDATALOWER             0xA8
 148#define CQSPI_REG_CMDWRITEDATAUPPER             0xAC
 149
 150#define CQSPI_REG_PHY_CONFIG                    0xB4
 151#define CQSPI_REG_PHY_CONFIG_RESET_FLD_MASK     0x40000000
 152
 153#define CQSPI_DMA_DST_ADDR_REG                  0x1800
 154#define CQSPI_DMA_DST_SIZE_REG                  0x1804
 155#define CQSPI_DMA_DST_STS_REG                   0x1808
 156#define CQSPI_DMA_DST_CTRL_REG                  0x180C
 157#define CQSPI_DMA_DST_I_STS_REG                 0x1814
 158#define CQSPI_DMA_DST_I_ENBL_REG                0x1818
 159#define CQSPI_DMA_DST_I_DISBL_REG               0x181C
 160#define CQSPI_DMA_DST_CTRL2_REG                 0x1824
 161#define CQSPI_DMA_DST_ADDR_MSB_REG              0x1828
 162
 163#define CQSPI_DMA_SRC_RD_ADDR_REG               0x1000
 164
 165#define CQSPI_REG_DMA_PERIPH_CFG                0x20
 166#define CQSPI_REG_INDIR_TRIG_ADDR_RANGE         0x80
 167#define CQSPI_DFLT_INDIR_TRIG_ADDR_RANGE        6
 168#define CQSPI_DFLT_DMA_PERIPH_CFG               0x602
 169#define CQSPI_DFLT_DST_CTRL_REG_VAL             0xF43FFA00
 170
 171#define CQSPI_DMA_DST_I_STS_DONE                BIT(1)
 172#define CQSPI_DMA_TIMEOUT                       10000000
 173
 174#define CQSPI_REG_IS_IDLE(base)                         \
 175        ((readl(base + CQSPI_REG_CONFIG) >>             \
 176        CQSPI_REG_CONFIG_IDLE_LSB) & 0x1)
 177
 178#define CQSPI_GET_RD_SRAM_LEVEL(reg_base)               \
 179        (((readl(reg_base + CQSPI_REG_SDRAMLEVEL)) >>   \
 180        CQSPI_REG_SDRAMLEVEL_RD_LSB) & CQSPI_REG_SDRAMLEVEL_RD_MASK)
 181
 182#define CQSPI_GET_WR_SRAM_LEVEL(reg_base)               \
 183        (((readl(reg_base + CQSPI_REG_SDRAMLEVEL)) >>   \
 184        CQSPI_REG_SDRAMLEVEL_WR_LSB) & CQSPI_REG_SDRAMLEVEL_WR_MASK)
 185
 186struct cadence_spi_platdata {
 187        unsigned int    ref_clk_hz;
 188        unsigned int    max_hz;
 189        void            *regbase;
 190        void            *ahbbase;
 191        bool            is_decoded_cs;
 192        u32             fifo_depth;
 193        u32             fifo_width;
 194        u32             trigger_address;
 195
 196        /* Flash parameters */
 197        u32             page_size;
 198        u32             block_size;
 199        u32             tshsl_ns;
 200        u32             tsd2d_ns;
 201        u32             tchsh_ns;
 202        u32             tslch_ns;
 203        bool            is_dma;
 204        bool            stg_pgm;
 205};
 206
 207struct cadence_spi_priv {
 208        void            *regbase;
 209        void            *ahbbase;
 210        size_t          cmd_len;
 211        u8              cmd_buf[32];
 212        size_t          data_len;
 213
 214        int             qspi_is_init;
 215        unsigned int    qspi_calibrated_hz;
 216        unsigned int    qspi_calibrated_cs;
 217        unsigned int    previous_hz;
 218
 219        struct reset_ctl_bulk resets;
 220};
 221
 222/* Functions call declaration */
 223void cadence_qspi_apb_controller_init(struct cadence_spi_platdata *plat);
 224void cadence_qspi_apb_controller_enable(void *reg_base_addr);
 225void cadence_qspi_apb_controller_disable(void *reg_base_addr);
 226
 227int cadence_qspi_apb_command_read(void *reg_base_addr,
 228        unsigned int cmdlen, const u8 *cmdbuf, unsigned int rxlen, u8 *rxbuf);
 229int cadence_qspi_apb_command_write(struct udevice *dev,
 230                                   unsigned int cmdlen, const u8 *cmdbuf,
 231                                   unsigned int txlen,  const u8 *txbuf);
 232
 233int cadence_qspi_apb_indirect_read_setup(struct cadence_spi_platdata *plat,
 234        unsigned int cmdlen, unsigned int rx_width, const u8 *cmdbuf);
 235int cadence_qspi_apb_indirect_read_execute(struct cadence_spi_platdata *plat,
 236        unsigned int rxlen, u8 *rxbuf);
 237int cadence_qspi_apb_indirect_write_setup(struct cadence_spi_platdata *plat,
 238        unsigned int cmdlen, unsigned int tx_width, const u8 *cmdbuf);
 239int cadence_qspi_apb_indirect_write_execute(struct cadence_spi_platdata *plat,
 240        unsigned int txlen, const u8 *txbuf);
 241
 242void cadence_qspi_apb_chipselect(void *reg_base,
 243        unsigned int chip_select, unsigned int decoder_enable);
 244void cadence_qspi_apb_set_clk_mode(void *reg_base, uint mode);
 245void cadence_qspi_apb_config_baudrate_div(void *reg_base,
 246        unsigned int ref_clk_hz, unsigned int sclk_hz);
 247void cadence_qspi_apb_delay(void *reg_base,
 248        unsigned int ref_clk, unsigned int sclk_hz,
 249        unsigned int tshsl_ns, unsigned int tsd2d_ns,
 250        unsigned int tchsh_ns, unsigned int tslch_ns);
 251void cadence_qspi_apb_enter_xip(void *reg_base, char xip_dummy);
 252void cadence_qspi_apb_readdata_capture(void *reg_base,
 253        unsigned int bypass, unsigned int delay);
 254int cadence_qspi_apb_dma_read(struct cadence_spi_platdata *plat,
 255                              unsigned int n_rx, u8 *rxbuf);
 256int cadence_qspi_apb_exec_flash_cmd(void *reg_base, unsigned int reg);
 257int cadence_qspi_apb_wait_for_dma_cmplt(struct cadence_spi_platdata *plat);
 258int cadence_spi_versal_flash_reset(struct udevice *dev);
 259
 260#endif /* __CADENCE_QSPI_H__ */
 261