1877bfe37SValentin Longchamp /* 2877bfe37SValentin Longchamp * (C) Copyright 2013 Keymile AG 3877bfe37SValentin Longchamp * Valentin Longchamp <valentin.longchamp@keymile.com> 4877bfe37SValentin Longchamp * 5877bfe37SValentin Longchamp * Copyright 2009-2011 Freescale Semiconductor, Inc. 6877bfe37SValentin Longchamp * 7877bfe37SValentin Longchamp * SPDX-License-Identifier: GPL-2.0+ 8877bfe37SValentin Longchamp */ 9877bfe37SValentin Longchamp 10877bfe37SValentin Longchamp #include <common.h> 11877bfe37SValentin Longchamp #include <i2c.h> 12877bfe37SValentin Longchamp #include <hwconfig.h> 13877bfe37SValentin Longchamp #include <asm/mmu.h> 145614e71bSYork Sun #include <fsl_ddr_sdram.h> 155614e71bSYork Sun #include <fsl_ddr_dimm_params.h> 16877bfe37SValentin Longchamp 17088454cdSSimon Glass DECLARE_GLOBAL_DATA_PTR; 18088454cdSSimon Glass fsl_ddr_board_options(memctl_options_t * popts,dimm_params_t * pdimm,unsigned int ctrl_num)19877bfe37SValentin Longchampvoid fsl_ddr_board_options(memctl_options_t *popts, 20877bfe37SValentin Longchamp dimm_params_t *pdimm, 21877bfe37SValentin Longchamp unsigned int ctrl_num) 22877bfe37SValentin Longchamp { 23877bfe37SValentin Longchamp if (ctrl_num) { 24877bfe37SValentin Longchamp printf("Wrong parameter for controller number %d", ctrl_num); 25877bfe37SValentin Longchamp return; 26877bfe37SValentin Longchamp } 27877bfe37SValentin Longchamp 28877bfe37SValentin Longchamp /* automatic calibration for nb of cycles between read and DQS pre */ 29877bfe37SValentin Longchamp popts->cpo_override = 0xFF; 30877bfe37SValentin Longchamp 31877bfe37SValentin Longchamp /* 1/2 clk delay between wr command and data strobe */ 32877bfe37SValentin Longchamp popts->write_data_delay = 4; 33877bfe37SValentin Longchamp /* clk lauched 1/2 applied cylcle after address command */ 34877bfe37SValentin Longchamp popts->clk_adjust = 4; 35877bfe37SValentin Longchamp /* 1T timing: command/address held for only 1 cycle */ 36877bfe37SValentin Longchamp popts->twot_en = 0; 37877bfe37SValentin Longchamp 38877bfe37SValentin Longchamp /* we have only one module, half str should be OK */ 39877bfe37SValentin Longchamp popts->half_strength_driver_enable = 1; 40877bfe37SValentin Longchamp 4162a3b7ddSRobert P. J. Day /* wrlvl values overridden as recommended by ddr init func */ 42877bfe37SValentin Longchamp popts->wrlvl_override = 1; 43877bfe37SValentin Longchamp popts->wrlvl_sample = 0xf; 44877bfe37SValentin Longchamp popts->wrlvl_start = 0x6; 45877bfe37SValentin Longchamp 46877bfe37SValentin Longchamp /* Enable ZQ calibration */ 47877bfe37SValentin Longchamp popts->zq_en = 1; 48877bfe37SValentin Longchamp 49877bfe37SValentin Longchamp /* DHC_EN =1, ODT = 75 Ohm */ 50877bfe37SValentin Longchamp popts->ddr_cdr1 = DDR_CDR1_DHC_EN | DDR_CDR_ODT_75ohm; 51877bfe37SValentin Longchamp } 52877bfe37SValentin Longchamp dram_init(void)53*f1683aa7SSimon Glassint dram_init(void) 54877bfe37SValentin Longchamp { 55877bfe37SValentin Longchamp phys_size_t dram_size = 0; 56877bfe37SValentin Longchamp 57877bfe37SValentin Longchamp puts("Initializing with SPD\n"); 58877bfe37SValentin Longchamp 59877bfe37SValentin Longchamp dram_size = fsl_ddr_sdram(); 60877bfe37SValentin Longchamp 61877bfe37SValentin Longchamp dram_size = setup_ddr_tlbs(dram_size / 0x100000); 62877bfe37SValentin Longchamp dram_size *= 0x100000; 63877bfe37SValentin Longchamp 64877bfe37SValentin Longchamp debug(" DDR: "); 65088454cdSSimon Glass gd->ram_size = dram_size; 66088454cdSSimon Glass 67088454cdSSimon Glass return 0; 68877bfe37SValentin Longchamp } 69