1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2016, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <stdint.h> 8*91f16700Schasinglulu #include <string.h> 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <platform_def.h> 11*91f16700Schasinglulu 12*91f16700Schasinglulu #include <common/debug.h> 13*91f16700Schasinglulu #include <lib/mmio.h> 14*91f16700Schasinglulu 15*91f16700Schasinglulu #include <ddr_rk3368.h> 16*91f16700Schasinglulu #include <pmu.h> 17*91f16700Schasinglulu #include <rk3368_def.h> 18*91f16700Schasinglulu #include <soc.h> 19*91f16700Schasinglulu 20*91f16700Schasinglulu /* GRF_SOC_STATUS0 */ 21*91f16700Schasinglulu #define DPLL_LOCK (0x1 << 2) 22*91f16700Schasinglulu 23*91f16700Schasinglulu /* GRF_DDRC0_CON0 */ 24*91f16700Schasinglulu #define GRF_DDR_16BIT_EN (((0x1 << 3) << 16) | (0x1 << 3)) 25*91f16700Schasinglulu #define GRF_DDR_32BIT_EN (((0x1 << 3) << 16) | (0x0 << 3)) 26*91f16700Schasinglulu #define GRF_MOBILE_DDR_EN (((0x1 << 4) << 16) | (0x1 << 4)) 27*91f16700Schasinglulu #define GRF_MOBILE_DDR_DISB (((0x1 << 4) << 16) | (0x0 << 4)) 28*91f16700Schasinglulu #define GRF_DDR3_EN (((0x1 << 2) << 16) | (0x1 << 2)) 29*91f16700Schasinglulu #define GRF_LPDDR2_3_EN (((0x1 << 2) << 16) | (0x0 << 2)) 30*91f16700Schasinglulu 31*91f16700Schasinglulu /* PMUGRF_SOC_CON0 */ 32*91f16700Schasinglulu #define ddrphy_bufferen_io_en(n) ((0x1 << (9 + 16)) | (n << 9)) 33*91f16700Schasinglulu #define ddrphy_bufferen_core_en(n) ((0x1 << (8 + 16)) | (n << 8)) 34*91f16700Schasinglulu 35*91f16700Schasinglulu struct PCTRL_TIMING_TAG { 36*91f16700Schasinglulu uint32_t ddrfreq; 37*91f16700Schasinglulu uint32_t TOGCNT1U; 38*91f16700Schasinglulu uint32_t TINIT; 39*91f16700Schasinglulu uint32_t TRSTH; 40*91f16700Schasinglulu uint32_t TOGCNT100N; 41*91f16700Schasinglulu uint32_t TREFI; 42*91f16700Schasinglulu uint32_t TMRD; 43*91f16700Schasinglulu uint32_t TRFC; 44*91f16700Schasinglulu uint32_t TRP; 45*91f16700Schasinglulu uint32_t TRTW; 46*91f16700Schasinglulu uint32_t TAL; 47*91f16700Schasinglulu uint32_t TCL; 48*91f16700Schasinglulu uint32_t TCWL; 49*91f16700Schasinglulu uint32_t TRAS; 50*91f16700Schasinglulu uint32_t TRC; 51*91f16700Schasinglulu uint32_t TRCD; 52*91f16700Schasinglulu uint32_t TRRD; 53*91f16700Schasinglulu uint32_t TRTP; 54*91f16700Schasinglulu uint32_t TWR; 55*91f16700Schasinglulu uint32_t TWTR; 56*91f16700Schasinglulu uint32_t TEXSR; 57*91f16700Schasinglulu uint32_t TXP; 58*91f16700Schasinglulu uint32_t TXPDLL; 59*91f16700Schasinglulu uint32_t TZQCS; 60*91f16700Schasinglulu uint32_t TZQCSI; 61*91f16700Schasinglulu uint32_t TDQS; 62*91f16700Schasinglulu uint32_t TCKSRE; 63*91f16700Schasinglulu uint32_t TCKSRX; 64*91f16700Schasinglulu uint32_t TCKE; 65*91f16700Schasinglulu uint32_t TMOD; 66*91f16700Schasinglulu uint32_t TRSTL; 67*91f16700Schasinglulu uint32_t TZQCL; 68*91f16700Schasinglulu uint32_t TMRR; 69*91f16700Schasinglulu uint32_t TCKESR; 70*91f16700Schasinglulu uint32_t TDPD; 71*91f16700Schasinglulu uint32_t TREFI_MEM_DDR3; 72*91f16700Schasinglulu }; 73*91f16700Schasinglulu 74*91f16700Schasinglulu struct MSCH_SAVE_REG_TAG { 75*91f16700Schasinglulu uint32_t ddrconf; 76*91f16700Schasinglulu uint32_t ddrtiming; 77*91f16700Schasinglulu uint32_t ddrmode; 78*91f16700Schasinglulu uint32_t readlatency; 79*91f16700Schasinglulu uint32_t activate; 80*91f16700Schasinglulu uint32_t devtodev; 81*91f16700Schasinglulu }; 82*91f16700Schasinglulu 83*91f16700Schasinglulu /* ddr suspend need save reg */ 84*91f16700Schasinglulu struct PCTL_SAVE_REG_TAG { 85*91f16700Schasinglulu uint32_t SCFG; 86*91f16700Schasinglulu uint32_t CMDTSTATEN; 87*91f16700Schasinglulu uint32_t MCFG1; 88*91f16700Schasinglulu uint32_t MCFG; 89*91f16700Schasinglulu uint32_t PPCFG; 90*91f16700Schasinglulu struct PCTRL_TIMING_TAG pctl_timing; 91*91f16700Schasinglulu /* DFI Control Registers */ 92*91f16700Schasinglulu uint32_t DFITCTRLDELAY; 93*91f16700Schasinglulu uint32_t DFIODTCFG; 94*91f16700Schasinglulu uint32_t DFIODTCFG1; 95*91f16700Schasinglulu uint32_t DFIODTRANKMAP; 96*91f16700Schasinglulu /* DFI Write Data Registers */ 97*91f16700Schasinglulu uint32_t DFITPHYWRDATA; 98*91f16700Schasinglulu uint32_t DFITPHYWRLAT; 99*91f16700Schasinglulu uint32_t DFITPHYWRDATALAT; 100*91f16700Schasinglulu /* DFI Read Data Registers */ 101*91f16700Schasinglulu uint32_t DFITRDDATAEN; 102*91f16700Schasinglulu uint32_t DFITPHYRDLAT; 103*91f16700Schasinglulu /* DFI Update Registers */ 104*91f16700Schasinglulu uint32_t DFITPHYUPDTYPE0; 105*91f16700Schasinglulu uint32_t DFITPHYUPDTYPE1; 106*91f16700Schasinglulu uint32_t DFITPHYUPDTYPE2; 107*91f16700Schasinglulu uint32_t DFITPHYUPDTYPE3; 108*91f16700Schasinglulu uint32_t DFITCTRLUPDMIN; 109*91f16700Schasinglulu uint32_t DFITCTRLUPDMAX; 110*91f16700Schasinglulu uint32_t DFITCTRLUPDDLY; 111*91f16700Schasinglulu uint32_t DFIUPDCFG; 112*91f16700Schasinglulu uint32_t DFITREFMSKI; 113*91f16700Schasinglulu uint32_t DFITCTRLUPDI; 114*91f16700Schasinglulu /* DFI Status Registers */ 115*91f16700Schasinglulu uint32_t DFISTCFG0; 116*91f16700Schasinglulu uint32_t DFISTCFG1; 117*91f16700Schasinglulu uint32_t DFITDRAMCLKEN; 118*91f16700Schasinglulu uint32_t DFITDRAMCLKDIS; 119*91f16700Schasinglulu uint32_t DFISTCFG2; 120*91f16700Schasinglulu /* DFI Low Power Register */ 121*91f16700Schasinglulu uint32_t DFILPCFG0; 122*91f16700Schasinglulu }; 123*91f16700Schasinglulu 124*91f16700Schasinglulu struct DDRPHY_SAVE_REG_TAG { 125*91f16700Schasinglulu uint32_t PHY_REG0; 126*91f16700Schasinglulu uint32_t PHY_REG1; 127*91f16700Schasinglulu uint32_t PHY_REGB; 128*91f16700Schasinglulu uint32_t PHY_REGC; 129*91f16700Schasinglulu uint32_t PHY_REG11; 130*91f16700Schasinglulu uint32_t PHY_REG13; 131*91f16700Schasinglulu uint32_t PHY_REG14; 132*91f16700Schasinglulu uint32_t PHY_REG16; 133*91f16700Schasinglulu uint32_t PHY_REG20; 134*91f16700Schasinglulu uint32_t PHY_REG21; 135*91f16700Schasinglulu uint32_t PHY_REG26; 136*91f16700Schasinglulu uint32_t PHY_REG27; 137*91f16700Schasinglulu uint32_t PHY_REG28; 138*91f16700Schasinglulu uint32_t PHY_REG30; 139*91f16700Schasinglulu uint32_t PHY_REG31; 140*91f16700Schasinglulu uint32_t PHY_REG36; 141*91f16700Schasinglulu uint32_t PHY_REG37; 142*91f16700Schasinglulu uint32_t PHY_REG38; 143*91f16700Schasinglulu uint32_t PHY_REG40; 144*91f16700Schasinglulu uint32_t PHY_REG41; 145*91f16700Schasinglulu uint32_t PHY_REG46; 146*91f16700Schasinglulu uint32_t PHY_REG47; 147*91f16700Schasinglulu uint32_t PHY_REG48; 148*91f16700Schasinglulu uint32_t PHY_REG50; 149*91f16700Schasinglulu uint32_t PHY_REG51; 150*91f16700Schasinglulu uint32_t PHY_REG56; 151*91f16700Schasinglulu uint32_t PHY_REG57; 152*91f16700Schasinglulu uint32_t PHY_REG58; 153*91f16700Schasinglulu uint32_t PHY_REGDLL; 154*91f16700Schasinglulu uint32_t PHY_REGEC; 155*91f16700Schasinglulu uint32_t PHY_REGED; 156*91f16700Schasinglulu uint32_t PHY_REGEE; 157*91f16700Schasinglulu uint32_t PHY_REGEF; 158*91f16700Schasinglulu uint32_t PHY_REGFB; 159*91f16700Schasinglulu uint32_t PHY_REGFC; 160*91f16700Schasinglulu uint32_t PHY_REGFD; 161*91f16700Schasinglulu uint32_t PHY_REGFE; 162*91f16700Schasinglulu }; 163*91f16700Schasinglulu 164*91f16700Schasinglulu struct BACKUP_REG_TAG { 165*91f16700Schasinglulu uint32_t tag; 166*91f16700Schasinglulu uint32_t pctladdr; 167*91f16700Schasinglulu struct PCTL_SAVE_REG_TAG pctl; 168*91f16700Schasinglulu uint32_t phyaddr; 169*91f16700Schasinglulu struct DDRPHY_SAVE_REG_TAG phy; 170*91f16700Schasinglulu uint32_t nocaddr; 171*91f16700Schasinglulu struct MSCH_SAVE_REG_TAG noc; 172*91f16700Schasinglulu uint32_t pllselect; 173*91f16700Schasinglulu uint32_t phypllockaddr; 174*91f16700Schasinglulu uint32_t phyplllockmask; 175*91f16700Schasinglulu uint32_t phyplllockval; 176*91f16700Schasinglulu uint32_t pllpdstat; 177*91f16700Schasinglulu uint32_t dpllmodeaddr; 178*91f16700Schasinglulu uint32_t dpllslowmode; 179*91f16700Schasinglulu uint32_t dpllnormalmode; 180*91f16700Schasinglulu uint32_t dpllresetaddr; 181*91f16700Schasinglulu uint32_t dpllreset; 182*91f16700Schasinglulu uint32_t dplldereset; 183*91f16700Schasinglulu uint32_t dpllconaddr; 184*91f16700Schasinglulu uint32_t dpllcon[4]; 185*91f16700Schasinglulu uint32_t dplllockaddr; 186*91f16700Schasinglulu uint32_t dplllockmask; 187*91f16700Schasinglulu uint32_t dplllockval; 188*91f16700Schasinglulu uint32_t ddrpllsrcdivaddr; 189*91f16700Schasinglulu uint32_t ddrpllsrcdiv; 190*91f16700Schasinglulu uint32_t retendisaddr; 191*91f16700Schasinglulu uint32_t retendisval; 192*91f16700Schasinglulu uint32_t grfregaddr; 193*91f16700Schasinglulu uint32_t grfddrcreg; 194*91f16700Schasinglulu uint32_t crupctlphysoftrstaddr; 195*91f16700Schasinglulu uint32_t cruresetpctlphy; 196*91f16700Schasinglulu uint32_t cruderesetphy; 197*91f16700Schasinglulu uint32_t cruderesetpctlphy; 198*91f16700Schasinglulu uint32_t physoftrstaddr; 199*91f16700Schasinglulu uint32_t endtag; 200*91f16700Schasinglulu }; 201*91f16700Schasinglulu 202*91f16700Schasinglulu static uint32_t ddr_get_phy_pll_freq(void) 203*91f16700Schasinglulu { 204*91f16700Schasinglulu uint32_t ret = 0; 205*91f16700Schasinglulu uint32_t fb_div, pre_div; 206*91f16700Schasinglulu 207*91f16700Schasinglulu fb_div = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REGEC); 208*91f16700Schasinglulu fb_div |= (mmio_read_32(DDR_PHY_BASE + DDR_PHY_REGED) & 0x1) << 8; 209*91f16700Schasinglulu 210*91f16700Schasinglulu pre_div = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REGEE) & 0xff; 211*91f16700Schasinglulu ret = 2 * 24 * fb_div / (4 * pre_div); 212*91f16700Schasinglulu 213*91f16700Schasinglulu return ret; 214*91f16700Schasinglulu } 215*91f16700Schasinglulu 216*91f16700Schasinglulu static void ddr_copy(uint32_t *pdest, uint32_t *psrc, uint32_t words) 217*91f16700Schasinglulu { 218*91f16700Schasinglulu uint32_t i; 219*91f16700Schasinglulu 220*91f16700Schasinglulu for (i = 0; i < words; i++) 221*91f16700Schasinglulu pdest[i] = psrc[i]; 222*91f16700Schasinglulu } 223*91f16700Schasinglulu 224*91f16700Schasinglulu static void ddr_get_dpll_cfg(uint32_t *p) 225*91f16700Schasinglulu { 226*91f16700Schasinglulu uint32_t nmhz, NO, NF, NR; 227*91f16700Schasinglulu 228*91f16700Schasinglulu nmhz = ddr_get_phy_pll_freq(); 229*91f16700Schasinglulu if (nmhz <= 150) 230*91f16700Schasinglulu NO = 6; 231*91f16700Schasinglulu else if (nmhz <= 250) 232*91f16700Schasinglulu NO = 4; 233*91f16700Schasinglulu else if (nmhz <= 500) 234*91f16700Schasinglulu NO = 2; 235*91f16700Schasinglulu else 236*91f16700Schasinglulu NO = 1; 237*91f16700Schasinglulu 238*91f16700Schasinglulu NR = 1; 239*91f16700Schasinglulu NF = 2 * nmhz * NR * NO / 24; 240*91f16700Schasinglulu 241*91f16700Schasinglulu p[0] = SET_NR(NR) | SET_NO(NO); 242*91f16700Schasinglulu p[1] = SET_NF(NF); 243*91f16700Schasinglulu p[2] = SET_NB(NF / 2); 244*91f16700Schasinglulu } 245*91f16700Schasinglulu 246*91f16700Schasinglulu void ddr_reg_save(uint32_t pllpdstat, uint64_t base_addr) 247*91f16700Schasinglulu { 248*91f16700Schasinglulu struct BACKUP_REG_TAG *p_ddr_reg = (struct BACKUP_REG_TAG *)base_addr; 249*91f16700Schasinglulu struct PCTL_SAVE_REG_TAG *pctl_tim = &p_ddr_reg->pctl; 250*91f16700Schasinglulu 251*91f16700Schasinglulu p_ddr_reg->tag = 0x56313031; 252*91f16700Schasinglulu p_ddr_reg->pctladdr = DDR_PCTL_BASE; 253*91f16700Schasinglulu p_ddr_reg->phyaddr = DDR_PHY_BASE; 254*91f16700Schasinglulu p_ddr_reg->nocaddr = SERVICE_BUS_BASE; 255*91f16700Schasinglulu 256*91f16700Schasinglulu /* PCTLR */ 257*91f16700Schasinglulu ddr_copy((uint32_t *)&pctl_tim->pctl_timing.TOGCNT1U, 258*91f16700Schasinglulu (uint32_t *)(DDR_PCTL_BASE + DDR_PCTL_TOGCNT1U), 35); 259*91f16700Schasinglulu pctl_tim->pctl_timing.TREFI |= DDR_UPD_REF_ENABLE; 260*91f16700Schasinglulu pctl_tim->SCFG = mmio_read_32(DDR_PCTL_BASE + DDR_PCTL_SCFG); 261*91f16700Schasinglulu pctl_tim->CMDTSTATEN = mmio_read_32(DDR_PCTL_BASE + 262*91f16700Schasinglulu DDR_PCTL_CMDTSTATEN); 263*91f16700Schasinglulu pctl_tim->MCFG1 = mmio_read_32(DDR_PCTL_BASE + DDR_PCTL_MCFG1); 264*91f16700Schasinglulu pctl_tim->MCFG = mmio_read_32(DDR_PCTL_BASE + DDR_PCTL_MCFG); 265*91f16700Schasinglulu pctl_tim->PPCFG = mmio_read_32(DDR_PCTL_BASE + DDR_PCTL_PPCFG); 266*91f16700Schasinglulu pctl_tim->pctl_timing.ddrfreq = mmio_read_32(DDR_PCTL_BASE + 267*91f16700Schasinglulu DDR_PCTL_TOGCNT1U * 2); 268*91f16700Schasinglulu pctl_tim->DFITCTRLDELAY = mmio_read_32(DDR_PCTL_BASE + 269*91f16700Schasinglulu DDR_PCTL_DFITCTRLDELAY); 270*91f16700Schasinglulu pctl_tim->DFIODTCFG = mmio_read_32(DDR_PCTL_BASE + DDR_PCTL_DFIODTCFG); 271*91f16700Schasinglulu pctl_tim->DFIODTCFG1 = mmio_read_32(DDR_PCTL_BASE + 272*91f16700Schasinglulu DDR_PCTL_DFIODTCFG1); 273*91f16700Schasinglulu pctl_tim->DFIODTRANKMAP = mmio_read_32(DDR_PCTL_BASE + 274*91f16700Schasinglulu DDR_PCTL_DFIODTRANKMAP); 275*91f16700Schasinglulu pctl_tim->DFITPHYWRDATA = mmio_read_32(DDR_PCTL_BASE + 276*91f16700Schasinglulu DDR_PCTL_DFITPHYWRDATA); 277*91f16700Schasinglulu pctl_tim->DFITPHYWRLAT = mmio_read_32(DDR_PCTL_BASE + 278*91f16700Schasinglulu DDR_PCTL_DFITPHYWRLAT); 279*91f16700Schasinglulu pctl_tim->DFITPHYWRDATALAT = mmio_read_32(DDR_PCTL_BASE + 280*91f16700Schasinglulu DDR_PCTL_DFITPHYWRDATALAT); 281*91f16700Schasinglulu pctl_tim->DFITRDDATAEN = mmio_read_32(DDR_PCTL_BASE + 282*91f16700Schasinglulu DDR_PCTL_DFITRDDATAEN); 283*91f16700Schasinglulu pctl_tim->DFITPHYRDLAT = mmio_read_32(DDR_PCTL_BASE + 284*91f16700Schasinglulu DDR_PCTL_DFITPHYRDLAT); 285*91f16700Schasinglulu pctl_tim->DFITPHYUPDTYPE0 = mmio_read_32(DDR_PCTL_BASE + 286*91f16700Schasinglulu DDR_PCTL_DFITPHYUPDTYPE0); 287*91f16700Schasinglulu pctl_tim->DFITPHYUPDTYPE1 = mmio_read_32(DDR_PCTL_BASE + 288*91f16700Schasinglulu DDR_PCTL_DFITPHYUPDTYPE1); 289*91f16700Schasinglulu pctl_tim->DFITPHYUPDTYPE2 = mmio_read_32(DDR_PCTL_BASE + 290*91f16700Schasinglulu DDR_PCTL_DFITPHYUPDTYPE2); 291*91f16700Schasinglulu pctl_tim->DFITPHYUPDTYPE3 = mmio_read_32(DDR_PCTL_BASE + 292*91f16700Schasinglulu DDR_PCTL_DFITPHYUPDTYPE3); 293*91f16700Schasinglulu pctl_tim->DFITCTRLUPDMIN = mmio_read_32(DDR_PCTL_BASE + 294*91f16700Schasinglulu DDR_PCTL_DFITCTRLUPDMIN); 295*91f16700Schasinglulu pctl_tim->DFITCTRLUPDMAX = mmio_read_32(DDR_PCTL_BASE + 296*91f16700Schasinglulu DDR_PCTL_DFITCTRLUPDMAX); 297*91f16700Schasinglulu pctl_tim->DFITCTRLUPDDLY = mmio_read_32(DDR_PCTL_BASE + 298*91f16700Schasinglulu DDR_PCTL_DFITCTRLUPDDLY); 299*91f16700Schasinglulu 300*91f16700Schasinglulu pctl_tim->DFIUPDCFG = mmio_read_32(DDR_PCTL_BASE + DDR_PCTL_DFIUPDCFG); 301*91f16700Schasinglulu pctl_tim->DFITREFMSKI = mmio_read_32(DDR_PCTL_BASE + 302*91f16700Schasinglulu DDR_PCTL_DFITREFMSKI); 303*91f16700Schasinglulu pctl_tim->DFITCTRLUPDI = mmio_read_32(DDR_PCTL_BASE + 304*91f16700Schasinglulu DDR_PCTL_DFITCTRLUPDI); 305*91f16700Schasinglulu pctl_tim->DFISTCFG0 = mmio_read_32(DDR_PCTL_BASE + DDR_PCTL_DFISTCFG0); 306*91f16700Schasinglulu pctl_tim->DFISTCFG1 = mmio_read_32(DDR_PCTL_BASE + DDR_PCTL_DFISTCFG1); 307*91f16700Schasinglulu pctl_tim->DFITDRAMCLKEN = mmio_read_32(DDR_PCTL_BASE + 308*91f16700Schasinglulu DDR_PCTL_DFITDRAMCLKEN); 309*91f16700Schasinglulu pctl_tim->DFITDRAMCLKDIS = mmio_read_32(DDR_PCTL_BASE + 310*91f16700Schasinglulu DDR_PCTL_DFITDRAMCLKDIS); 311*91f16700Schasinglulu pctl_tim->DFISTCFG2 = mmio_read_32(DDR_PCTL_BASE + DDR_PCTL_DFISTCFG2); 312*91f16700Schasinglulu pctl_tim->DFILPCFG0 = mmio_read_32(DDR_PCTL_BASE + DDR_PCTL_DFILPCFG0); 313*91f16700Schasinglulu 314*91f16700Schasinglulu /* PHY */ 315*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG0 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG0); 316*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG1 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG1); 317*91f16700Schasinglulu p_ddr_reg->phy.PHY_REGB = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REGB); 318*91f16700Schasinglulu p_ddr_reg->phy.PHY_REGC = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REGC); 319*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG11 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG11); 320*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG13 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG13); 321*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG14 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG14); 322*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG16 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG16); 323*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG20 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG20); 324*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG21 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG21); 325*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG26 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG26); 326*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG27 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG27); 327*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG28 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG28); 328*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG30 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG30); 329*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG31 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG31); 330*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG36 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG36); 331*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG37 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG37); 332*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG38 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG38); 333*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG40 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG40); 334*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG41 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG41); 335*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG46 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG46); 336*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG47 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG47); 337*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG48 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG48); 338*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG50 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG50); 339*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG51 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG51); 340*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG56 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG56); 341*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG57 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG57); 342*91f16700Schasinglulu p_ddr_reg->phy.PHY_REG58 = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG58); 343*91f16700Schasinglulu p_ddr_reg->phy.PHY_REGDLL = mmio_read_32(DDR_PHY_BASE + 344*91f16700Schasinglulu DDR_PHY_REGDLL); 345*91f16700Schasinglulu p_ddr_reg->phy.PHY_REGEC = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REGEC); 346*91f16700Schasinglulu p_ddr_reg->phy.PHY_REGED = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REGED); 347*91f16700Schasinglulu p_ddr_reg->phy.PHY_REGEE = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REGEE); 348*91f16700Schasinglulu p_ddr_reg->phy.PHY_REGEF = 0; 349*91f16700Schasinglulu 350*91f16700Schasinglulu if (mmio_read_32(DDR_PHY_BASE + DDR_PHY_REG2) & 0x2) { 351*91f16700Schasinglulu p_ddr_reg->phy.PHY_REGFB = mmio_read_32(DDR_PHY_BASE + 352*91f16700Schasinglulu DDR_PHY_REG2C); 353*91f16700Schasinglulu p_ddr_reg->phy.PHY_REGFC = mmio_read_32(DDR_PHY_BASE + 354*91f16700Schasinglulu DDR_PHY_REG3C); 355*91f16700Schasinglulu p_ddr_reg->phy.PHY_REGFD = mmio_read_32(DDR_PHY_BASE + 356*91f16700Schasinglulu DDR_PHY_REG4C); 357*91f16700Schasinglulu p_ddr_reg->phy.PHY_REGFE = mmio_read_32(DDR_PHY_BASE + 358*91f16700Schasinglulu DDR_PHY_REG5C); 359*91f16700Schasinglulu } else { 360*91f16700Schasinglulu p_ddr_reg->phy.PHY_REGFB = mmio_read_32(DDR_PHY_BASE + 361*91f16700Schasinglulu DDR_PHY_REGFB); 362*91f16700Schasinglulu p_ddr_reg->phy.PHY_REGFC = mmio_read_32(DDR_PHY_BASE + 363*91f16700Schasinglulu DDR_PHY_REGFC); 364*91f16700Schasinglulu p_ddr_reg->phy.PHY_REGFD = mmio_read_32(DDR_PHY_BASE + 365*91f16700Schasinglulu DDR_PHY_REGFD); 366*91f16700Schasinglulu p_ddr_reg->phy.PHY_REGFE = mmio_read_32(DDR_PHY_BASE + 367*91f16700Schasinglulu DDR_PHY_REGFE); 368*91f16700Schasinglulu } 369*91f16700Schasinglulu 370*91f16700Schasinglulu /* NOC */ 371*91f16700Schasinglulu p_ddr_reg->noc.ddrconf = mmio_read_32(SERVICE_BUS_BASE + MSCH_DDRCONF); 372*91f16700Schasinglulu p_ddr_reg->noc.ddrtiming = mmio_read_32(SERVICE_BUS_BASE + 373*91f16700Schasinglulu MSCH_DDRTIMING); 374*91f16700Schasinglulu p_ddr_reg->noc.ddrmode = mmio_read_32(SERVICE_BUS_BASE + MSCH_DDRMODE); 375*91f16700Schasinglulu p_ddr_reg->noc.readlatency = mmio_read_32(SERVICE_BUS_BASE + 376*91f16700Schasinglulu MSCH_READLATENCY); 377*91f16700Schasinglulu p_ddr_reg->noc.activate = mmio_read_32(SERVICE_BUS_BASE + 378*91f16700Schasinglulu MSCH_ACTIVATE); 379*91f16700Schasinglulu p_ddr_reg->noc.devtodev = mmio_read_32(SERVICE_BUS_BASE + 380*91f16700Schasinglulu MSCH_DEVTODEV); 381*91f16700Schasinglulu 382*91f16700Schasinglulu p_ddr_reg->pllselect = mmio_read_32(DDR_PHY_BASE + DDR_PHY_REGEE) * 0x1; 383*91f16700Schasinglulu p_ddr_reg->phypllockaddr = GRF_BASE + GRF_SOC_STATUS0; 384*91f16700Schasinglulu p_ddr_reg->phyplllockmask = GRF_DDRPHY_LOCK; 385*91f16700Schasinglulu p_ddr_reg->phyplllockval = 0; 386*91f16700Schasinglulu 387*91f16700Schasinglulu /* PLLPD */ 388*91f16700Schasinglulu p_ddr_reg->pllpdstat = pllpdstat; 389*91f16700Schasinglulu /* DPLL */ 390*91f16700Schasinglulu p_ddr_reg->dpllmodeaddr = CRU_BASE + PLL_CONS(DPLL_ID, 3); 391*91f16700Schasinglulu /* slow mode and power on */ 392*91f16700Schasinglulu p_ddr_reg->dpllslowmode = DPLL_WORK_SLOW_MODE | DPLL_POWER_DOWN; 393*91f16700Schasinglulu p_ddr_reg->dpllnormalmode = DPLL_WORK_NORMAL_MODE; 394*91f16700Schasinglulu p_ddr_reg->dpllresetaddr = CRU_BASE + PLL_CONS(DPLL_ID, 3); 395*91f16700Schasinglulu p_ddr_reg->dpllreset = DPLL_RESET_CONTROL_NORMAL; 396*91f16700Schasinglulu p_ddr_reg->dplldereset = DPLL_RESET_CONTROL_RESET; 397*91f16700Schasinglulu p_ddr_reg->dpllconaddr = CRU_BASE + PLL_CONS(DPLL_ID, 0); 398*91f16700Schasinglulu 399*91f16700Schasinglulu if (p_ddr_reg->pllselect == 0) { 400*91f16700Schasinglulu p_ddr_reg->dpllcon[0] = (mmio_read_32(CRU_BASE + 401*91f16700Schasinglulu PLL_CONS(DPLL_ID, 0)) 402*91f16700Schasinglulu & 0xffff) | 403*91f16700Schasinglulu (0xFFFFu << 16); 404*91f16700Schasinglulu p_ddr_reg->dpllcon[1] = (mmio_read_32(CRU_BASE + 405*91f16700Schasinglulu PLL_CONS(DPLL_ID, 1)) 406*91f16700Schasinglulu & 0xffff); 407*91f16700Schasinglulu p_ddr_reg->dpllcon[2] = (mmio_read_32(CRU_BASE + 408*91f16700Schasinglulu PLL_CONS(DPLL_ID, 2)) 409*91f16700Schasinglulu & 0xffff); 410*91f16700Schasinglulu p_ddr_reg->dpllcon[3] = (mmio_read_32(CRU_BASE + 411*91f16700Schasinglulu PLL_CONS(DPLL_ID, 3)) 412*91f16700Schasinglulu & 0xffff) | 413*91f16700Schasinglulu (0xFFFFu << 16); 414*91f16700Schasinglulu } else { 415*91f16700Schasinglulu ddr_get_dpll_cfg(&p_ddr_reg->dpllcon[0]); 416*91f16700Schasinglulu } 417*91f16700Schasinglulu 418*91f16700Schasinglulu p_ddr_reg->pllselect = 0; 419*91f16700Schasinglulu p_ddr_reg->dplllockaddr = CRU_BASE + PLL_CONS(DPLL_ID, 1); 420*91f16700Schasinglulu p_ddr_reg->dplllockmask = DPLL_STATUS_LOCK; 421*91f16700Schasinglulu p_ddr_reg->dplllockval = DPLL_STATUS_LOCK; 422*91f16700Schasinglulu 423*91f16700Schasinglulu /* SET_DDR_PLL_SRC */ 424*91f16700Schasinglulu p_ddr_reg->ddrpllsrcdivaddr = CRU_BASE + CRU_CLKSELS_CON(13); 425*91f16700Schasinglulu p_ddr_reg->ddrpllsrcdiv = (mmio_read_32(CRU_BASE + CRU_CLKSELS_CON(13)) 426*91f16700Schasinglulu & DDR_PLL_SRC_MASK) 427*91f16700Schasinglulu | (DDR_PLL_SRC_MASK << 16); 428*91f16700Schasinglulu p_ddr_reg->retendisaddr = PMU_BASE + PMU_PWRMD_COM; 429*91f16700Schasinglulu p_ddr_reg->retendisval = PD_PERI_PWRDN_ENABLE; 430*91f16700Schasinglulu p_ddr_reg->grfregaddr = GRF_BASE + GRF_DDRC0_CON0; 431*91f16700Schasinglulu p_ddr_reg->grfddrcreg = (mmio_read_32(GRF_BASE + GRF_DDRC0_CON0) & 432*91f16700Schasinglulu DDR_PLL_SRC_MASK) | 433*91f16700Schasinglulu (DDR_PLL_SRC_MASK << 16); 434*91f16700Schasinglulu 435*91f16700Schasinglulu /* pctl phy soft reset */ 436*91f16700Schasinglulu p_ddr_reg->crupctlphysoftrstaddr = CRU_BASE + CRU_SOFTRSTS_CON(10); 437*91f16700Schasinglulu p_ddr_reg->cruresetpctlphy = DDRCTRL0_PSRSTN_REQ(1) | 438*91f16700Schasinglulu DDRCTRL0_SRSTN_REQ(1) | 439*91f16700Schasinglulu DDRPHY0_PSRSTN_REQ(1) | 440*91f16700Schasinglulu DDRPHY0_SRSTN_REQ(1); 441*91f16700Schasinglulu p_ddr_reg->cruderesetphy = DDRCTRL0_PSRSTN_REQ(1) | 442*91f16700Schasinglulu DDRCTRL0_SRSTN_REQ(1) | 443*91f16700Schasinglulu DDRPHY0_PSRSTN_REQ(0) | 444*91f16700Schasinglulu DDRPHY0_SRSTN_REQ(0); 445*91f16700Schasinglulu 446*91f16700Schasinglulu p_ddr_reg->cruderesetpctlphy = DDRCTRL0_PSRSTN_REQ(0) | 447*91f16700Schasinglulu DDRCTRL0_SRSTN_REQ(0) | 448*91f16700Schasinglulu DDRPHY0_PSRSTN_REQ(0) | 449*91f16700Schasinglulu DDRPHY0_SRSTN_REQ(0); 450*91f16700Schasinglulu 451*91f16700Schasinglulu p_ddr_reg->physoftrstaddr = DDR_PHY_BASE + DDR_PHY_REG0; 452*91f16700Schasinglulu 453*91f16700Schasinglulu p_ddr_reg->endtag = 0xFFFFFFFF; 454*91f16700Schasinglulu } 455*91f16700Schasinglulu 456*91f16700Schasinglulu /* 457*91f16700Schasinglulu * "rk3368_ddr_reg_resume_V1.05.bin" is an executable bin which is generated 458*91f16700Schasinglulu * by ARM DS5 for resuming ddr controller. If the soc wakes up from system 459*91f16700Schasinglulu * suspend, ddr needs to be resumed and the resuming code needs to be run in 460*91f16700Schasinglulu * sram. But there is not a way to pointing the resuming code to the PMUSRAM 461*91f16700Schasinglulu * when linking .o files of bl31, so we use the 462*91f16700Schasinglulu * "rk3368_ddr_reg_resume_V1.05.bin" whose code is position-independent and 463*91f16700Schasinglulu * it can be loaded anywhere and run. 464*91f16700Schasinglulu */ 465*91f16700Schasinglulu static __aligned(4) unsigned int ddr_reg_resume[] = { 466*91f16700Schasinglulu #include "rk3368_ddr_reg_resume_V1.05.bin" 467*91f16700Schasinglulu }; 468*91f16700Schasinglulu 469*91f16700Schasinglulu uint32_t ddr_get_resume_code_size(void) 470*91f16700Schasinglulu { 471*91f16700Schasinglulu return sizeof(ddr_reg_resume); 472*91f16700Schasinglulu } 473*91f16700Schasinglulu 474*91f16700Schasinglulu uint32_t ddr_get_resume_data_size(void) 475*91f16700Schasinglulu { 476*91f16700Schasinglulu return sizeof(struct BACKUP_REG_TAG); 477*91f16700Schasinglulu } 478*91f16700Schasinglulu 479*91f16700Schasinglulu uint32_t *ddr_get_resume_code_base(void) 480*91f16700Schasinglulu { 481*91f16700Schasinglulu return (unsigned int *)ddr_reg_resume; 482*91f16700Schasinglulu } 483