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