1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Error Corrected Code Controller (ECC) - System peripherals regsters. 3*4882a593Smuzhiyun * Based on AT91SAM9260 datasheet revision B. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef ATMEL_NAND_ECC_H 9*4882a593Smuzhiyun #define ATMEL_NAND_ECC_H 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #define ATMEL_ECC_CR 0x00 /* Control register */ 12*4882a593Smuzhiyun #define ATMEL_ECC_RST (1 << 0) /* Reset parity */ 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #define ATMEL_ECC_MR 0x04 /* Mode register */ 15*4882a593Smuzhiyun #define ATMEL_ECC_PAGESIZE (3 << 0) /* Page Size */ 16*4882a593Smuzhiyun #define ATMEL_ECC_PAGESIZE_528 (0) 17*4882a593Smuzhiyun #define ATMEL_ECC_PAGESIZE_1056 (1) 18*4882a593Smuzhiyun #define ATMEL_ECC_PAGESIZE_2112 (2) 19*4882a593Smuzhiyun #define ATMEL_ECC_PAGESIZE_4224 (3) 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #define ATMEL_ECC_SR 0x08 /* Status register */ 22*4882a593Smuzhiyun #define ATMEL_ECC_RECERR (1 << 0) /* Recoverable Error */ 23*4882a593Smuzhiyun #define ATMEL_ECC_ECCERR (1 << 1) /* ECC Single Bit Error */ 24*4882a593Smuzhiyun #define ATMEL_ECC_MULERR (1 << 2) /* Multiple Errors */ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #define ATMEL_ECC_PR 0x0c /* Parity register */ 27*4882a593Smuzhiyun #define ATMEL_ECC_BITADDR (0xf << 0) /* Bit Error Address */ 28*4882a593Smuzhiyun #define ATMEL_ECC_WORDADDR (0xfff << 4) /* Word Error Address */ 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun #define ATMEL_ECC_NPR 0x10 /* NParity register */ 31*4882a593Smuzhiyun #define ATMEL_ECC_NPARITY (0xffff << 0) /* NParity */ 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* Register access macros for PMECC */ 34*4882a593Smuzhiyun #define pmecc_readl(addr, reg) \ 35*4882a593Smuzhiyun readl(&addr->reg) 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define pmecc_readb(addr, reg) \ 38*4882a593Smuzhiyun readb(&addr->reg) 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun #define pmecc_writel(addr, reg, value) \ 41*4882a593Smuzhiyun writel((value), &addr->reg) 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun /* PMECC Register Definitions */ 44*4882a593Smuzhiyun #define PMECC_MAX_SECTOR_NUM 8 45*4882a593Smuzhiyun struct pmecc_regs { 46*4882a593Smuzhiyun u32 cfg; /* 0x00 PMECC Configuration Register */ 47*4882a593Smuzhiyun u32 sarea; /* 0x04 PMECC Spare Area Size Register */ 48*4882a593Smuzhiyun u32 saddr; /* 0x08 PMECC Start Address Register */ 49*4882a593Smuzhiyun u32 eaddr; /* 0x0C PMECC End Address Register */ 50*4882a593Smuzhiyun u32 clk; /* 0x10 PMECC Clock Control Register */ 51*4882a593Smuzhiyun u32 ctrl; /* 0x14 PMECC Control Register */ 52*4882a593Smuzhiyun u32 sr; /* 0x18 PMECC Status Register */ 53*4882a593Smuzhiyun u32 ier; /* 0x1C PMECC Interrupt Enable Register */ 54*4882a593Smuzhiyun u32 idr; /* 0x20 PMECC Interrupt Disable Register */ 55*4882a593Smuzhiyun u32 imr; /* 0x24 PMECC Interrupt Mask Register */ 56*4882a593Smuzhiyun u32 isr; /* 0x28 PMECC Interrupt Status Register */ 57*4882a593Smuzhiyun u32 reserved0[5]; /* 0x2C-0x3C Reserved */ 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun /* 0x40 + sector_num * (0x40), Redundancy Registers */ 60*4882a593Smuzhiyun struct { 61*4882a593Smuzhiyun #ifdef CONFIG_SAMA5D2 62*4882a593Smuzhiyun u8 ecc[56]; /* PMECC Generated Redundancy Byte Per Sector */ 63*4882a593Smuzhiyun u32 reserved1[2]; 64*4882a593Smuzhiyun #else 65*4882a593Smuzhiyun u8 ecc[44]; /* PMECC Generated Redundancy Byte Per Sector */ 66*4882a593Smuzhiyun u32 reserved1[5]; 67*4882a593Smuzhiyun #endif 68*4882a593Smuzhiyun } ecc_port[PMECC_MAX_SECTOR_NUM]; 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun /* 0x240 + sector_num * (0x40) Remainder Registers */ 71*4882a593Smuzhiyun struct { 72*4882a593Smuzhiyun #ifdef CONFIG_SAMA5D2 73*4882a593Smuzhiyun u32 rem[16]; 74*4882a593Smuzhiyun #else 75*4882a593Smuzhiyun u32 rem[12]; 76*4882a593Smuzhiyun u32 reserved2[4]; 77*4882a593Smuzhiyun #endif 78*4882a593Smuzhiyun } rem_port[PMECC_MAX_SECTOR_NUM]; 79*4882a593Smuzhiyun u32 reserved3[16]; /* 0x440-0x47C Reserved */ 80*4882a593Smuzhiyun }; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun /* For PMECC Configuration Register */ 83*4882a593Smuzhiyun #define PMECC_CFG_BCH_ERR2 (0 << 0) 84*4882a593Smuzhiyun #define PMECC_CFG_BCH_ERR4 (1 << 0) 85*4882a593Smuzhiyun #define PMECC_CFG_BCH_ERR8 (2 << 0) 86*4882a593Smuzhiyun #define PMECC_CFG_BCH_ERR12 (3 << 0) 87*4882a593Smuzhiyun #define PMECC_CFG_BCH_ERR24 (4 << 0) 88*4882a593Smuzhiyun #define PMECC_CFG_BCH_ERR32 (5 << 0) 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun #define PMECC_CFG_SECTOR512 (0 << 4) 91*4882a593Smuzhiyun #define PMECC_CFG_SECTOR1024 (1 << 4) 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun #define PMECC_CFG_PAGE_1SECTOR (0 << 8) 94*4882a593Smuzhiyun #define PMECC_CFG_PAGE_2SECTORS (1 << 8) 95*4882a593Smuzhiyun #define PMECC_CFG_PAGE_4SECTORS (2 << 8) 96*4882a593Smuzhiyun #define PMECC_CFG_PAGE_8SECTORS (3 << 8) 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun #define PMECC_CFG_READ_OP (0 << 12) 99*4882a593Smuzhiyun #define PMECC_CFG_WRITE_OP (1 << 12) 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun #define PMECC_CFG_SPARE_ENABLE (1 << 16) 102*4882a593Smuzhiyun #define PMECC_CFG_SPARE_DISABLE (0 << 16) 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun #define PMECC_CFG_AUTO_ENABLE (1 << 20) 105*4882a593Smuzhiyun #define PMECC_CFG_AUTO_DISABLE (0 << 20) 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun /* For PMECC Clock Control Register */ 108*4882a593Smuzhiyun #define PMECC_CLK_133MHZ (2 << 0) 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun /* For PMECC Control Register */ 111*4882a593Smuzhiyun #define PMECC_CTRL_RST (1 << 0) 112*4882a593Smuzhiyun #define PMECC_CTRL_DATA (1 << 1) 113*4882a593Smuzhiyun #define PMECC_CTRL_USER (1 << 2) 114*4882a593Smuzhiyun #define PMECC_CTRL_ENABLE (1 << 4) 115*4882a593Smuzhiyun #define PMECC_CTRL_DISABLE (1 << 5) 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun /* For PMECC Status Register */ 118*4882a593Smuzhiyun #define PMECC_SR_BUSY (1 << 0) 119*4882a593Smuzhiyun #define PMECC_SR_ENABLE (1 << 4) 120*4882a593Smuzhiyun 121*4882a593Smuzhiyun /* PMERRLOC Register Definitions */ 122*4882a593Smuzhiyun struct pmecc_errloc_regs { 123*4882a593Smuzhiyun u32 elcfg; /* 0x00 Error Location Configuration Register */ 124*4882a593Smuzhiyun u32 elprim; /* 0x04 Error Location Primitive Register */ 125*4882a593Smuzhiyun u32 elen; /* 0x08 Error Location Enable Register */ 126*4882a593Smuzhiyun u32 eldis; /* 0x0C Error Location Disable Register */ 127*4882a593Smuzhiyun u32 elsr; /* 0x10 Error Location Status Register */ 128*4882a593Smuzhiyun u32 elier; /* 0x14 Error Location Interrupt Enable Register */ 129*4882a593Smuzhiyun u32 elidr; /* 0x08 Error Location Interrupt Disable Register */ 130*4882a593Smuzhiyun u32 elimr; /* 0x0C Error Location Interrupt Mask Register */ 131*4882a593Smuzhiyun u32 elisr; /* 0x20 Error Location Interrupt Status Register */ 132*4882a593Smuzhiyun u32 reserved0; /* 0x24 Reserved */ 133*4882a593Smuzhiyun #ifdef CONFIG_SAMA5D2 134*4882a593Smuzhiyun u32 sigma[33]; /* 0x28-0xA8 Error Location Sigma Registers */ 135*4882a593Smuzhiyun u32 el[32]; /* 0xAC-0x128 Error Location Registers */ 136*4882a593Smuzhiyun 137*4882a593Smuzhiyun /* 138*4882a593Smuzhiyun * 0x12C-0x1FC: 139*4882a593Smuzhiyun * Reserved for SAMA5D2. 140*4882a593Smuzhiyun */ 141*4882a593Smuzhiyun u32 reserved1[53]; 142*4882a593Smuzhiyun #else 143*4882a593Smuzhiyun u32 sigma[25]; /* 0x28-0x88 Error Location Sigma Registers */ 144*4882a593Smuzhiyun u32 el[24]; /* 0x8C-0xE8 Error Location Registers */ 145*4882a593Smuzhiyun u32 reserved1[5]; /* 0xEC-0xFC Reserved */ 146*4882a593Smuzhiyun #endif 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun /* 149*4882a593Smuzhiyun * SAMA5 chip HSMC registers start here. But for 9X5 chip it is just 150*4882a593Smuzhiyun * reserved. 151*4882a593Smuzhiyun * 152*4882a593Smuzhiyun * Offset 0x00-0xF8: 153*4882a593Smuzhiyun */ 154*4882a593Smuzhiyun u32 reserved2[63]; 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun /* 157*4882a593Smuzhiyun * Offset 0xFC: 158*4882a593Smuzhiyun * PMECC version for AT91SAM9X5, AT91SAM9N12. 159*4882a593Smuzhiyun * HSMC version for SAMA5D3, SAMA5D4. Can refer as PMECC version. 160*4882a593Smuzhiyun */ 161*4882a593Smuzhiyun u32 version; 162*4882a593Smuzhiyun }; 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun /* For Error Location Configuration Register */ 165*4882a593Smuzhiyun #define PMERRLOC_ELCFG_SECTOR_512 (0 << 0) 166*4882a593Smuzhiyun #define PMERRLOC_ELCFG_SECTOR_1024 (1 << 0) 167*4882a593Smuzhiyun #define PMERRLOC_ELCFG_NUM_ERRORS(n) ((n) << 16) 168*4882a593Smuzhiyun 169*4882a593Smuzhiyun /* For Error Location Disable Register */ 170*4882a593Smuzhiyun #define PMERRLOC_DISABLE (1 << 0) 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun /* For Error Location Interrupt Status Register */ 173*4882a593Smuzhiyun #ifdef CONFIG_SAMA5D2 174*4882a593Smuzhiyun #define PMERRLOC_ERR_NUM_MASK (0x3f << 8) 175*4882a593Smuzhiyun #else 176*4882a593Smuzhiyun #define PMERRLOC_ERR_NUM_MASK (0x1f << 8) 177*4882a593Smuzhiyun #endif 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun #define PMERRLOC_CALC_DONE (1 << 0) 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun /* PMECC IP version */ 182*4882a593Smuzhiyun #define PMECC_VERSION_SAMA5D2 0x210 183*4882a593Smuzhiyun #define PMECC_VERSION_SAMA5D4 0x113 184*4882a593Smuzhiyun #define PMECC_VERSION_SAMA5D3 0x112 185*4882a593Smuzhiyun #define PMECC_VERSION_AT91SAM9N12 0x102 186*4882a593Smuzhiyun #define PMECC_VERSION_AT91SAM9X5 0x101 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun /* Galois field dimension */ 189*4882a593Smuzhiyun #define PMECC_GF_DIMENSION_13 13 190*4882a593Smuzhiyun #define PMECC_GF_DIMENSION_14 14 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun /* Primitive Polynomial used by PMECC */ 193*4882a593Smuzhiyun #define PMECC_GF_13_PRIMITIVE_POLY 0x201b 194*4882a593Smuzhiyun #define PMECC_GF_14_PRIMITIVE_POLY 0x4443 195*4882a593Smuzhiyun 196*4882a593Smuzhiyun #define PMECC_INDEX_TABLE_SIZE_512 0x2000 197*4882a593Smuzhiyun #define PMECC_INDEX_TABLE_SIZE_1024 0x4000 198*4882a593Smuzhiyun 199*4882a593Smuzhiyun #define PMECC_MAX_TIMEOUT_US (100 * 1000) 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun /* Reserved bytes in oob area */ 202*4882a593Smuzhiyun #define PMECC_OOB_RESERVED_BYTES 2 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun #endif 205