/* * (C) Copyright 2007-2008 * Stefan Roese, DENX Software Engineering, sr@denx.de. * * Based on code provided from Senao and AMCC * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */ #include #include #include #include #define mtsdram_as(reg, value) \ addi r4,0,reg ; \ mtdcr memcfga,r4 ; \ addis r4,0,value@h ; \ ori r4,r4,value@l ; \ mtdcr memcfgd,r4 ; .globl ext_bus_cntlr_init ext_bus_cntlr_init: /* * DDR2 setup */ /* Following the DDR Core Manual, here is the initialization */ /* Step 1 */ /* Step 2 */ /* Step 3 */ /* base=00000000, size=128MByte (5), mode=2 (n*10*4) */ mtsdram_as(SDRAM_MB0CF, 0x00005201); /* base=08000000, size=128MByte (5), mode=2 (n*10*4) */ mtsdram_as(SDRAM_MB1CF, (0x08000000 >> 3) | 0x5201); /* SDRAM_CLKTR: Adv Addr clock by 180 deg */ mtsdram_as(SDRAM_CLKTR,0x80000000); /* Refresh Time register (0x30) Refresh every 7.8125uS */ mtsdram_as(SDRAM_RTR, 0x06180000); /* SDRAM_SDTR1 */ mtsdram_as(SDRAM_SDTR1, 0x80201000); /* SDRAM_SDTR2 */ mtsdram_as(SDRAM_SDTR2, 0x32204232); /* SDRAM_SDTR3 */ mtsdram_as(SDRAM_SDTR3, 0x080b0d1a); mtsdram_as(SDRAM_MMODE, 0x00000442); mtsdram_as(SDRAM_MEMODE, 0x00000404); /* SDRAM0_MCOPT1 (0X20) No ECC Gen */ mtsdram_as(SDRAM_MCOPT1, 0x04322000); /* NOP */ mtsdram_as(SDRAM_INITPLR0, 0xa8380000); /* precharge 3 DDR clock cycle */ mtsdram_as(SDRAM_INITPLR1, 0x81900400); /* EMR2 twr = 2tck */ mtsdram_as(SDRAM_INITPLR2, 0x81020000); /* EMR3 twr = 2tck */ mtsdram_as(SDRAM_INITPLR3, 0x81030000); /* EMR DLL ENABLE twr = 2tck */ mtsdram_as(SDRAM_INITPLR4, 0x81010404); /* MR w/ DLL reset * Note: 5 is CL. May need to be changed */ mtsdram_as(SDRAM_INITPLR5, 0x81000542); /* precharge 3 DDR clock cycle */ mtsdram_as(SDRAM_INITPLR6, 0x81900400); /* Auto-refresh trfc = 26tck */ mtsdram_as(SDRAM_INITPLR7, 0x8D080000); /* Auto-refresh trfc = 26tck */ mtsdram_as(SDRAM_INITPLR8, 0x8D080000); /* Auto-refresh */ mtsdram_as(SDRAM_INITPLR9, 0x8D080000); /* Auto-refresh */ mtsdram_as(SDRAM_INITPLR10, 0x8D080000); /* MRS - normal operation; wait 2 cycle (set wait to tMRD) */ mtsdram_as(SDRAM_INITPLR11, 0x81000442); mtsdram_as(SDRAM_INITPLR12, 0x81010780); mtsdram_as(SDRAM_INITPLR13, 0x81010400); mtsdram_as(SDRAM_INITPLR14, 0x00000000); mtsdram_as(SDRAM_INITPLR15, 0x00000000); /* SET MCIF0_CODT Die Termination On */ mtsdram_as(SDRAM_CODT, 0x0080f837); mtsdram_as(SDRAM_MODT0, 0x01800000); #if 0 /* test-only: not sure if 0 is ok when 2nd bank is used */ mtsdram_as(SDRAM_MODT1, 0x00000000); #endif mtsdram_as(SDRAM_WRDTR, 0x00000000); /* SDRAM0_MCOPT2 (0X21) Start initialization */ mtsdram_as(SDRAM_MCOPT2, 0x20000000); /* Step 5 */ lis r3,0x1 /* 400000 = wait 100ms */ mtctr r3 pll_wait: bdnz pll_wait /* Step 6 */ /* SDRAM_DLCR */ mtsdram_as(SDRAM_DLCR, 0x030000a5); /* SDRAM_RDCC */ mtsdram_as(SDRAM_RDCC, 0x40000000); /* SDRAM_RQDC */ mtsdram_as(SDRAM_RQDC, 0x80000038); /* SDRAM_RFDC */ mtsdram_as(SDRAM_RFDC, 0x00000209); /* Enable memory controller */ mtsdram_as(SDRAM_MCOPT2, 0x28000000); blr