xref: /rk3399_rockchip-uboot/arch/arm/include/asm/arch-rockchip/sdram_rk3036.h (revision 891b189dd2ad7f9a2ac80ff0000f696418165b79)
153c45f0cShuang lin /*
253c45f0cShuang lin  * (C) Copyright 2015 Rockchip Electronics Co., Ltd
353c45f0cShuang lin  *
453c45f0cShuang lin  * SPDX-License-Identifier:     GPL-2.0+
553c45f0cShuang lin  */
653c45f0cShuang lin #ifndef _ASM_ARCH_SDRAM_RK3036_H
753c45f0cShuang lin #define _ASM_ARCH_SDRAM_RK3036_H
853c45f0cShuang lin 
953c45f0cShuang lin #include <common.h>
1053c45f0cShuang lin 
1153c45f0cShuang lin struct rk3036_ddr_pctl {
1253c45f0cShuang lin 	u32 scfg;
1353c45f0cShuang lin 	u32 sctl;
1453c45f0cShuang lin 	u32 stat;
1553c45f0cShuang lin 	u32 intrstat;
1653c45f0cShuang lin 	u32 reserved0[12];
1753c45f0cShuang lin 	u32 mcmd;
1853c45f0cShuang lin 	u32 powctl;
1953c45f0cShuang lin 	u32 powstat;
2053c45f0cShuang lin 	u32 cmdtstat;
2153c45f0cShuang lin 	u32 cmdtstaten;
2253c45f0cShuang lin 	u32 reserved1[3];
2353c45f0cShuang lin 	u32 mrrcfg0;
2453c45f0cShuang lin 	u32 mrrstat0;
2553c45f0cShuang lin 	u32 mrrstat1;
2653c45f0cShuang lin 	u32 reserved2[4];
2753c45f0cShuang lin 	u32 mcfg1;
2853c45f0cShuang lin 	u32 mcfg;
2953c45f0cShuang lin 	u32 ppcfg;
3053c45f0cShuang lin 	u32 mstat;
3153c45f0cShuang lin 	u32 lpddr2zqcfg;
3253c45f0cShuang lin 	u32 reserved3;
3353c45f0cShuang lin 	u32 dtupdes;
3453c45f0cShuang lin 	u32 dtuna;
3553c45f0cShuang lin 	u32 dtune;
3653c45f0cShuang lin 	u32 dtuprd0;
3753c45f0cShuang lin 	u32 dtuprd1;
3853c45f0cShuang lin 	u32 dtuprd2;
3953c45f0cShuang lin 	u32 dtuprd3;
4053c45f0cShuang lin 	u32 dtuawdt;
4153c45f0cShuang lin 	u32 reserved4[3];
4253c45f0cShuang lin 	u32 togcnt1u;
4353c45f0cShuang lin 	u32 tinit;
4453c45f0cShuang lin 	u32 trsth;
4553c45f0cShuang lin 	u32 togcnt100n;
4653c45f0cShuang lin 	u32 trefi;
4753c45f0cShuang lin 	u32 tmrd;
4853c45f0cShuang lin 	u32 trfc;
4953c45f0cShuang lin 	u32 trp;
5053c45f0cShuang lin 	u32 trtw;
5153c45f0cShuang lin 	u32 tal;
5253c45f0cShuang lin 	u32 tcl;
5353c45f0cShuang lin 	u32 tcwl;
5453c45f0cShuang lin 	u32 tras;
5553c45f0cShuang lin 	u32 trc;
5653c45f0cShuang lin 	u32 trcd;
5753c45f0cShuang lin 	u32 trrd;
5853c45f0cShuang lin 	u32 trtp;
5953c45f0cShuang lin 	u32 twr;
6053c45f0cShuang lin 	u32 twtr;
6153c45f0cShuang lin 	u32 texsr;
6253c45f0cShuang lin 	u32 txp;
6353c45f0cShuang lin 	u32 txpdll;
6453c45f0cShuang lin 	u32 tzqcs;
6553c45f0cShuang lin 	u32 tzqcsi;
6653c45f0cShuang lin 	u32 tdqs;
6753c45f0cShuang lin 	u32 tcksre;
6853c45f0cShuang lin 	u32 tcksrx;
6953c45f0cShuang lin 	u32 tcke;
7053c45f0cShuang lin 	u32 tmod;
7153c45f0cShuang lin 	u32 trstl;
7253c45f0cShuang lin 	u32 tzqcl;
7353c45f0cShuang lin 	u32 tmrr;
7453c45f0cShuang lin 	u32 tckesr;
7553c45f0cShuang lin 	u32 reserved5[47];
7653c45f0cShuang lin 	u32 dtuwactl;
7753c45f0cShuang lin 	u32 dturactl;
7853c45f0cShuang lin 	u32 dtucfg;
7953c45f0cShuang lin 	u32 dtuectl;
8053c45f0cShuang lin 	u32 dtuwd0;
8153c45f0cShuang lin 	u32 dtuwd1;
8253c45f0cShuang lin 	u32 dtuwd2;
8353c45f0cShuang lin 	u32 dtuwd3;
8453c45f0cShuang lin 	u32 dtuwdm;
8553c45f0cShuang lin 	u32 dturd0;
8653c45f0cShuang lin 	u32 dturd1;
8753c45f0cShuang lin 	u32 dturd2;
8853c45f0cShuang lin 	u32 dturd3;
8953c45f0cShuang lin 	u32 dtulfsrwd;
9053c45f0cShuang lin 	u32 dtulfsrrd;
9153c45f0cShuang lin 	u32 dtueaf;
9253c45f0cShuang lin 	u32 dfitctrldelay;
9353c45f0cShuang lin 	u32 dfiodtcfg;
9453c45f0cShuang lin 	u32 dfiodtcfg1;
9553c45f0cShuang lin 	u32 dfiodtrankmap;
9653c45f0cShuang lin 	u32 dfitphywrdata;
9753c45f0cShuang lin 	u32 dfitphywrlat;
9853c45f0cShuang lin 	u32 reserved7[2];
9953c45f0cShuang lin 	u32 dfitrddataen;
10053c45f0cShuang lin 	u32 dfitphyrdlat;
10153c45f0cShuang lin 	u32 reserved8[2];
10253c45f0cShuang lin 	u32 dfitphyupdtype0;
10353c45f0cShuang lin 	u32 dfitphyupdtype1;
10453c45f0cShuang lin 	u32 dfitphyupdtype2;
10553c45f0cShuang lin 	u32 dfitphyupdtype3;
10653c45f0cShuang lin 	u32 dfitctrlupdmin;
10753c45f0cShuang lin 	u32 dfitctrlupdmax;
10853c45f0cShuang lin 	u32 dfitctrlupddly;
10953c45f0cShuang lin 	u32 reserved9;
11053c45f0cShuang lin 	u32 dfiupdcfg;
11153c45f0cShuang lin 	u32 dfitrefmski;
11253c45f0cShuang lin 	u32 dfitctrlupdi;
11353c45f0cShuang lin 	u32 reserved10[4];
11453c45f0cShuang lin 	u32 dfitrcfg0;
11553c45f0cShuang lin 	u32 dfitrstat0;
11653c45f0cShuang lin 	u32 dfitrwrlvlen;
11753c45f0cShuang lin 	u32 dfitrrdlvlen;
11853c45f0cShuang lin 	u32 dfitrrdlvlgateen;
11953c45f0cShuang lin 	u32 dfiststat0;
12053c45f0cShuang lin 	u32 dfistcfg0;
12153c45f0cShuang lin 	u32 dfistcfg1;
12253c45f0cShuang lin 	u32 reserved11;
12353c45f0cShuang lin 	u32 dfitdramclken;
12453c45f0cShuang lin 	u32 dfitdramclkdis;
12553c45f0cShuang lin 	u32 dfistcfg2;
12653c45f0cShuang lin 	u32 dfistparclr;
12753c45f0cShuang lin 	u32 dfistparlog;
12853c45f0cShuang lin 	u32 reserved12[3];
12953c45f0cShuang lin 	u32 dfilpcfg0;
13053c45f0cShuang lin 	u32 reserved13[3];
13153c45f0cShuang lin 	u32 dfitrwrlvlresp0;
13253c45f0cShuang lin 	u32 dfitrwrlvlresp1;
13353c45f0cShuang lin 	u32 dfitrwrlvlresp2;
13453c45f0cShuang lin 	u32 dfitrrdlvlresp0;
13553c45f0cShuang lin 	u32 dfitrrdlvlresp1;
13653c45f0cShuang lin 	u32 dfitrrdlvlresp2;
13753c45f0cShuang lin 	u32 dfitrwrlvldelay0;
13853c45f0cShuang lin 	u32 dfitrwrlvldelay1;
13953c45f0cShuang lin 	u32 dfitrwrlvldelay2;
14053c45f0cShuang lin 	u32 dfitrrdlvldelay0;
14153c45f0cShuang lin 	u32 dfitrrdlvldelay1;
14253c45f0cShuang lin 	u32 dfitrrdlvldelay2;
14353c45f0cShuang lin 	u32 dfitrrdlvlgatedelay0;
14453c45f0cShuang lin 	u32 dfitrrdlvlgatedelay1;
14553c45f0cShuang lin 	u32 dfitrrdlvlgatedelay2;
14653c45f0cShuang lin 	u32 dfitrcmd;
14753c45f0cShuang lin 	u32 reserved14[46];
14853c45f0cShuang lin 	u32 ipvr;
14953c45f0cShuang lin 	u32 iptr;
15053c45f0cShuang lin };
15153c45f0cShuang lin check_member(rk3036_ddr_pctl, iptr, 0x03fc);
15253c45f0cShuang lin 
15353c45f0cShuang lin struct rk3036_ddr_phy {
15453c45f0cShuang lin 	u32 ddrphy_reg1;
15553c45f0cShuang lin 	u32 ddrphy_reg3;
15653c45f0cShuang lin 	u32 ddrphy_reg2;
15753c45f0cShuang lin 	u32 reserve[11];
15853c45f0cShuang lin 	u32 ddrphy_reg4a;
15953c45f0cShuang lin 	u32 ddrphy_reg4b;
16053c45f0cShuang lin 	u32 reserve1[5];
16153c45f0cShuang lin 	u32 ddrphy_reg16;
16253c45f0cShuang lin 	u32 reserve2;
16353c45f0cShuang lin 	u32 ddrphy_reg18;
16453c45f0cShuang lin 	u32 ddrphy_reg19;
16553c45f0cShuang lin 	u32 reserve3;
16653c45f0cShuang lin 	u32 ddrphy_reg21;
16753c45f0cShuang lin 	u32 reserve4;
16853c45f0cShuang lin 	u32 ddrphy_reg22;
16953c45f0cShuang lin 	u32 reserve5[3];
17053c45f0cShuang lin 	u32 ddrphy_reg25;
17153c45f0cShuang lin 	u32 ddrphy_reg26;
17253c45f0cShuang lin 	u32 ddrphy_reg27;
17353c45f0cShuang lin 	u32 ddrphy_reg28;
17453c45f0cShuang lin 	u32 reserve6[17];
17553c45f0cShuang lin 	u32 ddrphy_reg6;
17653c45f0cShuang lin 	u32 ddrphy_reg7;
17753c45f0cShuang lin 	u32 reserve7;
17853c45f0cShuang lin 	u32 ddrphy_reg8;
17953c45f0cShuang lin 	u32 ddrphy_reg0e4;
18053c45f0cShuang lin 	u32 reserve8[11];
18153c45f0cShuang lin 	u32 ddrphy_reg9;
18253c45f0cShuang lin 	u32 ddrphy_reg10;
18353c45f0cShuang lin 	u32 reserve9;
18453c45f0cShuang lin 	u32 ddrphy_reg11;
18553c45f0cShuang lin 	u32 ddrphy_reg124;
18653c45f0cShuang lin 	u32 reserve10[38];
18753c45f0cShuang lin 	u32 ddrphy_reg29;
18853c45f0cShuang lin 	u32 reserve11[40];
18953c45f0cShuang lin 	u32 ddrphy_reg264;
19053c45f0cShuang lin 	u32 reserve12[18];
19153c45f0cShuang lin 	u32 ddrphy_reg2a;
19253c45f0cShuang lin 	u32 reserve13[4];
19353c45f0cShuang lin 	u32 ddrphy_reg30;
19453c45f0cShuang lin 	u32 ddrphy_reg31;
19553c45f0cShuang lin 	u32 ddrphy_reg32;
19653c45f0cShuang lin 	u32 ddrphy_reg33;
19753c45f0cShuang lin 	u32 ddrphy_reg34;
19853c45f0cShuang lin 	u32 ddrphy_reg35;
19953c45f0cShuang lin 	u32 ddrphy_reg36;
20053c45f0cShuang lin 	u32 ddrphy_reg37;
20153c45f0cShuang lin 	u32 ddrphy_reg38;
20253c45f0cShuang lin 	u32 ddrphy_reg39;
20353c45f0cShuang lin 	u32 ddrphy_reg40;
20453c45f0cShuang lin 	u32 ddrphy_reg41;
20553c45f0cShuang lin 	u32 ddrphy_reg42;
20653c45f0cShuang lin 	u32 ddrphy_reg43;
20753c45f0cShuang lin 	u32 ddrphy_reg44;
20853c45f0cShuang lin 	u32 ddrphy_reg45;
20953c45f0cShuang lin 	u32 ddrphy_reg46;
21053c45f0cShuang lin 	u32 ddrphy_reg47;
21153c45f0cShuang lin 	u32 ddrphy_reg48;
21253c45f0cShuang lin 	u32 ddrphy_reg49;
21353c45f0cShuang lin 	u32 ddrphy_reg50;
21453c45f0cShuang lin 	u32 ddrphy_reg51;
21553c45f0cShuang lin 	u32 ddrphy_reg52;
21653c45f0cShuang lin 	u32 ddrphy_reg53;
21753c45f0cShuang lin 	u32 reserve14;
21853c45f0cShuang lin 	u32 ddrphy_reg54;
21953c45f0cShuang lin 	u32 ddrphy_reg55;
22053c45f0cShuang lin 	u32 ddrphy_reg56;
22153c45f0cShuang lin 	u32 ddrphy_reg57;
22253c45f0cShuang lin 	u32 ddrphy_reg58;
22353c45f0cShuang lin 	u32 ddrphy_reg59;
22453c45f0cShuang lin 	u32 ddrphy_reg5a;
22553c45f0cShuang lin 	u32 ddrphy_reg5b;
22653c45f0cShuang lin 	u32 ddrphy_reg5c;
22753c45f0cShuang lin 	u32 ddrphy_reg5d;
22853c45f0cShuang lin 	u32 ddrphy_reg5e;
22953c45f0cShuang lin 	u32 reserve15[28];
23053c45f0cShuang lin 	u32 ddrphy_reg5f;
23153c45f0cShuang lin 	u32 reserve16[6];
23253c45f0cShuang lin 	u32 ddrphy_reg60;
23353c45f0cShuang lin 	u32 ddrphy_reg61;
23453c45f0cShuang lin 	u32 ddrphy_reg62;
23553c45f0cShuang lin };
23653c45f0cShuang lin check_member(rk3036_ddr_phy, ddrphy_reg62, 0x03e8);
23753c45f0cShuang lin 
23853c45f0cShuang lin struct rk3036_pctl_timing {
23953c45f0cShuang lin 	u32 togcnt1u;
24053c45f0cShuang lin 	u32 tinit;
24153c45f0cShuang lin 	u32 trsth;
24253c45f0cShuang lin 	u32 togcnt100n;
24353c45f0cShuang lin 	u32 trefi;
24453c45f0cShuang lin 	u32 tmrd;
24553c45f0cShuang lin 	u32 trfc;
24653c45f0cShuang lin 	u32 trp;
24753c45f0cShuang lin 	u32 trtw;
24853c45f0cShuang lin 	u32 tal;
24953c45f0cShuang lin 	u32 tcl;
25053c45f0cShuang lin 	u32 tcwl;
25153c45f0cShuang lin 	u32 tras;
25253c45f0cShuang lin 	u32 trc;
25353c45f0cShuang lin 	u32 trcd;
25453c45f0cShuang lin 	u32 trrd;
25553c45f0cShuang lin 	u32 trtp;
25653c45f0cShuang lin 	u32 twr;
25753c45f0cShuang lin 	u32 twtr;
25853c45f0cShuang lin 	u32 texsr;
25953c45f0cShuang lin 	u32 txp;
26053c45f0cShuang lin 	u32 txpdll;
26153c45f0cShuang lin 	u32 tzqcs;
26253c45f0cShuang lin 	u32 tzqcsi;
26353c45f0cShuang lin 	u32 tdqs;
26453c45f0cShuang lin 	u32 tcksre;
26553c45f0cShuang lin 	u32 tcksrx;
26653c45f0cShuang lin 	u32 tcke;
26753c45f0cShuang lin 	u32 tmod;
26853c45f0cShuang lin 	u32 trstl;
26953c45f0cShuang lin 	u32 tzqcl;
27053c45f0cShuang lin 	u32 tmrr;
27153c45f0cShuang lin 	u32 tckesr;
27253c45f0cShuang lin 	u32 tdpd;
27353c45f0cShuang lin };
27453c45f0cShuang lin 
27553c45f0cShuang lin struct rk3036_phy_timing {
27653c45f0cShuang lin 	u32 mr[4];
27753c45f0cShuang lin 	u32 bl;
27853c45f0cShuang lin 	u32 cl_al;
27953c45f0cShuang lin };
28053c45f0cShuang lin 
28153c45f0cShuang lin typedef union {
28253c45f0cShuang lin 	u32 noc_timing;
28353c45f0cShuang lin 	struct {
28453c45f0cShuang lin 		u32 acttoact:6;
28553c45f0cShuang lin 		u32 rdtomiss:6;
28653c45f0cShuang lin 		u32 wrtomiss:6;
28753c45f0cShuang lin 		u32 burstlen:3;
28853c45f0cShuang lin 		u32 rdtowr:5;
28953c45f0cShuang lin 		u32 wrtord:5;
29053c45f0cShuang lin 		u32 bwratio:1;
29153c45f0cShuang lin 	};
29253c45f0cShuang lin } rk3036_noc_timing;
29353c45f0cShuang lin 
29453c45f0cShuang lin struct rk3036_ddr_timing {
29553c45f0cShuang lin 	u32 freq;
29653c45f0cShuang lin 	struct rk3036_pctl_timing pctl_timing;
29753c45f0cShuang lin 	struct rk3036_phy_timing phy_timing;
29853c45f0cShuang lin 	rk3036_noc_timing noc_timing;
29953c45f0cShuang lin };
30053c45f0cShuang lin 
30153c45f0cShuang lin struct rk3036_service_sys {
30253c45f0cShuang lin 	u32 id_coreid;
30353c45f0cShuang lin 	u32 id_revisionid;
30453c45f0cShuang lin 	u32 ddrconf;
30553c45f0cShuang lin 	u32 ddrtiming;
30653c45f0cShuang lin 	u32 ddrmode;
30753c45f0cShuang lin 	u32 readlatency;
30853c45f0cShuang lin };
30953c45f0cShuang lin 
31053c45f0cShuang lin struct rk3036_ddr_config {
31153c45f0cShuang lin 	/*
31253c45f0cShuang lin 	 * 000: lpddr
31353c45f0cShuang lin 	 * 001: ddr
31453c45f0cShuang lin 	 * 010: ddr2
31553c45f0cShuang lin 	 * 011: ddr3
31653c45f0cShuang lin 	 * 100: lpddr2-s2
31753c45f0cShuang lin 	 * 101: lpddr2-s4
31853c45f0cShuang lin 	 * 110: lpddr3
31953c45f0cShuang lin 	 */
32053c45f0cShuang lin 	u32 ddr_type;
32153c45f0cShuang lin 	u32 rank;
32253c45f0cShuang lin 	u32 cs0_row;
32353c45f0cShuang lin 	u32 cs1_row;
32453c45f0cShuang lin 
32553c45f0cShuang lin 	/* 2: 4bank, 3: 8bank */
32653c45f0cShuang lin 	u32 bank;
32753c45f0cShuang lin 	u32 col;
32853c45f0cShuang lin 
32953c45f0cShuang lin 	/* bw(0: 8bit, 1: 16bit, 2: 32bit) */
33053c45f0cShuang lin 	u32 bw;
33153c45f0cShuang lin };
33253c45f0cShuang lin 
33353c45f0cShuang lin /* rk3036 sdram initial */
334*891b189dSYouMin Chen int sdram_init(void);
33553c45f0cShuang lin 
33653c45f0cShuang lin /* get ddr die config, implement in specific board */
33753c45f0cShuang lin void get_ddr_config(struct rk3036_ddr_config *config);
33853c45f0cShuang lin 
33953c45f0cShuang lin /* get ddr size on board */
34053c45f0cShuang lin size_t sdram_size(void);
34153c45f0cShuang lin #endif
342