Home | History | Annotate | Line # | Download | only in bootimx23
      1  1.3   matt /* $Id: emi_prep.c,v 1.3 2013/10/07 17:36:40 matt 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.3   matt #include <sys/cdefs.h>
     32  1.1  jkunz #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.3   matt #define DRAM_REGS 41
     43  1.3   matt 
     44  1.3   matt uint32_t dram_regs[DRAM_REGS] = {
     45  1.3   matt 	0x01010001, 0x00010100, 0x01000101, 0x00000001,
     46  1.3   matt 	0x00000101, 0x00000000, 0x00010000, 0x01000001,
     47  1.3   matt 	0x00000000, 0x00000001, 0x07000200, 0x00070202,
     48  1.3   matt 	0x02020000, 0x04040a01, 0x00000201, 0x02040000,
     49  1.3   matt 	0x02000000, 0x19000f08, 0x0d0d0000, 0x02021313,
     50  1.3   matt 	0x02061521, 0x0000000a, 0x00080008, 0x00200020,
     51  1.3   matt 	0x00200020, 0x00200020, 0x000003f7, 0x00000000,
     52  1.3   matt 	0x00000000, 0x00000020, 0x00000020, 0x00c80000,
     53  1.3   matt 	0x000a23cd, 0x000000c8, 0x00006665, 0x00000000,
     54  1.3   matt 	0x00000101, 0x00040001, 0x00000000, 0x00000000,
     55  1.3   matt 	0x00010000
     56  1.3   matt };
     57  1.3   matt 
     58  1.1  jkunz /*
     59  1.3   matt  * 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.3   matt 	uint32_t tmp_r;
     65  1.3   matt 
     66  1.3   matt 	REG_WR(HW_EMI_CTRL_BASE + HW_EMI_CTRL_CLR, HW_EMI_CTRL_SFTRST);
     67  1.3   matt 	delay(10000);
     68  1.3   matt 
     69  1.3   matt 	tmp_r = REG_RD(HW_DRAM_BASE + HW_DRAM_CTL08);
     70  1.3   matt 	tmp_r &= ~(HW_DRAM_CTL08_START | HW_DRAM_CTL08_SREFRESH);
     71  1.3   matt 	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL08, tmp_r);
     72  1.1  jkunz 
     73  1.1  jkunz 	init_dram_registers();
     74  1.3   matt 
     75  1.3   matt 	/* START */
     76  1.3   matt 	tmp_r = REG_RD(HW_DRAM_BASE + HW_DRAM_CTL08);
     77  1.3   matt 	tmp_r |= HW_DRAM_CTL08_START;
     78  1.3   matt 	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL08, tmp_r);
     79  1.3   matt 
     80  1.3   matt 	delay(20000);
     81  1.3   matt 
     82  1.3   matt 	/*
     83  1.3   matt 	 * Set memory power-down with memory
     84  1.3   matt 	 * clock gating mode (Mode 2).
     85  1.3   matt 	 */
     86  1.3   matt 	tmp_r = REG_RD(HW_DRAM_BASE + HW_DRAM_CTL16);
     87  1.3   matt 	tmp_r |= (1 << 19);
     88  1.3   matt 	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL16, tmp_r);
     89  1.3   matt 
     90  1.3   matt 	tmp_r = REG_RD(HW_DRAM_BASE + HW_DRAM_CTL16);
     91  1.3   matt 	tmp_r |= (1<<11);
     92  1.3   matt 	REG_WR(HW_DRAM_BASE + HW_DRAM_CTL16, tmp_r);
     93  1.3   matt 
     94  1.3   matt 	/* Wait until DRAM initialization is complete. */
     95  1.3   matt 	while(!(get_dram_int_status() & (1<<2)));
     96  1.3   matt 
     97  1.3   matt 	delay(20000);
     98  1.1  jkunz 
     99  1.1  jkunz 	return 0;
    100  1.1  jkunz }
    101  1.1  jkunz /*
    102  1.3   matt  * Set DRAM register values.
    103  1.1  jkunz  */
    104  1.2  jkunz static void
    105  1.1  jkunz init_dram_registers(void)
    106  1.1  jkunz {
    107  1.3   matt 	volatile uint32_t *dram_r;
    108  1.3   matt 	int i;
    109  1.1  jkunz 
    110  1.3   matt 	dram_r = (uint32_t *)(HW_DRAM_BASE);
    111  1.1  jkunz 
    112  1.3   matt 	for (i=0; i < DRAM_REGS; i++) {
    113  1.3   matt 		/* Skip ctrl register 8, obsolete registers 27 and 28,
    114  1.3   matt 		 * read only register 35 */
    115  1.3   matt 		if (i == 8 || i == 27 || i == 28 || i == 35)
    116  1.3   matt 			continue;
    117  1.3   matt 		*(dram_r + i) = dram_regs[i];
    118  1.3   matt 	}
    119  1.2  jkunz 
    120  1.3   matt 	/* Set tRAS lockout on. */
    121  1.3   matt 	*(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