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