blob: 996c00f015327090fc18c3055bf209c2e7737b5f [file] [log] [blame]
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2007-2009 coresystems GmbH
*
* 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; version 2 of the License.
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/* CX700 has 48 bytes of scratch registers in D0F4 starting at Reg. 0xd0 */
#define SCRATCH_REG_BASE 0xd0
#define SCRATCH_RANK_0 0xd0
#define SCRATCH_RANK_1 0xd1
#define SCRATCH_RANK_2 0xd2
#define SCRATCH_RANK_3 0xd3
#define SCRATCH_DIMM_NUM 0xd4
#define SCRATCH_RANK_NUM 0xd5
#define SCRATCH_RANK_MAP 0xd6
#define SCRATCH_DRAM_FREQ 0xd7
#define SCRATCH_DRAM_NB_ODT 0xd8
#define SCRATCH_RANK0_SIZE_REG 0xe0 /* RxE0~RxE3 */
#define SCRATCH_RANK0_MA_REG 0xe4 /* RxE4~RxE7 */
#define SCRATCH_CHA_DQSI_LOW_REG 0xe8
#define SCRATCH_CHA_DQSI_HIGH_REG 0xe9
#define SCRATCH_ChA_DQSI_REG 0xea
#define SCRATCH_DRAM_256M_BIT 0xee
#define SCRATCH_FLAGS 0xef
static const u8 Reg_Val[] = {
/* REG, VALUE */
0x70, 0x33,
0x71, 0x11,
0x72, 0x33,
0x73, 0x11,
0x74, 0x20,
0x75, 0x2e,
0x76, 0x64,
0x77, 0x00,
0x78, 0x44,
0x79, 0xaa,
0x7a, 0x33,
0x7b, 0xaa,
0x7c, 0x00,
0x7e, 0x33,
0x7f, 0x33,
0x80, 0x44,
0x81, 0x44,
0x82, 0x44,
0x83, 0x02,
0x50, 0x88,
0x51, 0x7b,
0x52, 0x6f,
0x53, 0x88,
0x54, 0x0e,
0x55, 0x00,
0x56, 0x00,
0x59, 0x00,
0x5d, 0x72,
0x5e, 0x88,
0x5f, 0xc7,
0x68, 0x01,
};
/* Host registers initial value */
static const u8 Host_Reg_Val[] = {
/* REG, VALUE */
0x60, 0xff,
0x61, 0xff,
0x62, 0x0f,
0x63, 0xff,
0x64, 0xff,
0x65, 0x0f,
0x66, 0xff,
0x67, 0x30,
};
static const u8 Mem_Reg_Init[] = {
/* REG, AND, OR */
0x50, 0x11, 0x66,
0x51, 0x11, 0x66,
0x52, 0x00, 0x11,
0x53, 0x00, 0x0f,
0x54, 0x00, 0x00,
0x55, 0x00, 0x00,
0x56, 0x00, 0x00,
0x57, 0x00, 0x00,
0x60, 0x00, 0x00,
0x62, 0xf7, 0x08,
0x65, 0x00, 0xd9,
0x66, 0x00, 0x80,
0x67, 0x00, 0x50, /* OR 0x00 ?? */
0x69, 0xf0, 0x00,
0x6a, 0x00, 0x00,
0x6d, 0xcf, 0xc0,
0x6e, 0xff, 0x80,
0x75, 0x0f, 0x40,
0x77, 0x00, 0x00,
0x80, 0x00, 0x00,
0x81, 0x00, 0x00,
0x82, 0x00, 0x00,
0x83, 0x00, 0x00,
0x84, 0x00, 0x00,
0x85, 0x00, 0x00,
0x86, 0xff, 0x2c, /* OR 0x28 if we don't want enable top 1M SM memory */
0x40, 0x00, 0x00,
0x7c, 0x00, 0x00,
0x7e, 0x00, 0x00,
0xa4, 0xfe, 0x00,
0xb0, 0x7f, 0x80,
0xb1, 0x00, 0xaa,
0xb4, 0xfd, 0x02,
0xb8, 0xfe, 0x00,
};
static const u8 Dram_Driving_ODT_CTRL[] = {
/* REG, VALUE */
0xd6, 0xa8,
0xd4, 0x80,
0xd0, 0x88,
0xd3, 0x01,
0xd8, 0x00,
0xda, 0x80,
};
#define Rank0_ODT 0x00
#define Rank1_ODT 0x01
#define Rank2_ODT 0x02
#define Rank3_ODT 0x03
#define NA_ODT 0x00
#define NB_ODT_75ohm 0x00
#define NB_ODT_150ohm 0x01
#define DDR2_ODT_75ohm 0x20
#define DDR2_ODT_150ohm 0x40
static const u8 ODT_TBL[] = {
/* RankMap, ODT Control Bits, DRAM & NB ODT setting */
0x01, ((NA_ODT << 6) | (NA_ODT << 4) | (NA_ODT << 2) | Rank0_ODT), (DDR2_ODT_150ohm | NB_ODT_75ohm),
0x03, ((NA_ODT << 6) | (NA_ODT << 4) | (Rank0_ODT << 2) | Rank1_ODT), (DDR2_ODT_150ohm | NB_ODT_75ohm),
0x04, ((NA_ODT << 6) | (Rank2_ODT << 4) | (NA_ODT << 2) | NA_ODT), (DDR2_ODT_150ohm | NB_ODT_75ohm),
0x05, ((NA_ODT << 6) | (Rank0_ODT << 4) | (NA_ODT << 2) | Rank2_ODT), (DDR2_ODT_75ohm | NB_ODT_150ohm),
0x07, ((NA_ODT << 6) | (Rank0_ODT << 4) | (Rank2_ODT << 2) | Rank2_ODT), (DDR2_ODT_75ohm | NB_ODT_150ohm),
0x0c, ((Rank2_ODT << 6) | (Rank3_ODT << 4) | (NA_ODT << 2) | NA_ODT), (DDR2_ODT_150ohm | NB_ODT_75ohm),
0x0d, ((Rank0_ODT << 6) | (Rank0_ODT << 4) | (NA_ODT << 2) | Rank2_ODT), (DDR2_ODT_75ohm | NB_ODT_150ohm),
0x0f, ((Rank0_ODT << 6) | (Rank0_ODT << 4) | (Rank2_ODT << 2) | Rank2_ODT), (DDR2_ODT_75ohm | NB_ODT_150ohm),
};
static const u8 DQS_DQ_TBL[] = {
/* RxE0: DRAM Timing DQS */
/* RxE2: DRAM Timing DQ */
/* RxE0, RxE2 */
0xee, 0xba,
0xee, 0xba,
0xcc, 0xba,
0xcc, 0xba,
};
static const u8 Duty_Control_DDR2[] = {
/* RxEC, RxED, RxEE, RXEF */
/* DDRII533 1~2 rank, DDRII400 */
0x84, 0x10, 0x00, 0x10,
/* DDRII533 3~4 rank */
0x44, 0x10, 0x00, 0x10,
};
static const u8 ChA_Clk_Phase_DDR2_Table[] = {
/* Rx91, Rx92, Rx93 */
/* DDRII533 1 rank */
0x04, 0x05, 0x06,
/* DDRII533 2~4 rank */
0x04, 0x05, 0x05,
/* DDRII400 */
0x02, 0x04, 0x04,
};
static const u8 DQ_DQS_Table[] = {
/* REG, VALUE */
/* DRAM DQ/DQS Output Delay Control */
0xdc, 0x65,
0xdd, 0x01,
0xde, 0xc0,
/* DRAM DQ/DQS input Capture Control */
0x78, 0x83,
0x79, 0x83,
0x7a, 0x00,
};
static const u8 DQSOChA_DDR2_Driving_Table[] = {
/* Rx70, Rx71 */
/* DDRII533 1~2 rank */
0x00, 0x01,
/* DDRII533 3~4 rank */
0x03, 0x00,
/* DDRII400 1~2 rank */
0x00, 0x04,
/* DDRII400 3~4 rank */
0x00, 0x01,
};
/************************************************************************/
/* Chipset Performance UP and other setting after DRAM Sizing Registers */
/************************************************************************/
static const u8 Dram_Table[] = {
/* REG, AND, OR */
0x60, 0xff, 0x03,
0x66, 0xcf, 0x80,
0x68, 0x00, 0x00,
0x69, 0xfd, 0x03,
0x6e, 0xff, 0x01,
0x95, 0xff, 0x40,
};
static const u8 Host_Table[] = {
/* REG, AND, OR */
0x51, 0x81, 0x7a,
0x55, 0xff, 0x06,
0x5e, 0x00, 0x88,
0x5d, 0xff, 0xb2,
};
static const u8 Init_Rank_Reg_Table[] = {
/* Rank Ending Address Registers */
0x40, 0x41, 0x42, 0x43,
/* Rank Beginning Address Registers */
0x48, 0x49, 0x4a, 0x4b,
/* Physical-to-Virtual Rank Mapping Registers */
0x54, 0x55,
};
static const u16 DDR2_MRS_table[] = {
/* CL: 2, 3, 4, 5 */
0x150, 0x1d0, 0x250, 0x2d0, /* BL=4 ;Use 1X-bandwidth MA table to init DRAM */
0x158, 0x1d8, 0x258, 0x2d8, /* BL=8 ;Use 1X-bandwidth MA table to init DRAM */
};
#define MRS_DDR2_TWR2 ((0 << 15) | (0 << 20) | (1 << 12))
#define MRS_DDR2_TWR3 ((0 << 15) | (1 << 20) | (0 << 12))
#define MRS_DDR2_TWR4 ((0 << 15) | (1 << 20) | (1 << 12))
#define MRS_DDR2_TWR5 ((1 << 15) | (0 << 20) | (0 << 12))
static const u32 DDR2_Twr_table[] = {
MRS_DDR2_TWR2,
MRS_DDR2_TWR3,
MRS_DDR2_TWR4,
MRS_DDR2_TWR5,
};
static const u8 DQSI_Rate_Table[] = {
8, /* DDRII 200 */
8, /* DDRII 266 */
8, /* DDRII 333 */
7, /* DDRII 400 */
8, /* DDRII 533 */
8, /* DDRII 666 */
};
static const u8 REFC_Table[] = {
0x65, 0x32, /* DDRII 100 */
0x86, 0x43, /* DDRII 266 */
0xa8, 0x54, /* DDRII 333 */
0xca, 0x65, /* DDRII 400 */
0xca, 0x86, /* DDRII 533 */
0xca, 0xa8, /* DDRII 666 */
};