/*
**=====================================================================
**
** Copyright (C) 2000, 2001, 2002, 2003
** The LEOX team <team@leox.org>, http://www.leox.org
**
** LEOX.org is about the development of free hardware and software resources
**   for system on chip.
**
** Description: U-Boot port on the LEOX's ELPT860 CPU board
** ~~~~~~~~~~~
**
**=====================================================================
**
** This program is free software; you can redistribute it and/or
** modify it under the terms of the GNU General Public License as
** published by the Free Software Foundation; either version 2 of
** the License, or (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program; if not, write to the Free Software
** Foundation, Inc., 59 Temple Place, Suite 330, Boston,
** MA 02111-1307 USA
**
**=====================================================================
*/

/*
** Note 1: In this file, you have to provide the following functions:
** ------
**              int             board_pre_init(void)
**              int             checkboard(void)
**              long int        initdram(int board_type)
** called from 'board_init_f()' into 'common/board.c'
**
**              void            reset_phy(void)
** called from 'board_init_r()' into 'common/board.c'
*/

#include <common.h>
#include <mpc8xx.h>

/* ------------------------------------------------------------------------- */

static long int dram_size (long int, long int *, long int);

/* ------------------------------------------------------------------------- */

#define	_NOT_USED_	0xFFFFFFFF

const uint init_sdram_table[] =
{
  /*
   * Single Read. (Offset 0 in UPMA RAM)
   */
  0x0FFCCC04, 0xFFFFFC04, 0x0FFC3C04, 0xFFFFFC04,
  0xFFFFFC04, /* last */
  /*
   * SDRAM Initialization (offset 5 in UPMA RAM)
   *
   * This is no UPM entry point. The following definition uses
   * the remaining space to establish an initialization
   * sequence, which is executed by a RUN command.
   *
   */
  0xFFFFFC04, 0xFFFFFC04, 0x0FFC3C04,  /* last */
  /*
   * Burst Read. (Offset 8 in UPMA RAM)
   */
  0xFFFFFC04, 0xFFFFFC04, 0xFFFFFC04, 0xFFFFFC04,
  0x0FFC3C04, 0xFFFFFC04, 0xFFFFFC04, 0xFFFFFC04,
  0xFFFFFC04, 0x0FFC3C04, 0xFFFFFC04, 0xFFFFFC04,
  0xFFFFFC04, 0xFFFFFC04, 0x0FFC3C04, 0xFFFFFC04, /* last */
  /*
   * Single Write. (Offset 18 in UPMA RAM)
   */
  0xFFFFFC04, 0xFFFFFC04, 0xFFFFFC04, 0x0FFC3C04,
  0xFFFFFC04, 0xFFFFFC04, 0x0FFFFC04, 0xFFFFFC04, /* last */
  /*
   * Burst Write. (Offset 20 in UPMA RAM)
   */
  0x0FFC3C04, 0xFFFFFC04, 0xFFFFFC04, 0xFFFFFC04,
  0xFFFFFC04, 0x0FFC3C04, 0xFFFFFC04, 0xFFFFFC04,
  0xFFFFFC04, 0xFFFFFC04, 0xFFFFFC34, 0x0FAC0C34,
  0xFFFFFC05, 0xFFFFFC04, 0x0FFCFC04, 0xFFFFFC05, /* last */
};

const uint sdram_table[] =
{
  /*
   * Single Read. (Offset 0 in UPMA RAM)
   */
  0x0F0FFC24, 0x0F0CFC04, 0xFF0FFC04, 0x00AF3C04,
  0xFF0FFC00, /* last */
  /*
   * SDRAM Initialization (offset 5 in UPMA RAM)
   *
   * This is no UPM entry point. The following definition uses
   * the remaining space to establish an initialization
   * sequence, which is executed by a RUN command.
   *
   */
  0x0FFCCC04, 0xFFAFFC05, 0xFFAFFC05, /* last */
  /*
   * Burst Read. (Offset 8 in UPMA RAM)
   */
  0x0F0FFC24, 0x0F0CFC04, 0xFF0FFC04, 0x00AF3C04,
  0xF00FFC00, 0xF00FFC00, 0xF00FFC00, 0xFF0FFC00,
  0x0FFCCC04, 0xFFAFFC05, 0xFFAFFC04, 0xFFAFFC04,
  0xFFAFFC04, 0xFFAFFC04, 0xFFAFFC04, 0xFFAFFC04, /* last */
  /*
   * Single Write. (Offset 18 in UPMA RAM)
   */
  0x0F0FFC24, 0x0F0CFC04, 0xFF0FFC04, 0x00AF0C00,
  0xFF0FFC04, 0x0FFCCC04, 0xFFAFFC05, /* last */
  _NOT_USED_,
  /*
   * Burst Write. (Offset 20 in UPMA RAM)
   */
  0x0F0FFC24, 0x0F0CFC04, 0xFF0FFC00, 0x00AF0C00,
  0xF00FFC00, 0xF00FFC00, 0xF00FFC04, 0x0FFCCC04,
  0xFFAFFC04, 0xFFAFFC05, 0xFFAFFC04, 0xFFAFFC04,
  0xFFAFFC04, 0xFFAFFC04, 0xFFAFFC04, 0xFFAFFC04, /* last */
  /*
   * Refresh  (Offset 30 in UPMA RAM)
   */
  0x0FFC3C04, 0xFFFFFC04, 0xFFFFFC04, 0xFFFFFC04,
  0xFFFFFC05, 0xFFFFFC04, 0xFFFFFC05, _NOT_USED_,
  0xFFAFFC04, 0xFFAFFC04, 0xFFAFFC04, 0xFFAFFC04, /* last */
  /*
   * Exception. (Offset 3c in UPMA RAM)
   */
  0x0FFFFC34, 0x0FAC0C34, 0xFFFFFC05, 0xFFAFFC04, /* last */
};

/* ------------------------------------------------------------------------- */

#define CFG_PC4    0x0800

#define CFG_DS1    CFG_PC4

/*
 * Very early board init code (fpga boot, etc.)
 */
int
board_pre_init (void)
{
  volatile immap_t *immr = (immap_t *) CFG_IMMR;

  /*
   * Light up the red led on ELPT860 pcb (DS1) (PCDAT)
   */
  immr->im_ioport.iop_pcdat &= ~CFG_DS1;   /* PCDAT (DS1 = 0)                */
  immr->im_ioport.iop_pcpar &= ~CFG_DS1;   /* PCPAR (0=general purpose I/O)  */
  immr->im_ioport.iop_pcdir |=  CFG_DS1;   /* PCDIR (I/O: 0=input, 1=output) */

  return ( 0 );    /* success */
}

/*
 * Check Board Identity:
 *
 * Test ELPT860 ID string
 *
 * Return 1 if no second DRAM bank, otherwise returns 0
 */

int
checkboard (void)
{
    unsigned char *s = getenv("serial#");

    if ( !s || strncmp(s, "ELPT860", 7) )
      printf ("### No HW ID - assuming ELPT860\n");

    return ( 0 );    /* success */
}

/* ------------------------------------------------------------------------- */

long int
initdram (int board_type)
{
    volatile immap_t     *immap  = (immap_t *)CFG_IMMR;
    volatile memctl8xx_t *memctl = &immap->im_memctl;
    long int              size8, size9;
    long int              size_b0 = 0;

    /*
     * This sequence initializes SDRAM chips on ELPT860 board
     */
    upmconfig(UPMA, (uint *)init_sdram_table,
	      sizeof(init_sdram_table)/sizeof(uint));

    memctl->memc_mptpr = 0x0200;
    memctl->memc_mamr  = 0x18002111;

    memctl->memc_mar   = 0x00000088;
    memctl->memc_mcr   = 0x80002000;	/* CS1: SDRAM bank 0 */

    upmconfig(UPMA, (uint *)sdram_table,
	      sizeof(sdram_table)/sizeof(uint));

    /*
     * Preliminary prescaler for refresh (depends on number of
     * banks): This value is selected for four cycles every 62.4 us
     * with two SDRAM banks or four cycles every 31.2 us with one
     * bank. It will be adjusted after memory sizing.
     */
    memctl->memc_mptpr = CFG_MPTPR_2BK_8K;

    /*
     * The following value is used as an address (i.e. opcode) for
     * the LOAD MODE REGISTER COMMAND during SDRAM initialisation. If
     * the port size is 32bit the SDRAM does NOT "see" the lower two
     * address lines, i.e. mar=0x00000088 -> opcode=0x00000022 for
     * MICRON SDRAMs:
     * ->    0 00 010 0 010
     *       |  |   | |   +- Burst Length = 4
     *       |  |   | +----- Burst Type   = Sequential
     *       |  |   +------- CAS Latency  = 2
     *       |  +----------- Operating Mode = Standard
     *       +-------------- Write Burst Mode = Programmed Burst Length
     */
    memctl->memc_mar   = 0x00000088;

    /*
     * Map controller banks 2 and 3 to the SDRAM banks 2 and 3 at
     * preliminary addresses - these have to be modified after the
     * SDRAM size has been determined.
     */
    memctl->memc_or1   = CFG_OR1_PRELIM;
    memctl->memc_br1   = CFG_BR1_PRELIM;

    memctl->memc_mamr  = CFG_MAMR_8COL & (~(MAMR_PTAE)); /* no refresh yet */

    udelay (200);

    /* perform SDRAM initializsation sequence */

    memctl->memc_mcr   = 0x80002105;	/* CS1: SDRAM bank 0 */
    udelay (1);
    memctl->memc_mcr   = 0x80002230;	/* CS1: SDRAM bank 0 - execute twice */
    udelay (1);

    memctl->memc_mamr |= MAMR_PTAE;	/* enable refresh */

    udelay (1000);

    /*
     * Check Bank 0 Memory Size for re-configuration
     *
     * try 8 column mode
     */
    size8 = dram_size (CFG_MAMR_8COL,
		       (ulong *) SDRAM_BASE1_PRELIM,
		       SDRAM_MAX_SIZE);

    udelay (1000);

    /*
     * try 9 column mode
     */
    size9 = dram_size (CFG_MAMR_9COL,
		       (ulong *) SDRAM_BASE1_PRELIM,
		       SDRAM_MAX_SIZE);

    if ( size8 < size9 )    /* leave configuration at 9 columns	*/
      {
	size_b0 = size9;
	/* debug ("SDRAM Bank 0 in 9 column mode: %ld MB\n", size >> 20); */
      }
    else                  /* back to 8 columns			*/
      {
	size_b0 = size8;
	memctl->memc_mamr = CFG_MAMR_8COL;
	udelay (500);
	/* debug ("SDRAM Bank 0 in 8 column mode: %ld MB\n", size >> 20); */
      }

    udelay (1000);

    /*
     * Adjust refresh rate depending on SDRAM type, both banks
     * For types > 128 MBit leave it at the current (fast) rate
     */
    if ( size_b0 < 0x02000000 )
      {
	/* reduce to 15.6 us (62.4 us / quad) */
	memctl->memc_mptpr = CFG_MPTPR_2BK_4K;
	udelay (1000);
      }

    /*
     * Final mapping: map bigger bank first
     */
    memctl->memc_or1 = ((-size_b0) & 0xFFFF0000) | CFG_OR_TIMING_SDRAM;
    memctl->memc_br1 = (CFG_SDRAM_BASE & BR_BA_MSK) | BR_MS_UPMA | BR_V;

    {
      unsigned long reg;

      /* adjust refresh rate depending on SDRAM type, one bank */
      reg = memctl->memc_mptpr;
      reg >>= 1;	/* reduce to CFG_MPTPR_1BK_8K / _4K */
      memctl->memc_mptpr = reg;
    }

    udelay(10000);

    return (size_b0);
}

/* ------------------------------------------------------------------------- */

/*
 * Check memory range for valid RAM. A simple memory test determines
 * the actually available RAM size between addresses `base' and
 * `base + maxsize'. Some (not all) hardware errors are detected:
 * - short between address lines
 * - short between data lines
 */

static long int
dram_size (long int   mamr_value,
	   long int  *base,
	   long int   maxsize)
{
  volatile immap_t     *immap  = (immap_t *)CFG_IMMR;
  volatile memctl8xx_t *memctl = &immap->im_memctl;
  volatile long int    *addr;
  ulong                 cnt, val;
  ulong                 save[32];    /* to make test non-destructive */
  unsigned char         i = 0;

  memctl->memc_mamr = mamr_value;

  for (cnt = maxsize/sizeof(long); cnt > 0; cnt >>= 1)
    {
      addr = base + cnt;    /* pointer arith! */

      save[i++] = *addr;
      *addr     = ~cnt;
    }

  /* write 0 to base address */
  addr    = base;
  save[i] = *addr;
  *addr   = 0;

  /* check at base address */
  if ( (val = *addr) != 0 )
    {
      *addr = save[i];

      return (0);
    }

  for (cnt = 1; cnt <= maxsize/sizeof(long); cnt <<= 1)
    {
      addr = base + cnt;    /* pointer arith! */

      val   = *addr;
      *addr = save[--i];

      if ( val != (~cnt) )
	{
	  return (cnt * sizeof(long));
	}
    }

  return (maxsize);
}

/* ------------------------------------------------------------------------- */

#define CFG_PA1     0x4000
#define CFG_PA2     0x2000

#define CFG_LBKs    (CFG_PA2 | CFG_PA1)

void
reset_phy (void)
{
  volatile immap_t *immr = (immap_t *) CFG_IMMR;

  /*
   * Ensure LBK LXT901 ethernet 1 & 2 = 0 ... for normal loopback in effect
   *                                          and no AUI loopback
   */
  immr->im_ioport.iop_padat &= ~CFG_LBKs;  /* PADAT (LBK eth 1&2 = 0)        */
  immr->im_ioport.iop_papar &= ~CFG_LBKs;  /* PAPAR (0=general purpose I/O)  */
  immr->im_ioport.iop_padir |=  CFG_LBKs;  /* PADIR (I/O: 0=input, 1=output) */
}
