1*4882a593Smuzhiyun/* 2*4882a593Smuzhiyun * Copyright (C) 2015-2016 Stefan Roese <sr@denx.de> 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Refer doc/README.imximage for more details about how-to configure 7*4882a593Smuzhiyun * and create imximage boot image 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * The syntax is taken as close as possible with the kwbimage 10*4882a593Smuzhiyun */ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun/* image version */ 13*4882a593Smuzhiyun 14*4882a593SmuzhiyunIMAGE_VERSION 2 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun/* 17*4882a593Smuzhiyun * Boot Device : one of 18*4882a593Smuzhiyun * sd, nand 19*4882a593Smuzhiyun */ 20*4882a593SmuzhiyunBOOT_FROM sd 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun/* 23*4882a593Smuzhiyun * Device Configuration Data (DCD) 24*4882a593Smuzhiyun * 25*4882a593Smuzhiyun * Each entry must have the format: 26*4882a593Smuzhiyun * Addr-type Address Value 27*4882a593Smuzhiyun * 28*4882a593Smuzhiyun * where: 29*4882a593Smuzhiyun * Addr-type register length (1,2 or 4 bytes) 30*4882a593Smuzhiyun * Address absolute address of the register 31*4882a593Smuzhiyun * value value to be stored in the register 32*4882a593Smuzhiyun */ 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun#define __ASSEMBLY__ 35*4882a593Smuzhiyun#include <config.h> 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun/* Enable all clocks */ 38*4882a593SmuzhiyunDATA 4 0x020c4068 0xffffffff 39*4882a593SmuzhiyunDATA 4 0x020c406c 0xffffffff 40*4882a593SmuzhiyunDATA 4 0x020c4070 0xffffffff 41*4882a593SmuzhiyunDATA 4 0x020c4074 0xffffffff 42*4882a593SmuzhiyunDATA 4 0x020c4078 0xffffffff 43*4882a593SmuzhiyunDATA 4 0x020c407c 0xffffffff 44*4882a593SmuzhiyunDATA 4 0x020c4080 0xffffffff 45*4882a593SmuzhiyunDATA 4 0x020c4084 0xffffffff 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun/* ddr io type */ 48*4882a593SmuzhiyunDATA 4 0x020e04b4 0x000C0000 /* IOMUXC_SW_PAD_CTL_GRP_DDR_TYPE */ 49*4882a593SmuzhiyunDATA 4 0x020e04ac 0x00000000 /* IOMUXC_SW_PAD_CTL_GRP_DDRPKE */ 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun/* clock */ 52*4882a593SmuzhiyunDATA 4 0x020e027c 0x00000030 /* IOMUXC_SW_PAD_CTL_PAD_DRAM_SDCLK0_P */ 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun/* control and address */ 55*4882a593SmuzhiyunDATA 4 0x020E0250 0x00000030 /* IOMUXC_SW_PAD_CTL_PAD_DRAM_CAS */ 56*4882a593SmuzhiyunDATA 4 0x020E024C 0x00000030 /* IOMUXC_SW_PAD_CTL_PAD_DRAM_RAS */ 57*4882a593SmuzhiyunDATA 4 0x020E0490 0x00000030 /* IOMUXC_SW_PAD_CTL_GRP_ADDDS */ 58*4882a593SmuzhiyunDATA 4 0x020E0288 0x00000030 /* IOMUXC_SW_PAD_CTL_PAD_DRAM_RESET */ 59*4882a593SmuzhiyunDATA 4 0x020E0270 0x00000000 /* IOMUXC_SW_PAD_CTL_PAD_DRAM_SDBA2 - DSE can be 60*4882a593Smuzhiyun configured using Group Control Register: 61*4882a593Smuzhiyun IOMUXC_SW_PAD_CTL_GRP_CTLDS */ 62*4882a593SmuzhiyunDATA 4 0x020E0260 0x00000030 /* IOMUXC_SW_PAD_CTL_PAD_DRAM_ODT0 */ 63*4882a593SmuzhiyunDATA 4 0x020E0264 0x00000030 /* IOMUXC_SW_PAD_CTL_PAD_DRAM_ODT1 */ 64*4882a593SmuzhiyunDATA 4 0x020E04A0 0x00000030 /* IOMUXC_SW_PAD_CTL_GRP_CTLDS */ 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun/* data strobes */ 67*4882a593SmuzhiyunDATA 4 0x020e0494 0x00020000 /* IOMUXC_SW_PAD_CTL_GRP_DDRMODE_CTL */ 68*4882a593SmuzhiyunDATA 4 0x020e0280 0x00000030 /* IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS0_P */ 69*4882a593SmuzhiyunDATA 4 0x020e0284 0x00000030 /* IOMUXC_SW_PAD_CTL_PAD_DRAM_SDQS1_P */ 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun/* data */ 72*4882a593SmuzhiyunDATA 4 0x020E04B0 0x00020000 /* IOMUXC_SW_PAD_CTL_GRP_DDRMODE */ 73*4882a593SmuzhiyunDATA 4 0x020E0498 0x00000030 /* IOMUXC_SW_PAD_CTL_GRP_B0DS */ 74*4882a593SmuzhiyunDATA 4 0x020E04A4 0x00000030 /* IOMUXC_SW_PAD_CTL_GRP_B1DS */ 75*4882a593SmuzhiyunDATA 4 0x020E0244 0x00000030 /* IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM0 */ 76*4882a593SmuzhiyunDATA 4 0x020E0248 0x00000030 /* IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM1 */ 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun/* 79*4882a593Smuzhiyun * DDR Controller Registers 80*4882a593Smuzhiyun * 81*4882a593Smuzhiyun * Manufacturer: IM 82*4882a593Smuzhiyun * Device Part Number: IME1G16D3EEBG-15EI 83*4882a593Smuzhiyun * Clock Freq.: 400MHz 84*4882a593Smuzhiyun * Density per CS in Gb: 1 85*4882a593Smuzhiyun * Chip Selects used: 1 86*4882a593Smuzhiyun * Number of Banks: 8 87*4882a593Smuzhiyun * Row address: 13 88*4882a593Smuzhiyun * Column address: 10 89*4882a593Smuzhiyun * Data bus width 16 90*4882a593Smuzhiyun */ 91*4882a593SmuzhiyunDATA 4 0x021b001c 0x00008000 /* MMDC0_MDSCR, set the Configuration request bit 92*4882a593Smuzhiyun during MMDC set up */ 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun/* 95*4882a593Smuzhiyun * Calibration setup 96*4882a593Smuzhiyun */ 97*4882a593SmuzhiyunDATA 4 0x021b0800 0xA1390003 /* DDR_PHY_P0_MPZQHWCTRL, enable both one-time & 98*4882a593Smuzhiyun periodic HW ZQ calibration. */ 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun/* 101*4882a593Smuzhiyun * For target board, may need to run write leveling calibration to fine tune 102*4882a593Smuzhiyun * these settings. 103*4882a593Smuzhiyun */ 104*4882a593SmuzhiyunDATA 4 0x021b080c 0x00000000 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun/* Read DQS Gating calibration */ 107*4882a593SmuzhiyunDATA 4 0x021b083c 0x4164015C /* MPDGCTRL0 PHY0 */ 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun/* Read calibration */ 110*4882a593SmuzhiyunDATA 4 0x021b0848 0x40404446 /* MPRDDLCTL PHY0 */ 111*4882a593Smuzhiyun 112*4882a593Smuzhiyun/* Write calibration */ 113*4882a593SmuzhiyunDATA 4 0x021b0850 0x40405A52 /* MPWRDLCTL PHY0 */ 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun/* 116*4882a593Smuzhiyun * read data bit delay: (3 is the reccommended default value, although out of 117*4882a593Smuzhiyun * reset value is 0) 118*4882a593Smuzhiyun */ 119*4882a593SmuzhiyunDATA 4 0x021b081c 0x33333333 /* DDR_PHY_P0_MPREDQBY0DL3 */ 120*4882a593SmuzhiyunDATA 4 0x021b0820 0x33333333 /* DDR_PHY_P0_MPREDQBY1DL3 */ 121*4882a593SmuzhiyunDATA 4 0x021b082c 0xF3333333 122*4882a593SmuzhiyunDATA 4 0x021b0830 0xF3333333 123*4882a593Smuzhiyun 124*4882a593SmuzhiyunDATA 4 0x021b08c0 0x00921012 125*4882a593Smuzhiyun 126*4882a593Smuzhiyun/* Clock Fine Tuning */ 127*4882a593SmuzhiyunDATA 4 0x021B0858 0x00000F00 /* [MMDC_MPSDCTRL] MMDC PHY CK Control Register */ 128*4882a593Smuzhiyun 129*4882a593Smuzhiyun/* Complete calibration by forced measurement: */ 130*4882a593SmuzhiyunDATA 4 0x021b08b8 0x00000800 /* DDR_PHY_P0_MPMUR0, frc_msr */ 131*4882a593Smuzhiyun/* 132*4882a593Smuzhiyun * Calibration setup end 133*4882a593Smuzhiyun */ 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun/* MMDC init: */ 136*4882a593SmuzhiyunDATA 4 0x021b0004 0x0002002D /* MMDC0_MDPDC */ 137*4882a593SmuzhiyunDATA 4 0x021b0008 0x1B333030 /* MMDC0_MDOTC */ 138*4882a593SmuzhiyunDATA 4 0x021b000c 0x3F4352F3 /* MMDC0_MDCFG0 */ 139*4882a593SmuzhiyunDATA 4 0x021b0010 0xB66D0B63 /* MMDC0_MDCFG1 */ 140*4882a593SmuzhiyunDATA 4 0x021b0014 0x01FF00DB /* MMDC0_MDCFG2 */ 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun/* 143*4882a593Smuzhiyun * MDMISC: RALAT kept to the high level of 5. 144*4882a593Smuzhiyun * MDMISC: consider reducing RALAT if your 528MHz board design allow that. 145*4882a593Smuzhiyun * Lower RALAT benefits: 146*4882a593Smuzhiyun * a. better operation at low frequency, for LPDDR2 freq < 100MHz, change RALAT 147*4882a593Smuzhiyun * to 3 148*4882a593Smuzhiyun * b. Small performence improvment 149*4882a593Smuzhiyun */ 150*4882a593SmuzhiyunDATA 4 0x021b0018 0x00201740 /* MMDC0_MDMISC */ 151*4882a593Smuzhiyun 152*4882a593SmuzhiyunDATA 4 0x021b001c 0x00008000 /* MMDC0_MDSCR, set the Configuration request bit 153*4882a593Smuzhiyun during MMDC set up */ 154*4882a593Smuzhiyun 155*4882a593SmuzhiyunDATA 4 0x021b002c 0x000026D2 /* MMDC0_MDRWD */ 156*4882a593SmuzhiyunDATA 4 0x021b0030 0x00431023 /* MMDC0_MDOR */ 157*4882a593SmuzhiyunDATA 4 0x021b0040 0x00000047 /* Chan0 CS0_END */ 158*4882a593SmuzhiyunDATA 4 0x021b0000 0x82180000 /* MMDC0_MDCTL */ 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun/* Mode register writes */ 161*4882a593SmuzhiyunDATA 4 0x021b001c 0x02008032 /* MMDC0_MDSCR, MR2 write, CS0 */ 162*4882a593SmuzhiyunDATA 4 0x021b001c 0x00008033 /* MMDC0_MDSCR, MR3 write, CS0 */ 163*4882a593SmuzhiyunDATA 4 0x021b001c 0x00048031 /* MMDC0_MDSCR, MR1 write, CS0 */ 164*4882a593SmuzhiyunDATA 4 0x021b001c 0x15208030 /* MMDC0_MDSCR, MR0 write, CS0 */ 165*4882a593SmuzhiyunDATA 4 0x021b001c 0x04008040 /* MMDC0_MDSCR, ZQ calibration command sent to 166*4882a593Smuzhiyun device on CS0 */ 167*4882a593Smuzhiyun 168*4882a593SmuzhiyunDATA 4 0x021b0020 0x00000800 /* MMDC0_MDREF */ 169*4882a593SmuzhiyunDATA 4 0x021b0818 0x00000227 /* DDR_PHY_P0_MPODTCTRL */ 170*4882a593SmuzhiyunDATA 4 0x021b0004 0x0002556D /* MMDC0_MDPDC now SDCTL power down enabled */ 171*4882a593SmuzhiyunDATA 4 0x021b0404 0x00011006 /* MMDC0_MAPSR ADOPT power down enabled, MMDC will 172*4882a593Smuzhiyun enter automatically to self-refresh while the 173*4882a593Smuzhiyun number of idle cycle reached. */ 174*4882a593SmuzhiyunDATA 4 0x021b001c 0x00000000 /* MMDC0_MDSCR, clear this register (especially 175*4882a593Smuzhiyun the configuration bit as initialization is 176*4882a593Smuzhiyun complete) */ 177