1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * (C) Copyright 2015 Rockchip Electronics Co., Ltd 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun #ifndef _ASM_ARCH_SDRAM_RK3036_H 7*4882a593Smuzhiyun #define _ASM_ARCH_SDRAM_RK3036_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <common.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun struct rk3036_ddr_pctl { 12*4882a593Smuzhiyun u32 scfg; 13*4882a593Smuzhiyun u32 sctl; 14*4882a593Smuzhiyun u32 stat; 15*4882a593Smuzhiyun u32 intrstat; 16*4882a593Smuzhiyun u32 reserved0[12]; 17*4882a593Smuzhiyun u32 mcmd; 18*4882a593Smuzhiyun u32 powctl; 19*4882a593Smuzhiyun u32 powstat; 20*4882a593Smuzhiyun u32 cmdtstat; 21*4882a593Smuzhiyun u32 cmdtstaten; 22*4882a593Smuzhiyun u32 reserved1[3]; 23*4882a593Smuzhiyun u32 mrrcfg0; 24*4882a593Smuzhiyun u32 mrrstat0; 25*4882a593Smuzhiyun u32 mrrstat1; 26*4882a593Smuzhiyun u32 reserved2[4]; 27*4882a593Smuzhiyun u32 mcfg1; 28*4882a593Smuzhiyun u32 mcfg; 29*4882a593Smuzhiyun u32 ppcfg; 30*4882a593Smuzhiyun u32 mstat; 31*4882a593Smuzhiyun u32 lpddr2zqcfg; 32*4882a593Smuzhiyun u32 reserved3; 33*4882a593Smuzhiyun u32 dtupdes; 34*4882a593Smuzhiyun u32 dtuna; 35*4882a593Smuzhiyun u32 dtune; 36*4882a593Smuzhiyun u32 dtuprd0; 37*4882a593Smuzhiyun u32 dtuprd1; 38*4882a593Smuzhiyun u32 dtuprd2; 39*4882a593Smuzhiyun u32 dtuprd3; 40*4882a593Smuzhiyun u32 dtuawdt; 41*4882a593Smuzhiyun u32 reserved4[3]; 42*4882a593Smuzhiyun u32 togcnt1u; 43*4882a593Smuzhiyun u32 tinit; 44*4882a593Smuzhiyun u32 trsth; 45*4882a593Smuzhiyun u32 togcnt100n; 46*4882a593Smuzhiyun u32 trefi; 47*4882a593Smuzhiyun u32 tmrd; 48*4882a593Smuzhiyun u32 trfc; 49*4882a593Smuzhiyun u32 trp; 50*4882a593Smuzhiyun u32 trtw; 51*4882a593Smuzhiyun u32 tal; 52*4882a593Smuzhiyun u32 tcl; 53*4882a593Smuzhiyun u32 tcwl; 54*4882a593Smuzhiyun u32 tras; 55*4882a593Smuzhiyun u32 trc; 56*4882a593Smuzhiyun u32 trcd; 57*4882a593Smuzhiyun u32 trrd; 58*4882a593Smuzhiyun u32 trtp; 59*4882a593Smuzhiyun u32 twr; 60*4882a593Smuzhiyun u32 twtr; 61*4882a593Smuzhiyun u32 texsr; 62*4882a593Smuzhiyun u32 txp; 63*4882a593Smuzhiyun u32 txpdll; 64*4882a593Smuzhiyun u32 tzqcs; 65*4882a593Smuzhiyun u32 tzqcsi; 66*4882a593Smuzhiyun u32 tdqs; 67*4882a593Smuzhiyun u32 tcksre; 68*4882a593Smuzhiyun u32 tcksrx; 69*4882a593Smuzhiyun u32 tcke; 70*4882a593Smuzhiyun u32 tmod; 71*4882a593Smuzhiyun u32 trstl; 72*4882a593Smuzhiyun u32 tzqcl; 73*4882a593Smuzhiyun u32 tmrr; 74*4882a593Smuzhiyun u32 tckesr; 75*4882a593Smuzhiyun u32 reserved5[47]; 76*4882a593Smuzhiyun u32 dtuwactl; 77*4882a593Smuzhiyun u32 dturactl; 78*4882a593Smuzhiyun u32 dtucfg; 79*4882a593Smuzhiyun u32 dtuectl; 80*4882a593Smuzhiyun u32 dtuwd0; 81*4882a593Smuzhiyun u32 dtuwd1; 82*4882a593Smuzhiyun u32 dtuwd2; 83*4882a593Smuzhiyun u32 dtuwd3; 84*4882a593Smuzhiyun u32 dtuwdm; 85*4882a593Smuzhiyun u32 dturd0; 86*4882a593Smuzhiyun u32 dturd1; 87*4882a593Smuzhiyun u32 dturd2; 88*4882a593Smuzhiyun u32 dturd3; 89*4882a593Smuzhiyun u32 dtulfsrwd; 90*4882a593Smuzhiyun u32 dtulfsrrd; 91*4882a593Smuzhiyun u32 dtueaf; 92*4882a593Smuzhiyun u32 dfitctrldelay; 93*4882a593Smuzhiyun u32 dfiodtcfg; 94*4882a593Smuzhiyun u32 dfiodtcfg1; 95*4882a593Smuzhiyun u32 dfiodtrankmap; 96*4882a593Smuzhiyun u32 dfitphywrdata; 97*4882a593Smuzhiyun u32 dfitphywrlat; 98*4882a593Smuzhiyun u32 reserved7[2]; 99*4882a593Smuzhiyun u32 dfitrddataen; 100*4882a593Smuzhiyun u32 dfitphyrdlat; 101*4882a593Smuzhiyun u32 reserved8[2]; 102*4882a593Smuzhiyun u32 dfitphyupdtype0; 103*4882a593Smuzhiyun u32 dfitphyupdtype1; 104*4882a593Smuzhiyun u32 dfitphyupdtype2; 105*4882a593Smuzhiyun u32 dfitphyupdtype3; 106*4882a593Smuzhiyun u32 dfitctrlupdmin; 107*4882a593Smuzhiyun u32 dfitctrlupdmax; 108*4882a593Smuzhiyun u32 dfitctrlupddly; 109*4882a593Smuzhiyun u32 reserved9; 110*4882a593Smuzhiyun u32 dfiupdcfg; 111*4882a593Smuzhiyun u32 dfitrefmski; 112*4882a593Smuzhiyun u32 dfitctrlupdi; 113*4882a593Smuzhiyun u32 reserved10[4]; 114*4882a593Smuzhiyun u32 dfitrcfg0; 115*4882a593Smuzhiyun u32 dfitrstat0; 116*4882a593Smuzhiyun u32 dfitrwrlvlen; 117*4882a593Smuzhiyun u32 dfitrrdlvlen; 118*4882a593Smuzhiyun u32 dfitrrdlvlgateen; 119*4882a593Smuzhiyun u32 dfiststat0; 120*4882a593Smuzhiyun u32 dfistcfg0; 121*4882a593Smuzhiyun u32 dfistcfg1; 122*4882a593Smuzhiyun u32 reserved11; 123*4882a593Smuzhiyun u32 dfitdramclken; 124*4882a593Smuzhiyun u32 dfitdramclkdis; 125*4882a593Smuzhiyun u32 dfistcfg2; 126*4882a593Smuzhiyun u32 dfistparclr; 127*4882a593Smuzhiyun u32 dfistparlog; 128*4882a593Smuzhiyun u32 reserved12[3]; 129*4882a593Smuzhiyun u32 dfilpcfg0; 130*4882a593Smuzhiyun u32 reserved13[3]; 131*4882a593Smuzhiyun u32 dfitrwrlvlresp0; 132*4882a593Smuzhiyun u32 dfitrwrlvlresp1; 133*4882a593Smuzhiyun u32 dfitrwrlvlresp2; 134*4882a593Smuzhiyun u32 dfitrrdlvlresp0; 135*4882a593Smuzhiyun u32 dfitrrdlvlresp1; 136*4882a593Smuzhiyun u32 dfitrrdlvlresp2; 137*4882a593Smuzhiyun u32 dfitrwrlvldelay0; 138*4882a593Smuzhiyun u32 dfitrwrlvldelay1; 139*4882a593Smuzhiyun u32 dfitrwrlvldelay2; 140*4882a593Smuzhiyun u32 dfitrrdlvldelay0; 141*4882a593Smuzhiyun u32 dfitrrdlvldelay1; 142*4882a593Smuzhiyun u32 dfitrrdlvldelay2; 143*4882a593Smuzhiyun u32 dfitrrdlvlgatedelay0; 144*4882a593Smuzhiyun u32 dfitrrdlvlgatedelay1; 145*4882a593Smuzhiyun u32 dfitrrdlvlgatedelay2; 146*4882a593Smuzhiyun u32 dfitrcmd; 147*4882a593Smuzhiyun u32 reserved14[46]; 148*4882a593Smuzhiyun u32 ipvr; 149*4882a593Smuzhiyun u32 iptr; 150*4882a593Smuzhiyun }; 151*4882a593Smuzhiyun check_member(rk3036_ddr_pctl, iptr, 0x03fc); 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun struct rk3036_ddr_phy { 154*4882a593Smuzhiyun u32 ddrphy_reg1; 155*4882a593Smuzhiyun u32 ddrphy_reg3; 156*4882a593Smuzhiyun u32 ddrphy_reg2; 157*4882a593Smuzhiyun u32 reserve[11]; 158*4882a593Smuzhiyun u32 ddrphy_reg4a; 159*4882a593Smuzhiyun u32 ddrphy_reg4b; 160*4882a593Smuzhiyun u32 reserve1[5]; 161*4882a593Smuzhiyun u32 ddrphy_reg16; 162*4882a593Smuzhiyun u32 reserve2; 163*4882a593Smuzhiyun u32 ddrphy_reg18; 164*4882a593Smuzhiyun u32 ddrphy_reg19; 165*4882a593Smuzhiyun u32 reserve3; 166*4882a593Smuzhiyun u32 ddrphy_reg21; 167*4882a593Smuzhiyun u32 reserve4; 168*4882a593Smuzhiyun u32 ddrphy_reg22; 169*4882a593Smuzhiyun u32 reserve5[3]; 170*4882a593Smuzhiyun u32 ddrphy_reg25; 171*4882a593Smuzhiyun u32 ddrphy_reg26; 172*4882a593Smuzhiyun u32 ddrphy_reg27; 173*4882a593Smuzhiyun u32 ddrphy_reg28; 174*4882a593Smuzhiyun u32 reserve6[17]; 175*4882a593Smuzhiyun u32 ddrphy_reg6; 176*4882a593Smuzhiyun u32 ddrphy_reg7; 177*4882a593Smuzhiyun u32 reserve7; 178*4882a593Smuzhiyun u32 ddrphy_reg8; 179*4882a593Smuzhiyun u32 ddrphy_reg0e4; 180*4882a593Smuzhiyun u32 reserve8[11]; 181*4882a593Smuzhiyun u32 ddrphy_reg9; 182*4882a593Smuzhiyun u32 ddrphy_reg10; 183*4882a593Smuzhiyun u32 reserve9; 184*4882a593Smuzhiyun u32 ddrphy_reg11; 185*4882a593Smuzhiyun u32 ddrphy_reg124; 186*4882a593Smuzhiyun u32 reserve10[38]; 187*4882a593Smuzhiyun u32 ddrphy_reg29; 188*4882a593Smuzhiyun u32 reserve11[40]; 189*4882a593Smuzhiyun u32 ddrphy_reg264; 190*4882a593Smuzhiyun u32 reserve12[18]; 191*4882a593Smuzhiyun u32 ddrphy_reg2a; 192*4882a593Smuzhiyun u32 reserve13[4]; 193*4882a593Smuzhiyun u32 ddrphy_reg30; 194*4882a593Smuzhiyun u32 ddrphy_reg31; 195*4882a593Smuzhiyun u32 ddrphy_reg32; 196*4882a593Smuzhiyun u32 ddrphy_reg33; 197*4882a593Smuzhiyun u32 ddrphy_reg34; 198*4882a593Smuzhiyun u32 ddrphy_reg35; 199*4882a593Smuzhiyun u32 ddrphy_reg36; 200*4882a593Smuzhiyun u32 ddrphy_reg37; 201*4882a593Smuzhiyun u32 ddrphy_reg38; 202*4882a593Smuzhiyun u32 ddrphy_reg39; 203*4882a593Smuzhiyun u32 ddrphy_reg40; 204*4882a593Smuzhiyun u32 ddrphy_reg41; 205*4882a593Smuzhiyun u32 ddrphy_reg42; 206*4882a593Smuzhiyun u32 ddrphy_reg43; 207*4882a593Smuzhiyun u32 ddrphy_reg44; 208*4882a593Smuzhiyun u32 ddrphy_reg45; 209*4882a593Smuzhiyun u32 ddrphy_reg46; 210*4882a593Smuzhiyun u32 ddrphy_reg47; 211*4882a593Smuzhiyun u32 ddrphy_reg48; 212*4882a593Smuzhiyun u32 ddrphy_reg49; 213*4882a593Smuzhiyun u32 ddrphy_reg50; 214*4882a593Smuzhiyun u32 ddrphy_reg51; 215*4882a593Smuzhiyun u32 ddrphy_reg52; 216*4882a593Smuzhiyun u32 ddrphy_reg53; 217*4882a593Smuzhiyun u32 reserve14; 218*4882a593Smuzhiyun u32 ddrphy_reg54; 219*4882a593Smuzhiyun u32 ddrphy_reg55; 220*4882a593Smuzhiyun u32 ddrphy_reg56; 221*4882a593Smuzhiyun u32 ddrphy_reg57; 222*4882a593Smuzhiyun u32 ddrphy_reg58; 223*4882a593Smuzhiyun u32 ddrphy_reg59; 224*4882a593Smuzhiyun u32 ddrphy_reg5a; 225*4882a593Smuzhiyun u32 ddrphy_reg5b; 226*4882a593Smuzhiyun u32 ddrphy_reg5c; 227*4882a593Smuzhiyun u32 ddrphy_reg5d; 228*4882a593Smuzhiyun u32 ddrphy_reg5e; 229*4882a593Smuzhiyun u32 reserve15[28]; 230*4882a593Smuzhiyun u32 ddrphy_reg5f; 231*4882a593Smuzhiyun u32 reserve16[6]; 232*4882a593Smuzhiyun u32 ddrphy_reg60; 233*4882a593Smuzhiyun u32 ddrphy_reg61; 234*4882a593Smuzhiyun u32 ddrphy_reg62; 235*4882a593Smuzhiyun }; 236*4882a593Smuzhiyun check_member(rk3036_ddr_phy, ddrphy_reg62, 0x03e8); 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun struct rk3036_pctl_timing { 239*4882a593Smuzhiyun u32 togcnt1u; 240*4882a593Smuzhiyun u32 tinit; 241*4882a593Smuzhiyun u32 trsth; 242*4882a593Smuzhiyun u32 togcnt100n; 243*4882a593Smuzhiyun u32 trefi; 244*4882a593Smuzhiyun u32 tmrd; 245*4882a593Smuzhiyun u32 trfc; 246*4882a593Smuzhiyun u32 trp; 247*4882a593Smuzhiyun u32 trtw; 248*4882a593Smuzhiyun u32 tal; 249*4882a593Smuzhiyun u32 tcl; 250*4882a593Smuzhiyun u32 tcwl; 251*4882a593Smuzhiyun u32 tras; 252*4882a593Smuzhiyun u32 trc; 253*4882a593Smuzhiyun u32 trcd; 254*4882a593Smuzhiyun u32 trrd; 255*4882a593Smuzhiyun u32 trtp; 256*4882a593Smuzhiyun u32 twr; 257*4882a593Smuzhiyun u32 twtr; 258*4882a593Smuzhiyun u32 texsr; 259*4882a593Smuzhiyun u32 txp; 260*4882a593Smuzhiyun u32 txpdll; 261*4882a593Smuzhiyun u32 tzqcs; 262*4882a593Smuzhiyun u32 tzqcsi; 263*4882a593Smuzhiyun u32 tdqs; 264*4882a593Smuzhiyun u32 tcksre; 265*4882a593Smuzhiyun u32 tcksrx; 266*4882a593Smuzhiyun u32 tcke; 267*4882a593Smuzhiyun u32 tmod; 268*4882a593Smuzhiyun u32 trstl; 269*4882a593Smuzhiyun u32 tzqcl; 270*4882a593Smuzhiyun u32 tmrr; 271*4882a593Smuzhiyun u32 tckesr; 272*4882a593Smuzhiyun u32 tdpd; 273*4882a593Smuzhiyun }; 274*4882a593Smuzhiyun 275*4882a593Smuzhiyun struct rk3036_phy_timing { 276*4882a593Smuzhiyun u32 mr[4]; 277*4882a593Smuzhiyun u32 bl; 278*4882a593Smuzhiyun u32 cl_al; 279*4882a593Smuzhiyun }; 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun typedef union { 282*4882a593Smuzhiyun u32 noc_timing; 283*4882a593Smuzhiyun struct { 284*4882a593Smuzhiyun u32 acttoact:6; 285*4882a593Smuzhiyun u32 rdtomiss:6; 286*4882a593Smuzhiyun u32 wrtomiss:6; 287*4882a593Smuzhiyun u32 burstlen:3; 288*4882a593Smuzhiyun u32 rdtowr:5; 289*4882a593Smuzhiyun u32 wrtord:5; 290*4882a593Smuzhiyun u32 bwratio:1; 291*4882a593Smuzhiyun }; 292*4882a593Smuzhiyun } rk3036_noc_timing; 293*4882a593Smuzhiyun 294*4882a593Smuzhiyun struct rk3036_ddr_timing { 295*4882a593Smuzhiyun u32 freq; 296*4882a593Smuzhiyun struct rk3036_pctl_timing pctl_timing; 297*4882a593Smuzhiyun struct rk3036_phy_timing phy_timing; 298*4882a593Smuzhiyun rk3036_noc_timing noc_timing; 299*4882a593Smuzhiyun }; 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun struct rk3036_service_sys { 302*4882a593Smuzhiyun u32 id_coreid; 303*4882a593Smuzhiyun u32 id_revisionid; 304*4882a593Smuzhiyun u32 ddrconf; 305*4882a593Smuzhiyun u32 ddrtiming; 306*4882a593Smuzhiyun u32 ddrmode; 307*4882a593Smuzhiyun u32 readlatency; 308*4882a593Smuzhiyun }; 309*4882a593Smuzhiyun 310*4882a593Smuzhiyun struct rk3036_ddr_config { 311*4882a593Smuzhiyun /* 312*4882a593Smuzhiyun * 000: lpddr 313*4882a593Smuzhiyun * 001: ddr 314*4882a593Smuzhiyun * 010: ddr2 315*4882a593Smuzhiyun * 011: ddr3 316*4882a593Smuzhiyun * 100: lpddr2-s2 317*4882a593Smuzhiyun * 101: lpddr2-s4 318*4882a593Smuzhiyun * 110: lpddr3 319*4882a593Smuzhiyun */ 320*4882a593Smuzhiyun u32 ddr_type; 321*4882a593Smuzhiyun u32 rank; 322*4882a593Smuzhiyun u32 cs0_row; 323*4882a593Smuzhiyun u32 cs1_row; 324*4882a593Smuzhiyun 325*4882a593Smuzhiyun /* 2: 4bank, 3: 8bank */ 326*4882a593Smuzhiyun u32 bank; 327*4882a593Smuzhiyun u32 col; 328*4882a593Smuzhiyun 329*4882a593Smuzhiyun /* bw(0: 8bit, 1: 16bit, 2: 32bit) */ 330*4882a593Smuzhiyun u32 bw; 331*4882a593Smuzhiyun }; 332*4882a593Smuzhiyun 333*4882a593Smuzhiyun /* rk3036 sdram initial */ 334*4882a593Smuzhiyun int sdram_init(void); 335*4882a593Smuzhiyun 336*4882a593Smuzhiyun /* get ddr die config, implement in specific board */ 337*4882a593Smuzhiyun void get_ddr_config(struct rk3036_ddr_config *config); 338*4882a593Smuzhiyun 339*4882a593Smuzhiyun /* get ddr size on board */ 340*4882a593Smuzhiyun size_t sdram_size(void); 341*4882a593Smuzhiyun #endif 342