1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <assert.h> 8*91f16700Schasinglulu #include <errno.h> 9*91f16700Schasinglulu 10*91f16700Schasinglulu #include <arch_helpers.h> 11*91f16700Schasinglulu #include <common/debug.h> 12*91f16700Schasinglulu #include <drivers/arm/sp804_delay_timer.h> 13*91f16700Schasinglulu #include <lib/mmio.h> 14*91f16700Schasinglulu 15*91f16700Schasinglulu #include <hi6220.h> 16*91f16700Schasinglulu #include <hi6553.h> 17*91f16700Schasinglulu #include <hisi_sram_map.h> 18*91f16700Schasinglulu #include "hikey_private.h" 19*91f16700Schasinglulu 20*91f16700Schasinglulu static void init_pll(void) 21*91f16700Schasinglulu { 22*91f16700Schasinglulu unsigned int data; 23*91f16700Schasinglulu 24*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x000)); 25*91f16700Schasinglulu data |= 0x1; 26*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x000), data); 27*91f16700Schasinglulu do { 28*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x000)); 29*91f16700Schasinglulu } while (!(data & (1 << 28))); 30*91f16700Schasinglulu 31*91f16700Schasinglulu data = mmio_read_32((0xf7800000 + 0x000)); 32*91f16700Schasinglulu data &= ~0x007; 33*91f16700Schasinglulu data |= 0x004; 34*91f16700Schasinglulu mmio_write_32((0xf7800000 + 0x000), data); 35*91f16700Schasinglulu do { 36*91f16700Schasinglulu data = mmio_read_32((0xf7800000 + 0x014)); 37*91f16700Schasinglulu data &= 0x007; 38*91f16700Schasinglulu } while (data != 0x004); 39*91f16700Schasinglulu 40*91f16700Schasinglulu mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2101); 41*91f16700Schasinglulu dsb(); 42*91f16700Schasinglulu isb(); 43*91f16700Schasinglulu udelay(10); 44*91f16700Schasinglulu mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2001); 45*91f16700Schasinglulu dsb(); 46*91f16700Schasinglulu isb(); 47*91f16700Schasinglulu udelay(10); 48*91f16700Schasinglulu mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2201); 49*91f16700Schasinglulu dsb(); 50*91f16700Schasinglulu isb(); 51*91f16700Schasinglulu udelay(10); 52*91f16700Schasinglulu mmio_write_32(0xf7032000 + 0x02c, 0x5110103e); 53*91f16700Schasinglulu dsb(); 54*91f16700Schasinglulu isb(); 55*91f16700Schasinglulu udelay(10); 56*91f16700Schasinglulu data = mmio_read_32(0xf7032000 + 0x050); 57*91f16700Schasinglulu data |= 1 << 28; 58*91f16700Schasinglulu mmio_write_32(0xf7032000 + 0x050, data); 59*91f16700Schasinglulu dsb(); 60*91f16700Schasinglulu isb(); 61*91f16700Schasinglulu udelay(10); 62*91f16700Schasinglulu mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2101); 63*91f16700Schasinglulu dsb(); 64*91f16700Schasinglulu isb(); 65*91f16700Schasinglulu udelay(10); 66*91f16700Schasinglulu mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2001); 67*91f16700Schasinglulu dsb(); 68*91f16700Schasinglulu isb(); 69*91f16700Schasinglulu udelay(10); 70*91f16700Schasinglulu mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2201); 71*91f16700Schasinglulu dsb(); 72*91f16700Schasinglulu isb(); 73*91f16700Schasinglulu udelay(10); 74*91f16700Schasinglulu } 75*91f16700Schasinglulu 76*91f16700Schasinglulu static void init_freq(void) 77*91f16700Schasinglulu { 78*91f16700Schasinglulu unsigned int data, tmp; 79*91f16700Schasinglulu unsigned int cpuext_cfg, ddr_cfg; 80*91f16700Schasinglulu 81*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x374), 0x4a); 82*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x368), 0xda); 83*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x36c), 0x01); 84*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x370), 0x01); 85*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x360), 0x60); 86*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x364), 0x60); 87*91f16700Schasinglulu 88*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x114), 0x1000); 89*91f16700Schasinglulu 90*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x110)); 91*91f16700Schasinglulu data |= (3 << 12); 92*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x110), data); 93*91f16700Schasinglulu 94*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x110)); 95*91f16700Schasinglulu data |= (1 << 4); 96*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x110), data); 97*91f16700Schasinglulu 98*91f16700Schasinglulu 99*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x110)); 100*91f16700Schasinglulu data &= ~0x7; 101*91f16700Schasinglulu data |= 0x5; 102*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x110), data); 103*91f16700Schasinglulu dsb(); 104*91f16700Schasinglulu mdelay(10); 105*91f16700Schasinglulu 106*91f16700Schasinglulu 107*91f16700Schasinglulu do { 108*91f16700Schasinglulu data = mmio_read_32((0xf6504000 + 0x008)); 109*91f16700Schasinglulu data &= (3 << 20); 110*91f16700Schasinglulu } while (data != (3 << 20)); 111*91f16700Schasinglulu dsb(); 112*91f16700Schasinglulu mdelay(10); 113*91f16700Schasinglulu 114*91f16700Schasinglulu 115*91f16700Schasinglulu data = mmio_read_32((0xf6504000 + 0x054)); 116*91f16700Schasinglulu data &= ~((1 << 0) | (1 << 11)); 117*91f16700Schasinglulu mmio_write_32((0xf6504000 + 0x054), data); 118*91f16700Schasinglulu mdelay(10); 119*91f16700Schasinglulu 120*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x104)); 121*91f16700Schasinglulu data &= ~(3 << 8); 122*91f16700Schasinglulu data |= (1 << 8); 123*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x104), data); 124*91f16700Schasinglulu 125*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x100)); 126*91f16700Schasinglulu data |= (1 << 0); 127*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x100), data); 128*91f16700Schasinglulu dsb(); 129*91f16700Schasinglulu 130*91f16700Schasinglulu do { 131*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x100)); 132*91f16700Schasinglulu data &= (1 << 2); 133*91f16700Schasinglulu } while (data != (1 << 2)); 134*91f16700Schasinglulu 135*91f16700Schasinglulu data = mmio_read_32((0xf6504000 + 0x06c)); 136*91f16700Schasinglulu data &= ~0xffff; 137*91f16700Schasinglulu data |= 0x56; 138*91f16700Schasinglulu mmio_write_32((0xf6504000 + 0x06c), data); 139*91f16700Schasinglulu 140*91f16700Schasinglulu data = mmio_read_32((0xf6504000 + 0x06c)); 141*91f16700Schasinglulu data &= ~(0xffffffu << 8); 142*91f16700Schasinglulu data |= 0xc7a << 8; 143*91f16700Schasinglulu mmio_write_32((0xf6504000 + 0x06c), data); 144*91f16700Schasinglulu 145*91f16700Schasinglulu data = mmio_read_32((0xf6504000 + 0x058)); 146*91f16700Schasinglulu data &= ((1 << 13) - 1); 147*91f16700Schasinglulu data |= 0xccb; 148*91f16700Schasinglulu mmio_write_32((0xf6504000 + 0x058), data); 149*91f16700Schasinglulu 150*91f16700Schasinglulu mmio_write_32((0xf6504000 + 0x060), 0x1fff); 151*91f16700Schasinglulu mmio_write_32((0xf6504000 + 0x064), 0x1ffffff); 152*91f16700Schasinglulu mmio_write_32((0xf6504000 + 0x068), 0x7fffffff); 153*91f16700Schasinglulu mmio_write_32((0xf6504000 + 0x05c), 0x1); 154*91f16700Schasinglulu 155*91f16700Schasinglulu data = mmio_read_32((0xf6504000 + 0x054)); 156*91f16700Schasinglulu data &= ~(0xf << 12); 157*91f16700Schasinglulu data |= 1 << 12; 158*91f16700Schasinglulu mmio_write_32((0xf6504000 + 0x054), data); 159*91f16700Schasinglulu dsb(); 160*91f16700Schasinglulu 161*91f16700Schasinglulu 162*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x000)); 163*91f16700Schasinglulu data &= ~(1 << 0); 164*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x000), data); 165*91f16700Schasinglulu 166*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x004), 0x5110207d); 167*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x134), 0x10000005); 168*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x134)); 169*91f16700Schasinglulu 170*91f16700Schasinglulu 171*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x000)); 172*91f16700Schasinglulu data |= (1 << 0); 173*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x000), data); 174*91f16700Schasinglulu 175*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x368), 0x100da); 176*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x378)); 177*91f16700Schasinglulu data &= ~((1 << 7) - 1); 178*91f16700Schasinglulu data |= 0x6b; 179*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x378), data); 180*91f16700Schasinglulu dsb(); 181*91f16700Schasinglulu do { 182*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x378)); 183*91f16700Schasinglulu tmp = data & 0x7f; 184*91f16700Schasinglulu data = (data & (0x7f << 8)) >> 8; 185*91f16700Schasinglulu if (data != tmp) 186*91f16700Schasinglulu continue; 187*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x37c)); 188*91f16700Schasinglulu } while (!(data & 1)); 189*91f16700Schasinglulu 190*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x104)); 191*91f16700Schasinglulu data &= ~((3 << 0) | 192*91f16700Schasinglulu (3 << 8)); 193*91f16700Schasinglulu cpuext_cfg = 1; 194*91f16700Schasinglulu ddr_cfg = 1; 195*91f16700Schasinglulu data |= cpuext_cfg | (ddr_cfg << 8); 196*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x104), data); 197*91f16700Schasinglulu dsb(); 198*91f16700Schasinglulu 199*91f16700Schasinglulu do { 200*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x104)); 201*91f16700Schasinglulu tmp = (data & (3 << 16)) >> 16; 202*91f16700Schasinglulu if (cpuext_cfg != tmp) 203*91f16700Schasinglulu continue; 204*91f16700Schasinglulu tmp = (data & (3 << 24)) >> 24; 205*91f16700Schasinglulu if (ddr_cfg != tmp) 206*91f16700Schasinglulu continue; 207*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x000)); 208*91f16700Schasinglulu data &= 1 << 28; 209*91f16700Schasinglulu } while (!data); 210*91f16700Schasinglulu 211*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x100)); 212*91f16700Schasinglulu data &= ~(1 << 0); 213*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x100), data); 214*91f16700Schasinglulu dsb(); 215*91f16700Schasinglulu do { 216*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x100)); 217*91f16700Schasinglulu data &= (1 << 1); 218*91f16700Schasinglulu } while (data != (1 << 1)); 219*91f16700Schasinglulu mdelay(1000); 220*91f16700Schasinglulu 221*91f16700Schasinglulu data = mmio_read_32((0xf6504000 + 0x054)); 222*91f16700Schasinglulu data &= ~(1 << 28); 223*91f16700Schasinglulu mmio_write_32((0xf6504000 + 0x054), data); 224*91f16700Schasinglulu dsb(); 225*91f16700Schasinglulu 226*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x110)); 227*91f16700Schasinglulu data &= ~((1 << 4) | 228*91f16700Schasinglulu (3 << 12)); 229*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x110), data); 230*91f16700Schasinglulu } 231*91f16700Schasinglulu 232*91f16700Schasinglulu int cat_533mhz_800mhz(void) 233*91f16700Schasinglulu { 234*91f16700Schasinglulu unsigned int data, i; 235*91f16700Schasinglulu unsigned int bdl[5]; 236*91f16700Schasinglulu 237*91f16700Schasinglulu 238*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x1c8)); 239*91f16700Schasinglulu data &= 0xfffff0f0; 240*91f16700Schasinglulu data |= 0x100f01; 241*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x1c8), data); 242*91f16700Schasinglulu 243*91f16700Schasinglulu for (i = 0; i < 0x20; i++) { 244*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 245*91f16700Schasinglulu data = (i << 0x10) + i; 246*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x140), data); 247*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x144), data); 248*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x148), data); 249*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x14c), data); 250*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x150), data); 251*91f16700Schasinglulu 252*91f16700Schasinglulu 253*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x070)); 254*91f16700Schasinglulu data |= 0x80000; 255*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x070), data); 256*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x070)); 257*91f16700Schasinglulu data &= 0xfff7ffff; 258*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x070), data); 259*91f16700Schasinglulu 260*91f16700Schasinglulu 261*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x8000); 262*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x0); 263*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x801); 264*91f16700Schasinglulu do { 265*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x004)); 266*91f16700Schasinglulu } while (data & 1); 267*91f16700Schasinglulu 268*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x008)); 269*91f16700Schasinglulu if ((data & 0x400) == 0) { 270*91f16700Schasinglulu mdelay(10); 271*91f16700Schasinglulu return 0; 272*91f16700Schasinglulu } 273*91f16700Schasinglulu WARN("lpddr3 cat fail\n"); 274*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x1d4)); 275*91f16700Schasinglulu if ((data & 0x1f00) && ((data & 0x1f) == 0)) { 276*91f16700Schasinglulu bdl[0] = mmio_read_32((0xf712c000 + 0x140)); 277*91f16700Schasinglulu bdl[1] = mmio_read_32((0xf712c000 + 0x144)); 278*91f16700Schasinglulu bdl[2] = mmio_read_32((0xf712c000 + 0x148)); 279*91f16700Schasinglulu bdl[3] = mmio_read_32((0xf712c000 + 0x14c)); 280*91f16700Schasinglulu bdl[4] = mmio_read_32((0xf712c000 + 0x150)); 281*91f16700Schasinglulu if ((!(bdl[0] & 0x1f001f)) || (!(bdl[1] & 0x1f001f)) || 282*91f16700Schasinglulu (!(bdl[2] & 0x1f001f)) || (!(bdl[3] & 0x1f001f)) || 283*91f16700Schasinglulu (!(bdl[4] & 0x1f001f))) { 284*91f16700Schasinglulu WARN("lpddr3 cat deskew error\n"); 285*91f16700Schasinglulu if (i == 0x1f) { 286*91f16700Schasinglulu WARN("addrnbdl is max\n"); 287*91f16700Schasinglulu return -EINVAL; 288*91f16700Schasinglulu } 289*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x008), 0x400); 290*91f16700Schasinglulu } else { 291*91f16700Schasinglulu WARN("lpddr3 cat other error1\n"); 292*91f16700Schasinglulu return -EINVAL; 293*91f16700Schasinglulu } 294*91f16700Schasinglulu } else { 295*91f16700Schasinglulu WARN("lpddr3 cat other error2\n"); 296*91f16700Schasinglulu return -EINVAL; 297*91f16700Schasinglulu } 298*91f16700Schasinglulu } 299*91f16700Schasinglulu return -EINVAL; 300*91f16700Schasinglulu } 301*91f16700Schasinglulu 302*91f16700Schasinglulu static void ddrx_rdet(void) 303*91f16700Schasinglulu { 304*91f16700Schasinglulu unsigned int data, rdet, bdl[4]; 305*91f16700Schasinglulu 306*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x0d0)); 307*91f16700Schasinglulu data &= 0xf800ffff; 308*91f16700Schasinglulu data |= 0x8f0000; 309*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x0d0), data); 310*91f16700Schasinglulu 311*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x0dc)); 312*91f16700Schasinglulu data &= 0xfffffff0; 313*91f16700Schasinglulu data |= 0xf; 314*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x0dc), data); 315*91f16700Schasinglulu 316*91f16700Schasinglulu 317*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x070)); 318*91f16700Schasinglulu data |= 0x80000; 319*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x070), data); 320*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x070)); 321*91f16700Schasinglulu data &= 0xfff7ffff; 322*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x070), data); 323*91f16700Schasinglulu 324*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x8000); 325*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0); 326*91f16700Schasinglulu 327*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x0d0)); 328*91f16700Schasinglulu data &= ~0xf0000000; 329*91f16700Schasinglulu data |= 0x80000000; 330*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x0d0), data); 331*91f16700Schasinglulu 332*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x101); 333*91f16700Schasinglulu do { 334*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x004)); 335*91f16700Schasinglulu } while (!(data & 1)); 336*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x008)); 337*91f16700Schasinglulu if (data & 0x100) 338*91f16700Schasinglulu WARN("rdet lbs fail\n"); 339*91f16700Schasinglulu 340*91f16700Schasinglulu bdl[0] = mmio_read_32((0xf712c000 + 0x22c)) & 0x7f; 341*91f16700Schasinglulu bdl[1] = mmio_read_32((0xf712c000 + 0x2ac)) & 0x7f; 342*91f16700Schasinglulu bdl[2] = mmio_read_32((0xf712c000 + 0x32c)) & 0x7f; 343*91f16700Schasinglulu bdl[3] = mmio_read_32((0xf712c000 + 0x3ac)) & 0x7f; 344*91f16700Schasinglulu do { 345*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x22c)); 346*91f16700Schasinglulu data &= ~0x7f; 347*91f16700Schasinglulu data |= bdl[0]; 348*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x22c), data); 349*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x2ac)); 350*91f16700Schasinglulu data &= ~0x7f; 351*91f16700Schasinglulu data |= bdl[1]; 352*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x2ac), data); 353*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x32c)); 354*91f16700Schasinglulu data &= ~0x7f; 355*91f16700Schasinglulu data |= bdl[2]; 356*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x32c), data); 357*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x3ac)); 358*91f16700Schasinglulu data &= ~0x7f; 359*91f16700Schasinglulu data |= bdl[3]; 360*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x3ac), data); 361*91f16700Schasinglulu 362*91f16700Schasinglulu 363*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x070)); 364*91f16700Schasinglulu data |= 0x80000; 365*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x070), data); 366*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x070)); 367*91f16700Schasinglulu data &= 0xfff7ffff; 368*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x070), data); 369*91f16700Schasinglulu 370*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x8000); 371*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0); 372*91f16700Schasinglulu 373*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x0d0)); 374*91f16700Schasinglulu data &= ~0xf0000000; 375*91f16700Schasinglulu data |= 0x40000000; 376*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x0d0), data); 377*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x101); 378*91f16700Schasinglulu do { 379*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x004)); 380*91f16700Schasinglulu } while (data & 1); 381*91f16700Schasinglulu 382*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x008)); 383*91f16700Schasinglulu rdet = data & 0x100; 384*91f16700Schasinglulu if (rdet) { 385*91f16700Schasinglulu INFO("rdet ds fail\n"); 386*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x008), 0x100); 387*91f16700Schasinglulu } 388*91f16700Schasinglulu bdl[0]++; 389*91f16700Schasinglulu bdl[1]++; 390*91f16700Schasinglulu bdl[2]++; 391*91f16700Schasinglulu bdl[3]++; 392*91f16700Schasinglulu } while (rdet); 393*91f16700Schasinglulu 394*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x0d0)); 395*91f16700Schasinglulu data &= ~0xf0000000; 396*91f16700Schasinglulu data |= 0x30000000; 397*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x0d0), data); 398*91f16700Schasinglulu 399*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x101); 400*91f16700Schasinglulu do { 401*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x004)); 402*91f16700Schasinglulu } while (data & 1); 403*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x008)); 404*91f16700Schasinglulu if (data & 0x100) 405*91f16700Schasinglulu INFO("rdet rbs av fail\n"); 406*91f16700Schasinglulu } 407*91f16700Schasinglulu 408*91f16700Schasinglulu static void ddrx_wdet(void) 409*91f16700Schasinglulu { 410*91f16700Schasinglulu unsigned int data, wdet, zero_bdl = 0, dq[4]; 411*91f16700Schasinglulu int i; 412*91f16700Schasinglulu 413*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x0d0)); 414*91f16700Schasinglulu data &= ~0xf; 415*91f16700Schasinglulu data |= 0xf; 416*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x0d0), data); 417*91f16700Schasinglulu 418*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x070)); 419*91f16700Schasinglulu data |= 0x80000; 420*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x070), data); 421*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x070)); 422*91f16700Schasinglulu data &= ~0x80000; 423*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x070), data); 424*91f16700Schasinglulu 425*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x8000); 426*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0); 427*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x0d0)); 428*91f16700Schasinglulu data &= ~0xf000; 429*91f16700Schasinglulu data |= 0x8000; 430*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x0d0), data); 431*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x201); 432*91f16700Schasinglulu do { 433*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x004)); 434*91f16700Schasinglulu } while (data & 1); 435*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x008)); 436*91f16700Schasinglulu if (data & 0x200) 437*91f16700Schasinglulu INFO("wdet lbs fail\n"); 438*91f16700Schasinglulu 439*91f16700Schasinglulu dq[0] = mmio_read_32((0xf712c000 + 0x234)) & 0x1f00; 440*91f16700Schasinglulu dq[1] = mmio_read_32((0xf712c000 + 0x2b4)) & 0x1f00; 441*91f16700Schasinglulu dq[2] = mmio_read_32((0xf712c000 + 0x334)) & 0x1f00; 442*91f16700Schasinglulu dq[3] = mmio_read_32((0xf712c000 + 0x3b4)) & 0x1f00; 443*91f16700Schasinglulu 444*91f16700Schasinglulu do { 445*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x234), dq[0]); 446*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x2b4), dq[1]); 447*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x334), dq[2]); 448*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x3b4), dq[3]); 449*91f16700Schasinglulu 450*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x070)); 451*91f16700Schasinglulu data |= 0x80000; 452*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x070), data); 453*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x070)); 454*91f16700Schasinglulu data &= ~0x80000; 455*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x070), data); 456*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x8000); 457*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0); 458*91f16700Schasinglulu 459*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x0d0)); 460*91f16700Schasinglulu data &= ~0xf000; 461*91f16700Schasinglulu data |= 0x4000; 462*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x0d0), data); 463*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x201); 464*91f16700Schasinglulu do { 465*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x004)); 466*91f16700Schasinglulu } while (data & 1); 467*91f16700Schasinglulu 468*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x008)); 469*91f16700Schasinglulu wdet = data & 0x200; 470*91f16700Schasinglulu if (wdet) { 471*91f16700Schasinglulu INFO("wdet ds fail\n"); 472*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x008), 0x200); 473*91f16700Schasinglulu } 474*91f16700Schasinglulu mdelay(10); 475*91f16700Schasinglulu 476*91f16700Schasinglulu for (i = 0; i < 4; i++) { 477*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x210 + i * 0x80)); 478*91f16700Schasinglulu if ((!(data & 0x1f)) || (!(data & 0x1f00)) || 479*91f16700Schasinglulu (!(data & 0x1f0000)) || (!(data & 0x1f000000))) 480*91f16700Schasinglulu zero_bdl = 1; 481*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x214 + i * 0x80)); 482*91f16700Schasinglulu if ((!(data & 0x1f)) || (!(data & 0x1f00)) || 483*91f16700Schasinglulu (!(data & 0x1f0000)) || (!(data & 0x1f000000))) 484*91f16700Schasinglulu zero_bdl = 1; 485*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x218 + i * 0x80)); 486*91f16700Schasinglulu if (!(data & 0x1f)) 487*91f16700Schasinglulu zero_bdl = 1; 488*91f16700Schasinglulu if (zero_bdl) { 489*91f16700Schasinglulu if (i == 0) 490*91f16700Schasinglulu dq[0] = dq[0] - 0x100; 491*91f16700Schasinglulu if (i == 1) 492*91f16700Schasinglulu dq[1] = dq[1] - 0x100; 493*91f16700Schasinglulu if (i == 2) 494*91f16700Schasinglulu dq[2] = dq[2] - 0x100; 495*91f16700Schasinglulu if (i == 3) 496*91f16700Schasinglulu dq[3] = dq[3] - 0x100; 497*91f16700Schasinglulu } 498*91f16700Schasinglulu } 499*91f16700Schasinglulu } while (wdet); 500*91f16700Schasinglulu 501*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x0d0)); 502*91f16700Schasinglulu data &= ~0xf000; 503*91f16700Schasinglulu data |= 0x3000; 504*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x0d0), data); 505*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x201); 506*91f16700Schasinglulu do { 507*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x004)); 508*91f16700Schasinglulu } while (data & 1); 509*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x008)); 510*91f16700Schasinglulu if (data & 0x200) 511*91f16700Schasinglulu INFO("wdet rbs av fail\n"); 512*91f16700Schasinglulu } 513*91f16700Schasinglulu 514*91f16700Schasinglulu void set_ddrc_150mhz(void) 515*91f16700Schasinglulu { 516*91f16700Schasinglulu unsigned int data; 517*91f16700Schasinglulu 518*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x580), 0x1); 519*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x5a8), 0x7); 520*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x104)); 521*91f16700Schasinglulu data &= 0xfffffcff; 522*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x104), data); 523*91f16700Schasinglulu 524*91f16700Schasinglulu mmio_write_32((0xf7030000 + 0x050), 0x31); 525*91f16700Schasinglulu mmio_write_32((0xf7030000 + 0x240), 0x5ffff); 526*91f16700Schasinglulu mmio_write_32((0xf7030000 + 0x344), 0xf5ff); 527*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f); 528*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x00c), 0xf0f); 529*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x018), 0x7); 530*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x090), 0x7200000); 531*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x258), 0x720); 532*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x2d8), 0x720); 533*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x358), 0x720); 534*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x3d8), 0x720); 535*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x018), 0x7); 536*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f); 537*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x0b4), 0xf); 538*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x088), 0x3fff801); 539*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x070), 0x8940000); 540*91f16700Schasinglulu 541*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x078)); 542*91f16700Schasinglulu data |= 4; 543*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x078), data); 544*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x01c), 0x8000080); 545*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x020)); 546*91f16700Schasinglulu data &= 0xfffffffe; 547*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x020), data); 548*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 549*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x010), 0x500000f); 550*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x014), 0x10); 551*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x1e4)); 552*91f16700Schasinglulu data &= 0xffffff00; 553*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x1e4), data); 554*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x030), 0x30c82355); 555*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x034), 0x62112bb); 556*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x038), 0x20041022); 557*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x03c), 0x63177497); 558*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x040), 0x3008407); 559*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x064), 0x10483); 560*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x068), 0xff0a0000); 561*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x070)); 562*91f16700Schasinglulu data &= 0xffff0000; 563*91f16700Schasinglulu data |= 0x184; 564*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x070), data); 565*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x048)); 566*91f16700Schasinglulu data &= 0xbfffffff; 567*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x048), data); 568*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x020)); 569*91f16700Schasinglulu data &= ~0x10; 570*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x020), data); 571*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x080)); 572*91f16700Schasinglulu data &= ~0x2000; 573*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x080), data); 574*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x270), 0x3); 575*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x2f0), 0x3); 576*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x370), 0x3); 577*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x3f0), 0x3); 578*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x048), 0x90420880); 579*91f16700Schasinglulu 580*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x040), 0x0); 581*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x146d); 582*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x050), 0x100123); 583*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x060), 0x133); 584*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x064), 0x133); 585*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x200), 0xa1000); 586*91f16700Schasinglulu 587*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x100), 0xb3290d08); 588*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x104), 0x9621821); 589*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x108), 0x45009023); 590*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x10c), 0xaf44c145); 591*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x110), 0x10b00000); 592*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x114), 0x11080806); 593*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x118), 0x44); 594*91f16700Schasinglulu do { 595*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x004)); 596*91f16700Schasinglulu } while (data & 1); 597*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x008)); 598*91f16700Schasinglulu if (data & 8) { 599*91f16700Schasinglulu NOTICE("fail to init ddr3 rank0\n"); 600*91f16700Schasinglulu return; 601*91f16700Schasinglulu } 602*91f16700Schasinglulu 603*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x048)); 604*91f16700Schasinglulu data |= 1; 605*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x048), data); 606*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x21); 607*91f16700Schasinglulu do { 608*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x004)); 609*91f16700Schasinglulu } while (data & 1); 610*91f16700Schasinglulu 611*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x008)); 612*91f16700Schasinglulu if (data & 0x8) 613*91f16700Schasinglulu NOTICE("ddr3 rank1 init failure\n"); 614*91f16700Schasinglulu else 615*91f16700Schasinglulu INFO("ddr3 rank1 init pass\n"); 616*91f16700Schasinglulu 617*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x048)); 618*91f16700Schasinglulu data &= ~0xf; 619*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x048), data); 620*91f16700Schasinglulu INFO("succeed to set ddrc 150mhz\n"); 621*91f16700Schasinglulu } 622*91f16700Schasinglulu 623*91f16700Schasinglulu void set_ddrc_266mhz(void) 624*91f16700Schasinglulu { 625*91f16700Schasinglulu unsigned int data; 626*91f16700Schasinglulu 627*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x580), 0x3); 628*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x5a8), 0x1003); 629*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x104)); 630*91f16700Schasinglulu data &= 0xfffffcff; 631*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x104), data); 632*91f16700Schasinglulu 633*91f16700Schasinglulu mmio_write_32((0xf7030000 + 0x050), 0x31); 634*91f16700Schasinglulu mmio_write_32((0xf7030000 + 0x240), 0x5ffff); 635*91f16700Schasinglulu mmio_write_32((0xf7030000 + 0x344), 0xf5ff); 636*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f); 637*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x00c), 0xf0f); 638*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x018), 0x7); 639*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x090), 0x7200000); 640*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x258), 0x720); 641*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x2d8), 0x720); 642*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x358), 0x720); 643*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x3d8), 0x720); 644*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x018), 0x7); 645*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f); 646*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x0b4), 0xf); 647*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x088), 0x3fff801); 648*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x070), 0x8940000); 649*91f16700Schasinglulu 650*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x078)); 651*91f16700Schasinglulu data |= 4; 652*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x078), data); 653*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x01c), 0x8000080); 654*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x020)); 655*91f16700Schasinglulu data &= 0xfffffffe; 656*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x020), data); 657*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 658*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x010), 0x500000f); 659*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x014), 0x10); 660*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x1e4)); 661*91f16700Schasinglulu data &= 0xffffff00; 662*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x1e4), data); 663*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x030), 0x510d4455); 664*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x034), 0x8391ebb); 665*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x038), 0x2005103c); 666*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x03c), 0x6329950b); 667*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x040), 0x300858c); 668*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x064), 0x10483); 669*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x068), 0xff0a0000); 670*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x070)); 671*91f16700Schasinglulu data &= 0xffff0000; 672*91f16700Schasinglulu data |= 0x184; 673*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x070), data); 674*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x048)); 675*91f16700Schasinglulu data &= 0xbfffffff; 676*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x048), data); 677*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x020)); 678*91f16700Schasinglulu data &= ~0x10; 679*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x020), data); 680*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x080)); 681*91f16700Schasinglulu data &= ~0x2000; 682*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x080), data); 683*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x270), 0x3); 684*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x2f0), 0x3); 685*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x370), 0x3); 686*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x3f0), 0x3); 687*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x048), 0x90420880); 688*91f16700Schasinglulu 689*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x040), 0x0); 690*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x146d); 691*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x050), 0x100123); 692*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x060), 0x133); 693*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x064), 0x133); 694*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x200), 0xa1000); 695*91f16700Schasinglulu 696*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x100), 0xb441d50d); 697*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x104), 0xf721839); 698*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x108), 0x5500f03f); 699*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x10c), 0xaf486145); 700*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x110), 0x10b00000); 701*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x114), 0x12080d06); 702*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x118), 0x44); 703*91f16700Schasinglulu do { 704*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x004)); 705*91f16700Schasinglulu } while (data & 1); 706*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x008)); 707*91f16700Schasinglulu if (data & 8) { 708*91f16700Schasinglulu NOTICE("fail to init ddr3 rank0\n"); 709*91f16700Schasinglulu return; 710*91f16700Schasinglulu } 711*91f16700Schasinglulu 712*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x048)); 713*91f16700Schasinglulu data |= 1; 714*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x048), data); 715*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x21); 716*91f16700Schasinglulu do { 717*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x004)); 718*91f16700Schasinglulu } while (data & 1); 719*91f16700Schasinglulu 720*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x008)); 721*91f16700Schasinglulu if (data & 0x8) 722*91f16700Schasinglulu NOTICE("ddr3 rank1 init failure\n"); 723*91f16700Schasinglulu else 724*91f16700Schasinglulu INFO("ddr3 rank1 init pass\n"); 725*91f16700Schasinglulu 726*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x048)); 727*91f16700Schasinglulu data &= ~0xf; 728*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x048), data); 729*91f16700Schasinglulu INFO("succeed to set ddrc 266mhz\n"); 730*91f16700Schasinglulu } 731*91f16700Schasinglulu 732*91f16700Schasinglulu void set_ddrc_400mhz(void) 733*91f16700Schasinglulu { 734*91f16700Schasinglulu unsigned int data; 735*91f16700Schasinglulu 736*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x580), 0x2); 737*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x5a8), 0x1003); 738*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x104)); 739*91f16700Schasinglulu data &= 0xfffffcff; 740*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x104), data); 741*91f16700Schasinglulu 742*91f16700Schasinglulu mmio_write_32((0xf7030000 + 0x050), 0x31); 743*91f16700Schasinglulu mmio_write_32((0xf7030000 + 0x240), 0x5ffff); 744*91f16700Schasinglulu mmio_write_32((0xf7030000 + 0x344), 0xf5ff); 745*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f); 746*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x00c), 0xf0f); 747*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x018), 0x7); 748*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x090), 0x7200000); 749*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x258), 0x720); 750*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x2d8), 0x720); 751*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x358), 0x720); 752*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x3d8), 0x720); 753*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x018), 0x7); 754*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f); 755*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x0b4), 0xf); 756*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x088), 0x3fff801); 757*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x070), 0x8940000); 758*91f16700Schasinglulu 759*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x078)); 760*91f16700Schasinglulu data |= 4; 761*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x078), data); 762*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x01c), 0x8000080); 763*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x020)); 764*91f16700Schasinglulu data &= 0xfffffffe; 765*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x020), data); 766*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 767*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x010), 0x500000f); 768*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x014), 0x10); 769*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x1e4)); 770*91f16700Schasinglulu data &= 0xffffff00; 771*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x1e4), data); 772*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x030), 0x75525655); 773*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x034), 0xa552abb); 774*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x038), 0x20071059); 775*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x03c), 0x633e8591); 776*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x040), 0x3008691); 777*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x064), 0x10483); 778*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x068), 0xff0a0000); 779*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x070)); 780*91f16700Schasinglulu data &= 0xffff0000; 781*91f16700Schasinglulu data |= 0x184; 782*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x070), data); 783*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x048)); 784*91f16700Schasinglulu data &= 0xbfffffff; 785*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x048), data); 786*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x020)); 787*91f16700Schasinglulu data &= ~0x10; 788*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x020), data); 789*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x080)); 790*91f16700Schasinglulu data &= ~0x2000; 791*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x080), data); 792*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x270), 0x3); 793*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x2f0), 0x3); 794*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x370), 0x3); 795*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x3f0), 0x3); 796*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x048), 0x90420880); 797*91f16700Schasinglulu 798*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x040), 0x0); 799*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x146d); 800*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x050), 0x100123); 801*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x060), 0x133); 802*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x064), 0x133); 803*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x200), 0xa1000); 804*91f16700Schasinglulu 805*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x100), 0xb55a9d12); 806*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x104), 0x17721855); 807*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x108), 0x7501505f); 808*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x10c), 0xaf4ca245); 809*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x110), 0x10b00000); 810*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x114), 0x13081306); 811*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x118), 0x44); 812*91f16700Schasinglulu do { 813*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x004)); 814*91f16700Schasinglulu } while (data & 1); 815*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x008)); 816*91f16700Schasinglulu if (data & 8) { 817*91f16700Schasinglulu NOTICE("fail to init ddr3 rank0\n"); 818*91f16700Schasinglulu return; 819*91f16700Schasinglulu } 820*91f16700Schasinglulu 821*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x048)); 822*91f16700Schasinglulu data |= 1; 823*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x048), data); 824*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x21); 825*91f16700Schasinglulu do { 826*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x004)); 827*91f16700Schasinglulu } while (data & 1); 828*91f16700Schasinglulu 829*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x008)); 830*91f16700Schasinglulu if (data & 0x8) 831*91f16700Schasinglulu NOTICE("ddr3 rank1 init failure\n"); 832*91f16700Schasinglulu else 833*91f16700Schasinglulu INFO("ddr3 rank1 init pass\n"); 834*91f16700Schasinglulu 835*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x048)); 836*91f16700Schasinglulu data &= ~0xf; 837*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x048), data); 838*91f16700Schasinglulu INFO("succeed to set ddrc 400mhz\n"); 839*91f16700Schasinglulu } 840*91f16700Schasinglulu 841*91f16700Schasinglulu void set_ddrc_533mhz(void) 842*91f16700Schasinglulu { 843*91f16700Schasinglulu unsigned int data; 844*91f16700Schasinglulu 845*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x580), 0x3); 846*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x5a8), 0x11111); 847*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x104)); 848*91f16700Schasinglulu data |= 0x100; 849*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x104), data); 850*91f16700Schasinglulu 851*91f16700Schasinglulu mmio_write_32((0xf7030000 + 0x050), 0x30); 852*91f16700Schasinglulu mmio_write_32((0xf7030000 + 0x240), 0x5ffff); 853*91f16700Schasinglulu mmio_write_32((0xf7030000 + 0x344), 0xf5ff); 854*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x00c), 0x400); 855*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x00c), 0x400); 856*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x018), 0x7); 857*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x090), 0x6400000); 858*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x258), 0x640); 859*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x2d8), 0x640); 860*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x358), 0x640); 861*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x3d8), 0x640); 862*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x018), 0x0); 863*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f); 864*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x0b4), 0xf); 865*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x088), 0x3fff801); 866*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x070), 0x8940000); 867*91f16700Schasinglulu 868*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x078)); 869*91f16700Schasinglulu data |= 4; 870*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x078), data); 871*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x01c), 0x8000080); 872*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x020)); 873*91f16700Schasinglulu data &= 0xfffffffe; 874*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x020), data); 875*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 876*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x010), 0x500000f); 877*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x014), 0x10); 878*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x1e4)); 879*91f16700Schasinglulu data &= 0xffffff00; 880*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x1e4), data); 881*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x030), 0x9dd87855); 882*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x034), 0xa7138bb); 883*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x038), 0x20091477); 884*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x03c), 0x84534e16); 885*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x040), 0x3008817); 886*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x064), 0x106c3); 887*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x068), 0xff0a0000); 888*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x070)); 889*91f16700Schasinglulu data &= 0xffff0000; 890*91f16700Schasinglulu data |= 0x305; 891*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x070), data); 892*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x048)); 893*91f16700Schasinglulu data |= 0x40000000; 894*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x048), data); 895*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x020)); 896*91f16700Schasinglulu data &= ~0x10; 897*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x020), data); 898*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x080)); 899*91f16700Schasinglulu data &= ~0x2000; 900*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x080), data); 901*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x270), 0x3); 902*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x2f0), 0x3); 903*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x370), 0x3); 904*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x3f0), 0x3); 905*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x048), 0xd0420900); 906*91f16700Schasinglulu 907*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x040), 0x0); 908*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x140f); 909*91f16700Schasinglulu do { 910*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x004)); 911*91f16700Schasinglulu } while (data & 1); 912*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x008)); 913*91f16700Schasinglulu if (data & 0x7fe) { 914*91f16700Schasinglulu NOTICE("failed to init lpddr3 rank0 dram phy\n"); 915*91f16700Schasinglulu return; 916*91f16700Schasinglulu } 917*91f16700Schasinglulu cat_533mhz_800mhz(); 918*91f16700Schasinglulu 919*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0xf1); 920*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x050), 0x100123); 921*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x060), 0x133); 922*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x064), 0x133); 923*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x200), 0xa1000); 924*91f16700Schasinglulu 925*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x100), 0xb77b6718); 926*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x104), 0x1e82a071); 927*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x108), 0x9501c07e); 928*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x10c), 0xaf50c255); 929*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x110), 0x10b00000); 930*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x114), 0x13181908); 931*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x118), 0x44); 932*91f16700Schasinglulu do { 933*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x004)); 934*91f16700Schasinglulu } while (data & 1); 935*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x008)); 936*91f16700Schasinglulu if (data & 0x7fe) { 937*91f16700Schasinglulu NOTICE("fail to init ddr3 rank0\n"); 938*91f16700Schasinglulu return; 939*91f16700Schasinglulu } 940*91f16700Schasinglulu ddrx_rdet(); 941*91f16700Schasinglulu ddrx_wdet(); 942*91f16700Schasinglulu 943*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x048)); 944*91f16700Schasinglulu data |= 1; 945*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x048), data); 946*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x21); 947*91f16700Schasinglulu do { 948*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x004)); 949*91f16700Schasinglulu } while (data & 1); 950*91f16700Schasinglulu 951*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x008)); 952*91f16700Schasinglulu if (data & 0x7fe) 953*91f16700Schasinglulu NOTICE("ddr3 rank1 init failure\n"); 954*91f16700Schasinglulu else 955*91f16700Schasinglulu INFO("ddr3 rank1 init pass\n"); 956*91f16700Schasinglulu 957*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x048)); 958*91f16700Schasinglulu data &= ~0xf; 959*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x048), data); 960*91f16700Schasinglulu INFO("succeed to set ddrc 533mhz\n"); 961*91f16700Schasinglulu } 962*91f16700Schasinglulu 963*91f16700Schasinglulu void set_ddrc_800mhz(void) 964*91f16700Schasinglulu { 965*91f16700Schasinglulu unsigned int data; 966*91f16700Schasinglulu 967*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x580), 0x2); 968*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x5a8), 0x1003); 969*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x104)); 970*91f16700Schasinglulu data &= 0xfffffcff; 971*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x104), data); 972*91f16700Schasinglulu 973*91f16700Schasinglulu mmio_write_32((0xf7030000 + 0x050), 0x30); 974*91f16700Schasinglulu mmio_write_32((0xf7030000 + 0x240), 0x5ffff); 975*91f16700Schasinglulu mmio_write_32((0xf7030000 + 0x344), 0xf5ff); 976*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x00c), 0x400); 977*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x00c), 0x400); 978*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x018), 0x7); 979*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x090), 0x5400000); 980*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x258), 0x540); 981*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x2d8), 0x540); 982*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x358), 0x540); 983*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x3d8), 0x540); 984*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x018), 0x0); 985*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f); 986*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x0b4), 0xf); 987*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x088), 0x3fff801); 988*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x070), 0x8940000); 989*91f16700Schasinglulu 990*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x078)); 991*91f16700Schasinglulu data |= 4; 992*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x078), data); 993*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x01c), 0x8000080); 994*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x020)); 995*91f16700Schasinglulu data &= 0xfffffffe; 996*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x020), data); 997*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 998*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x010), 0x500000f); 999*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x014), 0x10); 1000*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x1e4)); 1001*91f16700Schasinglulu data &= 0xffffff00; 1002*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x1e4), data); 1003*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x030), 0xe663ab77); 1004*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x034), 0xea952db); 1005*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x038), 0x200d1cb1); 1006*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x03c), 0xc67d0721); 1007*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x040), 0x3008aa1); 1008*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x064), 0x11a43); 1009*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x068), 0xff0a0000); 1010*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x070)); 1011*91f16700Schasinglulu data &= 0xffff0000; 1012*91f16700Schasinglulu data |= 0x507; 1013*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x070), data); 1014*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x048)); 1015*91f16700Schasinglulu data |= 0x40000000; 1016*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x048), data); 1017*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x020)); 1018*91f16700Schasinglulu data &= 0xffffffef; 1019*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x020), data); 1020*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x080)); 1021*91f16700Schasinglulu data &= 0xffffdfff; 1022*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x080), data); 1023*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x270), 0x3); 1024*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x2f0), 0x3); 1025*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x370), 0x3); 1026*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x3f0), 0x3); 1027*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x048), 0xd0420900); 1028*91f16700Schasinglulu 1029*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x040), 0x2001); 1030*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x140f); 1031*91f16700Schasinglulu do { 1032*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x004)); 1033*91f16700Schasinglulu } while (data & 1); 1034*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x008)); 1035*91f16700Schasinglulu if (data & 0x7fe) { 1036*91f16700Schasinglulu WARN("failed to init lpddr3 rank0 dram phy\n"); 1037*91f16700Schasinglulu return; 1038*91f16700Schasinglulu } 1039*91f16700Schasinglulu cat_533mhz_800mhz(); 1040*91f16700Schasinglulu 1041*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0xf1); 1042*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x050), 0x100023); 1043*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x060), 0x133); 1044*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x064), 0x133); 1045*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x200), 0xa1000); 1046*91f16700Schasinglulu 1047*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x100), 0x755a9d12); 1048*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x104), 0x1753b055); 1049*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x108), 0x7401505f); 1050*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x10c), 0x578ca244); 1051*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x110), 0x10700000); 1052*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x114), 0x13141306); 1053*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x118), 0x44); 1054*91f16700Schasinglulu do { 1055*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x004)); 1056*91f16700Schasinglulu } while (data & 1); 1057*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x008)); 1058*91f16700Schasinglulu if (data & 0x7fe) { 1059*91f16700Schasinglulu NOTICE("fail to init ddr3 rank0\n"); 1060*91f16700Schasinglulu return; 1061*91f16700Schasinglulu } 1062*91f16700Schasinglulu ddrx_rdet(); 1063*91f16700Schasinglulu ddrx_wdet(); 1064*91f16700Schasinglulu 1065*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x048)); 1066*91f16700Schasinglulu data |= 1; 1067*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x048), data); 1068*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x004), 0x21); 1069*91f16700Schasinglulu do { 1070*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x004)); 1071*91f16700Schasinglulu } while (data & 1); 1072*91f16700Schasinglulu 1073*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x008)); 1074*91f16700Schasinglulu if (data & 0x7fe) 1075*91f16700Schasinglulu NOTICE("ddr3 rank1 init failure\n"); 1076*91f16700Schasinglulu else 1077*91f16700Schasinglulu INFO("ddr3 rank1 init pass\n"); 1078*91f16700Schasinglulu 1079*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x048)); 1080*91f16700Schasinglulu data &= ~0xf; 1081*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x048), data); 1082*91f16700Schasinglulu INFO("succeed to set ddrc 800mhz\n"); 1083*91f16700Schasinglulu } 1084*91f16700Schasinglulu 1085*91f16700Schasinglulu static void ddrc_common_init(int freq) 1086*91f16700Schasinglulu { 1087*91f16700Schasinglulu unsigned int data; 1088*91f16700Schasinglulu 1089*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x020), 0x1); 1090*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x100), 0x1700); 1091*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x104), 0x71040004); 1092*91f16700Schasinglulu mmio_write_32((0xf7121400 + 0x104), 0xf); 1093*91f16700Schasinglulu mmio_write_32((0xf7121800 + 0x104), 0xf); 1094*91f16700Schasinglulu mmio_write_32((0xf7121c00 + 0x104), 0xf); 1095*91f16700Schasinglulu mmio_write_32((0xf7122000 + 0x104), 0xf); 1096*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x02c), 0x6); 1097*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x020), 0x30003); 1098*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x028), 0x310201); 1099*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x1e4), 0xfe007600); 1100*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x01c), 0xaf001); 1101*91f16700Schasinglulu 1102*91f16700Schasinglulu 1103*91f16700Schasinglulu data = mmio_read_32((0xf7128000 + 0x280)); 1104*91f16700Schasinglulu data |= 1 << 7; 1105*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x280), data); 1106*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x244), 0x3); 1107*91f16700Schasinglulu 1108*91f16700Schasinglulu if (freq == DDR_FREQ_800M) 1109*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x240), 167 * (freq / 2) / 1024); 1110*91f16700Schasinglulu else 1111*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x240), 167 * freq / 1024); 1112*91f16700Schasinglulu 1113*91f16700Schasinglulu data = mmio_read_32((0xf712c000 + 0x080)); 1114*91f16700Schasinglulu data &= 0xffff; 1115*91f16700Schasinglulu data |= 0x4002000; 1116*91f16700Schasinglulu mmio_write_32((0xf712c000 + 0x080), data); 1117*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x000), 0x0); 1118*91f16700Schasinglulu do { 1119*91f16700Schasinglulu data = mmio_read_32((0xf7128000 + 0x294)); 1120*91f16700Schasinglulu } while (data & 1); 1121*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x000), 0x2); 1122*91f16700Schasinglulu } 1123*91f16700Schasinglulu 1124*91f16700Schasinglulu 1125*91f16700Schasinglulu static int dienum_det_and_rowcol_cfg(void) 1126*91f16700Schasinglulu { 1127*91f16700Schasinglulu unsigned int data; 1128*91f16700Schasinglulu 1129*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x210), 0x87); 1130*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x218), 0x10000); 1131*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x00c), 0x1); 1132*91f16700Schasinglulu do { 1133*91f16700Schasinglulu data = mmio_read_32((0xf7128000 + 0x00c)); 1134*91f16700Schasinglulu } while (data & 1); 1135*91f16700Schasinglulu data = mmio_read_32((0xf7128000 + 0x4a8)) & 0xfc; 1136*91f16700Schasinglulu switch (data) { 1137*91f16700Schasinglulu case 0x18: 1138*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x060), 0x132); 1139*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x064), 0x132); 1140*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x100), 0x1600); 1141*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x104), 0x71040004); 1142*91f16700Schasinglulu mmio_write_32(MEMORY_AXI_DDR_CAPACITY_ADDR, 0x40000000); 1143*91f16700Schasinglulu break; 1144*91f16700Schasinglulu case 0x1c: 1145*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x060), 0x142); 1146*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x064), 0x142); 1147*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x100), 0x1700); 1148*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x104), 0x71040004); 1149*91f16700Schasinglulu mmio_write_32(MEMORY_AXI_DDR_CAPACITY_ADDR, 0x80000000); 1150*91f16700Schasinglulu break; 1151*91f16700Schasinglulu case 0x58: 1152*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x060), 0x133); 1153*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x064), 0x133); 1154*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x100), 0x1700); 1155*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x104), 0x71040004); 1156*91f16700Schasinglulu mmio_write_32(MEMORY_AXI_DDR_CAPACITY_ADDR, 0x80000000); 1157*91f16700Schasinglulu break; 1158*91f16700Schasinglulu default: 1159*91f16700Schasinglulu mmio_write_32(MEMORY_AXI_DDR_CAPACITY_ADDR, 0x80000000); 1160*91f16700Schasinglulu break; 1161*91f16700Schasinglulu } 1162*91f16700Schasinglulu if (!data) 1163*91f16700Schasinglulu return -EINVAL; 1164*91f16700Schasinglulu return 0; 1165*91f16700Schasinglulu } 1166*91f16700Schasinglulu 1167*91f16700Schasinglulu static int detect_ddr_chip_info(void) 1168*91f16700Schasinglulu { 1169*91f16700Schasinglulu unsigned int data, mr5, mr6, mr7; 1170*91f16700Schasinglulu 1171*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x210), 0x57); 1172*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x218), 0x10000); 1173*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x00c), 0x1); 1174*91f16700Schasinglulu 1175*91f16700Schasinglulu do { 1176*91f16700Schasinglulu data = mmio_read_32((0xf7128000 + 0x00c)); 1177*91f16700Schasinglulu } while (data & 1); 1178*91f16700Schasinglulu 1179*91f16700Schasinglulu data = mmio_read_32((0xf7128000 + 0x4a8)); 1180*91f16700Schasinglulu mr5 = data & 0xff; 1181*91f16700Schasinglulu switch (mr5) { 1182*91f16700Schasinglulu case 1: 1183*91f16700Schasinglulu INFO("Samsung DDR\n"); 1184*91f16700Schasinglulu break; 1185*91f16700Schasinglulu case 6: 1186*91f16700Schasinglulu INFO("Hynix DDR\n"); 1187*91f16700Schasinglulu break; 1188*91f16700Schasinglulu case 3: 1189*91f16700Schasinglulu INFO("Elpida DDR\n"); 1190*91f16700Schasinglulu break; 1191*91f16700Schasinglulu default: 1192*91f16700Schasinglulu INFO("DDR from other vendors\n"); 1193*91f16700Schasinglulu break; 1194*91f16700Schasinglulu } 1195*91f16700Schasinglulu 1196*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x210), 0x67); 1197*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x218), 0x10000); 1198*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x00c), 0x1); 1199*91f16700Schasinglulu do { 1200*91f16700Schasinglulu data = mmio_read_32((0xf7128000 + 0x00c)); 1201*91f16700Schasinglulu } while (data & 1); 1202*91f16700Schasinglulu data = mmio_read_32((0xf7128000 + 0x4a8)); 1203*91f16700Schasinglulu mr6 = data & 0xff; 1204*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x210), 0x77); 1205*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x218), 0x10000); 1206*91f16700Schasinglulu mmio_write_32((0xf7128000 + 0x00c), 0x1); 1207*91f16700Schasinglulu do { 1208*91f16700Schasinglulu data = mmio_read_32((0xf7128000 + 0x00c)); 1209*91f16700Schasinglulu } while (data & 1); 1210*91f16700Schasinglulu data = mmio_read_32((0xf7128000 + 0x4a8)); 1211*91f16700Schasinglulu mr7 = data & 0xff; 1212*91f16700Schasinglulu data = mr5 + (mr6 << 8) + (mr7 << 16); 1213*91f16700Schasinglulu return data; 1214*91f16700Schasinglulu } 1215*91f16700Schasinglulu 1216*91f16700Schasinglulu void ddr_phy_reset(void) 1217*91f16700Schasinglulu { 1218*91f16700Schasinglulu mmio_write_32(0xf7030340, 0xa000); 1219*91f16700Schasinglulu mmio_write_32(0xf7030344, 0xa000); 1220*91f16700Schasinglulu } 1221*91f16700Schasinglulu 1222*91f16700Schasinglulu void lpddrx_save_ddl_para_bypass(uint32_t *ddr_ddl_para, unsigned int index) 1223*91f16700Schasinglulu { 1224*91f16700Schasinglulu uint32_t value; 1225*91f16700Schasinglulu uint32_t cnt = index; 1226*91f16700Schasinglulu uint32_t i; 1227*91f16700Schasinglulu 1228*91f16700Schasinglulu for (i = 0; i < 4; i++) { 1229*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x22c + i * 0x80); 1230*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1231*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x23c + i * 0x80); 1232*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1233*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x240 + i * 0x80); 1234*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1235*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x640 + i * 0x80); 1236*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1237*91f16700Schasinglulu } 1238*91f16700Schasinglulu } 1239*91f16700Schasinglulu 1240*91f16700Schasinglulu void lpddrx_save_ddl_para_mission(uint32_t *ddr_ddl_para, unsigned int index) 1241*91f16700Schasinglulu { 1242*91f16700Schasinglulu uint32_t value; 1243*91f16700Schasinglulu uint32_t cnt = index; 1244*91f16700Schasinglulu uint32_t i; 1245*91f16700Schasinglulu 1246*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x140); 1247*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1248*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x144); 1249*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1250*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x148); 1251*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1252*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x14c); 1253*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1254*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x150); 1255*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1256*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x1d4); 1257*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1258*91f16700Schasinglulu for (i = 0; i < 4; i++) { 1259*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x210 + i * 0x80); 1260*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1261*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x214 + i * 0x80); 1262*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1263*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x218 + i * 0x80); 1264*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1265*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x21c + i * 0x80); 1266*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1267*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x220 + i * 0x80); 1268*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1269*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x224 + i * 0x80); 1270*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1271*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x228 + i * 0x80); 1272*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1273*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x22c + i * 0x80); 1274*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1275*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x230 + i * 0x80); 1276*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1277*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x234 + i * 0x80); 1278*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1279*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x238 + i * 0x80); 1280*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1281*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x23c + i * 0x80); 1282*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1283*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x240 + i * 0x80); 1284*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1285*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x640 + i * 0x80); 1286*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1287*91f16700Schasinglulu } 1288*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x168); 1289*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1290*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x24c + 0 * 0x80); 1291*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1292*91f16700Schasinglulu value = mmio_read_32(0xf712c000 + 0x24c + 2 * 0x80); 1293*91f16700Schasinglulu ddr_ddl_para[cnt++] = value; 1294*91f16700Schasinglulu } 1295*91f16700Schasinglulu 1296*91f16700Schasinglulu int lpddr3_freq_init(int freq) 1297*91f16700Schasinglulu { 1298*91f16700Schasinglulu set_ddrc_150mhz(); 1299*91f16700Schasinglulu lpddrx_save_ddl_para_bypass((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR, 0); 1300*91f16700Schasinglulu if (freq > DDR_FREQ_150M) { 1301*91f16700Schasinglulu ddr_phy_reset(); 1302*91f16700Schasinglulu set_ddrc_266mhz(); 1303*91f16700Schasinglulu lpddrx_save_ddl_para_bypass((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR, 1304*91f16700Schasinglulu 16); 1305*91f16700Schasinglulu } 1306*91f16700Schasinglulu if (freq > DDR_FREQ_266M) { 1307*91f16700Schasinglulu ddr_phy_reset(); 1308*91f16700Schasinglulu set_ddrc_400mhz(); 1309*91f16700Schasinglulu lpddrx_save_ddl_para_bypass((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR, 1310*91f16700Schasinglulu 16 * 2); 1311*91f16700Schasinglulu } 1312*91f16700Schasinglulu if (freq > DDR_FREQ_400M) { 1313*91f16700Schasinglulu ddr_phy_reset(); 1314*91f16700Schasinglulu set_ddrc_533mhz(); 1315*91f16700Schasinglulu lpddrx_save_ddl_para_mission((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR, 1316*91f16700Schasinglulu 16 * 3); 1317*91f16700Schasinglulu } 1318*91f16700Schasinglulu if (freq > DDR_FREQ_533M) { 1319*91f16700Schasinglulu ddr_phy_reset(); 1320*91f16700Schasinglulu set_ddrc_800mhz(); 1321*91f16700Schasinglulu lpddrx_save_ddl_para_mission((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR, 1322*91f16700Schasinglulu 16 * 3 + 61); 1323*91f16700Schasinglulu } 1324*91f16700Schasinglulu return 0; 1325*91f16700Schasinglulu } 1326*91f16700Schasinglulu 1327*91f16700Schasinglulu static void init_ddr(int freq) 1328*91f16700Schasinglulu { 1329*91f16700Schasinglulu unsigned int data; 1330*91f16700Schasinglulu int ret; 1331*91f16700Schasinglulu 1332*91f16700Schasinglulu 1333*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x030)); 1334*91f16700Schasinglulu data |= 1; 1335*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x030), data); 1336*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x010)); 1337*91f16700Schasinglulu data |= 1; 1338*91f16700Schasinglulu mmio_write_32((0xf7032000 + 0x010), data); 1339*91f16700Schasinglulu 1340*91f16700Schasinglulu udelay(300); 1341*91f16700Schasinglulu do { 1342*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x030)); 1343*91f16700Schasinglulu data &= 3 << 28; 1344*91f16700Schasinglulu } while (data != (3 << 28)); 1345*91f16700Schasinglulu do { 1346*91f16700Schasinglulu data = mmio_read_32((0xf7032000 + 0x010)); 1347*91f16700Schasinglulu data &= 3 << 28; 1348*91f16700Schasinglulu } while (data != (3 << 28)); 1349*91f16700Schasinglulu 1350*91f16700Schasinglulu ret = lpddr3_freq_init(freq); 1351*91f16700Schasinglulu if (ret) 1352*91f16700Schasinglulu return; 1353*91f16700Schasinglulu } 1354*91f16700Schasinglulu 1355*91f16700Schasinglulu static void init_ddrc_qos(void) 1356*91f16700Schasinglulu { 1357*91f16700Schasinglulu unsigned int port, data; 1358*91f16700Schasinglulu 1359*91f16700Schasinglulu mmio_write_32((0xf7124000 + 0x088), 1); 1360*91f16700Schasinglulu 1361*91f16700Schasinglulu port = 0; 1362*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x1210); 1363*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x11111111); 1364*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x11111111); 1365*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x400 + 0 * 0x10), 0x001d0007); 1366*91f16700Schasinglulu 1367*91f16700Schasinglulu for (port = 3; port <= 4; port++) { 1368*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x1210); 1369*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x77777777); 1370*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x77777777); 1371*91f16700Schasinglulu } 1372*91f16700Schasinglulu 1373*91f16700Schasinglulu port = 1; 1374*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x30000); 1375*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x1234567); 1376*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x1234567); 1377*91f16700Schasinglulu 1378*91f16700Schasinglulu mmio_write_32((0xf7124000 + 0x1f0), 0); 1379*91f16700Schasinglulu mmio_write_32((0xf7124000 + 0x0bc), 0x3020100); 1380*91f16700Schasinglulu mmio_write_32((0xf7124000 + 0x0d0), 0x3020100); 1381*91f16700Schasinglulu mmio_write_32((0xf7124000 + 0x1f4), 0x01000100); 1382*91f16700Schasinglulu mmio_write_32((0xf7124000 + 0x08c + 0 * 4), 0xd0670402); 1383*91f16700Schasinglulu mmio_write_32((0xf7124000 + 0x068 + 0 * 4), 0x31); 1384*91f16700Schasinglulu mmio_write_32((0xf7124000 + 0x000), 0x7); 1385*91f16700Schasinglulu 1386*91f16700Schasinglulu data = mmio_read_32((0xf7124000 + 0x09c)); 1387*91f16700Schasinglulu data &= ~0xff0000; 1388*91f16700Schasinglulu data |= 0x400000; 1389*91f16700Schasinglulu mmio_write_32((0xf7124000 + 0x09c), data); 1390*91f16700Schasinglulu data = mmio_read_32((0xf7124000 + 0x0ac)); 1391*91f16700Schasinglulu data &= ~0xff0000; 1392*91f16700Schasinglulu data |= 0x400000; 1393*91f16700Schasinglulu mmio_write_32((0xf7124000 + 0x0ac), data); 1394*91f16700Schasinglulu port = 2; 1395*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x30000); 1396*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x1234567); 1397*91f16700Schasinglulu mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x1234567); 1398*91f16700Schasinglulu 1399*91f16700Schasinglulu 1400*91f16700Schasinglulu mmio_write_32((0xf7124000 + 0x09c), 0xff7fff); 1401*91f16700Schasinglulu mmio_write_32((0xf7124000 + 0x0a0), 0xff); 1402*91f16700Schasinglulu mmio_write_32((0xf7124000 + 0x0ac), 0xff7fff); 1403*91f16700Schasinglulu mmio_write_32((0xf7124000 + 0x0b0), 0xff); 1404*91f16700Schasinglulu mmio_write_32((0xf7124000 + 0x0bc), 0x3020100); 1405*91f16700Schasinglulu mmio_write_32((0xf7124000 + 0x0d0), 0x3020100); 1406*91f16700Schasinglulu } 1407*91f16700Schasinglulu 1408*91f16700Schasinglulu void hikey_ddr_init(unsigned int ddr_freq) 1409*91f16700Schasinglulu { 1410*91f16700Schasinglulu uint32_t data; 1411*91f16700Schasinglulu 1412*91f16700Schasinglulu assert((ddr_freq == DDR_FREQ_150M) || (ddr_freq == DDR_FREQ_266M) || 1413*91f16700Schasinglulu (ddr_freq == DDR_FREQ_400M) || (ddr_freq == DDR_FREQ_533M) || 1414*91f16700Schasinglulu (ddr_freq == DDR_FREQ_800M)); 1415*91f16700Schasinglulu init_pll(); 1416*91f16700Schasinglulu init_freq(); 1417*91f16700Schasinglulu 1418*91f16700Schasinglulu init_ddr(ddr_freq); 1419*91f16700Schasinglulu 1420*91f16700Schasinglulu ddrc_common_init(ddr_freq); 1421*91f16700Schasinglulu dienum_det_and_rowcol_cfg(); 1422*91f16700Schasinglulu detect_ddr_chip_info(); 1423*91f16700Schasinglulu 1424*91f16700Schasinglulu if ((ddr_freq == DDR_FREQ_400M) || (ddr_freq == DDR_FREQ_800M)) { 1425*91f16700Schasinglulu data = mmio_read_32(0xf7032000 + 0x010); 1426*91f16700Schasinglulu data &= ~0x1; 1427*91f16700Schasinglulu mmio_write_32(0xf7032000 + 0x010, data); 1428*91f16700Schasinglulu } else if ((ddr_freq == DDR_FREQ_266M) || (ddr_freq == DDR_FREQ_533M)) { 1429*91f16700Schasinglulu data = mmio_read_32(0xf7032000 + 0x030); 1430*91f16700Schasinglulu data &= ~0x1; 1431*91f16700Schasinglulu mmio_write_32(0xf7032000 + 0x030, data); 1432*91f16700Schasinglulu } else { 1433*91f16700Schasinglulu data = mmio_read_32(0xf7032000 + 0x010); 1434*91f16700Schasinglulu data &= ~0x1; 1435*91f16700Schasinglulu mmio_write_32(0xf7032000 + 0x010, data); 1436*91f16700Schasinglulu data = mmio_read_32(0xf7032000 + 0x030); 1437*91f16700Schasinglulu data &= ~0x1; 1438*91f16700Schasinglulu mmio_write_32(0xf7032000 + 0x030, data); 1439*91f16700Schasinglulu } 1440*91f16700Schasinglulu dsb(); 1441*91f16700Schasinglulu isb(); 1442*91f16700Schasinglulu 1443*91f16700Schasinglulu /* 1444*91f16700Schasinglulu * Test memory access. Do not use address 0x0 because the compiler 1445*91f16700Schasinglulu * may assume it is not a valid address and generate incorrect code 1446*91f16700Schasinglulu * (GCC 4.9.1 without -fno-delete-null-pointer-checks for instance). 1447*91f16700Schasinglulu */ 1448*91f16700Schasinglulu mmio_write_32(0x4, 0xa5a55a5a); 1449*91f16700Schasinglulu INFO("ddr test value:0x%x\n", mmio_read_32(0x4)); 1450*91f16700Schasinglulu init_ddrc_qos(); 1451*91f16700Schasinglulu } 1452