#include <common.h>
#include <sizes.h>
#include <asm/io.h>
#include <asm/types.h>
#include <mach/ddr.h>
#include <mach/gpio.h>
#include "optimus.h"

/* This array is called optimus_ddrc_cfg for historic reasons. */
/* It applies to both Optimus and SpaceCast. */
static struct ddr_reg_val optimus_ddrc_cfg[] = {
	{DDRC_CTL_00_REG, 0x20410600LL},
	{DDRC_CTL_02_REG, 0x00000006LL},
	{DDRC_CTL_03_REG, 0x0001A07CLL},
	{DDRC_CTL_04_REG, 0x00041127LL},
	{DDRC_CTL_05_REG, 0x04061200LL},
	{DDRC_CTL_06_REG, 0x141B0404LL},
	{DDRC_CTL_07_REG, 0x08040804LL},
	{DDRC_CTL_08_REG, 0x0092190CLL},
	{DDRC_CTL_09_REG, 0x00000504LL},
	{DDRC_CTL_10_REG, 0x08080101LL},
	{DDRC_CTL_11_REG, 0x00020010LL},
	{DDRC_CTL_12_REG, 0x00011803LL},
	{DDRC_CTL_13_REG, 0x00000009LL},
	{DDRC_CTL_14_REG, 0x00BB0100LL},
	{DDRC_CTL_15_REG, 0x00001034LL},
	{DDRC_CTL_16_REG, 0x000D0004LL},
	{DDRC_CTL_17_REG, 0x00060002LL},
	{DDRC_CTL_18_REG, 0x00C00200LL},
	{DDRC_CTL_19_REG, 0x00000000LL},
	{DDRC_CTL_20_REG, 0x00060600LL},
	{DDRC_CTL_21_REG, 0x00000000LL},
	{DDRC_CTL_22_REG, 0x00000000LL},
	{DDRC_CTL_23_REG, 0x00000000LL},
	{DDRC_CTL_24_REG, 0x00000000LL},
	{DDRC_CTL_25_REG, 0x00000000LL},
	{DDRC_CTL_26_REG, 0x00000000LL},
	{DDRC_CTL_27_REG, 0x00085000LL},
	{DDRC_CTL_28_REG, 0x00080006LL},
	{DDRC_CTL_29_REG, 0x00000000LL},
	{DDRC_CTL_30_REG, 0x00060850LL},
	{DDRC_CTL_31_REG, 0x00000008LL},
	{DDRC_CTL_32_REG, 0x00020000LL},
	{DDRC_CTL_33_REG, 0x00000000LL},
	{DDRC_CTL_43_REG, 0x01400200LL},
	{DDRC_CTL_44_REG, 0x02000040LL},
	{DDRC_CTL_45_REG, 0x01010080LL},
	{DDRC_CTL_46_REG, 0xFF0A0101LL},
	{DDRC_CTL_47_REG, 0x010101FFLL},
	{DDRC_CTL_48_REG, 0x00010001LL},
	{DDRC_CTL_49_REG, 0x000C0100LL},
	{DDRC_CTL_50_REG, 0x00010002LL},
	{DDRC_CTL_52_REG, 0x00000000LL},
	{DDRC_CTL_53_REG, 0x007FFFFFLL},
	{DDRC_CTL_59_REG, 0x01000000LL},
	{DDRC_CTL_60_REG, 0x00020100LL},
	{DDRC_CTL_61_REG, 0x02010202LL},
	{DDRC_CTL_62_REG, 0x02000100LL},
	{DDRC_CTL_63_REG, 0x00000000LL},
	{DDRC_CTL_91_REG, 0xFFFF0000LL},
	{DDRC_CTL_92_REG, 0x00000202LL},
	{DDRC_CTL_93_REG, 0x0101FFFFLL},
	{DDRC_CTL_94_REG, 0x03FFFF00LL},
	{DDRC_CTL_95_REG, 0xFFFF0003LL},
	{DDRC_CTL_96_REG, 0x00000303LL},
	{DDRC_CTL_97_REG, 0x01000400LL},
	{DDRC_CTL_98_REG, 0x00016400LL},
	{DDRC_CTL_99_REG, 0x00000100LL},
	{DDRC_CTL_100_REG, 0x00000001LL},
	{DDRC_CTL_102_REG, 0x00000800LL},
	{DDRC_CTL_103_REG, 0x00103300LL},
	{DDRC_CTL_104_REG, 0x02000200LL},
	{DDRC_CTL_105_REG, 0x02000200LL},
	{DDRC_CTL_106_REG, 0x00001033LL},
	{DDRC_CTL_107_REG, 0x000050FFLL},
	{DDRC_CTL_108_REG, 0x00020610LL},
	{DDRC_CTL_109_REG, 0x00000003LL},
	{DDRC_CTL_126_REG, 0x00000000LL},
	{0, 0}
};

/* This array is called optimus_ddr_phy_cfg for historic reasons. */
/* It applies to both Optimus and SpaceCast. */
static struct ddr_reg_val optimus_ddr_phy_cfg[] = {
	{DDR_PHY_CTL_00_REG, 0x000F1023LL},
	{DDR_PHY_CTL_01_REG, 0x18201010LL},
	{DDR_PHY_CTL_02_REG, 0x00000006LL},
	{DDR_PHY_CTL_03_REG, 0x09090909LL},
	{DDR_PHY_CTL_04_REG, 0x00000009LL},
	{DDR_PHY_CTL_05_REG, 0x00000000LL},
	{DDR_PHY_CTL_06_REG, 0x04300623LL},
	{DDR_PHY_CTL_07_REG, 0x00000000LL},
	{0, 0}
};

struct ddr_reg_val sideswipe_ddrc_cfg[] = {
	/* DDR3 Controller @533MHz */
	{DDRC_CTL_00_REG, 0x20410600LL},
	{DDRC_CTL_02_REG, 0x00000006LL},
	{DDRC_CTL_03_REG, 0x0001A07CLL},
	{DDRC_CTL_04_REG, 0x00041127LL},
	{DDRC_CTL_05_REG, 0x04060E00LL},
	{DDRC_CTL_06_REG, 0x141B0604LL},
	{DDRC_CTL_07_REG, 0x08040704LL},
	{DDRC_CTL_08_REG, 0x0092190CLL},
	{DDRC_CTL_09_REG, 0x00000504LL},
	{DDRC_CTL_10_REG, 0x08070101LL},
	{DDRC_CTL_11_REG, 0x0002000FLL},
	{DDRC_CTL_12_REG, 0x00011B03LL},
	{DDRC_CTL_13_REG, 0x00000008LL},
	{DDRC_CTL_14_REG, 0x00560100LL},
	{DDRC_CTL_15_REG, 0x00001034LL},
	{DDRC_CTL_16_REG, 0x000D0004LL},
	{DDRC_CTL_17_REG, 0x00060002LL},
	{DDRC_CTL_18_REG, 0x005B0200LL},
	{DDRC_CTL_19_REG, 0x00000000LL},
	{DDRC_CTL_20_REG, 0x00060600LL},
	{DDRC_CTL_21_REG, 0x00000000LL},
	{DDRC_CTL_22_REG, 0x00000000LL},
	{DDRC_CTL_23_REG, 0x00000000LL},
	{DDRC_CTL_24_REG, 0x00000000LL},
	{DDRC_CTL_25_REG, 0x00000000LL},
	{DDRC_CTL_26_REG, 0x00000000LL},
	{DDRC_CTL_27_REG, 0x00083000LL},
	{DDRC_CTL_28_REG, 0x00080006LL},
	{DDRC_CTL_29_REG, 0x00000000LL},
	{DDRC_CTL_30_REG, 0x00060830LL},
	{DDRC_CTL_31_REG, 0x00000008LL},
	{DDRC_CTL_32_REG, 0x00020000LL},
	{DDRC_CTL_33_REG, 0x00000000LL},
	{DDRC_CTL_43_REG, 0x01400200LL},
	{DDRC_CTL_44_REG, 0x02000040LL},
	{DDRC_CTL_45_REG, 0x01010080LL},
	{DDRC_CTL_46_REG, 0xFF0A0102LL},
	{DDRC_CTL_47_REG, 0x010101FFLL},
	{DDRC_CTL_48_REG, 0x00010001LL},
	{DDRC_CTL_49_REG, 0x000C0100LL},
	{DDRC_CTL_50_REG, 0x00010002LL},
	{DDRC_CTL_52_REG, 0x00000000LL},
	{DDRC_CTL_53_REG, 0x007FFFFFLL},
	{DDRC_CTL_59_REG, 0x01000000LL},
	{DDRC_CTL_60_REG, 0x00020100LL},
	{DDRC_CTL_61_REG, 0x02010202LL},
	{DDRC_CTL_62_REG, 0x02000101LL},
	{DDRC_CTL_63_REG, 0x00000000LL},
	{DDRC_CTL_91_REG, 0xFFFF0000LL},
	{DDRC_CTL_92_REG, 0x00000202LL},
	{DDRC_CTL_93_REG, 0x0101FFFFLL},
	{DDRC_CTL_94_REG, 0x03FFFF00LL},
	{DDRC_CTL_95_REG, 0xFFFF0003LL},
	{DDRC_CTL_96_REG, 0x00000303LL},
	{DDRC_CTL_97_REG, 0x01000400LL},
	{DDRC_CTL_98_REG, 0x00016400LL},
	{DDRC_CTL_99_REG, 0x00000100LL},
	{DDRC_CTL_100_REG, 0x00000001LL},
	{DDRC_CTL_102_REG, 0x00000800LL},
	{DDRC_CTL_103_REG, 0x00103300LL},
	{DDRC_CTL_104_REG, 0x02000200LL},
	{DDRC_CTL_105_REG, 0x02000200LL},
	{DDRC_CTL_106_REG, 0x00001033LL},
	{DDRC_CTL_107_REG, 0x000050FFLL},
	{DDRC_CTL_108_REG, 0x0002060CLL},
	{DDRC_CTL_109_REG, 0x00000003LL},
	{DDRC_CTL_126_REG, 0x00000000LL},
	{0, 0}
};

struct ddr_reg_val sideswipe_ddr_phy_cfg[] = {
	/* DDR3 PHY @533 */
	{DDR_PHY_CTL_00_REG, 0x000F1023LL},
	{DDR_PHY_CTL_01_REG, 0x18201010LL},
	{DDR_PHY_CTL_02_REG, 0x00000006LL},
	{DDR_PHY_CTL_03_REG, 0x09090909LL},
	{DDR_PHY_CTL_04_REG, 0x00000009LL},
	{DDR_PHY_CTL_05_REG, 0x00000000LL},
	{DDR_PHY_CTL_06_REG, 0x04300623LL},
	{DDR_PHY_CTL_07_REG, 0x00000000LL},
	{0, 0}
};

static struct ddr_config board_id_to_ddr_config[] = {
	{optimus_ddr_phy_cfg, optimus_ddrc_cfg, SZ_1G, "Optimus"},
	/* Nanya NT5CB128M16FP-DI, 533MHz, 32bit, NoECC */
	{sideswipe_ddr_phy_cfg, sideswipe_ddrc_cfg, SZ_512M, "Sideswipe"},
	{optimus_ddr_phy_cfg, optimus_ddrc_cfg, SZ_1G, "SpaceCast"},
};

static struct ddr_config bad_board_id_ddr_config = {0, 0, 0, "Unknown"};

const char *get_ddr_config_description(void) {
	return get_ddr_config().description;
}

resource_size_t get_ddr_config_size(void) {
	return get_ddr_config().size;
}

struct ddr_config get_ddr_config(void) {
	int board_id = get_board_id();
	if (board_id < ARRAY_SIZE(board_id_to_ddr_config))
		return board_id_to_ddr_config[board_id];
	else
		return bad_board_id_ddr_config;
}
