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