| /* |
| * (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 <config.h> |
| #include <ppc4xx.h> |
| |
| #include <ppc_asm.tmpl> |
| #include <ppc_defs.h> |
| |
| #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 |