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