| /* |
| * (C) Copyright 2000-2006 |
| * Wolfgang Denk, DENX Software Engineering, wd@denx.de. |
| * |
| * SPDX-License-Identifier: GPL-2.0+ |
| */ |
| |
| #include <common.h> |
| #include <asm/immap.h> |
| |
| int checkboard (void) { |
| puts ("Board: iDMR\n"); |
| return 0; |
| }; |
| |
| phys_size_t initdram (int board_type) { |
| int i; |
| |
| /* |
| * After reset, CS0 is configured to cover entire address space. We |
| * need to configure it to its proper values, so that writes to |
| * CONFIG_SYS_SDRAM_BASE and vicinity during SDRAM controller setup below do |
| * now fall under CS0 (see 16.3.1 of the MCF5271 Reference Manual). |
| */ |
| |
| /* Flash chipselect, CS0 */ |
| /* ;CSAR0: Flash at 0xFF800000 */ |
| mbar_writeShort(0x0080, 0xFF80); |
| |
| /* CSCR0: Flash 6 waits, 16bit */ |
| mbar_writeShort(0x008A, 0x1980); |
| |
| /* CSMR0: Flash 8MB, R/W, valid */ |
| mbar_writeLong(0x0084, 0x007F0001); |
| |
| |
| /* |
| * SDRAM configuration proper |
| */ |
| |
| /* |
| * Address/Data Pin Assignment Reg.: enable address lines 23-21; do |
| * not enable data pins D[15:0], as we have 16 bit port to SDRAM |
| */ |
| mbar_writeByte(MCF_GPIO_PAR_AD, |
| MCF_GPIO_AD_ADDR23 | |
| MCF_GPIO_AD_ADDR22 | |
| MCF_GPIO_AD_ADDR21); |
| |
| /* No need to configure BS pins - reset values are OK */ |
| |
| /* Chip Select Pin Assignment Reg.: set CS[1-7] to GPIO */ |
| mbar_writeByte(MCF_GPIO_PAR_CS, 0x00); |
| |
| /* SDRAM Control Pin Assignment Reg. */ |
| mbar_writeByte(MCF_GPIO_PAR_SDRAM, |
| MCF_GPIO_SDRAM_CSSDCS_00 | /* no matter: PAR_CS=0 */ |
| MCF_GPIO_SDRAM_SDWE | |
| MCF_GPIO_SDRAM_SCAS | |
| MCF_GPIO_SDRAM_SRAS | |
| MCF_GPIO_SDRAM_SCKE | |
| MCF_GPIO_SDRAM_SDCS_01); |
| |
| /* |
| * Wait 100us. We run the bus at 50MHz, one cycle is 20ns. So 5 |
| * iterations will do, but we do 10 just to be safe. |
| */ |
| for (i = 0; i < 10; ++i) |
| asm(" nop"); |
| |
| |
| /* 1. Initialize DRAM Control Register: DCR */ |
| mbar_writeShort(MCF_SDRAMC_DCR, |
| MCF_SDRAMC_DCR_RTIM(0x10) | /* 65ns */ |
| MCF_SDRAMC_DCR_RC(0x60)); /* 1562 cycles */ |
| |
| |
| /* |
| * 2. Initialize DACR0 |
| * |
| * CL: 11 (CL=3: 0x03, 0x02; CL=2: 0x1) |
| * CBM: cmd at A20, bank select bits 21 and up |
| * PS: 16 bit |
| */ |
| mbar_writeLong(MCF_SDRAMC_DACR0, |
| MCF_SDRAMC_DACRn_BA(CONFIG_SYS_SDRAM_BASE>>18) | |
| MCF_SDRAMC_DACRn_BA(0x00) | |
| MCF_SDRAMC_DACRn_CASL(0x03) | |
| MCF_SDRAMC_DACRn_CBM(0x03) | |
| MCF_SDRAMC_DACRn_PS(0x03)); |
| |
| /* Initialize DMR0 */ |
| mbar_writeLong(MCF_SDRAMC_DMR0, |
| MCF_SDRAMC_DMRn_BAM_16M | |
| MCF_SDRAMC_DMRn_V); |
| |
| |
| /* 3. Set IP bit in DACR to initiate PALL command */ |
| mbar_writeLong(MCF_SDRAMC_DACR0, |
| mbar_readLong(MCF_SDRAMC_DACR0) | |
| MCF_SDRAMC_DACRn_IP); |
| |
| /* Write to this block to initiate precharge */ |
| *(volatile u16 *)(CONFIG_SYS_SDRAM_BASE) = 0xa5a5; |
| |
| /* |
| * Wait at least 20ns to allow banks to precharge (t_RP = 20ns). We |
| * wait a wee longer, just to be safe. |
| */ |
| for (i = 0; i < 5; ++i) |
| asm(" nop"); |
| |
| |
| /* 4. Set RE bit in DACR */ |
| mbar_writeLong(MCF_SDRAMC_DACR0, |
| mbar_readLong(MCF_SDRAMC_DACR0) | |
| MCF_SDRAMC_DACRn_RE); |
| |
| /* |
| * Wait for at least 8 auto refresh cycles to occur, i.e. at least |
| * 781 bus cycles. |
| */ |
| for (i = 0; i < 1000; ++i) |
| asm(" nop"); |
| |
| /* Finish the configuration by issuing the MRS */ |
| mbar_writeLong(MCF_SDRAMC_DACR0, |
| mbar_readLong(MCF_SDRAMC_DACR0) | |
| MCF_SDRAMC_DACRn_MRS); |
| |
| /* |
| * Write to the SDRAM Mode Register A0-A11 = 0x400 |
| * |
| * Write Burst Mode = Programmed Burst Length |
| * Op Mode = Standard Op |
| * CAS Latency = 3 |
| * Burst Type = Sequential |
| * Burst Length = 1 |
| */ |
| *(volatile u32 *)(CONFIG_SYS_SDRAM_BASE + 0x1800) = 0xa5a5a5a5; |
| |
| return CONFIG_SYS_SDRAM_SIZE * 1024 * 1024; |
| }; |
| |
| |
| int testdram (void) { |
| |
| /* TODO: XXX XXX XXX */ |
| printf ("DRAM test not implemented!\n"); |
| |
| return (0); |
| } |