Home | History | Annotate | Download | only in arch-rockchip
      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