/*
 * genietv/genietv.c
 *
 * The GENIETV is using the following physical memorymap (copied from
 * the FADS configuration):
 *
 * ff020000 -> ff02ffff : pcmcia
 * ff010000 -> ff01ffff : BCSR       connected to CS1, setup by 8xxROM
 * ff000000 -> ff00ffff : IMAP       internal in the cpu
 * 02800000 -> 0287ffff : flash      connected to CS0
 * 00000000 -> nnnnnnnn : sdram      setup by U-Boot
 *
 * CS pins are connected as follows:
 *
 * CS0 -512Kb boot flash
 * CS1 - SDRAM #1
 * CS2 - SDRAM #2
 * CS3 - Flash #1
 * CS4 - Flash #2
 * CS5 - LON (if present)
 * CS6 - PCMCIA #1
 * CS7 - PCMCIA #2
 *
 * Ports are configured as follows:
 *
 * PA7 - SDRAM banks enable
 */

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

#define CFG_PA7		0x0100

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

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

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

#define	_NOT_USED_	0xFFFFFFFF

const uint sdram_table[] =
{
	/*
	 * Single Read. (Offset 0 in UPMB RAM)
	 */
	0x1F0DFC04, 0xEEAFBC04, 0x11AF7C04, 0xEFBEEC00,
	0x1FFDDC47, /* last */
	/*
	 * SDRAM Initialization (offset 5 in UPMB 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.
	 *
	 */
		    0x1FFDDC34, 0xEFEEAC34, 0x1FBD5C35, /* last */
	/*
	 * Burst Read. (Offset 8 in UPMB RAM)
	 */
	0x1F0DFC04, 0xEEAFBC04, 0x10AF7C04, 0xF0AFFC00,
	0xF0AFFC00, 0xF1AFFC00, 0xEFBEEC00, 0x1FFDDC47, /* last */
	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
	/*
	 * Single Write. (Offset 18 in UPMB RAM)
	 */
	0x1F2DFC04, 0xEEAFAC00, 0x01BE4C04, 0x1FFDDC47, /* last */
	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
	/*
	 * Burst Write. (Offset 20 in UPMB RAM)
	 */
	0x1F0DFC04, 0xEEAFAC00, 0x10AF5C00, 0xF0AFFC00,
	0xF0AFFC00, 0xE1BEEC04, 0x1FFDDC47, /* last */
					    _NOT_USED_,
	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
	/*
	 * Refresh  (Offset 30 in UPMB RAM)
	 */
	0x1FFD7C84, 0xFFFFFC04, 0xFFFFFC04, 0xFFFFFC04,
	0xFFFFFC84, 0xFFFFFC07, /* last */
				_NOT_USED_, _NOT_USED_,
	_NOT_USED_, _NOT_USED_, _NOT_USED_, _NOT_USED_,
	/*
	 * Exception. (Offset 3c in UPMB RAM)
	 */
	0x7FFFFC07, /* last */
		    _NOT_USED_, _NOT_USED_, _NOT_USED_,
};

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


/*
 * Check Board Identity
 */

int checkboard (void)
{
    puts ("Board: GenieTV\n");
    return 0;
}

#if 0
static void PrintState(void)
{
    volatile immap_t     *im  = (immap_t *)CFG_IMMR;
    volatile memctl8xx_t *memctl = &im->im_memctl;

    printf("\n0 - FLASH: B=%08x O=%08x", memctl->memc_br0, memctl->memc_or0);
    printf("\n1 - SDRAM: B=%08x O=%08x", memctl->memc_br1, memctl->memc_or1);
    printf("\n2 - SDRAM: B=%08x O=%08x", memctl->memc_br2, memctl->memc_or2);
}
#endif

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

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

    /* Enable SDRAM */

    /* Configuring PA7 for general purpouse output pin */
    im->im_ioport.iop_papar &= ~CFG_PA7 ;	/* 0 = general purpouse */
    im->im_ioport.iop_padir |= CFG_PA7 ;	/* 1 = output */

    /* Enable SDRAM - PA7 = 1 */
    im->im_ioport.iop_padat |= CFG_PA7 ;	/* value of PA7 */

    /*
     * 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_4K ;

    memctl->memc_mbmr = CFG_MBMR_8COL;

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

    /*
     * Map controller banks 1 and 2 to the SDRAM banks 1 and 2 at
     * preliminary addresses - these have to be modified after the
     * SDRAM size has been determined.
     */

    memctl->memc_or1 = 0xF0000000 | CFG_OR_TIMING_SDRAM;
    memctl->memc_br1 = ((SDRAM_BASE1_PRELIM & BR_BA_MSK) | BR_MS_UPMB | BR_V);

    memctl->memc_or2 = 0xF0000000 | CFG_OR_TIMING_SDRAM;
    memctl->memc_br2 = ((SDRAM_BASE2_PRELIM & BR_BA_MSK) | BR_MS_UPMB | BR_V);

    /* perform SDRAM initialization sequence */
    memctl->memc_mar  = 0x00000088;

    memctl->memc_mcr  = 0x80802105;	/* SDRAM bank 0 */

    memctl->memc_mcr  = 0x80804105;	/* SDRAM bank 1 */

    /* Execute refresh 8 times */
    memctl->memc_mbmr = (CFG_MBMR_8COL & ~MAMR_TLFB_MSK) | MAMR_TLFB_8X ;

    memctl->memc_mcr  = 0x80802130;	/* SDRAM bank 0 - execute twice */

    memctl->memc_mcr  = 0x80804130;	/* SDRAM bank 1 - execute twice */

    /* Execute refresh 4 times */
    memctl->memc_mbmr = CFG_MBMR_8COL;

    /*
     * Check Bank 0 Memory Size for re-configuration
     *
     * try 8 column mode
     */

#if 0
    PrintState();
#endif
/*    printf ("\nChecking bank1..."); */
    size8 = dram_size (CFG_MBMR_8COL, (ulong *)SDRAM_BASE1_PRELIM, SDRAM_MAX_SIZE);

    size_b0 = size8 ;

/*    printf ("\nChecking bank2..."); */
    size_b1 = dram_size (memctl->memc_mbmr, (ulong *)SDRAM_BASE2_PRELIM,SDRAM_MAX_SIZE);

    /*
     * 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_UPMB | BR_V;

    if (size_b1 > 0)
    {
        /*
         * Position Bank 1 immediately above Bank 0
         */
        memctl->memc_or2 = ((-size_b1) & 0xFFFF0000) | CFG_OR_TIMING_SDRAM;
        memctl->memc_br2 = ((CFG_SDRAM_BASE & BR_BA_MSK) | BR_MS_UPMB | BR_V) +
	                   (size_b0 & BR_BA_MSK);
    }
	else
    {
        /*
         * No bank 1
         *
         * invalidate bank
         */
        memctl->memc_br2 = 0;
	/* adjust refresh rate depending on SDRAM type, one bank */
	memctl->memc_mptpr = CFG_MPTPR_1BK_4K;
    }

    /* If no memory detected, disable SDRAM */
    if ((size_b0 + size_b1) == 0)
    {
	printf("disabling SDRAM!\n");
	/* Disable SDRAM - PA7 = 1 */
	im->im_ioport.iop_padat &= ~CFG_PA7 ;	/* value of PA7 */
    }
/*	else */
/*    printf("done! (%08lx)\n", size_b0 + size_b1); */

#if 0
    PrintState();
#endif
    return (size_b0 + size_b1);
}

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

/*
 * 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 mbmr_value, long int *base, long int maxsize)
{
    volatile long int	 *addr;
    long int		  cnt, val;

    /*memctl->memc_mbmr = mbmr_value; */

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

	*addr = ~cnt;
    }

    /* write 0 to base address */
    addr = base;
    *addr = 0;

    /* check at base address */
    if ((val = *addr) != 0) {
	printf("(0)");
	return (0);
    }

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

	val = *addr;
	if (val != (~cnt)) {
/*	    printf("(%08lx)", cnt*sizeof(long)); */
	    return (cnt * sizeof(long));
	}
    }
    /* NOTREACHED */
	return (0);
}

#if (CONFIG_COMMANDS & CFG_CMD_PCMCIA)

#ifdef	CFG_PCMCIA_MEM_ADDR
volatile unsigned char *pcmcia_mem = (unsigned char*)CFG_PCMCIA_MEM_ADDR;
#endif

int pcmcia_init(void)
{
	volatile pcmconf8xx_t	*pcmp;
	uint v, slota, slotb;

	/*
	** Enable the PCMCIA for a Flash card.
	*/
	pcmp = (pcmconf8xx_t *)(&(((immap_t *)CFG_IMMR)->im_pcmcia));

#if 0
	pcmp->pcmc_pbr0 = CFG_PCMCIA_MEM_ADDR;
	pcmp->pcmc_por0 = 0xc00ff05d;
#endif

	/* Set all slots to zero by default. */
	pcmp->pcmc_pgcra = 0;
	pcmp->pcmc_pgcrb = 0;
#ifdef PCMCIA_SLOT_A
	pcmp->pcmc_pgcra = 0x40;
#endif
#ifdef PCMCIA_SLOT_B
	pcmp->pcmc_pgcrb = 0x40;
#endif

	/* Check if any PCMCIA card is luged in. */
	slota = (pcmp->pcmc_pipr & 0x18000000) == 0 ;
	slotb = (pcmp->pcmc_pipr & 0x00001800) == 0 ;

	if (!(slota || slotb))
	{
		printf("No card present\n");
#ifdef PCMCIA_SLOT_A
		pcmp->pcmc_pgcra = 0;
#endif
#ifdef PCMCIA_SLOT_B
		pcmp->pcmc_pgcrb = 0;
#endif
		return -1;
	}
	    else
	printf("Unknown card (");

	v = 0;

	switch( (pcmp->pcmc_pipr >> 14) & 3 )
	{
		case 0x00 :
			printf("5V");
			v = 5;
			break;
		case 0x01 :
			printf("5V and 3V");
			v = 3;
			break;
		case 0x03 :
			printf("5V, 3V and x.xV");
			v = 3;
			break;
	}

	switch(v){
	case 3:
	    printf("; using 3V");
	    /* Enable 3 volt Vcc. */

	    break;

	default:
		printf("; unknown voltage");
		return -1;
	}
	printf(")\n");
	/* disable pcmcia reset after a while */

	udelay(20);

	pcmp->pcmc_pgcrb = 0;

	/* If you using a real hd you should give a short
	* spin-up time. */
#ifdef CONFIG_DISK_SPINUP_TIME
	udelay(CONFIG_DISK_SPINUP_TIME);
#endif

	return 0;
}
#endif	/* CFG_CMD_PCMCIA */
