1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (C) 2016-2017 Rockchip Electronics Co., Ltd 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #ifndef _ASM_ARCH_SDRAM_RK3328_H 8*4882a593Smuzhiyun #define _ASM_ARCH_SDRAM_RK3328_H 9*4882a593Smuzhiyun #include <asm/arch/sdram_common.h> 10*4882a593Smuzhiyun #include <asm/arch/sdram_pctl_px30.h> 11*4882a593Smuzhiyun #include <asm/arch/sdram_phy_px30.h> 12*4882a593Smuzhiyun #include <asm/arch/sdram_phy_ron_rtt_px30.h> 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #define SR_IDLE 93 15*4882a593Smuzhiyun #define PD_IDLE 13 16*4882a593Smuzhiyun #define SDRAM_ADDR 0x00000000 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun /* noc registers define */ 19*4882a593Smuzhiyun #define DDRCONF 0x8 20*4882a593Smuzhiyun #define DDRTIMING 0xc 21*4882a593Smuzhiyun #define DDRMODE 0x10 22*4882a593Smuzhiyun #define READLATENCY 0x14 23*4882a593Smuzhiyun #define AGING0 0x18 24*4882a593Smuzhiyun #define AGING1 0x1c 25*4882a593Smuzhiyun #define AGING2 0x20 26*4882a593Smuzhiyun #define AGING3 0x24 27*4882a593Smuzhiyun #define AGING4 0x28 28*4882a593Smuzhiyun #define AGING5 0x2c 29*4882a593Smuzhiyun #define ACTIVATE 0x38 30*4882a593Smuzhiyun #define DEVTODEV 0x3c 31*4882a593Smuzhiyun #define DDR4TIMING 0x40 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* DDR GRF */ 34*4882a593Smuzhiyun #define DDR_GRF_CON(n) (0 + (n) * 4) 35*4882a593Smuzhiyun #define DDR_GRF_STATUS_BASE (0X100) 36*4882a593Smuzhiyun #define DDR_GRF_STATUS(n) (DDR_GRF_STATUS_BASE + (n) * 4) 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun /* CRU_SOFTRESET_CON5 */ 39*4882a593Smuzhiyun #define ddrphy_psrstn_req(n) (((0x1 << 15) << 16) | ((n) << 15)) 40*4882a593Smuzhiyun #define ddrphy_srstn_req(n) (((0x1 << 14) << 16) | ((n) << 14)) 41*4882a593Smuzhiyun #define ddrctrl_psrstn_req(n) (((0x1 << 13) << 16) | ((n) << 13)) 42*4882a593Smuzhiyun #define ddrctrl_srstn_req(n) (((0x1 << 12) << 16) | ((n) << 12)) 43*4882a593Smuzhiyun #define ddrmsch_srstn_req(n) (((0x1 << 11) << 16) | ((n) << 11)) 44*4882a593Smuzhiyun #define msch_srstn_req(n) (((0x1 << 9) << 16) | ((n) << 9)) 45*4882a593Smuzhiyun #define dfimon_srstn_req(n) (((0x1 << 8) << 16) | ((n) << 8)) 46*4882a593Smuzhiyun #define grf_ddr_srstn_req(n) (((0x1 << 7) << 16) | ((n) << 7)) 47*4882a593Smuzhiyun /* CRU_SOFTRESET_CON9 */ 48*4882a593Smuzhiyun #define ddrctrl_asrstn_req(n) (((0x1 << 9) << 16) | ((n) << 9)) 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun /* CRU register */ 51*4882a593Smuzhiyun #define CRU_PLL_CON(pll_id, n) ((pll_id) * 0x20 + (n) * 4) 52*4882a593Smuzhiyun #define CRU_MODE (0x80) 53*4882a593Smuzhiyun #define CRU_GLB_CNT_TH (0x90) 54*4882a593Smuzhiyun #define CRU_CLKSEL_CON_BASE 0x100 55*4882a593Smuzhiyun #define CRU_CLKSELS_CON(i) (CRU_CLKSEL_CON_BASE + ((i) * 4)) 56*4882a593Smuzhiyun #define CRU_CLKGATE_CON_BASE 0x200 57*4882a593Smuzhiyun #define CRU_CLKGATE_CON(i) (CRU_CLKGATE_CON_BASE + ((i) * 4)) 58*4882a593Smuzhiyun #define CRU_CLKSFTRST_CON_BASE 0x300 59*4882a593Smuzhiyun #define CRU_CLKSFTRST_CON(i) (CRU_CLKSFTRST_CON_BASE + ((i) * 4)) 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun /* CRU_PLL_CON0 */ 62*4882a593Smuzhiyun #define PB(n) ((0x1 << (15 + 16)) | ((n) << 15)) 63*4882a593Smuzhiyun #define POSTDIV1(n) ((0x7 << (12 + 16)) | ((n) << 12)) 64*4882a593Smuzhiyun #define FBDIV(n) ((0xFFF << 16) | (n)) 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* CRU_PLL_CON1 */ 67*4882a593Smuzhiyun #define RSTMODE(n) ((0x1 << (15 + 16)) | ((n) << 15)) 68*4882a593Smuzhiyun #define RST(n) ((0x1 << (14 + 16)) | ((n) << 14)) 69*4882a593Smuzhiyun #define PD(n) ((0x1 << (13 + 16)) | ((n) << 13)) 70*4882a593Smuzhiyun #define DSMPD(n) ((0x1 << (12 + 16)) | ((n) << 12)) 71*4882a593Smuzhiyun #define LOCK(n) (((n) >> 10) & 0x1) 72*4882a593Smuzhiyun #define POSTDIV2(n) ((0x7 << (6 + 16)) | ((n) << 6)) 73*4882a593Smuzhiyun #define REFDIV(n) ((0x3F << 16) | (n)) 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun u16 ddr_cfg_2_rbc[] = { 76*4882a593Smuzhiyun /* 77*4882a593Smuzhiyun * [5:4] row(13+n) 78*4882a593Smuzhiyun * [3] cs(0:0 cs, 1:2 cs) 79*4882a593Smuzhiyun * [2] bank(0:0bank,1:8bank) 80*4882a593Smuzhiyun * [1:0] col(11+n) 81*4882a593Smuzhiyun */ 82*4882a593Smuzhiyun /* row, cs, bank, col */ 83*4882a593Smuzhiyun ((3 << 4) | (0 << 3) | (1 << 2) | 0), 84*4882a593Smuzhiyun ((3 << 4) | (0 << 3) | (1 << 2) | 1), 85*4882a593Smuzhiyun ((2 << 4) | (0 << 3) | (1 << 2) | 2), 86*4882a593Smuzhiyun ((3 << 4) | (0 << 3) | (1 << 2) | 2), 87*4882a593Smuzhiyun ((2 << 4) | (0 << 3) | (1 << 2) | 3), 88*4882a593Smuzhiyun ((3 << 4) | (1 << 3) | (1 << 2) | 0), 89*4882a593Smuzhiyun ((3 << 4) | (1 << 3) | (1 << 2) | 1), 90*4882a593Smuzhiyun ((2 << 4) | (1 << 3) | (1 << 2) | 2), 91*4882a593Smuzhiyun ((3 << 4) | (0 << 3) | (0 << 2) | 1), 92*4882a593Smuzhiyun ((2 << 4) | (0 << 3) | (1 << 2) | 1), 93*4882a593Smuzhiyun }; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun u16 ddr4_cfg_2_rbc[] = { 96*4882a593Smuzhiyun /*************************** 97*4882a593Smuzhiyun * [6] cs 0:0cs 1:2 cs 98*4882a593Smuzhiyun * [5:3] row(13+n) 99*4882a593Smuzhiyun * [2] cs(0:0 cs, 1:2 cs) 100*4882a593Smuzhiyun * [1] bw 0: 16bit 1:32bit 101*4882a593Smuzhiyun * [0] diebw 0:8bit 1:16bit 102*4882a593Smuzhiyun ***************************/ 103*4882a593Smuzhiyun /* cs, row, cs, bw, diebw */ 104*4882a593Smuzhiyun ((0 << 6) | (3 << 3) | (0 << 2) | (1 << 1) | 0), 105*4882a593Smuzhiyun ((1 << 6) | (2 << 3) | (0 << 2) | (1 << 1) | 0), 106*4882a593Smuzhiyun ((0 << 6) | (4 << 3) | (0 << 2) | (0 << 1) | 0), 107*4882a593Smuzhiyun ((1 << 6) | (3 << 3) | (0 << 2) | (0 << 1) | 0), 108*4882a593Smuzhiyun ((0 << 6) | (4 << 3) | (0 << 2) | (1 << 1) | 1), 109*4882a593Smuzhiyun ((1 << 6) | (3 << 3) | (0 << 2) | (1 << 1) | 1), 110*4882a593Smuzhiyun ((1 << 6) | (4 << 3) | (0 << 2) | (0 << 1) | 1), 111*4882a593Smuzhiyun ((0 << 6) | (2 << 3) | (1 << 2) | (1 << 1) | 0), 112*4882a593Smuzhiyun ((0 << 6) | (3 << 3) | (1 << 2) | (0 << 1) | 0), 113*4882a593Smuzhiyun ((0 << 6) | (3 << 3) | (1 << 2) | (1 << 1) | 1), 114*4882a593Smuzhiyun ((0 << 6) | (4 << 3) | (1 << 2) | (0 << 1) | 1), 115*4882a593Smuzhiyun }; 116*4882a593Smuzhiyun 117*4882a593Smuzhiyun u32 addrmap[21][9] = { 118*4882a593Smuzhiyun /* map0 map1 map2 map3 map4 map5 map6 map7 map8 */ 119*4882a593Smuzhiyun {22, 0x00070707, 0x00000000, 0x1f000000, 0x00001f1f, 0x06060606, 120*4882a593Smuzhiyun 0x06060606, 0x00000f0f, 0x3f3f}, 121*4882a593Smuzhiyun {23, 0x00080808, 0x00000000, 0x00000000, 0x00001f1f, 0x07070707, 122*4882a593Smuzhiyun 0x07070707, 0x00000f0f, 0x3f3f}, 123*4882a593Smuzhiyun {23, 0x00090909, 0x00000000, 0x00000000, 0x00001f00, 0x08080808, 124*4882a593Smuzhiyun 0x0f080808, 0x00000f0f, 0x3f3f}, 125*4882a593Smuzhiyun {24, 0x00090909, 0x00000000, 0x00000000, 0x00001f00, 0x08080808, 126*4882a593Smuzhiyun 0x08080808, 0x00000f0f, 0x3f3f}, 127*4882a593Smuzhiyun {24, 0x000a0a0a, 0x00000000, 0x00000000, 0x00000000, 0x09090909, 128*4882a593Smuzhiyun 0x0f090909, 0x00000f0f, 0x3f3f}, 129*4882a593Smuzhiyun {6, 0x00070707, 0x00000000, 0x1f000000, 0x00001f1f, 0x07070707, 130*4882a593Smuzhiyun 0x07070707, 0x00000f0f, 0x3f3f}, 131*4882a593Smuzhiyun {7, 0x00080808, 0x00000000, 0x00000000, 0x00001f1f, 0x08080808, 132*4882a593Smuzhiyun 0x08080808, 0x00000f0f, 0x3f3f}, 133*4882a593Smuzhiyun {8, 0x00090909, 0x00000000, 0x00000000, 0x00001f00, 0x09090909, 134*4882a593Smuzhiyun 0x0f090909, 0x00000f0f, 0x3f3f}, 135*4882a593Smuzhiyun {22, 0x001f0808, 0x00000000, 0x00000000, 0x00001f1f, 0x06060606, 136*4882a593Smuzhiyun 0x06060606, 0x00000f0f, 0x3f3f}, 137*4882a593Smuzhiyun {23, 0x00080808, 0x00000000, 0x00000000, 0x00001f1f, 0x07070707, 138*4882a593Smuzhiyun 0x0f070707, 0x00000f0f, 0x3f3f}, 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun {24, 0x003f0a0a, 0x01010100, 0x01010101, 0x00001f1f, 0x08080808, 141*4882a593Smuzhiyun 0x08080808, 0x00000f0f, 0x0801}, 142*4882a593Smuzhiyun {23, 0x003f0a0a, 0x01010100, 0x01010101, 0x00001f1f, 0x08080808, 143*4882a593Smuzhiyun 0x0f080808, 0x00000f0f, 0x0801}, 144*4882a593Smuzhiyun {24, 0x003f0909, 0x00000007, 0x1f000000, 0x00001f1f, 0x07070707, 145*4882a593Smuzhiyun 0x07070707, 0x00000f07, 0x0700}, 146*4882a593Smuzhiyun {23, 0x003f0909, 0x00000007, 0x1f000000, 0x00001f1f, 0x07070707, 147*4882a593Smuzhiyun 0x07070707, 0x00000f0f, 0x0700}, 148*4882a593Smuzhiyun {24, 0x003f0909, 0x01010100, 0x01010101, 0x00001f1f, 0x07070707, 149*4882a593Smuzhiyun 0x07070707, 0x00000f07, 0x3f01}, 150*4882a593Smuzhiyun {23, 0x003f0909, 0x01010100, 0x01010101, 0x00001f1f, 0x07070707, 151*4882a593Smuzhiyun 0x07070707, 0x00000f0f, 0x3f01}, 152*4882a593Smuzhiyun {24, 0x003f0808, 0x00000007, 0x1f000000, 0x00001f1f, 0x06060606, 153*4882a593Smuzhiyun 0x06060606, 0x00000f06, 0x3f00}, 154*4882a593Smuzhiyun {8, 0x003f0a0a, 0x01010100, 0x01010101, 0x00001f1f, 0x09090909, 155*4882a593Smuzhiyun 0x0f090909, 0x00000f0f, 0x0801}, 156*4882a593Smuzhiyun {7, 0x003f0909, 0x00000007, 0x1f000000, 0x00001f1f, 0x08080808, 157*4882a593Smuzhiyun 0x08080808, 0x00000f0f, 0x0700}, 158*4882a593Smuzhiyun {7, 0x003f0909, 0x01010100, 0x01010101, 0x00001f1f, 0x08080808, 159*4882a593Smuzhiyun 0x08080808, 0x00000f0f, 0x3f01}, 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun {6, 0x003f0808, 0x00000007, 0x1f000000, 0x00001f1f, 0x07070707, 162*4882a593Smuzhiyun 0x07070707, 0x00000f07, 0x3f00} 163*4882a593Smuzhiyun }; 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun struct rk3328_ddr_grf_regs { 166*4882a593Smuzhiyun u32 ddr_grf_con[4]; 167*4882a593Smuzhiyun u32 reserved[(0x100 - 0x10) / 4]; 168*4882a593Smuzhiyun u32 ddr_grf_status[11]; 169*4882a593Smuzhiyun }; 170*4882a593Smuzhiyun 171*4882a593Smuzhiyun union noc_ddrtiming { 172*4882a593Smuzhiyun u32 d32; 173*4882a593Smuzhiyun struct { 174*4882a593Smuzhiyun unsigned acttoact:6; 175*4882a593Smuzhiyun unsigned rdtomiss:6; 176*4882a593Smuzhiyun unsigned wrtomiss:6; 177*4882a593Smuzhiyun unsigned burstlen:3; 178*4882a593Smuzhiyun unsigned rdtowr:5; 179*4882a593Smuzhiyun unsigned wrtord:5; 180*4882a593Smuzhiyun unsigned bwratio:1; 181*4882a593Smuzhiyun } b; 182*4882a593Smuzhiyun }; 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun union noc_activate { 185*4882a593Smuzhiyun u32 d32; 186*4882a593Smuzhiyun struct { 187*4882a593Smuzhiyun unsigned rrd:4; 188*4882a593Smuzhiyun unsigned faw:6; 189*4882a593Smuzhiyun unsigned fawbank:1; 190*4882a593Smuzhiyun unsigned reserved1:21; 191*4882a593Smuzhiyun } b; 192*4882a593Smuzhiyun }; 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun union noc_devtodev { 195*4882a593Smuzhiyun u32 d32; 196*4882a593Smuzhiyun struct { 197*4882a593Smuzhiyun unsigned busrdtord:2; 198*4882a593Smuzhiyun unsigned busrdtowr:2; 199*4882a593Smuzhiyun unsigned buswrtord:2; 200*4882a593Smuzhiyun unsigned reserved2:26; 201*4882a593Smuzhiyun } b; 202*4882a593Smuzhiyun }; 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun union noc_ddr4timing { 205*4882a593Smuzhiyun u32 d32; 206*4882a593Smuzhiyun struct { 207*4882a593Smuzhiyun unsigned ccdl:3; 208*4882a593Smuzhiyun unsigned wrtordl:5; 209*4882a593Smuzhiyun unsigned rrdl:4; 210*4882a593Smuzhiyun unsigned reserved2:20; 211*4882a593Smuzhiyun } b; 212*4882a593Smuzhiyun }; 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun union noc_ddrmode { 215*4882a593Smuzhiyun u32 d32; 216*4882a593Smuzhiyun struct { 217*4882a593Smuzhiyun unsigned autoprecharge:1; 218*4882a593Smuzhiyun unsigned bwratioextended:1; 219*4882a593Smuzhiyun unsigned reserved3:30; 220*4882a593Smuzhiyun } b; 221*4882a593Smuzhiyun }; 222*4882a593Smuzhiyun 223*4882a593Smuzhiyun struct msch_regs { 224*4882a593Smuzhiyun u32 coreid; 225*4882a593Smuzhiyun u32 revisionid; 226*4882a593Smuzhiyun u32 ddrconf; 227*4882a593Smuzhiyun u32 ddrtiming; 228*4882a593Smuzhiyun u32 ddrmode; 229*4882a593Smuzhiyun u32 readlatency; 230*4882a593Smuzhiyun u32 aging0; 231*4882a593Smuzhiyun u32 aging1; 232*4882a593Smuzhiyun u32 aging2; 233*4882a593Smuzhiyun u32 aging3; 234*4882a593Smuzhiyun u32 aging4; 235*4882a593Smuzhiyun u32 aging5; 236*4882a593Smuzhiyun u32 reserved[2]; 237*4882a593Smuzhiyun u32 activate; 238*4882a593Smuzhiyun u32 devtodev; 239*4882a593Smuzhiyun u32 ddr4_timing; 240*4882a593Smuzhiyun }; 241*4882a593Smuzhiyun 242*4882a593Smuzhiyun struct sdram_msch_timings { 243*4882a593Smuzhiyun union noc_ddrtiming ddrtiming; 244*4882a593Smuzhiyun union noc_ddrmode ddrmode; 245*4882a593Smuzhiyun u32 readlatency; 246*4882a593Smuzhiyun union noc_activate activate; 247*4882a593Smuzhiyun union noc_devtodev devtodev; 248*4882a593Smuzhiyun union noc_ddr4timing ddr4timing; 249*4882a593Smuzhiyun u32 agingx0; 250*4882a593Smuzhiyun }; 251*4882a593Smuzhiyun 252*4882a593Smuzhiyun struct rk3328_sdram_channel { 253*4882a593Smuzhiyun struct sdram_cap_info cap_info; 254*4882a593Smuzhiyun struct sdram_msch_timings noc_timings; 255*4882a593Smuzhiyun }; 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun struct rk3328_sdram_params { 258*4882a593Smuzhiyun struct rk3328_sdram_channel ch; 259*4882a593Smuzhiyun struct sdram_base_params base; 260*4882a593Smuzhiyun struct ddr_pctl_regs pctl_regs; 261*4882a593Smuzhiyun struct ddr_phy_regs phy_regs; 262*4882a593Smuzhiyun struct ddr_phy_skew skew; 263*4882a593Smuzhiyun }; 264*4882a593Smuzhiyun 265*4882a593Smuzhiyun #endif 266