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> 8483dce7eSHaojian Zhuang #include <assert.h> 932e9fc1aSHaojian Zhuang #include <debug.h> 1032e9fc1aSHaojian Zhuang #include <errno.h> 1132e9fc1aSHaojian Zhuang #include <hi6220.h> 1232e9fc1aSHaojian Zhuang #include <hi6553.h> 13*1d999558SHaojian Zhuang #include <hisi_sram_map.h> 1432e9fc1aSHaojian Zhuang #include <mmio.h> 1532e9fc1aSHaojian Zhuang #include <sp804_delay_timer.h> 1632e9fc1aSHaojian Zhuang 17483dce7eSHaojian Zhuang #include "hikey_private.h" 1832e9fc1aSHaojian Zhuang 1932e9fc1aSHaojian Zhuang static void init_pll(void) 2032e9fc1aSHaojian Zhuang { 2132e9fc1aSHaojian Zhuang unsigned int data; 2232e9fc1aSHaojian Zhuang 2332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x000)); 2432e9fc1aSHaojian Zhuang data |= 0x1; 2532e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x000), data); 2632e9fc1aSHaojian Zhuang do { 2732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x000)); 2832e9fc1aSHaojian Zhuang } while (!(data & (1 << 28))); 2932e9fc1aSHaojian Zhuang 3032e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7800000 + 0x000)); 3132e9fc1aSHaojian Zhuang data &= ~0x007; 3232e9fc1aSHaojian Zhuang data |= 0x004; 3332e9fc1aSHaojian Zhuang mmio_write_32((0xf7800000 + 0x000), data); 3432e9fc1aSHaojian Zhuang do { 3532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7800000 + 0x014)); 3632e9fc1aSHaojian Zhuang data &= 0x007; 3732e9fc1aSHaojian Zhuang } while (data != 0x004); 3832e9fc1aSHaojian Zhuang 3932e9fc1aSHaojian Zhuang mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2101); 40483dce7eSHaojian Zhuang dsb(); 41483dce7eSHaojian Zhuang isb(); 42483dce7eSHaojian Zhuang udelay(10); 43483dce7eSHaojian Zhuang mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2001); 44483dce7eSHaojian Zhuang dsb(); 45483dce7eSHaojian Zhuang isb(); 46483dce7eSHaojian Zhuang udelay(10); 47483dce7eSHaojian Zhuang mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2201); 48483dce7eSHaojian Zhuang dsb(); 49483dce7eSHaojian Zhuang isb(); 50483dce7eSHaojian Zhuang udelay(10); 5132e9fc1aSHaojian Zhuang mmio_write_32(0xf7032000 + 0x02c, 0x5110103e); 52483dce7eSHaojian Zhuang dsb(); 53483dce7eSHaojian Zhuang isb(); 54483dce7eSHaojian Zhuang udelay(10); 5532e9fc1aSHaojian Zhuang data = mmio_read_32(0xf7032000 + 0x050); 5632e9fc1aSHaojian Zhuang data |= 1 << 28; 5732e9fc1aSHaojian Zhuang mmio_write_32(0xf7032000 + 0x050, data); 58483dce7eSHaojian Zhuang dsb(); 59483dce7eSHaojian Zhuang isb(); 60483dce7eSHaojian Zhuang udelay(10); 6132e9fc1aSHaojian Zhuang mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2101); 62483dce7eSHaojian Zhuang dsb(); 63483dce7eSHaojian Zhuang isb(); 64483dce7eSHaojian Zhuang udelay(10); 65483dce7eSHaojian Zhuang mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2001); 66483dce7eSHaojian Zhuang dsb(); 67483dce7eSHaojian Zhuang isb(); 68483dce7eSHaojian Zhuang udelay(10); 69483dce7eSHaojian Zhuang mmio_write_32(PERI_SC_PERIPH_CTRL14, 0x2201); 70483dce7eSHaojian Zhuang dsb(); 71483dce7eSHaojian Zhuang isb(); 72483dce7eSHaojian Zhuang udelay(10); 7332e9fc1aSHaojian Zhuang } 7432e9fc1aSHaojian Zhuang 7532e9fc1aSHaojian Zhuang static void init_freq(void) 7632e9fc1aSHaojian Zhuang { 7732e9fc1aSHaojian Zhuang unsigned int data, tmp; 7832e9fc1aSHaojian Zhuang unsigned int cpuext_cfg, ddr_cfg; 7932e9fc1aSHaojian Zhuang 8032e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x374), 0x4a); 8132e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x368), 0xda); 8232e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x36c), 0x01); 8332e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x370), 0x01); 8432e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x360), 0x60); 8532e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x364), 0x60); 8632e9fc1aSHaojian Zhuang 8732e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x114), 0x1000); 8832e9fc1aSHaojian Zhuang 8932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x110)); 9032e9fc1aSHaojian Zhuang data |= (3 << 12); 9132e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x110), data); 9232e9fc1aSHaojian Zhuang 9332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x110)); 9432e9fc1aSHaojian Zhuang data |= (1 << 4); 9532e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x110), data); 9632e9fc1aSHaojian Zhuang 9732e9fc1aSHaojian Zhuang 9832e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x110)); 9932e9fc1aSHaojian Zhuang data &= ~0x7; 10032e9fc1aSHaojian Zhuang data |= 0x5; 10132e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x110), data); 10232e9fc1aSHaojian Zhuang dsb(); 10332e9fc1aSHaojian Zhuang mdelay(10); 10432e9fc1aSHaojian Zhuang 10532e9fc1aSHaojian Zhuang 10632e9fc1aSHaojian Zhuang do { 10732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf6504000 + 0x008)); 10832e9fc1aSHaojian Zhuang data &= (3 << 20); 10932e9fc1aSHaojian Zhuang } while (data != (3 << 20)); 11032e9fc1aSHaojian Zhuang dsb(); 11132e9fc1aSHaojian Zhuang mdelay(10); 11232e9fc1aSHaojian Zhuang 11332e9fc1aSHaojian Zhuang 11432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf6504000 + 0x054)); 11532e9fc1aSHaojian Zhuang data &= ~((1 << 0) | (1 << 11)); 11632e9fc1aSHaojian Zhuang mmio_write_32((0xf6504000 + 0x054), data); 11732e9fc1aSHaojian Zhuang mdelay(10); 11832e9fc1aSHaojian Zhuang 11932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x104)); 12032e9fc1aSHaojian Zhuang data &= ~(3 << 8); 12132e9fc1aSHaojian Zhuang data |= (1 << 8); 12232e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x104), data); 12332e9fc1aSHaojian Zhuang 12432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x100)); 12532e9fc1aSHaojian Zhuang data |= (1 << 0); 12632e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x100), data); 12732e9fc1aSHaojian Zhuang dsb(); 12832e9fc1aSHaojian Zhuang 12932e9fc1aSHaojian Zhuang do { 13032e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x100)); 13132e9fc1aSHaojian Zhuang data &= (1 << 2); 13232e9fc1aSHaojian Zhuang } while (data != (1 << 2)); 13332e9fc1aSHaojian Zhuang 13432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf6504000 + 0x06c)); 13532e9fc1aSHaojian Zhuang data &= ~0xffff; 13632e9fc1aSHaojian Zhuang data |= 0x56; 13732e9fc1aSHaojian Zhuang mmio_write_32((0xf6504000 + 0x06c), data); 13832e9fc1aSHaojian Zhuang 13932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf6504000 + 0x06c)); 14032e9fc1aSHaojian Zhuang data &= ~(0xffffff << 8); 14132e9fc1aSHaojian Zhuang data |= 0xc7a << 8; 14232e9fc1aSHaojian Zhuang mmio_write_32((0xf6504000 + 0x06c), data); 14332e9fc1aSHaojian Zhuang 14432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf6504000 + 0x058)); 14532e9fc1aSHaojian Zhuang data &= ((1 << 13) - 1); 14632e9fc1aSHaojian Zhuang data |= 0xccb; 14732e9fc1aSHaojian Zhuang mmio_write_32((0xf6504000 + 0x058), data); 14832e9fc1aSHaojian Zhuang 14932e9fc1aSHaojian Zhuang mmio_write_32((0xf6504000 + 0x060), 0x1fff); 15032e9fc1aSHaojian Zhuang mmio_write_32((0xf6504000 + 0x064), 0x1ffffff); 15132e9fc1aSHaojian Zhuang mmio_write_32((0xf6504000 + 0x068), 0x7fffffff); 15232e9fc1aSHaojian Zhuang mmio_write_32((0xf6504000 + 0x05c), 0x1); 15332e9fc1aSHaojian Zhuang 15432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf6504000 + 0x054)); 15532e9fc1aSHaojian Zhuang data &= ~(0xf << 12); 15632e9fc1aSHaojian Zhuang data |= 1 << 12; 15732e9fc1aSHaojian Zhuang mmio_write_32((0xf6504000 + 0x054), data); 15832e9fc1aSHaojian Zhuang dsb(); 15932e9fc1aSHaojian Zhuang 16032e9fc1aSHaojian Zhuang 16132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x000)); 16232e9fc1aSHaojian Zhuang data &= ~(1 << 0); 16332e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x000), data); 16432e9fc1aSHaojian Zhuang 16532e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x004), 0x5110207d); 16632e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x134), 0x10000005); 16732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x134)); 16832e9fc1aSHaojian Zhuang 16932e9fc1aSHaojian Zhuang 17032e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x000)); 17132e9fc1aSHaojian Zhuang data |= (1 << 0); 17232e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x000), data); 17332e9fc1aSHaojian Zhuang 17432e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x368), 0x100da); 17532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x378)); 17632e9fc1aSHaojian Zhuang data &= ~((1 << 7) - 1); 17732e9fc1aSHaojian Zhuang data |= 0x6b; 17832e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x378), data); 17932e9fc1aSHaojian Zhuang dsb(); 18032e9fc1aSHaojian Zhuang do { 18132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x378)); 18232e9fc1aSHaojian Zhuang tmp = data & 0x7f; 18332e9fc1aSHaojian Zhuang data = (data & (0x7f << 8)) >> 8; 18432e9fc1aSHaojian Zhuang if (data != tmp) 18532e9fc1aSHaojian Zhuang continue; 18632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x37c)); 18732e9fc1aSHaojian Zhuang } while (!(data & 1)); 18832e9fc1aSHaojian Zhuang 18932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x104)); 19032e9fc1aSHaojian Zhuang data &= ~((3 << 0) | 19132e9fc1aSHaojian Zhuang (3 << 8)); 19232e9fc1aSHaojian Zhuang cpuext_cfg = 1; 19332e9fc1aSHaojian Zhuang ddr_cfg = 1; 19432e9fc1aSHaojian Zhuang data |= cpuext_cfg | (ddr_cfg << 8); 19532e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x104), data); 19632e9fc1aSHaojian Zhuang dsb(); 19732e9fc1aSHaojian Zhuang 19832e9fc1aSHaojian Zhuang do { 19932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x104)); 20032e9fc1aSHaojian Zhuang tmp = (data & (3 << 16)) >> 16; 20132e9fc1aSHaojian Zhuang if (cpuext_cfg != tmp) 20232e9fc1aSHaojian Zhuang continue; 20332e9fc1aSHaojian Zhuang tmp = (data & (3 << 24)) >> 24; 20432e9fc1aSHaojian Zhuang if (ddr_cfg != tmp) 20532e9fc1aSHaojian Zhuang continue; 20632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x000)); 20732e9fc1aSHaojian Zhuang data &= 1 << 28; 20832e9fc1aSHaojian Zhuang } while (!data); 20932e9fc1aSHaojian Zhuang 21032e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x100)); 21132e9fc1aSHaojian Zhuang data &= ~(1 << 0); 21232e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x100), data); 21332e9fc1aSHaojian Zhuang dsb(); 21432e9fc1aSHaojian Zhuang do { 21532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x100)); 21632e9fc1aSHaojian Zhuang data &= (1 << 1); 21732e9fc1aSHaojian Zhuang } while (data != (1 << 1)); 21832e9fc1aSHaojian Zhuang mdelay(1000); 21932e9fc1aSHaojian Zhuang 22032e9fc1aSHaojian Zhuang data = mmio_read_32((0xf6504000 + 0x054)); 22132e9fc1aSHaojian Zhuang data &= ~(1 << 28); 22232e9fc1aSHaojian Zhuang mmio_write_32((0xf6504000 + 0x054), data); 22332e9fc1aSHaojian Zhuang dsb(); 22432e9fc1aSHaojian Zhuang 22532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x110)); 22632e9fc1aSHaojian Zhuang data &= ~((1 << 4) | 22732e9fc1aSHaojian Zhuang (3 << 12)); 22832e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x110), data); 22932e9fc1aSHaojian Zhuang } 23032e9fc1aSHaojian Zhuang 23132e9fc1aSHaojian Zhuang int cat_533mhz_800mhz(void) 23232e9fc1aSHaojian Zhuang { 23332e9fc1aSHaojian Zhuang unsigned int data, i; 23432e9fc1aSHaojian Zhuang unsigned int bdl[5]; 23532e9fc1aSHaojian Zhuang 23632e9fc1aSHaojian Zhuang 23732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x1c8)); 23832e9fc1aSHaojian Zhuang data &= 0xfffff0f0; 239483dce7eSHaojian Zhuang data |= 0x100f01; 24032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1c8), data); 24132e9fc1aSHaojian Zhuang 24232e9fc1aSHaojian Zhuang for (i = 0; i < 0x20; i++) { 24332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 24432e9fc1aSHaojian Zhuang data = (i << 0x10) + i; 24532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x140), data); 24632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x144), data); 24732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x148), data); 24832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x14c), data); 24932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x150), data); 25032e9fc1aSHaojian Zhuang 25132e9fc1aSHaojian Zhuang 25232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 25332e9fc1aSHaojian Zhuang data |= 0x80000; 25432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 25532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 25632e9fc1aSHaojian Zhuang data &= 0xfff7ffff; 25732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 25832e9fc1aSHaojian Zhuang 25932e9fc1aSHaojian Zhuang 26032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x8000); 26132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x0); 26232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x801); 26332e9fc1aSHaojian Zhuang do { 26432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 26532e9fc1aSHaojian Zhuang } while (data & 1); 26632e9fc1aSHaojian Zhuang 26732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 268483dce7eSHaojian Zhuang if ((data & 0x400) == 0) { 26932e9fc1aSHaojian Zhuang mdelay(10); 27032e9fc1aSHaojian Zhuang return 0; 27132e9fc1aSHaojian Zhuang } 27232e9fc1aSHaojian Zhuang WARN("lpddr3 cat fail\n"); 27332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x1d4)); 27432e9fc1aSHaojian Zhuang if ((data & 0x1f00) && ((data & 0x1f) == 0)) { 27532e9fc1aSHaojian Zhuang bdl[0] = mmio_read_32((0xf712c000 + 0x140)); 27632e9fc1aSHaojian Zhuang bdl[1] = mmio_read_32((0xf712c000 + 0x144)); 27732e9fc1aSHaojian Zhuang bdl[2] = mmio_read_32((0xf712c000 + 0x148)); 27832e9fc1aSHaojian Zhuang bdl[3] = mmio_read_32((0xf712c000 + 0x14c)); 27932e9fc1aSHaojian Zhuang bdl[4] = mmio_read_32((0xf712c000 + 0x150)); 28032e9fc1aSHaojian Zhuang if ((!(bdl[0] & 0x1f001f)) || (!(bdl[1] & 0x1f001f)) || 28132e9fc1aSHaojian Zhuang (!(bdl[2] & 0x1f001f)) || (!(bdl[3] & 0x1f001f)) || 28232e9fc1aSHaojian Zhuang (!(bdl[4] & 0x1f001f))) { 28332e9fc1aSHaojian Zhuang WARN("lpddr3 cat deskew error\n"); 28432e9fc1aSHaojian Zhuang if (i == 0x1f) { 28532e9fc1aSHaojian Zhuang WARN("addrnbdl is max\n"); 28632e9fc1aSHaojian Zhuang return -EINVAL; 28732e9fc1aSHaojian Zhuang } 28832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x008), 0x400); 28932e9fc1aSHaojian Zhuang } else { 29032e9fc1aSHaojian Zhuang WARN("lpddr3 cat other error1\n"); 29132e9fc1aSHaojian Zhuang return -EINVAL; 29232e9fc1aSHaojian Zhuang } 29332e9fc1aSHaojian Zhuang } else { 29432e9fc1aSHaojian Zhuang WARN("lpddr3 cat other error2\n"); 29532e9fc1aSHaojian Zhuang return -EINVAL; 29632e9fc1aSHaojian Zhuang } 29732e9fc1aSHaojian Zhuang } 29832e9fc1aSHaojian Zhuang return -EINVAL; 29932e9fc1aSHaojian Zhuang } 30032e9fc1aSHaojian Zhuang 30132e9fc1aSHaojian Zhuang static void ddrx_rdet(void) 30232e9fc1aSHaojian Zhuang { 30332e9fc1aSHaojian Zhuang unsigned int data, rdet, bdl[4]; 30432e9fc1aSHaojian Zhuang 30532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x0d0)); 30632e9fc1aSHaojian Zhuang data &= 0xf800ffff; 30732e9fc1aSHaojian Zhuang data |= 0x8f0000; 30832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0d0), data); 30932e9fc1aSHaojian Zhuang 31032e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x0dc)); 31132e9fc1aSHaojian Zhuang data &= 0xfffffff0; 31232e9fc1aSHaojian Zhuang data |= 0xf; 31332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0dc), data); 31432e9fc1aSHaojian Zhuang 31532e9fc1aSHaojian Zhuang 31632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 31732e9fc1aSHaojian Zhuang data |= 0x80000; 31832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 31932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 32032e9fc1aSHaojian Zhuang data &= 0xfff7ffff; 32132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 32232e9fc1aSHaojian Zhuang 32332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x8000); 32432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0); 32532e9fc1aSHaojian Zhuang 32632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x0d0)); 32732e9fc1aSHaojian Zhuang data &= ~0xf0000000; 32832e9fc1aSHaojian Zhuang data |= 0x80000000; 32932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0d0), data); 33032e9fc1aSHaojian Zhuang 33132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x101); 33232e9fc1aSHaojian Zhuang do { 33332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 33432e9fc1aSHaojian Zhuang } while (!(data & 1)); 33532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 33632e9fc1aSHaojian Zhuang if (data & 0x100) 33732e9fc1aSHaojian Zhuang WARN("rdet lbs fail\n"); 33832e9fc1aSHaojian Zhuang 33932e9fc1aSHaojian Zhuang bdl[0] = mmio_read_32((0xf712c000 + 0x22c)) & 0x7f; 34032e9fc1aSHaojian Zhuang bdl[1] = mmio_read_32((0xf712c000 + 0x2ac)) & 0x7f; 34132e9fc1aSHaojian Zhuang bdl[2] = mmio_read_32((0xf712c000 + 0x32c)) & 0x7f; 34232e9fc1aSHaojian Zhuang bdl[3] = mmio_read_32((0xf712c000 + 0x3ac)) & 0x7f; 34332e9fc1aSHaojian Zhuang do { 34432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x22c)); 34532e9fc1aSHaojian Zhuang data &= ~0x7f; 34632e9fc1aSHaojian Zhuang data |= bdl[0]; 34732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x22c), data); 34832e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x2ac)); 34932e9fc1aSHaojian Zhuang data &= ~0x7f; 35032e9fc1aSHaojian Zhuang data |= bdl[1]; 35132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2ac), data); 35232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x32c)); 35332e9fc1aSHaojian Zhuang data &= ~0x7f; 35432e9fc1aSHaojian Zhuang data |= bdl[2]; 35532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x32c), data); 35632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x3ac)); 35732e9fc1aSHaojian Zhuang data &= ~0x7f; 35832e9fc1aSHaojian Zhuang data |= bdl[3]; 35932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3ac), data); 36032e9fc1aSHaojian Zhuang 36132e9fc1aSHaojian Zhuang 36232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 36332e9fc1aSHaojian Zhuang data |= 0x80000; 36432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 36532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 36632e9fc1aSHaojian Zhuang data &= 0xfff7ffff; 36732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 36832e9fc1aSHaojian Zhuang 36932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x8000); 37032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0); 37132e9fc1aSHaojian Zhuang 37232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x0d0)); 37332e9fc1aSHaojian Zhuang data &= ~0xf0000000; 37432e9fc1aSHaojian Zhuang data |= 0x40000000; 37532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0d0), data); 37632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x101); 37732e9fc1aSHaojian Zhuang do { 37832e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 37932e9fc1aSHaojian Zhuang } while (data & 1); 38032e9fc1aSHaojian Zhuang 38132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 38232e9fc1aSHaojian Zhuang rdet = data & 0x100; 38332e9fc1aSHaojian Zhuang if (rdet) { 38432e9fc1aSHaojian Zhuang INFO("rdet ds fail\n"); 38532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x008), 0x100); 38632e9fc1aSHaojian Zhuang } 38732e9fc1aSHaojian Zhuang bdl[0]++; 38832e9fc1aSHaojian Zhuang bdl[1]++; 38932e9fc1aSHaojian Zhuang bdl[2]++; 39032e9fc1aSHaojian Zhuang bdl[3]++; 39132e9fc1aSHaojian Zhuang } while (rdet); 39232e9fc1aSHaojian Zhuang 39332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x0d0)); 39432e9fc1aSHaojian Zhuang data &= ~0xf0000000; 39532e9fc1aSHaojian Zhuang data |= 0x30000000; 39632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0d0), data); 39732e9fc1aSHaojian Zhuang 39832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x101); 39932e9fc1aSHaojian Zhuang do { 40032e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 40132e9fc1aSHaojian Zhuang } while (data & 1); 40232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 40332e9fc1aSHaojian Zhuang if (data & 0x100) 40432e9fc1aSHaojian Zhuang INFO("rdet rbs av fail\n"); 40532e9fc1aSHaojian Zhuang } 40632e9fc1aSHaojian Zhuang 40732e9fc1aSHaojian Zhuang static void ddrx_wdet(void) 40832e9fc1aSHaojian Zhuang { 40922db0167SHaojian Zhuang unsigned int data, wdet, zero_bdl = 0, dq[4]; 41032e9fc1aSHaojian Zhuang int i; 41132e9fc1aSHaojian Zhuang 41232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x0d0)); 41332e9fc1aSHaojian Zhuang data &= ~0xf; 41432e9fc1aSHaojian Zhuang data |= 0xf; 41532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0d0), data); 41632e9fc1aSHaojian Zhuang 41732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 41832e9fc1aSHaojian Zhuang data |= 0x80000; 41932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 42032e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 42132e9fc1aSHaojian Zhuang data &= ~0x80000; 42232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 42332e9fc1aSHaojian Zhuang 42432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x8000); 42532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0); 42632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x0d0)); 42732e9fc1aSHaojian Zhuang data &= ~0xf000; 42832e9fc1aSHaojian Zhuang data |= 0x8000; 42932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0d0), data); 43032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x201); 43132e9fc1aSHaojian Zhuang do { 43232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 43332e9fc1aSHaojian Zhuang } while (data & 1); 43432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 43532e9fc1aSHaojian Zhuang if (data & 0x200) 43632e9fc1aSHaojian Zhuang INFO("wdet lbs fail\n"); 43732e9fc1aSHaojian Zhuang 43832e9fc1aSHaojian Zhuang dq[0] = mmio_read_32((0xf712c000 + 0x234)) & 0x1f00; 43932e9fc1aSHaojian Zhuang dq[1] = mmio_read_32((0xf712c000 + 0x2b4)) & 0x1f00; 44032e9fc1aSHaojian Zhuang dq[2] = mmio_read_32((0xf712c000 + 0x334)) & 0x1f00; 44132e9fc1aSHaojian Zhuang dq[3] = mmio_read_32((0xf712c000 + 0x3b4)) & 0x1f00; 44232e9fc1aSHaojian Zhuang 44332e9fc1aSHaojian Zhuang do { 44432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x234), dq[0]); 44532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2b4), dq[1]); 44632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x334), dq[2]); 44732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3b4), dq[3]); 44832e9fc1aSHaojian Zhuang 44932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 45032e9fc1aSHaojian Zhuang data |= 0x80000; 45132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 45232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 45332e9fc1aSHaojian Zhuang data &= ~0x80000; 45432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 45532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x8000); 45632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0); 45732e9fc1aSHaojian Zhuang 45832e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x0d0)); 45932e9fc1aSHaojian Zhuang data &= ~0xf000; 46032e9fc1aSHaojian Zhuang data |= 0x4000; 46132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0d0), data); 46232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x201); 46332e9fc1aSHaojian Zhuang do { 46432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 46532e9fc1aSHaojian Zhuang } while (data & 1); 46632e9fc1aSHaojian Zhuang 46732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 46832e9fc1aSHaojian Zhuang wdet = data & 0x200; 46932e9fc1aSHaojian Zhuang if (wdet) { 47032e9fc1aSHaojian Zhuang INFO("wdet ds fail\n"); 47132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x008), 0x200); 47232e9fc1aSHaojian Zhuang } 47332e9fc1aSHaojian Zhuang mdelay(10); 47432e9fc1aSHaojian Zhuang 47532e9fc1aSHaojian Zhuang for (i = 0; i < 4; i++) { 47632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x210 + i * 0x80)); 47732e9fc1aSHaojian Zhuang if ((!(data & 0x1f)) || (!(data & 0x1f00)) || 47832e9fc1aSHaojian Zhuang (!(data & 0x1f0000)) || (!(data & 0x1f000000))) 47932e9fc1aSHaojian Zhuang zero_bdl = 1; 48032e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x214 + i * 0x80)); 48132e9fc1aSHaojian Zhuang if ((!(data & 0x1f)) || (!(data & 0x1f00)) || 48232e9fc1aSHaojian Zhuang (!(data & 0x1f0000)) || (!(data & 0x1f000000))) 48332e9fc1aSHaojian Zhuang zero_bdl = 1; 48432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x218 + i * 0x80)); 48532e9fc1aSHaojian Zhuang if (!(data & 0x1f)) 48632e9fc1aSHaojian Zhuang zero_bdl = 1; 48732e9fc1aSHaojian Zhuang if (zero_bdl) { 48832e9fc1aSHaojian Zhuang if (i == 0) 48932e9fc1aSHaojian Zhuang dq[0] = dq[0] - 0x100; 49032e9fc1aSHaojian Zhuang if (i == 1) 49132e9fc1aSHaojian Zhuang dq[1] = dq[1] - 0x100; 49232e9fc1aSHaojian Zhuang if (i == 2) 49332e9fc1aSHaojian Zhuang dq[2] = dq[2] - 0x100; 49432e9fc1aSHaojian Zhuang if (i == 3) 49532e9fc1aSHaojian Zhuang dq[3] = dq[3] - 0x100; 49632e9fc1aSHaojian Zhuang } 49732e9fc1aSHaojian Zhuang } 49832e9fc1aSHaojian Zhuang } while (wdet); 49932e9fc1aSHaojian Zhuang 50032e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x0d0)); 50132e9fc1aSHaojian Zhuang data &= ~0xf000; 50232e9fc1aSHaojian Zhuang data |= 0x3000; 50332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0d0), data); 50432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x201); 50532e9fc1aSHaojian Zhuang do { 50632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 50732e9fc1aSHaojian Zhuang } while (data & 1); 50832e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 50932e9fc1aSHaojian Zhuang if (data & 0x200) 51032e9fc1aSHaojian Zhuang INFO("wdet rbs av fail\n"); 51132e9fc1aSHaojian Zhuang } 51232e9fc1aSHaojian Zhuang 513483dce7eSHaojian Zhuang void set_ddrc_150mhz(void) 514483dce7eSHaojian Zhuang { 515483dce7eSHaojian Zhuang unsigned int data; 516483dce7eSHaojian Zhuang 517483dce7eSHaojian Zhuang mmio_write_32((0xf7032000 + 0x580), 0x1); 518483dce7eSHaojian Zhuang mmio_write_32((0xf7032000 + 0x5a8), 0x7); 519483dce7eSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x104)); 520483dce7eSHaojian Zhuang data &= 0xfffffcff; 521483dce7eSHaojian Zhuang mmio_write_32((0xf7032000 + 0x104), data); 522483dce7eSHaojian Zhuang 523483dce7eSHaojian Zhuang mmio_write_32((0xf7030000 + 0x050), 0x31); 524483dce7eSHaojian Zhuang mmio_write_32((0xf7030000 + 0x240), 0x5ffff); 525483dce7eSHaojian Zhuang mmio_write_32((0xf7030000 + 0x344), 0xf5ff); 526483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f); 527483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x00c), 0xf0f); 528483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x018), 0x7); 529483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x090), 0x7200000); 530483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x258), 0x720); 531483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2d8), 0x720); 532483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x358), 0x720); 533483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3d8), 0x720); 534483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x018), 0x7); 535483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f); 536483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0b4), 0xf); 537483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x088), 0x3fff801); 538483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), 0x8940000); 539483dce7eSHaojian Zhuang 540483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x078)); 541483dce7eSHaojian Zhuang data |= 4; 542483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x078), data); 543483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x01c), 0x8000080); 544483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x020)); 545483dce7eSHaojian Zhuang data &= 0xfffffffe; 546483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x020), data); 547483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 548483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x010), 0x500000f); 549483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x014), 0x10); 550483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x1e4)); 551483dce7eSHaojian Zhuang data &= 0xffffff00; 552483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1e4), data); 553483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x030), 0x30c82355); 554483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x034), 0x62112bb); 555483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x038), 0x20041022); 556483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x03c), 0x63177497); 557483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x040), 0x3008407); 558483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x064), 0x10483); 559483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x068), 0xff0a0000); 560483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 561483dce7eSHaojian Zhuang data &= 0xffff0000; 562483dce7eSHaojian Zhuang data |= 0x184; 563483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 564483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 565483dce7eSHaojian Zhuang data &= 0xbfffffff; 566483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 567483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x020)); 568483dce7eSHaojian Zhuang data &= ~0x10; 569483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x020), data); 570483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x080)); 571483dce7eSHaojian Zhuang data &= ~0x2000; 572483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x080), data); 573483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x270), 0x3); 574483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2f0), 0x3); 575483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x370), 0x3); 576483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3f0), 0x3); 577483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), 0x90420880); 578483dce7eSHaojian Zhuang 579483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x040), 0x0); 580483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x146d); 581483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x050), 0x100123); 582483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x060), 0x133); 583483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x064), 0x133); 584483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x200), 0xa1000); 585483dce7eSHaojian Zhuang 586483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x100), 0xb3290d08); 587483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x104), 0x9621821); 588483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x108), 0x45009023); 589483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x10c), 0xaf44c145); 590483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x110), 0x10b00000); 591483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x114), 0x11080806); 592483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x118), 0x44); 593483dce7eSHaojian Zhuang do { 594483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 595483dce7eSHaojian Zhuang } while (data & 1); 596483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 597483dce7eSHaojian Zhuang if (data & 8) { 598483dce7eSHaojian Zhuang NOTICE("fail to init ddr3 rank0\n"); 599483dce7eSHaojian Zhuang return; 600483dce7eSHaojian Zhuang } 601483dce7eSHaojian Zhuang 602483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 603483dce7eSHaojian Zhuang data |= 1; 604483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 605483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x21); 606483dce7eSHaojian Zhuang do { 607483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 608483dce7eSHaojian Zhuang } while (data & 1); 609483dce7eSHaojian Zhuang 610483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 611483dce7eSHaojian Zhuang if (data & 0x8) 612483dce7eSHaojian Zhuang NOTICE("ddr3 rank1 init failure\n"); 613483dce7eSHaojian Zhuang else 614483dce7eSHaojian Zhuang INFO("ddr3 rank1 init pass\n"); 615483dce7eSHaojian Zhuang 616483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 617483dce7eSHaojian Zhuang data &= ~0xf; 618483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 619483dce7eSHaojian Zhuang INFO("succeed to set ddrc 150mhz\n"); 620483dce7eSHaojian Zhuang } 621483dce7eSHaojian Zhuang 622483dce7eSHaojian Zhuang void set_ddrc_266mhz(void) 623483dce7eSHaojian Zhuang { 624483dce7eSHaojian Zhuang unsigned int data; 625483dce7eSHaojian Zhuang 626483dce7eSHaojian Zhuang mmio_write_32((0xf7032000 + 0x580), 0x3); 627483dce7eSHaojian Zhuang mmio_write_32((0xf7032000 + 0x5a8), 0x1003); 628483dce7eSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x104)); 629483dce7eSHaojian Zhuang data &= 0xfffffcff; 630483dce7eSHaojian Zhuang mmio_write_32((0xf7032000 + 0x104), data); 631483dce7eSHaojian Zhuang 632483dce7eSHaojian Zhuang mmio_write_32((0xf7030000 + 0x050), 0x31); 633483dce7eSHaojian Zhuang mmio_write_32((0xf7030000 + 0x240), 0x5ffff); 634483dce7eSHaojian Zhuang mmio_write_32((0xf7030000 + 0x344), 0xf5ff); 635483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f); 636483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x00c), 0xf0f); 637483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x018), 0x7); 638483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x090), 0x7200000); 639483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x258), 0x720); 640483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2d8), 0x720); 641483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x358), 0x720); 642483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3d8), 0x720); 643483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x018), 0x7); 644483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f); 645483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0b4), 0xf); 646483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x088), 0x3fff801); 647483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), 0x8940000); 648483dce7eSHaojian Zhuang 649483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x078)); 650483dce7eSHaojian Zhuang data |= 4; 651483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x078), data); 652483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x01c), 0x8000080); 653483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x020)); 654483dce7eSHaojian Zhuang data &= 0xfffffffe; 655483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x020), data); 656483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 657483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x010), 0x500000f); 658483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x014), 0x10); 659483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x1e4)); 660483dce7eSHaojian Zhuang data &= 0xffffff00; 661483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1e4), data); 662483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x030), 0x510d4455); 663483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x034), 0x8391ebb); 664483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x038), 0x2005103c); 665483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x03c), 0x6329950b); 666483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x040), 0x300858c); 667483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x064), 0x10483); 668483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x068), 0xff0a0000); 669483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 670483dce7eSHaojian Zhuang data &= 0xffff0000; 671483dce7eSHaojian Zhuang data |= 0x184; 672483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 673483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 674483dce7eSHaojian Zhuang data &= 0xbfffffff; 675483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 676483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x020)); 677483dce7eSHaojian Zhuang data &= ~0x10; 678483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x020), data); 679483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x080)); 680483dce7eSHaojian Zhuang data &= ~0x2000; 681483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x080), data); 682483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x270), 0x3); 683483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2f0), 0x3); 684483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x370), 0x3); 685483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3f0), 0x3); 686483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), 0x90420880); 687483dce7eSHaojian Zhuang 688483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x040), 0x0); 689483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x146d); 690483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x050), 0x100123); 691483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x060), 0x133); 692483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x064), 0x133); 693483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x200), 0xa1000); 694483dce7eSHaojian Zhuang 695483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x100), 0xb441d50d); 696483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x104), 0xf721839); 697483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x108), 0x5500f03f); 698483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x10c), 0xaf486145); 699483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x110), 0x10b00000); 700483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x114), 0x12080d06); 701483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x118), 0x44); 702483dce7eSHaojian Zhuang do { 703483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 704483dce7eSHaojian Zhuang } while (data & 1); 705483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 706483dce7eSHaojian Zhuang if (data & 8) { 707483dce7eSHaojian Zhuang NOTICE("fail to init ddr3 rank0\n"); 708483dce7eSHaojian Zhuang return; 709483dce7eSHaojian Zhuang } 710483dce7eSHaojian Zhuang 711483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 712483dce7eSHaojian Zhuang data |= 1; 713483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 714483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x21); 715483dce7eSHaojian Zhuang do { 716483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 717483dce7eSHaojian Zhuang } while (data & 1); 718483dce7eSHaojian Zhuang 719483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 720483dce7eSHaojian Zhuang if (data & 0x8) 721483dce7eSHaojian Zhuang NOTICE("ddr3 rank1 init failure\n"); 722483dce7eSHaojian Zhuang else 723483dce7eSHaojian Zhuang INFO("ddr3 rank1 init pass\n"); 724483dce7eSHaojian Zhuang 725483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 726483dce7eSHaojian Zhuang data &= ~0xf; 727483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 728483dce7eSHaojian Zhuang INFO("succeed to set ddrc 266mhz\n"); 729483dce7eSHaojian Zhuang } 730483dce7eSHaojian Zhuang 731483dce7eSHaojian Zhuang void set_ddrc_400mhz(void) 732483dce7eSHaojian Zhuang { 733483dce7eSHaojian Zhuang unsigned int data; 734483dce7eSHaojian Zhuang 735483dce7eSHaojian Zhuang mmio_write_32((0xf7032000 + 0x580), 0x2); 736483dce7eSHaojian Zhuang mmio_write_32((0xf7032000 + 0x5a8), 0x1003); 737483dce7eSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x104)); 738483dce7eSHaojian Zhuang data &= 0xfffffcff; 739483dce7eSHaojian Zhuang mmio_write_32((0xf7032000 + 0x104), data); 740483dce7eSHaojian Zhuang 741483dce7eSHaojian Zhuang mmio_write_32((0xf7030000 + 0x050), 0x31); 742483dce7eSHaojian Zhuang mmio_write_32((0xf7030000 + 0x240), 0x5ffff); 743483dce7eSHaojian Zhuang mmio_write_32((0xf7030000 + 0x344), 0xf5ff); 744483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x00c), 0x80000f0f); 745483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x00c), 0xf0f); 746483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x018), 0x7); 747483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x090), 0x7200000); 748483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x258), 0x720); 749483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2d8), 0x720); 750483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x358), 0x720); 751483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3d8), 0x720); 752483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x018), 0x7); 753483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f); 754483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0b4), 0xf); 755483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x088), 0x3fff801); 756483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), 0x8940000); 757483dce7eSHaojian Zhuang 758483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x078)); 759483dce7eSHaojian Zhuang data |= 4; 760483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x078), data); 761483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x01c), 0x8000080); 762483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x020)); 763483dce7eSHaojian Zhuang data &= 0xfffffffe; 764483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x020), data); 765483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 766483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x010), 0x500000f); 767483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x014), 0x10); 768483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x1e4)); 769483dce7eSHaojian Zhuang data &= 0xffffff00; 770483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1e4), data); 771483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x030), 0x75525655); 772483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x034), 0xa552abb); 773483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x038), 0x20071059); 774483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x03c), 0x633e8591); 775483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x040), 0x3008691); 776483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x064), 0x10483); 777483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x068), 0xff0a0000); 778483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 779483dce7eSHaojian Zhuang data &= 0xffff0000; 780483dce7eSHaojian Zhuang data |= 0x184; 781483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 782483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 783483dce7eSHaojian Zhuang data &= 0xbfffffff; 784483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 785483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x020)); 786483dce7eSHaojian Zhuang data &= ~0x10; 787483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x020), data); 788483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x080)); 789483dce7eSHaojian Zhuang data &= ~0x2000; 790483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x080), data); 791483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x270), 0x3); 792483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2f0), 0x3); 793483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x370), 0x3); 794483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3f0), 0x3); 795483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), 0x90420880); 796483dce7eSHaojian Zhuang 797483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x040), 0x0); 798483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x146d); 799483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x050), 0x100123); 800483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x060), 0x133); 801483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x064), 0x133); 802483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x200), 0xa1000); 803483dce7eSHaojian Zhuang 804483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x100), 0xb55a9d12); 805483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x104), 0x17721855); 806483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x108), 0x7501505f); 807483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x10c), 0xaf4ca245); 808483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x110), 0x10b00000); 809483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x114), 0x13081306); 810483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x118), 0x44); 811483dce7eSHaojian Zhuang do { 812483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 813483dce7eSHaojian Zhuang } while (data & 1); 814483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 815483dce7eSHaojian Zhuang if (data & 8) { 816483dce7eSHaojian Zhuang NOTICE("fail to init ddr3 rank0\n"); 817483dce7eSHaojian Zhuang return; 818483dce7eSHaojian Zhuang } 819483dce7eSHaojian Zhuang 820483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 821483dce7eSHaojian Zhuang data |= 1; 822483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 823483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x21); 824483dce7eSHaojian Zhuang do { 825483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 826483dce7eSHaojian Zhuang } while (data & 1); 827483dce7eSHaojian Zhuang 828483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 829483dce7eSHaojian Zhuang if (data & 0x8) 830483dce7eSHaojian Zhuang NOTICE("ddr3 rank1 init failure\n"); 831483dce7eSHaojian Zhuang else 832483dce7eSHaojian Zhuang INFO("ddr3 rank1 init pass\n"); 833483dce7eSHaojian Zhuang 834483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 835483dce7eSHaojian Zhuang data &= ~0xf; 836483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 837483dce7eSHaojian Zhuang INFO("succeed to set ddrc 400mhz\n"); 838483dce7eSHaojian Zhuang } 839483dce7eSHaojian Zhuang 840483dce7eSHaojian Zhuang void set_ddrc_533mhz(void) 84132e9fc1aSHaojian Zhuang { 84232e9fc1aSHaojian Zhuang unsigned int data; 84332e9fc1aSHaojian Zhuang 84432e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x580), 0x3); 84532e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x5a8), 0x11111); 84632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x104)); 84732e9fc1aSHaojian Zhuang data |= 0x100; 84832e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x104), data); 84932e9fc1aSHaojian Zhuang 85032e9fc1aSHaojian Zhuang mmio_write_32((0xf7030000 + 0x050), 0x30); 85132e9fc1aSHaojian Zhuang mmio_write_32((0xf7030000 + 0x240), 0x5ffff); 85232e9fc1aSHaojian Zhuang mmio_write_32((0xf7030000 + 0x344), 0xf5ff); 85332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x00c), 0x400); 854483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x00c), 0x400); 85532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x018), 0x7); 85632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x090), 0x6400000); 85732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x258), 0x640); 85832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2d8), 0x640); 85932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x358), 0x640); 86032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3d8), 0x640); 86132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x018), 0x0); 86232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f); 86332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0b4), 0xf); 86432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x088), 0x3fff801); 86532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), 0x8940000); 86632e9fc1aSHaojian Zhuang 86732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x078)); 86832e9fc1aSHaojian Zhuang data |= 4; 86932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x078), data); 87032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x01c), 0x8000080); 87132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x020)); 87232e9fc1aSHaojian Zhuang data &= 0xfffffffe; 87332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x020), data); 87432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 87532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x010), 0x500000f); 87632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x014), 0x10); 87732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x1e4)); 87832e9fc1aSHaojian Zhuang data &= 0xffffff00; 87932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1e4), data); 88032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x030), 0x9dd87855); 88132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x034), 0xa7138bb); 88232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x038), 0x20091477); 88332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x03c), 0x84534e16); 88432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x040), 0x3008817); 88532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x064), 0x106c3); 88632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x068), 0xff0a0000); 88732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 88832e9fc1aSHaojian Zhuang data &= 0xffff0000; 88932e9fc1aSHaojian Zhuang data |= 0x305; 89032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 89132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 89232e9fc1aSHaojian Zhuang data |= 0x40000000; 89332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 89432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x020)); 89532e9fc1aSHaojian Zhuang data &= ~0x10; 89632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x020), data); 89732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x080)); 89832e9fc1aSHaojian Zhuang data &= ~0x2000; 89932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x080), data); 90032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x270), 0x3); 90132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2f0), 0x3); 90232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x370), 0x3); 90332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3f0), 0x3); 90432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), 0xd0420900); 90532e9fc1aSHaojian Zhuang 90632e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x040), 0x0); 90732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x140f); 90832e9fc1aSHaojian Zhuang do { 90932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 91032e9fc1aSHaojian Zhuang } while (data & 1); 91132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 91232e9fc1aSHaojian Zhuang if (data & 0x7fe) { 91332e9fc1aSHaojian Zhuang NOTICE("failed to init lpddr3 rank0 dram phy\n"); 91432e9fc1aSHaojian Zhuang return; 91532e9fc1aSHaojian Zhuang } 916483dce7eSHaojian Zhuang cat_533mhz_800mhz(); 917483dce7eSHaojian Zhuang 918483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0xf1); 919483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x050), 0x100123); 920483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x060), 0x133); 921483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x064), 0x133); 922483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x200), 0xa1000); 923483dce7eSHaojian Zhuang 924483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x100), 0xb77b6718); 925483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x104), 0x1e82a071); 926483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x108), 0x9501c07e); 927483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x10c), 0xaf50c255); 928483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x110), 0x10b00000); 929483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x114), 0x13181908); 930483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x118), 0x44); 931483dce7eSHaojian Zhuang do { 932483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 933483dce7eSHaojian Zhuang } while (data & 1); 934483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 935483dce7eSHaojian Zhuang if (data & 0x7fe) { 936483dce7eSHaojian Zhuang NOTICE("fail to init ddr3 rank0\n"); 937483dce7eSHaojian Zhuang return; 938483dce7eSHaojian Zhuang } 939483dce7eSHaojian Zhuang ddrx_rdet(); 940483dce7eSHaojian Zhuang ddrx_wdet(); 941483dce7eSHaojian Zhuang 942483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 943483dce7eSHaojian Zhuang data |= 1; 944483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 945483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x21); 946483dce7eSHaojian Zhuang do { 947483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 948483dce7eSHaojian Zhuang } while (data & 1); 949483dce7eSHaojian Zhuang 950483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 951483dce7eSHaojian Zhuang if (data & 0x7fe) 952483dce7eSHaojian Zhuang NOTICE("ddr3 rank1 init failure\n"); 953483dce7eSHaojian Zhuang else 954483dce7eSHaojian Zhuang INFO("ddr3 rank1 init pass\n"); 955483dce7eSHaojian Zhuang 956483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 957483dce7eSHaojian Zhuang data &= ~0xf; 958483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 959483dce7eSHaojian Zhuang INFO("succeed to set ddrc 533mhz\n"); 96032e9fc1aSHaojian Zhuang } 96132e9fc1aSHaojian Zhuang 962483dce7eSHaojian Zhuang void set_ddrc_800mhz(void) 96332e9fc1aSHaojian Zhuang { 96432e9fc1aSHaojian Zhuang unsigned int data; 96532e9fc1aSHaojian Zhuang 96632e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x580), 0x2); 96732e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x5a8), 0x1003); 96832e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x104)); 96932e9fc1aSHaojian Zhuang data &= 0xfffffcff; 97032e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x104), data); 97132e9fc1aSHaojian Zhuang 97232e9fc1aSHaojian Zhuang mmio_write_32((0xf7030000 + 0x050), 0x30); 97332e9fc1aSHaojian Zhuang mmio_write_32((0xf7030000 + 0x240), 0x5ffff); 97432e9fc1aSHaojian Zhuang mmio_write_32((0xf7030000 + 0x344), 0xf5ff); 97532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x00c), 0x400); 976483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x00c), 0x400); 97732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x018), 0x7); 97832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x090), 0x5400000); 97932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x258), 0x540); 98032e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2d8), 0x540); 98132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x358), 0x540); 98232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3d8), 0x540); 98332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x018), 0x0); 98432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0b0), 0xf00000f); 98532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x0b4), 0xf); 98632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x088), 0x3fff801); 98732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), 0x8940000); 98832e9fc1aSHaojian Zhuang 98932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x078)); 99032e9fc1aSHaojian Zhuang data |= 4; 99132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x078), data); 99232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x01c), 0x8000080); 99332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x020)); 99432e9fc1aSHaojian Zhuang data &= 0xfffffffe; 99532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x020), data); 99632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1d4), 0xc0000); 99732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x010), 0x500000f); 99832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x014), 0x10); 99932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x1e4)); 100032e9fc1aSHaojian Zhuang data &= 0xffffff00; 100132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1e4), data); 100232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x030), 0xe663ab77); 100332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x034), 0xea952db); 100432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x038), 0x200d1cb1); 100532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x03c), 0xc67d0721); 100632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x040), 0x3008aa1); 100732e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x064), 0x11a43); 100832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x068), 0xff0a0000); 100932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x070)); 101032e9fc1aSHaojian Zhuang data &= 0xffff0000; 101132e9fc1aSHaojian Zhuang data |= 0x507; 101232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x070), data); 101332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 101432e9fc1aSHaojian Zhuang data |= 0x40000000; 101532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 101632e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x020)); 101732e9fc1aSHaojian Zhuang data &= 0xffffffef; 101832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x020), data); 101932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x080)); 102032e9fc1aSHaojian Zhuang data &= 0xffffdfff; 102132e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x080), data); 102232e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x270), 0x3); 102332e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x2f0), 0x3); 102432e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x370), 0x3); 102532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x3f0), 0x3); 102632e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), 0xd0420900); 102732e9fc1aSHaojian Zhuang 102832e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x040), 0x2001); 102932e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x140f); 103032e9fc1aSHaojian Zhuang do { 103132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 103232e9fc1aSHaojian Zhuang } while (data & 1); 103332e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 103432e9fc1aSHaojian Zhuang if (data & 0x7fe) { 103532e9fc1aSHaojian Zhuang WARN("failed to init lpddr3 rank0 dram phy\n"); 103632e9fc1aSHaojian Zhuang return; 103732e9fc1aSHaojian Zhuang } 1038483dce7eSHaojian Zhuang cat_533mhz_800mhz(); 1039483dce7eSHaojian Zhuang 1040483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0xf1); 1041483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x050), 0x100023); 1042483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x060), 0x133); 1043483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x064), 0x133); 1044483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x200), 0xa1000); 1045483dce7eSHaojian Zhuang 1046483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x100), 0x755a9d12); 1047483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x104), 0x1753b055); 1048483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x108), 0x7401505f); 1049483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x10c), 0x578ca244); 1050483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x110), 0x10700000); 1051483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x114), 0x13141306); 1052483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x118), 0x44); 1053483dce7eSHaojian Zhuang do { 1054483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 1055483dce7eSHaojian Zhuang } while (data & 1); 1056483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 1057483dce7eSHaojian Zhuang if (data & 0x7fe) { 1058483dce7eSHaojian Zhuang NOTICE("fail to init ddr3 rank0\n"); 1059483dce7eSHaojian Zhuang return; 1060483dce7eSHaojian Zhuang } 1061483dce7eSHaojian Zhuang ddrx_rdet(); 1062483dce7eSHaojian Zhuang ddrx_wdet(); 1063483dce7eSHaojian Zhuang 1064483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 1065483dce7eSHaojian Zhuang data |= 1; 1066483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 1067483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x004), 0x21); 1068483dce7eSHaojian Zhuang do { 1069483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x004)); 1070483dce7eSHaojian Zhuang } while (data & 1); 1071483dce7eSHaojian Zhuang 1072483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x008)); 1073483dce7eSHaojian Zhuang if (data & 0x7fe) 1074483dce7eSHaojian Zhuang NOTICE("ddr3 rank1 init failure\n"); 1075483dce7eSHaojian Zhuang else 1076483dce7eSHaojian Zhuang INFO("ddr3 rank1 init pass\n"); 1077483dce7eSHaojian Zhuang 1078483dce7eSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x048)); 1079483dce7eSHaojian Zhuang data &= ~0xf; 1080483dce7eSHaojian Zhuang mmio_write_32((0xf712c000 + 0x048), data); 1081483dce7eSHaojian Zhuang INFO("succeed to set ddrc 800mhz\n"); 108232e9fc1aSHaojian Zhuang } 108332e9fc1aSHaojian Zhuang 1084483dce7eSHaojian Zhuang static void ddrc_common_init(int freq) 108532e9fc1aSHaojian Zhuang { 108632e9fc1aSHaojian Zhuang unsigned int data; 108732e9fc1aSHaojian Zhuang 108832e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x020), 0x1); 108932e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x100), 0x1700); 109032e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x104), 0x71040004); 109132e9fc1aSHaojian Zhuang mmio_write_32((0xf7121400 + 0x104), 0xf); 109232e9fc1aSHaojian Zhuang mmio_write_32((0xf7121800 + 0x104), 0xf); 109332e9fc1aSHaojian Zhuang mmio_write_32((0xf7121c00 + 0x104), 0xf); 109432e9fc1aSHaojian Zhuang mmio_write_32((0xf7122000 + 0x104), 0xf); 109532e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x02c), 0x6); 1096483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x020), 0x30003); 109732e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x028), 0x310201); 109832e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x1e4), 0xfe007600); 109932e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x01c), 0xaf001); 110032e9fc1aSHaojian Zhuang 110132e9fc1aSHaojian Zhuang 110232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7128000 + 0x280)); 110332e9fc1aSHaojian Zhuang data |= 1 << 7; 110432e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x280), data); 110532e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x244), 0x3); 110632e9fc1aSHaojian Zhuang 1107483dce7eSHaojian Zhuang if (freq == DDR_FREQ_800M) 1108483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x240), 167 * (freq / 2) / 1024); 110932e9fc1aSHaojian Zhuang else 1110483dce7eSHaojian Zhuang mmio_write_32((0xf7128000 + 0x240), 167 * freq / 1024); 111132e9fc1aSHaojian Zhuang 111232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf712c000 + 0x080)); 111332e9fc1aSHaojian Zhuang data &= 0xffff; 111432e9fc1aSHaojian Zhuang data |= 0x4002000; 111532e9fc1aSHaojian Zhuang mmio_write_32((0xf712c000 + 0x080), data); 111632e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x000), 0x0); 111732e9fc1aSHaojian Zhuang do { 111832e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7128000 + 0x294)); 111932e9fc1aSHaojian Zhuang } while (data & 1); 112032e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x000), 0x2); 112132e9fc1aSHaojian Zhuang } 112232e9fc1aSHaojian Zhuang 112332e9fc1aSHaojian Zhuang 112432e9fc1aSHaojian Zhuang static int dienum_det_and_rowcol_cfg(void) 112532e9fc1aSHaojian Zhuang { 112632e9fc1aSHaojian Zhuang unsigned int data; 112732e9fc1aSHaojian Zhuang 112832e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x210), 0x87); 112932e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x218), 0x10000); 113032e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x00c), 0x1); 113132e9fc1aSHaojian Zhuang do { 113232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7128000 + 0x00c)); 113332e9fc1aSHaojian Zhuang } while (data & 1); 113432e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7128000 + 0x4a8)) & 0xfc; 113532e9fc1aSHaojian Zhuang switch (data) { 113632e9fc1aSHaojian Zhuang case 0x18: 113732e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x060), 0x132); 113832e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x064), 0x132); 113932e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x100), 0x1600); 114032e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x104), 0x71040004); 1141*1d999558SHaojian Zhuang mmio_write_32(MEMORY_AXI_DDR_CAPACITY_ADDR, 0x40000000); 114232e9fc1aSHaojian Zhuang break; 114332e9fc1aSHaojian Zhuang case 0x1c: 114432e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x060), 0x142); 114532e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x064), 0x142); 114632e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x100), 0x1700); 114732e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x104), 0x71040004); 1148*1d999558SHaojian Zhuang mmio_write_32(MEMORY_AXI_DDR_CAPACITY_ADDR, 0x80000000); 114932e9fc1aSHaojian Zhuang break; 115032e9fc1aSHaojian Zhuang case 0x58: 115132e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x060), 0x133); 115232e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x064), 0x133); 115332e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x100), 0x1700); 115432e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x104), 0x71040004); 1155*1d999558SHaojian Zhuang mmio_write_32(MEMORY_AXI_DDR_CAPACITY_ADDR, 0x80000000); 115632e9fc1aSHaojian Zhuang break; 115732e9fc1aSHaojian Zhuang default: 1158*1d999558SHaojian Zhuang mmio_write_32(MEMORY_AXI_DDR_CAPACITY_ADDR, 0x80000000); 115932e9fc1aSHaojian Zhuang break; 116032e9fc1aSHaojian Zhuang } 116132e9fc1aSHaojian Zhuang if (!data) 116232e9fc1aSHaojian Zhuang return -EINVAL; 116332e9fc1aSHaojian Zhuang return 0; 116432e9fc1aSHaojian Zhuang } 116532e9fc1aSHaojian Zhuang 116632e9fc1aSHaojian Zhuang static int detect_ddr_chip_info(void) 116732e9fc1aSHaojian Zhuang { 116832e9fc1aSHaojian Zhuang unsigned int data, mr5, mr6, mr7; 116932e9fc1aSHaojian Zhuang 117032e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x210), 0x57); 117132e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x218), 0x10000); 117232e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x00c), 0x1); 117332e9fc1aSHaojian Zhuang 117432e9fc1aSHaojian Zhuang do { 117532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7128000 + 0x00c)); 117632e9fc1aSHaojian Zhuang } while (data & 1); 117732e9fc1aSHaojian Zhuang 117832e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7128000 + 0x4a8)); 117932e9fc1aSHaojian Zhuang mr5 = data & 0xff; 118032e9fc1aSHaojian Zhuang switch (mr5) { 118132e9fc1aSHaojian Zhuang case 1: 118232e9fc1aSHaojian Zhuang INFO("Samsung DDR\n"); 118332e9fc1aSHaojian Zhuang break; 118432e9fc1aSHaojian Zhuang case 6: 118532e9fc1aSHaojian Zhuang INFO("Hynix DDR\n"); 118632e9fc1aSHaojian Zhuang break; 118732e9fc1aSHaojian Zhuang case 3: 118832e9fc1aSHaojian Zhuang INFO("Elpida DDR\n"); 118932e9fc1aSHaojian Zhuang break; 119032e9fc1aSHaojian Zhuang default: 119132e9fc1aSHaojian Zhuang INFO("DDR from other vendors\n"); 119232e9fc1aSHaojian Zhuang break; 119332e9fc1aSHaojian Zhuang } 119432e9fc1aSHaojian Zhuang 119532e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x210), 0x67); 119632e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x218), 0x10000); 119732e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x00c), 0x1); 119832e9fc1aSHaojian Zhuang do { 119932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7128000 + 0x00c)); 120032e9fc1aSHaojian Zhuang } while (data & 1); 120132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7128000 + 0x4a8)); 120232e9fc1aSHaojian Zhuang mr6 = data & 0xff; 120332e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x210), 0x77); 120432e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x218), 0x10000); 120532e9fc1aSHaojian Zhuang mmio_write_32((0xf7128000 + 0x00c), 0x1); 120632e9fc1aSHaojian Zhuang do { 120732e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7128000 + 0x00c)); 120832e9fc1aSHaojian Zhuang } while (data & 1); 120932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7128000 + 0x4a8)); 121032e9fc1aSHaojian Zhuang mr7 = data & 0xff; 121132e9fc1aSHaojian Zhuang data = mr5 + (mr6 << 8) + (mr7 << 16); 121232e9fc1aSHaojian Zhuang return data; 121332e9fc1aSHaojian Zhuang } 121432e9fc1aSHaojian Zhuang 1215483dce7eSHaojian Zhuang void ddr_phy_reset(void) 1216483dce7eSHaojian Zhuang { 1217483dce7eSHaojian Zhuang mmio_write_32(0xf7030340, 0xa000); 1218483dce7eSHaojian Zhuang mmio_write_32(0xf7030344, 0xa000); 1219483dce7eSHaojian Zhuang } 1220483dce7eSHaojian Zhuang 1221*1d999558SHaojian Zhuang void lpddrx_save_ddl_para_bypass(uint32_t *ddr_ddl_para, unsigned int index) 1222*1d999558SHaojian Zhuang { 1223*1d999558SHaojian Zhuang uint32_t value; 1224*1d999558SHaojian Zhuang uint32_t cnt = index; 1225*1d999558SHaojian Zhuang uint32_t i; 1226*1d999558SHaojian Zhuang 1227*1d999558SHaojian Zhuang for (i = 0; i < 4; i++) { 1228*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x22c + i * 0x80); 1229*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1230*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x23c + i * 0x80); 1231*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1232*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x240 + i * 0x80); 1233*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1234*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x640 + i * 0x80); 1235*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1236*1d999558SHaojian Zhuang } 1237*1d999558SHaojian Zhuang } 1238*1d999558SHaojian Zhuang 1239*1d999558SHaojian Zhuang void lpddrx_save_ddl_para_mission(uint32_t *ddr_ddl_para, unsigned int index) 1240*1d999558SHaojian Zhuang { 1241*1d999558SHaojian Zhuang uint32_t value; 1242*1d999558SHaojian Zhuang uint32_t cnt = index; 1243*1d999558SHaojian Zhuang uint32_t i; 1244*1d999558SHaojian Zhuang 1245*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x140); 1246*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1247*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x144); 1248*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1249*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x148); 1250*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1251*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x14c); 1252*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1253*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x150); 1254*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1255*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x1d4); 1256*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1257*1d999558SHaojian Zhuang for (i = 0; i < 4; i++) { 1258*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x210 + i * 0x80); 1259*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1260*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x214 + i * 0x80); 1261*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1262*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x218 + i * 0x80); 1263*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1264*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x21c + i * 0x80); 1265*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1266*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x220 + i * 0x80); 1267*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1268*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x224 + i * 0x80); 1269*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1270*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x228 + i * 0x80); 1271*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1272*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x22c + i * 0x80); 1273*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1274*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x230 + i * 0x80); 1275*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1276*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x234 + i * 0x80); 1277*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1278*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x238 + i * 0x80); 1279*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1280*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x23c + i * 0x80); 1281*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1282*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x240 + i * 0x80); 1283*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1284*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x640 + i * 0x80); 1285*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1286*1d999558SHaojian Zhuang } 1287*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x168); 1288*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1289*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x24c + 0 * 0x80); 1290*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1291*1d999558SHaojian Zhuang value = mmio_read_32(0xf712c000 + 0x24c + 2 * 0x80); 1292*1d999558SHaojian Zhuang ddr_ddl_para[cnt++] = value; 1293*1d999558SHaojian Zhuang } 1294*1d999558SHaojian Zhuang 129532e9fc1aSHaojian Zhuang int lpddr3_freq_init(int freq) 129632e9fc1aSHaojian Zhuang { 1297483dce7eSHaojian Zhuang set_ddrc_150mhz(); 1298*1d999558SHaojian Zhuang lpddrx_save_ddl_para_bypass((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR, 0); 1299483dce7eSHaojian Zhuang if (freq > DDR_FREQ_150M) { 1300483dce7eSHaojian Zhuang ddr_phy_reset(); 1301483dce7eSHaojian Zhuang set_ddrc_266mhz(); 1302*1d999558SHaojian Zhuang lpddrx_save_ddl_para_bypass((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR, 1303*1d999558SHaojian Zhuang 16); 1304483dce7eSHaojian Zhuang } 1305483dce7eSHaojian Zhuang if (freq > DDR_FREQ_266M) { 1306483dce7eSHaojian Zhuang ddr_phy_reset(); 1307483dce7eSHaojian Zhuang set_ddrc_400mhz(); 1308*1d999558SHaojian Zhuang lpddrx_save_ddl_para_bypass((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR, 1309*1d999558SHaojian Zhuang 16 * 2); 1310483dce7eSHaojian Zhuang } 1311483dce7eSHaojian Zhuang if (freq > DDR_FREQ_400M) { 1312483dce7eSHaojian Zhuang ddr_phy_reset(); 131332e9fc1aSHaojian Zhuang set_ddrc_533mhz(); 1314*1d999558SHaojian Zhuang lpddrx_save_ddl_para_mission((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR, 1315*1d999558SHaojian Zhuang 16 * 3); 131632e9fc1aSHaojian Zhuang } 1317483dce7eSHaojian Zhuang if (freq > DDR_FREQ_533M) { 1318483dce7eSHaojian Zhuang ddr_phy_reset(); 1319483dce7eSHaojian Zhuang set_ddrc_800mhz(); 1320*1d999558SHaojian Zhuang lpddrx_save_ddl_para_mission((uint32_t *)MEMORY_AXI_DDR_DDL_ADDR, 1321*1d999558SHaojian Zhuang 16 * 3 + 61); 132232e9fc1aSHaojian Zhuang } 132332e9fc1aSHaojian Zhuang return 0; 132432e9fc1aSHaojian Zhuang } 132532e9fc1aSHaojian Zhuang 132632e9fc1aSHaojian Zhuang static void init_ddr(int freq) 132732e9fc1aSHaojian Zhuang { 132832e9fc1aSHaojian Zhuang unsigned int data; 132932e9fc1aSHaojian Zhuang int ret; 133032e9fc1aSHaojian Zhuang 133132e9fc1aSHaojian Zhuang 133232e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x030)); 133332e9fc1aSHaojian Zhuang data |= 1; 133432e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x030), data); 133532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x010)); 133632e9fc1aSHaojian Zhuang data |= 1; 133732e9fc1aSHaojian Zhuang mmio_write_32((0xf7032000 + 0x010), data); 133832e9fc1aSHaojian Zhuang 1339483dce7eSHaojian Zhuang udelay(300); 134032e9fc1aSHaojian Zhuang do { 134132e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x030)); 134232e9fc1aSHaojian Zhuang data &= 3 << 28; 134332e9fc1aSHaojian Zhuang } while (data != (3 << 28)); 134432e9fc1aSHaojian Zhuang do { 134532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7032000 + 0x010)); 134632e9fc1aSHaojian Zhuang data &= 3 << 28; 134732e9fc1aSHaojian Zhuang } while (data != (3 << 28)); 134832e9fc1aSHaojian Zhuang 134932e9fc1aSHaojian Zhuang ret = lpddr3_freq_init(freq); 135032e9fc1aSHaojian Zhuang if (ret) 135132e9fc1aSHaojian Zhuang return; 135232e9fc1aSHaojian Zhuang } 135332e9fc1aSHaojian Zhuang 135432e9fc1aSHaojian Zhuang static void init_ddrc_qos(void) 135532e9fc1aSHaojian Zhuang { 135632e9fc1aSHaojian Zhuang unsigned int port, data; 135732e9fc1aSHaojian Zhuang 135832e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x088), 1); 135932e9fc1aSHaojian Zhuang 136032e9fc1aSHaojian Zhuang port = 0; 136132e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x1210); 136232e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x11111111); 136332e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x11111111); 136432e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x400 + 0 * 0x10), 0x001d0007); 136532e9fc1aSHaojian Zhuang 136632e9fc1aSHaojian Zhuang for (port = 3; port <= 4; port++) { 136732e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x1210); 136832e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x77777777); 136932e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x77777777); 137032e9fc1aSHaojian Zhuang } 137132e9fc1aSHaojian Zhuang 137232e9fc1aSHaojian Zhuang port = 1; 137332e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x30000); 137432e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x1234567); 137532e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x1234567); 137632e9fc1aSHaojian Zhuang 137732e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x1f0), 0); 137832e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x0bc), 0x3020100); 137932e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x0d0), 0x3020100); 138032e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x1f4), 0x01000100); 138132e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x08c + 0 * 4), 0xd0670402); 138232e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x068 + 0 * 4), 0x31); 138332e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x000), 0x7); 138432e9fc1aSHaojian Zhuang 138532e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7124000 + 0x09c)); 138632e9fc1aSHaojian Zhuang data &= ~0xff0000; 138732e9fc1aSHaojian Zhuang data |= 0x400000; 138832e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x09c), data); 138932e9fc1aSHaojian Zhuang data = mmio_read_32((0xf7124000 + 0x0ac)); 139032e9fc1aSHaojian Zhuang data &= ~0xff0000; 139132e9fc1aSHaojian Zhuang data |= 0x400000; 139232e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x0ac), data); 139332e9fc1aSHaojian Zhuang port = 2; 139432e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x200 + port * 0x10), 0x30000); 139532e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x204 + port * 0x10), 0x1234567); 139632e9fc1aSHaojian Zhuang mmio_write_32((0xf7120000 + 0x208 + port * 0x10), 0x1234567); 139732e9fc1aSHaojian Zhuang 139832e9fc1aSHaojian Zhuang 139932e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x09c), 0xff7fff); 140032e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x0a0), 0xff); 140132e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x0ac), 0xff7fff); 140232e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x0b0), 0xff); 140332e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x0bc), 0x3020100); 140432e9fc1aSHaojian Zhuang mmio_write_32((0xf7124000 + 0x0d0), 0x3020100); 140532e9fc1aSHaojian Zhuang } 140632e9fc1aSHaojian Zhuang 1407483dce7eSHaojian Zhuang void hikey_ddr_init(unsigned int ddr_freq) 140832e9fc1aSHaojian Zhuang { 140932e9fc1aSHaojian Zhuang uint32_t data; 141032e9fc1aSHaojian Zhuang 1411483dce7eSHaojian Zhuang assert((ddr_freq == DDR_FREQ_150M) || (ddr_freq == DDR_FREQ_266M) || 1412483dce7eSHaojian Zhuang (ddr_freq == DDR_FREQ_400M) || (ddr_freq == DDR_FREQ_533M) || 1413483dce7eSHaojian Zhuang (ddr_freq == DDR_FREQ_800M)); 141432e9fc1aSHaojian Zhuang init_pll(); 141532e9fc1aSHaojian Zhuang init_freq(); 141632e9fc1aSHaojian Zhuang 1417483dce7eSHaojian Zhuang init_ddr(ddr_freq); 141832e9fc1aSHaojian Zhuang 1419483dce7eSHaojian Zhuang ddrc_common_init(ddr_freq); 142032e9fc1aSHaojian Zhuang dienum_det_and_rowcol_cfg(); 142132e9fc1aSHaojian Zhuang detect_ddr_chip_info(); 142232e9fc1aSHaojian Zhuang 1423483dce7eSHaojian Zhuang if ((ddr_freq == DDR_FREQ_400M) || (ddr_freq == DDR_FREQ_800M)) { 142432e9fc1aSHaojian Zhuang data = mmio_read_32(0xf7032000 + 0x010); 142532e9fc1aSHaojian Zhuang data &= ~0x1; 142632e9fc1aSHaojian Zhuang mmio_write_32(0xf7032000 + 0x010, data); 1427483dce7eSHaojian Zhuang } else if ((ddr_freq == DDR_FREQ_266M) || (ddr_freq == DDR_FREQ_533M)) { 1428483dce7eSHaojian Zhuang data = mmio_read_32(0xf7032000 + 0x030); 1429483dce7eSHaojian Zhuang data &= ~0x1; 1430483dce7eSHaojian Zhuang mmio_write_32(0xf7032000 + 0x030, data); 1431483dce7eSHaojian Zhuang } else { 143232e9fc1aSHaojian Zhuang data = mmio_read_32(0xf7032000 + 0x010); 1433483dce7eSHaojian Zhuang data &= ~0x1; 1434483dce7eSHaojian Zhuang mmio_write_32(0xf7032000 + 0x010, data); 1435483dce7eSHaojian Zhuang data = mmio_read_32(0xf7032000 + 0x030); 1436483dce7eSHaojian Zhuang data &= ~0x1; 1437483dce7eSHaojian Zhuang mmio_write_32(0xf7032000 + 0x030, data); 1438483dce7eSHaojian Zhuang } 1439483dce7eSHaojian Zhuang dsb(); 1440483dce7eSHaojian Zhuang isb(); 144132e9fc1aSHaojian Zhuang 144232e9fc1aSHaojian Zhuang /* 144332e9fc1aSHaojian Zhuang * Test memory access. Do not use address 0x0 because the compiler 144432e9fc1aSHaojian Zhuang * may assume it is not a valid address and generate incorrect code 144532e9fc1aSHaojian Zhuang * (GCC 4.9.1 without -fno-delete-null-pointer-checks for instance). 144632e9fc1aSHaojian Zhuang */ 144732e9fc1aSHaojian Zhuang mmio_write_32(0x4, 0xa5a55a5a); 144832e9fc1aSHaojian Zhuang INFO("ddr test value:0x%x\n", mmio_read_32(0x4)); 144932e9fc1aSHaojian Zhuang init_ddrc_qos(); 145032e9fc1aSHaojian Zhuang } 1451