/*
 * Board specific setup info
 *
 * (C) Copyright 2004, ARM Ltd.
 * Philippe Robin, <philippe.robin@arm.com>
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * 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
 */

#include <config.h>
#include <version.h>

	/* Reset using CM control register */
.global reset_cpu
reset_cpu:
	mov	r0, #CM_BASE
	ldr	r1,[r0,#OS_CTRL]
	orr	r1,r1,#CMMASK_RESET
	str	r1,[r0]

reset_failed:
	b	reset_failed
 
/* set up the platform, once the cpu has been initialized */
.globl platformsetup
platformsetup:
	/* If U-Boot has been run after the ARM boot monitor
	 * then all the necessary actions have been done
	 * otherwise we are running from user flash mapped to 0x00000000
	 * --- DO NOT REMAP BEFORE THE CODE HAS BEEN RELOCATED --
	 * Changes to the (possibly soft) reset defaults of the processor
	 * itself should be performed in cpu/arm<>/start.S
	 * This function affects only the core module or board settings
	 */
 
#ifdef CONFIG_CM_INIT
	/* CM has an initialization register
	 * - bits in it are wired into test-chip pins to force
	 *   reset defaults
	 * - may need to change its contents for U-Boot
	 */
 
	/* set the desired CM specific value */
	mov	r2,#CMMASK_LOWVEC	/* Vectors at 0x00000000 for all */
 
#if defined (CONFIG_CM10200E) || defined (CONFIG_CM10220E)
	orr	r2,r2,#CMMASK_INIT_102
#else
 
#if !defined (CONFIG_CM920T) && !defined (CONFIG_CM920T_ETM) && \
     !defined (CONFIG_CM940T)
 
#ifdef	CONFIG_CM_MULTIPLE_SSRAM
	/* set simple mapping		  */
	and	r2,r2,#CMMASK_MAP_SIMPLE
#endif /* #ifdef CONFIG_CM_MULTIPLE_SSRAM */
 
#ifdef	CONFIG_CM_TCRAM
	/* disable TCRAM		  */
	and	r2,r2,#CMMASK_TCRAM_DISABLE
#endif /* #ifdef CONFIG_CM_TCRAM	  */
 
#if defined (CONFIG_CM926EJ_S) || defined (CONFIG_CM1026EJ_S) || \
	    defined (CONFIG_CM1136JF_S)

	and	r2,r2,#CMMASK_LE
 
#endif /* cpu with little endian initialization */
 
	orr	r2,r2,#CMMASK_CMxx6_COMMON
 
#endif /* CMxx6 code */
 
#endif /* ARM102xxE value */

	/* read CM_INIT	   */
	mov	r0, #CM_BASE
	ldr	r1, [r0, #OS_INIT]
	/* check against desired bit setting */
	and	r3,r1,r2
	cmp	r3,r2
	beq	init_reg_OK
 
	/* lock for change */
	mov	r3, #CMVAL_LOCK
	and	r3,r3,#CMMASK_LOCK
	str	r3, [r0, #OS_LOCK]
	/* set desired value */
	orr	r1,r1,r2
	/* write & relock CM_INIT */
	str	r1, [r0, #OS_INIT]
	mov	r1, #CMVAL_UNLOCK
	str	r1, [r0, #OS_LOCK]
 
	/* soft reset so new values used */
	b	reset_cpu
 
init_reg_OK:
 
#endif /* CONFIG_CM_INIT */
 
	mov	pc, lr
 
#ifdef	CONFIG_CM_SPD_DETECT
	/* Fast memory is available for the DRAM data
	 * - ensure it has been transferred, then summarize the data
	 *   into a CM register
	 */
.globl dram_query
dram_query:
	stmfd	r13!,{r4-r6,lr}
	/* set up SDRAM info				  */
	/* - based on example code from the CM User Guide */
	mov	r0, #CM_BASE
 
readspdbit:
	ldr	r1, [r0, #OS_SDRAM]	/* read the SDRAM register */
	and	r1, r1, #0x20		/* mask SPD bit (5)	   */
	cmp	r1, #0x20		/* test if set		   */
	bne	readspdbit
 
setupsdram:
	add	r0, r0, #OS_SPD		/* address the copy of the SDP data */
	ldrb	r1, [r0, #3]		/* number of row address lines	    */
	ldrb	r2, [r0, #4]		/* number of column address lines   */
	ldrb	r3, [r0, #5]		/* number of banks		    */
	ldrb	r4, [r0, #31]		/* module bank density		    */
	mul	r5, r4, r3		/* size of SDRAM (MB divided by 4)  */
	mov	r5, r5, ASL#2		/* size in MB			    */
	mov	r0, #CM_BASE		/* reload for later code	    */
	cmp	r5, #0x10		/* is it 16MB?			    */
	bne	not16
	mov	r6, #0x2		/* store size and CAS latency of 2  */
	b	writesize
 
not16:
	cmp	r5, #0x20		/* is it  32MB? */
	bne	not32
	mov	r6, #0x6
	b	writesize
 
not32:
	cmp	r5, #0x40		/* is it  64MB? */
	bne	not64
	mov	r6, #0xa
	b	writesize
 
not64:
	cmp	r5, #0x80		/* is it 128MB? */
	bne	not128
	mov	r6, #0xe
	b	writesize
 
not128:
	/* if it is none of these sizes then it is either 256MB, or
	 * there is no SDRAM fitted so default to 256MB
	 */
	mov	r6, #0x12
 
writesize:
	mov	r1, r1, ASL#8		/* row addr lines from SDRAM reg */
	orr	r2, r1, r2, ASL#12	/* OR in column address lines	 */
	orr	r3, r2, r3, ASL#16	/* OR in number of banks	 */
	orr	r6, r6, r3		/* OR in size and CAS latency	 */
	str	r6, [r0, #OS_SDRAM]	/* store SDRAM parameters	 */
 
#endif /* #ifdef CONFIG_CM_SPD_DETECT */
 
	ldmfd	r13!,{r4-r6,pc}			/* back to caller */

#ifdef	CONFIG_CM_REMAP
	/* CM remap bit is operational
	 * - use it to map writeable memory at 0x00000000, in place of flash
	 */
.globl cm_remap
cm_remap:
	stmfd	r13!,{r4-r10,lr}
 
	mov	r0, #CM_BASE
	ldr	r1, [r0, #OS_CTRL]
	orr	r1, r1, #CMMASK_REMAP	/* set remap and led bits */
	str	r1, [r0, #OS_CTRL]
 
	/* Now 0x00000000 is writeable, replace the vectors  */
	ldr	r0, =_start	/* r0 <- start of vectors	    */
	ldr	r2, =_armboot_start	/* r2 <- past vectors		    */
	sub	r1,r1,r1		/* destination 0x00000000	    */
 
copy_vec:
	ldmia	r0!, {r3-r10}		/* copy from source address [r0]    */
	stmia	r1!, {r3-r10}		/* copy to   target address [r1]    */
	cmp	r0, r2			/* until source end address [r2]    */
	ble	copy_vec
 
	ldmfd	r13!,{r4-r10,pc}	/* back to caller		    */
 
#endif /* #ifdef CONFIG_CM_REMAP */
