Home | History | Annotate | Line # | Download | only in bootimx23
emi_prep.c revision 1.2.4.1
      1  1.2.4.1  rmind /* $Id: emi_prep.c,v 1.2.4.1 2014/05/18 17:45:05 rmind Exp $ */
      2      1.1  jkunz 
      3      1.1  jkunz /*
      4      1.1  jkunz  * Copyright (c) 2012 The NetBSD Foundation, Inc.
      5      1.1  jkunz  * All rights reserved.
      6      1.1  jkunz  *
      7      1.1  jkunz  * This code is derived from software contributed to The NetBSD Foundation
      8      1.1  jkunz  * by Petri Laakso.
      9      1.1  jkunz  *
     10      1.1  jkunz  * Redistribution and use in source and binary forms, with or without
     11      1.1  jkunz  * modification, are permitted provided that the following conditions
     12      1.1  jkunz  * are met:
     13      1.1  jkunz  * 1. Redistributions of source code must retain the above copyright
     14      1.1  jkunz  *    notice, this list of conditions and the following disclaimer.
     15      1.1  jkunz  * 2. Redistributions in binary form must reproduce the above copyright
     16      1.1  jkunz  *    notice, this list of conditions and the following disclaimer in the
     17      1.1  jkunz  *    documentation and/or other materials provided with the distribution.
     18      1.1  jkunz  *
     19      1.1  jkunz  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20      1.1  jkunz  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21      1.1  jkunz  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22      1.1  jkunz  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23      1.1  jkunz  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24      1.1  jkunz  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25      1.1  jkunz  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26      1.1  jkunz  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27      1.1  jkunz  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28      1.1  jkunz  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29      1.1  jkunz  * POSSIBILITY OF SUCH DAMAGE.
     30      1.1  jkunz  */
     31      1.1  jkunz #include <sys/cdefs.h>
     32  1.2.4.1  rmind #include <sys/param.h>
     33      1.1  jkunz #include <sys/types.h>
     34      1.1  jkunz 
     35      1.1  jkunz #include <arm/imx/imx23_emireg.h>
     36      1.1  jkunz 
     37      1.1  jkunz #include "common.h"
     38      1.1  jkunz 
     39      1.2  jkunz static void init_dram_registers(void);
     40      1.2  jkunz static uint32_t get_dram_int_status(void);
     41      1.1  jkunz 
     42  1.2.4.1  rmind #define DRAM_REGS 41
     43  1.2.4.1  rmind 
     44  1.2.4.1  rmind uint32_t dram_regs[DRAM_REGS] = {
     45  1.2.4.1  rmind 	0x01010001, 0x00010100, 0x01000101, 0x00000001,
     46  1.2.4.1  rmind 	0x00000101, 0x00000000, 0x00010000, 0x01000001,
     47  1.2.4.1  rmind 	0x00000000, 0x00000001, 0x07000200, 0x00070202,
     48  1.2.4.1  rmind 	0x02020000, 0x04040a01, 0x00000201, 0x02040000,
     49  1.2.4.1  rmind 	0x02000000, 0x19000f08, 0x0d0d0000, 0x02021313,
     50  1.2.4.1  rmind 	0x02061521, 0x0000000a, 0x00080008, 0x00200020,
     51  1.2.4.1  rmind 	0x00200020, 0x00200020, 0x000003f7, 0x00000000,
     52  1.2.4.1  rmind 	0x00000000, 0x00000020, 0x00000020, 0x00c80000,
     53  1.2.4.1  rmind 	0x000a23cd, 0x000000c8, 0x00006665, 0x00000000,
     54  1.2.4.1  rmind 	0x00000101, 0x00040001, 0x00000000, 0x00000000,
     55  1.2.4.1  rmind 	0x00010000
     56  1.2.4.1  rmind };
     57  1.2.4.1  rmind 
     58      1.1  jkunz /*
     59  1.2.4.1  rmind  * Initialize DRAM memory.
     60      1.1  jkunz  */
     61      1.1  jkunz int
     62      1.1  jkunz emi_prep(void)
     63      1.1  jkunz {
     64  1.2.4.1  rmind 	uint32_t tmp_r;
     65  1.2.4.1  rmind 
     66  1.2.4.1  rmind 	REG_WR(HW_EMI_CTRL_BASE + HW_EMI_CTRL_CLR, HW_EMI_CTRL_SFTRST);
     67  1.2.4.1  rmind 	delay(10000);
     68  1.2.4.1  rmind 
     69  1.2.4.1  rmind 	tmp_r = REG_RD(HW_DRAM_BASE + HW_DRAM_CTL08);
     70  1.2.4.1  rmind 	tmp_r &= ~(HW_DRAM_CTL08_START | HW_DRAM_CTL08_SREFRESH);
     71  1.2.4.1  rmind 	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL08, tmp_r);
     72      1.1  jkunz 
     73      1.1  jkunz 	init_dram_registers();
     74      1.1  jkunz 
     75  1.2.4.1  rmind 	/* START */
     76  1.2.4.1  rmind 	tmp_r = REG_RD(HW_DRAM_BASE + HW_DRAM_CTL08);
     77  1.2.4.1  rmind 	tmp_r |= HW_DRAM_CTL08_START;
     78  1.2.4.1  rmind 	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL08, tmp_r);
     79  1.2.4.1  rmind 
     80  1.2.4.1  rmind 	delay(20000);
     81  1.2.4.1  rmind 
     82  1.2.4.1  rmind 	/*
     83  1.2.4.1  rmind 	 * Set memory power-down with memory
     84  1.2.4.1  rmind 	 * clock gating mode (Mode 2).
     85  1.2.4.1  rmind 	 */
     86  1.2.4.1  rmind 	tmp_r = REG_RD(HW_DRAM_BASE + HW_DRAM_CTL16);
     87  1.2.4.1  rmind 	tmp_r |= (1 << 19);
     88  1.2.4.1  rmind 	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL16, tmp_r);
     89  1.2.4.1  rmind 
     90  1.2.4.1  rmind 	tmp_r = REG_RD(HW_DRAM_BASE + HW_DRAM_CTL16);
     91  1.2.4.1  rmind 	tmp_r |= (1<<11);
     92  1.2.4.1  rmind 	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL16, tmp_r);
     93      1.1  jkunz 
     94  1.2.4.1  rmind 	/* Wait until DRAM initialization is complete. */
     95  1.2.4.1  rmind 	while(!(get_dram_int_status() & (1<<2)));
     96      1.1  jkunz 
     97  1.2.4.1  rmind 	delay(20000);
     98      1.1  jkunz 
     99  1.2.4.1  rmind 	return 0;
    100      1.1  jkunz }
    101      1.1  jkunz /*
    102  1.2.4.1  rmind  * Set DRAM register values.
    103      1.1  jkunz  */
    104      1.2  jkunz static void
    105  1.2.4.1  rmind init_dram_registers(void)
    106      1.1  jkunz {
    107  1.2.4.1  rmind 	volatile uint32_t *dram_r;
    108  1.2.4.1  rmind 	int i;
    109      1.1  jkunz 
    110  1.2.4.1  rmind 	dram_r = (uint32_t *)(HW_DRAM_BASE);
    111      1.2  jkunz 
    112  1.2.4.1  rmind 	for (i=0; i < DRAM_REGS; i++) {
    113  1.2.4.1  rmind 		/* Skip ctrl register 8, obsolete registers 27 and 28,
    114  1.2.4.1  rmind 		 * read only register 35 */
    115  1.2.4.1  rmind 		if (i == 8 || i == 27 || i == 28 || i == 35)
    116  1.2.4.1  rmind 			continue;
    117  1.2.4.1  rmind 		*(dram_r + i) = dram_regs[i];
    118  1.2.4.1  rmind 	}
    119  1.2.4.1  rmind 
    120  1.2.4.1  rmind 	/* Set tRAS lockout on. */
    121  1.2.4.1  rmind 	*(dram_r + 8) |= HW_DRAM_CTL08_TRAS_LOCKOUT;
    122      1.1  jkunz 
    123      1.1  jkunz 	return;
    124      1.1  jkunz }
    125      1.1  jkunz /*
    126      1.1  jkunz  * Return DRAM controller interrupt status register.
    127      1.1  jkunz  */
    128      1.2  jkunz static uint32_t
    129      1.1  jkunz get_dram_int_status(void)
    130      1.1  jkunz {
    131      1.1  jkunz 	uint32_t reg;
    132      1.2  jkunz 
    133      1.2  jkunz 	reg = REG_RD(HW_DRAM_BASE + HW_DRAM_CTL18);
    134      1.1  jkunz 	return __SHIFTOUT(reg, HW_DRAM_CTL18_INT_STATUS);
    135      1.1  jkunz }
    136