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