1ddaf02d1SJit Loon Lim /* 2ddaf02d1SJit Loon Lim * Copyright (c) 2022-2023, Intel Corporation. All rights reserved. 3*6f7f8b18SGirisha Dengi * Copyright (c) 2025, Altera Corporation. All rights reserved. 4ddaf02d1SJit Loon Lim * 5ddaf02d1SJit Loon Lim * SPDX-License-Identifier: BSD-3-Clause 6ddaf02d1SJit Loon Lim */ 7ddaf02d1SJit Loon Lim 8ddaf02d1SJit Loon Lim #ifndef CDN_NAND_H 9ddaf02d1SJit Loon Lim #define CDN_NAND_H 10ddaf02d1SJit Loon Lim 11ddaf02d1SJit Loon Lim #include <drivers/cadence/cdns_combo_phy.h> 12ddaf02d1SJit Loon Lim 13*6f7f8b18SGirisha Dengi // TBD: Move to common place 14*6f7f8b18SGirisha Dengi #define __bf_shf(x) (__builtin_ffsll(x) - 1U) 15*6f7f8b18SGirisha Dengi #define FIELD_GET(_mask, _reg) \ 16*6f7f8b18SGirisha Dengi ({ \ 17*6f7f8b18SGirisha Dengi (typeof(_mask))(((_reg) & (_mask)) >> __bf_shf(_mask)); \ 18*6f7f8b18SGirisha Dengi }) 19*6f7f8b18SGirisha Dengi 20*6f7f8b18SGirisha Dengi #define FIELD_PREP(_mask, _val) \ 21*6f7f8b18SGirisha Dengi ({ \ 22*6f7f8b18SGirisha Dengi ((typeof(_mask))(_val) << __bf_shf(_mask)) & (_mask); \ 23*6f7f8b18SGirisha Dengi }) 24*6f7f8b18SGirisha Dengi 25ddaf02d1SJit Loon Lim /* NAND flash device information */ 26ddaf02d1SJit Loon Lim typedef struct cnf_dev_info { 27*6f7f8b18SGirisha Dengi uint8_t mfr_id; 28*6f7f8b18SGirisha Dengi uint8_t dev_id; 29ddaf02d1SJit Loon Lim uint8_t type; 30ddaf02d1SJit Loon Lim uint8_t nluns; 31ddaf02d1SJit Loon Lim uint8_t sector_cnt; 32ddaf02d1SJit Loon Lim uint16_t npages_per_block; 33ddaf02d1SJit Loon Lim uint16_t sector_size; 34ddaf02d1SJit Loon Lim uint16_t last_sector_size; 35ddaf02d1SJit Loon Lim uint16_t page_size; 36ddaf02d1SJit Loon Lim uint16_t spare_size; 37ddaf02d1SJit Loon Lim uint32_t nblocks_per_lun; 38ddaf02d1SJit Loon Lim uint32_t block_size; 39ddaf02d1SJit Loon Lim unsigned long long total_size; 40ddaf02d1SJit Loon Lim } cnf_dev_info_t; 41ddaf02d1SJit Loon Lim 42ddaf02d1SJit Loon Lim /* Shared Macros */ 43ddaf02d1SJit Loon Lim 44ddaf02d1SJit Loon Lim /* Default values */ 45ddaf02d1SJit Loon Lim #define CNF_DEF_VOL_ID 0 46ddaf02d1SJit Loon Lim #define CNF_DEF_DEVICE 0 47ddaf02d1SJit Loon Lim #define CNF_DEF_TRD 0 48*6f7f8b18SGirisha Dengi #define CNF_READ_SINGLE_PAGE 1U 49*6f7f8b18SGirisha Dengi #define CNF_DEF_DELAY_US 500U 50*6f7f8b18SGirisha Dengi #define CNF_READ_INT_DELAY_US 10U 51*6f7f8b18SGirisha Dengi 52*6f7f8b18SGirisha Dengi /* Number of micro seconds to complete the Device Discovery Process. */ 53*6f7f8b18SGirisha Dengi #define CNF_DD_INIT_COMP_US 2000000U 54ddaf02d1SJit Loon Lim 55ddaf02d1SJit Loon Lim /* Work modes */ 56*6f7f8b18SGirisha Dengi #define CNF_WORK_MODE_CDMA 0U 57*6f7f8b18SGirisha Dengi #define CNF_WORK_MODE_PIO 1U 58ddaf02d1SJit Loon Lim 59ddaf02d1SJit Loon Lim /* Command types */ 60ddaf02d1SJit Loon Lim #define CNF_CT_SET_FEATURE 0x0100 61ddaf02d1SJit Loon Lim #define CNF_CT_RESET_ASYNC 0x1100 62ddaf02d1SJit Loon Lim #define CNF_CT_RESET_SYNC 0x1101 63ddaf02d1SJit Loon Lim #define CNF_CT_RESET_LUN 0x1102 64ddaf02d1SJit Loon Lim #define CNF_CT_ERASE 0x1000 65ddaf02d1SJit Loon Lim #define CNF_CT_PAGE_PROGRAM 0x2100 66ddaf02d1SJit Loon Lim #define CNF_CT_PAGE_READ 0x2200 67ddaf02d1SJit Loon Lim 68ddaf02d1SJit Loon Lim /* Interrupts enable or disable */ 69*6f7f8b18SGirisha Dengi #define CNF_INT_EN 1U 70*6f7f8b18SGirisha Dengi #define CNF_INT_DIS 0U 71ddaf02d1SJit Loon Lim 72ddaf02d1SJit Loon Lim /* Device types */ 73ddaf02d1SJit Loon Lim #define CNF_DT_UNKNOWN 0x00 74ddaf02d1SJit Loon Lim #define CNF_DT_ONFI 0x01 75ddaf02d1SJit Loon Lim #define CNF_DT_JEDEC 0x02 76ddaf02d1SJit Loon Lim #define CNF_DT_LEGACY 0x03 77ddaf02d1SJit Loon Lim 78ddaf02d1SJit Loon Lim /* Command and status registers */ 79ddaf02d1SJit Loon Lim #define CNF_CMDREG_REG_BASE SOCFPGA_NAND_REG_BASE 80ddaf02d1SJit Loon Lim 81ddaf02d1SJit Loon Lim /* DMA maximum burst size 0-127*/ 82*6f7f8b18SGirisha Dengi #define CNF_DMA_BURST_SIZE_MAX 127U 83ddaf02d1SJit Loon Lim 84ddaf02d1SJit Loon Lim /* DMA settings register field offsets */ 85*6f7f8b18SGirisha Dengi #define CNF_DMA_SETTINGS_BURST 0U 86*6f7f8b18SGirisha Dengi #define CNF_DMA_SETTINGS_OTE 16U 87*6f7f8b18SGirisha Dengi #define CNF_DMA_SETTINGS_SDMA_ER 17U 88ddaf02d1SJit Loon Lim 89*6f7f8b18SGirisha Dengi #define CNF_DMA_MASTER_SEL 1U 90*6f7f8b18SGirisha Dengi #define CNF_DMA_SLAVE_SEL 0U 91ddaf02d1SJit Loon Lim 92ddaf02d1SJit Loon Lim /* DMA FIFO trigger level register field offsets */ 93*6f7f8b18SGirisha Dengi #define CNF_FIFO_TLEVEL_POS 0U 94*6f7f8b18SGirisha Dengi #define CNF_FIFO_TLEVEL_DMA_SIZE 16U 95ddaf02d1SJit Loon Lim #define CNF_DMA_PREFETCH_SIZE (1024 / 8) 96ddaf02d1SJit Loon Lim 97ddaf02d1SJit Loon Lim #define CNF_GET_CTRL_BUSY(x) (x & (1 << 8)) 98ddaf02d1SJit Loon Lim #define CNF_GET_INIT_COMP(x) (x & (1 << 9)) 99ddaf02d1SJit Loon Lim 100ddaf02d1SJit Loon Lim /* Command register0 field offsets */ 101*6f7f8b18SGirisha Dengi #define CNF_CMDREG0_CT 30U 102*6f7f8b18SGirisha Dengi #define CNF_CMDREG0_TRD 24U 103*6f7f8b18SGirisha Dengi #define CNF_CMDREG0_INTR 20U 104*6f7f8b18SGirisha Dengi #define CNF_CMDREG0_DMA 21U 105*6f7f8b18SGirisha Dengi #define CNF_CMDREG0_VOL 16U 106*6f7f8b18SGirisha Dengi #define CNF_CMDREG0_CMD 0U 107*6f7f8b18SGirisha Dengi #define CNF_CMDREG4_MEM 24U 108ddaf02d1SJit Loon Lim 109ddaf02d1SJit Loon Lim /* Command status register field offsets */ 110ddaf02d1SJit Loon Lim #define CNF_ECMD BIT(0) 111ddaf02d1SJit Loon Lim #define CNF_EECC BIT(1) 112ddaf02d1SJit Loon Lim #define CNF_EMAX BIT(2) 113ddaf02d1SJit Loon Lim #define CNF_EDEV BIT(12) 114ddaf02d1SJit Loon Lim #define CNF_EDQS BIT(13) 115ddaf02d1SJit Loon Lim #define CNF_EFAIL BIT(14) 116ddaf02d1SJit Loon Lim #define CNF_CMPLT BIT(15) 117ddaf02d1SJit Loon Lim #define CNF_EBUS BIT(16) 118ddaf02d1SJit Loon Lim #define CNF_EDI BIT(17) 119ddaf02d1SJit Loon Lim #define CNF_EPAR BIT(18) 120ddaf02d1SJit Loon Lim #define CNF_ECTX BIT(19) 121ddaf02d1SJit Loon Lim #define CNF_EPRO BIT(20) 122ddaf02d1SJit Loon Lim #define CNF_EIDX BIT(24) 123ddaf02d1SJit Loon Lim 124ddaf02d1SJit Loon Lim #define CNF_CMDREG_CMD_REG0 0x00 125ddaf02d1SJit Loon Lim #define CNF_CMDREG_CMD_REG1 0x04 126ddaf02d1SJit Loon Lim #define CNF_CMDREG_CMD_REG2 0x08 127ddaf02d1SJit Loon Lim #define CNF_CMDREG_CMD_REG3 0x0C 128ddaf02d1SJit Loon Lim #define CNF_CMDREG_CMD_STAT_PTR 0x10 129ddaf02d1SJit Loon Lim #define CNF_CMDREG_CMD_STAT 0x14 130ddaf02d1SJit Loon Lim #define CNF_CMDREG_CMD_REG4 0x20 131ddaf02d1SJit Loon Lim #define CNF_CMDREG_CTRL_STATUS 0x118 132ddaf02d1SJit Loon Lim #define CNF_CMDREG_TRD_STATUS 0x120 133ddaf02d1SJit Loon Lim 134ddaf02d1SJit Loon Lim #define CNF_CMDREG(_reg) (CNF_CMDREG_REG_BASE \ 135ddaf02d1SJit Loon Lim + (CNF_CMDREG_##_reg)) 136ddaf02d1SJit Loon Lim 137ddaf02d1SJit Loon Lim /* Controller configuration registers */ 138ddaf02d1SJit Loon Lim #define CNF_LSB16_MASK 0xFFFF 139ddaf02d1SJit Loon Lim #define CNF_GET_NPAGES_PER_BLOCK(x) (x & CNF_LSB16_MASK) 140ddaf02d1SJit Loon Lim 141ddaf02d1SJit Loon Lim #define CNF_GET_SCTR_SIZE(x) (x & CNF_LSB16_MASK) 142ddaf02d1SJit Loon Lim #define CNF_GET_LAST_SCTR_SIZE(x) ((x >> 16) & CNF_LSB16_MASK) 143ddaf02d1SJit Loon Lim 144ddaf02d1SJit Loon Lim #define CNF_GET_PAGE_SIZE(x) (x & CNF_LSB16_MASK) 145ddaf02d1SJit Loon Lim #define CNF_GET_SPARE_SIZE(x) ((x >> 16) & CNF_LSB16_MASK) 146ddaf02d1SJit Loon Lim 147ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_REG_BASE 0x10B80400 148ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_TRANS_CFG0 0x00 149ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_TRANS_CFG1 0x04 150ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_LONG_POLL 0x08 151ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_SHORT_POLL 0x0C 152*6f7f8b18SGirisha Dengi #define CNF_CTRLCFG_RDST_CTRL_0 0x10 153ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_DEV_LAYOUT 0x24 154ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_ECC_CFG0 0x28 155ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_ECC_CFG1 0x2C 156ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_MULTIPLANE_CFG 0x34 157ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_CACHE_CFG 0x38 158ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_DMA_SETTINGS 0x3C 159ddaf02d1SJit Loon Lim #define CNF_CTRLCFG_FIFO_TLEVEL 0x54 160ddaf02d1SJit Loon Lim 161*6f7f8b18SGirisha Dengi #define CNF_ECC_EN BIT(0) 162*6f7f8b18SGirisha Dengi #define CNF_ECC_ERASE_DET_EN BIT(1) 163*6f7f8b18SGirisha Dengi #define CNF_ECC_CORR_STR_MASK GENMASK(10, 8) 164*6f7f8b18SGirisha Dengi #define CNF_ECC_CORR_STR 0x02 165*6f7f8b18SGirisha Dengi 166*6f7f8b18SGirisha Dengi #define CNF_ECC_CFG0_VAL ((CNF_ECC_EN) | \ 167*6f7f8b18SGirisha Dengi (CNF_ECC_ERASE_DET_EN) | \ 168*6f7f8b18SGirisha Dengi (FIELD_PREP(CNF_ECC_CORR_STR_MASK, CNF_ECC_CORR_STR))) 169*6f7f8b18SGirisha Dengi 170*6f7f8b18SGirisha Dengi /* Transfer configuration 0 and 1 register settings. */ 171*6f7f8b18SGirisha Dengi #define CNF_SECTOR_CNT 0x04 172*6f7f8b18SGirisha Dengi #define CNF_SECTOR_OFFSET_MASK GENMASK(31, 16) 173*6f7f8b18SGirisha Dengi #define CNF_SECTOR_OFFSET 0x00 174*6f7f8b18SGirisha Dengi 175*6f7f8b18SGirisha Dengi #define CNF_TRANS_CFG0_VAL ((CNF_SECTOR_CNT) | \ 176*6f7f8b18SGirisha Dengi (FIELD_PREP(CNF_SECTOR_OFFSET_MASK, CNF_SECTOR_OFFSET))) 177*6f7f8b18SGirisha Dengi 178*6f7f8b18SGirisha Dengi #define CNF_SECTOR_SIZE 0x0800 179*6f7f8b18SGirisha Dengi #define CNF_LAST_SECTOR_MASK GENMASK(31, 16) 180*6f7f8b18SGirisha Dengi #define CNF_LAST_SECTOR_SIZE 0x0828 181*6f7f8b18SGirisha Dengi 182*6f7f8b18SGirisha Dengi #define CNF_TRANS_CFG1_VAL ((CNF_SECTOR_SIZE) | \ 183*6f7f8b18SGirisha Dengi (FIELD_PREP(CNF_LAST_SECTOR_MASK, CNF_LAST_SECTOR_SIZE))) 184*6f7f8b18SGirisha Dengi 185*6f7f8b18SGirisha Dengi 186ddaf02d1SJit Loon Lim #define CNF_CTRLCFG(_reg) (CNF_CTRLCFG_REG_BASE \ 187ddaf02d1SJit Loon Lim + (CNF_CTRLCFG_##_reg)) 188ddaf02d1SJit Loon Lim 189ddaf02d1SJit Loon Lim /* Data integrity registers */ 190*6f7f8b18SGirisha Dengi #define CNF_DI_PAR_EN 0U 191*6f7f8b18SGirisha Dengi #define CNF_DI_CRC_EN 1U 192ddaf02d1SJit Loon Lim 193ddaf02d1SJit Loon Lim #define CNF_DI_REG_BASE 0x10B80700 194ddaf02d1SJit Loon Lim #define CNF_DI_CONTROL 0x00 195ddaf02d1SJit Loon Lim #define CNF_DI_INJECT0 0x04 196ddaf02d1SJit Loon Lim #define CNF_DI_INJECT1 0x08 197ddaf02d1SJit Loon Lim #define CNF_DI_ERR_REG_ADDR 0x0C 198ddaf02d1SJit Loon Lim #define CNF_DI_INJECT2 0x10 199ddaf02d1SJit Loon Lim 200ddaf02d1SJit Loon Lim #define CNF_DI(_reg) (CNF_DI_REG_BASE \ 201ddaf02d1SJit Loon Lim + (CNF_DI_##_reg)) 202ddaf02d1SJit Loon Lim 203ddaf02d1SJit Loon Lim /* Controller parameter registers */ 204ddaf02d1SJit Loon Lim #define CNF_NTHREADS_MASK 0x07 205ddaf02d1SJit Loon Lim #define CNF_GET_NLUNS(x) (x & 0xFF) 206ddaf02d1SJit Loon Lim #define CNF_GET_DEV_TYPE(x) ((x >> 30) & 0x03) 207ddaf02d1SJit Loon Lim #define CNF_GET_NTHREADS(x) (1 << (x & CNF_NTHREADS_MASK)) 208ddaf02d1SJit Loon Lim 209ddaf02d1SJit Loon Lim #define CNF_CTRLPARAM_REG_BASE 0x10B80800 210ddaf02d1SJit Loon Lim #define CNF_CTRLPARAM_VERSION 0x00 211ddaf02d1SJit Loon Lim #define CNF_CTRLPARAM_FEATURE 0x04 212ddaf02d1SJit Loon Lim #define CNF_CTRLPARAM_MFR_ID 0x08 213ddaf02d1SJit Loon Lim #define CNF_CTRLPARAM_DEV_AREA 0x0C 214ddaf02d1SJit Loon Lim #define CNF_CTRLPARAM_DEV_PARAMS0 0x10 215ddaf02d1SJit Loon Lim #define CNF_CTRLPARAM_DEV_PARAMS1 0x14 216ddaf02d1SJit Loon Lim #define CNF_CTRLPARAM_DEV_FEATUERS 0x18 217ddaf02d1SJit Loon Lim #define CNF_CTRLPARAM_DEV_BLOCKS_PLUN 0x1C 218ddaf02d1SJit Loon Lim 219*6f7f8b18SGirisha Dengi #define CNF_MFR_ID_MASK GENMASK(7, 0) 220*6f7f8b18SGirisha Dengi #define CNF_DEV_ID_MASK GENMASK(23, 16) 221*6f7f8b18SGirisha Dengi 222ddaf02d1SJit Loon Lim #define CNF_CTRLPARAM(_reg) (CNF_CTRLPARAM_REG_BASE \ 223ddaf02d1SJit Loon Lim + (CNF_CTRLPARAM_##_reg)) 224ddaf02d1SJit Loon Lim 225ddaf02d1SJit Loon Lim /* Protection mechanism registers */ 226ddaf02d1SJit Loon Lim #define CNF_PROT_REG_BASE 0x10B80900 227ddaf02d1SJit Loon Lim #define CNF_PROT_CTRL0 0x00 228ddaf02d1SJit Loon Lim #define CNF_PROT_DOWN0 0x04 229ddaf02d1SJit Loon Lim #define CNF_PROT_UP0 0x08 230ddaf02d1SJit Loon Lim #define CNF_PROT_CTRL1 0x10 231ddaf02d1SJit Loon Lim #define CNF_PROT_DOWN1 0x14 232ddaf02d1SJit Loon Lim #define CNF_PROT_UP1 0x18 233ddaf02d1SJit Loon Lim 234ddaf02d1SJit Loon Lim #define CNF_PROT(_reg) (CNF_PROT_REG_BASE \ 235ddaf02d1SJit Loon Lim + (CNF_PROT_##_reg)) 236ddaf02d1SJit Loon Lim 237ddaf02d1SJit Loon Lim /* Mini controller registers */ 238ddaf02d1SJit Loon Lim #define CNF_MINICTRL_REG_BASE 0x10B81000 239ddaf02d1SJit Loon Lim 240ddaf02d1SJit Loon Lim /* Operation work modes */ 241*6f7f8b18SGirisha Dengi #define CNF_OPR_WORK_MODE_SDR 0U 242*6f7f8b18SGirisha Dengi #define CNF_OPR_WORK_MODE_NVDDR 1U 243*6f7f8b18SGirisha Dengi #define CNF_OPR_WORK_MODE_RES 3U 244ddaf02d1SJit Loon Lim 245ddaf02d1SJit Loon Lim /* Mini controller common settings register field offsets */ 246a773f412SGirisha Dengi #define CNF_CMN_SETTINGS_OPR_MASK 0x00000003 247*6f7f8b18SGirisha Dengi #define CNF_CMN_SETTINGS_WR_WUP 20U 248*6f7f8b18SGirisha Dengi #define CNF_CMN_SETTINGS_RD_WUP 16U 249*6f7f8b18SGirisha Dengi #define CNF_CMN_SETTINGS_DEV16 8U 250*6f7f8b18SGirisha Dengi #define CNF_CMN_SETTINGS_OPR 0U 251ddaf02d1SJit Loon Lim 252ddaf02d1SJit Loon Lim /* Async mode register field offsets */ 253*6f7f8b18SGirisha Dengi #define CNF_ASYNC_TIMINGS_TRH 24U 254*6f7f8b18SGirisha Dengi #define CNF_ASYNC_TIMINGS_TRP 16U 255*6f7f8b18SGirisha Dengi #define CNF_ASYNC_TIMINGS_TWH 8U 256*6f7f8b18SGirisha Dengi #define CNF_ASYNC_TIMINGS_TWP 0U 257*6f7f8b18SGirisha Dengi 258*6f7f8b18SGirisha Dengi /* 259*6f7f8b18SGirisha Dengi * The number of clock cycles (nf_clk) the mini controller needs to 260*6f7f8b18SGirisha Dengi * assert/de-assert WE# and assert/de-assert RE# signals in SDR asynchronous mode. 261*6f7f8b18SGirisha Dengi */ 262*6f7f8b18SGirisha Dengi #define CNF_ASYNC_NCLOCK_CYCLES 0x09 263*6f7f8b18SGirisha Dengi #define CNF_ASYNC_TOGGLE_TIMINGS_VAL ((CNF_ASYNC_NCLOCK_CYCLES << CNF_ASYNC_TIMINGS_TRH) | \ 264*6f7f8b18SGirisha Dengi (CNF_ASYNC_NCLOCK_CYCLES << CNF_ASYNC_TIMINGS_TRP) | \ 265*6f7f8b18SGirisha Dengi (CNF_ASYNC_NCLOCK_CYCLES << CNF_ASYNC_TIMINGS_TWH) | \ 266*6f7f8b18SGirisha Dengi (CNF_ASYNC_NCLOCK_CYCLES << CNF_ASYNC_TIMINGS_TWP)) 267*6f7f8b18SGirisha Dengi 268*6f7f8b18SGirisha Dengi /* 269*6f7f8b18SGirisha Dengi * Default value from the datasheet: The number of clock cycles (nf_clk) between 270*6f7f8b18SGirisha Dengi * the de-assertion of the DLL update request and resuming traffic to the PHY. 271*6f7f8b18SGirisha Dengi */ 272*6f7f8b18SGirisha Dengi #define RESYNC_IDLE_CNT 0x07 273*6f7f8b18SGirisha Dengi #define RESYNC_IDLE_CNT_MASK GENMASK(7, 0) 274*6f7f8b18SGirisha Dengi 275*6f7f8b18SGirisha Dengi /* 276*6f7f8b18SGirisha Dengi * Default value from the datasheet: The number of clock cycles (nf_clk) for which 277*6f7f8b18SGirisha Dengi * the DLL update request has to be asserted, to resynchronize the DLLs and read 278*6f7f8b18SGirisha Dengi * and write FIFO pointers. 279*6f7f8b18SGirisha Dengi */ 280*6f7f8b18SGirisha Dengi #define RESYNC_HIGH_CNT 0x07 281*6f7f8b18SGirisha Dengi #define RESYNC_HIGH_CNT_MASK GENMASK(11, 8) 282*6f7f8b18SGirisha Dengi 283*6f7f8b18SGirisha Dengi #define CNF_DLL_PHY_RST_N BIT(24) 284*6f7f8b18SGirisha Dengi #define CNF_DLL_PHY_EXT_WR_MODE BIT(17) 285*6f7f8b18SGirisha Dengi #define CNF_DLL_PHY_EXT_RD_MODE BIT(16) 286*6f7f8b18SGirisha Dengi 287*6f7f8b18SGirisha Dengi #define CNF_DLL_PHY_CTRL_VAL ((CNF_DLL_PHY_RST_N) | \ 288*6f7f8b18SGirisha Dengi (CNF_DLL_PHY_EXT_WR_MODE) | \ 289*6f7f8b18SGirisha Dengi (CNF_DLL_PHY_EXT_RD_MODE) | \ 290*6f7f8b18SGirisha Dengi (FIELD_PREP(RESYNC_IDLE_CNT_MASK, RESYNC_IDLE_CNT)) | \ 291*6f7f8b18SGirisha Dengi (FIELD_PREP(RESYNC_HIGH_CNT_MASK, RESYNC_HIGH_CNT))) 292*6f7f8b18SGirisha Dengi 293*6f7f8b18SGirisha Dengi /* Global timings configurations */ 294*6f7f8b18SGirisha Dengi #define CNF_MINICTRL_TIMINGS0_VAL 0x4f631727 295*6f7f8b18SGirisha Dengi #define CNF_MINICTRL_TIMINGS1_VAL 0x28300063 296*6f7f8b18SGirisha Dengi #define CNF_MINICTRL_TIMINGS2_VAL 0x00c7030d 297ddaf02d1SJit Loon Lim 298ddaf02d1SJit Loon Lim /* Mini controller DLL PHY controller register field offsets */ 299ddaf02d1SJit Loon Lim #define CNF_MINICTRL_WP_SETTINGS 0x00 300ddaf02d1SJit Loon Lim #define CNF_MINICTRL_RBN_SETTINGS 0x04 301ddaf02d1SJit Loon Lim #define CNF_MINICTRL_CMN_SETTINGS 0x08 302ddaf02d1SJit Loon Lim #define CNF_MINICTRL_SKIP_BYTES_CFG 0x0C 303ddaf02d1SJit Loon Lim #define CNF_MINICTRL_SKIP_BYTES_OFFSET 0x10 304ddaf02d1SJit Loon Lim #define CNF_MINICTRL_TOGGLE_TIMINGS0 0x14 305ddaf02d1SJit Loon Lim #define CNF_MINICTRL_TOGGLE_TIMINGS1 0x18 306ddaf02d1SJit Loon Lim #define CNF_MINICTRL_ASYNC_TOGGLE_TIMINGS 0x1C 307ddaf02d1SJit Loon Lim #define CNF_MINICTRL_SYNC_TIMINGS 0x20 308*6f7f8b18SGirisha Dengi #define CNF_MINICTRL_TIMINGS0 0x24 309*6f7f8b18SGirisha Dengi #define CNF_MINICTRL_TIMINGS1 0x28 310*6f7f8b18SGirisha Dengi #define CNF_MINICTRL_TIMINGS2 0x2C 311*6f7f8b18SGirisha Dengi #define CNF_MINICTRL_DLL_PHY_UPDATE_CNT 0x30 312ddaf02d1SJit Loon Lim #define CNF_MINICTRL_DLL_PHY_CTRL 0x34 313ddaf02d1SJit Loon Lim 314*6f7f8b18SGirisha Dengi /* 315*6f7f8b18SGirisha Dengi * Number of bytes to skip from offset of block. 316*6f7f8b18SGirisha Dengi * The bytes are written with the value programmed in the marker field. 317*6f7f8b18SGirisha Dengi */ 318*6f7f8b18SGirisha Dengi #define CNF_NSKIP_BYTES 0x02 319*6f7f8b18SGirisha Dengi #define CNF_MARKER_VAL 0xFFFF 320*6f7f8b18SGirisha Dengi #define CNF_MARKER_MASK GENMASK(31, 16) 321*6f7f8b18SGirisha Dengi #define CNF_SKIP_BYTES_CFG_VAL ((CNF_NSKIP_BYTES) | \ 322*6f7f8b18SGirisha Dengi (FIELD_PREP(CNF_MARKER_MASK, CNF_MARKER_VAL))) 323*6f7f8b18SGirisha Dengi 324*6f7f8b18SGirisha Dengi /* Offset after which the controller starts sending the dummy bytest to the device. */ 325*6f7f8b18SGirisha Dengi #define CNF_SKIP_BYTES_OFFSET_VAL (0x00002000) 326*6f7f8b18SGirisha Dengi 327ddaf02d1SJit Loon Lim #define CNF_MINICTRL(_reg) (CNF_MINICTRL_REG_BASE \ 328ddaf02d1SJit Loon Lim + (CNF_MINICTRL_##_reg)) 329ddaf02d1SJit Loon Lim 330ddaf02d1SJit Loon Lim /* 331ddaf02d1SJit Loon Lim * @brief Nand IO MTD initialization routine 332ddaf02d1SJit Loon Lim * 333ddaf02d1SJit Loon Lim * @total_size: [out] Total size of the NAND flash device 334ddaf02d1SJit Loon Lim * @erase_size: [out] Minimum erase size of the NAND flash device 335ddaf02d1SJit Loon Lim * Return: 0 on success, a negative errno on failure 336ddaf02d1SJit Loon Lim */ 337*6f7f8b18SGirisha Dengi int cdns_nand_init_mtd(unsigned long long *total_size, unsigned int *erase_size); 338ddaf02d1SJit Loon Lim 339ddaf02d1SJit Loon Lim /* 340ddaf02d1SJit Loon Lim * @brief Read bytes from the NAND flash device 341ddaf02d1SJit Loon Lim * 342ddaf02d1SJit Loon Lim * @offset: Byte offset to read from in device 343ddaf02d1SJit Loon Lim * @buffer: [out] Bytes read from device 344ddaf02d1SJit Loon Lim * @length: Number of bytes to read 345ddaf02d1SJit Loon Lim * @out_length: [out] Number of bytes read from device 346ddaf02d1SJit Loon Lim * Return: 0 on success, a negative errno on failure 347ddaf02d1SJit Loon Lim */ 348*6f7f8b18SGirisha Dengi int cdns_nand_read(unsigned int offset, uintptr_t buffer, size_t length, size_t *out_length); 349ddaf02d1SJit Loon Lim 350*6f7f8b18SGirisha Dengi /* 351*6f7f8b18SGirisha Dengi * @brief NAND Flash Controller/Host initialization 352*6f7f8b18SGirisha Dengi * Return: 0 on success, a negative errno on failure 353*6f7f8b18SGirisha Dengi */ 354ddaf02d1SJit Loon Lim int cdns_nand_host_init(void); 355ddaf02d1SJit Loon Lim 356ddaf02d1SJit Loon Lim #endif 357