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