132e9fc1aSHaojian Zhuang /* 232e9fc1aSHaojian Zhuang * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved. 332e9fc1aSHaojian Zhuang * 432e9fc1aSHaojian Zhuang * SPDX-License-Identifier: BSD-3-Clause 532e9fc1aSHaojian Zhuang */ 632e9fc1aSHaojian Zhuang 732e9fc1aSHaojian Zhuang #include <arch_helpers.h> 8*483dce7eSHaojian Zhuang #include <assert.h> 932e9fc1aSHaojian Zhuang #include <debug.h> 1032e9fc1aSHaojian Zhuang #include <errno.h> 1132e9fc1aSHaojian Zhuang #include <hi6220.h> 1232e9fc1aSHaojian Zhuang #include <hi6553.h> 1332e9fc1aSHaojian Zhuang #include <mmio.h> 1432e9fc1aSHaojian Zhuang #include <sp804_delay_timer.h> 1532e9fc1aSHaojian Zhuang 16*483dce7eSHaojian Zhuang #include "hikey_private.h" 1732e9fc1aSHaojian Zhuang 1832e9fc1aSHaojian Zhuang static void init_pll(void) 1932e9fc1aSHaojian Zhuang { 2032e9fc1aSHaojian Zhuang unsigned int data; 2132e9fc1aSHaojian Zhuang 2232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x000)); 2332e9fc1aSHaojian Zhuang data |= 0x1; 2432e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x000), data); 2532e9fc1aSHaojian Zhuang do { 2632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x000)); 2732e9fc1aSHaojian Zhuang } while (!(data & (1 << 28))); 2832e9fc1aSHaojian Zhuang 2932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7800000 + 0x000)); 3032e9fc1aSHaojian Zhuang data &= ~0x007; 3132e9fc1aSHaojian Zhuang data |= 0x004; 3232e9fc1aSHaojian Zhuang mmio_write_32((0xf7800000 + 0x000), data); 3332e9fc1aSHaojian Zhuang do { 3432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7800000 + 0x014)); 3532e9fc1aSHaojian Zhuang data &= 0x007; 3632e9fc1aSHaojian Zhuang } while (data != 0x004); 3732e9fc1aSHaojian Zhuang 3832e9fc1aSHaojian Zhuang mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2101); 39*483dce7eSHaojian Zhuang dsb(); 40*483dce7eSHaojian Zhuang isb(); 41*483dce7eSHaojian Zhuang udelay(10); 42*483dce7eSHaojian Zhuang mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2001); 43*483dce7eSHaojian Zhuang dsb(); 44*483dce7eSHaojian Zhuang isb(); 45*483dce7eSHaojian Zhuang udelay(10); 46*483dce7eSHaojian Zhuang mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2201); 47*483dce7eSHaojian Zhuang dsb(); 48*483dce7eSHaojian Zhuang isb(); 49*483dce7eSHaojian Zhuang udelay(10); 5032e9fc1aSHaojian Zhuang mmio_write_32(0xf7032000 + 0x02c, 0x5110103e); 51*483dce7eSHaojian Zhuang dsb(); 52*483dce7eSHaojian Zhuang isb(); 53*483dce7eSHaojian Zhuang udelay(10); 5432e9fc1aSHaojian Zhuang data = mmio_read_32(0xf7032000 + 0x050); 5532e9fc1aSHaojian Zhuang data |= 1 << 28; 5632e9fc1aSHaojian Zhuang mmio_write_32(0xf7032000 + 0x050, data); 57*483dce7eSHaojian Zhuang dsb(); 58*483dce7eSHaojian Zhuang isb(); 59*483dce7eSHaojian Zhuang udelay(10); 6032e9fc1aSHaojian Zhuang mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2101); 61*483dce7eSHaojian Zhuang dsb(); 62*483dce7eSHaojian Zhuang isb(); 63*483dce7eSHaojian Zhuang udelay(10); 64*483dce7eSHaojian Zhuang mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2001); 65*483dce7eSHaojian Zhuang dsb(); 66*483dce7eSHaojian Zhuang isb(); 67*483dce7eSHaojian Zhuang udelay(10); 68*483dce7eSHaojian Zhuang mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2201); 69*483dce7eSHaojian Zhuang dsb(); 70*483dce7eSHaojian Zhuang isb(); 71*483dce7eSHaojian Zhuang udelay(10); 7232e9fc1aSHaojian Zhuang } 7332e9fc1aSHaojian Zhuang 7432e9fc1aSHaojian Zhuang static void init_freq(void) 7532e9fc1aSHaojian Zhuang { 7632e9fc1aSHaojian Zhuang unsigned int data, tmp; 7732e9fc1aSHaojian Zhuang unsigned int cpuext_cfg, ddr_cfg; 7832e9fc1aSHaojian Zhuang 7932e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x374), 0x4a); 8032e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x368), 0xda); 8132e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x36c), 0x01); 8232e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x370), 0x01); 8332e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x360), 0x60); 8432e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x364), 0x60); 8532e9fc1aSHaojian Zhuang 8632e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x114), 0x1000); 8732e9fc1aSHaojian Zhuang 8832e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x110)); 8932e9fc1aSHaojian Zhuang data |= (3 << 12); 9032e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x110), data); 9132e9fc1aSHaojian Zhuang 9232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x110)); 9332e9fc1aSHaojian Zhuang data |= (1 << 4); 9432e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x110), data); 9532e9fc1aSHaojian Zhuang 9632e9fc1aSHaojian Zhuang 9732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x110)); 9832e9fc1aSHaojian Zhuang data &= ~0x7; 9932e9fc1aSHaojian Zhuang data |= 0x5; 10032e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x110), data); 10132e9fc1aSHaojian Zhuang dsb(); 10232e9fc1aSHaojian Zhuang mdelay(10); 10332e9fc1aSHaojian Zhuang 10432e9fc1aSHaojian Zhuang 10532e9fc1aSHaojian Zhuang do { 10632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf6504000 + 0x008)); 10732e9fc1aSHaojian Zhuang data &= (3 << 20); 10832e9fc1aSHaojian Zhuang } while (data != (3 << 20)); 10932e9fc1aSHaojian Zhuang dsb(); 11032e9fc1aSHaojian Zhuang mdelay(10); 11132e9fc1aSHaojian Zhuang 11232e9fc1aSHaojian Zhuang 11332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf6504000 + 0x054)); 11432e9fc1aSHaojian Zhuang data &= ~((1 << 0) | (1 << 11)); 11532e9fc1aSHaojian Zhuang mmio_write_32((0xf6504000 + 0x054), data); 11632e9fc1aSHaojian Zhuang mdelay(10); 11732e9fc1aSHaojian Zhuang 11832e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x104)); 11932e9fc1aSHaojian Zhuang data &= ~(3 << 8); 12032e9fc1aSHaojian Zhuang data |= (1 << 8); 12132e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x104), data); 12232e9fc1aSHaojian Zhuang 12332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x100)); 12432e9fc1aSHaojian Zhuang data |= (1 << 0); 12532e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x100), data); 12632e9fc1aSHaojian Zhuang dsb(); 12732e9fc1aSHaojian Zhuang 12832e9fc1aSHaojian Zhuang do { 12932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x100)); 13032e9fc1aSHaojian Zhuang data &= (1 << 2); 13132e9fc1aSHaojian Zhuang } while (data != (1 << 2)); 13232e9fc1aSHaojian Zhuang 13332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf6504000 + 0x06c)); 13432e9fc1aSHaojian Zhuang data &= ~0xffff; 13532e9fc1aSHaojian Zhuang data |= 0x56; 13632e9fc1aSHaojian Zhuang mmio_write_32((0xf6504000 + 0x06c), data); 13732e9fc1aSHaojian Zhuang 13832e9fc1aSHaojian Zhuang data = mmio_read_32((0xf6504000 + 0x06c)); 13932e9fc1aSHaojian Zhuang data &= ~(0xffffff << 8); 14032e9fc1aSHaojian Zhuang data |= 0xc7a << 8; 14132e9fc1aSHaojian Zhuang mmio_write_32((0xf6504000 + 0x06c), data); 14232e9fc1aSHaojian Zhuang 14332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf6504000 + 0x058)); 14432e9fc1aSHaojian Zhuang data &= ((1 << 13) - 1); 14532e9fc1aSHaojian Zhuang data |= 0xccb; 14632e9fc1aSHaojian Zhuang mmio_write_32((0xf6504000 + 0x058), data); 14732e9fc1aSHaojian Zhuang 14832e9fc1aSHaojian Zhuang mmio_write_32((0xf6504000 + 0x060), 0x1fff); 14932e9fc1aSHaojian Zhuang mmio_write_32((0xf6504000 + 0x064), 0x1ffffff); 15032e9fc1aSHaojian Zhuang mmio_write_32((0xf6504000 + 0x068), 0x7fffffff); 15132e9fc1aSHaojian Zhuang mmio_write_32((0xf6504000 + 0x05c), 0x1); 15232e9fc1aSHaojian Zhuang 15332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf6504000 + 0x054)); 15432e9fc1aSHaojian Zhuang data &= ~(0xf << 12); 15532e9fc1aSHaojian Zhuang data |= 1 << 12; 15632e9fc1aSHaojian Zhuang mmio_write_32((0xf6504000 + 0x054), data); 15732e9fc1aSHaojian Zhuang dsb(); 15832e9fc1aSHaojian Zhuang 15932e9fc1aSHaojian Zhuang 16032e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x000)); 16132e9fc1aSHaojian Zhuang data &= ~(1 << 0); 16232e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x000), data); 16332e9fc1aSHaojian Zhuang 16432e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x004), 0x5110207d); 16532e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x134), 0x10000005); 16632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x134)); 16732e9fc1aSHaojian Zhuang 16832e9fc1aSHaojian Zhuang 16932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x000)); 17032e9fc1aSHaojian Zhuang data |= (1 << 0); 17132e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x000), data); 17232e9fc1aSHaojian Zhuang 17332e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x368), 0x100da); 17432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x378)); 17532e9fc1aSHaojian Zhuang data &= ~((1 << 7) - 1); 17632e9fc1aSHaojian Zhuang data |= 0x6b; 17732e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x378), data); 17832e9fc1aSHaojian Zhuang dsb(); 17932e9fc1aSHaojian Zhuang do { 18032e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x378)); 18132e9fc1aSHaojian Zhuang tmp = data & 0x7f; 18232e9fc1aSHaojian Zhuang data = (data & (0x7f << 8)) >> 8; 18332e9fc1aSHaojian Zhuang if (data != tmp) 18432e9fc1aSHaojian Zhuang continue; 18532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x37c)); 18632e9fc1aSHaojian Zhuang } while (!(data & 1)); 18732e9fc1aSHaojian Zhuang 18832e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x104)); 18932e9fc1aSHaojian Zhuang data &= ~((3 << 0) | 19032e9fc1aSHaojian Zhuang (3 << 8)); 19132e9fc1aSHaojian Zhuang cpuext_cfg = 1; 19232e9fc1aSHaojian Zhuang ddr_cfg = 1; 19332e9fc1aSHaojian Zhuang data |= cpuext_cfg | (ddr_cfg << 8); 19432e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x104), data); 19532e9fc1aSHaojian Zhuang dsb(); 19632e9fc1aSHaojian Zhuang 19732e9fc1aSHaojian Zhuang do { 19832e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x104)); 19932e9fc1aSHaojian Zhuang tmp = (data & (3 << 16)) >> 16; 20032e9fc1aSHaojian Zhuang if (cpuext_cfg != tmp) 20132e9fc1aSHaojian Zhuang continue; 20232e9fc1aSHaojian Zhuang tmp = (data & (3 << 24)) >> 24; 20332e9fc1aSHaojian Zhuang if (ddr_cfg != tmp) 20432e9fc1aSHaojian Zhuang continue; 20532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x000)); 20632e9fc1aSHaojian Zhuang data &= 1 << 28; 20732e9fc1aSHaojian Zhuang } while (!data); 20832e9fc1aSHaojian Zhuang 20932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x100)); 21032e9fc1aSHaojian Zhuang data &= ~(1 << 0); 21132e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x100), data); 21232e9fc1aSHaojian Zhuang dsb(); 21332e9fc1aSHaojian Zhuang do { 21432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x100)); 21532e9fc1aSHaojian Zhuang data &= (1 << 1); 21632e9fc1aSHaojian Zhuang } while (data != (1 << 1)); 21732e9fc1aSHaojian Zhuang mdelay(1000); 21832e9fc1aSHaojian Zhuang 21932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf6504000 + 0x054)); 22032e9fc1aSHaojian Zhuang data &= ~(1 << 28); 22132e9fc1aSHaojian Zhuang mmio_write_32((0xf6504000 + 0x054), data); 22232e9fc1aSHaojian Zhuang dsb(); 22332e9fc1aSHaojian Zhuang 22432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x110)); 22532e9fc1aSHaojian Zhuang data &= ~((1 << 4) | 22632e9fc1aSHaojian Zhuang (3 << 12)); 22732e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x110), data); 22832e9fc1aSHaojian Zhuang } 22932e9fc1aSHaojian Zhuang 23032e9fc1aSHaojian Zhuang int cat_533mhz_800mhz(void) 23132e9fc1aSHaojian Zhuang { 23232e9fc1aSHaojian Zhuang unsigned int data, i; 23332e9fc1aSHaojian Zhuang unsigned int bdl[5]; 23432e9fc1aSHaojian Zhuang 23532e9fc1aSHaojian Zhuang 23632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x1c8)); 23732e9fc1aSHaojian Zhuang data &= 0xfffff0f0; 238*483dce7eSHaojian Zhuang data |= 0x100f01; 23932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1c8), data); 24032e9fc1aSHaojian Zhuang 24132e9fc1aSHaojian Zhuang for (i = 0; i < 0x20; i++) { 24232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 24332e9fc1aSHaojian Zhuang data = (i << 0x10) + i; 24432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x140), data); 24532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x144), data); 24632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x148), data); 24732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x14c), data); 24832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x150), data); 24932e9fc1aSHaojian Zhuang 25032e9fc1aSHaojian Zhuang 25132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 25232e9fc1aSHaojian Zhuang data |= 0x80000; 25332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 25432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 25532e9fc1aSHaojian Zhuang data &= 0xfff7ffff; 25632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 25732e9fc1aSHaojian Zhuang 25832e9fc1aSHaojian Zhuang 25932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x8000); 26032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x0); 26132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x801); 26232e9fc1aSHaojian Zhuang do { 26332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 26432e9fc1aSHaojian Zhuang } while (data & 1); 26532e9fc1aSHaojian Zhuang 26632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 267*483dce7eSHaojian Zhuang if ((data & 0x400) == 0) { 26832e9fc1aSHaojian Zhuang mdelay(10); 26932e9fc1aSHaojian Zhuang return 0; 27032e9fc1aSHaojian Zhuang } 27132e9fc1aSHaojian Zhuang WARN("lpddr3 cat fail\n"); 27232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x1d4)); 27332e9fc1aSHaojian Zhuang if ((data & 0x1f00) && ((data & 0x1f) == 0)) { 27432e9fc1aSHaojian Zhuang bdl[0] = mmio_read_32((0xf712c000 + 0x140)); 27532e9fc1aSHaojian Zhuang bdl[1] = mmio_read_32((0xf712c000 + 0x144)); 27632e9fc1aSHaojian Zhuang bdl[2] = mmio_read_32((0xf712c000 + 0x148)); 27732e9fc1aSHaojian Zhuang bdl[3] = mmio_read_32((0xf712c000 + 0x14c)); 27832e9fc1aSHaojian Zhuang bdl[4] = mmio_read_32((0xf712c000 + 0x150)); 27932e9fc1aSHaojian Zhuang if ((!(bdl[0] & 0x1f001f)) || (!(bdl[1] & 0x1f001f)) || 28032e9fc1aSHaojian Zhuang (!(bdl[2] & 0x1f001f)) || (!(bdl[3] & 0x1f001f)) || 28132e9fc1aSHaojian Zhuang (!(bdl[4] & 0x1f001f))) { 28232e9fc1aSHaojian Zhuang WARN("lpddr3 cat deskew error\n"); 28332e9fc1aSHaojian Zhuang if (i == 0x1f) { 28432e9fc1aSHaojian Zhuang WARN("addrnbdl is max\n"); 28532e9fc1aSHaojian Zhuang return -EINVAL; 28632e9fc1aSHaojian Zhuang } 28732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x008), 0x400); 28832e9fc1aSHaojian Zhuang } else { 28932e9fc1aSHaojian Zhuang WARN("lpddr3 cat other error1\n"); 29032e9fc1aSHaojian Zhuang return -EINVAL; 29132e9fc1aSHaojian Zhuang } 29232e9fc1aSHaojian Zhuang } else { 29332e9fc1aSHaojian Zhuang WARN("lpddr3 cat other error2\n"); 29432e9fc1aSHaojian Zhuang return -EINVAL; 29532e9fc1aSHaojian Zhuang } 29632e9fc1aSHaojian Zhuang } 29732e9fc1aSHaojian Zhuang return -EINVAL; 29832e9fc1aSHaojian Zhuang } 29932e9fc1aSHaojian Zhuang 30032e9fc1aSHaojian Zhuang static void ddrx_rdet(void) 30132e9fc1aSHaojian Zhuang { 30232e9fc1aSHaojian Zhuang unsigned int data, rdet, bdl[4]; 30332e9fc1aSHaojian Zhuang 30432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x0d0)); 30532e9fc1aSHaojian Zhuang data &= 0xf800ffff; 30632e9fc1aSHaojian Zhuang data |= 0x8f0000; 30732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0d0), data); 30832e9fc1aSHaojian Zhuang 30932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x0dc)); 31032e9fc1aSHaojian Zhuang data &= 0xfffffff0; 31132e9fc1aSHaojian Zhuang data |= 0xf; 31232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0dc), data); 31332e9fc1aSHaojian Zhuang 31432e9fc1aSHaojian Zhuang 31532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 31632e9fc1aSHaojian Zhuang data |= 0x80000; 31732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 31832e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 31932e9fc1aSHaojian Zhuang data &= 0xfff7ffff; 32032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 32132e9fc1aSHaojian Zhuang 32232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x8000); 32332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0); 32432e9fc1aSHaojian Zhuang 32532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x0d0)); 32632e9fc1aSHaojian Zhuang data &= ~0xf0000000; 32732e9fc1aSHaojian Zhuang data |= 0x80000000; 32832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0d0), data); 32932e9fc1aSHaojian Zhuang 33032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x101); 33132e9fc1aSHaojian Zhuang do { 33232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 33332e9fc1aSHaojian Zhuang } while (!(data & 1)); 33432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 33532e9fc1aSHaojian Zhuang if (data & 0x100) 33632e9fc1aSHaojian Zhuang WARN("rdet lbs fail\n"); 33732e9fc1aSHaojian Zhuang 33832e9fc1aSHaojian Zhuang bdl[0] = mmio_read_32((0xf712c000 + 0x22c)) & 0x7f; 33932e9fc1aSHaojian Zhuang bdl[1] = mmio_read_32((0xf712c000 + 0x2ac)) & 0x7f; 34032e9fc1aSHaojian Zhuang bdl[2] = mmio_read_32((0xf712c000 + 0x32c)) & 0x7f; 34132e9fc1aSHaojian Zhuang bdl[3] = mmio_read_32((0xf712c000 + 0x3ac)) & 0x7f; 34232e9fc1aSHaojian Zhuang do { 34332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x22c)); 34432e9fc1aSHaojian Zhuang data &= ~0x7f; 34532e9fc1aSHaojian Zhuang data |= bdl[0]; 34632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x22c), data); 34732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x2ac)); 34832e9fc1aSHaojian Zhuang data &= ~0x7f; 34932e9fc1aSHaojian Zhuang data |= bdl[1]; 35032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2ac), data); 35132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x32c)); 35232e9fc1aSHaojian Zhuang data &= ~0x7f; 35332e9fc1aSHaojian Zhuang data |= bdl[2]; 35432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x32c), data); 35532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x3ac)); 35632e9fc1aSHaojian Zhuang data &= ~0x7f; 35732e9fc1aSHaojian Zhuang data |= bdl[3]; 35832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3ac), data); 35932e9fc1aSHaojian Zhuang 36032e9fc1aSHaojian Zhuang 36132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 36232e9fc1aSHaojian Zhuang data |= 0x80000; 36332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 36432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 36532e9fc1aSHaojian Zhuang data &= 0xfff7ffff; 36632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 36732e9fc1aSHaojian Zhuang 36832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x8000); 36932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0); 37032e9fc1aSHaojian Zhuang 37132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x0d0)); 37232e9fc1aSHaojian Zhuang data &= ~0xf0000000; 37332e9fc1aSHaojian Zhuang data |= 0x40000000; 37432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0d0), data); 37532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x101); 37632e9fc1aSHaojian Zhuang do { 37732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 37832e9fc1aSHaojian Zhuang } while (data & 1); 37932e9fc1aSHaojian Zhuang 38032e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 38132e9fc1aSHaojian Zhuang rdet = data & 0x100; 38232e9fc1aSHaojian Zhuang if (rdet) { 38332e9fc1aSHaojian Zhuang INFO("rdet ds fail\n"); 38432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x008), 0x100); 38532e9fc1aSHaojian Zhuang } 38632e9fc1aSHaojian Zhuang bdl[0]++; 38732e9fc1aSHaojian Zhuang bdl[1]++; 38832e9fc1aSHaojian Zhuang bdl[2]++; 38932e9fc1aSHaojian Zhuang bdl[3]++; 39032e9fc1aSHaojian Zhuang } while (rdet); 39132e9fc1aSHaojian Zhuang 39232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x0d0)); 39332e9fc1aSHaojian Zhuang data &= ~0xf0000000; 39432e9fc1aSHaojian Zhuang data |= 0x30000000; 39532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0d0), data); 39632e9fc1aSHaojian Zhuang 39732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x101); 39832e9fc1aSHaojian Zhuang do { 39932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 40032e9fc1aSHaojian Zhuang } while (data & 1); 40132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 40232e9fc1aSHaojian Zhuang if (data & 0x100) 40332e9fc1aSHaojian Zhuang INFO("rdet rbs av fail\n"); 40432e9fc1aSHaojian Zhuang } 40532e9fc1aSHaojian Zhuang 40632e9fc1aSHaojian Zhuang static void ddrx_wdet(void) 40732e9fc1aSHaojian Zhuang { 40822db0167SHaojian Zhuang unsigned int data, wdet, zero_bdl = 0, dq[4]; 40932e9fc1aSHaojian Zhuang int i; 41032e9fc1aSHaojian Zhuang 41132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x0d0)); 41232e9fc1aSHaojian Zhuang data &= ~0xf; 41332e9fc1aSHaojian Zhuang data |= 0xf; 41432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0d0), data); 41532e9fc1aSHaojian Zhuang 41632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 41732e9fc1aSHaojian Zhuang data |= 0x80000; 41832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 41932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 42032e9fc1aSHaojian Zhuang data &= ~0x80000; 42132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 42232e9fc1aSHaojian Zhuang 42332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x8000); 42432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0); 42532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x0d0)); 42632e9fc1aSHaojian Zhuang data &= ~0xf000; 42732e9fc1aSHaojian Zhuang data |= 0x8000; 42832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0d0), data); 42932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x201); 43032e9fc1aSHaojian Zhuang do { 43132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 43232e9fc1aSHaojian Zhuang } while (data & 1); 43332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 43432e9fc1aSHaojian Zhuang if (data & 0x200) 43532e9fc1aSHaojian Zhuang INFO("wdet lbs fail\n"); 43632e9fc1aSHaojian Zhuang 43732e9fc1aSHaojian Zhuang dq[0] = mmio_read_32((0xf712c000 + 0x234)) & 0x1f00; 43832e9fc1aSHaojian Zhuang dq[1] = mmio_read_32((0xf712c000 + 0x2b4)) & 0x1f00; 43932e9fc1aSHaojian Zhuang dq[2] = mmio_read_32((0xf712c000 + 0x334)) & 0x1f00; 44032e9fc1aSHaojian Zhuang dq[3] = mmio_read_32((0xf712c000 + 0x3b4)) & 0x1f00; 44132e9fc1aSHaojian Zhuang 44232e9fc1aSHaojian Zhuang do { 44332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x234), dq[0]); 44432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2b4), dq[1]); 44532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x334), dq[2]); 44632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3b4), dq[3]); 44732e9fc1aSHaojian Zhuang 44832e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 44932e9fc1aSHaojian Zhuang data |= 0x80000; 45032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 45132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 45232e9fc1aSHaojian Zhuang data &= ~0x80000; 45332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 45432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x8000); 45532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0); 45632e9fc1aSHaojian Zhuang 45732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x0d0)); 45832e9fc1aSHaojian Zhuang data &= ~0xf000; 45932e9fc1aSHaojian Zhuang data |= 0x4000; 46032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0d0), data); 46132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x201); 46232e9fc1aSHaojian Zhuang do { 46332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 46432e9fc1aSHaojian Zhuang } while (data & 1); 46532e9fc1aSHaojian Zhuang 46632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 46732e9fc1aSHaojian Zhuang wdet = data & 0x200; 46832e9fc1aSHaojian Zhuang if (wdet) { 46932e9fc1aSHaojian Zhuang INFO("wdet ds fail\n"); 47032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x008), 0x200); 47132e9fc1aSHaojian Zhuang } 47232e9fc1aSHaojian Zhuang mdelay(10); 47332e9fc1aSHaojian Zhuang 47432e9fc1aSHaojian Zhuang for (i = 0; i < 4; i++) { 47532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x210 + i * 0x80)); 47632e9fc1aSHaojian Zhuang if ((!(data & 0x1f)) || (!(data & 0x1f00)) || 47732e9fc1aSHaojian Zhuang (!(data & 0x1f0000)) || (!(data & 0x1f000000))) 47832e9fc1aSHaojian Zhuang zero_bdl = 1; 47932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x214 + i * 0x80)); 48032e9fc1aSHaojian Zhuang if ((!(data & 0x1f)) || (!(data & 0x1f00)) || 48132e9fc1aSHaojian Zhuang (!(data & 0x1f0000)) || (!(data & 0x1f000000))) 48232e9fc1aSHaojian Zhuang zero_bdl = 1; 48332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x218 + i * 0x80)); 48432e9fc1aSHaojian Zhuang if (!(data & 0x1f)) 48532e9fc1aSHaojian Zhuang zero_bdl = 1; 48632e9fc1aSHaojian Zhuang if (zero_bdl) { 48732e9fc1aSHaojian Zhuang if (i == 0) 48832e9fc1aSHaojian Zhuang dq[0] = dq[0] - 0x100; 48932e9fc1aSHaojian Zhuang if (i == 1) 49032e9fc1aSHaojian Zhuang dq[1] = dq[1] - 0x100; 49132e9fc1aSHaojian Zhuang if (i == 2) 49232e9fc1aSHaojian Zhuang dq[2] = dq[2] - 0x100; 49332e9fc1aSHaojian Zhuang if (i == 3) 49432e9fc1aSHaojian Zhuang dq[3] = dq[3] - 0x100; 49532e9fc1aSHaojian Zhuang } 49632e9fc1aSHaojian Zhuang } 49732e9fc1aSHaojian Zhuang } while (wdet); 49832e9fc1aSHaojian Zhuang 49932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x0d0)); 50032e9fc1aSHaojian Zhuang data &= ~0xf000; 50132e9fc1aSHaojian Zhuang data |= 0x3000; 50232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0d0), data); 50332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x201); 50432e9fc1aSHaojian Zhuang do { 50532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 50632e9fc1aSHaojian Zhuang } while (data & 1); 50732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 50832e9fc1aSHaojian Zhuang if (data & 0x200) 50932e9fc1aSHaojian Zhuang INFO("wdet rbs av fail\n"); 51032e9fc1aSHaojian Zhuang } 51132e9fc1aSHaojian Zhuang 512*483dce7eSHaojian Zhuang void set_ddrc_150mhz(void) 513*483dce7eSHaojian Zhuang { 514*483dce7eSHaojian Zhuang unsigned int data; 515*483dce7eSHaojian Zhuang 516*483dce7eSHaojian Zhuang mmio_write_32((0xf7032000 + 0x580), 0x1); 517*483dce7eSHaojian Zhuang mmio_write_32((0xf7032000 + 0x5a8), 0x7); 518*483dce7eSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x104)); 519*483dce7eSHaojian Zhuang data &= 0xfffffcff; 520*483dce7eSHaojian Zhuang mmio_write_32((0xf7032000 + 0x104), data); 521*483dce7eSHaojian Zhuang 522*483dce7eSHaojian Zhuang mmio_write_32((0xf7030000 + 0x050), 0x31); 523*483dce7eSHaojian Zhuang mmio_write_32((0xf7030000 + 0x240), 0x5ffff); 524*483dce7eSHaojian Zhuang mmio_write_32((0xf7030000 + 0x344), 0xf5ff); 525*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f); 526*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x00c), 0xf0f); 527*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x018), 0x7); 528*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x090), 0x7200000); 529*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x258), 0x720); 530*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2d8), 0x720); 531*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x358), 0x720); 532*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3d8), 0x720); 533*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x018), 0x7); 534*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f); 535*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0b4), 0xf); 536*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x088), 0x3fff801); 537*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), 0x8940000); 538*483dce7eSHaojian Zhuang 539*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x078)); 540*483dce7eSHaojian Zhuang data |= 4; 541*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x078), data); 542*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x01c), 0x8000080); 543*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x020)); 544*483dce7eSHaojian Zhuang data &= 0xfffffffe; 545*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x020), data); 546*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 547*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x010), 0x500000f); 548*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x014), 0x10); 549*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x1e4)); 550*483dce7eSHaojian Zhuang data &= 0xffffff00; 551*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1e4), data); 552*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x030), 0x30c82355); 553*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x034), 0x62112bb); 554*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x038), 0x20041022); 555*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x03c), 0x63177497); 556*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x040), 0x3008407); 557*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x064), 0x10483); 558*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x068), 0xff0a0000); 559*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 560*483dce7eSHaojian Zhuang data &= 0xffff0000; 561*483dce7eSHaojian Zhuang data |= 0x184; 562*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 563*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 564*483dce7eSHaojian Zhuang data &= 0xbfffffff; 565*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 566*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x020)); 567*483dce7eSHaojian Zhuang data &= ~0x10; 568*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x020), data); 569*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x080)); 570*483dce7eSHaojian Zhuang data &= ~0x2000; 571*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x080), data); 572*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x270), 0x3); 573*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2f0), 0x3); 574*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x370), 0x3); 575*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3f0), 0x3); 576*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), 0x90420880); 577*483dce7eSHaojian Zhuang 578*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x040), 0x0); 579*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x146d); 580*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x050), 0x100123); 581*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x060), 0x133); 582*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x064), 0x133); 583*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x200), 0xa1000); 584*483dce7eSHaojian Zhuang 585*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x100), 0xb3290d08); 586*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x104), 0x9621821); 587*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x108), 0x45009023); 588*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x10c), 0xaf44c145); 589*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x110), 0x10b00000); 590*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x114), 0x11080806); 591*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x118), 0x44); 592*483dce7eSHaojian Zhuang do { 593*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 594*483dce7eSHaojian Zhuang } while (data & 1); 595*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 596*483dce7eSHaojian Zhuang if (data & 8) { 597*483dce7eSHaojian Zhuang NOTICE("fail to init ddr3 rank0\n"); 598*483dce7eSHaojian Zhuang return; 599*483dce7eSHaojian Zhuang } 600*483dce7eSHaojian Zhuang 601*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 602*483dce7eSHaojian Zhuang data |= 1; 603*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 604*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x21); 605*483dce7eSHaojian Zhuang do { 606*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 607*483dce7eSHaojian Zhuang } while (data & 1); 608*483dce7eSHaojian Zhuang 609*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 610*483dce7eSHaojian Zhuang if (data & 0x8) 611*483dce7eSHaojian Zhuang NOTICE("ddr3 rank1 init failure\n"); 612*483dce7eSHaojian Zhuang else 613*483dce7eSHaojian Zhuang INFO("ddr3 rank1 init pass\n"); 614*483dce7eSHaojian Zhuang 615*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 616*483dce7eSHaojian Zhuang data &= ~0xf; 617*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 618*483dce7eSHaojian Zhuang INFO("succeed to set ddrc 150mhz\n"); 619*483dce7eSHaojian Zhuang } 620*483dce7eSHaojian Zhuang 621*483dce7eSHaojian Zhuang void set_ddrc_266mhz(void) 622*483dce7eSHaojian Zhuang { 623*483dce7eSHaojian Zhuang unsigned int data; 624*483dce7eSHaojian Zhuang 625*483dce7eSHaojian Zhuang mmio_write_32((0xf7032000 + 0x580), 0x3); 626*483dce7eSHaojian Zhuang mmio_write_32((0xf7032000 + 0x5a8), 0x1003); 627*483dce7eSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x104)); 628*483dce7eSHaojian Zhuang data &= 0xfffffcff; 629*483dce7eSHaojian Zhuang mmio_write_32((0xf7032000 + 0x104), data); 630*483dce7eSHaojian Zhuang 631*483dce7eSHaojian Zhuang mmio_write_32((0xf7030000 + 0x050), 0x31); 632*483dce7eSHaojian Zhuang mmio_write_32((0xf7030000 + 0x240), 0x5ffff); 633*483dce7eSHaojian Zhuang mmio_write_32((0xf7030000 + 0x344), 0xf5ff); 634*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f); 635*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x00c), 0xf0f); 636*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x018), 0x7); 637*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x090), 0x7200000); 638*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x258), 0x720); 639*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2d8), 0x720); 640*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x358), 0x720); 641*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3d8), 0x720); 642*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x018), 0x7); 643*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f); 644*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0b4), 0xf); 645*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x088), 0x3fff801); 646*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), 0x8940000); 647*483dce7eSHaojian Zhuang 648*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x078)); 649*483dce7eSHaojian Zhuang data |= 4; 650*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x078), data); 651*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x01c), 0x8000080); 652*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x020)); 653*483dce7eSHaojian Zhuang data &= 0xfffffffe; 654*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x020), data); 655*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 656*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x010), 0x500000f); 657*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x014), 0x10); 658*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x1e4)); 659*483dce7eSHaojian Zhuang data &= 0xffffff00; 660*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1e4), data); 661*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x030), 0x510d4455); 662*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x034), 0x8391ebb); 663*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x038), 0x2005103c); 664*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x03c), 0x6329950b); 665*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x040), 0x300858c); 666*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x064), 0x10483); 667*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x068), 0xff0a0000); 668*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 669*483dce7eSHaojian Zhuang data &= 0xffff0000; 670*483dce7eSHaojian Zhuang data |= 0x184; 671*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 672*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 673*483dce7eSHaojian Zhuang data &= 0xbfffffff; 674*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 675*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x020)); 676*483dce7eSHaojian Zhuang data &= ~0x10; 677*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x020), data); 678*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x080)); 679*483dce7eSHaojian Zhuang data &= ~0x2000; 680*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x080), data); 681*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x270), 0x3); 682*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2f0), 0x3); 683*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x370), 0x3); 684*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3f0), 0x3); 685*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), 0x90420880); 686*483dce7eSHaojian Zhuang 687*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x040), 0x0); 688*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x146d); 689*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x050), 0x100123); 690*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x060), 0x133); 691*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x064), 0x133); 692*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x200), 0xa1000); 693*483dce7eSHaojian Zhuang 694*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x100), 0xb441d50d); 695*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x104), 0xf721839); 696*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x108), 0x5500f03f); 697*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x10c), 0xaf486145); 698*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x110), 0x10b00000); 699*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x114), 0x12080d06); 700*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x118), 0x44); 701*483dce7eSHaojian Zhuang do { 702*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 703*483dce7eSHaojian Zhuang } while (data & 1); 704*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 705*483dce7eSHaojian Zhuang if (data & 8) { 706*483dce7eSHaojian Zhuang NOTICE("fail to init ddr3 rank0\n"); 707*483dce7eSHaojian Zhuang return; 708*483dce7eSHaojian Zhuang } 709*483dce7eSHaojian Zhuang 710*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 711*483dce7eSHaojian Zhuang data |= 1; 712*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 713*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x21); 714*483dce7eSHaojian Zhuang do { 715*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 716*483dce7eSHaojian Zhuang } while (data & 1); 717*483dce7eSHaojian Zhuang 718*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 719*483dce7eSHaojian Zhuang if (data & 0x8) 720*483dce7eSHaojian Zhuang NOTICE("ddr3 rank1 init failure\n"); 721*483dce7eSHaojian Zhuang else 722*483dce7eSHaojian Zhuang INFO("ddr3 rank1 init pass\n"); 723*483dce7eSHaojian Zhuang 724*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 725*483dce7eSHaojian Zhuang data &= ~0xf; 726*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 727*483dce7eSHaojian Zhuang INFO("succeed to set ddrc 266mhz\n"); 728*483dce7eSHaojian Zhuang } 729*483dce7eSHaojian Zhuang 730*483dce7eSHaojian Zhuang void set_ddrc_400mhz(void) 731*483dce7eSHaojian Zhuang { 732*483dce7eSHaojian Zhuang unsigned int data; 733*483dce7eSHaojian Zhuang 734*483dce7eSHaojian Zhuang mmio_write_32((0xf7032000 + 0x580), 0x2); 735*483dce7eSHaojian Zhuang mmio_write_32((0xf7032000 + 0x5a8), 0x1003); 736*483dce7eSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x104)); 737*483dce7eSHaojian Zhuang data &= 0xfffffcff; 738*483dce7eSHaojian Zhuang mmio_write_32((0xf7032000 + 0x104), data); 739*483dce7eSHaojian Zhuang 740*483dce7eSHaojian Zhuang mmio_write_32((0xf7030000 + 0x050), 0x31); 741*483dce7eSHaojian Zhuang mmio_write_32((0xf7030000 + 0x240), 0x5ffff); 742*483dce7eSHaojian Zhuang mmio_write_32((0xf7030000 + 0x344), 0xf5ff); 743*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f); 744*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x00c), 0xf0f); 745*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x018), 0x7); 746*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x090), 0x7200000); 747*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x258), 0x720); 748*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2d8), 0x720); 749*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x358), 0x720); 750*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3d8), 0x720); 751*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x018), 0x7); 752*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f); 753*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0b4), 0xf); 754*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x088), 0x3fff801); 755*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), 0x8940000); 756*483dce7eSHaojian Zhuang 757*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x078)); 758*483dce7eSHaojian Zhuang data |= 4; 759*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x078), data); 760*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x01c), 0x8000080); 761*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x020)); 762*483dce7eSHaojian Zhuang data &= 0xfffffffe; 763*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x020), data); 764*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 765*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x010), 0x500000f); 766*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x014), 0x10); 767*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x1e4)); 768*483dce7eSHaojian Zhuang data &= 0xffffff00; 769*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1e4), data); 770*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x030), 0x75525655); 771*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x034), 0xa552abb); 772*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x038), 0x20071059); 773*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x03c), 0x633e8591); 774*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x040), 0x3008691); 775*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x064), 0x10483); 776*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x068), 0xff0a0000); 777*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 778*483dce7eSHaojian Zhuang data &= 0xffff0000; 779*483dce7eSHaojian Zhuang data |= 0x184; 780*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 781*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 782*483dce7eSHaojian Zhuang data &= 0xbfffffff; 783*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 784*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x020)); 785*483dce7eSHaojian Zhuang data &= ~0x10; 786*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x020), data); 787*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x080)); 788*483dce7eSHaojian Zhuang data &= ~0x2000; 789*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x080), data); 790*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x270), 0x3); 791*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2f0), 0x3); 792*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x370), 0x3); 793*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3f0), 0x3); 794*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), 0x90420880); 795*483dce7eSHaojian Zhuang 796*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x040), 0x0); 797*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x146d); 798*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x050), 0x100123); 799*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x060), 0x133); 800*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x064), 0x133); 801*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x200), 0xa1000); 802*483dce7eSHaojian Zhuang 803*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x100), 0xb55a9d12); 804*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x104), 0x17721855); 805*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x108), 0x7501505f); 806*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x10c), 0xaf4ca245); 807*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x110), 0x10b00000); 808*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x114), 0x13081306); 809*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x118), 0x44); 810*483dce7eSHaojian Zhuang do { 811*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 812*483dce7eSHaojian Zhuang } while (data & 1); 813*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 814*483dce7eSHaojian Zhuang if (data & 8) { 815*483dce7eSHaojian Zhuang NOTICE("fail to init ddr3 rank0\n"); 816*483dce7eSHaojian Zhuang return; 817*483dce7eSHaojian Zhuang } 818*483dce7eSHaojian Zhuang 819*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 820*483dce7eSHaojian Zhuang data |= 1; 821*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 822*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x21); 823*483dce7eSHaojian Zhuang do { 824*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 825*483dce7eSHaojian Zhuang } while (data & 1); 826*483dce7eSHaojian Zhuang 827*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 828*483dce7eSHaojian Zhuang if (data & 0x8) 829*483dce7eSHaojian Zhuang NOTICE("ddr3 rank1 init failure\n"); 830*483dce7eSHaojian Zhuang else 831*483dce7eSHaojian Zhuang INFO("ddr3 rank1 init pass\n"); 832*483dce7eSHaojian Zhuang 833*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 834*483dce7eSHaojian Zhuang data &= ~0xf; 835*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 836*483dce7eSHaojian Zhuang INFO("succeed to set ddrc 400mhz\n"); 837*483dce7eSHaojian Zhuang } 838*483dce7eSHaojian Zhuang 839*483dce7eSHaojian Zhuang void set_ddrc_533mhz(void) 84032e9fc1aSHaojian Zhuang { 84132e9fc1aSHaojian Zhuang unsigned int data; 84232e9fc1aSHaojian Zhuang 84332e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x580), 0x3); 84432e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x5a8), 0x11111); 84532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x104)); 84632e9fc1aSHaojian Zhuang data |= 0x100; 84732e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x104), data); 84832e9fc1aSHaojian Zhuang 84932e9fc1aSHaojian Zhuang mmio_write_32((0xf7030000 + 0x050), 0x30); 85032e9fc1aSHaojian Zhuang mmio_write_32((0xf7030000 + 0x240), 0x5ffff); 85132e9fc1aSHaojian Zhuang mmio_write_32((0xf7030000 + 0x344), 0xf5ff); 85232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x00c), 0x400); 853*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x00c), 0x400); 85432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x018), 0x7); 85532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x090), 0x6400000); 85632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x258), 0x640); 85732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2d8), 0x640); 85832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x358), 0x640); 85932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3d8), 0x640); 86032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x018), 0x0); 86132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f); 86232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0b4), 0xf); 86332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x088), 0x3fff801); 86432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), 0x8940000); 86532e9fc1aSHaojian Zhuang 86632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x078)); 86732e9fc1aSHaojian Zhuang data |= 4; 86832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x078), data); 86932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x01c), 0x8000080); 87032e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x020)); 87132e9fc1aSHaojian Zhuang data &= 0xfffffffe; 87232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x020), data); 87332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 87432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x010), 0x500000f); 87532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x014), 0x10); 87632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x1e4)); 87732e9fc1aSHaojian Zhuang data &= 0xffffff00; 87832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1e4), data); 87932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x030), 0x9dd87855); 88032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x034), 0xa7138bb); 88132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x038), 0x20091477); 88232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x03c), 0x84534e16); 88332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x040), 0x3008817); 88432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x064), 0x106c3); 88532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x068), 0xff0a0000); 88632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 88732e9fc1aSHaojian Zhuang data &= 0xffff0000; 88832e9fc1aSHaojian Zhuang data |= 0x305; 88932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 89032e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 89132e9fc1aSHaojian Zhuang data |= 0x40000000; 89232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 89332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x020)); 89432e9fc1aSHaojian Zhuang data &= ~0x10; 89532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x020), data); 89632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x080)); 89732e9fc1aSHaojian Zhuang data &= ~0x2000; 89832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x080), data); 89932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x270), 0x3); 90032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2f0), 0x3); 90132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x370), 0x3); 90232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3f0), 0x3); 90332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), 0xd0420900); 90432e9fc1aSHaojian Zhuang 90532e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x040), 0x0); 90632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x140f); 90732e9fc1aSHaojian Zhuang do { 90832e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 90932e9fc1aSHaojian Zhuang } while (data & 1); 91032e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 91132e9fc1aSHaojian Zhuang if (data & 0x7fe) { 91232e9fc1aSHaojian Zhuang NOTICE("failed to init lpddr3 rank0 dram phy\n"); 91332e9fc1aSHaojian Zhuang return; 91432e9fc1aSHaojian Zhuang } 915*483dce7eSHaojian Zhuang cat_533mhz_800mhz(); 916*483dce7eSHaojian Zhuang 917*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0xf1); 918*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x050), 0x100123); 919*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x060), 0x133); 920*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x064), 0x133); 921*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x200), 0xa1000); 922*483dce7eSHaojian Zhuang 923*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x100), 0xb77b6718); 924*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x104), 0x1e82a071); 925*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x108), 0x9501c07e); 926*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x10c), 0xaf50c255); 927*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x110), 0x10b00000); 928*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x114), 0x13181908); 929*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x118), 0x44); 930*483dce7eSHaojian Zhuang do { 931*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 932*483dce7eSHaojian Zhuang } while (data & 1); 933*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 934*483dce7eSHaojian Zhuang if (data & 0x7fe) { 935*483dce7eSHaojian Zhuang NOTICE("fail to init ddr3 rank0\n"); 936*483dce7eSHaojian Zhuang return; 937*483dce7eSHaojian Zhuang } 938*483dce7eSHaojian Zhuang ddrx_rdet(); 939*483dce7eSHaojian Zhuang ddrx_wdet(); 940*483dce7eSHaojian Zhuang 941*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 942*483dce7eSHaojian Zhuang data |= 1; 943*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 944*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x21); 945*483dce7eSHaojian Zhuang do { 946*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 947*483dce7eSHaojian Zhuang } while (data & 1); 948*483dce7eSHaojian Zhuang 949*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 950*483dce7eSHaojian Zhuang if (data & 0x7fe) 951*483dce7eSHaojian Zhuang NOTICE("ddr3 rank1 init failure\n"); 952*483dce7eSHaojian Zhuang else 953*483dce7eSHaojian Zhuang INFO("ddr3 rank1 init pass\n"); 954*483dce7eSHaojian Zhuang 955*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 956*483dce7eSHaojian Zhuang data &= ~0xf; 957*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 958*483dce7eSHaojian Zhuang INFO("succeed to set ddrc 533mhz\n"); 95932e9fc1aSHaojian Zhuang } 96032e9fc1aSHaojian Zhuang 961*483dce7eSHaojian Zhuang void set_ddrc_800mhz(void) 96232e9fc1aSHaojian Zhuang { 96332e9fc1aSHaojian Zhuang unsigned int data; 96432e9fc1aSHaojian Zhuang 96532e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x580), 0x2); 96632e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x5a8), 0x1003); 96732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x104)); 96832e9fc1aSHaojian Zhuang data &= 0xfffffcff; 96932e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x104), data); 97032e9fc1aSHaojian Zhuang 97132e9fc1aSHaojian Zhuang mmio_write_32((0xf7030000 + 0x050), 0x30); 97232e9fc1aSHaojian Zhuang mmio_write_32((0xf7030000 + 0x240), 0x5ffff); 97332e9fc1aSHaojian Zhuang mmio_write_32((0xf7030000 + 0x344), 0xf5ff); 97432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x00c), 0x400); 975*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x00c), 0x400); 97632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x018), 0x7); 97732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x090), 0x5400000); 97832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x258), 0x540); 97932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2d8), 0x540); 98032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x358), 0x540); 98132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3d8), 0x540); 98232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x018), 0x0); 98332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f); 98432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0b4), 0xf); 98532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x088), 0x3fff801); 98632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), 0x8940000); 98732e9fc1aSHaojian Zhuang 98832e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x078)); 98932e9fc1aSHaojian Zhuang data |= 4; 99032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x078), data); 99132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x01c), 0x8000080); 99232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x020)); 99332e9fc1aSHaojian Zhuang data &= 0xfffffffe; 99432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x020), data); 99532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 99632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x010), 0x500000f); 99732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x014), 0x10); 99832e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x1e4)); 99932e9fc1aSHaojian Zhuang data &= 0xffffff00; 100032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1e4), data); 100132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x030), 0xe663ab77); 100232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x034), 0xea952db); 100332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x038), 0x200d1cb1); 100432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x03c), 0xc67d0721); 100532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x040), 0x3008aa1); 100632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x064), 0x11a43); 100732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x068), 0xff0a0000); 100832e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 100932e9fc1aSHaojian Zhuang data &= 0xffff0000; 101032e9fc1aSHaojian Zhuang data |= 0x507; 101132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 101232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 101332e9fc1aSHaojian Zhuang data |= 0x40000000; 101432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 101532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x020)); 101632e9fc1aSHaojian Zhuang data &= 0xffffffef; 101732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x020), data); 101832e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x080)); 101932e9fc1aSHaojian Zhuang data &= 0xffffdfff; 102032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x080), data); 102132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x270), 0x3); 102232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2f0), 0x3); 102332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x370), 0x3); 102432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3f0), 0x3); 102532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), 0xd0420900); 102632e9fc1aSHaojian Zhuang 102732e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x040), 0x2001); 102832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x140f); 102932e9fc1aSHaojian Zhuang do { 103032e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 103132e9fc1aSHaojian Zhuang } while (data & 1); 103232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 103332e9fc1aSHaojian Zhuang if (data & 0x7fe) { 103432e9fc1aSHaojian Zhuang WARN("failed to init lpddr3 rank0 dram phy\n"); 103532e9fc1aSHaojian Zhuang return; 103632e9fc1aSHaojian Zhuang } 1037*483dce7eSHaojian Zhuang cat_533mhz_800mhz(); 1038*483dce7eSHaojian Zhuang 1039*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0xf1); 1040*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x050), 0x100023); 1041*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x060), 0x133); 1042*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x064), 0x133); 1043*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x200), 0xa1000); 1044*483dce7eSHaojian Zhuang 1045*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x100), 0x755a9d12); 1046*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x104), 0x1753b055); 1047*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x108), 0x7401505f); 1048*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x10c), 0x578ca244); 1049*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x110), 0x10700000); 1050*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x114), 0x13141306); 1051*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x118), 0x44); 1052*483dce7eSHaojian Zhuang do { 1053*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 1054*483dce7eSHaojian Zhuang } while (data & 1); 1055*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 1056*483dce7eSHaojian Zhuang if (data & 0x7fe) { 1057*483dce7eSHaojian Zhuang NOTICE("fail to init ddr3 rank0\n"); 1058*483dce7eSHaojian Zhuang return; 1059*483dce7eSHaojian Zhuang } 1060*483dce7eSHaojian Zhuang ddrx_rdet(); 1061*483dce7eSHaojian Zhuang ddrx_wdet(); 1062*483dce7eSHaojian Zhuang 1063*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 1064*483dce7eSHaojian Zhuang data |= 1; 1065*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 1066*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x21); 1067*483dce7eSHaojian Zhuang do { 1068*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 1069*483dce7eSHaojian Zhuang } while (data & 1); 1070*483dce7eSHaojian Zhuang 1071*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 1072*483dce7eSHaojian Zhuang if (data & 0x7fe) 1073*483dce7eSHaojian Zhuang NOTICE("ddr3 rank1 init failure\n"); 1074*483dce7eSHaojian Zhuang else 1075*483dce7eSHaojian Zhuang INFO("ddr3 rank1 init pass\n"); 1076*483dce7eSHaojian Zhuang 1077*483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 1078*483dce7eSHaojian Zhuang data &= ~0xf; 1079*483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 1080*483dce7eSHaojian Zhuang INFO("succeed to set ddrc 800mhz\n"); 108132e9fc1aSHaojian Zhuang } 108232e9fc1aSHaojian Zhuang 1083*483dce7eSHaojian Zhuang static void ddrc_common_init(int freq) 108432e9fc1aSHaojian Zhuang { 108532e9fc1aSHaojian Zhuang unsigned int data; 108632e9fc1aSHaojian Zhuang 108732e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x020), 0x1); 108832e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x100), 0x1700); 108932e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x104), 0x71040004); 109032e9fc1aSHaojian Zhuang mmio_write_32((0xf7121400 + 0x104), 0xf); 109132e9fc1aSHaojian Zhuang mmio_write_32((0xf7121800 + 0x104), 0xf); 109232e9fc1aSHaojian Zhuang mmio_write_32((0xf7121c00 + 0x104), 0xf); 109332e9fc1aSHaojian Zhuang mmio_write_32((0xf7122000 + 0x104), 0xf); 109432e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x02c), 0x6); 1095*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x020), 0x30003); 109632e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x028), 0x310201); 109732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1e4), 0xfe007600); 109832e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x01c), 0xaf001); 109932e9fc1aSHaojian Zhuang 110032e9fc1aSHaojian Zhuang 110132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7128000 + 0x280)); 110232e9fc1aSHaojian Zhuang data |= 1 << 7; 110332e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x280), data); 110432e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x244), 0x3); 110532e9fc1aSHaojian Zhuang 1106*483dce7eSHaojian Zhuang if (freq == DDR_FREQ_800M) 1107*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x240), 167 * (freq / 2) / 1024); 110832e9fc1aSHaojian Zhuang else 1109*483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x240), 167 * freq / 1024); 111032e9fc1aSHaojian Zhuang 111132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x080)); 111232e9fc1aSHaojian Zhuang data &= 0xffff; 111332e9fc1aSHaojian Zhuang data |= 0x4002000; 111432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x080), data); 111532e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x000), 0x0); 111632e9fc1aSHaojian Zhuang do { 111732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7128000 + 0x294)); 111832e9fc1aSHaojian Zhuang } while (data & 1); 111932e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x000), 0x2); 112032e9fc1aSHaojian Zhuang } 112132e9fc1aSHaojian Zhuang 112232e9fc1aSHaojian Zhuang 112332e9fc1aSHaojian Zhuang static int dienum_det_and_rowcol_cfg(void) 112432e9fc1aSHaojian Zhuang { 112532e9fc1aSHaojian Zhuang unsigned int data; 112632e9fc1aSHaojian Zhuang 112732e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x210), 0x87); 112832e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x218), 0x10000); 112932e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x00c), 0x1); 113032e9fc1aSHaojian Zhuang do { 113132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7128000 + 0x00c)); 113232e9fc1aSHaojian Zhuang } while (data & 1); 113332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7128000 + 0x4a8)) & 0xfc; 113432e9fc1aSHaojian Zhuang switch (data) { 113532e9fc1aSHaojian Zhuang case 0x18: 113632e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x060), 0x132); 113732e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x064), 0x132); 113832e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x100), 0x1600); 113932e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x104), 0x71040004); 114032e9fc1aSHaojian Zhuang break; 114132e9fc1aSHaojian Zhuang case 0x1c: 114232e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x060), 0x142); 114332e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x064), 0x142); 114432e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x100), 0x1700); 114532e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x104), 0x71040004); 114632e9fc1aSHaojian Zhuang break; 114732e9fc1aSHaojian Zhuang case 0x58: 114832e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x060), 0x133); 114932e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x064), 0x133); 115032e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x100), 0x1700); 115132e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x104), 0x71040004); 115232e9fc1aSHaojian Zhuang break; 115332e9fc1aSHaojian Zhuang default: 115432e9fc1aSHaojian Zhuang break; 115532e9fc1aSHaojian Zhuang } 115632e9fc1aSHaojian Zhuang if (!data) 115732e9fc1aSHaojian Zhuang return -EINVAL; 115832e9fc1aSHaojian Zhuang return 0; 115932e9fc1aSHaojian Zhuang } 116032e9fc1aSHaojian Zhuang 116132e9fc1aSHaojian Zhuang static int detect_ddr_chip_info(void) 116232e9fc1aSHaojian Zhuang { 116332e9fc1aSHaojian Zhuang unsigned int data, mr5, mr6, mr7; 116432e9fc1aSHaojian Zhuang 116532e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x210), 0x57); 116632e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x218), 0x10000); 116732e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x00c), 0x1); 116832e9fc1aSHaojian Zhuang 116932e9fc1aSHaojian Zhuang do { 117032e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7128000 + 0x00c)); 117132e9fc1aSHaojian Zhuang } while (data & 1); 117232e9fc1aSHaojian Zhuang 117332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7128000 + 0x4a8)); 117432e9fc1aSHaojian Zhuang mr5 = data & 0xff; 117532e9fc1aSHaojian Zhuang switch (mr5) { 117632e9fc1aSHaojian Zhuang case 1: 117732e9fc1aSHaojian Zhuang INFO("Samsung DDR\n"); 117832e9fc1aSHaojian Zhuang break; 117932e9fc1aSHaojian Zhuang case 6: 118032e9fc1aSHaojian Zhuang INFO("Hynix DDR\n"); 118132e9fc1aSHaojian Zhuang break; 118232e9fc1aSHaojian Zhuang case 3: 118332e9fc1aSHaojian Zhuang INFO("Elpida DDR\n"); 118432e9fc1aSHaojian Zhuang break; 118532e9fc1aSHaojian Zhuang default: 118632e9fc1aSHaojian Zhuang INFO("DDR from other vendors\n"); 118732e9fc1aSHaojian Zhuang break; 118832e9fc1aSHaojian Zhuang } 118932e9fc1aSHaojian Zhuang 119032e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x210), 0x67); 119132e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x218), 0x10000); 119232e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x00c), 0x1); 119332e9fc1aSHaojian Zhuang do { 119432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7128000 + 0x00c)); 119532e9fc1aSHaojian Zhuang } while (data & 1); 119632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7128000 + 0x4a8)); 119732e9fc1aSHaojian Zhuang mr6 = data & 0xff; 119832e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x210), 0x77); 119932e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x218), 0x10000); 120032e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x00c), 0x1); 120132e9fc1aSHaojian Zhuang do { 120232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7128000 + 0x00c)); 120332e9fc1aSHaojian Zhuang } while (data & 1); 120432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7128000 + 0x4a8)); 120532e9fc1aSHaojian Zhuang mr7 = data & 0xff; 120632e9fc1aSHaojian Zhuang data = mr5 + (mr6 << 8) + (mr7 << 16); 120732e9fc1aSHaojian Zhuang return data; 120832e9fc1aSHaojian Zhuang } 120932e9fc1aSHaojian Zhuang 1210*483dce7eSHaojian Zhuang void ddr_phy_reset(void) 1211*483dce7eSHaojian Zhuang { 1212*483dce7eSHaojian Zhuang mmio_write_32(0xf7030340, 0xa000); 1213*483dce7eSHaojian Zhuang mmio_write_32(0xf7030344, 0xa000); 1214*483dce7eSHaojian Zhuang } 1215*483dce7eSHaojian Zhuang 121632e9fc1aSHaojian Zhuang int lpddr3_freq_init(int freq) 121732e9fc1aSHaojian Zhuang { 1218*483dce7eSHaojian Zhuang set_ddrc_150mhz(); 1219*483dce7eSHaojian Zhuang if (freq > DDR_FREQ_150M) { 1220*483dce7eSHaojian Zhuang ddr_phy_reset(); 1221*483dce7eSHaojian Zhuang set_ddrc_266mhz(); 1222*483dce7eSHaojian Zhuang } 1223*483dce7eSHaojian Zhuang if (freq > DDR_FREQ_266M) { 1224*483dce7eSHaojian Zhuang ddr_phy_reset(); 1225*483dce7eSHaojian Zhuang set_ddrc_400mhz(); 1226*483dce7eSHaojian Zhuang } 1227*483dce7eSHaojian Zhuang if (freq > DDR_FREQ_400M) { 1228*483dce7eSHaojian Zhuang ddr_phy_reset(); 122932e9fc1aSHaojian Zhuang set_ddrc_533mhz(); 123032e9fc1aSHaojian Zhuang } 1231*483dce7eSHaojian Zhuang if (freq > DDR_FREQ_533M) { 1232*483dce7eSHaojian Zhuang ddr_phy_reset(); 1233*483dce7eSHaojian Zhuang set_ddrc_800mhz(); 123432e9fc1aSHaojian Zhuang } 123532e9fc1aSHaojian Zhuang return 0; 123632e9fc1aSHaojian Zhuang } 123732e9fc1aSHaojian Zhuang 123832e9fc1aSHaojian Zhuang static void init_ddr(int freq) 123932e9fc1aSHaojian Zhuang { 124032e9fc1aSHaojian Zhuang unsigned int data; 124132e9fc1aSHaojian Zhuang int ret; 124232e9fc1aSHaojian Zhuang 124332e9fc1aSHaojian Zhuang 124432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x030)); 124532e9fc1aSHaojian Zhuang data |= 1; 124632e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x030), data); 124732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x010)); 124832e9fc1aSHaojian Zhuang data |= 1; 124932e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x010), data); 125032e9fc1aSHaojian Zhuang 1251*483dce7eSHaojian Zhuang udelay(300); 125232e9fc1aSHaojian Zhuang do { 125332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x030)); 125432e9fc1aSHaojian Zhuang data &= 3 << 28; 125532e9fc1aSHaojian Zhuang } while (data != (3 << 28)); 125632e9fc1aSHaojian Zhuang do { 125732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x010)); 125832e9fc1aSHaojian Zhuang data &= 3 << 28; 125932e9fc1aSHaojian Zhuang } while (data != (3 << 28)); 126032e9fc1aSHaojian Zhuang 126132e9fc1aSHaojian Zhuang ret = lpddr3_freq_init(freq); 126232e9fc1aSHaojian Zhuang if (ret) 126332e9fc1aSHaojian Zhuang return; 126432e9fc1aSHaojian Zhuang } 126532e9fc1aSHaojian Zhuang 126632e9fc1aSHaojian Zhuang static void init_ddrc_qos(void) 126732e9fc1aSHaojian Zhuang { 126832e9fc1aSHaojian Zhuang unsigned int port, data; 126932e9fc1aSHaojian Zhuang 127032e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x088), 1); 127132e9fc1aSHaojian Zhuang 127232e9fc1aSHaojian Zhuang port = 0; 127332e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x1210); 127432e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x11111111); 127532e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x11111111); 127632e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x400 + 0 * 0x10), 0x001d0007); 127732e9fc1aSHaojian Zhuang 127832e9fc1aSHaojian Zhuang for (port = 3; port <= 4; port++) { 127932e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x1210); 128032e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x77777777); 128132e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x77777777); 128232e9fc1aSHaojian Zhuang } 128332e9fc1aSHaojian Zhuang 128432e9fc1aSHaojian Zhuang port = 1; 128532e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x30000); 128632e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x1234567); 128732e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x1234567); 128832e9fc1aSHaojian Zhuang 128932e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x1f0), 0); 129032e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x0bc), 0x3020100); 129132e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x0d0), 0x3020100); 129232e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x1f4), 0x01000100); 129332e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x08c + 0 * 4), 0xd0670402); 129432e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x068 + 0 * 4), 0x31); 129532e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x000), 0x7); 129632e9fc1aSHaojian Zhuang 129732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7124000 + 0x09c)); 129832e9fc1aSHaojian Zhuang data &= ~0xff0000; 129932e9fc1aSHaojian Zhuang data |= 0x400000; 130032e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x09c), data); 130132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7124000 + 0x0ac)); 130232e9fc1aSHaojian Zhuang data &= ~0xff0000; 130332e9fc1aSHaojian Zhuang data |= 0x400000; 130432e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x0ac), data); 130532e9fc1aSHaojian Zhuang port = 2; 130632e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x30000); 130732e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x1234567); 130832e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x1234567); 130932e9fc1aSHaojian Zhuang 131032e9fc1aSHaojian Zhuang 131132e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x09c), 0xff7fff); 131232e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x0a0), 0xff); 131332e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x0ac), 0xff7fff); 131432e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x0b0), 0xff); 131532e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x0bc), 0x3020100); 131632e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x0d0), 0x3020100); 131732e9fc1aSHaojian Zhuang } 131832e9fc1aSHaojian Zhuang 1319*483dce7eSHaojian Zhuang void hikey_ddr_init(unsigned int ddr_freq) 132032e9fc1aSHaojian Zhuang { 132132e9fc1aSHaojian Zhuang uint32_t data; 132232e9fc1aSHaojian Zhuang 1323*483dce7eSHaojian Zhuang assert((ddr_freq == DDR_FREQ_150M) || (ddr_freq == DDR_FREQ_266M) || 1324*483dce7eSHaojian Zhuang (ddr_freq == DDR_FREQ_400M) || (ddr_freq == DDR_FREQ_533M) || 1325*483dce7eSHaojian Zhuang (ddr_freq == DDR_FREQ_800M)); 132632e9fc1aSHaojian Zhuang init_pll(); 132732e9fc1aSHaojian Zhuang init_freq(); 132832e9fc1aSHaojian Zhuang 1329*483dce7eSHaojian Zhuang init_ddr(ddr_freq); 133032e9fc1aSHaojian Zhuang 1331*483dce7eSHaojian Zhuang ddrc_common_init(ddr_freq); 133232e9fc1aSHaojian Zhuang dienum_det_and_rowcol_cfg(); 133332e9fc1aSHaojian Zhuang detect_ddr_chip_info(); 133432e9fc1aSHaojian Zhuang 1335*483dce7eSHaojian Zhuang if ((ddr_freq == DDR_FREQ_400M) || (ddr_freq == DDR_FREQ_800M)) { 133632e9fc1aSHaojian Zhuang data = mmio_read_32(0xf7032000 + 0x010); 133732e9fc1aSHaojian Zhuang data &= ~0x1; 133832e9fc1aSHaojian Zhuang mmio_write_32(0xf7032000 + 0x010, data); 1339*483dce7eSHaojian Zhuang } else if ((ddr_freq == DDR_FREQ_266M) || (ddr_freq == DDR_FREQ_533M)) { 1340*483dce7eSHaojian Zhuang data = mmio_read_32(0xf7032000 + 0x030); 1341*483dce7eSHaojian Zhuang data &= ~0x1; 1342*483dce7eSHaojian Zhuang mmio_write_32(0xf7032000 + 0x030, data); 1343*483dce7eSHaojian Zhuang } else { 134432e9fc1aSHaojian Zhuang data = mmio_read_32(0xf7032000 + 0x010); 1345*483dce7eSHaojian Zhuang data &= ~0x1; 1346*483dce7eSHaojian Zhuang mmio_write_32(0xf7032000 + 0x010, data); 1347*483dce7eSHaojian Zhuang data = mmio_read_32(0xf7032000 + 0x030); 1348*483dce7eSHaojian Zhuang data &= ~0x1; 1349*483dce7eSHaojian Zhuang mmio_write_32(0xf7032000 + 0x030, data); 1350*483dce7eSHaojian Zhuang } 1351*483dce7eSHaojian Zhuang dsb(); 1352*483dce7eSHaojian Zhuang isb(); 135332e9fc1aSHaojian Zhuang 135432e9fc1aSHaojian Zhuang /* 135532e9fc1aSHaojian Zhuang * Test memory access. Do not use address 0x0 because the compiler 135632e9fc1aSHaojian Zhuang * may assume it is not a valid address and generate incorrect code 135732e9fc1aSHaojian Zhuang * (GCC 4.9.1 without -fno-delete-null-pointer-checks for instance). 135832e9fc1aSHaojian Zhuang */ 135932e9fc1aSHaojian Zhuang mmio_write_32(0x4, 0xa5a55a5a); 136032e9fc1aSHaojian Zhuang INFO("ddr test value:0x%x\n", mmio_read_32(0x4)); 136132e9fc1aSHaojian Zhuang init_ddrc_qos(); 136232e9fc1aSHaojian Zhuang } 1363