/*
 *
 */

#include <config.h>
#include <mach/s3c24x0-iomap.h>

	.section ".text_bare_init.board_init_lowlevel","ax"

/*
 * To be able to setup the SDRAM interface correctly, we need some
 * external information about the connected SDRAM devices.
 *
 * When we set GPH8, we can read at GPB:
 * Bit 0..1: Memory device size -> 00=16M, 01=64M, 10=32M, 11=128M
 * Bit 2: CL setting
 *
 * Some remarks: The CL setting seems useless. It always signals a CL3
 * requirement, but the SDRAM types I found on the cards are supporting
 * CL2 @ 100 MHz. But also these SDRAM types are only support 105 MHz max.
 * So, we never need CL3 because we can't run the CPU at 533 MHz (which
 * implies an 133 MHz SDRAM clock).
 * All devices are connected via 32 bit databus
 *
 * Note: I was able to check the 32 MiB and 64 MiB configuration only. I didn't
 * had access to a 16 MiB nor 128 MiB config.
 *
 */

sdram_init:
	/*
	 * Read the configuration. After reset until any GPIO port is
	 * configured yet, these pins show external settings, to detect
	 * the SDRAM size.
	 */
	ldr r1, =GPBDAT
	ldr r4, [r1]
	and r4, r4, #0x3

	ldr r1, =S3C24X0_MEMCTL_BASE
	/* configure both SDRAM areas with 32 bit data bus width */
	ldr r0, =((0x2 << 24) + (0x2 << 28))
	str r0, [r1], #0x1c	/* post add register offset for bank6 */

	/*
	 * With the configuration we simply need to calculate an offset into
	 * our table with the predefined SDRAM settings
	 */
	adr r0, SDRAMDATA
	mov r2, #6*4		/* # of bytes per table entry */
	mul r3, r4, r2
	add r0, r0, r3		/* start address of the entry */

	/*
	 * store the table entry data into the registers
	 */
1:
	ldr     r3, [r0], #4
	str     r3, [r1], #4
	subs    r2, r2, #4
	bne     1b

/* TODO: Check if the second bank is populated, and switch it off if not */

	mov pc, lr

/*
 * we need 4 sets of memory settings per main CPU clock speed
 *
 * 400MHz main speed:
 * - 16 MiB in the first bank, maybe 16 MiB in the second bank (untested!)
 * - 32 MiB in the first bank, maybe 32 MiB in the second bank (CL=2)
 * - 64 MiB in the first bank, maybe 64 MiB in the second bank (CL=2)
 * - 128 MiB in the first bank, maybe 128 MiB in the second bank (untested!)
 *
 * Note: SDRAM clock runs at 100MHz
 */

SDRAMDATA:
/* --------------------------- 16 MiB @ 100MHz --------------------------- */
	/*
	 *  - MT = 11 (= sync dram type)
	 *  - Trcd = 01 (= CL3)
	 *  - SCAN = 00 (= 8 bit collumns)
	 */
	.word ((0x3 << 15) + (0x1 << 2) + (0x0))
	.word ((0x3 << 15) + (0x1 << 2) + (0x0))
	/*
	 * SDRAM refresh settings
	 *  - REFEN = 1 (= refresh enabled)
	 *  - TREFMD = 0 (= auto refresh)
	 *  - Trp = 00 (= 2 RAS precharge clocks)
	 *  - Tsrc = 11 (= 7 clocks -> row cycle time @100MHz 2+5=7 -> 70ns)
	 *  - Refrsh = 2^11 + 1 - 100 * 15.6 = 2049 - 1560 = FIXME
	 */
	.word ((0x1 << 23) + (0x0 << 22) + (0x0 << 20) + (0x3 << 18) + 468)
	/*
	 * SDRAM banksize
	 *  - BURST_EN = 0 (= burst mode disabled)
	 *  - SCKE_EN = 1 (= SDRAM SCKE enabled)
	 *  - SCLK_EN = 1 (= clock active only during accesses)
	 *  - BK67MAP = 010 (= 128MiB) FIXME?????
	 */
	.word ((0 << 7) + (1 << 5) + (1 << 4) + 2)
	/*
	 * SDRAM mode register
	 * CL = 010 (= 2 clocks)
	 */
	.word (0x2 << 4)
	.word (0x2 << 4)

/* ------------- one or two banks with 64 MiB @ 100MHz -------------------- */

	/*
	 *  - MT = 11 (= sync dram type)
	 *  - Trcd = 00 (= CL2)
	 *  - SCAN = 01 (= 9 bit collumns)
	 */
	.word ((0x3 << 15) + (0x0 << 2) + (0x1))
	.word ((0x3 << 15) + (0x0 << 2) + (0x1))
	/*
	 * SDRAM refresh settings
	 *  - REFEN = 1 (= refresh enabled)
	 *  - TREFMD = 0 (= auto refresh)
	 *  - Trp = 00 (= 2 RAS precharge clocks)
	 *  - Tsrc = 01 (= 5 clocks -> row cycle time @100MHz 2+5=7 -> 70ns)
	 *  - Refrsh = 2^11 + 1 - 100 * 15.6 = 2049 - 1560 = 489
	 */
	.word ((0x1 << 23) + (0x0 << 22) + (0x0 << 20) + (0x1 << 18) + 489)
	/*
	 * SDRAM banksize
	 *  - BURST_EN = 1 (= burst mode enabled)
	 *  - SCKE_EN = 1 (= SDRAM SCKE enabled)
	 *  - SCLK_EN = 1 (= clock active only during accesses)
	 *  - BK67MAP = 001 (= 64 MiB)
	 */
	.word ((1 << 7) + (1 << 5) + (1 << 4) + 1)
	/*
	 * SDRAM mode register
	 * CL = 010 (= 2 clocks)
	 */
	.word (0x2 << 4)
	.word (0x2 << 4)

/* ------------- one or two banks with 32 MiB @ 100MHz -------------------- */

	/*
	 *  - MT = 11 (= sync dram type)
	 *  - Trcd = 00 (= CL2)
	 *  - SCAN = 01 (= 9 bit collumns)
	 */
	.word ((0x3 << 15) + (0x0 << 2) + (0x1))
	.word ((0x3 << 15) + (0x0 << 2) + (0x1))
	/*
	 * SDRAM refresh settings
	 *  - REFEN = 1 (= refresh enabled)
	 *  - TREFMD = 0 (= auto refresh)
	 *  - Trp = 00 (= 2 RAS precharge clocks)
	 *  - Tsrc = 01 (= 5 clocks -> row cycle time @100MHz 2+5=7 -> 70ns)
	 *  - Refrsh = 2^11 + 1 - 100 * 15.6 = 2049 - 1560 = 489
	 */
	.word ((0x1 << 23) + (0x0 << 22) + (0x0 << 20) + (0x1 << 18) + 489)
	/*
	 * SDRAM banksize
	 *  - BURST_EN = 1 (= burst mode enabled)
	 *  - SCKE_EN = 1 (= SDRAM SCKE enabled)
	 *  - SCLK_EN = 1 (= clock active only during accesses)
	 *  - BK67MAP = 000 (= 32 MiB)
	 */
	.word ((1 << 7) + (1 << 5) + (1 << 4) + 0)
	/*
	 * SDRAM mode register
	 * CL = 010 (= 2 clocks)
	 */
	.word (0x2 << 4)
	.word (0x2 << 4)

/* ------------ one or two banks with 128 MiB @ 100MHz -------------------- */

	/*
	 *  - MT = 11 (= sync dram type)
	 *  - Trcd = 00 (= CL2)
	 *  - SCAN = 01 (= 9 bit collumns)
	 */
	.word ((0x3 << 15) + (0x0 << 2) + (0x1))
	.word ((0x3 << 15) + (0x0 << 2) + (0x1))
	/*
	 * SDRAM refresh settings
	 *  - REFEN = 1 (= refresh enabled)
	 *  - TREFMD = 0 (= auto refresh)
	 *  - Trp = 00 (= 2 RAS precharge clocks)
	 *  - Tsrc = 01 (= 5 clocks -> row cycle time @100MHz 2+5=7 -> 70ns)
	 *  - Refrsh = 2^11 + 1 - 100 * 7.5 = 2049 - FIXME = 1259
	 */
	.word ((0x1 << 23) + (0x0 << 22) + (0x1 << 20) + (0x3 << 18) + 1259)
	/*
	 * SDRAM banksize
	 *  - BURST_EN = 0 (= burst mode disabled)
	 *  - SCKE_EN = 1 (= SDRAM SCKE enabled)
	 *  - SCLK_EN = 1 (= clock active only during accesses)
	 *  - BK67MAP = 010 (= 128MiB)
	 */
	.word (0x32)
	/*
	 * SDRAM mode register
	 * CL = 010 (= 2 clocks)
	 */
	.word (0x2 << 4)
	.word (0x2 << 4)

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

.globl board_init_lowlevel
board_init_lowlevel:

	mov r10, lr		/* save the link register */

	bl s3c24x0_disable_wd

	/* skip everything here if we are already running from SDRAM */
	cmp pc, #S3C24X0_SDRAM_BASE
	blo 1f
	cmp pc, #S3C24X0_SDRAM_END
	bhs 1f

	mov pc, r10

/* we are running from NOR or NAND/SRAM memory. Do further initialisation */
1:
	bl s3c24x0_pll_init

	bl sdram_init

#ifdef CONFIG_S3C24XX_NAND_BOOT
	mov lr, r10		/* restore the link register */
/* up to here we are running from the internal SRAM area */
	b s3c24x0_nand_boot	/* does return directly to our caller into SDRAM */
#else
	mov pc, r10
#endif
