/* * (C) Copyright 2015 Rockchip Electronics Co., Ltd * * SPDX-License-Identifier: GPL-2.0+ */ #ifndef _ASM_ARCH_SDRAM_RK3036_H #define _ASM_ARCH_SDRAM_RK3036_H #include struct rk3036_ddr_pctl { u32 scfg; u32 sctl; u32 stat; u32 intrstat; u32 reserved0[12]; u32 mcmd; u32 powctl; u32 powstat; u32 cmdtstat; u32 cmdtstaten; u32 reserved1[3]; u32 mrrcfg0; u32 mrrstat0; u32 mrrstat1; u32 reserved2[4]; u32 mcfg1; u32 mcfg; u32 ppcfg; u32 mstat; u32 lpddr2zqcfg; u32 reserved3; u32 dtupdes; u32 dtuna; u32 dtune; u32 dtuprd0; u32 dtuprd1; u32 dtuprd2; u32 dtuprd3; u32 dtuawdt; u32 reserved4[3]; u32 togcnt1u; u32 tinit; u32 trsth; u32 togcnt100n; u32 trefi; u32 tmrd; u32 trfc; u32 trp; u32 trtw; u32 tal; u32 tcl; u32 tcwl; u32 tras; u32 trc; u32 trcd; u32 trrd; u32 trtp; u32 twr; u32 twtr; u32 texsr; u32 txp; u32 txpdll; u32 tzqcs; u32 tzqcsi; u32 tdqs; u32 tcksre; u32 tcksrx; u32 tcke; u32 tmod; u32 trstl; u32 tzqcl; u32 tmrr; u32 tckesr; u32 reserved5[47]; u32 dtuwactl; u32 dturactl; u32 dtucfg; u32 dtuectl; u32 dtuwd0; u32 dtuwd1; u32 dtuwd2; u32 dtuwd3; u32 dtuwdm; u32 dturd0; u32 dturd1; u32 dturd2; u32 dturd3; u32 dtulfsrwd; u32 dtulfsrrd; u32 dtueaf; u32 dfitctrldelay; u32 dfiodtcfg; u32 dfiodtcfg1; u32 dfiodtrankmap; u32 dfitphywrdata; u32 dfitphywrlat; u32 reserved7[2]; u32 dfitrddataen; u32 dfitphyrdlat; u32 reserved8[2]; u32 dfitphyupdtype0; u32 dfitphyupdtype1; u32 dfitphyupdtype2; u32 dfitphyupdtype3; u32 dfitctrlupdmin; u32 dfitctrlupdmax; u32 dfitctrlupddly; u32 reserved9; u32 dfiupdcfg; u32 dfitrefmski; u32 dfitctrlupdi; u32 reserved10[4]; u32 dfitrcfg0; u32 dfitrstat0; u32 dfitrwrlvlen; u32 dfitrrdlvlen; u32 dfitrrdlvlgateen; u32 dfiststat0; u32 dfistcfg0; u32 dfistcfg1; u32 reserved11; u32 dfitdramclken; u32 dfitdramclkdis; u32 dfistcfg2; u32 dfistparclr; u32 dfistparlog; u32 reserved12[3]; u32 dfilpcfg0; u32 reserved13[3]; u32 dfitrwrlvlresp0; u32 dfitrwrlvlresp1; u32 dfitrwrlvlresp2; u32 dfitrrdlvlresp0; u32 dfitrrdlvlresp1; u32 dfitrrdlvlresp2; u32 dfitrwrlvldelay0; u32 dfitrwrlvldelay1; u32 dfitrwrlvldelay2; u32 dfitrrdlvldelay0; u32 dfitrrdlvldelay1; u32 dfitrrdlvldelay2; u32 dfitrrdlvlgatedelay0; u32 dfitrrdlvlgatedelay1; u32 dfitrrdlvlgatedelay2; u32 dfitrcmd; u32 reserved14[46]; u32 ipvr; u32 iptr; }; check_member(rk3036_ddr_pctl, iptr, 0x03fc); struct rk3036_ddr_phy { u32 ddrphy_reg1; u32 ddrphy_reg3; u32 ddrphy_reg2; u32 reserve[11]; u32 ddrphy_reg4a; u32 ddrphy_reg4b; u32 reserve1[5]; u32 ddrphy_reg16; u32 reserve2; u32 ddrphy_reg18; u32 ddrphy_reg19; u32 reserve3; u32 ddrphy_reg21; u32 reserve4; u32 ddrphy_reg22; u32 reserve5[3]; u32 ddrphy_reg25; u32 ddrphy_reg26; u32 ddrphy_reg27; u32 ddrphy_reg28; u32 reserve6[17]; u32 ddrphy_reg6; u32 ddrphy_reg7; u32 reserve7; u32 ddrphy_reg8; u32 ddrphy_reg0e4; u32 reserve8[11]; u32 ddrphy_reg9; u32 ddrphy_reg10; u32 reserve9; u32 ddrphy_reg11; u32 ddrphy_reg124; u32 reserve10[38]; u32 ddrphy_reg29; u32 reserve11[40]; u32 ddrphy_reg264; u32 reserve12[18]; u32 ddrphy_reg2a; u32 reserve13[4]; u32 ddrphy_reg30; u32 ddrphy_reg31; u32 ddrphy_reg32; u32 ddrphy_reg33; u32 ddrphy_reg34; u32 ddrphy_reg35; u32 ddrphy_reg36; u32 ddrphy_reg37; u32 ddrphy_reg38; u32 ddrphy_reg39; u32 ddrphy_reg40; u32 ddrphy_reg41; u32 ddrphy_reg42; u32 ddrphy_reg43; u32 ddrphy_reg44; u32 ddrphy_reg45; u32 ddrphy_reg46; u32 ddrphy_reg47; u32 ddrphy_reg48; u32 ddrphy_reg49; u32 ddrphy_reg50; u32 ddrphy_reg51; u32 ddrphy_reg52; u32 ddrphy_reg53; u32 reserve14; u32 ddrphy_reg54; u32 ddrphy_reg55; u32 ddrphy_reg56; u32 ddrphy_reg57; u32 ddrphy_reg58; u32 ddrphy_reg59; u32 ddrphy_reg5a; u32 ddrphy_reg5b; u32 ddrphy_reg5c; u32 ddrphy_reg5d; u32 ddrphy_reg5e; u32 reserve15[28]; u32 ddrphy_reg5f; u32 reserve16[6]; u32 ddrphy_reg60; u32 ddrphy_reg61; u32 ddrphy_reg62; }; check_member(rk3036_ddr_phy, ddrphy_reg62, 0x03e8); struct rk3036_pctl_timing { u32 togcnt1u; u32 tinit; u32 trsth; u32 togcnt100n; u32 trefi; u32 tmrd; u32 trfc; u32 trp; u32 trtw; u32 tal; u32 tcl; u32 tcwl; u32 tras; u32 trc; u32 trcd; u32 trrd; u32 trtp; u32 twr; u32 twtr; u32 texsr; u32 txp; u32 txpdll; u32 tzqcs; u32 tzqcsi; u32 tdqs; u32 tcksre; u32 tcksrx; u32 tcke; u32 tmod; u32 trstl; u32 tzqcl; u32 tmrr; u32 tckesr; u32 tdpd; }; struct rk3036_phy_timing { u32 mr[4]; u32 bl; u32 cl_al; }; typedef union { u32 noc_timing; struct { u32 acttoact:6; u32 rdtomiss:6; u32 wrtomiss:6; u32 burstlen:3; u32 rdtowr:5; u32 wrtord:5; u32 bwratio:1; }; } rk3036_noc_timing; struct rk3036_ddr_timing { u32 freq; struct rk3036_pctl_timing pctl_timing; struct rk3036_phy_timing phy_timing; rk3036_noc_timing noc_timing; }; struct rk3036_service_sys { u32 id_coreid; u32 id_revisionid; u32 ddrconf; u32 ddrtiming; u32 ddrmode; u32 readlatency; }; struct rk3036_ddr_config { /* * 000: lpddr * 001: ddr * 010: ddr2 * 011: ddr3 * 100: lpddr2-s2 * 101: lpddr2-s4 * 110: lpddr3 */ u32 ddr_type; u32 rank; u32 cs0_row; u32 cs1_row; /* 2: 4bank, 3: 8bank */ u32 bank; u32 col; /* bw(0: 8bit, 1: 16bit, 2: 32bit) */ u32 bw; }; /* rk3036 sdram initial */ void sdram_init(void); /* get ddr die config, implement in specific board */ void get_ddr_config(struct rk3036_ddr_config *config); /* get ddr size on board */ size_t sdram_size(void); #endif