Author: uwe
Date: 2009-05-27 15:46:37 +0200 (Wed, 27 May 2009)
New Revision: 4314
Added:
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/dram_init.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/dram_init.h
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/dram_util.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/dram_util.h
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/translator_ddr2_init.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/clk_ctrl.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/detection.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/dev_init.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/dqs_search.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/drdy_bl.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/driving_setting.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/final_setting.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/freq_setting.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/rank_map.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/timing_setting.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/uma_ram_setting.c
trunk/coreboot-v2/src/northbridge/via/vx800/driving_clk_phase_data.h
trunk/coreboot-v2/src/northbridge/via/vx800/examples/driving_clk_phase_data.c
Removed:
trunk/coreboot-v2/src/northbridge/via/vx800/DrivingClkPhaseData.h
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/DramInit.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/DramInit.h
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/DramUtil.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/DramUtil.h
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/Translatorddr2init.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/ClkCtrl.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/DQSSearch.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/DRDY_BL.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/Detection.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/DevInit.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/DrivingSetting.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/FinalSetting.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/FreqSetting.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/RankMap.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/TimingSetting.c
trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/UMARamSetting.c
trunk/coreboot-v2/src/northbridge/via/vx800/examples/DrivingClkPhaseData.c
Modified:
trunk/coreboot-v2/src/northbridge/via/vx800/examples/cache_as_ram_auto.c
trunk/coreboot-v2/src/northbridge/via/vx800/northbridge.c
trunk/coreboot-v2/src/northbridge/via/vx800/raminit.c
Log:
Change all vx800 file names from CamelCase to camel_case to match
our coding guidelines (trivial).
Signed-off-by: Uwe Hermann <uwe(a)hermann-uwe.de>
Acked-by: Uwe Hermann <uwe(a)hermann-uwe.de>
Deleted: trunk/coreboot-v2/src/northbridge/via/vx800/DrivingClkPhaseData.h
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/DrivingClkPhaseData.h 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/DrivingClkPhaseData.h 2009-05-27 13:46:37 UTC (rev 4314)
@@ -1,70 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2009 One Laptop per Child, Association, Inc.
- *
- * 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
- */
-
-#ifndef DRIVINGCLKPHASEDATA_H
-#define DRIVINGCLKPHASEDATA_H
-
-//extern u8 DDR2_DQSA_Driving_Table[4] ;
-//extern u8 DDR2_DQSB_Driving_Table[2] ;
-
-//extern u8 DDR2_DQA_Driving_Table[4] ;
-//extern u8 DDR2_DQB_Driving_Table[2] ;
-
-//extern u8 DDR2_CSA_Driving_Table_x8[4] ;
-//extern u8 DDR2_CSB_Driving_Table_x8[2] ;
-//extern u8 DDR2_CSA_Driving_Table_x16[4];
-//extern u8 DDR2_CSB_Driving_Table_x16[2];
-
-#define MA_Table 3
-//extern u8 DDR2_MAA_Driving_Table[MA_Table][4];
-//extern u8 DDR2_MAB_Driving_Table[MA_Table][2];
-
-//extern u8 DDR2_DCLKA_Driving_Table[4] ;
-//extern u8 DDR2_DCLKB_Driving_Table[4];
-
-#define DUTY_CYCLE_FREQ_NUM 6
-#define DUTY_CYCLE_REG_NUM 3
-//extern u8 ChA_Duty_Control_DDR2[DUTY_CYCLE_REG_NUM][DUTY_CYCLE_FREQ_NUM];
-//extern u8 ChB_Duty_Control_DDR2[DUTY_CYCLE_REG_NUM][DUTY_CYCLE_FREQ_NUM];
-
-#define Clk_Phase_Table_DDR2_Width 6
-//extern u8 DDR2_ChA_Clk_Phase_Table_1R[3][Clk_Phase_Table_DDR2_Width];
-//extern u8 DDR2_ChB_Clk_Phase_Table_1R[3][Clk_Phase_Table_DDR2_Width];
-//extern u8 DDR2_ChA_Clk_Phase_Table_2R[3][Clk_Phase_Table_DDR2_Width];
-
-#define WrtData_REG_NUM 4
-#define WrtData_FREQ_NUM 6
-//extern u8 DDR2_ChA_WrtData_Phase_Table[WrtData_REG_NUM ][WrtData_FREQ_NUM];
-//extern u8 DDR2_ChB_WrtData_Phase_Table[WrtData_REG_NUM ][WrtData_FREQ_NUM];
-
-#define DQ_DQS_Delay_Table_Width 4
-//extern u8 DDR2_CHA_DQ_DQS_Delay_Table[4][DQ_DQS_Delay_Table_Width];
-//extern u8 DDR2_CHB_DQ_DQS_Delay_Table[4][DQ_DQS_Delay_Table_Width];
-
-#define DQS_INPUT_CAPTURE_REG_NUM 3
-#define DQS_INPUT_CAPTURE_FREQ_NUM 6
-//extern u8 DDR2_ChA_DQS_Input_Capture_Tbl[DQS_INPUT_CAPTURE_REG_NUM ][DQS_INPUT_CAPTURE_FREQ_NUM];
-//extern u8 DDR2_ChB_DQS_Input_Capture_Tbl[DQS_INPUT_CAPTURE_REG_NUM ][DQS_INPUT_CAPTURE_FREQ_NUM];
-
-//extern u8 Fixed_DQSA_1_2_Rank_Table[4][2];
-//extern u8 Fixed_DQSA_3_4_Rank_Table[4][2];
-
-//extern u8 Fixed_DQSB_1_2_Rank_Table[4][2];
-//extern u8 Fixed_DQSB_3_4_Rank_Table[4][2];
-#endif /* DRIVINGCLKPHASEDATA_H */
Deleted: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/DramInit.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/DramInit.c 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/DramInit.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -1,86 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2009 One Laptop per Child, Association, Inc.
- *
- * 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.
- *
- * 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
- */
-
-#include "lib/memset.c"
-CB_STATUS DDR2_DRAM_INIT()
-{
- CB_STATUS Status;
- u8 i;
- u32 RamSize;
- BOOLEAN bTest;
- DRAM_SYS_ATTR DramAttr;
-
- PRINT_DEBUG_MEM("DRAM_INIT \r");
-
- memset(&DramAttr, 0, sizeof(DRAM_SYS_ATTR));
- /*Step1 DRAM Detection; DDR1 or DDR2; Get SPD Data; Rank Presence;64 or 128bit; Unbuffered or registered; 1T or 2T */
- DRAMDetect(&DramAttr);
-
- //Step2 set Frequency; calculate CL and Frequncy from SPD data; set the Frequency
- DRAMFreqSetting(&DramAttr);
- //Step3 Set DRAM Timing; CL, tRP, tRCD, tRAS, tRFC, tRRD, tWR, tWTR, tRTP
- DRAMTimingSetting(&DramAttr);
- //Step4 DRDY
- DRAMDRDYSetting(&DramAttr);
- //Step5 Burst length
- DRAMBurstLength(&DramAttr);
- //Step6 DRAM Driving Adjustment
- DRAMDriving(&DramAttr);
- //Step7 duty cycle control
- DutyCycleCtrl(&DramAttr);
- //Step8 DRAM clock phase and delay control
- DRAMClkCtrl(&DramAttr);
- //Step9 set register before init DRAM device
- DRAMRegInitValue(&DramAttr);
- //Step10 DDR and DDR2 initialize process
- DRAMInitializeProc(&DramAttr);
-
- //Step13 Interleave function in rankmap.c
- DRAMBankInterleave(&DramAttr);
- //Step14 Sizing
- DRAMSizingMATypeM(&DramAttr);
-
- //Step11 Search DQS and DQ output delay
- DRAMDQSOutputSearch(&DramAttr);
- //Step12 Search DQS input delay
- DRAMDQSInputSearch(&DramAttr);
-
- //Step15 DDR fresh counter setting
- DRAMRefreshCounter(&DramAttr);
- //Step16 Final register setting for improve performance
- DRAMRegFinalValue(&DramAttr);
-
- RamSize = 0;
- for (i = 0; i < MAX_RANKS; i++) {
- if (DramAttr.RankSize[i] == 0) {
- continue;
- }
- RamSize += DramAttr.RankSize[i];
- }
- PRINT_DEBUG_MEM("RamSize=");
- PRINT_DEBUG_MEM_HEX32(RamSize);
- PRINT_DEBUG_MEM("\r");
- DumpRegisters(0, 3);
- //bTest = DramBaseTest( M1, RamSize - M1 * 2,SPARE, FALSE);
- /* the memory can not correct work, this is because the user set the incorrect memory
- parameter from setup interface.so we must set the boot mode to recovery mode, let
- the system to reset and use the spd value to initialize the memory */
- SetUMARam();
- return CB_SUCCESS;
-}
Deleted: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/DramInit.h
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/DramInit.h 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/DramInit.h 2009-05-27 13:46:37 UTC (rev 4314)
@@ -1,263 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2009 One Laptop per Child, Association, Inc.
- *
- * 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.
- *
- * 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
- */
-
-#ifndef __DRAMINIT_H_
-#define __DRAMINIT_H_
-
-//Dram Size
-#define M (1024*1024)
-#define M1 (1*M)
-#define M64 (64*M)
-#define M128 (128*M)
-#define M256 (256*M)
-#define M384 (384*M)
-#define M512 (512*M)
-
-// UMA size
-#define UMASIZE M64
-
-#define ENABLE_CHC 0 //CHC enable, how ever, this CHC,used some reg define in CHB
-#define ENABLE_CHB 0 //CHB enable , CHB is VX800's, VX855 no this CHB.
-//Dram Freq
-#define DIMMFREQ_800 400
-#define DIMMFREQ_667 333
-//#define DIMMFREQ_600 300
-#define DIMMFREQ_533 266
-#define DIMMFREQ_400 200
-#define DIMMFREQ_333 166
-#define DIMMFREQ_266 133
-#define DIMMFREQ_200 100
-
-//Dram Type
-#define RAMTYPE_FPMDRAM 1
-#define RAMTYPE_EDO 2
-#define RAMTYPE_PipelinedNibble 3
-#define RAMTYPE_SDRAM 4
-#define RAMTYPE_ROM 5
-#define RAMTYPE_SGRAMDDR 6
-#define RAMTYPE_SDRAMDDR 7
-#define RAMTYPE_SDRAMDDR2 8
-
-/* CAS latency constant */
-#define CASLAN_15 15
-#define CASLAN_2 20
-#define CASLAN_25 25
-#define CASLAN_3 30
-#define CASLAN_35 35
-#define CASLAN_4 40
-#define CASLAN_45 45
-#define CASLAN_5 50
-#define CASLAN_NULL 00
-
-//Burst length
-#define BURSTLENGTH8 8
-#define BURSTLENGTH4 4
-
-//Data Width
-//#define DATAWIDTHX16 16
-//#define DATAWIDTHX8 8
-//#define DATAWIDTHX4 4
-
-
-#define SPD_MEMORY_TYPE 2 /*Memory type FPM,EDO,SDRAM,DDR,DDR2 */
-#define SPD_SDRAM_ROW_ADDR 3 /*Number of row addresses on this assembly */
-#define SPD_SDRAM_COL_ADDR 4 /*Number of column addresses on this assembly */
-#define SPD_SDRAM_DIMM_RANKS 5 /*Number of RANKS on this assembly */
-#define SPD_SDRAM_MOD_DATA_WIDTH 6 /*Data width of this assembly */
-#define SPD_SDRAM_TCLK_X 9 /*Cycle time at Maximum supported CAS latency (CL=X) */
-#define SPD_SDRAM_TAC_X 10 /*Access time for highest CL */
-#define SPD_SDRAM_CONFIG_TYPE 11 /*Non-parity , Parity or ECC */
-#define SPD_SDRAM_REFRESH 12 /*Refresh rate/type */
-#define SPD_SDRAM_WIDTH 13 /*Primary sdram width */
-#define SPD_SDRAM_MIN_CLK_DLY 15 /*Minimum clock delay */
-#define SPD_SDRAM_BURSTLENGTH 16 /*Burst Lengths supported */
-#define SPD_SDRAM_NO_OF_BANKS 17 /*Number of banks on this assembly */
-#define SPD_SDRAM_CAS_LATENCY 18 /*CAS latency */
-#define SPD_SDRAM_DIMM_TYPE_DDR2 20 /*DIMM type information; identifies the DDR2 memory module type */
-#define SPD_SDRAM_DEV_ATTR_DDR1 20 /*WE latency */
-#define SPD_SDRAM_MODULES_ATTR 21 /*This byte depicts various aspects of the modules; DDR DDR2 have different aspects */
-#define SPD_SDRAM_DEV_ATTR_GEN 22 /*General device attributes */
-#define SPD_SDRAM_TCLK_X_1 23 /*Minimum clock cycle time at Reduced CL, DDR: X-0.5 DDR2: X-1 */
-#define SPD_SDRAM_TAC_X_1 24 /*Maximum Data Access time from Clock at reduced CL,DDR: X-0.5 DDR2: X-1 */
-#define SPD_SDRAM_TCLK_X_2 25 /*Minimum clock cycle time at reduced CL, DDR: X-1 DDR2: X-2 */
-#define SPD_SDRAM_TAC_X_2 26 /*Maximum Data Access time from Clock at reduced CL, DDR: X-1 DDR2: X-2 */
-#define SPD_SDRAM_TRP 27 /*minimum row precharge time */
-#define SPD_SDRAM_TRRD 28 /*minimum row active to row active delay */
-#define SPD_SDRAM_TRCD 29 /*minimum RAS to CAS delay */
-#define SPD_SDRAM_TRAS 30 /*minimum active to precharge time */
-#define SPD_SDRAM_TWR 36 /*write recovery time, only DDR2 use it */
-#define SPD_SDRAM_TWTR 37 /*internal write to read command delay, only DDR2 use it */
-#define SPD_SDRAM_TRTP 38 /*internal read to prechange command delay, only DDR2 use it */
-#define SPD_SDRAM_TRFC2 40 /*extension of byte 41 tRC and byte 42 tRFC, only DDR2 use it */
-#define SPC_SDRAM_TRC 41 /*minimum active to active/refresh time */
-#define SPD_SDRAM_TRFC 42 /*minimum refresh to active / refresh command period */
-
-#define SPD_DATA_SIZE 44
-//Dram cofig are
-/*the most number of socket*/
-//#define MAX_RAM_SLOTS 2
-#define MAX_SOCKETS MAX_RAM_SLOTS
-#define MAX_DIMMS MAX_SOCKETS /*every sockets can plug one DIMM */
-/*the most number of RANKs on a DIMM*/
-#define MAX_RANKS MAX_SOCKETS*2
-
-struct mem_controller {
- u8 channel0[MAX_DIMMS];
-};
-
-static const struct mem_controller ctrl = {
- .channel0 = {0x50, 0x51},
-};
-
-typedef struct _DRAM_CONFIG_DATA {
- u8 DramClk;
- u8 DramTiming;
- u8 CasLatency;
- u8 BankIntlv;
- u8 Trp;
- u8 Tras;
- u8 Trcd;
- u8 Trfc;
- u8 Trrd;
- u8 Trtp;
- u8 Twtr;
- u8 Twr;
-
- u8 CmdRate;
- u8 DualEn;
- //u8 IntLv0;
- //u8 IntLv1;
- //u8 Ba0Sel;
- //u8 Ba1Sel;
- //u8 Ba2Sel;
- u8 BaScmb;
- u8 DrdyTiming;
- //u8 Above4G;
- //u8 RdsaitMode;
- //u8 Rdsait;
- //u8 TopPerf;
-
- u16 UMASize;
-} DRAM_CONFIG_DATA;
-
-/*DIMM(assembly) information*/
-typedef struct _DIMM_INFO_tag {
- u8 bPresence;
- u8 SPDDataBuf[SPD_DATA_SIZE]; /*get all information from spd data */
-} DIMM_INFO;
-
-typedef struct _DRAM_SYS_ATTR_tag {
- DIMM_INFO DimmInfo[MAX_DIMMS];
-
- u8 RankPresentMap; /*bit0,1 Rank0,1 on DIMM0, bit2,3 Rank2,3 on DIMM1,
- bit4,5 Rank4,5 on DIMM2, bit6,7 Rank6,7 on DIMM3 */
- u8 DimmNumChA; /*Dimm number */
- u8 DimmNumChB;
- u8 RankNumChA; /*the number of Ranks on the mortherbaord */
- u8 RankNumChB;
- u8 LoadNumChA; /*the number of chips on all DIMM */
- u8 LoadNumChB;
-
- u8 DramType; /*DDR1 or DDR2 */
- u16 DramFreq;
- u16 DramCyc; /*10ns, 7.5ns, 6ns, 5ns, 3.75ns, 3ns, 2.5ns =1/SysFreq, unit: 100*ns. */
-
- //u16 HFreq; /*100, 133, 166, 200, 266, 333, 400*/
-
- u8 CL; /* CAS lantency */
- u8 CmdRate; /*1T or 2T */
-
- u32 RankSize[MAX_RANKS];
- u8 Dual_Channel;
- DRAM_CONFIG_DATA ConfigData;
- u8 reserved[4];
-
-} DRAM_SYS_ATTR;
-
-typedef struct _DRAM_SIZE_INFO {
- u32 RankLength[MAX_RANKS];
-} DRAM_SIZE_INFO;
-
-//detection.c
-/*Step1 detect DRAM type, Read SPD data,command rate*/
-CB_STATUS DRAMDetect(DRAM_SYS_ATTR * DramAttr);
-//FreqSetting.c
-/*Step2 set Frequency, calculate CAL*/
-void DRAMFreqSetting(DRAM_SYS_ATTR * DramAttr);
-//TimingSetting.c
-/*Step3 Set DRAM Timing*/
-void DRAMTimingSetting(DRAM_SYS_ATTR * DramAttr);
-//DRDY_BL.c
-/*Step4 DRDY*/
-void DRAMDRDYSetting(DRAM_SYS_ATTR * DramAttr);
-//DRDY_BL.c
-/*Step5 Burst Length*/
-void DRAMBurstLength(DRAM_SYS_ATTR * DramAttr);
-//DrivingSetting.c
-/*Step6 DRAM Driving Adjustment*/
-void DRAMDriving(DRAM_SYS_ATTR * DramAttr);
-
-//ClkCtrl.c
-/*Step7 duty cycle control*/
-void DutyCycleCtrl(DRAM_SYS_ATTR * DramAttr);
-//ClkCtrl.c
-/*Step8 DRAM clock phase and delay control*/
-void DRAMClkCtrl(DRAM_SYS_ATTR * DramAttr);
-
-//DevInit.c
-/*Step9 set register before init DRAM device*/
-void DRAMRegInitValue(DRAM_SYS_ATTR * DramAttr);
-
-//DevInit.c
-/*Step10 DDR and DDR2 initialize process*/
-void DRAMInitializeProc(DRAM_SYS_ATTR * DramAttr);
-
-//DQSSearch.c
-/*Step11 Search DQS and DQ output delay*/
-void DRAMDQSOutputSearch(DRAM_SYS_ATTR * DramAttr);
-
-//DQSSearch.c
-/*Step12 Search DQS input delay*/
-void DRAMDQSInputSearch(DRAM_SYS_ATTR * DramAttr);
-
-//RankMap.c
-/*Step13 Interleav function in rankmap.c*/
-void DRAMBankInterleave(DRAM_SYS_ATTR * DramAttr);
-
-//RankMap.c
-/*Step14 Sizing*/
-void DRAMSizingMATypeM(DRAM_SYS_ATTR * DramAttr);
-
-
-//FinalSetting.c
-/*Step15 DDR fresh counter setting*/
-void DRAMRefreshCounter(DRAM_SYS_ATTR * DramAttr);
-
-//FinnalSetting.c
-/*Step16 Final register setting for improve performance*/
-void DRAMRegFinalValue(DRAM_SYS_ATTR * DramAttr);
-
-
-/*set UMA*/
-void SetUMARam();
-
-CB_STATUS InstallMemory(DRAM_SYS_ATTR * DramAttr, u32 RamSize);
-CB_STATUS DDR2_DRAM_INIT();
-
-#endif
Deleted: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/DramUtil.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/DramUtil.c 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/DramUtil.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -1,249 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2009 One Laptop per Child, Association, Inc.
- *
- * 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
- */
-
-void WaitMicroSec(UINTN MicroSeconds)
-{
- u32 i;
-
- for (i = 0; i < 1024 * MicroSeconds; i++) {
- __asm__ volatile ("nop\n\t");
- }
-
- return;
-}
-
-/*===================================================================
-Function : via_write_phys()
-Precondition :
-Input : addr
- value
-Output : void
-Purpose :
-Reference : None
-===================================================================*/
-
-void via_write_phys(volatile u32 addr, volatile u32 value)
-{
- volatile u32 *ptr;
- ptr = (volatile u32 *) addr;
- *ptr = (volatile u32) value;
-}
-
-/*===================================================================
-Function : via_read_phys()
-Precondition :
-Input : addr
-Output : u32
-Purpose :
-Reference : None
-===================================================================*/
-
-u32 via_read_phys(volatile u32 addr)
-{
- volatile u32 *ptr;
- volatile u32 y;
-// ptr = (volatile u32 *)addr;
- y = *(volatile u32 *) addr;
-// return *ptr;
- return y;
-}
-
-
-/*===================================================================
-Function : DimmRead()
-Precondition :
-Input : x
-Output : u32
-Purpose :
-Reference : None
-===================================================================*/
-
-u32 DimmRead(volatile u32 x)
-{ // volatile u32 z;
- volatile u32 y;
- y = *(volatile u32 *) x;
-
- return y;
-}
-
-
-/*===================================================================
-Function : DramBaseTest()
-Precondition : this function used to verify memory
-Input :
- BaseAdd,
- length,
- mode
-Output : u32
-Purpose :write into and read out to verify if dram is correct
-Reference : None
-===================================================================*/
-BOOLEAN DramBaseTest(u32 BaseAdd, u32 Length,
- DRAM_TEST_MODE Mode, BOOLEAN PrintFlag)
-{
- u32 TestSpan;
- u32 Data, Address, Address2;
- u8 i, TestCount;
-
- //decide the test mode is continous or step
- if (Mode == EXTENSIVE) {
- //the test mode is continuos and must test each unit
- TestSpan = 4;
- TestCount = 1;
- } else if (Mode == SPARE) {
- // the test mode is step and test some unit
- TestSpan = STEPSPAN;
- TestCount = TESTCOUNT;
- } else {
- PRINT_DEBUG_MEM("the test mode is error\r");
- return FALSE;
- }
-
- //write each test unit the value with TEST_PATTERN
- for (Address = BaseAdd; Address < BaseAdd + Length;
- Address += TestSpan) {
- for (i = 0; i < TestCount; i++)
- via_write_phys(Address + i * 4, TEST_PATTERN);
- if (PrintFlag) {
- if ((u32) Address % 0x10000000 == 0) {
- PRINT_DEBUG_MEM("Write in Addr =");
- PRINT_DEBUG_MEM_HEX32(Address);
- PRINT_DEBUG_MEM("\r");
- }
- }
- }
-
- //compare each test unit with the value of TEST_PATTERN
- //and write it with compliment of TEST_PATTERN
- for (Address = BaseAdd; Address < BaseAdd + Length;
- Address += TestSpan) {
- for (i = 0; i < TestCount; i++) {
- Data = via_read_phys(Address + i * 4);
- via_write_phys(Address + i * 4,
- (u32) (~TEST_PATTERN));
- if (Data != TEST_PATTERN) {
- PRINT_DEBUG_MEM
- ("TEST_PATTERN ERROR !!!!! ");
- Address2 = Address + i * 4;
- PRINT_DEBUG_MEM_HEX32(Address2);
- PRINT_DEBUG_MEM(" : ");
- PRINT_DEBUG_MEM_HEX32(Data);
- PRINT_DEBUG_MEM(" \r");
- return FALSE;
- }
- }
- if (PrintFlag) {
- if ((u32) Address % 0x10000000 == 0) {
- PRINT_DEBUG_MEM("Write in Addr =");
- PRINT_DEBUG_MEM_HEX32(Address);
- PRINT_DEBUG_MEM("\r");
- }
- }
- }
-
-
- //compare each test unit with the value of ~TEST_PATTERN
- for (Address = BaseAdd; Address < BaseAdd + Length;
- Address += TestSpan) {
- for (i = (u8) (TestCount); i > 0; i--) {
- Data = via_read_phys(Address + (i - 1) * 4);
- if (Data != ~TEST_PATTERN) {
-
- PRINT_DEBUG_MEM
- ("~TEST_PATTERN ERROR !!!!! ");
- Address2 = Address + (i - 1) * 4;
- PRINT_DEBUG_MEM_HEX32(Address2);
- PRINT_DEBUG_MEM(" : ");
- PRINT_DEBUG_MEM_HEX32(Data);
- PRINT_DEBUG_MEM(" \r");
- return FALSE;
- }
- }
- }
-
- return TRUE;
-}
-
-/*===================================================================
-Function : DumpRegisters()
-Precondition :
-Input :
- pPCIPPI,
- DevNum,
- FuncNum
-Output : Void
-Purpose :
-Reference : None
-===================================================================*/
-
-void DumpRegisters(INTN DevNum, INTN FuncNum)
-{
- INTN i, j;
- u8 ByteVal;
-
- ByteVal = 0;
- //pci_write_config8(PCI_DEV(0, DevNum, FuncNum), 0xA1, ByteVal);
- PRINT_DEBUG_MEM("\rDev %02x Fun %02x\r");
- PRINT_DEBUG_MEM
- ("\r 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\r");
- PRINT_DEBUG_MEM
- ("---------------------------------------------------\r");
- for (i = 0; i < 0x10; i++) {
- PRINT_DEBUG_MEM_HEX32(i);
- for (j = 0; j < 0x10; j++) {
- ByteVal =
- pci_read_config8(PCI_DEV(0, DevNum, FuncNum),
- i * 0x10 + j);
- PRINT_DEBUG_MEM_HEX8(ByteVal);
- PRINT_DEBUG_MEM(" ");
-
- }
- PRINT_DEBUG_MEM("\r");
- }
- return;
-}
-
-
-/*===================================================================
-Function : dumpnorth()
-Precondition :
-Input :
- pPCIPPI,
- Func
-Output : Void
-Purpose :
-Reference : None
-===================================================================*/
-
-void dumpnorth(u8 Func)
-{
- u16 r, c;
- u8 ByteVal;
- PRINT_DEBUG_MEM("Dump North!!!\r");
- for (r = 0; r < 32; r++) {
- for (c = (u16) (r << 3); c < (r << 3) + 8; c++) {
- ByteVal = 0;
- ByteVal = pci_read_config8(PCI_DEV(0, 0, Func), c);
- PRINT_DEBUG_MEM_HEX16(c);
- PRINT_DEBUG_MEM("= ");
- PRINT_DEBUG_MEM_HEX8(ByteVal);
- }
- PRINT_DEBUG_MEM("\r");
- }
-}
Deleted: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/DramUtil.h
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/DramUtil.h 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/DramUtil.h 2009-05-27 13:46:37 UTC (rev 4314)
@@ -1,47 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2009 One Laptop per Child, Association, Inc.
- *
- * 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
- */
-
-#ifndef __DRAM_UTIL_H__
-#define __DRAM_UTIL_H__
-
-#define STEPSPAN 0x1000 //the span when test memory in spare mode
-#define TESTCOUNT 0x4 // the test count in each range when test memory in spare mode
-#define TEST_PATTERN 0x5A5A5A5A //the test pattern
-
-typedef enum __DRAM_TEST_MODE {
- EXTENSIVE,
- SPARE,
- MAXMODE
-} DRAM_TEST_MODE;
-
-void WaitMicroSec(UINTN MicroSeconds);
-
-void via_write_phys(u32 addr, u32 value);
-
-u32 via_read_phys(u32 addr);
-
-u32 DimmRead(u32 x);
-
-BOOLEAN DramBaseTest(u32 BaseAdd, u32 Length,
- DRAM_TEST_MODE mode, BOOLEAN PrintFlag);
-
-void DumpRegisters(INTN DevNum, INTN FuncNum);
-
-void dumpnorth(u8 Func);
-#endif
Deleted: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/Translatorddr2init.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/Translatorddr2init.c 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/Translatorddr2init.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -1,34 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2009 One Laptop per Child, Association, Inc.
- *
- * 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
- */
-
-#define CB_SUCCESS 0x0
-#define CB_INVALID_PARAMETER 0x2
-#define CB_NOT_READY 0x6
-#define CB_DEVICE_ERROR 0x7
-#define TRUE 1
-#define FALSE 0
-
-
-typedef int8_t INT8;
-typedef unsigned long uintn_t;
-typedef uintn_t UINTN;
-typedef long intn_t;
-typedef intn_t INTN;
-typedef UINTN CB_STATUS;
-typedef uint8_t BOOLEAN;
Copied: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/dram_init.c (from rev 4313, trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/DramInit.c)
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/dram_init.c (rev 0)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/dram_init.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -0,0 +1,86 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2009 One Laptop per Child, Association, Inc.
+ *
+ * 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.
+ *
+ * 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
+ */
+
+#include "lib/memset.c"
+CB_STATUS DDR2_DRAM_INIT()
+{
+ CB_STATUS Status;
+ u8 i;
+ u32 RamSize;
+ BOOLEAN bTest;
+ DRAM_SYS_ATTR DramAttr;
+
+ PRINT_DEBUG_MEM("DRAM_INIT \r");
+
+ memset(&DramAttr, 0, sizeof(DRAM_SYS_ATTR));
+ /*Step1 DRAM Detection; DDR1 or DDR2; Get SPD Data; Rank Presence;64 or 128bit; Unbuffered or registered; 1T or 2T */
+ DRAMDetect(&DramAttr);
+
+ //Step2 set Frequency; calculate CL and Frequncy from SPD data; set the Frequency
+ DRAMFreqSetting(&DramAttr);
+ //Step3 Set DRAM Timing; CL, tRP, tRCD, tRAS, tRFC, tRRD, tWR, tWTR, tRTP
+ DRAMTimingSetting(&DramAttr);
+ //Step4 DRDY
+ DRAMDRDYSetting(&DramAttr);
+ //Step5 Burst length
+ DRAMBurstLength(&DramAttr);
+ //Step6 DRAM Driving Adjustment
+ DRAMDriving(&DramAttr);
+ //Step7 duty cycle control
+ DutyCycleCtrl(&DramAttr);
+ //Step8 DRAM clock phase and delay control
+ DRAMClkCtrl(&DramAttr);
+ //Step9 set register before init DRAM device
+ DRAMRegInitValue(&DramAttr);
+ //Step10 DDR and DDR2 initialize process
+ DRAMInitializeProc(&DramAttr);
+
+ //Step13 Interleave function in rankmap.c
+ DRAMBankInterleave(&DramAttr);
+ //Step14 Sizing
+ DRAMSizingMATypeM(&DramAttr);
+
+ //Step11 Search DQS and DQ output delay
+ DRAMDQSOutputSearch(&DramAttr);
+ //Step12 Search DQS input delay
+ DRAMDQSInputSearch(&DramAttr);
+
+ //Step15 DDR fresh counter setting
+ DRAMRefreshCounter(&DramAttr);
+ //Step16 Final register setting for improve performance
+ DRAMRegFinalValue(&DramAttr);
+
+ RamSize = 0;
+ for (i = 0; i < MAX_RANKS; i++) {
+ if (DramAttr.RankSize[i] == 0) {
+ continue;
+ }
+ RamSize += DramAttr.RankSize[i];
+ }
+ PRINT_DEBUG_MEM("RamSize=");
+ PRINT_DEBUG_MEM_HEX32(RamSize);
+ PRINT_DEBUG_MEM("\r");
+ DumpRegisters(0, 3);
+ //bTest = DramBaseTest( M1, RamSize - M1 * 2,SPARE, FALSE);
+ /* the memory can not correct work, this is because the user set the incorrect memory
+ parameter from setup interface.so we must set the boot mode to recovery mode, let
+ the system to reset and use the spd value to initialize the memory */
+ SetUMARam();
+ return CB_SUCCESS;
+}
Copied: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/dram_init.h (from rev 4313, trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/DramInit.h)
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/dram_init.h (rev 0)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/dram_init.h 2009-05-27 13:46:37 UTC (rev 4314)
@@ -0,0 +1,263 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2009 One Laptop per Child, Association, Inc.
+ *
+ * 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.
+ *
+ * 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
+ */
+
+#ifndef __DRAMINIT_H_
+#define __DRAMINIT_H_
+
+//Dram Size
+#define M (1024*1024)
+#define M1 (1*M)
+#define M64 (64*M)
+#define M128 (128*M)
+#define M256 (256*M)
+#define M384 (384*M)
+#define M512 (512*M)
+
+// UMA size
+#define UMASIZE M64
+
+#define ENABLE_CHC 0 //CHC enable, how ever, this CHC,used some reg define in CHB
+#define ENABLE_CHB 0 //CHB enable , CHB is VX800's, VX855 no this CHB.
+//Dram Freq
+#define DIMMFREQ_800 400
+#define DIMMFREQ_667 333
+//#define DIMMFREQ_600 300
+#define DIMMFREQ_533 266
+#define DIMMFREQ_400 200
+#define DIMMFREQ_333 166
+#define DIMMFREQ_266 133
+#define DIMMFREQ_200 100
+
+//Dram Type
+#define RAMTYPE_FPMDRAM 1
+#define RAMTYPE_EDO 2
+#define RAMTYPE_PipelinedNibble 3
+#define RAMTYPE_SDRAM 4
+#define RAMTYPE_ROM 5
+#define RAMTYPE_SGRAMDDR 6
+#define RAMTYPE_SDRAMDDR 7
+#define RAMTYPE_SDRAMDDR2 8
+
+/* CAS latency constant */
+#define CASLAN_15 15
+#define CASLAN_2 20
+#define CASLAN_25 25
+#define CASLAN_3 30
+#define CASLAN_35 35
+#define CASLAN_4 40
+#define CASLAN_45 45
+#define CASLAN_5 50
+#define CASLAN_NULL 00
+
+//Burst length
+#define BURSTLENGTH8 8
+#define BURSTLENGTH4 4
+
+//Data Width
+//#define DATAWIDTHX16 16
+//#define DATAWIDTHX8 8
+//#define DATAWIDTHX4 4
+
+
+#define SPD_MEMORY_TYPE 2 /*Memory type FPM,EDO,SDRAM,DDR,DDR2 */
+#define SPD_SDRAM_ROW_ADDR 3 /*Number of row addresses on this assembly */
+#define SPD_SDRAM_COL_ADDR 4 /*Number of column addresses on this assembly */
+#define SPD_SDRAM_DIMM_RANKS 5 /*Number of RANKS on this assembly */
+#define SPD_SDRAM_MOD_DATA_WIDTH 6 /*Data width of this assembly */
+#define SPD_SDRAM_TCLK_X 9 /*Cycle time at Maximum supported CAS latency (CL=X) */
+#define SPD_SDRAM_TAC_X 10 /*Access time for highest CL */
+#define SPD_SDRAM_CONFIG_TYPE 11 /*Non-parity , Parity or ECC */
+#define SPD_SDRAM_REFRESH 12 /*Refresh rate/type */
+#define SPD_SDRAM_WIDTH 13 /*Primary sdram width */
+#define SPD_SDRAM_MIN_CLK_DLY 15 /*Minimum clock delay */
+#define SPD_SDRAM_BURSTLENGTH 16 /*Burst Lengths supported */
+#define SPD_SDRAM_NO_OF_BANKS 17 /*Number of banks on this assembly */
+#define SPD_SDRAM_CAS_LATENCY 18 /*CAS latency */
+#define SPD_SDRAM_DIMM_TYPE_DDR2 20 /*DIMM type information; identifies the DDR2 memory module type */
+#define SPD_SDRAM_DEV_ATTR_DDR1 20 /*WE latency */
+#define SPD_SDRAM_MODULES_ATTR 21 /*This byte depicts various aspects of the modules; DDR DDR2 have different aspects */
+#define SPD_SDRAM_DEV_ATTR_GEN 22 /*General device attributes */
+#define SPD_SDRAM_TCLK_X_1 23 /*Minimum clock cycle time at Reduced CL, DDR: X-0.5 DDR2: X-1 */
+#define SPD_SDRAM_TAC_X_1 24 /*Maximum Data Access time from Clock at reduced CL,DDR: X-0.5 DDR2: X-1 */
+#define SPD_SDRAM_TCLK_X_2 25 /*Minimum clock cycle time at reduced CL, DDR: X-1 DDR2: X-2 */
+#define SPD_SDRAM_TAC_X_2 26 /*Maximum Data Access time from Clock at reduced CL, DDR: X-1 DDR2: X-2 */
+#define SPD_SDRAM_TRP 27 /*minimum row precharge time */
+#define SPD_SDRAM_TRRD 28 /*minimum row active to row active delay */
+#define SPD_SDRAM_TRCD 29 /*minimum RAS to CAS delay */
+#define SPD_SDRAM_TRAS 30 /*minimum active to precharge time */
+#define SPD_SDRAM_TWR 36 /*write recovery time, only DDR2 use it */
+#define SPD_SDRAM_TWTR 37 /*internal write to read command delay, only DDR2 use it */
+#define SPD_SDRAM_TRTP 38 /*internal read to prechange command delay, only DDR2 use it */
+#define SPD_SDRAM_TRFC2 40 /*extension of byte 41 tRC and byte 42 tRFC, only DDR2 use it */
+#define SPC_SDRAM_TRC 41 /*minimum active to active/refresh time */
+#define SPD_SDRAM_TRFC 42 /*minimum refresh to active / refresh command period */
+
+#define SPD_DATA_SIZE 44
+//Dram cofig are
+/*the most number of socket*/
+//#define MAX_RAM_SLOTS 2
+#define MAX_SOCKETS MAX_RAM_SLOTS
+#define MAX_DIMMS MAX_SOCKETS /*every sockets can plug one DIMM */
+/*the most number of RANKs on a DIMM*/
+#define MAX_RANKS MAX_SOCKETS*2
+
+struct mem_controller {
+ u8 channel0[MAX_DIMMS];
+};
+
+static const struct mem_controller ctrl = {
+ .channel0 = {0x50, 0x51},
+};
+
+typedef struct _DRAM_CONFIG_DATA {
+ u8 DramClk;
+ u8 DramTiming;
+ u8 CasLatency;
+ u8 BankIntlv;
+ u8 Trp;
+ u8 Tras;
+ u8 Trcd;
+ u8 Trfc;
+ u8 Trrd;
+ u8 Trtp;
+ u8 Twtr;
+ u8 Twr;
+
+ u8 CmdRate;
+ u8 DualEn;
+ //u8 IntLv0;
+ //u8 IntLv1;
+ //u8 Ba0Sel;
+ //u8 Ba1Sel;
+ //u8 Ba2Sel;
+ u8 BaScmb;
+ u8 DrdyTiming;
+ //u8 Above4G;
+ //u8 RdsaitMode;
+ //u8 Rdsait;
+ //u8 TopPerf;
+
+ u16 UMASize;
+} DRAM_CONFIG_DATA;
+
+/*DIMM(assembly) information*/
+typedef struct _DIMM_INFO_tag {
+ u8 bPresence;
+ u8 SPDDataBuf[SPD_DATA_SIZE]; /*get all information from spd data */
+} DIMM_INFO;
+
+typedef struct _DRAM_SYS_ATTR_tag {
+ DIMM_INFO DimmInfo[MAX_DIMMS];
+
+ u8 RankPresentMap; /*bit0,1 Rank0,1 on DIMM0, bit2,3 Rank2,3 on DIMM1,
+ bit4,5 Rank4,5 on DIMM2, bit6,7 Rank6,7 on DIMM3 */
+ u8 DimmNumChA; /*Dimm number */
+ u8 DimmNumChB;
+ u8 RankNumChA; /*the number of Ranks on the mortherbaord */
+ u8 RankNumChB;
+ u8 LoadNumChA; /*the number of chips on all DIMM */
+ u8 LoadNumChB;
+
+ u8 DramType; /*DDR1 or DDR2 */
+ u16 DramFreq;
+ u16 DramCyc; /*10ns, 7.5ns, 6ns, 5ns, 3.75ns, 3ns, 2.5ns =1/SysFreq, unit: 100*ns. */
+
+ //u16 HFreq; /*100, 133, 166, 200, 266, 333, 400*/
+
+ u8 CL; /* CAS lantency */
+ u8 CmdRate; /*1T or 2T */
+
+ u32 RankSize[MAX_RANKS];
+ u8 Dual_Channel;
+ DRAM_CONFIG_DATA ConfigData;
+ u8 reserved[4];
+
+} DRAM_SYS_ATTR;
+
+typedef struct _DRAM_SIZE_INFO {
+ u32 RankLength[MAX_RANKS];
+} DRAM_SIZE_INFO;
+
+//detection.c
+/*Step1 detect DRAM type, Read SPD data,command rate*/
+CB_STATUS DRAMDetect(DRAM_SYS_ATTR * DramAttr);
+//freq_setting.c
+/*Step2 set Frequency, calculate CAL*/
+void DRAMFreqSetting(DRAM_SYS_ATTR * DramAttr);
+//timing_setting.c
+/*Step3 Set DRAM Timing*/
+void DRAMTimingSetting(DRAM_SYS_ATTR * DramAttr);
+//drdy_bl.c
+/*Step4 DRDY*/
+void DRAMDRDYSetting(DRAM_SYS_ATTR * DramAttr);
+//drdy_bl.c
+/*Step5 Burst Length*/
+void DRAMBurstLength(DRAM_SYS_ATTR * DramAttr);
+//driving_setting.c
+/*Step6 DRAM Driving Adjustment*/
+void DRAMDriving(DRAM_SYS_ATTR * DramAttr);
+
+//clk_ctrl.c
+/*Step7 duty cycle control*/
+void DutyCycleCtrl(DRAM_SYS_ATTR * DramAttr);
+//clk_ctrl.c
+/*Step8 DRAM clock phase and delay control*/
+void DRAMClkCtrl(DRAM_SYS_ATTR * DramAttr);
+
+//dev_init.c
+/*Step9 set register before init DRAM device*/
+void DRAMRegInitValue(DRAM_SYS_ATTR * DramAttr);
+
+//dev_init.c
+/*Step10 DDR and DDR2 initialize process*/
+void DRAMInitializeProc(DRAM_SYS_ATTR * DramAttr);
+
+//dqs_search.c
+/*Step11 Search DQS and DQ output delay*/
+void DRAMDQSOutputSearch(DRAM_SYS_ATTR * DramAttr);
+
+//dqs_search.c
+/*Step12 Search DQS input delay*/
+void DRAMDQSInputSearch(DRAM_SYS_ATTR * DramAttr);
+
+//rank_map.c
+/*Step13 Interleav function in rankmap.c*/
+void DRAMBankInterleave(DRAM_SYS_ATTR * DramAttr);
+
+//rank_map.c
+/*Step14 Sizing*/
+void DRAMSizingMATypeM(DRAM_SYS_ATTR * DramAttr);
+
+
+//final_setting.c
+/*Step15 DDR fresh counter setting*/
+void DRAMRefreshCounter(DRAM_SYS_ATTR * DramAttr);
+
+//final_setting.c
+/*Step16 Final register setting for improve performance*/
+void DRAMRegFinalValue(DRAM_SYS_ATTR * DramAttr);
+
+
+/*set UMA*/
+void SetUMARam();
+
+CB_STATUS InstallMemory(DRAM_SYS_ATTR * DramAttr, u32 RamSize);
+CB_STATUS DDR2_DRAM_INIT();
+
+#endif
Copied: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/dram_util.c (from rev 4313, trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/DramUtil.c)
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/dram_util.c (rev 0)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/dram_util.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -0,0 +1,249 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2009 One Laptop per Child, Association, Inc.
+ *
+ * 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
+ */
+
+void WaitMicroSec(UINTN MicroSeconds)
+{
+ u32 i;
+
+ for (i = 0; i < 1024 * MicroSeconds; i++) {
+ __asm__ volatile ("nop\n\t");
+ }
+
+ return;
+}
+
+/*===================================================================
+Function : via_write_phys()
+Precondition :
+Input : addr
+ value
+Output : void
+Purpose :
+Reference : None
+===================================================================*/
+
+void via_write_phys(volatile u32 addr, volatile u32 value)
+{
+ volatile u32 *ptr;
+ ptr = (volatile u32 *) addr;
+ *ptr = (volatile u32) value;
+}
+
+/*===================================================================
+Function : via_read_phys()
+Precondition :
+Input : addr
+Output : u32
+Purpose :
+Reference : None
+===================================================================*/
+
+u32 via_read_phys(volatile u32 addr)
+{
+ volatile u32 *ptr;
+ volatile u32 y;
+// ptr = (volatile u32 *)addr;
+ y = *(volatile u32 *) addr;
+// return *ptr;
+ return y;
+}
+
+
+/*===================================================================
+Function : DimmRead()
+Precondition :
+Input : x
+Output : u32
+Purpose :
+Reference : None
+===================================================================*/
+
+u32 DimmRead(volatile u32 x)
+{ // volatile u32 z;
+ volatile u32 y;
+ y = *(volatile u32 *) x;
+
+ return y;
+}
+
+
+/*===================================================================
+Function : DramBaseTest()
+Precondition : this function used to verify memory
+Input :
+ BaseAdd,
+ length,
+ mode
+Output : u32
+Purpose :write into and read out to verify if dram is correct
+Reference : None
+===================================================================*/
+BOOLEAN DramBaseTest(u32 BaseAdd, u32 Length,
+ DRAM_TEST_MODE Mode, BOOLEAN PrintFlag)
+{
+ u32 TestSpan;
+ u32 Data, Address, Address2;
+ u8 i, TestCount;
+
+ //decide the test mode is continous or step
+ if (Mode == EXTENSIVE) {
+ //the test mode is continuos and must test each unit
+ TestSpan = 4;
+ TestCount = 1;
+ } else if (Mode == SPARE) {
+ // the test mode is step and test some unit
+ TestSpan = STEPSPAN;
+ TestCount = TESTCOUNT;
+ } else {
+ PRINT_DEBUG_MEM("the test mode is error\r");
+ return FALSE;
+ }
+
+ //write each test unit the value with TEST_PATTERN
+ for (Address = BaseAdd; Address < BaseAdd + Length;
+ Address += TestSpan) {
+ for (i = 0; i < TestCount; i++)
+ via_write_phys(Address + i * 4, TEST_PATTERN);
+ if (PrintFlag) {
+ if ((u32) Address % 0x10000000 == 0) {
+ PRINT_DEBUG_MEM("Write in Addr =");
+ PRINT_DEBUG_MEM_HEX32(Address);
+ PRINT_DEBUG_MEM("\r");
+ }
+ }
+ }
+
+ //compare each test unit with the value of TEST_PATTERN
+ //and write it with compliment of TEST_PATTERN
+ for (Address = BaseAdd; Address < BaseAdd + Length;
+ Address += TestSpan) {
+ for (i = 0; i < TestCount; i++) {
+ Data = via_read_phys(Address + i * 4);
+ via_write_phys(Address + i * 4,
+ (u32) (~TEST_PATTERN));
+ if (Data != TEST_PATTERN) {
+ PRINT_DEBUG_MEM
+ ("TEST_PATTERN ERROR !!!!! ");
+ Address2 = Address + i * 4;
+ PRINT_DEBUG_MEM_HEX32(Address2);
+ PRINT_DEBUG_MEM(" : ");
+ PRINT_DEBUG_MEM_HEX32(Data);
+ PRINT_DEBUG_MEM(" \r");
+ return FALSE;
+ }
+ }
+ if (PrintFlag) {
+ if ((u32) Address % 0x10000000 == 0) {
+ PRINT_DEBUG_MEM("Write in Addr =");
+ PRINT_DEBUG_MEM_HEX32(Address);
+ PRINT_DEBUG_MEM("\r");
+ }
+ }
+ }
+
+
+ //compare each test unit with the value of ~TEST_PATTERN
+ for (Address = BaseAdd; Address < BaseAdd + Length;
+ Address += TestSpan) {
+ for (i = (u8) (TestCount); i > 0; i--) {
+ Data = via_read_phys(Address + (i - 1) * 4);
+ if (Data != ~TEST_PATTERN) {
+
+ PRINT_DEBUG_MEM
+ ("~TEST_PATTERN ERROR !!!!! ");
+ Address2 = Address + (i - 1) * 4;
+ PRINT_DEBUG_MEM_HEX32(Address2);
+ PRINT_DEBUG_MEM(" : ");
+ PRINT_DEBUG_MEM_HEX32(Data);
+ PRINT_DEBUG_MEM(" \r");
+ return FALSE;
+ }
+ }
+ }
+
+ return TRUE;
+}
+
+/*===================================================================
+Function : DumpRegisters()
+Precondition :
+Input :
+ pPCIPPI,
+ DevNum,
+ FuncNum
+Output : Void
+Purpose :
+Reference : None
+===================================================================*/
+
+void DumpRegisters(INTN DevNum, INTN FuncNum)
+{
+ INTN i, j;
+ u8 ByteVal;
+
+ ByteVal = 0;
+ //pci_write_config8(PCI_DEV(0, DevNum, FuncNum), 0xA1, ByteVal);
+ PRINT_DEBUG_MEM("\rDev %02x Fun %02x\r");
+ PRINT_DEBUG_MEM
+ ("\r 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f\r");
+ PRINT_DEBUG_MEM
+ ("---------------------------------------------------\r");
+ for (i = 0; i < 0x10; i++) {
+ PRINT_DEBUG_MEM_HEX32(i);
+ for (j = 0; j < 0x10; j++) {
+ ByteVal =
+ pci_read_config8(PCI_DEV(0, DevNum, FuncNum),
+ i * 0x10 + j);
+ PRINT_DEBUG_MEM_HEX8(ByteVal);
+ PRINT_DEBUG_MEM(" ");
+
+ }
+ PRINT_DEBUG_MEM("\r");
+ }
+ return;
+}
+
+
+/*===================================================================
+Function : dumpnorth()
+Precondition :
+Input :
+ pPCIPPI,
+ Func
+Output : Void
+Purpose :
+Reference : None
+===================================================================*/
+
+void dumpnorth(u8 Func)
+{
+ u16 r, c;
+ u8 ByteVal;
+ PRINT_DEBUG_MEM("Dump North!!!\r");
+ for (r = 0; r < 32; r++) {
+ for (c = (u16) (r << 3); c < (r << 3) + 8; c++) {
+ ByteVal = 0;
+ ByteVal = pci_read_config8(PCI_DEV(0, 0, Func), c);
+ PRINT_DEBUG_MEM_HEX16(c);
+ PRINT_DEBUG_MEM("= ");
+ PRINT_DEBUG_MEM_HEX8(ByteVal);
+ }
+ PRINT_DEBUG_MEM("\r");
+ }
+}
Copied: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/dram_util.h (from rev 4313, trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/DramUtil.h)
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/dram_util.h (rev 0)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/dram_util.h 2009-05-27 13:46:37 UTC (rev 4314)
@@ -0,0 +1,47 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2009 One Laptop per Child, Association, Inc.
+ *
+ * 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
+ */
+
+#ifndef __DRAM_UTIL_H__
+#define __DRAM_UTIL_H__
+
+#define STEPSPAN 0x1000 //the span when test memory in spare mode
+#define TESTCOUNT 0x4 // the test count in each range when test memory in spare mode
+#define TEST_PATTERN 0x5A5A5A5A //the test pattern
+
+typedef enum __DRAM_TEST_MODE {
+ EXTENSIVE,
+ SPARE,
+ MAXMODE
+} DRAM_TEST_MODE;
+
+void WaitMicroSec(UINTN MicroSeconds);
+
+void via_write_phys(u32 addr, u32 value);
+
+u32 via_read_phys(u32 addr);
+
+u32 DimmRead(u32 x);
+
+BOOLEAN DramBaseTest(u32 BaseAdd, u32 Length,
+ DRAM_TEST_MODE mode, BOOLEAN PrintFlag);
+
+void DumpRegisters(INTN DevNum, INTN FuncNum);
+
+void dumpnorth(u8 Func);
+#endif
Copied: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/translator_ddr2_init.c (from rev 4313, trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/Translatorddr2init.c)
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/translator_ddr2_init.c (rev 0)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/translator_ddr2_init.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -0,0 +1,34 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2009 One Laptop per Child, Association, Inc.
+ *
+ * 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
+ */
+
+#define CB_SUCCESS 0x0
+#define CB_INVALID_PARAMETER 0x2
+#define CB_NOT_READY 0x6
+#define CB_DEVICE_ERROR 0x7
+#define TRUE 1
+#define FALSE 0
+
+
+typedef int8_t INT8;
+typedef unsigned long uintn_t;
+typedef uintn_t UINTN;
+typedef long intn_t;
+typedef intn_t INTN;
+typedef UINTN CB_STATUS;
+typedef uint8_t BOOLEAN;
Deleted: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/ClkCtrl.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/ClkCtrl.c 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/ClkCtrl.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -1,312 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2009 One Laptop per Child, Association, Inc.
- *
- * 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
- */
-
-void DutyCycleCtrl(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- u8 FreqId;
- u8 i;
-
- if (DIMMFREQ_800 == DramAttr->DramFreq)
- FreqId = 2;
- else if (DIMMFREQ_667 == DramAttr->DramFreq)
- FreqId = 3;
- else if (DIMMFREQ_533 == DramAttr->DramFreq)
- FreqId = 4;
- else if (DIMMFREQ_400 == DramAttr->DramFreq)
- FreqId = 5;
- else
- FreqId = 5;
-
- if (DramAttr->RankNumChA > 0) { // 1 rank
- for (i = 0; i < DUTY_CYCLE_REG_NUM; i++) {
- Data =
- pci_read_config8(MEMCTRL,
- ChA_Duty_Control_DDR2[i][0]);
- Data &= ChA_Duty_Control_DDR2[i][1]; /*Mask */
- Data |= ChA_Duty_Control_DDR2[i][FreqId]; /*set Value */
- pci_write_config8(MEMCTRL,
- ChA_Duty_Control_DDR2[i][0],
- Data);
- }
- }
- if (1 == ENABLE_CHC) { // 1 rank
- for (i = 0; i < DUTY_CYCLE_REG_NUM; i++) {
- Data =
- pci_read_config8(MEMCTRL,
- ChB_Duty_Control_DDR2[i][0]);
- Data &= ChB_Duty_Control_DDR2[i][1]; /*Mask */
- Data |= ChB_Duty_Control_DDR2[i][FreqId]; /*set Value */
- pci_write_config8(MEMCTRL,
- ChB_Duty_Control_DDR2[i][0],
- Data);
- }
- }
-
-}
-
-/*
-DRAM clock phase and delay control
-*/
-//sub routine list
-void ClkPhsCtrlFBMDDR2(DRAM_SYS_ATTR * DramAttr);
-
-void WrtDataPhsCtrl(DRAM_SYS_ATTR * DramAttr);
-
-void DQDQSOutputDlyCtrl(DRAM_SYS_ATTR * DramAttr);
-
-void DQSInputCaptureCtrl(DRAM_SYS_ATTR * DramAttr);
-
-void DCLKPhsCtrl(DRAM_SYS_ATTR * DramAttr);
-
-
-void DRAMClkCtrl(DRAM_SYS_ATTR * DramAttr)
-{
- /*write data clock phase control */
- WrtDataPhsCtrl(DramAttr);
- /*clock phase control */
- ClkPhsCtrlFBMDDR2(DramAttr);
- /**/ DQDQSOutputDlyCtrl(DramAttr);
- /**/ DQSInputCaptureCtrl(DramAttr);
- DCLKPhsCtrl(DramAttr);
-}
-
-void ClkPhsCtrlFBMDDR2(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
-
- u8 FreqId, i;
-
- if (DramAttr->DramFreq == DIMMFREQ_800)
- FreqId = 2;
- else if (DramAttr->DramFreq == DIMMFREQ_667)
- FreqId = 3;
- else if (DramAttr->DramFreq == DIMMFREQ_533)
- FreqId = 4;
- else if (DramAttr->DramFreq == DIMMFREQ_400)
- FreqId = 5;
- else
- FreqId = 5;
- /*channel A */// 2~4 Rank
- if (DramAttr->RankNumChA == 1) { // 1 rank
- for (i = 0; i < 3; i++) {
- Data =
- pci_read_config8(MEMCTRL,
- DDR2_ChA_Clk_Phase_Table_1R[i]
- [0]);
- Data &= DDR2_ChA_Clk_Phase_Table_1R[i][1]; /*Mask */
- Data |= DDR2_ChA_Clk_Phase_Table_1R[i][FreqId]; /*set Value */
- pci_write_config8(MEMCTRL,
- DDR2_ChA_Clk_Phase_Table_1R[i]
- [0], Data);
- }
- } else if (DramAttr->RankNumChA > 1) { // 2~4 Rank
- for (i = 0; i < 3; i++) {
- Data =
- pci_read_config8(MEMCTRL,
- DDR2_ChA_Clk_Phase_Table_2R[i]
- [0]);
- Data &= DDR2_ChA_Clk_Phase_Table_2R[i][1]; /*Mask */
- Data |= DDR2_ChA_Clk_Phase_Table_2R[i][FreqId]; /*set Value */
- pci_write_config8(MEMCTRL,
- DDR2_ChA_Clk_Phase_Table_2R[i]
- [0], Data);
- }
- }
-#if ENABLE_CHB
- if (DramAttr->RankNumChB > 0) { // 1 rank
- for (i = 0; i < 3; i++) {
- Data =
- pci_read_config8(MEMCTRL,
- DDR2_ChB_Clk_Phase_Table_1R[i]
- [0]);
- Data &= DDR2_ChB_Clk_Phase_Table_1R[i][1]; /*Mask */
- Data |= DDR2_ChB_Clk_Phase_Table_1R[i][FreqId]; /*set Value */
- pci_write_config8(MEMCTRL,
- DDR2_ChB_Clk_Phase_Table_1R[i]
- [0], Data);
- }
- }
-#endif
-}
-
-void WrtDataPhsCtrl(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- u8 FreqId, i;
-
-
- if (DIMMFREQ_800 == DramAttr->DramFreq)
- FreqId = 2;
- else if (DIMMFREQ_667 == DramAttr->DramFreq)
- FreqId = 3;
- else if (DIMMFREQ_533 == DramAttr->DramFreq)
- FreqId = 4;
- else if (DIMMFREQ_400 == DramAttr->DramFreq)
- FreqId = 5;
- else
- FreqId = 5;
-
- if (DramAttr->RankNumChA > 0) { // 1 rank
- for (i = 0; i < WrtData_REG_NUM; i++) {
- Data =
- pci_read_config8(MEMCTRL,
- DDR2_ChA_WrtData_Phase_Table
- [i][0]);
- Data &= DDR2_ChA_WrtData_Phase_Table[i][1]; /*Mask */
- Data |= DDR2_ChA_WrtData_Phase_Table[i][FreqId]; /*set Value */
- pci_write_config8(MEMCTRL,
- DDR2_ChA_WrtData_Phase_Table[i]
- [0], Data);
- }
- }
-#if ENABLE_CHB
- if (DramAttr->RankNumChB > 0) { // 1 rank
- for (i = 0; i < WrtData_REG_NUM; i++) {
- Data =
- pci_read_config8(MEMCTRL,
- DDR2_ChB_WrtData_Phase_Table
- [i][0]);
- Data &= DDR2_ChB_WrtData_Phase_Table[i][1]; /*Mask */
- Data |= DDR2_ChB_WrtData_Phase_Table[i][FreqId]; /*set Value */
- pci_write_config8(MEMCTRL,
- DDR2_ChB_WrtData_Phase_Table[i]
- [0], Data);
- }
- }
-#endif
- Data = pci_read_config8(MEMCTRL, 0x8C);
- Data &= 0xFC;
- Data |= 0x03;
- pci_write_config8(MEMCTRL, 0x8C, Data);
-}
-
-void DQDQSOutputDlyCtrl(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- u8 FreqId;
-
- if (DIMMFREQ_400 == DramAttr->DramFreq)
- FreqId = 0;
- else if (DIMMFREQ_533 == DramAttr->DramFreq)
- FreqId = 1;
- else if (DIMMFREQ_667 == DramAttr->DramFreq)
- FreqId = 2;
- else if (DIMMFREQ_800 == DramAttr->DramFreq)
- FreqId = 2;
- else
- FreqId = 0;
- if (DramAttr->RankNumChA > 0) {
- Data = DDR2_CHA_DQ_DQS_Delay_Table[FreqId][0];
- pci_write_config8(MEMCTRL, 0xf0, Data);
-
- Data = DDR2_CHA_DQ_DQS_Delay_Table[FreqId][1];
- pci_write_config8(MEMCTRL, 0xf1, Data);
-
- Data = DDR2_CHA_DQ_DQS_Delay_Table[FreqId][2];
- pci_write_config8(MEMCTRL, 0xf2, Data);
-
- Data = DDR2_CHA_DQ_DQS_Delay_Table[FreqId][3];
- pci_write_config8(MEMCTRL, 0xf3, Data);
- }
-#if ENABLE_CHB
- if (DramAttr->RankNumChB > 0) {
- Data = DDR2_CHB_DQ_DQS_Delay_Table[FreqId][0];
- pci_write_config8(MEMCTRL, 0xf4, Data);
-
- Data = DDR2_CHB_DQ_DQS_Delay_Table[FreqId][1];
- pci_write_config8(MEMCTRL, 0xf5, Data);
-
- Data = DDR2_CHB_DQ_DQS_Delay_Table[FreqId][2];
- pci_write_config8(MEMCTRL, 0xf6, Data);
-
- Data = DDR2_CHB_DQ_DQS_Delay_Table[FreqId][3];
- pci_write_config8(MEMCTRL, 0xf7, Data);
- }
-#endif
-}
-
-void DQSInputCaptureCtrl(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- u8 FreqId, i;
-
- if (DIMMFREQ_800 == DramAttr->DramFreq)
- FreqId = 2;
- else if (DIMMFREQ_667 == DramAttr->DramFreq)
- FreqId = 3;
- else if (DIMMFREQ_533 == DramAttr->DramFreq)
- FreqId = 4;
- else if (DIMMFREQ_400 == DramAttr->DramFreq)
- FreqId = 5;
- else
- FreqId = 2;
-
- Data = 0x8A;
- pci_write_config8(MEMCTRL, 0x77, Data);
-
- if (DramAttr->RankNumChA > 0) { // 1 rank
- for (i = 0; i < DQS_INPUT_CAPTURE_REG_NUM; i++) {
- Data =
- pci_read_config8(MEMCTRL,
- DDR2_ChA_DQS_Input_Capture_Tbl
- [i][0]);
- Data &= DDR2_ChA_DQS_Input_Capture_Tbl[i][1]; /*Mask */
- Data |= DDR2_ChA_DQS_Input_Capture_Tbl[i][FreqId]; /*set Value */
- pci_write_config8(MEMCTRL,
- DDR2_ChA_DQS_Input_Capture_Tbl[i]
- [0], Data);
- }
- }
-#if ENABLE_CHB
- if (DramAttr->RankNumChB > 0) { // 1 rank
- for (i = 0; i < DQS_INPUT_CAPTURE_REG_NUM; i++) {
- Data =
- pci_read_config8(MEMCTRL,
- DDR2_ChB_DQS_Input_Capture_Tbl
- [i][0]);
- Data &= DDR2_ChB_DQS_Input_Capture_Tbl[i][1]; /*Mask */
- Data |= DDR2_ChB_DQS_Input_Capture_Tbl[i][FreqId]; /*set Value */
- pci_write_config8(MEMCTRL,
- DDR2_ChB_DQS_Input_Capture_Tbl[i]
- [0], Data);
- }
- }
-#endif
-}
-
-//This is very important, if you don't set it correctly, dram will be unreliable
-//set DCLK Phase control(Reg99H[6:1]) according the DDRII in the dimm
-void DCLKPhsCtrl(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
-
- Data = 0;
- Data = pci_read_config8(MEMCTRL, 0x99);
- Data &= 0xE1;
- //DDR in Dimm1, MCLKOA[4,3,0] will output MCLK
- if (DramAttr->RankPresentMap & 0x03)
- Data |= 0x09 << 1;
- //DDR in Dimm2, MCLKOA[5,2,1] will output MCLK
- if (DramAttr->RankPresentMap & 0x0C)
- Data |= 0x06 << 1;
-
- pci_write_config8(MEMCTRL, 0x99, Data);
-
-}
Deleted: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/DQSSearch.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/DQSSearch.c 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/DQSSearch.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -1,98 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2009 One Laptop per Child, Association, Inc.
- *
- * 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
- */
-
-void SetDQSOutputCHA(DRAM_SYS_ATTR * DramAttr);
-void SetDQSOutputCHB(DRAM_SYS_ATTR * DramAttr);
-
-/*===================================================================
-Function : DRAMDQSOutputSearchCHA()
-Precondition :
-Input :
- DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
- in MotherBoard
-Output : Void
-Purpose : set DQS output delay register reg70 and DQ output delay register reg71
-===================================================================*/
-
-#define CH_A 0
-#define CH_B 1
-void DRAMDQSOutputSearch(DRAM_SYS_ATTR * DramAttr)
-{
- if (DramAttr->RankNumChA > 0)
- SetDQSOutputCHA(DramAttr);
-}
-
-/*===================================================================
-Function : SetDQSOutputCHA()
-Precondition :
-Input :
- DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
- in MotherBoard
-Output : Void
-Purpose : according the frequence set CHA DQS output
-===================================================================*/
-void SetDQSOutputCHA(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Reg70, Reg71;
- u8 Index;
-
- if (DramAttr->DramFreq == DIMMFREQ_400)
- Index = 3;
- else if (DramAttr->DramFreq == DIMMFREQ_533)
- Index = 2;
- else if (DramAttr->DramFreq == DIMMFREQ_667)
- Index = 1;
- else if (DramAttr->DramFreq == DIMMFREQ_800)
- Index = 0;
- else
- Index = 3;
-
- if (DramAttr->RankNumChA > 2) {
- Reg70 = Fixed_DQSA_3_4_Rank_Table[Index][0];
- Reg71 = Fixed_DQSA_3_4_Rank_Table[Index][1];
- } else {
- Reg70 = Fixed_DQSA_1_2_Rank_Table[Index][0];
- Reg71 = Fixed_DQSA_1_2_Rank_Table[Index][1];
- }
- pci_write_config8(MEMCTRL, 0x70, Reg70);
- pci_write_config8(MEMCTRL, 0x71, Reg71);
-}
-
-
-//################
-// STEP 12 #
-//################
-
-/*===================================================================
-Function : DRAMDQSInputSearch()
-Precondition :
-Input :
- DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
- in MotherBoard
-Output : Void
-Purpose : search DQS input delay for CHA/CHB
-===================================================================*/
-
-void DRAMDQSInputSearch(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- //auto mode
- Data = 0x0;
- pci_write_config8(MEMCTRL, 0x77, Data);
-}
Deleted: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/DRDY_BL.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/DRDY_BL.c 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/DRDY_BL.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -1,600 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2009 One Laptop per Child, Association, Inc.
- *
- * 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
- */
-
-// Set P6IF DRDY Timing
-// Because there are 1.5T & 2.5T CAS latency in DDR1 mode, we need to use RDELAYMD-0
-//
-// Entry:
-// EBP[29:25] = DRAM Speed, Dual_Channel
-// VIA_NB2HOST_REG54[7:5] Host Frequency
-// VIA_NB3DRAM_REG62[2:0] CAS Latency
-//
-// Modify NB_Reg:
-// VIA_NB2HOST_REG54[3,1]
-// VIA_NB2HOST_REG55[1]
-// VIA_NB2HOST_REG60
-// VIA_NB2HOST_REG61
-// VIA_NB2HOST_REG62[3:0]
-// VIA_NB2HOST_REG63
-// VIA_NB2HOST_REG64
-// VIA_NB2HOST_REG65[3:0]
-// VIA_NB2HOST_REG66
-// VIA_NB2HOST_REG67[5:4]
-//
-// Processing:
-//--------------------------------------------------------------------------
-// P6IF DRDY Timing Control:
-// *Following algorithm to set DRDY timing
-// Set P6IF DRDY Timing by the following 3 conditions:
-// 1. RDELAYMD
-// a.RDRPH(MD input internal timing control)
-// b.CAS Latency
-// RDELAYMD(1bit) = bit0 of (CL + RDRPH)
-// for example: RDRPH=10b, CL3 -> F3_Rx56[5:4]=11b, 10b + 11b = 101b, RDELAYMD=1 (bit0)
-// RDRPH=00b, CL2.5 -> F3_Rx56[5:4]=10b, 00b + 10b = 010b, RDELAYMD=0 (bit0)
-// 2. CPU Frequency
-// 3. DRAM Frequency
-//
-// According to above conditions, we create different tables:
-// 1. RDELAYMD=0 : for integer CAS latency(ex. CL=3)
-// 2. RDELAYMD=1 : for non-integer CAS latency(ex. CL=2.5)
-// 3. Normal performance
-// 4. Top performance :
-// Using phase0 to a case has better performance.
-//
-// Note: The setting are related to performance and maybe affect DRAM initialize.
-// Turn OFF(F2_Rx51[7]=0) this feature at csDRAMRegInitValueJ procedure.
-// Turn ON(F2_Rx51[7]=1) this feature at csDRAMRegFinalValueJ procedure.
-//
-// If F2_Rx51[7]=0, then CPU always wait 8QW, a slower but most stable way
-// If F2_Rx51[7]=1, then the timing will refer to F2_Rx60 ~ F2_Rx67,
-// a fast way but may cause the system to be unstable.
-//
-// Coding:
-// 1. RDELAYMD and user's option for performance can determine which table
-// 2. CPU Frequency can get block offset of table
-// 3. DRAM Frequency can get row offset of block
-// 4. Set value
-//
-// PS: Fun2 Rx62, Rx65, Rx67 are don't care bits in 3296, CPU 266MHz doesn't be supported by 3296,
-// but I still keep these bits in table to avoid the usage in future
-// and do the fewest modification for code.
-//
-
-// Early 3T
-// Early 3T
-#define P6IF_Misc_RFASTH 0x08
-#define P6IF_Misc2_RRRDYH3E 0x10
-#define P6IF_Misc2_RHTSEL 0x02
-
-#define Rx54E3T P6IF_Misc_RFASTH
-#define Rx55E3T P6IF_Misc2_RRRDYH3E
-
-// Early 2T
-#define Rx54E2T 0x00
-#define Rx55E2T P6IF_Misc2_RRRDYH3E
-
-// Early 1T
-#define Rx54E1T 0x00
-#define Rx55E1T 0x00
-
-// Early 0T
-#define Rx54E0T P6IF_Misc_RFASTH
-#define Rx55E0T P6IF_Misc2_RRRDYH3E + P6IF_Misc2_RHTSEL
-
-// Latter 1T
-#define Rx54L1T P6IF_Misc_RFASTH
-#define Rx55L1T P6IF_Misc2_RHTSEL
-
-
-#define PH0_0_0_0 0x00
-#define PH0_0_0_1 0x01
-#define PH0_0_0_2 0x02
-#define PH0_0_0_3 0x03
-#define PH0_0_1_0 0x04
-#define PH0_0_1_1 0x05
-#define PH0_0_1_2 0x06
-#define PH0_0_2_1 0x09
-#define PH0_0_2_2 0x0a
-#define PH0_0_2_3 0x0b
-#define PH0_0_3_2 0x0e
-#define PH0_0_3_3 0x0f
-#define PH0_1_1_0 0x14
-#define PH0_1_1_1 0x15
-#define PH0_2_1_2 0x26
-#define PH0_2_2_1 0x29
-#define PH0_2_2_2 0x2a
-#define PH0_2_2_3 0x2b
-#define PH0_2_3_2 0x2e
-#define PH0_2_3_3 0x2f
-#define PH0_3_2_2 0x3a
-#define PH0_3_3_3 0x3f
-#define PH1_0_0_0 0x40
-#define PH1_0_0_1 0x41
-#define PH1_0_1_1 0x45
-#define PH1_1_1_1 0x55
-#define PH1_2_1_1 0x65
-#define PH1_2_2_1 0x69
-#define PH2_1_1_1 0x95
-#define PH2_1_2_1 0x99
-#define PH2_1_2_2 0x9a
-#define PH2_2_1_2 0xa6
-#define PH2_2_2_1 0xa9
-#define PH2_2_2_2 0xaa
-#define PH2_2_3_2 0xae
-#define PH2_2_3_3 0xaf
-#define PH2_3_2_2 0xba
-#define PH2_3_2_3 0xbb
-#define PH2_3_3_2 0xbe
-#define PH3_2_2_3 0xeb
-#define PH3_2_3_2 0xee
-#define PH3_2_3_3 0xef
-#define PH3_3_3_3 0xff
-
-#define PT894_RDRDY_TBL_Width 10
-#define PT894_RDRDY_TBL_Block 60
-
-static const u8 PT894_128bit_DELAYMD0_RCONV0[6][6][PT894_RDRDY_TBL_Width] =
-// -----------------------------------------------------------------------------------------------------------------
-// RX60 RX61 RX62 RX63 RX64 RX65 RX66 RX67 RX54[3,1] RX55[3,1] CPU/DRAM
-// LN4:1 LN8:5 LN10:9 QW4:1 QW8:5 QW10:9 WS8:1 WS10:9 RFASTH RRRDYH3E
-// RCONV RHTSEL
-// -----------------------------------------------------------------------------------------------------------------
-{
-// cpu100
- {
- {PH0_1_1_1, PH0_0_0_0, PH0_0_0_0, PH0_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/100
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/133
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/166
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/200
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/266
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 100/333
- },
-// cpu133
- {
- {PH0_2_2_1, PH0_0_0_0, PH0_0_0_0, PH0_2_2_1, PH0_0_0_0, PH0_0_0_0, 0x01, 0x00, Rx54E3T, Rx55E3T}, // 133/100
- {PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/133
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/166
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/200
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/266
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 133/333
- },
-// cpu200
- {
- {PH0_3_3_3, PH0_0_0_0, PH0_0_0_0, PH0_2_2_2, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E2T, Rx55E2T}, // 200/100
- {PH2_3_2_3, PH0_0_0_0, PH0_0_0_0, PH2_3_2_3, PH0_0_0_0, PH0_0_0_0, 0x0a, 0x00, Rx54E3T, Rx55E3T}, // 200/133
- {PH1_2_2_1, PH0_0_0_1, PH0_0_0_0, PH1_2_2_1, PH0_0_0_1, PH0_0_0_0, 0x01, 0x00, Rx54E3T, Rx55E3T}, // 200/166
- {PH1_1_1_1, PH0_0_1_1, PH0_0_0_0, PH1_1_1_1, PH0_0_1_1, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 200/200
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 200/266
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 200/333
- },
-// cpu166
- {
- {PH0_2_3_3, PH0_0_0_0, PH0_0_0_0, PH0_2_2_3, PH0_0_0_0, PH0_0_0_0, 0x05, 0x00, Rx54E3T, Rx55E3T}, // 166/100
- {PH1_2_2_1, PH0_0_0_0, PH0_0_0_0, PH1_2_2_1, PH0_0_0_0, PH0_0_0_0, 0x01, 0x00, Rx54E3T, Rx55E3T}, // 166/133
- {PH1_1_1_1, PH0_0_0_1, PH0_0_0_0, PH1_1_1_1, PH0_0_0_1, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 166/166
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 166/200
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 166/266
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 166/333
- },
-// cpu266
- {
- {PH0_2_2_3, PH0_0_0_0, PH0_0_0_0, PH0_0_1_1, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E1T, Rx55E1T}, // 266/100
- {PH3_3_3_3, PH0_0_0_0, PH0_0_0_0, PH2_2_2_2, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54E2T, Rx55E2T}, // 266/133
- {PH3_2_3_3, PH0_0_0_3, PH0_0_0_0, PH3_2_3_3, PH0_0_0_2, PH0_0_0_0, 0x0d, 0x00, Rx54E3T, Rx55E3T}, // 266/166
- {PH2_2_2_2, PH0_0_2_2, PH0_0_0_0, PH2_1_2_2, PH0_0_1_2, PH0_0_0_0, 0x12, 0x00, Rx54E3T, Rx55E3T}, // 266/200
- {PH1_1_1_1, PH1_1_1_1, PH0_0_0_0, PH1_1_1_1, PH1_1_1_1, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 266/266
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 266/333
- },
-// cpu333
- {
- {PH0_1_1_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E0T, Rx55E0T}, // 333/100
- {PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54E1T, Rx55E1T}, // 333/133
- {PH3_3_3_3, PH0_0_0_3, PH0_0_0_0, PH3_3_3_3, PH0_0_0_3, PH0_0_0_0, 0x1f, 0x00, Rx54E2T, Rx55E2T}, // 333/166
- {PH2_2_1_2, PH0_0_2_1, PH0_0_0_0, PH1_2_1_1, PH0_0_2_1, PH0_0_0_0, 0x36, 0x00, Rx54E2T, Rx55E2T}, // 333/200
- {PH2_1_1_1, PH2_1_1_1, PH0_0_0_0, PH2_1_1_1, PH2_1_1_1, PH0_0_0_0, 0x44, 0x00, Rx54E3T, Rx55E3T}, // 333/266
- {PH2_2_2_2, PH2_2_2_2, PH0_0_2_2, PH2_2_2_2, PH2_2_2_2, PH0_0_2_2, 0x00, 0x00, Rx54E3T, Rx55E3T} // 333/333
- }
-};
-
-static const u8 PT894_128bit_DELAYMD1_RCONV0[6][6][PT894_RDRDY_TBL_Width] =
-// -----------------------------------------------------------------------------------------------------------------
-// RX60 RX61 RX62 RX63 RX64 RX65 RX66 RX67 RX54[3,1] RX55[3,1] CPU/DRAM
-// LN4:1 LN8:5 LN10:9 QW4:1 QW8:5 QW10:9 WS8:1 WS10:9 RFASTH RRRDYH3E
-// RCONV RHTSEL
-// -----------------------------------------------------------------------------------------------------------------
-{
-// cpu100
- {
- {PH0_1_1_1, PH0_0_0_0, PH0_0_0_0, PH0_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/100
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/133
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/166
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/200
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/266
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 100/333
- },
-// cpu133
- {
- {PH0_3_2_2, PH0_0_0_0, PH0_0_0_0, PH0_3_2_2, PH0_0_0_0, PH0_0_0_0, 0x02, 0x00, Rx54E3T, Rx55E3T}, // 133/100
- {PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/133
- {PH1_0_0_0, PH0_0_0_0, PH0_0_0_0, PH1_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/166
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/200
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/266
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 133/333
- },
-// cpu200
- {
- {PH0_2_2_2, PH0_0_0_0, PH0_0_0_0, PH0_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E1T, Rx55E1T}, // 200/100
- {PH2_2_2_2, PH0_0_0_0, PH0_0_0_0, PH2_1_2_1, PH0_0_0_0, PH0_0_0_0, 0x0a, 0x00, Rx54E2T, Rx55E2T}, // 200/133
- {PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, 0x04, 0x00, Rx54E3T, Rx55E3T}, // 200/166
- {PH2_2_2_2, PH0_0_2_2, PH0_0_0_0, PH2_2_2_2, PH0_0_2_2, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 200/200
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 200/266
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 200/333
- },
-// cpu166
- {
- {PH0_2_2_2, PH0_0_0_0, PH0_0_0_0, PH0_2_1_2, PH0_0_0_0, PH0_0_0_0, 0x05, 0x00, Rx54E2T, Rx55E2T}, // 166/100
- {PH2_3_2_2, PH0_0_0_0, PH0_0_0_0, PH2_2_2_2, PH0_0_0_0, PH0_0_0_0, 0x02, 0x00, Rx54E3T, Rx55E3T}, // 166/133
- {PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 166/166
- {PH1_0_0_0, PH0_0_0_1, PH0_0_0_0, PH1_0_0_0, PH0_0_0_1, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 166/200
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 166/266
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 166/333
- },
-// cpu266
- {
- {PH0_1_1_1, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E0T, Rx55E0T}, // 266/100
- {PH2_2_2_2, PH0_0_0_0, PH0_0_0_0, PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54E1T, Rx55E1T}, // 266/133
- {PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, PH2_2_1_2, PH0_0_0_2, PH0_0_0_0, 0x15, 0x00, Rx54E2T, Rx55E2T}, // 266/166
- {PH3_2_3_3, PH0_0_2_3, PH0_0_0_0, PH2_2_3_2, PH0_0_2_3, PH0_0_0_0, 0x24, 0x00, Rx54E3T, Rx55E3T}, // 266/200
- {PH2_2_2_2, PH2_2_2_2, PH0_0_0_0, PH2_2_2_2, PH2_2_2_2, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 266/266
- {PH0_0_0_1, PH0_0_1_1, PH0_0_1_0, PH0_0_0_1, PH0_0_1_1, PH0_0_1_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 266/333
- },
-// cpu333
- {
- {PH0_3_2_2, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E0T, Rx55E0T}, // 333/100
- {PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54E0T, Rx55E0T}, // 333/133
- {PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, 0x1f, 0x00, Rx54E1T, Rx55E1T}, // 333/166
- {PH2_3_2_2, PH0_0_3_2, PH0_0_0_0, PH2_2_2_2, PH0_0_2_2, PH0_0_0_0, 0x1b, 0x00, Rx54E2T, Rx55E2T}, // 333/200
- {PH2_2_2_2, PH2_2_2_2, PH0_0_0_0, PH2_2_2_1, PH2_2_2_1, PH0_0_0_0, 0x88, 0x00, Rx54E3T, Rx55E3T}, // 333/266
- {PH2_2_2_2, PH2_2_2_2, PH0_0_2_2, PH2_2_2_2, PH2_2_2_2, PH0_0_2_2, 0x00, 0x00, Rx54E3T, Rx55E3T} // 333/333
- }
-};
-
-
-static const u8 PT894_64bit_DELAYMD0_RCONV0[6][6][PT894_RDRDY_TBL_Width] =
-// -----------------------------------------------------------------------------------------------------------------
-// RX60 RX61 RX62 RX63 RX64 RX65 RX66 RX67 RX54[3,1] RX55[3,1] CPU/DRAM
-// LN4:1 LN8:5 LN10:9 QW4:1 QW8:5 QW10:9 WS8:1 WS10:9 RFASTH RRRDYH3E
-// RCONV RHTSEL
-// -----------------------------------------------------------------------------------------------------------------
-{
-// cpu100
- {
- {PH0_2_2_2, PH0_0_0_0, PH0_0_0_0, PH0_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E3T, Rx55E3T}, // 100/100
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x09, 0x00, Rx54E3T, Rx55E3T}, // 100/133
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/166
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/200
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/266
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 100/333
- },
-// cpu133
- {
- {PH0_2_3_2, PH0_0_0_0, PH0_0_0_0, PH0_0_1_0, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E2T, Rx55E2T}, // 133/100
- {PH2_2_2_2, PH0_0_0_0, PH0_0_0_0, PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54E3T, Rx55E3T}, // 133/133
- {PH1_0_0_0, PH0_0_0_1, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E3T, Rx55E3T}, // 133/166
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/200
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/266
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 133/333
- },
-// cpu200
- {
- {PH0_3_3_3, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E0T, Rx55E0T}, // 200/100
- {PH2_2_2_2, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54E1T, Rx55E1T}, // 200/133
- {PH3_3_3_3, PH0_0_0_3, PH0_0_0_0, PH1_2_2_1, PH0_0_0_1, PH0_0_0_0, 0x1f, 0x00, Rx54E3T, Rx55E3T}, // 200/166
- {PH2_2_2_2, PH0_0_2_2, PH0_0_0_0, PH1_1_1_1, PH0_0_1_1, PH0_0_0_0, 0x3f, 0x00, Rx54E3T, Rx55E3T}, // 200/200
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E1T, Rx55E1T}, // 200/266
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 200/333
-// DDR2 Both E3T and E2T Fail, need set to E1T, db PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 00110011b, 00000000b, Rx54E3T, Rx55E3T ;200/266
- },
-// cpu166
- {
- {PH0_2_3_2, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E1T, Rx55E1T}, // 166/100
- {PH2_2_2_2, PH0_0_0_0, PH0_0_0_0, PH0_0_1_0, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54E2T, Rx55E2T}, // 166/133
- {PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, PH1_1_1_1, PH0_0_0_1, PH0_0_0_0, 0x1f, 0x00, Rx54E3T, Rx55E3T}, // 166/166
- {PH1_0_0_1, PH0_0_1_1, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x1e, 0x00, Rx54E3T, Rx55E3T}, // 166/200
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 166/266
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 166/333
- },
-// cpu266
- {
- {PH0_2_2_2, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54L1T, Rx55L1T}, // 266/100
- {PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54L1T, Rx55L1T}, // 266/133
- {PH3_2_3_2, PH0_0_0_2, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x1f, 0x00, Rx54E1T, Rx55E1T}, // 266/166
- {PH3_2_2_3, PH0_0_2_2, PH0_0_0_0, PH1_0_0_1, PH0_0_0_0, PH0_0_0_0, 0x3f, 0x00, Rx54E2T, Rx55E2T}, // 266/200
- {PH2_2_2_2, PH2_2_2_2, PH0_0_0_0, PH1_1_1_1, PH1_1_1_1, PH0_0_0_0, 0xff, 0x00, Rx54E3T, Rx55E3T}, // 266/266
- {PH0_0_1_1, PH0_1_1_1, PH0_0_1_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x9c, 0x03, Rx54E3T, Rx55E3T} // 266/333
- },
-// cpu333
- {
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54L1T, Rx55L1T}, // 333/100 ;DO NOT Support
- {PH2_2_2_2, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54L1T, Rx55L1T}, // 333/133
- {PH3_3_3_3, PH0_0_0_3, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x1f, 0x00, Rx54E0T, Rx55E0T}, // 333/166
- {PH2_3_3_2, PH0_0_3_3, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x3f, 0x00, Rx54E1T, Rx55E1T}, // 333/200
- {PH3_3_3_3, PH3_3_3_3, PH0_0_0_0, PH2_1_1_1, PH2_1_1_1, PH0_0_0_0, 0xff, 0x00, Rx54E3T, Rx55E3T}, // 333/266
- {PH2_2_2_2, PH2_2_2_2, PH0_0_2_2, PH2_2_2_2, PH2_2_2_2, PH0_0_2_2, 0xff, 0x03, Rx54E3T, Rx55E3T} // 333/333
- }
-};
-
-
-static const u8 PT894_64bit_DELAYMD1_RCONV0[6][6][PT894_RDRDY_TBL_Width] =
-// -----------------------------------------------------------------------------------------------------------------
-// RX60 RX61 RX62 RX63 RX64 RX65 RX66 RX67 RX54[3,1] RX55[3,1] CPU/DRAM
-// LN4:1 LN8:5 LN10:9 QW4:1 QW8:5 QW10:9 WS8:1 WS10:9 RFASTH RRRDYH3E
-// RCONV RHTSEL
-// -----------------------------------------------------------------------------------------------------------------
-{
-// cpu100
- {
- {PH0_2_2_2, PH0_0_0_0, PH0_0_0_0, PH0_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E3T, Rx55E3T}, // 100/100
- {PH1_0_0_1, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x06, 0x00, Rx54E3T, Rx55E3T}, // 100/133
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/166
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/200
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // ;100/266
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 100/333
- },
-// cpu133
- {
- {PH0_3_3_3, PH0_0_0_0, PH0_0_0_0, PH0_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E2T, Rx55E2T}, // 133/100
- {PH2_2_2_2, PH0_0_0_0, PH0_0_0_0, PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54E3T, Rx55E3T}, // 133/133
- {PH1_0_1_1, PH0_0_0_1, PH0_0_0_0, PH1_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x1c, 0x00, Rx54E3T, Rx55E3T}, // 133/166
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x09, 0x00, Rx54E3T, Rx55E3T}, // 133/200
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/266
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 133/333
- },
-// cpu200
- {
- {PH0_2_2_2, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54L1T, Rx55L1T}, // 200/100
- {PH3_3_3_3, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54E1T, Rx55E1T}, // 200/133
- {PH2_2_3_3, PH0_0_0_2, PH0_0_0_0, PH1_0_1_1, PH0_0_0_1, PH0_0_0_0, 0x1f, 0x00, Rx54E2T, Rx55E2T}, // 200/166
- {PH3_3_3_3, PH0_0_3_3, PH0_0_0_0, PH2_2_2_2, PH0_0_2_2, PH0_0_0_0, 0x3f, 0x00, Rx54E3T, Rx55E3T}, // 200/200
- {PH0_0_1_1, PH0_0_1_1, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0xcc, 0x00, Rx54E3T, Rx55E3T}, // 200/266
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 200/333
- },
-// cpu166
- {
- {PH0_3_3_3, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E1T, Rx55E1T}, // 166/100
- {PH2_2_3_3, PH0_0_0_0, PH0_0_0_0, PH1_0_1_1, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54E2T, Rx55E2T}, // 166/133
- {PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, 0x1f, 0x00, Rx54E3T, Rx55E3T}, // 166/166
- {PH1_1_1_1, PH0_0_1_1, PH0_0_0_0, PH1_0_0_0, PH0_0_0_1, PH0_0_0_0, 0x39, 0x00, Rx54E3T, Rx55E3T}, // 166/200
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 166/266
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 166/333
- },
-// cpu266
- {
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54L1T, Rx55L1T}, // 266/100 ;DO NOT Support
- {PH2_2_2_2, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54L1T, Rx55L1T}, // 266/133
- {PH2_2_1_2, PH0_0_0_1, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x1f, 0x00, Rx54E0T, Rx55E0T}, // 266/166
- {PH3_3_3_3, PH0_0_3_3, PH0_0_0_0, PH1_1_1_1, PH0_0_1_1, PH0_0_0_0, 0x3f, 0x00, Rx54E2T, Rx55E2T}, // 266/200
- {PH3_3_3_3, PH3_3_3_3, PH0_0_0_0, PH2_2_2_2, PH2_2_2_2, PH0_0_0_0, 0xff, 0x00, Rx54E3T, Rx55E3T}, // 266/266
- {PH1_1_1_1, PH1_1_1_1, PH0_0_1_1, PH0_0_0_1, PH0_0_1_1, PH0_0_1_0, 0x73, 0x02, Rx54E3T, Rx55E3T} // 266/333
- },
-// cpu333
- {
- {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54L1T, Rx55L1T}, // 333/100 ;DO NOT Support
- {PH3_3_3_3, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54L1T, Rx55L1T}, // 333/133
- {PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x1f, 0x00, Rx54L1T, Rx55L1T}, // 333/166
- {PH2_2_2_2, PH0_0_2_2, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x3f, 0x00, Rx54E1T, Rx55E1T}, // 333/200
- {PH2_3_2_2, PH2_3_2_2, PH0_0_0_0, PH0_1_1_0, PH0_1_1_0, PH0_0_0_0, 0xff, 0x00, Rx54E2T, Rx55E2T}, // 333/266
- {PH3_3_3_3, PH3_3_3_3, PH0_0_3_3, PH2_2_2_2, PH2_2_2_2, PH0_0_2_2, 0xff, 0x03, Rx54E3T, Rx55E3T} // 333/333
- }
-};
-
-void DRAMDRDYSetting(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data, CL, RDRPH;
- u8 CpuFreq, DramFreq;
- u8 ProgData[PT894_RDRDY_TBL_Width];
- u8 DelayMode;
- u8 DrdyMode;
- u8 Index;
-
- /*
- this function has 3 switchs, correspond to 3 level of Drdy setting.
- 0:Slowest, 1:Default, 2:Optimize
- you can only open one switch
- */
-#if 1 //this is slowest
- // 0 -> Slowest
- //Write slowest value to register
-
- Data = 0xAA;
- pci_write_config8(PCI_DEV(0, 0, 2), 0x60, Data);
-
- Data = 0x0A;
- pci_write_config8(PCI_DEV(0, 0, 2), 0x61, Data);
-
- Data = 0x00;
- pci_write_config8(PCI_DEV(0, 0, 2), 0x62, Data);
-
- Data = 0xAA;
- pci_write_config8(PCI_DEV(0, 0, 2), 0x63, Data);
-
- Data = 0x0A;
- pci_write_config8(PCI_DEV(0, 0, 2), 0x64, Data);
-
- Data = 0x00;
- pci_write_config8(PCI_DEV(0, 0, 2), 0x65, Data);
-
- Data = 0x00;
- pci_write_config8(PCI_DEV(0, 0, 2), 0x66, Data);
-
- Data = 0x00;
- pci_write_config8(PCI_DEV(0, 0, 2), 0x67, Data);
-
- Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x54);
- Data = Data & 0xF5;
- Data |= 0x08;
- pci_write_config8(PCI_DEV(0, 0, 2), 0x54, Data);
-
- //Data=pci_read_config8(PCI_DEV(0,0,2), 0x55);
- //Data = Data & (~0x20);
- //pci_write_config8(PCI_DEV(0,0,2), 0x55, Data);
-
- //enable drdy timing
- Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x51);
- Data = Data | 0x80;
- pci_write_config8(PCI_DEV(0, 0, 2), 0x51, Data);
-#endif
-#if 0 //default
- {
- //disable drdy timing
- Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x51);
- Data = Data & 0x7F;
- pci_write_config8(PCI_DEV(0, 0, 2), 0x51, Data);
- }
-#endif
-#if 0 // 2:Optimize
- //CL :reg6x[2:0]
- Data = pci_read_config8(MEMCTRL, 0x62);
- CL = Data & 0x07;
-
- //RDRPH: reg7B[6:4]
- Data = pci_read_config8(MEMCTRL, 0x7B);
- RDRPH = (Data & 0x70) >> 4;
-
- //CpuFreq: F2Reg54[7:5]
- Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x54);
- CpuFreq = (Data & 0xE0) >> 5;
-
- //DramFreq:F3Reg90[2:0]
- Data = pci_read_config8(MEMCTRL, 0x90);
- DramFreq = Data & 0x07;
-
- DelayMode = CL + RDRPH; // RDELAYMD = bit0 of (CAS Latency + RDRPH)
- DelayMode &= 0x01;
-
- //In 364, there is no 128 bit
- if (DelayMode == 1) { // DelayMode 1
- for (Index = 0; Index < PT894_RDRDY_TBL_Width; Index++)
- ProgData[Index] =
- PT894_64bit_DELAYMD1_RCONV0[CpuFreq][DramFreq]
- [Index];
- } else { // DelayMode 0
- for (Index = 0; Index < PT894_RDRDY_TBL_Width; Index++)
- ProgData[Index] =
- PT894_64bit_DELAYMD0_RCONV0[CpuFreq][DramFreq]
- [Index];
- }
-
- Data = ProgData[0];
- pci_write_config8(PCI_DEV(0, 0, 2), 0x60, Data);
-
- Data = ProgData[1];
- pci_write_config8(PCI_DEV(0, 0, 2), 0x61, Data);
-
- Data = ProgData[2];
- pci_write_config8(PCI_DEV(0, 0, 2), 0x62, Data);
-
- Data = ProgData[3];
- pci_write_config8(PCI_DEV(0, 0, 2), 0x63, Data);
-
- Data = ProgData[4];
- pci_write_config8(PCI_DEV(0, 0, 2), 0x64, Data);
-
- Data = ProgData[5];
- pci_write_config8(PCI_DEV(0, 0, 2), 0x65, Data);
-
- Data = ProgData[6];
- pci_write_config8(PCI_DEV(0, 0, 2), 0x66, Data);
-
- Data = ProgData[7];
- pci_write_config8(PCI_DEV(0, 0, 2), 0x67, Data);
-
- Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x54);
- Data = (Data & 0xF5) | ProgData[8];
- pci_write_config8(PCI_DEV(0, 0, 2), 0x54, Data);
-
- Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x55);
- Data = Data & (~0x22) | ProgData[9];
- pci_write_config8(PCI_DEV(0, 0, 2), 0x62, Data);
-
- //enable drdy timing
- Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x51);
- Data = Data | 0x80;
- pci_write_config8(PCI_DEV(0, 0, 2), 0x51, Data);
-#endif
-}
-
-
-/*This routine process the ability for North Bridge side burst functionality
-There are 3 variances that are valid:
- 1. DIMM BL=8, chipset BL=8
- 2. DIMM BL=4, chipset BL=4
- 3. DIMM BL=4, chipset BL=8 (only happened on Dual channel)
- Device 0 function 2 HOST:REG54[4] must be 1 when 128-bit mode.
-Since DIMM will be initialized in each rank individually,
- 1.If all DIMM BL=4, DIMM will initialize BL=4 first,
- then check dual_channel flag to enable VIA_NB2HOST_REG54[4].
- 2.If all DIMM BL=8, DIMM will initialize BL=8 first,
- then check dual_channel flag for re-initialize DIMM BL=4.
- also VIA_NB2HOST_REG54[4] need to be enabled.
-Chipset_BL8==>chipset side can set burst length=8
-two register need to set
- 1. Device 0 function 2 HOST:REG54[4]
- 2. Device 0 function 3 DRAM:REG6C[3]
-*/
-void DRAMBurstLength(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data, BL;
- u8 Sockets;
- /*SPD byte16 bit3,2 describes the burst length supported. bit3=1 support BL=8 bit2=1 support BL=4 */
- BL = 0x0c;
- for (Sockets = 0; Sockets < 2; Sockets++) {
- if (DramAttr->DimmInfo[Sockets].bPresence) {
- BL &=
- (DramAttr->DimmInfo[Sockets].
- SPDDataBuf[SPD_SDRAM_BURSTLENGTH]);
- }
- }
-
- /*D0F3Rx6c bit3 CHA SDRAM effective burst length, for 64bit mode ranks =0 BL=4 ; =1 BL=8 */
-
- if (BL & 0x08) /*All Assembly support BL=8 */
- BL = 0x8; /*set bit3 */
- else
- BL = 0x00; /*clear bit3 */
-
- Data = pci_read_config8(MEMCTRL, 0x6c);
- Data = (u8) ((Data & 0xf7) | BL);
-
-#if ENABLE_CHB
- if (DramAttr->RankNumChB > 0) {
- BL = DramAttr->DimmInfo[2].
- SPDDataBuf[SPD_SDRAM_BURSTLENGTH];
- //Rx6c[1], CHB burst length
- if (BL & 0x08) /*CHB support BL=8 */
- BL = 0x2; /*set bit1 */
- else
- BL = 0x00; /*clear bit1 */
-
- Data = (Data & 0xFD) | BL;
- }
-#endif
- pci_write_config8(MEMCTRL, 0x6c, Data);
-}
Deleted: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/Detection.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/Detection.c 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/Detection.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -1,192 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2009 One Laptop per Child, Association, Inc.
- *
- * 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
- */
-
-#define SMBUS_ADDR_CH_A_1 0xA0 // Dimmx
-#define SMBUS_ADDR_CH_A_2 0xA2 // Dimmx
-#define SMBUS_ADDR_CH_B_1 0xA4 // Dimmx
-#define SMBUS_ADDR_CH_B_2 0xA6 // Dimmx
-
-/*read data*/
-CB_STATUS GetSPDData(u8 Slot, u8 Length, u8 * Buf);
-
-void DRAMCmdRate(DRAM_SYS_ATTR * DramAttr);
-
-
-
-CB_STATUS GetInfoFromSPD(DRAM_SYS_ATTR * DramAttr);
-
-CB_STATUS GetSPDData(u8 Slot, u8 Length, u8 * Buf)
-{
- // CB_STATUS Status = CB_NOT_READY;
- u8 Val;
- u8 i;
-
- if (1 > Length || NULL == Buf)
- return CB_INVALID_PARAMETER;
-
- for (i = 0; i < Length; i++) {
- Val = get_spd_data(ctrl.channel0[Slot], i);
- *(Buf + i) = Val;
- }
- return CB_SUCCESS;
-}
-
-CB_STATUS DRAMDetect(DRAM_SYS_ATTR * DramAttr)
-{
- CB_STATUS Status = CB_SUCCESS;
-
- PRINT_DEBUG_MEM("Dram Detection \r");
-
- /*Read D0F3Rx6C , detect memory type DDR1 or DDR2 */
- // 353 supports DDR2 only
- DramAttr->DramType = RAMTYPE_SDRAMDDR2;
- /*get information for SPD */
- Status = GetInfoFromSPD(DramAttr);
- if (CB_SUCCESS == Status) {
- /*64bit or 128Bit */
- //
- // if (RAMTYPE_SDRAMDDR == DramAttr->DramType)
-
- /*select command rate */
- DRAMCmdRate(DramAttr);
- }
- return Status;
-}
-
-
-// Determine 1T or 2T Command Rate:
-// To enable 1T command Rate, the system will satisfy the following 3 conditions:
-// 1. Each DRAM channel may have 1 or 2 ranks of DIMM. 3/4 ranks can not support 1T command rate
-// It's for loading issue. 1T can supports (a). only one socket with two ranks OR
-// (b). two sockets each with 1 rank.
-// 2. User wishes to enable 1T command rate mode and turn on by Setup menu
-// 3. If 1T command rate can be enabled, just set EBP bit here.
-void DRAMCmdRate(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
-
- // 5.1t/2t command rate, use the stable set
- //offset50
- DramAttr->CmdRate = 2;
- Data = pci_read_config8(MEMCTRL, 0x50);
- Data = (u8) (Data & 0xEE);
- pci_write_config8(MEMCTRL, 0x50, Data);
-}
-
-/*get SPD data and set RANK presence map*/
-/*
-Sockets0,1 is Channel A / Sockets2,3 is Channel B
-socket0 SPD device address 0x50 / socket1 SPD device address 0x51
-socket2 SPD device address 0x52 / socket3 SPD device address 0x53
-*/
-CB_STATUS GetInfoFromSPD(DRAM_SYS_ATTR * DramAttr)
-{
- CB_STATUS Status;
- u8 *pSPDDataBuf;
- u8 ModuleDataWidth;
- u8 ChipWidth;
- u8 RankNum;
- u8 LoadNum;
- u8 Sockets, i;
- BOOLEAN bFind;
- bFind = FALSE;
- Status = CB_DEVICE_ERROR;
-
- for (Sockets = 0; Sockets < MAX_SOCKETS; Sockets++) {
- pSPDDataBuf = DramAttr->DimmInfo[Sockets].SPDDataBuf;
- pSPDDataBuf[SPD_MEMORY_TYPE] =
- get_spd_data(ctrl.channel0[Sockets], SPD_MEMORY_TYPE);
- if (pSPDDataBuf[SPD_MEMORY_TYPE] == 0) {
- Status = CB_NOT_READY;
- } else {
- Status =
- GetSPDData(Sockets, SPD_DATA_SIZE,
- pSPDDataBuf);
- PRINT_DEBUG_MEM("SPD : \r");
- for (i = 0; i < SPD_DATA_SIZE; i++) {
- PRINT_DEBUG_MEM(" ");
- PRINT_DEBUG_MEM_HEX8(pSPDDataBuf[i]);
- }
- }
- if (CB_SUCCESS == Status) {
- /*if Dram Controller detected type not same as the type got from SPD, There are ERROR */
- if (pSPDDataBuf[SPD_MEMORY_TYPE] !=
- DramAttr->DramType) {
- Status = CB_DEVICE_ERROR; /*Memory int error */
- PRINT_DEBUG_MEM
- ("Memory Device ERROR: Dram Controller detected type != type got from SPD \r");
- break;
- }
- DramAttr->DimmInfo[Sockets].bPresence = TRUE;
- /*calculate load number (chips number) */
- ModuleDataWidth =
- (u8) (DramAttr->DimmInfo[Sockets].
- SPDDataBuf[SPD_SDRAM_MOD_DATA_WIDTH +
- 1]);
- ModuleDataWidth = (u8) (ModuleDataWidth << 8);
- ModuleDataWidth |=
- (u8) (DramAttr->DimmInfo[Sockets].
- SPDDataBuf[SPD_SDRAM_MOD_DATA_WIDTH]);
- ChipWidth =
- (u8) ((DramAttr->DimmInfo[Sockets].
- SPDDataBuf[SPD_SDRAM_WIDTH]) & 0x7F);
- LoadNum = (u8) (ModuleDataWidth / ChipWidth);
-
- /*set the RANK map */
- RankNum = (u8) (pSPDDataBuf[SPD_SDRAM_DIMM_RANKS] & 0x3); /*get bit0,1, the Most number of supported RANK is 2 */
- if (RAMTYPE_SDRAMDDR2 == DramAttr->DramType)
- RankNum++; /*for DDR bit[0,1] 01->1 RANK 10->2 RANK; for DDR2 bit[0,1] = 00 -> 1 RANK 01 -> 2 RANK */
- if (RankNum != 2 && RankNum != 1) { /*every DIMM have 1 or 2 ranks */
- Status = CB_DEVICE_ERROR;
- PRINT_DEBUG_MEM
- ("Memory Device ERROR: the number of RANK not support!\r");
- break;
- }
-
- if (Sockets < 2) { /*sockets0,1 is channel A */
- DramAttr->RankNumChA =
- (u8) (DramAttr->RankNumChA + RankNum);
- DramAttr->DimmNumChA++;
- DramAttr->LoadNumChA =
- (u8) (DramAttr->LoadNumChA * LoadNum *
- RankNum);
- } else { /*sockets2,3 is channel B */
-
- DramAttr->RankNumChB =
- (u8) (DramAttr->RankNumChB + RankNum);
- DramAttr->DimmNumChB++;
- DramAttr->LoadNumChB =
- (u8) (DramAttr->LoadNumChB * LoadNum *
- RankNum);;
- }
- RankNum |= 1; /*set rank map */
- DramAttr->RankPresentMap |=
- (RankNum << (Sockets * 2));
- bFind = TRUE;
- }
- }
- PRINT_DEBUG_MEM("Rank Present Map:");
- PRINT_DEBUG_MEM_HEX8(DramAttr->RankPresentMap);
- PRINT_DEBUG_MEM("\r");
-
- if (bFind)
- Status = CB_SUCCESS;
-
- return Status;
-}
Deleted: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/DevInit.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/DevInit.c 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/DevInit.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -1,1318 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2009 One Laptop per Child, Association, Inc.
- *
- * 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
- */
-
-void DRAMSetVRNum(DRAM_SYS_ATTR * DramAttr, u8 PhyRank, // Physical Rank
- u8 VirRank, // Virtual Rank
- BOOLEAN Enable);
-
-void SetEndingAddr(DRAM_SYS_ATTR * DramAttr, u8 VirRank, // Ending address register number indicator (INDEX
- INT8 Value // (value) add or subtract value to this and after banks
- );
-
-void InitDDR2CHA(DRAM_SYS_ATTR * DramAttr);
-
-void InitDDR2CHB(DRAM_SYS_ATTR * DramAttr);
-
-void InitDDR2CHC(DRAM_SYS_ATTR * DramAttr);
-
-CB_STATUS VerifyChc();
-/*===================================================================
-Function : DRAMRegInitValue()
-Precondition :
-Input :
- DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
- in MotherBoard
-Output : Void
-Purpose : Set necessary register before DRAM initialize
-===================================================================*/
-
-static const u8 DramRegTbl[][3] = {
- //Register AND OR
- {0x50, 0x11, 0xEE}, // DDR default MA7 for DRAM init
- {0x51, 0x11, 0x60}, // DDR default MA3 for CHB init
- {0x52, 0x00, 0x33}, // DDR use BA0=M17, BA1=M18,
- {0x53, 0x00, 0x3F}, // DDR BA2=M19
-
- {0x54, 0x00, 0x00}, // default PR0=VR0; PR1=VR1
- {0x55, 0x00, 0x00}, // default PR2=VR2; PR3=VR3
- {0x56, 0x00, 0x00}, // default PR4=VR4; PR5=VR5
- {0x57, 0x00, 0x00}, // default PR4=VR4; PR5=VR5
-
- {0x60, 0x00, 0x00}, // disable fast turn-around
- {0x65, 0x00, 0xD9}, // AGP timer = 0XD; Host timer = 8;
- {0x66, 0x00, 0x88}, //DRAMC Queue Size = 4; park at the last bus owner,Priority promotion timer = 8
- {0x68, 0x00, 0x0C},
- {0x69, 0xF0, 0x04}, // set RX69[3:0]=0000b
- {0x6A, 0x00, 0x00}, // refresh counter
- {0x6E, 0xF8, 0x80}, //must set 6E[7],or else DDR2 probe test will fail
- // In here, we not set RX70~RX74, because we just init DRAM but no need R/W DRAM,
- // when we check DQS input/output delay, then we need R/W DRAM.
-
- //{0x79, 0x00, 0x8F },
- {0x85, 0x00, 0x00},
- // {0x90, 0x87, 0x78 },
- // {0x91, 0x00, 0x46 },
- {0x40, 0x00, 0x00},
- {0, 0, 0}
-};
-
-void DRAMRegInitValue(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Idx, CL;
- u8 Data;
-
- for (Idx = 0; DramRegTbl[Idx][0] != 0; Idx++) {
- Data = pci_read_config8(MEMCTRL, DramRegTbl[Idx][0]);
- Data &= DramRegTbl[Idx][1];
- Data |= DramRegTbl[Idx][2];
- pci_write_config8(MEMCTRL, DramRegTbl[Idx][0], Data);
- }
-
- Data = 0x80;
- pci_write_config8(PCI_DEV(0, 0, 4), 0xa3, Data);
-
- //set Dram Controllor mode
- Data = pci_read_config8(MEMCTRL, 0x6c);
- Data &= 0xFB;
- if (ENABLE_CHC == 0) {
- Data |= 0x4; //only CHA 64 bit mode
- pci_write_config8(MEMCTRL, 0x6c, Data);
- } else {
- Data |= 0x0; //CHA + CHC
- pci_write_config8(MEMCTRL, 0x6c, Data);
-
- //Data = 0xAA;
- //pci_write_config8(MEMCTRL, 0xb1, Data);
-
- //set CHB DQSB input delay, or else will meet error which is some byte is right
- //but another bit is error
- Data = pci_read_config8(MEMCTRL, 0xff);
- Data = (Data & 0x03) | 0x3D;
- pci_write_config8(MEMCTRL, 0xff, Data);
-
- //enable CHC RXDB[7]
- //Data=pci_read_config8(MEMCTRL, 0xdb);
- // Data = (Data & 0x7F) | 0x80;
- //pci_write_config8(MEMCTRL, 0xdb, Data);
-
- //rx62[2:0],CHA and CHB CL
- Data = pci_read_config8(MEMCTRL, 0x62);
- CL = Data & 0x07;
-
- //if CL = 6 , so I set CHB CL = 5 default
- if (CL >= 4)
- CL = 3;
-
- // set CHC Read CL rxDC[6:7]
- Data = pci_read_config8(MEMCTRL, 0xdc);
- Data = (Data & 0x3F) | (CL << 6);
- pci_write_config8(MEMCTRL, 0xdc, Data);
- // set CHC write CL rxDF[6:7]
- Data = pci_read_config8(MEMCTRL, 0xdf);
- Data = (Data & 0x3F) | (CL << 6);
- pci_write_config8(MEMCTRL, 0xdf, Data);
- // set CHC ODT RxDC[5:0]
- Data = pci_read_config8(MEMCTRL, 0xdc);
- Data = (Data & 0xC0) | 0x03;
- pci_write_config8(MEMCTRL, 0xdc, Data);
-
- //set column type RXDD[6] and enable ODT PAD RXDD[7]
- Data = pci_read_config8(MEMCTRL, 0xdd);
- Data |= 0x80;
- Idx = DramAttr->DimmInfo[2].SPDDataBuf[SPD_SDRAM_COL_ADDR];
- if ((Idx & 0x0F) == 10)
- Data |= 0x40; //MA9~MA0
- else
- Data &= 0xBF; //MA8~MA0
- pci_write_config8(MEMCTRL, 0xdd, Data);
- }
-
- // Disable read DRAM fast ready ;Rx51[7]
- // Disable Read Around Write ;Rx51[6]
-
- // Disable Consecutive Read ;RX52[1:0]
- // disable speculative read
-
-}
-
-/*===================================================================
-Function : DRAMInitializeProc()
-Precondition :
-Input :
- DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
- in MotherBoard
-Output : Void
-Purpose : DRAM initialize according to the bios porting guid
-===================================================================*/
-
-#define EXIST_TEST_PATTERN 0x55555555
-#define NOT_EXIST_TEST_PATTERN 0xAAAAAAAA
-BOOLEAN ChkForExistLowBank()
-{
- u32 *Address, data32;
-
- // Check Pattern
-
- Address = (u32 *) 8;
- *Address = EXIST_TEST_PATTERN;
- Address = (u32 *) 4;
- *Address = EXIST_TEST_PATTERN;
-
-// _asm {WBINVD}
- WaitMicroSec(100);
- Address = (u32 *) 8;
- data32 = *Address;
- if (data32 != EXIST_TEST_PATTERN)
- return FALSE;
- Address = (u32 *) 4;
- data32 = *Address;
- if (data32 != EXIST_TEST_PATTERN)
- return FALSE;
-
- // Check not Pattern
- Address = (u32 *) 8;
- *Address = NOT_EXIST_TEST_PATTERN;
- Address = (u32 *) 4;
- *Address = NOT_EXIST_TEST_PATTERN;
- //_asm {WBINVD}
- WaitMicroSec(100);
-
-
- Address = (u32 *) 8;
- data32 = *Address;
- if (data32 != (u32) (NOT_EXIST_TEST_PATTERN))
- return FALSE;
- Address = (u32 *) 4;
- data32 = *Address;
- if (data32 != (u32) (NOT_EXIST_TEST_PATTERN))
- return FALSE;
-
- return TRUE;
-}
-
-void InitDDR2CHC(DRAM_SYS_ATTR * DramAttr);
-void InitDDR2CHB(DRAM_SYS_ATTR * DramAttr);
-void DRAMInitializeProc(DRAM_SYS_ATTR * DramAttr)
-{
- u8 shift, idx;
- BOOLEAN Status;
-
- shift = 1;
- for (idx = 0; idx < MAX_RANKS; idx++) {
- if ((DramAttr->RankPresentMap & shift) != 0) {
- // Set VR# to physical rank indicated = PR + physical rank enable bit
- DRAMSetVRNum(DramAttr, idx, idx, TRUE);
- SetEndingAddr(DramAttr, idx, 0x10); // assume 1G size
- if (idx < 4) //CHA init
- InitDDR2CHA(DramAttr); //temp wjb 2007/1 only for compiling
- // in the function InitDDR2,the parameter is no need
- Status = ChkForExistLowBank();
- if (Status == TRUE) {
- PRINT_DEBUG_MEM(" S\r");
- } else {
- PRINT_DEBUG_MEM(" F\r");
- }
- // Set VR# to physical rank indicated = 00h + physical rank enable bit
- DRAMSetVRNum(DramAttr, idx, 0, FALSE);
- SetEndingAddr(DramAttr, idx, -16);
- }
- shift <<= 1;
- }
- if (ENABLE_CHC)
- InitDDR2CHC(DramAttr);
-
-}
-
-
-/*===================================================================
-Function : DRAMSetVRNUM()
-Precondition :
-Input :
- DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
- in MotherBoard
- PhyRank: Physical Rank number
- VirRank: Virtual Rank number
- Enable: Enable/Disable Physical Rank
-Output : Void
-Purpose : Set virtual rank number for physical rank
- Program the specific physical rank with specific virtual rank number
- Program when necessary, otherwise don't touch the pr-vr-mapping registers
-===================================================================*/
-
-void DRAMSetVRNum(DRAM_SYS_ATTR * DramAttr, u8 PhyRank, // Physical Rank
- u8 VirRank, // Virtual Rank
- BOOLEAN Enable)
-{
- u8 Data;
- u8 AndData, OrData;
- Data = pci_read_config8(MEMCTRL, (0x54 + (PhyRank >> 1)));
-
- OrData = 0;
- if (Enable)
- OrData |= 0x08;
- OrData |= VirRank;
- if ((PhyRank & 0x01) == 0x00) {
- AndData = 0x0F; // keep the value of odd rank on PR # is even(keep 1,3,5,7)
- OrData <<= 4; // VR #, value to be set
- } else {
- AndData = 0xF0; // keep the value of even rank on PR # is odd(keep 0,2,4,6)
- }
- Data &= AndData;
- Data |= OrData;
- pci_write_config8(MEMCTRL, (0x54 + (PhyRank >> 1)), Data);
-}
-
-
-/*===================================================================
-Function : SetEndingAddr()
-Precondition :
-Input :
- DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
- in MotherBoard
- VirRank: Virtual Rank number
- Value: (value) add or subtract value to this and after banks
-Output : Void
-Purpose : Set ending address of virtual rank specified by VirRank
-===================================================================*/
-
-void SetEndingAddr(DRAM_SYS_ATTR * DramAttr, u8 VirRank, // Ending address register number indicator (INDEX
- INT8 Value // (value) add or subtract value to this and after banks
- ) {
- u8 Data;
-
- // Read register,Rx40-Rx47(0,1,2,3,4,5,6,7) and set the ending address
- Data = pci_read_config8(MEMCTRL, 0x40 + VirRank);
- Data = (u8) (Data + Value);
- pci_write_config8(MEMCTRL, 0x40 + VirRank, Data);
-
- //program the virank's begining address to zero
- Data = 0x00;
- pci_write_config8(MEMCTRL, 0x48 + VirRank, Data);
-}
-
-/*===================================================================
-Function : InitDDR2()
-Precondition :
-Input :
- DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
- in MotherBoard
-Output : Void
-Purpose : Initialize DDR2 by standard sequence
-===================================================================*/
-
-// DLL: Enable Reset
-static const u32 CHA_MRS_DLL_150[2] = { 0x00020200, 0x00000800 }; // with 150 ohm (A17=1, A9=1), (A11=1)(cpu address)
-static const u32 CHA_MRS_DLL_75[2] = { 0x00020020, 0x00000800 }; // with 75 ohm (A17=1, A5=1), (A11=1)(cpu address)
-
-// CPU(DRAM)
-// { DLL: Enable. A17(BA0)=1 and A3(MA0)=0 }
-// { DLL: reset. A11(MA8)=1 }
-//
-// DDR2 CL=2 CL=3 CL=4 CL=5 CL=6(Burst type=interleave)(WR fine tune in code)
-static const u16 CHA_DDR2_MRS_table[5] = { 0x0150, 0x01D0, 0x0250, 0x02D0, 0x350 }; // BL=4 ;Use 1X-bandwidth MA table to init DRAM
-
-// MA11 MA10(AP) MA9
-#define CHA_MRS_DDR2_TWR2 (0 << 13) + (0 << 20) + (1 << 12) // Value = 001000h
-#define CHA_MRS_DDR2_TWR3 (0 << 13) + (1 << 20) + (0 << 12) // Value = 100000h
-#define CHA_MRS_DDR2_TWR4 (0 << 13) + (1 << 20) + (1 << 12) // Value = 101000h
-#define CHA_MRS_DDR2_TWR5 (1 << 13) + (0 << 20) + (0 << 12) // Value = 002000h
-#define CHA_MRS_DDR2_TWR6 (1 << 13) + (0 << 20) + (1 << 12) // Value = 003000h
-
-// DDR2 Twr=2 Twr=3 Twr=4 Twr=5
-static const u32 CHA_DDR2_Twr_table[5] =
- { CHA_MRS_DDR2_TWR2, CHA_MRS_DDR2_TWR3, CHA_MRS_DDR2_TWR4,
-CHA_MRS_DDR2_TWR5, CHA_MRS_DDR2_TWR6 };
-
-#define CHA_OCD_Exit_150ohm 0x20200 // EMRS(1), BA0=1, MA9=MA8=MA7=0,MA6=1,MA2=0 (DRAM bus address)
-// A17=1, A12=A11=A10=0,A9=1 ,A5=0 (CPU address)
-#define CHA_OCD_Default_150ohm 0x21E00 // EMRS(1), BA0=1, MA9=MA8=MA7=1,MA6=1,MA2=0 (DRAM bus address)
-// A17=1, A12=A11=A10=1,A9=1 ,A5=0 (CPU address)
-#define CHA_OCD_Exit_75ohm 0x20020 // EMRS(1), BA0=1, MA9=MA8=MA7=0,MA6=0,MA2=1 (DRAM bus address)
-// A17=1, A12=A11=A10=0,A9=0 ,A5=1 (CPU address)
-#define CHA_OCD_Default_75ohm 0x21C20 // EMRS(1), BA0=1, MA9=MA8=MA7=1,MA6=0,MA2=1 (DRAM bus address)
-// A17=1, A12=A11=A10=1,A9=0 ,A5=1 (CPU address)
-
-void InitDDR2CHA(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- u8 Reg6BVal;
- u8 Idx, CL, BL, Twr;
- u32 AccessAddr;
- u8 DimmNum;
-
- // step2.
- //disable bank paging and multi page
- Data = pci_read_config8(MEMCTRL, 0x69);
- Data &= ~0x03;
- pci_write_config8(MEMCTRL, 0x69, Data);
-
- Reg6BVal = pci_read_config8(MEMCTRL, 0x6b);
- Reg6BVal &= ~0x07;
- // Step 3.
- // At least one NOP cycle will be issued after the 1m sec device deselect.
- Data = Reg6BVal | 0x01;
- pci_write_config8(MEMCTRL, 0x6b, Data);
-
- // step4.
- //Read a double word from any address of the DIMM
- DimmRead(0x0);
-
- // Step 5.
- // A minimum pause of 200u sec will be provided after the NOP.
- // - <<< reduce BOOT UP time >>> -
- // Loop 200us
- for (Idx = 0; Idx < 0x10; Idx++)
- WaitMicroSec(100);
-
- // Step 6.
- // Precharge all (PALL) will be issued to the DDR.
- Data = Reg6BVal | 0x02;
- pci_write_config8(MEMCTRL, 0x6b, Data);
-
- // Step7.
- //Read a double word from any address of the DIMM
- DimmRead(0x0);
-
- // Step 8.
- // MSR Eable will be issued to the DDR
- Data = Reg6BVal | 0x03;
- pci_write_config8(MEMCTRL, 0x6b, Data);
-
-
- // Step 9,10. check ODT value for EMRS(1) command
- // according to ODTLookUp_TBL in DrivingSetting.c if there is one dimm in MB's one channel , the DDR2's ODT is 150ohm
- // if there is two dimm in MB's one channel, the DDR2's ODT is 75 ohm
- DimmNum = DramAttr->DimmNumChA;
-
- if (DimmNum == 1) //DDR's ODT is 150ohm
- {
- AccessAddr = (u32) CHA_MRS_DLL_150[0];
- DimmRead(AccessAddr); //issue EMRS DLL Enable
- PRINT_DEBUG_MEM("Step 9 Address ");
- PRINT_DEBUG_MEM_HEX32(AccessAddr);
- PRINT_DEBUG_MEM("\r");
-
- AccessAddr = (u32) CHA_MRS_DLL_150[1];
- DimmRead(AccessAddr); //issue MRS DLL Reset
- PRINT_DEBUG_MEM("Step 10 Address ");
- PRINT_DEBUG_MEM_HEX32(AccessAddr);
- PRINT_DEBUG_MEM("\r");
- } else if (DimmNum == 2) //DDR's ODT is 75ohm
- {
- AccessAddr = (u32) CHA_MRS_DLL_75[0];
- DimmRead(AccessAddr); //issue EMRS DLL Enable
- AccessAddr = (u32) CHA_MRS_DLL_75[1];
- DimmRead(AccessAddr); //issue MRS DLL Reset
- } else {
- PRINT_DEBUG_MEM("Dimm NUM ERROR:");
- PRINT_DEBUG_MEM_HEX8(DimmNum);
- PRINT_DEBUG_MEM("\r");
- }
-
- // Step 11.
- // Precharge all (PALL) will be issued to the DDR.
- Data = Reg6BVal | 0x02;
- pci_write_config8(MEMCTRL, 0x6b, Data);
-
- // Step12.
- //Read a double word from any address of the DIMM
- DimmRead(0x0);
-
- // Step 13.
- // Execute 8 CBR refresh
- Data = Reg6BVal | 0x04;
- pci_write_config8(MEMCTRL, 0x6b, Data);
-
- // issue 14,15 , 16
- //reads and wait 100us between each read
- for (Idx = 0; Idx < 8; Idx++) {
- DimmRead(0x0);
- WaitMicroSec(100);
- }
-
- // Step 17.
- // enable MRS for MAA
- Data = Reg6BVal | 0x03;
- pci_write_config8(MEMCTRL, 0x6b, Data);
-
- //Step 18
- //the SDRAM parameters.(Burst Length, CAS# Latency , Write recovery etc.)
- //-------------------------------------------------------------
- //Burst Length : really offset Rx6c[3]
- Data = pci_read_config8(MEMCTRL, 0x6c);
- BL = (Data & 0x08) >> 3;
-
- // CL = really offset RX62[2:0]
- Data = pci_read_config8(MEMCTRL, 0x62);
- CL = Data & 0x03;
-
- AccessAddr = (u32) (CHA_DDR2_MRS_table[CL]);
- if (BL) {
- AccessAddr += 8;
- }
- //Write recovery : really offset Rx63[7-5]
- Data = pci_read_config8(MEMCTRL, 0x63);
- Twr = (Data & 0xE0) >> 5;
-
- AccessAddr += CHA_DDR2_Twr_table[Twr];
- // AccessAddr = 0x1012D8;
- DimmRead(AccessAddr); // Set MRS command
- PRINT_DEBUG_MEM("Step 18 Address");
- PRINT_DEBUG_MEM_HEX32(AccessAddr);
- PRINT_DEBUG_MEM("\r");
-
- //Step 19,20
- if (DimmNum == 1) //DDR's ODT is 150ohm
- {
- AccessAddr = (u32) CHA_OCD_Default_150ohm;
- DimmRead(AccessAddr); //issue EMRS OCD Default
- PRINT_DEBUG_MEM("Step 19 Address ");
- PRINT_DEBUG_MEM_HEX32(AccessAddr);
- PRINT_DEBUG_MEM("\r");
-
- AccessAddr = (u32) CHA_OCD_Exit_150ohm;
- DimmRead(AccessAddr); //issue EMRS OCD Calibration Mode Exit
- PRINT_DEBUG_MEM("Step 20 Address ");
- PRINT_DEBUG_MEM_HEX32(AccessAddr);
- PRINT_DEBUG_MEM("\r");
- } else if (DimmNum == 2) //DDR's ODT is 75ohm
- {
- AccessAddr = (u32) CHA_OCD_Default_75ohm;
- DimmRead(AccessAddr); //issue EMRS OCD Default
- AccessAddr = (u32) CHA_OCD_Exit_75ohm;
- DimmRead(AccessAddr); //issue EMRS OCD Calibration Mode Exit
- } else {
- PRINT_DEBUG_MEM("Dimm NUM ERROR: ");
- PRINT_DEBUG_MEM_HEX8(DimmNum);
- PRINT_DEBUG_MEM("\r");
- }
-
- //Step 21
- //After MRS the device should be ready for full functionality within 3 clocks
- // after Tmrd is met.
- Data = Reg6BVal;
- pci_write_config8(MEMCTRL, 0x6b, Data);
-
- // Enable bank paging and multi page
- Data = pci_read_config8(MEMCTRL, 0x69);
- Data |= 0x03;
- pci_write_config8(MEMCTRL, 0x69, Data);
-}
-
-/*===================================================================
-Function : InitDDR2_CHB()
-Precondition :
-Input :
- DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
- in MotherBoard
-Output : Void
-Purpose : Initialize DDR2 of CHB by standard sequence
-Reference :
-===================================================================*/
-/*// DLL: Enable Reset
-static const u32 CHB_MRS_DLL_150[2] = { 0x00020200 | (1 << 20), 0x00000800 }; // with 150 ohm (A17=1, A9=1), (A11=1)(cpu address)
-//u32 CHB_MRS_DLL_75[2] = { 0x00020020 | (1 << 20), 0x00000800 }; // with 75 ohm (A17=1, A5=1), (A11=1)(cpu address)
-// CPU(DRAM)
-// { DLL: Enable. A17(BA0)=1 and A3(MA0)=0 }
-// { DLL: reset. A11(MA8)=1 }
-//
-// DDR2 CL=2 CL=3 CL=4 CL=5 (Burst type=interleave)(WR fine tune in code)
-static const u16 CHB_DDR2_MRS_table[4] ={ 0x0150, 0x01D0, 0x0250, 0x02D0 }; // BL=4 ;Use 1X-bandwidth MA table to init DRAM
-
-// MA11 MA10(AP) MA9
-#define CHB_MRS_DDR2_TWR2 (0 << 13) + (0 << 20) + (1 << 12) // Value = 001000h
-#define CHB_MRS_DDR2_TWR3 (0 << 13) + (1 << 20) + (0 << 12) // Value = 100000h
-#define CHB_MRS_DDR2_TWR4 (0 << 13) + (1 << 20) + (1 << 12) // Value = 101000h
-#define CHB_MRS_DDR2_TWR5 (1 << 13) + (0 << 20) + (0 << 12) // Value = 002000h
-#define CHB_MRS_DDR2_TWR6 (1 << 13) + (0 << 20) + (1 << 12) // Value = 003000h
-
-// DDR2 Twr=2 Twr=3 Twr=4 Twr=5
-static const u32 CHB_DDR2_Twr_table[5] = { CHB_MRS_DDR2_TWR2, CHB_MRS_DDR2_TWR3, CHB_MRS_DDR2_TWR4, CHB_MRS_DDR2_TWR5, CHB_MRS_DDR2_TWR6 };
-
-#define CHB_OCD_Exit_150ohm 0x20200 | (1 << 20) // EMRS(1), BA0=1, MA9=MA8=MA7=0,MA6=1,MA2=0 (DRAM bus address)
-// A17=1, A12=A11=A10=0,A9=1 ,A5=0 (CPU address)
-#define CHB_OCD_Default_150ohm 0x21E00 | (1 << 20) // EMRS(1), BA0=1, MA9=MA8=MA7=1,MA6=1,MA2=0 (DRAM bus address)
-// A17=1, A12=A11=A10=1,A9=1 ,A5=0 (CPU address)
-//#define CHB_OCD_Exit_75ohm 0x20020 | (1 << 20) // EMRS(1), BA0=1, MA9=MA8=MA7=0,MA6=0,MA2=1 (DRAM bus address)
-// A17=1, A12=A11=A10=0,A9=0 ,A5=1 (CPU address)
-//#define CHB_OCD_Default_75ohm 0x21C20 | (1 << 20) // EMRS(1), BA0=1, MA9=MA8=MA7=1,MA6=0,MA2=1 (DRAM bus address)
-// A17=1, A12=A11=A10=1,A9=0 ,A5=1 (CPU address)
-void InitDDR2CHB(
- DRAM_SYS_ATTR *DramAttr
- )
-
-{
- u8 Data;
- u8 Idx, CL, BL, Twr;
- u32 AccessAddr;
-
- Data = 0x80;
- pci_write_config8(MEMCTRL, 0x54, Data);
-
- // step3.
- //disable bank paging and multi page
- Data=pci_read_config8(MEMCTRL, 0x69);
- Data &= ~0x03;
- pci_write_config8(MEMCTRL, 0x69, Data);
-
- Data=pci_read_config8(MEMCTRL, 0xd3);
- Data |= 0x80;
- pci_write_config8(MEMCTRL, 0xd3, Data);
-
- //step 4. Initialize CHB begin
- Data=pci_read_config8(MEMCTRL, 0xd3);
- Data |= 0x40;
- pci_write_config8(MEMCTRL, 0xd3, Data);
-
- //Step 5. NOP command enable
- Data=pci_read_config8(MEMCTRL, 0xd7);
- Data &= 0xC7;
- Data |= 0x08;
- pci_write_config8(MEMCTRL, 0xd7, Data);
-
- //Step 6. issue a nop cycle,RegD3[7] 0 -> 1
- Data=pci_read_config8(MEMCTRL, 0xd3);
- Data &= 0x7F;
- pci_write_config8(MEMCTRL, 0xd3, Data);
- Data |= 0x80;
- pci_write_config8(MEMCTRL, 0xd3, Data);
-
-
- // Step 7.
- // A minimum pause of 200u sec will be provided after the NOP.
- // - <<< reduce BOOT UP time >>> -
- // Loop 200us
- for (Idx = 0; Idx < 0x10; Idx++)
- WaitMicroSec(10);
-
- // Step 8.
- // all banks precharge command enable
- Data=pci_read_config8(MEMCTRL, 0xd7);
- Data &= 0xC7;
- Data |= 0x10;
- pci_write_config8(MEMCTRL, 0xd7, Data);
-
- //step 9. issue a precharge all cycle,RegD3[7] 0 -> 1
- Data=pci_read_config8(MEMCTRL, 0xd3);
- Data &= 0x7F;
- pci_write_config8(MEMCTRL, 0xd3, Data);
- Data |= 0x80;
- pci_write_config8(MEMCTRL, 0xd3, Data);
-
- //step10. EMRS enable
- Data=pci_read_config8(MEMCTRL, 0xd7);
- Data &= 0xC7;
- Data |= 0x18;
- pci_write_config8(MEMCTRL, 0xd7, Data);
-
- Data=pci_read_config8(MEMCTRL, 0xd3);
- Data &= 0xC7;
- Data |= 0x08;
- pci_write_config8(MEMCTRL, 0xd3, Data);
-
- //step11. EMRS DLL Enable and Disable DQS
- AccessAddr = CHB_MRS_DLL_150[0] >> 3;
- Data =(u8) (AccessAddr & 0xff);
- pci_write_config8(MEMCTRL, 0xd9, Data);
-
- Data = (u8)((AccessAddr & 0xff00) >> 8);
- pci_write_config8(MEMCTRL, 0xda, Data);
-
- Data=pci_read_config8(MEMCTRL, 0xd7);
- Data &= 0xF9;
- Data |= (u8)((AccessAddr & 0x30000) >> 15);
- pci_write_config8(MEMCTRL, 0xd7, Data);
-
- //step12. issue EMRS cycle
- Data=pci_read_config8(MEMCTRL, 0xd3);
- Data &= 0x7F;
- pci_write_config8(MEMCTRL, 0xd3, Data);
- Data |= 0x80;
- pci_write_config8(MEMCTRL, 0xd3, Data);
-
- //step13. MSR enable
- Data=pci_read_config8(MEMCTRL, 0xd7);
- Data &= 0xC7;
- Data |= 0x18;
- pci_write_config8(MEMCTRL, 0xd7, Data);
-
- Data=pci_read_config8(MEMCTRL, 0xd3);
- Data &= 0xC7;
- Data |= 0x00;
- pci_write_config8(MEMCTRL, 0xd3, Data);
-
-
- //step 14. MSR DLL Reset
- AccessAddr = CHB_MRS_DLL_150[1] >> 3;
- Data =(u8) (AccessAddr & 0xff);
- pci_write_config8(MEMCTRL, 0xd9, Data);
-
- Data = (u8)((AccessAddr & 0xff00) >> 8);
- pci_write_config8(MEMCTRL, 0xda, Data);
-
- Data=pci_read_config8(MEMCTRL, 0xd7);
- Data &= 0xF9;
- Data |= (u8)((AccessAddr & 0x30000) >> 15);
- pci_write_config8(MEMCTRL, 0xd7, Data);
-
- //step15. issue MRS cycle
- Data=pci_read_config8(MEMCTRL, 0xd3);
- Data &= 0x7F;
- pci_write_config8(MEMCTRL, 0xd3, Data);
- Data |= 0x80;
- pci_write_config8(MEMCTRL, 0xd3, Data);
-
- //clear the address
- Data = 0x00;
- pci_write_config8(MEMCTRL, 0xda, Data);
-
- //step16. all banks precharge command enable
- Data=pci_read_config8(MEMCTRL, 0xd7);
- Data &= 0xC7;
- Data |= 0x10;
- pci_write_config8(MEMCTRL, 0xd7, Data);
-
-
- // step17. issue precharge all cycle
- Data=pci_read_config8(MEMCTRL, 0xd3);
- Data &= 0x7F;
- pci_write_config8(MEMCTRL, 0xd3, Data);
- Data |= 0x80;
- pci_write_config8(MEMCTRL, 0xd3, Data);
-
- //step18. CBR cycle enable
- Data=pci_read_config8(MEMCTRL, 0xd7);
- Data &= 0xC7;
- Data |= 0x20;
- pci_write_config8(MEMCTRL, 0xd7, Data);
-
- //step 19.20.21
- //repeat issue 8 CBR cycle, between each cycle stop 100us
- for (Idx = 0; Idx < 8; Idx++)
- {
- // issue CBR cycle
- Data=pci_read_config8(MEMCTRL, 0xd3);
- Data &= 0x7F;
- pci_write_config8(MEMCTRL, 0xd3, Data);
- Data |= 0x80;
- pci_write_config8(MEMCTRL, 0xd3, Data);
-
- WaitMicroSec(200);
- }
-
- //step22. MSR enable
- Data=pci_read_config8(MEMCTRL, 0xd7);
- Data &= 0xC7;
- Data |= 0x18;
- pci_write_config8(MEMCTRL, 0xd7, Data);
-
- Data=pci_read_config8(MEMCTRL, 0xd3);
- Data &= 0xC7;
- Data |= 0x00;
- pci_write_config8(MEMCTRL, 0xd3, Data);
-
-
-
- //the SDRAM parameters.(Burst Length, CAS# Latency , Write recovery etc.)
- //-------------------------------------------------------------
- //Burst Length : really offset Rx6c[1]
- Data=pci_read_config8(MEMCTRL, 0x6C);
- BL = (Data & 0x02) >> 1;
-
- // CL = really offset RX62[2:0]
- Data=pci_read_config8(MEMCTRL, 0x62);
- CL = Data & 0x03;
-
-
- AccessAddr = (u32)(CHB_DDR2_MRS_table[CL]);
- if (BL)
- {
- AccessAddr += 8;
- }
-
- //Write recovery : really offset Rx63[7:5]
- Data=pci_read_config8(MEMCTRL, 0x63);
- Twr = (Data & 0xE0) >> 5;
-
- AccessAddr += CHB_DDR2_Twr_table[Twr];
- //MSR Address use addr[20:3]
- AccessAddr >>= 3;
-
- //step 23. MSR command
- Data = (u8)(AccessAddr & 0xFF);
- pci_write_config8(MEMCTRL, 0xD9, Data);
-
- Data = (u8)((AccessAddr & 0xFF00) >> 8);
- pci_write_config8(MEMCTRL, 0xda, Data);
-
- Data=pci_read_config8(MEMCTRL, 0xd7);
- Data &= 0xF9;
- Data |= (u8)(((AccessAddr & 0x30000)>>16) << 1);
- pci_write_config8(MEMCTRL, 0xd7, Data);
-
- //step 24. issue MRS cycle
- Data=pci_read_config8(MEMCTRL, 0xd3);
- Data &= 0x7F;
- pci_write_config8(MEMCTRL, 0xd3, Data);
- Data |= 0x80;
- pci_write_config8(MEMCTRL, 0xd3, Data);
-
- //step 25. EMRS enable
- Data=pci_read_config8(MEMCTRL, 0xd7);
- Data &= 0xC7;
- Data |= 0x18;
- pci_write_config8(MEMCTRL, 0xd7, Data);
-
- Data=pci_read_config8(MEMCTRL, 0xd3);
- Data &= 0xC7;
- Data |= 0x08;
- pci_write_config8(MEMCTRL, 0xd3, Data);
-
-
- //step 26. OCD default
- AccessAddr = (CHB_OCD_Default_150ohm) >> 3;
- Data =(u8) (AccessAddr & 0xff);
- pci_write_config8(MEMCTRL, 0xd9, Data);
-
- Data = (u8)((AccessAddr & 0xff00) >> 8);
- pci_write_config8(MEMCTRL, 0xda, Data);
-
- Data=pci_read_config8(MEMCTRL, 0xd7);
- Data &= 0xF9;
- Data |= (u8)((AccessAddr & 0x30000) >> 15);
- pci_write_config8(MEMCTRL, 0xd7, Data);
-
-
- //step 27. issue EMRS cycle
- Data=pci_read_config8(MEMCTRL, 0xd3);
- Data &= 0x7F;
- pci_write_config8(MEMCTRL, 0xd3, Data);
- Data |= 0x80;
- pci_write_config8(MEMCTRL, 0xd3, Data);
-
- //step 25. EMRS enable
- Data=pci_read_config8(MEMCTRL, 0xd7);
- Data &= 0xC7;
- Data |= 0x18;
- pci_write_config8(MEMCTRL, 0xd7, Data);
-
- Data=pci_read_config8(MEMCTRL, 0xd3);
- Data &= 0xC7;
- Data |= 0x08;
- pci_write_config8(MEMCTRL, 0xd3, Data);
-
- //step 28. OCD Exit
- AccessAddr = (CHB_OCD_Exit_150ohm) >> 3;
- Data =(u8) (AccessAddr & 0xff);
- pci_write_config8(MEMCTRL, 0xd9, Data);
-
- Data = (u8)((AccessAddr & 0xff00) >> 8);
- pci_write_config8(MEMCTRL, 0xda, Data);
-
- Data=pci_read_config8(MEMCTRL, 0xd7);
- Data &= 0xF9;
- Data |= (u8)((AccessAddr & 0x30000) >> 15);
- pci_write_config8(MEMCTRL, 0xd7, Data);
-
- //step 29. issue EMRS cycle
- Data=pci_read_config8(MEMCTRL, 0xd3);
- Data &= 0x7F;
- pci_write_config8(MEMCTRL, 0xd3, Data);
- Data |= 0x80;
- pci_write_config8(MEMCTRL, 0xd3, Data);
-
- //clear all the address
- Data = 0x00;
- pci_write_config8(MEMCTRL, 0xd9, Data);
-
- Data = 0x00;
- pci_write_config8(MEMCTRL, 0xda, Data);
-
- Data=pci_read_config8(MEMCTRL, 0xd7);
- Data &= 0xF9;
- pci_write_config8(MEMCTRL, 0xd7, Data);
-
-
- //step 30. normal SDRAM Mode
- Data=pci_read_config8(MEMCTRL, 0xd7);
- Data &= 0xC7;
- Data |= 0x00;
- pci_write_config8(MEMCTRL, 0xd7, Data);
-
- Data=pci_read_config8(MEMCTRL, 0xd3);
- Data &= 0xC7;
- Data |= 0x00;
- pci_write_config8(MEMCTRL, 0xd3, Data);
-
- //step 31. exit the initialization mode
- Data=pci_read_config8(MEMCTRL, 0xd3);
- Data &= 0xBF;
- pci_write_config8(MEMCTRL, 0xd3, Data);
-
-
- //step 32. Enable bank paging and multi page
- Data=pci_read_config8(MEMCTRL, 0x69);
- Data |= 0x03;
- pci_write_config8(MEMCTRL, 0x69, Data);
-}
-*/
-/*===================================================================
-Function : InitDDR2CHC()
-Precondition :
-Input :
- DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
- in MotherBoard
-Output : Void
-Purpose : Initialize DDR2 of CHC by standard sequence
-Reference :
-===================================================================*/
-// DDR2 CL=2 CL=3 CL=4 CL=5 (Burst type=interleave)(WR fine tune in code)
-static const u16 CHC_MRS_table[4] = { 0x22B, 0x23B, 0x24B, 0x25B }; // Use 1X-bandwidth MA table to init DRAM
-
-void InitDDR2CHC(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- u8 Idx, CL, Twr;
- u32 AccessAddr;
- CB_STATUS Status;
-
- // step3.
- //clear RxDF[2] to disable Tri-state output
- Data = pci_read_config8(MEMCTRL, 0xdf);
- Data &= 0xFB;
- pci_write_config8(MEMCTRL, 0xdf, Data);
-
-
-
- //step 4. Enable the initialization mode of DRAM Controller C with NB's PLL clock
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data |= 0x60;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- //Step 5. NOP command enable
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data &= 0xE3;
- Data |= 0x00;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
-
- //Step 6. issue a nop cycle,RegDB[1] 0 -> 1
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data |= 0x2;
- pci_write_config8(MEMCTRL, 0xdb, Data);
- Data &= 0xFD;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
-
- // Step 7.
- // A minimum pause of 200u sec will be provided after the NOP.
- // - <<< reduce BOOT UP time >>> -
- // Loop 200us
- for (Idx = 0; Idx < 0x10; Idx++)
- WaitMicroSec(100);
-
- // Step 8.
- // signal bank precharge command enable
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data &= 0xE3;
- Data |= 0x14;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- //set MA10 =1, precharge all bank
- Data = 0x00;
- pci_write_config8(MEMCTRL, 0xf8, Data);
-
-
- Data = 0x04;
- pci_write_config8(MEMCTRL, 0xf9, Data);
-
- //step 9. issue a precharge all cycle,RegD3[7] 0 -> 1
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data |= 0x2;
- pci_write_config8(MEMCTRL, 0xdb, Data);
- Data &= 0xFD;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- //step10. MRS enable
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data &= 0xE3;
- Data |= 0x1C;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
-
- //step11. EMRS DLL enable and Disable DQS
- Data = 0x40;
- pci_write_config8(MEMCTRL, 0xf8, Data);
-
- Data = 0x24;
- pci_write_config8(MEMCTRL, 0xf9, Data);
-
- //step12. issue EMRS cycle
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data |= 0x2;
- pci_write_config8(MEMCTRL, 0xdb, Data);
- Data &= 0xFD;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- //step13. MSR enable
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data &= 0xE3;
- Data |= 0x1C;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- //step 14. MSR DLL Reset
- Data = 0x00;
- pci_write_config8(MEMCTRL, 0xf8, Data);
-
- Data = 0x01;
- pci_write_config8(MEMCTRL, 0xf9, Data);
-
- //step15. issue MRS cycle
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data |= 0x2;
- pci_write_config8(MEMCTRL, 0xdb, Data);
- Data &= 0xFD;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- //step16. signal banks precharge command enable
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data &= 0xE3;
- Data |= 0x14;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- //set MA10 =1, precharge all bank
- Data = 0x00;
- pci_write_config8(MEMCTRL, 0xf8, Data);
-
- Data = 0x04;
- pci_write_config8(MEMCTRL, 0xf9, Data);
-
- // step17. issue precharge all cycle
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data |= 0x2;
- pci_write_config8(MEMCTRL, 0xdb, Data);
- Data &= 0xFD;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- //step18. CBR cycle enable
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data &= 0xE3;
- Data |= 0x18;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- Data = 0x00;
- pci_write_config8(MEMCTRL, 0xf8, Data);
-
- Data = 0x00;
- pci_write_config8(MEMCTRL, 0xf9, Data);
-
- //step 19.20.21
- //repeat issue 8 CBR cycle, between each cycle stop 100us
- for (Idx = 0; Idx < 8; Idx++) {
- // issue CBR cycle
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data |= 0x2;
- pci_write_config8(MEMCTRL, 0xdb, Data);
- Data &= 0xFD;
- pci_write_config8(MEMCTRL, 0xdb, Data);
- WaitMicroSec(100);
- }
-
- //the SDRAM parameters.(, CAS# Latency , Write recovery etc.)
- //------------------------------------------------------------
-
- // CL = really offset RXDC[7:6]
- Data = pci_read_config8(MEMCTRL, 0xdc);
- CL = (Data & 0xC0) >> 6;
-
- AccessAddr = (u32) (CHC_MRS_table[CL]);
-
- //Write recovery : really offset Rx63[7:5]
- Data = pci_read_config8(MEMCTRL, 0x63);
- Twr = (Data & 0xE0) >> 5;
-
- AccessAddr += Twr * 0x200;
-
- //step22. MSR enable
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data &= 0xE3;
- Data |= 0x1C;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- //step 23. MSR command
- Data = (u8) (AccessAddr & 0xFF);
- pci_write_config8(MEMCTRL, 0xf8, Data);
-
- Data = (u8) ((AccessAddr & 0xFF00) >> 8);
- pci_write_config8(MEMCTRL, 0xf9, Data);
-
- //step 24. issue MRS cycle
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data |= 0x2;
- pci_write_config8(MEMCTRL, 0xdb, Data);
- Data &= 0xFD;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- //step 25. EMRS enable
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data &= 0xE3;
- Data |= 0x1C;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
-
- //step 26. OCD default
- Data = 0xC0;
- pci_write_config8(MEMCTRL, 0xf8, Data);
-
- Data = 0x27;
- pci_write_config8(MEMCTRL, 0xf9, Data);
-
- //step 27. issue EMRS cycle
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data |= 0x2;
- pci_write_config8(MEMCTRL, 0xdb, Data);
- Data &= 0xFD;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- //step 28. OCD Exit
- Data = 0x40;
- pci_write_config8(MEMCTRL, 0xf8, Data);
-
- Data = 0x24;
- pci_write_config8(MEMCTRL, 0xf9, Data);
-
-
- //step 29. issue EMRS cycle
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data |= 0x2;
- pci_write_config8(MEMCTRL, 0xdb, Data);
- Data &= 0xFD;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- Status = VerifyChc();
- if (Status != CB_SUCCESS)
- PRINT_DEBUG_MEM("Error!!!!CHC init error!\r");
- //step 31. exit the initialization mode
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data &= 0x9F;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-}
-
-CB_STATUS VerifyChc()
-{
- u8 Data, ByteVal, Index, pad;
- u16 row;
-
- //first write the pad to all the address
-
- //the row bits is 13 and rank bit is 2, so the address bits is 15 and the value is 0x7fff
- //verify each MA[0:12],BA[0:1]
- pad = 1;
- for (row = 0; row < 0x8000; row++) {
- //set the write value;
- //verify each MD[15:0]
- for (Data = pad, Index = 0; Index < 16; Index++) {
- Data <<= 1;
- if (Data == 0)
- Data = 1;
- pci_write_config8(PCI_DEV(0, 0, 7), 0xC0 + Index,
- Data);
-
- }
-
- //issue the bank active command
- // bank active command enable
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data &= 0xE3;
- Data |= 0x10;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- Data = (u8) (row && 0xFF);
- pci_write_config8(MEMCTRL, 0xf8, Data);
-
- Data = (u8) ((row && 0xFF) >> 8);
- pci_write_config8(MEMCTRL, 0xf9, Data);
-
- // issue active cycle
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data |= 0x2;
- pci_write_config8(MEMCTRL, 0xdb, Data);
- Data &= 0xFD;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- //issue ready/completion for read/write
- // read/completion command enable
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data &= 0xE3;
- Data |= 0x04;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- Data = 0x00;
- pci_write_config8(MEMCTRL, 0xf8, Data);
-
- Data = 0x00;
- pci_write_config8(MEMCTRL, 0xf9, Data);
-
- // issue read/completion cycle
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data |= 0x2;
- pci_write_config8(MEMCTRL, 0xdb, Data);
- Data &= 0xFD;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- //issue write command
- // write command enable
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data &= 0xE3;
- Data |= 0x0C;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- Data = 0x00;
- pci_write_config8(MEMCTRL, 0xf8, Data);
-
- Data = (u8) ((row & 0x60) << 5);
- pci_write_config8(MEMCTRL, 0xf9, Data);
-
- // issue write cycle
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data |= 0x2;
- pci_write_config8(MEMCTRL, 0xdb, Data);
- Data &= 0xFD;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- ////issue ready/completion for read/write
- // read/completion command enable
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data &= 0xE3;
- Data |= 0x04;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- Data = 0x00;
- pci_write_config8(MEMCTRL, 0xf8, Data);
-
- Data = 0x00;
- pci_write_config8(MEMCTRL, 0xf9, Data);
-
- // issue read/completion cycle
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data |= 0x2;
- pci_write_config8(MEMCTRL, 0xdb, Data);
- Data &= 0xFD;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- //issue the bank active command
- // bank active command enable
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data &= 0xE3;
- Data |= 0x10;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- Data = (u8) (row && 0xFF);
- pci_write_config8(MEMCTRL, 0xf8, Data);
-
- Data = (u8) ((row && 0xFF) >> 8);
- pci_write_config8(MEMCTRL, 0xf9, Data);
-
- // issue active cycle
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data |= 0x2;
- pci_write_config8(MEMCTRL, 0xdb, Data);
- Data &= 0xFD;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- ////issue ready/completion for read/write
- // read/completion command enable
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data &= 0xE3;
- Data |= 0x04;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- Data = 0x00;
- pci_write_config8(MEMCTRL, 0xf8, Data);
-
- Data = 0x00;
- pci_write_config8(MEMCTRL, 0xf9, Data);
-
- // issue read/completion cycle
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data |= 0x2;
- pci_write_config8(MEMCTRL, 0xdb, Data);
- Data &= 0xFD;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- ////issue read command
- // read/completion command enable
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data &= 0xE3;
- Data |= 0x08;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- Data = 0x00;
- pci_write_config8(MEMCTRL, 0xf8, Data);
-
- Data = (u8) ((row & 0x60) << 5);
- pci_write_config8(MEMCTRL, 0xf9, Data);
-
- // issue read cycle
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data |= 0x2;
- pci_write_config8(MEMCTRL, 0xdb, Data);
- Data &= 0xFD;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- ////issue ready/completion for read/write
- // read/completion command enable
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data &= 0xE3;
- Data |= 0x04;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- Data = 0x00;
- pci_write_config8(MEMCTRL, 0xf8, Data);
-
- Data = 0x00;
- pci_write_config8(MEMCTRL, 0xf9, Data);
-
- // issue read/completion cycle
- Data = pci_read_config8(MEMCTRL, 0xdb);
- Data |= 0x2;
- pci_write_config8(MEMCTRL, 0xdb, Data);
- Data &= 0xFD;
- pci_write_config8(MEMCTRL, 0xdb, Data);
-
- //verify the value;
- for (ByteVal = pad, Index = 0; Index < 16; Index++) {
- Data =
- pci_read_config8(PCI_DEV(0, 0, 7),
- 0xD0 + Index);
- if (ByteVal != Data) {
- PRINT_DEBUG_MEM
- ("error!!!! row = %x,Index =%x,Data = %x,ByteVal=%x\r");
- }
- ByteVal <<= 1;
- if (ByteVal == 0)
- ByteVal = 1;
- }
- pad <<= 1;
- if (pad == 0)
- pad = 1;
- }
-
- return CB_SUCCESS;
-}
Deleted: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/DrivingSetting.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/DrivingSetting.c 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/DrivingSetting.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -1,396 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2009 One Laptop per Child, Association, Inc.
- *
- * 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
- */
-
-/*
- Driving setting: ODT/DQS/DQ/CS/MAA/MAB/DCLK
- */
-
-void DrivingODT(DRAM_SYS_ATTR * DramAttr);
-
-void DrivingDQS(DRAM_SYS_ATTR * DramAttr);
-
-void DrivingDQ(DRAM_SYS_ATTR * DramAttr);
-
-void DrivingCS(DRAM_SYS_ATTR * DramAttr);
-
-void DrivingMA(DRAM_SYS_ATTR * DramAttr);
-
-void DrivingDCLK(DRAM_SYS_ATTR * DramAttr);
-
-/* DRAM Driving Adjustment*/
-void DRAMDriving(DRAM_SYS_ATTR * DramAttr)
-{
- PRINT_DEBUG_MEM("set ODT!\r");
- DrivingODT(DramAttr);
-
- PRINT_DEBUG_MEM("set DQS!\r");
- DrivingDQS(DramAttr);
-
- PRINT_DEBUG_MEM(("set DQ!\r"));
- DrivingDQ(DramAttr);
-
- PRINT_DEBUG_MEM("set CS!\r");
- DrivingCS(DramAttr);
-
- PRINT_DEBUG_MEM("set MAA!\r");
- DrivingMA(DramAttr);
-
- PRINT_DEBUG_MEM("set DCLK!\r");
- DrivingDCLK(DramAttr);
-}
-
-
-/*
-ODT Control for DQ/DQS/CKE/SCMD/DCLKO in ChA & ChB
-which include driving enable/range and strong/weak selection
-
-Processing: According to DRAM frequency to ODT control bits.
- Because function enable bit must be the last one to be set.
- So the register VIA_NB3DRAM_REGD4 and VIA_NB3DRAM_REGD3 should be
- the last register to be programmed.
-*/
-//-------------------------------------------------------------------------------
-// ODT Lookup Table
-//-------------------------------------------------------------------------------
-#define Rank0_ODT 0
-#define Rank1_ODT 1
-#define Rank2_ODT 2
-#define Rank3_ODT 3
-#define NA_ODT 0
-#define NB_ODT_75ohm 0
-#define NB_ODT_150ohm 1
-
-#define DDR2_ODT_75ohm 0x20
-#define DDR2_ODT_150ohm 0x40
-
-// Setting of ODT Lookup TBL
-// RankMAP , Rank 3 Rank 2 Rank 1 Rank 0 , DRAM & NB ODT setting
-// db 0000b , Reserved
-#define ODTLookup_Tbl_count 8
-static const u8 ODTLookup_TBL[ODTLookup_Tbl_count][3] = {
- // 0001b
- {0x01,
- (Rank3_ODT << 6) + (Rank2_ODT << 4) + (Rank1_ODT << 2) +
- Rank0_ODT, DDR2_ODT_150ohm + NB_ODT_75ohm},
- // 0010b , Reserved
- // 0011b
- {0x03,
- (Rank3_ODT << 6) + (Rank2_ODT << 4) + (Rank0_ODT << 2) +
- Rank1_ODT, DDR2_ODT_150ohm + NB_ODT_75ohm},
- // 0100b
- {0x04,
- (Rank3_ODT << 6) + (Rank2_ODT << 4) + (Rank1_ODT << 2) +
- Rank0_ODT, DDR2_ODT_150ohm + NB_ODT_75ohm},
- // 0101b
- {0x05,
- (Rank3_ODT << 6) + (Rank0_ODT << 4) + (Rank1_ODT << 2) +
- Rank2_ODT, DDR2_ODT_75ohm + NB_ODT_150ohm},
- // 0110b , Reserved
- // 0111b
- {0x07,
- (Rank3_ODT << 6) + (Rank0_ODT << 4) + (Rank2_ODT << 2) +
- Rank2_ODT, DDR2_ODT_75ohm + NB_ODT_150ohm},
- // 1000b , Reserved
- // 1001b , Reserved
- // 1010b , Reserved
- // 1011b , Reserved
- // 1100b
- {0x0c,
- (Rank2_ODT << 6) + (Rank3_ODT << 4) + (Rank1_ODT << 2) +
- Rank0_ODT, DDR2_ODT_150ohm + NB_ODT_75ohm},
- // 1101b
- {0x0d,
- (Rank0_ODT << 6) + (Rank0_ODT << 4) + (Rank1_ODT << 2) +
- Rank2_ODT, DDR2_ODT_75ohm + NB_ODT_150ohm},
- // 1110b , Reserved
- // 1111b
- {0x0f,
- (Rank0_ODT << 6) + (Rank0_ODT << 4) + (Rank2_ODT << 2) +
- Rank2_ODT, DDR2_ODT_75ohm + NB_ODT_150ohm}
-};
-
-#define ODT_Table_Width_DDR2 4
-// RxD6 RxD3
-static const u8 ODT_Control_DDR2[ODT_Table_Width_DDR2] = { 0xFC, 0x01 };
-
-void DrivingODT(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- u8 i;
- BOOLEAN bFound;
-
- pci_write_config8(MEMCTRL, 0xD0, 0x88);
-
- Data = ODT_Control_DDR2[0];
- pci_write_config8(MEMCTRL, 0xd6, Data);
-
- Data = ODT_Control_DDR2[1];
- pci_write_config8(MEMCTRL, 0xd3, Data);
-
- Data = pci_read_config8(MEMCTRL, 0x9e);
- //set MD turn_around wait state
- Data &= 0xCF; /*clear bit4,5 */
- if (DIMMFREQ_400 == DramAttr->DramFreq)
- Data |= 0x0;
- else if (DIMMFREQ_533 == DramAttr->DramFreq)
- Data |= 0x10;
- else if (DIMMFREQ_667 == DramAttr->DramFreq)
- Data |= 0x20;
- else if (DIMMFREQ_800 == DramAttr->DramFreq)
- Data |= 0x20;
- else
- Data |= 0;
- pci_write_config8(MEMCTRL, 0x9e, Data);
-
-
- if (DIMMFREQ_400 == DramAttr->DramFreq)
- Data = 0x0;
- else if (DIMMFREQ_533 == DramAttr->DramFreq)
- Data = 0x11;
- else if (DIMMFREQ_667 == DramAttr->DramFreq)
- Data = 0x11;
- else if (DIMMFREQ_800 == DramAttr->DramFreq)
- Data = 0x11;
- else
- Data = 0;
- pci_write_config8(MEMCTRL, 0x9f, Data);
-
-
- /*channel A ODT select */
- if (DramAttr->DimmNumChA > 0) {
- Data = pci_read_config8(MEMCTRL, 0xd5);
- Data &= 0x5F; /*clear bit7,5 */
- if (DramAttr->RankNumChA > 2)
- Data |= 0xA0; /*if rank number > 2 (3or4), set bit7,5 */
- else
- Data |= 0x00; /*if rank number is 1or2, clear bit5 */
- pci_write_config8(MEMCTRL, 0xd5, Data);
-
- Data = pci_read_config8(MEMCTRL, 0xd7);
- Data &= 0xEF; /*clear bit7 */
- if (DramAttr->RankNumChA > 2)
- Data |= 0x80; /*if rank number > 2 (3or4), set bit7 */
- else
- Data |= 0x00; /*if rank number is 1or2, clear bit7 */
- pci_write_config8(MEMCTRL, 0xd7, Data);
-
-
- /*channel A */
- Data = pci_read_config8(MEMCTRL, 0xd5);
- Data &= 0xF3; //bit2,3
- if (DramAttr->DimmNumChA == 2) /*2 Dimm, 3or4 Ranks */
- Data |= 0x00;
- else if (DramAttr->DimmNumChA == 1)
- Data |= 0x04;
- pci_write_config8(MEMCTRL, 0xd5, Data);
-
- if ((DramAttr->RankPresentMap & 0x0F) != 0) { /*channel A */
- // MAA ODT Lookup Table
- bFound = FALSE;
- for (i = 0; i < ODTLookup_Tbl_count; i++) {
- if ((DramAttr->RankPresentMap & 0x0F) ==
- ODTLookup_TBL[i][0]) {
- Data = ODTLookup_TBL[i][1];
- bFound = TRUE;
- }
- }
- if (!bFound) { /*set default value */
- Data =
- ODTLookup_TBL[ODTLookup_Tbl_count -
- 1][1];
- }
- pci_write_config8(MEMCTRL, 0x9c, Data);
-
-
- //set CHA MD ODT control State Dynamic-on
- Data = pci_read_config8(MEMCTRL, 0xD4);
- Data &= 0xC9;
- Data |= 0x30;
- pci_write_config8(MEMCTRL, 0xD4, Data);
-
- Data = pci_read_config8(MEMCTRL, 0x9e);
- Data |= 0x01;
- pci_write_config8(MEMCTRL, 0x9e, Data);
- }
-
- }
- /*channel B */
- if (1 == ENABLE_CHC) {
- //CHB has not auto compensation mode ,so must set it manual,or else CHB initialization will not successful
- // Data =0x88;
- //pci_write_config8(MEMCTRL, 0xd0, Data);
-
- Data = pci_read_config8(MEMCTRL, 0xd5);
- Data &= 0xAF;
- if (DramAttr->RankNumChB > 2) /*rank number 3 or 4 */
- Data |= 0x50;
- else
- Data |= 0x00;
- pci_write_config8(MEMCTRL, 0xd5, Data);
-
- Data = pci_read_config8(MEMCTRL, 0xd7);
- Data &= 0xBF; /*clear bit6 */
- if (DramAttr->RankNumChB > 2)
- Data |= 0x40; /*if rank number > 2 (3or4), set bit7 */
- else
- Data |= 0x00; /*if rank number is 1or2, clear bit7 */
- pci_write_config8(MEMCTRL, 0xd7, Data);
-
-
- Data = pci_read_config8(MEMCTRL, 0xd5);
- Data &= 0xFC;
- if (DramAttr->DimmNumChB == 2) /*2 Dimm, 3or4 Ranks */
- Data |= 0x00; // 2 dimm RxD5[2,0]=0,0b
- else if (DramAttr->DimmNumChB == 1)
- Data |= 0x01; // 1 dimm RxD5[2,0]=1,1b
- pci_write_config8(MEMCTRL, 0xd5, Data);
-
- //set CHB MD ODT control State Dynamic-on
- Data = pci_read_config8(MEMCTRL, 0xD4);
- Data &= 0xF6;
- Data |= 0x08;
- pci_write_config8(MEMCTRL, 0xD4, Data);
-
-
- //enable CHB differential DQS input
- Data = pci_read_config8(MEMCTRL, 0x9E);
- Data |= 0x02;
- pci_write_config8(MEMCTRL, 0x9E, Data);
- }
- //enable ODT Control
- Data = pci_read_config8(MEMCTRL, 0x9e);
- Data |= 0x80;
- pci_write_config8(MEMCTRL, 0x9e, Data);
-}
-
-void DrivingDQS(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
-
- /*channel A */
- if (DramAttr->RankNumChA > 0) {
- Data = DDR2_DQSA_Driving_Table[DramAttr->RankNumChA - 1];
- pci_write_config8(MEMCTRL, 0xe0, Data);
- }
-
- /*channel B */
- if (1 == ENABLE_CHC) {
- Data = DDR2_DQSB_Driving_Table[DramAttr->RankNumChB - 1];
- pci_write_config8(MEMCTRL, 0xe1, Data);
- }
-
-}
-
-void DrivingDQ(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
-
- /*channel A */
- if (DramAttr->RankNumChA > 0) {
- Data = DDR2_DQA_Driving_Table[DramAttr->RankNumChA - 1];
- pci_write_config8(MEMCTRL, 0xe2, Data);
-
- }
- /*channel B */
- if (1 == ENABLE_CHC) {
- Data = DDR2_DQB_Driving_Table[DramAttr->RankNumChB - 1];
- pci_write_config8(MEMCTRL, 0xe3, Data);
- }
-}
-
-void DrivingCS(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- /*Channel A */
- if (DramAttr->RankNumChA > 0) {
- Data = DDR2_CSA_Driving_Table_x8[DramAttr->RankNumChA - 1];
- pci_write_config8(MEMCTRL, 0xe4, Data);
- }
- /*channel B */
- if (1 == ENABLE_CHC) {
- Data = DDR2_CSB_Driving_Table_x8[DramAttr->RankNumChB - 1];
- pci_write_config8(MEMCTRL, 0xe5, Data);
- }
-}
-
-void DrivingMA(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- u8 i, FreqId;
-
- if (DramAttr->RankNumChA > 0) {
- if (DIMMFREQ_400 == DramAttr->DramFreq)
- FreqId = 1;
- else if (DIMMFREQ_533 == DramAttr->DramFreq)
- FreqId = 2;
- else if (DIMMFREQ_667 == DramAttr->DramFreq)
- FreqId = 3;
- else if (DIMMFREQ_800 == DramAttr->DramFreq)
- FreqId = 4;
- else
- FreqId = 1;
- for (i = 0; i < MA_Table; i++) {
- if (DramAttr->LoadNumChA <=
- DDR2_MAA_Driving_Table[i][0]) {
- Data = DDR2_MAA_Driving_Table[i][FreqId];
- break;
- }
- }
- pci_write_config8(MEMCTRL, 0xe8, Data);
- }
- if (1 == ENABLE_CHC) {
- for (i = 0; i < MA_Table; i++) {
- if (DramAttr->LoadNumChA <=
- DDR2_MAB_Driving_Table[i][0]) {
- Data = DDR2_MAB_Driving_Table[i][1];
- break;
- }
- }
- pci_write_config8(MEMCTRL, 0xe9, Data);
- }
-}
-
-void DrivingDCLK(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- u8 FreqId;
-
- if (DIMMFREQ_400 == DramAttr->DramFreq)
- FreqId = 0;
- else if (DIMMFREQ_533 == DramAttr->DramFreq)
- FreqId = 1;
- else if (DIMMFREQ_667 == DramAttr->DramFreq)
- FreqId = 2;
- else if (DIMMFREQ_800 == DramAttr->DramFreq)
- FreqId = 4;
- else
- FreqId = 0;
-
- /*channel A */
- if (DramAttr->RankNumChA > 0) {
- Data = DDR2_DCLKA_Driving_Table[FreqId];
- pci_write_config8(MEMCTRL, 0xe6, Data);
- }
- /*channel B */
- if (1 == ENABLE_CHC) {
- Data = DDR2_DCLKB_Driving_Table[FreqId];
- pci_write_config8(MEMCTRL, 0xe7, Data);
- }
-
-}
Deleted: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/FinalSetting.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/FinalSetting.c 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/FinalSetting.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -1,129 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2009 One Laptop per Child, Association, Inc.
- *
- * 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
- */
-
-static const u8 RefreshCounter[7][2] = {
- //Non_256Mbit, 256Mbit
- {0xCA, 0xA8}, // DRAM400
- {0xCA, 0xA8}, // DRAM333
- {0xCA, 0x86}, // DRAM266
- {0xCA, 0x65}, // DRAM200
- {0xA8, 0x54}, // DRAM166
- {0x86, 0x43}, // DRAM133
- {0x65, 0x32} // DRAM100
-};
-
-void DRAMRefreshCounter(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- u8 Freq = 5, i, Dram_256_Mb;
- if (DramAttr->DramFreq == DIMMFREQ_800)
- Freq = 0;
- else if (DramAttr->DramFreq == DIMMFREQ_667)
- Freq = 1;
- else if (DramAttr->DramFreq == DIMMFREQ_533)
- Freq = 2;
- else if (DramAttr->DramFreq == DIMMFREQ_400)
- Freq = 3;
- else if (DramAttr->DramFreq == DIMMFREQ_333)
- Freq = 4;
- else if (DramAttr->DramFreq == DIMMFREQ_266)
- Freq = 5;
- else if (DramAttr->DramFreq == DIMMFREQ_200)
- Freq = 6;
- else
- Freq = 6;
-
- Dram_256_Mb = 0;
- for (i = 0; i < MAX_SOCKETS; i++) {
- if (DramAttr->DimmInfo[i].SPDDataBuf[SPD_SDRAM_ROW_ADDR] ==
- 13) {
- Dram_256_Mb = 1;
- break;
- }
- }
-
- Data = RefreshCounter[Freq][Dram_256_Mb];
-
- pci_write_config8(MEMCTRL, 0x6a, Data);
-}
-
-
-/*===================================================================
-Function : DRAMRegFinalValue()
-Precondition :
-Input :
- DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
- in MotherBoard
-Output : Void
-Purpose : Chipset Performance UP and other setting after DRAM Sizing
- Turn on register directly to promote performance
-===================================================================*/
-
-//--------------------------------------------------------------------------
-// register AND OR
-//--------------------------------------------------------------------------
-#define DRAM_table_item 9
-static const u8 DRAM_table[DRAM_table_item][3] = {
- {0x60, 0xff, 0xD0},
- {0x66, 0xcf, 0x80}, // DRAMC queue > 2
- {0x69, 0xff, 0x07}, // Enable multiple page
- {0x95, 0x00, 0x0D},
- {0x96, 0x0F, 0xA0},
- {0xFB, 0x00, 0x3E},
- {0xFD, 0x00, 0xA9},
- {0xFE, 0x00, 0x0f},
- {0xFF, 0x00, 0x3D}
-};
-
-#define PM_table_item 5
-static const u8 PM_table[PM_table_item][3] = {
- {0xA0, 0x0F, 0xF0},
- {0xA1, 0x1F, 0xE0},
- {0xA2, 0x00, 0xFE},
- {0xA3, 0x7F, 0x80},
- {0xA5, 0x7E, 0x81},
-};
-
-void DRAMRegFinalValue(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- u8 i;
-
- for (i = 0; i < DRAM_table_item; i++) {
- Data = pci_read_config8(MEMCTRL, DRAM_table[i][0]);
- Data = (u8) ((Data & DRAM_table[i][1]) | DRAM_table[i][2]);
- pci_write_config8(MEMCTRL, DRAM_table[i][0], Data);
- }
-
- //enable dram By-Rank self refresh
- Data = pci_read_config8(MEMCTRL, 0x96);
- Data &= 0xF0;
- for (i = 0x01; i < 0x10; i = i << 1) {
- if ((DramAttr->RankPresentMap & i) != 0x00)
- Data |= i;
- }
- pci_write_config8(MEMCTRL, 0x96, Data);
-
- for (i = 0; i < PM_table_item; i++) {
- Data = pci_read_config8(PCI_DEV(0, 0, 4), PM_table[i][0]);
- Data = (u8) ((Data & PM_table[i][1]) | PM_table[i][2]);
- pci_write_config8(PCI_DEV(0, 0, 4), PM_table[i][0], Data);
- }
-
-}
Deleted: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/FreqSetting.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/FreqSetting.c 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/FreqSetting.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -1,235 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2009 One Laptop per Child, Association, Inc.
- *
- * 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
- */
-
-void CalcCLAndFreq(DRAM_SYS_ATTR * DramAttr);
-
-/*
- Set DRAM Frequency
-*/
-void DRAMFreqSetting(DRAM_SYS_ATTR * DramAttr)
-{
-
- u8 Data = 0;
-
- PRINT_DEBUG_MEM("Dram Frequency setting \r");
-
- //calculate dram frequency using SPD data
- CalcCLAndFreq(DramAttr);
-
- //init some Dramc control by Simon Chu slide
- //Must use "CPU delay" to make sure VLINK is dis-connect
- Data = pci_read_config8(PCI_DEV(0, 0, 7), 0x47);
- Data = (u8) (Data | 0x04);
- pci_write_config8(PCI_DEV(0, 0, 7), 0x47, Data);
-
- //in order to make sure NB command buffer don`t have pending request(C2P cycle)
- //CPU DELAY
- WaitMicroSec(20);
-
- //Before Set Dram Frequency, we must set 111 by Simon Chu slide.
- Data = pci_read_config8(MEMCTRL, 0x90);
- Data = (u8) ((Data & 0xf8) | 7);
- pci_write_config8(MEMCTRL, 0x90, Data);
-
- WaitMicroSec(20);
-
- //Set Dram Frequency.
- Data = pci_read_config8(MEMCTRL, 0x90);
- switch (DramAttr->DramFreq) {
- case DIMMFREQ_400:
- Data = (u8) ((Data & 0xf8) | 3);
- break;
- case DIMMFREQ_533:
- Data = (u8) ((Data & 0xf8) | 4);
- break;
- case DIMMFREQ_667:
- Data = (u8) ((Data & 0xf8) | 5);
- break;
- case DIMMFREQ_800:
- Data = (u8) ((Data & 0xf8) | 6);
- break;
- default:
- Data = (u8) ((Data & 0xf8) | 1);;
- }
- pci_write_config8(MEMCTRL, 0x90, Data);
-
- //CPU Delay
- WaitMicroSec(20);
-
- // Manual reset and adjust DLL when DRAM change frequency
- Data = pci_read_config8(MEMCTRL, 0x6B);
- Data = (u8) ((Data & 0x2f) | 0xC0);
- pci_write_config8(MEMCTRL, 0x6B, Data);
-
- //CPU Delay
- WaitMicroSec(20);
-
- Data = pci_read_config8(MEMCTRL, 0x6B);
- Data = (u8) (Data | 0x10);
- pci_write_config8(MEMCTRL, 0x6B, Data);
-
- //CPU Delay
- WaitMicroSec(20);
-
- Data = pci_read_config8(MEMCTRL, 0x6B);
- Data = (u8) (Data & 0x3f);
- pci_write_config8(MEMCTRL, 0x6B, Data);
-
- //disable V_LINK Auto-Disconnect, or else program may stopped at some place and
- //we cannot find the reason
- Data = pci_read_config8(PCI_DEV(0, 0, 7), 0x47);
- Data = (u8) (Data & 0xFB);
- pci_write_config8(PCI_DEV(0, 0, 7), 0x47, Data);
-
-}
-
-
-/*
- calculate CL and dram freq
- DDR1
- +---+---+---+---+---+---+---+---+
- | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
- +---+---+---+---+---+---+---+---+
- |TBD| 4 |3.5| 3 |2.5| 2 |1.5| 1 |
- +---+---+---+---+---+---+---+---+
- DDR2
- +---+---+---+---+---+---+---+---+
- | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
- +---+---+---+---+---+---+---+---+
- |TBD| 6 | 5 | 4 | 3 | 2 |TBD|TBD|
- +---+---+---+---+---+---+---+---+
-*/
-static const u8 CL_DDR1[7] = { 10, 15, 20, 25, 30, 35, 40 };
-static const u8 CL_DDR2[7] = { 0, 0, 20, 30, 40, 50, 60 };
-
-void CalcCLAndFreq(DRAM_SYS_ATTR * DramAttr)
-{
- u8 AllDimmSupportedCL, Tmp;
- u8 CLMask, tmpMask, IndexDelta;
- u8 SckId, BitId, TmpId;
- u16 CycTime, TmpCycTime;
-
- /*1.list the CL value that all DIMM supported */
- AllDimmSupportedCL = 0xFF;
- if (RAMTYPE_SDRAMDDR2 == DramAttr->DramType)
- AllDimmSupportedCL &= 0x7C; /*bit2,3,4,5,6 */
- else /*DDR1 */
- AllDimmSupportedCL &= 0x7F; /*bit0,1,2,3,4,5,6 */
- for (SckId = 0; SckId < MAX_SOCKETS; SckId++) {
- if (DramAttr->DimmInfo[SckId].bPresence) { /*all DIMM supported CL */
- AllDimmSupportedCL &=
- (DramAttr->DimmInfo[SckId].
- SPDDataBuf[SPD_SDRAM_CAS_LATENCY]);
- }
- }
- if (!AllDimmSupportedCL) { /*if equal 0, no supported CL */
- PRINT_DEBUG_MEM("SPD Data Error, Can not get CL !!!! \r");
- for (;;);
- }
-
- /*Get CL Value */
- CLMask = 0x40; /*from Bit6 */
-
- for (BitId = 7; BitId > 0; BitId--) {
- if ((AllDimmSupportedCL & CLMask) == CLMask) { /*find the first bit */
- if (RAMTYPE_SDRAMDDR2 == DramAttr->DramType)
- DramAttr->CL = CL_DDR2[BitId - 1];
- else /*DDR1 */
- DramAttr->CL = CL_DDR1[BitId - 1];
- break;
- }
- CLMask >>= 1;
- }
-
- /*according the CL value calculate the cycle time, for X or X-1 or X-2 */
- CycTime = 0;
- TmpCycTime = 0;
-
- for (SckId = 0; SckId < MAX_SOCKETS; SckId++) {
- if (DramAttr->DimmInfo[SckId].bPresence) {
- Tmp =
- (DramAttr->DimmInfo[SckId].
- SPDDataBuf[SPD_SDRAM_CAS_LATENCY]);
- tmpMask = 0x40;
- for (TmpId = 7; TmpId > 0; TmpId--) {
- if ((Tmp & tmpMask) == tmpMask)
- break;
- tmpMask >>= 1;
- }
- if (TmpId - BitId == 0) { /*get Cycle time for X, SPD BYTE9 */
- TmpCycTime =
- DramAttr->DimmInfo[SckId].
- SPDDataBuf[SPD_SDRAM_TCLK_X];
- } else if (TmpId - BitId == 1) { /*get Cycle time for X-1, SPD BYTE23 */
- TmpCycTime =
- DramAttr->DimmInfo[SckId].
- SPDDataBuf[SPD_SDRAM_TCLK_X_1];
- } else if (TmpId - BitId == 2) { /*get cycle time for X-2, SPD BYTE25 */
- TmpCycTime =
- DramAttr->DimmInfo[SckId].
- SPDDataBuf[SPD_SDRAM_TCLK_X_2];
- } else {
- //error!!!
- }
- if (TmpCycTime > CycTime) /*get the most cycle time,there is some problem! */
- CycTime = TmpCycTime;
- }
- }
-
- if (CycTime <= 0) {
- //error!
- for (;;);
- }
-
- /* cycle time value
- 0x25-->2.5ns Freq=400 DDR800
- 0x30-->3.0ns Freq=333 DDR667
- 0x3D-->3.75ns Freq=266 DDR533
- 0x50-->5.0ns Freq=200 DDR400
- 0x60-->6.0ns Freq=166 DDR333
- 0x75-->7.5ns Freq=133 DDR266
- 0xA0-->10.0ns Freq=100 DDR200
- */
- if (CycTime <= 0x25) {
- DramAttr->DramFreq = DIMMFREQ_800;
- DramAttr->DramCyc = 250;
- } else if (CycTime <= 0x30) {
- DramAttr->DramFreq = DIMMFREQ_667;
- DramAttr->DramCyc = 300;
- } else if (CycTime <= 0x3d) {
- DramAttr->DramFreq = DIMMFREQ_533;
- DramAttr->DramCyc = 375;
- } else if (CycTime <= 0x50) {
- DramAttr->DramFreq = DIMMFREQ_400;
- DramAttr->DramCyc = 500;
- } else if (CycTime <= 0x60) {
- DramAttr->DramFreq = DIMMFREQ_333;
- DramAttr->DramCyc = 600;
- } else if (CycTime <= 0x75) {
- DramAttr->DramFreq = DIMMFREQ_266;
- DramAttr->DramCyc = 750;
- } else if (CycTime <= 0xA0) {
- DramAttr->DramFreq = DIMMFREQ_200;
- DramAttr->DramCyc = 1000;
- }
- //if set the frequence mannul
- PRINT_DEBUG_MEM("Dram Frequency:");
- PRINT_DEBUG_MEM_HEX16(DramAttr->DramFreq);
- PRINT_DEBUG_MEM(" \r");
-}
Deleted: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/RankMap.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/RankMap.c 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/RankMap.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -1,363 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2009 One Laptop per Child, Association, Inc.
- *
- * 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
- */
-
-extern void DRAMSetVRNum(DRAM_SYS_ATTR * DramAttr,
- u8 PhyRank, u8 VirRank, BOOLEAN Enable);
-
-extern void SetEndingAddr(DRAM_SYS_ATTR * DramAttr, u8 VirRank, // Ending address register number indicator (INDEX
- INT8 Value); // (value) add or subtract value to this and after banks
-
-
-void DRAMClearEndingAddress(DRAM_SYS_ATTR * DramAttr);
-
-void DRAMSizingEachRank(DRAM_SYS_ATTR * DramAttr);
-
-BOOLEAN DoDynamicSizing1XM(DRAM_SYS_ATTR * DramAttr,
- u8 * nRA, u8 * nCA, u8 * nBS, u8 PhyRank);
-
-void DRAMSetRankMAType(DRAM_SYS_ATTR * DramAttr);
-
-void DRAMSetEndingAddress(DRAM_SYS_ATTR * DramAttr);
-
-void DRAMPRToVRMapping(DRAM_SYS_ATTR * DramAttr);
-
-/*===================================================================
-Function : DRAMBankInterleave()
-Precondition :
-Input :
- DramAttr: pointer point to DRAMSYSATTR which consist the DDR and Dimm information in MotherBoard
-Output : Void
-Purpose : STEP 13 Set Bank Interleave VIANB3DRAMREG69[7:6] 00:No Interleave 01:2 Bank 10:4 Bank 11:8 Bank
- Scan all DIMMs on board to find out the lowest Bank Interleave among these DIMMs and set register.
-===================================================================*/
-void DRAMBankInterleave(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data, SpdBAData;
- DIMM_INFO *CurrentDimminfo;
- u8 Bank = 3, Shift, RankNO, Count;
- Shift = 1;
- for (RankNO = 0; RankNO < 4; RankNO += 2) //all_even 0 RankNO 4 6
- {
- if ((DramAttr->RankPresentMap & Shift) != 0) {
- CurrentDimminfo = &(DramAttr->DimmInfo[RankNO >> 1]); //this Rank in a dimm
- SpdBAData =
- (u8) (CurrentDimminfo->
- SPDDataBuf[SPD_SDRAM_NO_OF_BANKS]);
- if (SpdBAData == 4)
- Count = 2;
- else if (SpdBAData == 8)
- Count = 3;
- else
- Count = 0;
- if (Count < Bank)
- Bank = Count;
- }
- Shift <<= 2;
- }
-
- Data = pci_read_config8(MEMCTRL, 0x69);
- Data &= ~0xc0;
- Data |= (Bank << 6);
- pci_write_config8(MEMCTRL, 0x69, Data);
-
-
- if (DramAttr->DimmNumChB > 0) {
- CurrentDimminfo = &(DramAttr->DimmInfo[3]); //this Rank in a dimm
- SpdBAData =
- (u8) (CurrentDimminfo->
- SPDDataBuf[SPD_SDRAM_NO_OF_BANKS]);
- if (SpdBAData == 4)
- Bank = 2;
- else if (SpdBAData == 2)
- Bank = 1;
- else
- Bank = 0;
- pci_write_config8(MEMCTRL, 0x87, Bank);
- }
-}
-
-/*===================================================================
-Function : DRAMSizingMATypeM()
-Precondition :
-Input :
- DramAttr: pointer point to DRAMSYSATTR which consist the DDR and Dimm information in MotherBoard
-Output : Void
- Purpose : STEP 14 1 DRAM Sizing 2 Fill MA type 3 Prank to vrankMapping
-===================================================================*/
-void DRAMSizingMATypeM(DRAM_SYS_ATTR * DramAttr)
-{
- DRAMClearEndingAddress(DramAttr);
- DRAMSizingEachRank(DramAttr);
- //DRAMReInitDIMMBL (DramAttr);
- DRAMSetRankMAType(DramAttr);
- DRAMSetEndingAddress(DramAttr);
- DRAMPRToVRMapping(DramAttr);
-}
-
-/*===================================================================
-Function : DRAMClearEndingAddress()
-Precondition :
-Input :
- DramAttr: pointer point to DRAMSYSATTR which consist the DDR and Dimm information in MotherBoard
-Output : Void
-Purpose : clear Ending and Start adress from 0x40-4f to zero
-===================================================================*/
-void DRAMClearEndingAddress(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data, Reg;
- Data = 0;
- for (Reg = 0x40; Reg <= 0x4f; Reg++) {
- pci_write_config8(MEMCTRL, Reg, Data);
- }
-}
-
-/*===================================================================
-Function : DRAMSizingEachRank()
-Precondition :
-Input :
- DramAttr: pointer point to DRAMSYSATTR which consist the DDR and Dimm information in MotherBoard
-Output : Void
-Purpose : Sizing each Rank invidually, by number of rows column banks pins, be care about 128bit
-===================================================================*/
-void DRAMSizingEachRank(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Slot, RankIndex, Rows, Columns, Banks;
- u32 Size;
- BOOLEAN HasThreeBitBA;
- u8 Data;
- u32 Address;
-
- HasThreeBitBA = FALSE;
- for (Slot = 0; Slot < 2; Slot++) {
- if (!DramAttr->DimmInfo[Slot].bPresence)
- continue;
- Rows =
- DramAttr->DimmInfo[Slot].
- SPDDataBuf[SPD_SDRAM_ROW_ADDR];
- Columns =
- DramAttr->DimmInfo[Slot].
- SPDDataBuf[SPD_SDRAM_COL_ADDR];
- Banks = DramAttr->DimmInfo[Slot].SPDDataBuf[SPD_SDRAM_NO_OF_BANKS]; //this is Bank number not Bank address bit
- if (Banks == 4)
- Banks = 2;
- else if (Banks == 8)
- Banks = 3;
- else
- Banks = 0;
- Size = (u32) (1 << (Rows + Columns + Banks + 3));
- RankIndex = 2 * Slot;
- DramAttr->RankSize[RankIndex] = Size;
- //if this module have two ranks
- if ((DramAttr->DimmInfo[Slot].
- SPDDataBuf[SPD_SDRAM_DIMM_RANKS] & 0x07) == 0x01) {
- RankIndex++;
- DramAttr->RankSize[RankIndex] = Size;
- }
-
- PRINT_DEBUG_MEM("rows: ");
- PRINT_DEBUG_MEM_HEX8(Rows);
- PRINT_DEBUG_MEM(", columns:");
- PRINT_DEBUG_MEM_HEX8(Columns);
- PRINT_DEBUG_MEM(", banks:");
- PRINT_DEBUG_MEM_HEX8(Banks);
- PRINT_DEBUG_MEM("\r");
-
- if (Banks == 3)
- HasThreeBitBA = TRUE;
- }
-
- //must set BA2 enable if any 8-bank device exists
- if (HasThreeBitBA) {
- Data = pci_read_config8(MEMCTRL, 0x53);
- Data |= 0x80;
- pci_write_config8(MEMCTRL, 0x53, Data);
- }
-#if 1
- for (RankIndex = 0; DramAttr->RankSize[RankIndex] != 0;
- RankIndex++) {
- PRINT_DEBUG_MEM("Rank:");
- PRINT_DEBUG_MEM_HEX8(RankIndex);
- PRINT_DEBUG_MEM(", Size:");
- PRINT_DEBUG_MEM_HEX32(DramAttr->RankSize[RankIndex] >> 20);
- PRINT_DEBUG_MEM("\r");
- }
-#endif
-}
-
-/*===================================================================
-Function : DRAMSetRankMAType()
-Precondition :
-Input :
- DramAttr: pointer point to DRAMSYSATTR which consist the DDR and Dimm information in MotherBoard
-Output : Void
-Purpose : set the matype Reg by MAMapTypeTbl, which the rule can be found in memoryinit
-===================================================================*/
-void DRAMSetRankMAType(DRAM_SYS_ATTR * DramAttr)
-{
- u8 SlotNum, Data, j, Reg, or, and;
- u8 ShiftBits[] = { 5, 1, 5, 1 }; /* Rank 0/1 MA Map Type is 7:5, Rank 2/3 MA Map Type is 3:1. See Fun3Rx50. */
- u8 MAMapTypeTbl[] = { /* Table 12 of P4M800 Pro DataSheet. */
- 2, 9, 0, /* Bank Address Bits, Column Address Bits, Rank MA Map Type */
- 2, 10, 1,
- 2, 11, 2,
- 2, 12, 3,
- 3, 10, 5,
- 3, 11, 6,
- 3, 12, 7,
- 0, 0, 0
- };
- Data = pci_read_config8(MEMCTRL, 0x50);
- Data &= 0x1;
- pci_write_config8(MEMCTRL, 0x50, Data);
- // disable MA32/16 MA33/17 swap in memory init it has this Reg fill
- Data = pci_read_config8(MEMCTRL, 0x6b);
- Data &= ~0x08;
- pci_write_config8(MEMCTRL, 0x6b, Data);
-
- Data = 0x00;
- for (SlotNum = 0; SlotNum < MAX_DIMMS; SlotNum++) {
- if (DramAttr->DimmInfo[SlotNum].bPresence) {
- for (j = 0; MAMapTypeTbl[j] != 0; j += 3) {
- if ((1 << MAMapTypeTbl[j]) ==
- DramAttr->DimmInfo[SlotNum].
- SPDDataBuf[SPD_SDRAM_NO_OF_BANKS]
- && MAMapTypeTbl[j + 1] ==
- DramAttr->DimmInfo[SlotNum].
- SPDDataBuf[SPD_SDRAM_COL_ADDR]) {
- break;
- }
- }
- if (0 == MAMapTypeTbl[j]) {
- PRINT_DEBUG_MEM
- ("UNSUPPORTED Bank, Row and Column Addr Bits!\r");
- return;
- }
- or = MAMapTypeTbl[j + 2] << ShiftBits[SlotNum];
- if (DramAttr->CmdRate == 1)
- or |= 0x01 << (ShiftBits[SlotNum] - 1);
-
- Reg = SlotNum / 2;
- if ((SlotNum & 0x01) == 0x01) {
- and = 0xf1; // BUGBUG: it should be 0xf0
- } else {
- and = 0x1f; // BUGBUG: it should be 0x0f
- }
- Data = pci_read_config8(MEMCTRL, 0x50 + Reg);
- Data &= and;
- Data |= or;
- pci_write_config8(MEMCTRL, 0x50 + Reg, Data);
- }
- }
- //may have some Reg filling at add 3-52 11 and 3-53 in his function
-}
-
-/*===================================================================
-Function : DRAMSetEndingAddress()
-Precondition :
-Input :
- DramAttr: pointer point to DRAMSYSATTR which consist the DDR and Dimm information in MotherBoard
-Output : Void
-Purpose : realize the Vrank 40...Reg (Start and Ending Regs). Vrank have same order with phy Rank, Size is actual Size
-===================================================================*/
-void DRAMSetEndingAddress(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Shift = 1, Data, RankNO, Size, Start = 0, End = 0, Vrank;
- for (RankNO = 0; RankNO < 4; RankNO++) {
- if ((DramAttr->RankPresentMap & Shift) != 0) {
- Size = (u8) (DramAttr->RankSize[RankNO] >> 26); // current Size in the unit of 64M
- if (Size != 0) {
-
- End = End + Size; // calculate current ending address, add the current Size to ending
- Vrank = RankNO; // get virtual Rank
- Data = End; // set begin/End address register to correspondig virtual Rank #
- pci_write_config8(MEMCTRL, 0x40 + Vrank,
- Data);
- Data = Start;
- pci_write_config8(MEMCTRL, 0x48 + Vrank,
- Data);
- PRINT_DEBUG_MEM("Rank: ");
- PRINT_DEBUG_MEM_HEX8(Vrank);
- PRINT_DEBUG_MEM(", Start:");
- PRINT_DEBUG_MEM_HEX8(Start);
- PRINT_DEBUG_MEM(", End:");
- PRINT_DEBUG_MEM_HEX8(End);
- PRINT_DEBUG_MEM("\r");
-
- Start = End;
- }
- }
- Shift <<= 1;
- }
-
- if (DramAttr->RankNumChB > 0) {
- //this is a bug,fixed is to 2,so the max LL size is 128M
- Data = 0x02;
- pci_write_config8(MEMCTRL, 0x44, Data);
- }
- Data = End * 4;
- pci_write_config8(PCI_DEV(0, 17, 7), 0x60, Data);
- // We should directly write to south Bridge, not in north bridge
- // program LOW TOP Address
- Data = pci_read_config8(MEMCTRL, 0x88);
- pci_write_config8(MEMCTRL, 0x85, Data);
-
- // also program vlink mirror
- // We should directly write to south Bridge, not in north bridge
- pci_write_config8(PCI_DEV(0, 17, 7), 0xe5, Data);
-}
-
-/*===================================================================
-Function : DRAMPRToVRMapping()
-Precondition :
-Input :
- DramAttr: pointer point to DRAMSYSATTR which consist the DDR and Dimm information in MotherBoard
-Output : Void
-Purpose : set the Vrank-prank map with the same order
-===================================================================*/
-void DRAMPRToVRMapping(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Shift, Data, and, or, DimmNO = 0, PhyRankNO, Reg;
-
- for (Reg = 0x54; Reg <= 0x57; Reg++) //clear the map-reg
- {
- Data = 0;
- pci_write_config8(MEMCTRL, Reg, Data);
- }
-
- Shift = 1;
- for (PhyRankNO = 0; PhyRankNO < MAX_RANKS; PhyRankNO++) {
- if ((DramAttr->RankPresentMap & Shift) != 0) {
- or = PhyRankNO; // get virtual Rank ,same with PhyRank
- or |= 0x08;
-
- if ((PhyRankNO & 0x01) == 0x01) // get mask for register
- and = 0xf0;
- else {
- and = 0x0f;
- or <<= 4;
- }
- DimmNO = (PhyRankNO >> 1);
- Data = pci_read_config8(MEMCTRL, 0x54 + DimmNO);
- Data &= and;
- Data |= or;
- pci_write_config8(MEMCTRL, 0x54 + DimmNO, Data);
- }
- Shift <<= 1;
- }
-}
Deleted: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/TimingSetting.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/TimingSetting.c 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/TimingSetting.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -1,492 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2009 One Laptop per Child, Association, Inc.
- *
- * 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
- */
-
- /*
- Set Dram Timing functions
- */
-
-void SetCL(DRAM_SYS_ATTR * DramAttr);
-
-void SetTrp(DRAM_SYS_ATTR * DramAttr);
-
-void SetTrcd(DRAM_SYS_ATTR * DramAttr);
-
-void SetTras(DRAM_SYS_ATTR * DramAttr);
-
-void SetTrfc(DRAM_SYS_ATTR * DramAttr);
-
-void SetTrrd(DRAM_SYS_ATTR * DramAttr);
-
-void SetTwr(DRAM_SYS_ATTR * DramAttr);
-
-void SetTwtr(DRAM_SYS_ATTR * DramAttr);
-
-void SetTrtp(DRAM_SYS_ATTR * DramAttr);
-
-/* Set DRAM Timing*/
-void DRAMTimingSetting(DRAM_SYS_ATTR * DramAttr)
-{
- PRINT_DEBUG_MEM("Set CAS latency value!");
- SetCL(DramAttr);
-
- PRINT_DEBUG_MEM("Set tRP value!");
- SetTrp(DramAttr);
-
- PRINT_DEBUG_MEM("Set tRCD value!");
- SetTrcd(DramAttr);
-
- PRINT_DEBUG_MEM("Set tRAS value!");
- SetTras(DramAttr);
-
- PRINT_DEBUG_MEM("Set tRFC value!");
- SetTrfc(DramAttr);
-
- PRINT_DEBUG_MEM("Set tRRD value!");
- SetTrrd(DramAttr);
-
- PRINT_DEBUG_MEM("Set tWR value!");
- SetTwr(DramAttr);
-
- PRINT_DEBUG_MEM("Set tWTR value!");
- SetTwtr(DramAttr);
-
- PRINT_DEBUG_MEM("Set tRTP value!");
- SetTrtp(DramAttr);
-}
-
-
-/*
-Set DRAM Timing: CAS Latency for DDR1
-D0F3RX62 bit[0:2] for CAS Latency;
-*/
-void SetCL(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- u8 CL;
-
- /*DDR2 CL Value: 20, 30, 40, 50 -> 2, 3, 4, 5 */
- CL = (u8) ((DramAttr->CL - 20) / 10); //000,001,010,011
-
- PRINT_DEBUG_MEM("CAS = ");
- PRINT_DEBUG_MEM_HEX8(CL);
- PRINT_DEBUG_MEM("\n");
- Data = pci_read_config8(MEMCTRL, 0x62);
- Data = (u8) ((Data & 0xf8) | CL);
- pci_write_config8(MEMCTRL, 0x62, Data);
-}
-
-
-/*
- Minimum row precharge time, Trp for DDR1/DDR2
- D0F3Rx64[3:2] for Trp 2T~5T
-*/
-#define MAX_TRP 6
-#define MIN_TRP 2
-
-void SetTrp(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- u16 Max, Tmp;
- u8 Socket;
-
-
- /*get the max Trp value from SPD data
- SPD Byte27, Bit7:2->1ns~63ns, Bit1:0->0ns, 0.25ns, 0.50ns, 0.75ns */
- Max = 0;
- for (Socket = 0; Socket < MAX_SOCKETS; Socket++) {
- if (DramAttr->DimmInfo[Socket].bPresence) {
- Tmp =
- (u16) (DramAttr->DimmInfo[Socket].
- SPDDataBuf[SPD_SDRAM_TRP]);
- if (Tmp > Max)
- Max = Tmp;
- }
- /*Calculate clock,this value should be 2T,3T,4T,5T */
- }
- Tmp =
- (u16) ((Max * 100 + ((DramAttr->DramCyc) << 2) -
- 1) / ((DramAttr->DramCyc) << 2));
- PRINT_DEBUG_MEM("Trp = ");
- PRINT_DEBUG_MEM_HEX16(Tmp);
- PRINT_DEBUG_MEM("\r");
-
- if (Tmp > MAX_TRP)
- Tmp = MAX_TRP;
- else if (Tmp < MIN_TRP)
- Tmp = MIN_TRP;
-
- Tmp -= 2; //00->2T, 01->3T, 10->4T, 11->5T
- Tmp <<= 1; //bit1,2,3
-
- Data = pci_read_config8(MEMCTRL, 0x64);
- Data = (u8) ((Data & 0xf1) | (u8) Tmp);
- pci_write_config8(MEMCTRL, 0x64, Data);
-
- //enable DDR2 8-Bank Device Timing Constraint
- Data = pci_read_config8(MEMCTRL, 0x62);
- Data = (u8) ((Data & 0xf7) | 0x08);
- pci_write_config8(MEMCTRL, 0x62, Data);
-}
-
-
-/*
-Minimum RAS to CAS dely,Trcd for DDR1/DDR2
-D0F3Rx64[7:6] for Trcd
-*/
-#define MAX_TRCD 6
-#define MIN_TRCD 2
-
-void SetTrcd(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- u16 Max, Tmp;
- u8 Socket;
-
-
- /*get the max Trcd value from SPD data
- SPD Byte29, Bit7:2->1ns~63ns, Bit1:0->0ns, 0.25ns, 0.50ns, 0.75ns */
- Max = 0;
- for (Socket = 0; Socket < MAX_SOCKETS; Socket++) {
- if (DramAttr->DimmInfo[Socket].bPresence) {
- Tmp =
- (u16) (DramAttr->DimmInfo[Socket].
- SPDDataBuf[SPD_SDRAM_TRCD]);
- if (Tmp > Max)
- Max = Tmp;
- }
- }
- /*Calculate clock,this value should be 2T,3T,4T,5T */
- Tmp =
- (u16) ((Max * 100 + ((DramAttr->DramCyc) << 2) -
- 1) / ((DramAttr->DramCyc) << 2));
- PRINT_DEBUG_MEM("Trcd =");
- PRINT_DEBUG_MEM_HEX16(Tmp);
- PRINT_DEBUG_MEM("\r");
-
- if (Tmp > MAX_TRCD)
- Tmp = MAX_TRCD;
- else if (Tmp < MIN_TRCD)
- Tmp = MIN_TRCD;
- Tmp -= 2; //00->2T, 01->3T, 10->4T, 11->5T
- Tmp <<= 5; //bit5,6,7
-
- Data = pci_read_config8(MEMCTRL, 0x64);
- Data = (u8) ((Data & 0x1f) | (u8) Tmp);
- pci_write_config8(MEMCTRL, 0x64, Data);
-
-}
-
-/*
- minimum active to precharge time,Tras for DDR1/DDR2
- D0F3Rx62[7:4] Tras
-*/
-#define MAX_TRAS 20 //20T
-#define MIN_TRAS 5 //5T
-void SetTras(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- u16 Max, Tmp;
- u8 Socket;
-
-
- /*get the max Tras value from SPD data
- SPD byte30: bit0:7 1ns~255ns */
- Max = 0;
- for (Socket = 0; Socket < MAX_SOCKETS; Socket++) {
- if (DramAttr->DimmInfo[Socket].bPresence) {
- Tmp =
- (u16) (DramAttr->DimmInfo[Socket].
- SPDDataBuf[SPD_SDRAM_TRAS]);
- if (Tmp > Max)
- Max = Tmp;
- }
- }
-
- /*Calculate clock,value range 5T-20T */
- Tmp =
- (u16) ((Max * 100 + DramAttr->DramCyc -
- 1) / (DramAttr->DramCyc));
- PRINT_DEBUG_MEM("Tras =");
- PRINT_DEBUG_MEM_HEX16(Tmp);
- PRINT_DEBUG_MEM("\r");
-
- if (Tmp > MAX_TRAS)
- Tmp = MAX_TRAS;
- else if (Tmp < MIN_TRAS)
- Tmp = MIN_TRAS;
- Tmp -= 5; //0->5T ... 1111->20T
- Tmp <<= 4; //bit4:7
-
- Data = pci_read_config8(MEMCTRL, 0x62);
- Data = (u8) ((Data & 0x0f) | (u8) Tmp);
- pci_write_config8(MEMCTRL, 0x62, Data);
-}
-
-/*
-Minimum refresh to activate/refresh command period Trfc for DDR1/DDR2
-D0F3Rx61[5:0] for Trfc
-*/
-
-#define MAX_TRFC 71 // Max supported,71T
-#define MIN_TRFC 8 // Min supported,8T
-
-void SetTrfc(DRAM_SYS_ATTR * DramAttr)
-{
-
- u8 Data;
- u32 Max, Tmp;
- u8 Byte40;
- u8 Socket;
-
- /*get the max Trfc value from SPD data */
- Max = 0;
- for (Socket = 0; Socket < MAX_SOCKETS; Socket++) {
- if (DramAttr->DimmInfo[Socket].bPresence) {
- Tmp =
- (u32) (DramAttr->DimmInfo[Socket].
- SPDDataBuf[SPD_SDRAM_TRFC]) * 100;
- /*only DDR2 need to add byte 40 bit[7:4] */
- Byte40 =
- (DramAttr->DimmInfo[Socket].
- SPDDataBuf[SPD_SDRAM_TRFC2]);
- /*if bit0 = 1, byte42(RFC)+256ns, SPD spec JEDEC standard No.21.c */
- if (Byte40 & 0x01)
- Tmp += (256 * 100);
- /*bit1,2,3 000->0ns+byte42; 001->0.25ns+byte42; 010->0.33ns+byte42; 011->0.5ns+byte42;100-> 0.75ns+byte42 */
- switch ((Byte40 >> 1) & 0x07) { /*bit1,2,3 */
- case 1:
- Tmp += 25;
- break;
- case 2:
- Tmp += 33;
- break;
- case 3:
- Tmp += 50;
- break;
- case 4:
- Tmp += 66;
- break;
- case 5:
- Tmp += 75;
- break;
- case 6: //what is FRU???
- default:
- break;
- }
- if (Tmp > Max)
- Max = Tmp;
- }
- }
-
- /*Calculate clock,value range 8T-71T */
- Tmp = (u16) ((Max + DramAttr->DramCyc - 1) / (DramAttr->DramCyc));
- PRINT_DEBUG_MEM("Trfc = ");
- PRINT_DEBUG_MEM_HEX16(Tmp);
- PRINT_DEBUG_MEM("\r");
- if (Tmp > MAX_TRFC)
- Tmp = MAX_TRFC;
- else if (Tmp < MIN_TRFC) {
- // return;
- Tmp = 0x40;
- }
- /*D0F3Rx61 bit[0:5] 0->8T ... 63->71T */
- Tmp -= 8;
-
- Data = pci_read_config8(MEMCTRL, 0x61);
- Data = (u8) ((Data & 0xc0) | ((u8) Tmp & 0x3f));
- pci_write_config8(MEMCTRL, 0x61, Data);
-}
-
-
-/*
-Minimum row active to row active delay: Trrd for DDR1/DDR2
-D0F3Rx61[7:6]:Trrd 00->2T, 01->3T, 10->4T, 11->5T
-*/
-#define MAX_TRRD 5
-#define MIN_TRRD 2
-
-void SetTrrd(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- u16 Max, Tmp;
- u8 Socket;
-
-
- /*get the max Trrd value from SPD data
- SPD Byte28, Bit7:2->1ns~63ns, Bit1:0->0ns, 0.25ns, 0.50ns, 0.75ns */
- Max = 0;
- for (Socket = 0; Socket < MAX_SOCKETS; Socket++) {
- if (DramAttr->DimmInfo[Socket].bPresence) {
- Tmp =
- (u16) (DramAttr->DimmInfo[Socket].
- SPDDataBuf[SPD_SDRAM_TRRD]);
- if (Tmp > Max)
- Max = Tmp;
- }
- }
-
- /*Calculate clock,this value should be 2T,3T,4T,5T */
- Tmp =
- (u16) ((Max * 100 + ((DramAttr->DramCyc) << 2) -
- 1) / ((DramAttr->DramCyc) << 2));
- PRINT_DEBUG_MEM("Trrd =");
- PRINT_DEBUG_MEM_HEX16(Tmp);
- PRINT_DEBUG_MEM("\r");
-
- if (Tmp > MAX_TRRD)
- Tmp = MAX_TRRD;
- else if (Tmp < MIN_TRRD)
- Tmp = MIN_TRRD;
- Tmp -= 2; //00->2T, 01->3T, 10->4T, 11->5T
- Tmp <<= 6;
-
- Data = pci_read_config8(MEMCTRL, 0x61);
- Data = (u8) ((Data & 0x3f) | (u8) Tmp);
- pci_write_config8(MEMCTRL, 0x61, Data);
-}
-
-
-/*
-Write recovery time: Twr for DDR1/DDR2
-Device 0 Function 3:REG63[7:5]:Twr 00->2T 01->3T 10->4T 11->5T
-*/
-#define MAX_TWR 6
-#define MIN_TWR 2
-
-void SetTwr(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- u16 Max, Tmp;
- u8 Socket;
-
- /*get the max Trtp value from SPD data
- SPD Byte36, Bit7:2->1ns~63ns, Bit1:0->0ns, 0.25ns, 0.50ns, 0.75ns */
- Max = 0;
- for (Socket = 0; Socket < MAX_SOCKETS; Socket++) {
- if (DramAttr->DimmInfo[Socket].bPresence) {
- Tmp =
- (u16) (DramAttr->DimmInfo[Socket].
- SPDDataBuf[SPD_SDRAM_TWR]);
- if (Tmp > Max)
- Max = Tmp;
- }
- }
- /*Calculate clock */
- Tmp = (u16) ((Max * 100 + ((DramAttr->DramCyc) << 2) - 1) / ((DramAttr->DramCyc) << 2)); //this value should be 2T,3T,4T,5T
- PRINT_DEBUG_MEM("Twr = ");
- PRINT_DEBUG_MEM_HEX16(Tmp);
- PRINT_DEBUG_MEM("\r");
-
- if (Tmp > MAX_TWR)
- Tmp = MAX_TWR;
- else if (Tmp < MIN_TWR)
- Tmp = MIN_TWR;
- Tmp -= 2; //00->2T, 01->3T, 10->4T, 11->5T
- Tmp <<= 5;
-
- Data = pci_read_config8(MEMCTRL, 0x63);
- Data = (u8) ((Data & 0x1f) | (u8) Tmp);
- pci_write_config8(MEMCTRL, 0x63, Data);
-}
-
-
-/*
-Internal write to read command delay: Twtr for DDR1/DDR2
-Device 0 Function 3:REG63[1,0]:Twtr DDR: 1T or 2T; DDR2 2T or 3T
-*/
-#define MAX_TWTR 5 //5T
-#define MIN_TWTR 2 //2T
-
-void SetTwtr(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- u16 Max, Tmp;
- u8 Socket;
-
- /*get the max Trtp value from SPD data
- SPD Byte37, Bit7:2->1ns~63ns, Bit1:0->0ns, 0.25ns, 0.50ns, 0.75ns */
- Max = 0;
- for (Socket = 0; Socket < MAX_SOCKETS; Socket++) {
- if (DramAttr->DimmInfo[Socket].bPresence) {
- Tmp =
- (u16) (DramAttr->DimmInfo[Socket].
- SPDDataBuf[SPD_SDRAM_TWTR]);
- if (Tmp > Max)
- Max = Tmp;
- }
- }
- /*Calculate clock */
- Tmp = (u16) ((Max * 100 + ((DramAttr->DramCyc) << 2) - 1) / ((DramAttr->DramCyc) << 2)); //this value should be 2T or 3T
-
- PRINT_DEBUG_MEM("Twtr =");
- PRINT_DEBUG_MEM_HEX16(Tmp);
- PRINT_DEBUG_MEM("\r");
-
- if (Tmp > MAX_TWR)
- Tmp = MAX_TWTR;
- else if (Tmp < MIN_TWR)
- Tmp = MIN_TWTR;
- Tmp -= 2; //00->2T, 01->3T, 10->4T, 11->5T
- Data = pci_read_config8(MEMCTRL, 0x63);
- Data = (u8) ((Data & 0xFC) | Tmp);
- pci_write_config8(MEMCTRL, 0x63, Data);
-}
-
-
-/*
-Internal read to precharge command delay, Trtp for DDR1/DDR2
-Device 0 Function 3:REG63[3]:Trtp 2T or 3T
-*/
-#define MAX_TRTP 3 //3T
-#define MIN_TRTP 2 //2T
-
-void SetTrtp(DRAM_SYS_ATTR * DramAttr)
-{
- u8 Data;
- u16 Max, Tmp;
- u8 Socket;
-
-
- /*get the max Trtp value from SPD data
- SPD Byte38, Bit7:2->1ns~63ns, Bit1:0->0ns, 0.25ns, 0.50ns, 0.75ns */
- Max = 0;
- for (Socket = 0; Socket < MAX_SOCKETS; Socket++) {
- if (DramAttr->DimmInfo[Socket].bPresence) {
- Tmp =
- (u16) (DramAttr->DimmInfo[Socket].
- SPDDataBuf[SPD_SDRAM_TRTP]);
- if (Tmp > Max)
- Max = Tmp;
- }
- }
- /*Calculate clock */
- Tmp = (u16) ((Max * 100 + ((DramAttr->DramCyc) << 2) - 1) / ((DramAttr->DramCyc) << 2)); //this value should be 2T or 3T
-
- PRINT_DEBUG_MEM("Trtp =");
- PRINT_DEBUG_MEM_HEX16(Tmp);
- PRINT_DEBUG_MEM("\r");
-
- Data = pci_read_config8(MEMCTRL, 0x63);
- if (Tmp > MIN_TRTP)
- Data = (u8) (Data | 0x08); /*set bit3, set 3T */
- else
- Data = (u8) (Data & 0xf7); /*clear bit3, set 2T */
-
- pci_write_config8(MEMCTRL, 0x63, Data);
-}
Deleted: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/UMARamSetting.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/UMARamSetting.c 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/UMARamSetting.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -1,445 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2009 One Laptop per Child, Association, Inc.
- *
- * 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
- */
-
-typedef struct __UMA_RAM_tag {
- u16 DramSize;
- u8 D0F3Val;
- u8 D1F0Val;
- u8 VgaPortVal;
-} UMARAM;
-#define UMARAM_512M 7
-#define UMARAM_256M 6
-#define UMARAM_128M 5
-#define UMARAM_64M 4
-#define UMARAM_32M 3
-#define UMARAM_16M 2
-#define UMARAM_8M 1
-#define UMARAM_0M 0
-
-
-#define FB_512M 0
-#define FB_256M 0x40
-#define FB_128M 0x60
-#define FB_64M 0x70
-#define FB_32M 0x78
-#define FB_16M 0x7c
-#define FB_8M 0x7E
-#define FB_4M 0x7F
-
-#define VGA_PORT_512M 0x00
-#define VGA_PORT_256M 0x80
-#define VGA_PORT_128M 0xC0
-#define VGA_PORT_64M 0xE0
-#define VGA_PORT_32M 0xF0
-#define VGA_PORT_16M 0xF8
-
-static const UMARAM UMARamArr[] = {
- {0, UMARAM_0M, FB_4M, 0xFE},
- {8, UMARAM_8M, FB_8M, 0xFC},
- {16, UMARAM_16M, FB_16M, VGA_PORT_16M},
- {32, UMARAM_32M, FB_32M, VGA_PORT_32M},
- {64, UMARAM_64M, FB_64M, VGA_PORT_64M},
- {128, UMARAM_128M, FB_128M, VGA_PORT_128M},
- {256, UMARAM_256M, FB_256M, VGA_PORT_256M},
- {512, UMARAM_512M, FB_512M, VGA_PORT_512M},
- {0xffff, 0xff, 0xff, 0xFF}
-};
-
-void SetUMARam(void)
-{
-#if 1
- u8 ramregs[] = { 0x43, 0x42, 0x41, 0x40 };
- device_t vga_dev = PCI_DEV(0, 1, 0), d0f0_dev = PCI_DEV(0, 0, 0);
- u8 ByteVal, temp;
- UMARAM *pUMARamTable;
- u16 UmaSize;
- u8 SLD0F3Val, SLD1F0Val, VgaPortVal;
- u32 RamSize, SLBase, Tmp;
- u8 i;
- PRINT_DEBUG_MEM("Entering vx800 SetUMARam.\n");
- SLD0F3Val = 0;
- SLD1F0Val = 0;
- VgaPortVal = 0;
-
-
- ByteVal = pci_read_config8(MEMCTRL, 0xa1);
- ByteVal |= 0x80;
- pci_write_config8(MEMCTRL, 0xa1, ByteVal);
-
- //set VGA Timer
- pci_write_config8(MEMCTRL, 0xa2, 0xee);
-
- //set agp misc
- //GFX Data Delay to Sync with Clock
- pci_write_config8(MEMCTRL, 0xa4, 0x01);
-
- //page register life timer
- pci_write_config8(MEMCTRL, 0xa6, 0x76);
-
- //GMINT and GFX relatate
- //note Bit 3 VGA Enable
- pci_write_config8(MEMCTRL, 0xa7, 0x8c);
- // ByteVal = 0x4c;
-
- //GMINT Misc.1
- //pci_write_config8(MEMCTRL, 0xb0, 0x80);
-
- //pci_write_config8(MEMCTRL, 0xb1, 0xaa);
-
- //AGPCINT MISC
- //pci_write_config8(MEMCTRL, 0xb2, 0x82);
- //ByteVal = 0x8A;
-
- //GMINT MISC.2
- //disable read pass write
- pci_write_config8(MEMCTRL, 0xb3, 0x9A);
-
- //EPLL Register
- //pci_write_config8(MEMCTRL, 0xb4, 0x04);
-
- //enable CHA and CHB merge mode
- pci_write_config8(MEMCTRL, 0xde, 0x06);
-
- //if can get the value from setup interface, so get the value
- //else use the default value
- UmaSize = CONFIG_VIDEO_MB;
-
- for (pUMARamTable = UMARamArr; pUMARamTable->DramSize != 0xffff;
- pUMARamTable++) {
- if (UmaSize == pUMARamTable->DramSize) {
- SLD0F3Val = pUMARamTable->D0F3Val;
- SLD1F0Val = pUMARamTable->D1F0Val;
- VgaPortVal = pUMARamTable->VgaPortVal;
- }
- }
- //set SL size
- //Fill in Fun3_RXA1[6:4] with the Frame Buffer size for the Integrated Graphic Device.
- ByteVal = pci_read_config8(MEMCTRL, 0xa1);
- ByteVal = (ByteVal & 0x8f) | (SLD0F3Val << 4);
- pci_write_config8(MEMCTRL, 0xa1, ByteVal);
-
-
-// vga_dev = dev_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VX855_VGA, 0);
-
- //RxB2 may be for S.L. and RxB1 may be for L. L.
- // It is different from Spec.
- ByteVal = SLD1F0Val;
- pci_write_config8(vga_dev, 0xb2, ByteVal);
-
-
- //set M1 size
- //ByteVal=pci_read_config8(MEMCTRL, 0xa3);
- //ByteVal = 0x02;
- //pci_write_config8(MEMCTRL, 0xa3, ByteVal);
-
- PRINT_DEBUG_MEM("UMA setting - 3\n");
-
-
-
-
- //Enable p2p IO/mem
- ByteVal = 0x07;
- pci_write_config8(vga_dev, 0x04, ByteVal);
-
-
-
-
- //must set SL and MMIO base, or else when enable GFX memory space, system will hang
- //set S.L base
- Tmp = pci_read_config32(vga_dev, 0x10);
- Tmp = 0xfffffff8;
- pci_write_config32(vga_dev, 0x10, Tmp);
- Tmp = pci_read_config32(vga_dev, 0x10);
- Tmp = VIACONFIG_VGA_PCI_10;
- pci_write_config32(vga_dev, 0x10, Tmp);
-
- //set MMIO base
- Tmp = pci_read_config32(vga_dev, 0x14);
- Tmp = 0xfffffffC;
- pci_write_config32(vga_dev, 0x14, Tmp);
- Tmp = pci_read_config32(vga_dev, 0x14);
- Tmp = VIACONFIG_VGA_PCI_14;
- pci_write_config32(vga_dev, 0x14, Tmp);
-
-
-//enable direct cpu frame buffer access
- i = pci_rawread_config8(PCI_RAWDEV(0, 0, 3), 0xa1);
- i = (i & 0xf0) | (VIACONFIG_VGA_PCI_10 >> 28);
- pci_rawwrite_config8(PCI_RAWDEV(0, 0, 3), 0xa1, i);
- pci_rawwrite_config8(PCI_RAWDEV(0, 0, 3), 0xa0, 0x01);
-
-
- //enable GFx memory space access control for S.L and mmio
- ByteVal = pci_read_config8(d0f0_dev, 0xD4);
- ByteVal |= 0x03;
- //ByteVal |= 0x01;
- pci_write_config8(d0f0_dev, 0xD4, ByteVal);
-
-
- //enable Base VGA 16 Bits Decode
- ByteVal = pci_read_config8(d0f0_dev, 0xfe);
- ByteVal |= 0x10;
- pci_write_config8(d0f0_dev, 0xfe, ByteVal);
-
-
- //disable CHB L.L
- //set VGA memory selection
- ByteVal = pci_read_config8(vga_dev, 0xb0);
- ByteVal &= 0xF8;
- //ByteVal |= 0x01;
- ByteVal |= 0x03;
- pci_write_config8(vga_dev, 0xb0, ByteVal);
-
- //set LL size
-
- //enable memory access to SL,MMIO,LL and IO to 3B0~3BB,3C0 ~3DF
- //ByteVal = 0x03;
- //pci_write_config8(d0f0_dev, 0xc0, ByteVal);
-
- //Turn on Graphic chip IO port port access
- ByteVal = inb(0x03C3);
- ByteVal |= 0x01;
- outb(ByteVal, 0x03C3);
-
- //Turn off Graphic chip Register protection
- outb(0x10, 0x03C4);
-
- ByteVal = inb(0x03C5);
- ByteVal |= 0x01;
- outb(ByteVal, 0x03C5);
-
- //set VGA memory Frequence
- //direct IO port 0x3DX to vga io space 0x3C2[0]
- ByteVal = inb(0x03CC);
- ByteVal |= 0x03;
- outb(ByteVal, 0x03C2);
- // ByteVal=inb(0x03C2);
- // ByteVal |= 0x01;
- // outb(ByteVal,0x03C2);
-
-
-#if 1 //bios porting guide has no this two defination: 3d on 3d4/3d5 and 39 on 3c4/3c5
- //set frequence 0x3D5.3d[7:4]
- outb(0x3d, 0x03d4);
-
- temp = pci_read_config8(MEMCTRL, 0x90);
- temp = (u8) (temp & 0x07);
- ByteVal = inb(0x03d5);
- switch (temp) {
- case 0: //DIMMFREQ_200:
- ByteVal = (u8) ((ByteVal & 0x0F) | 0x30);
- break;
- case 1: //DIMMFREQ_266:
- ByteVal = (u8) ((ByteVal & 0x0F) | 0x40);
- break;
- case 3: //DIMMFREQ_400:
- ByteVal = (u8) ((ByteVal & 0x0F) | 0x60);
- break;
- case 4: //DIMMFREQ_533:
- ByteVal = (u8) ((ByteVal & 0x0F) | 0x70);
- break;
- case 5: //DIMMFREQ_667:
- ByteVal = (u8) ((ByteVal & 0x0F) | 0x80);
- break;
- case 6: //DIMMFREQ_800:
- ByteVal = (u8) ((ByteVal & 0x0F) | 0x90);
- break;
- default:
- ByteVal = (u8) ((ByteVal & 0x0F) | 0x70);
- break;
- }
- outb(ByteVal, 0x03d5);
-
- // Set frame buffer size
- outb(0x39, 0x03c4);
- outb(1 << SLD0F3Val, 0x03c5);
-
-#endif
- // Set S.L. size in GFX's register
- outb(0x68, 0x03c4);
- outb(VgaPortVal, 0x03c5);
-
- // ECLK Selection (00:166Mhz, 01:185Mhz, 10:250Mhz, 11:275Mhz)
- // set 3C5.5A[0]=1, address maps to secondary resgiters
- outb(0x5a, 0x03c4);
- ByteVal = inb(0x03c5);
- ByteVal |= 0x01;
- outb(ByteVal, 0x03c5);
-
- // Set 3D5.4C[7:6] (00:166Mhz, 01:185Mhz, 10:250Mhz, 11:275Mhz)
- outb(0x4c, 0x03d4);
- ByteVal = inb(0x03d5);
- ByteVal = (ByteVal & 0x3F) | 0x80;
- outb(ByteVal, 0x03d5);
-
- // set 3C5.5A[0]=0, address maps to first resgiters
- outb(0x5a, 0x03c4);
- ByteVal = inb(0x03c5);
- ByteVal &= 0xFE;
- outb(ByteVal, 0x03c5);
-
- // Set S.L. Address in System Memory
- //calculate dram size
- for (RamSize = 0, i = 0; i < ARRAY_SIZE(ramregs); i++) {
- RamSize = pci_read_config8(MEMCTRL, ramregs[i]);
- if (RamSize != 0)
- break;
- }
- //calculate SL Base Address
- SLBase = (RamSize << 26) - (UmaSize << 20);
-
-
- outb(0x6D, 0x03c4);
- //SL Base[28:21]
- outb((u8) ((SLBase >> 21) & 0xFF), 0x03c5);
-
- outb(0x6e, 0x03c4);
- //SL Base[36:29]
- outb((u8) ((SLBase >> 29) & 0xFF), 0x03c5);
-
- outb(0x6f, 0x03c4);
- outb(0x00, 0x03c5);
-
- // Set SVID high byte
- outb(0x36, 0x03c4);
- outb(0x11, 0x03c5);
-
- // Set SVID Low byte
- outb(0x35, 0x03c4);
- outb(0x06, 0x03c5);
-
- // Set SID high byte
- outb(0x38, 0x03c4);
- outb(0x51, 0x03c5);
-
- // Set SID Low byte
- outb(0x37, 0x03c4);
- outb(0x22, 0x03c5);
-
- //start : For enable snapshot mode control
- // program 3C5 for SNAPSHOT Mode control, set RxF3h=1Ah
- outb(0xf3, 0x03c4);
- ByteVal = inb(0x03c5);
- ByteVal = (ByteVal & 0xE5) | 0x1A;
- outb(ByteVal, 0x03c5);
-
-
- outb(0xf3, 0x03d4);
- ByteVal = inb(0x03d5);
- ByteVal = (ByteVal & 0xE5) | 0x1A;
- outb(ByteVal, 0x03d5);
-
- u8 table3c43c5[0x70] = {
- 0x03, 0x01, 0x0F, 0x00, 0x06, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x01, 0x78, 0x00, 0x00, 0x00, 0xBE, 0x20, 0x7F,
- 0x60, 0x7F, 0x08, 0x31, 0xCC, 0x00, 0x01, 0x00,
- 0x00, 0x18, 0x10, 0x00, 0x00, 0x00, 0x3D, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x04, 0xF3, 0xFF, 0xFC,
- 0xF8, 0x0C, 0x00, 0x00, 0x40, 0x06, 0x11, 0x22,
- 0x51, 0x10, 0x00, 0x01, 0x19, 0x0C, 0x00, 0xFF,
- 0x38, 0x40, 0x30, 0xFF, 0x70, 0x8C, 0x85, 0x9D,
- 0x80, 0x05, 0x54, 0x90, 0x03, 0x30, 0x00, 0x5F,
- 0x1F, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
- 0x06, 0xDF, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x20, 0x20,
- 0xE0, 0x20, 0xD0, 0x3F, 0x00, 0xE0, 0x00, 0x00
- };
- u8 table3d43d5[0x88] = {
- 0x7F, 0x63, 0x63, 0x83, 0x69, 0x19, 0x72, 0xE0,
- 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x58, 0x9C, 0x57, 0x90, 0x00, 0x57, 0x73, 0xE3,
- 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x0C, 0x00, 0x11, 0x06, 0x00, 0x20, 0x01, 0x34,
- 0xEE, 0x74, 0x01, 0x01, 0x08, 0x84, 0x00, 0x00,
- 0x00, 0xF3, 0x40, 0x90, 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x12, 0x00, 0x02, 0x00, 0x00, 0x10, 0x00,
- 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D,
- 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x9D, 0x9D, 0x10,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x9D, 0x9D, 0x9D,
- 0x9D, 0x9D, 0x9D, 0x9D, 0x00, 0x9D, 0x1D, 0x00,
- 0x00, 0x00, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D,
- 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D,
- };
-
-
- u8 table3c0space[0xc0] = {
- 0x11, 0x00, 0x10, 0x01, 0x26, 0x3D, 0xFF, 0x00,
- 0x10, 0x3F, 0x00, 0x00, 0x2F, 0x00, 0x22, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x50, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
- };
-#if 0
-//for(i=0;i<0xc0;i++)
- for (i = 0; i < 0x40; i++) //
- {
- outb(table3c0space[i], 0x03c0 + i);
- }
-
-
- for (i = 0; i < 0x70; i++) {
- outb(i, 0x03c4);
- outb(table3c43c5[i], 0x03c5);
- }
- for (i = 0; i < 0x88; i++) {
- outb(i, 0x03d4);
- outb(table3d43d5[i], 0x03d5);
- }
- outb(0x92, 0x03d4);
- outb(0x80, 0x03d5);
-
- outb(0xa3, 0x03d4);
- outb(0x00, 0x03d5);
-
- outb(0xe8, 0x03d4);
- outb(0x40, 0x03d5);
-#endif
-//3d4 3d freq
-//IO Port / Index: 3X5.3D
-//Scratch Pad Register 4
-
-// outb(0x39,0x03c4);//
- //outb(1 << SLD0F3Val ,0x03c5);
-//
-#endif
-
-}
Copied: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/clk_ctrl.c (from rev 4313, trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/ClkCtrl.c)
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/clk_ctrl.c (rev 0)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/clk_ctrl.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -0,0 +1,312 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2009 One Laptop per Child, Association, Inc.
+ *
+ * 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
+ */
+
+void DutyCycleCtrl(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ u8 FreqId;
+ u8 i;
+
+ if (DIMMFREQ_800 == DramAttr->DramFreq)
+ FreqId = 2;
+ else if (DIMMFREQ_667 == DramAttr->DramFreq)
+ FreqId = 3;
+ else if (DIMMFREQ_533 == DramAttr->DramFreq)
+ FreqId = 4;
+ else if (DIMMFREQ_400 == DramAttr->DramFreq)
+ FreqId = 5;
+ else
+ FreqId = 5;
+
+ if (DramAttr->RankNumChA > 0) { // 1 rank
+ for (i = 0; i < DUTY_CYCLE_REG_NUM; i++) {
+ Data =
+ pci_read_config8(MEMCTRL,
+ ChA_Duty_Control_DDR2[i][0]);
+ Data &= ChA_Duty_Control_DDR2[i][1]; /*Mask */
+ Data |= ChA_Duty_Control_DDR2[i][FreqId]; /*set Value */
+ pci_write_config8(MEMCTRL,
+ ChA_Duty_Control_DDR2[i][0],
+ Data);
+ }
+ }
+ if (1 == ENABLE_CHC) { // 1 rank
+ for (i = 0; i < DUTY_CYCLE_REG_NUM; i++) {
+ Data =
+ pci_read_config8(MEMCTRL,
+ ChB_Duty_Control_DDR2[i][0]);
+ Data &= ChB_Duty_Control_DDR2[i][1]; /*Mask */
+ Data |= ChB_Duty_Control_DDR2[i][FreqId]; /*set Value */
+ pci_write_config8(MEMCTRL,
+ ChB_Duty_Control_DDR2[i][0],
+ Data);
+ }
+ }
+
+}
+
+/*
+DRAM clock phase and delay control
+*/
+//sub routine list
+void ClkPhsCtrlFBMDDR2(DRAM_SYS_ATTR * DramAttr);
+
+void WrtDataPhsCtrl(DRAM_SYS_ATTR * DramAttr);
+
+void DQDQSOutputDlyCtrl(DRAM_SYS_ATTR * DramAttr);
+
+void DQSInputCaptureCtrl(DRAM_SYS_ATTR * DramAttr);
+
+void DCLKPhsCtrl(DRAM_SYS_ATTR * DramAttr);
+
+
+void DRAMClkCtrl(DRAM_SYS_ATTR * DramAttr)
+{
+ /*write data clock phase control */
+ WrtDataPhsCtrl(DramAttr);
+ /*clock phase control */
+ ClkPhsCtrlFBMDDR2(DramAttr);
+ /**/ DQDQSOutputDlyCtrl(DramAttr);
+ /**/ DQSInputCaptureCtrl(DramAttr);
+ DCLKPhsCtrl(DramAttr);
+}
+
+void ClkPhsCtrlFBMDDR2(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+
+ u8 FreqId, i;
+
+ if (DramAttr->DramFreq == DIMMFREQ_800)
+ FreqId = 2;
+ else if (DramAttr->DramFreq == DIMMFREQ_667)
+ FreqId = 3;
+ else if (DramAttr->DramFreq == DIMMFREQ_533)
+ FreqId = 4;
+ else if (DramAttr->DramFreq == DIMMFREQ_400)
+ FreqId = 5;
+ else
+ FreqId = 5;
+ /*channel A */// 2~4 Rank
+ if (DramAttr->RankNumChA == 1) { // 1 rank
+ for (i = 0; i < 3; i++) {
+ Data =
+ pci_read_config8(MEMCTRL,
+ DDR2_ChA_Clk_Phase_Table_1R[i]
+ [0]);
+ Data &= DDR2_ChA_Clk_Phase_Table_1R[i][1]; /*Mask */
+ Data |= DDR2_ChA_Clk_Phase_Table_1R[i][FreqId]; /*set Value */
+ pci_write_config8(MEMCTRL,
+ DDR2_ChA_Clk_Phase_Table_1R[i]
+ [0], Data);
+ }
+ } else if (DramAttr->RankNumChA > 1) { // 2~4 Rank
+ for (i = 0; i < 3; i++) {
+ Data =
+ pci_read_config8(MEMCTRL,
+ DDR2_ChA_Clk_Phase_Table_2R[i]
+ [0]);
+ Data &= DDR2_ChA_Clk_Phase_Table_2R[i][1]; /*Mask */
+ Data |= DDR2_ChA_Clk_Phase_Table_2R[i][FreqId]; /*set Value */
+ pci_write_config8(MEMCTRL,
+ DDR2_ChA_Clk_Phase_Table_2R[i]
+ [0], Data);
+ }
+ }
+#if ENABLE_CHB
+ if (DramAttr->RankNumChB > 0) { // 1 rank
+ for (i = 0; i < 3; i++) {
+ Data =
+ pci_read_config8(MEMCTRL,
+ DDR2_ChB_Clk_Phase_Table_1R[i]
+ [0]);
+ Data &= DDR2_ChB_Clk_Phase_Table_1R[i][1]; /*Mask */
+ Data |= DDR2_ChB_Clk_Phase_Table_1R[i][FreqId]; /*set Value */
+ pci_write_config8(MEMCTRL,
+ DDR2_ChB_Clk_Phase_Table_1R[i]
+ [0], Data);
+ }
+ }
+#endif
+}
+
+void WrtDataPhsCtrl(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ u8 FreqId, i;
+
+
+ if (DIMMFREQ_800 == DramAttr->DramFreq)
+ FreqId = 2;
+ else if (DIMMFREQ_667 == DramAttr->DramFreq)
+ FreqId = 3;
+ else if (DIMMFREQ_533 == DramAttr->DramFreq)
+ FreqId = 4;
+ else if (DIMMFREQ_400 == DramAttr->DramFreq)
+ FreqId = 5;
+ else
+ FreqId = 5;
+
+ if (DramAttr->RankNumChA > 0) { // 1 rank
+ for (i = 0; i < WrtData_REG_NUM; i++) {
+ Data =
+ pci_read_config8(MEMCTRL,
+ DDR2_ChA_WrtData_Phase_Table
+ [i][0]);
+ Data &= DDR2_ChA_WrtData_Phase_Table[i][1]; /*Mask */
+ Data |= DDR2_ChA_WrtData_Phase_Table[i][FreqId]; /*set Value */
+ pci_write_config8(MEMCTRL,
+ DDR2_ChA_WrtData_Phase_Table[i]
+ [0], Data);
+ }
+ }
+#if ENABLE_CHB
+ if (DramAttr->RankNumChB > 0) { // 1 rank
+ for (i = 0; i < WrtData_REG_NUM; i++) {
+ Data =
+ pci_read_config8(MEMCTRL,
+ DDR2_ChB_WrtData_Phase_Table
+ [i][0]);
+ Data &= DDR2_ChB_WrtData_Phase_Table[i][1]; /*Mask */
+ Data |= DDR2_ChB_WrtData_Phase_Table[i][FreqId]; /*set Value */
+ pci_write_config8(MEMCTRL,
+ DDR2_ChB_WrtData_Phase_Table[i]
+ [0], Data);
+ }
+ }
+#endif
+ Data = pci_read_config8(MEMCTRL, 0x8C);
+ Data &= 0xFC;
+ Data |= 0x03;
+ pci_write_config8(MEMCTRL, 0x8C, Data);
+}
+
+void DQDQSOutputDlyCtrl(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ u8 FreqId;
+
+ if (DIMMFREQ_400 == DramAttr->DramFreq)
+ FreqId = 0;
+ else if (DIMMFREQ_533 == DramAttr->DramFreq)
+ FreqId = 1;
+ else if (DIMMFREQ_667 == DramAttr->DramFreq)
+ FreqId = 2;
+ else if (DIMMFREQ_800 == DramAttr->DramFreq)
+ FreqId = 2;
+ else
+ FreqId = 0;
+ if (DramAttr->RankNumChA > 0) {
+ Data = DDR2_CHA_DQ_DQS_Delay_Table[FreqId][0];
+ pci_write_config8(MEMCTRL, 0xf0, Data);
+
+ Data = DDR2_CHA_DQ_DQS_Delay_Table[FreqId][1];
+ pci_write_config8(MEMCTRL, 0xf1, Data);
+
+ Data = DDR2_CHA_DQ_DQS_Delay_Table[FreqId][2];
+ pci_write_config8(MEMCTRL, 0xf2, Data);
+
+ Data = DDR2_CHA_DQ_DQS_Delay_Table[FreqId][3];
+ pci_write_config8(MEMCTRL, 0xf3, Data);
+ }
+#if ENABLE_CHB
+ if (DramAttr->RankNumChB > 0) {
+ Data = DDR2_CHB_DQ_DQS_Delay_Table[FreqId][0];
+ pci_write_config8(MEMCTRL, 0xf4, Data);
+
+ Data = DDR2_CHB_DQ_DQS_Delay_Table[FreqId][1];
+ pci_write_config8(MEMCTRL, 0xf5, Data);
+
+ Data = DDR2_CHB_DQ_DQS_Delay_Table[FreqId][2];
+ pci_write_config8(MEMCTRL, 0xf6, Data);
+
+ Data = DDR2_CHB_DQ_DQS_Delay_Table[FreqId][3];
+ pci_write_config8(MEMCTRL, 0xf7, Data);
+ }
+#endif
+}
+
+void DQSInputCaptureCtrl(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ u8 FreqId, i;
+
+ if (DIMMFREQ_800 == DramAttr->DramFreq)
+ FreqId = 2;
+ else if (DIMMFREQ_667 == DramAttr->DramFreq)
+ FreqId = 3;
+ else if (DIMMFREQ_533 == DramAttr->DramFreq)
+ FreqId = 4;
+ else if (DIMMFREQ_400 == DramAttr->DramFreq)
+ FreqId = 5;
+ else
+ FreqId = 2;
+
+ Data = 0x8A;
+ pci_write_config8(MEMCTRL, 0x77, Data);
+
+ if (DramAttr->RankNumChA > 0) { // 1 rank
+ for (i = 0; i < DQS_INPUT_CAPTURE_REG_NUM; i++) {
+ Data =
+ pci_read_config8(MEMCTRL,
+ DDR2_ChA_DQS_Input_Capture_Tbl
+ [i][0]);
+ Data &= DDR2_ChA_DQS_Input_Capture_Tbl[i][1]; /*Mask */
+ Data |= DDR2_ChA_DQS_Input_Capture_Tbl[i][FreqId]; /*set Value */
+ pci_write_config8(MEMCTRL,
+ DDR2_ChA_DQS_Input_Capture_Tbl[i]
+ [0], Data);
+ }
+ }
+#if ENABLE_CHB
+ if (DramAttr->RankNumChB > 0) { // 1 rank
+ for (i = 0; i < DQS_INPUT_CAPTURE_REG_NUM; i++) {
+ Data =
+ pci_read_config8(MEMCTRL,
+ DDR2_ChB_DQS_Input_Capture_Tbl
+ [i][0]);
+ Data &= DDR2_ChB_DQS_Input_Capture_Tbl[i][1]; /*Mask */
+ Data |= DDR2_ChB_DQS_Input_Capture_Tbl[i][FreqId]; /*set Value */
+ pci_write_config8(MEMCTRL,
+ DDR2_ChB_DQS_Input_Capture_Tbl[i]
+ [0], Data);
+ }
+ }
+#endif
+}
+
+//This is very important, if you don't set it correctly, dram will be unreliable
+//set DCLK Phase control(Reg99H[6:1]) according the DDRII in the dimm
+void DCLKPhsCtrl(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+
+ Data = 0;
+ Data = pci_read_config8(MEMCTRL, 0x99);
+ Data &= 0xE1;
+ //DDR in Dimm1, MCLKOA[4,3,0] will output MCLK
+ if (DramAttr->RankPresentMap & 0x03)
+ Data |= 0x09 << 1;
+ //DDR in Dimm2, MCLKOA[5,2,1] will output MCLK
+ if (DramAttr->RankPresentMap & 0x0C)
+ Data |= 0x06 << 1;
+
+ pci_write_config8(MEMCTRL, 0x99, Data);
+
+}
Copied: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/detection.c (from rev 4313, trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/Detection.c)
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/detection.c (rev 0)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/detection.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -0,0 +1,192 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2009 One Laptop per Child, Association, Inc.
+ *
+ * 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
+ */
+
+#define SMBUS_ADDR_CH_A_1 0xA0 // Dimmx
+#define SMBUS_ADDR_CH_A_2 0xA2 // Dimmx
+#define SMBUS_ADDR_CH_B_1 0xA4 // Dimmx
+#define SMBUS_ADDR_CH_B_2 0xA6 // Dimmx
+
+/*read data*/
+CB_STATUS GetSPDData(u8 Slot, u8 Length, u8 * Buf);
+
+void DRAMCmdRate(DRAM_SYS_ATTR * DramAttr);
+
+
+
+CB_STATUS GetInfoFromSPD(DRAM_SYS_ATTR * DramAttr);
+
+CB_STATUS GetSPDData(u8 Slot, u8 Length, u8 * Buf)
+{
+ // CB_STATUS Status = CB_NOT_READY;
+ u8 Val;
+ u8 i;
+
+ if (1 > Length || NULL == Buf)
+ return CB_INVALID_PARAMETER;
+
+ for (i = 0; i < Length; i++) {
+ Val = get_spd_data(ctrl.channel0[Slot], i);
+ *(Buf + i) = Val;
+ }
+ return CB_SUCCESS;
+}
+
+CB_STATUS DRAMDetect(DRAM_SYS_ATTR * DramAttr)
+{
+ CB_STATUS Status = CB_SUCCESS;
+
+ PRINT_DEBUG_MEM("Dram Detection \r");
+
+ /*Read D0F3Rx6C , detect memory type DDR1 or DDR2 */
+ // 353 supports DDR2 only
+ DramAttr->DramType = RAMTYPE_SDRAMDDR2;
+ /*get information for SPD */
+ Status = GetInfoFromSPD(DramAttr);
+ if (CB_SUCCESS == Status) {
+ /*64bit or 128Bit */
+ //
+ // if (RAMTYPE_SDRAMDDR == DramAttr->DramType)
+
+ /*select command rate */
+ DRAMCmdRate(DramAttr);
+ }
+ return Status;
+}
+
+
+// Determine 1T or 2T Command Rate:
+// To enable 1T command Rate, the system will satisfy the following 3 conditions:
+// 1. Each DRAM channel may have 1 or 2 ranks of DIMM. 3/4 ranks can not support 1T command rate
+// It's for loading issue. 1T can supports (a). only one socket with two ranks OR
+// (b). two sockets each with 1 rank.
+// 2. User wishes to enable 1T command rate mode and turn on by Setup menu
+// 3. If 1T command rate can be enabled, just set EBP bit here.
+void DRAMCmdRate(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+
+ // 5.1t/2t command rate, use the stable set
+ //offset50
+ DramAttr->CmdRate = 2;
+ Data = pci_read_config8(MEMCTRL, 0x50);
+ Data = (u8) (Data & 0xEE);
+ pci_write_config8(MEMCTRL, 0x50, Data);
+}
+
+/*get SPD data and set RANK presence map*/
+/*
+Sockets0,1 is Channel A / Sockets2,3 is Channel B
+socket0 SPD device address 0x50 / socket1 SPD device address 0x51
+socket2 SPD device address 0x52 / socket3 SPD device address 0x53
+*/
+CB_STATUS GetInfoFromSPD(DRAM_SYS_ATTR * DramAttr)
+{
+ CB_STATUS Status;
+ u8 *pSPDDataBuf;
+ u8 ModuleDataWidth;
+ u8 ChipWidth;
+ u8 RankNum;
+ u8 LoadNum;
+ u8 Sockets, i;
+ BOOLEAN bFind;
+ bFind = FALSE;
+ Status = CB_DEVICE_ERROR;
+
+ for (Sockets = 0; Sockets < MAX_SOCKETS; Sockets++) {
+ pSPDDataBuf = DramAttr->DimmInfo[Sockets].SPDDataBuf;
+ pSPDDataBuf[SPD_MEMORY_TYPE] =
+ get_spd_data(ctrl.channel0[Sockets], SPD_MEMORY_TYPE);
+ if (pSPDDataBuf[SPD_MEMORY_TYPE] == 0) {
+ Status = CB_NOT_READY;
+ } else {
+ Status =
+ GetSPDData(Sockets, SPD_DATA_SIZE,
+ pSPDDataBuf);
+ PRINT_DEBUG_MEM("SPD : \r");
+ for (i = 0; i < SPD_DATA_SIZE; i++) {
+ PRINT_DEBUG_MEM(" ");
+ PRINT_DEBUG_MEM_HEX8(pSPDDataBuf[i]);
+ }
+ }
+ if (CB_SUCCESS == Status) {
+ /*if Dram Controller detected type not same as the type got from SPD, There are ERROR */
+ if (pSPDDataBuf[SPD_MEMORY_TYPE] !=
+ DramAttr->DramType) {
+ Status = CB_DEVICE_ERROR; /*Memory int error */
+ PRINT_DEBUG_MEM
+ ("Memory Device ERROR: Dram Controller detected type != type got from SPD \r");
+ break;
+ }
+ DramAttr->DimmInfo[Sockets].bPresence = TRUE;
+ /*calculate load number (chips number) */
+ ModuleDataWidth =
+ (u8) (DramAttr->DimmInfo[Sockets].
+ SPDDataBuf[SPD_SDRAM_MOD_DATA_WIDTH +
+ 1]);
+ ModuleDataWidth = (u8) (ModuleDataWidth << 8);
+ ModuleDataWidth |=
+ (u8) (DramAttr->DimmInfo[Sockets].
+ SPDDataBuf[SPD_SDRAM_MOD_DATA_WIDTH]);
+ ChipWidth =
+ (u8) ((DramAttr->DimmInfo[Sockets].
+ SPDDataBuf[SPD_SDRAM_WIDTH]) & 0x7F);
+ LoadNum = (u8) (ModuleDataWidth / ChipWidth);
+
+ /*set the RANK map */
+ RankNum = (u8) (pSPDDataBuf[SPD_SDRAM_DIMM_RANKS] & 0x3); /*get bit0,1, the Most number of supported RANK is 2 */
+ if (RAMTYPE_SDRAMDDR2 == DramAttr->DramType)
+ RankNum++; /*for DDR bit[0,1] 01->1 RANK 10->2 RANK; for DDR2 bit[0,1] = 00 -> 1 RANK 01 -> 2 RANK */
+ if (RankNum != 2 && RankNum != 1) { /*every DIMM have 1 or 2 ranks */
+ Status = CB_DEVICE_ERROR;
+ PRINT_DEBUG_MEM
+ ("Memory Device ERROR: the number of RANK not support!\r");
+ break;
+ }
+
+ if (Sockets < 2) { /*sockets0,1 is channel A */
+ DramAttr->RankNumChA =
+ (u8) (DramAttr->RankNumChA + RankNum);
+ DramAttr->DimmNumChA++;
+ DramAttr->LoadNumChA =
+ (u8) (DramAttr->LoadNumChA * LoadNum *
+ RankNum);
+ } else { /*sockets2,3 is channel B */
+
+ DramAttr->RankNumChB =
+ (u8) (DramAttr->RankNumChB + RankNum);
+ DramAttr->DimmNumChB++;
+ DramAttr->LoadNumChB =
+ (u8) (DramAttr->LoadNumChB * LoadNum *
+ RankNum);;
+ }
+ RankNum |= 1; /*set rank map */
+ DramAttr->RankPresentMap |=
+ (RankNum << (Sockets * 2));
+ bFind = TRUE;
+ }
+ }
+ PRINT_DEBUG_MEM("Rank Present Map:");
+ PRINT_DEBUG_MEM_HEX8(DramAttr->RankPresentMap);
+ PRINT_DEBUG_MEM("\r");
+
+ if (bFind)
+ Status = CB_SUCCESS;
+
+ return Status;
+}
Copied: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/dev_init.c (from rev 4313, trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/DevInit.c)
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/dev_init.c (rev 0)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/dev_init.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -0,0 +1,1318 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2009 One Laptop per Child, Association, Inc.
+ *
+ * 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
+ */
+
+void DRAMSetVRNum(DRAM_SYS_ATTR * DramAttr, u8 PhyRank, // Physical Rank
+ u8 VirRank, // Virtual Rank
+ BOOLEAN Enable);
+
+void SetEndingAddr(DRAM_SYS_ATTR * DramAttr, u8 VirRank, // Ending address register number indicator (INDEX
+ INT8 Value // (value) add or subtract value to this and after banks
+ );
+
+void InitDDR2CHA(DRAM_SYS_ATTR * DramAttr);
+
+void InitDDR2CHB(DRAM_SYS_ATTR * DramAttr);
+
+void InitDDR2CHC(DRAM_SYS_ATTR * DramAttr);
+
+CB_STATUS VerifyChc();
+/*===================================================================
+Function : DRAMRegInitValue()
+Precondition :
+Input :
+ DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
+ in MotherBoard
+Output : Void
+Purpose : Set necessary register before DRAM initialize
+===================================================================*/
+
+static const u8 DramRegTbl[][3] = {
+ //Register AND OR
+ {0x50, 0x11, 0xEE}, // DDR default MA7 for DRAM init
+ {0x51, 0x11, 0x60}, // DDR default MA3 for CHB init
+ {0x52, 0x00, 0x33}, // DDR use BA0=M17, BA1=M18,
+ {0x53, 0x00, 0x3F}, // DDR BA2=M19
+
+ {0x54, 0x00, 0x00}, // default PR0=VR0; PR1=VR1
+ {0x55, 0x00, 0x00}, // default PR2=VR2; PR3=VR3
+ {0x56, 0x00, 0x00}, // default PR4=VR4; PR5=VR5
+ {0x57, 0x00, 0x00}, // default PR4=VR4; PR5=VR5
+
+ {0x60, 0x00, 0x00}, // disable fast turn-around
+ {0x65, 0x00, 0xD9}, // AGP timer = 0XD; Host timer = 8;
+ {0x66, 0x00, 0x88}, //DRAMC Queue Size = 4; park at the last bus owner,Priority promotion timer = 8
+ {0x68, 0x00, 0x0C},
+ {0x69, 0xF0, 0x04}, // set RX69[3:0]=0000b
+ {0x6A, 0x00, 0x00}, // refresh counter
+ {0x6E, 0xF8, 0x80}, //must set 6E[7],or else DDR2 probe test will fail
+ // In here, we not set RX70~RX74, because we just init DRAM but no need R/W DRAM,
+ // when we check DQS input/output delay, then we need R/W DRAM.
+
+ //{0x79, 0x00, 0x8F },
+ {0x85, 0x00, 0x00},
+ // {0x90, 0x87, 0x78 },
+ // {0x91, 0x00, 0x46 },
+ {0x40, 0x00, 0x00},
+ {0, 0, 0}
+};
+
+void DRAMRegInitValue(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Idx, CL;
+ u8 Data;
+
+ for (Idx = 0; DramRegTbl[Idx][0] != 0; Idx++) {
+ Data = pci_read_config8(MEMCTRL, DramRegTbl[Idx][0]);
+ Data &= DramRegTbl[Idx][1];
+ Data |= DramRegTbl[Idx][2];
+ pci_write_config8(MEMCTRL, DramRegTbl[Idx][0], Data);
+ }
+
+ Data = 0x80;
+ pci_write_config8(PCI_DEV(0, 0, 4), 0xa3, Data);
+
+ //set Dram Controllor mode
+ Data = pci_read_config8(MEMCTRL, 0x6c);
+ Data &= 0xFB;
+ if (ENABLE_CHC == 0) {
+ Data |= 0x4; //only CHA 64 bit mode
+ pci_write_config8(MEMCTRL, 0x6c, Data);
+ } else {
+ Data |= 0x0; //CHA + CHC
+ pci_write_config8(MEMCTRL, 0x6c, Data);
+
+ //Data = 0xAA;
+ //pci_write_config8(MEMCTRL, 0xb1, Data);
+
+ //set CHB DQSB input delay, or else will meet error which is some byte is right
+ //but another bit is error
+ Data = pci_read_config8(MEMCTRL, 0xff);
+ Data = (Data & 0x03) | 0x3D;
+ pci_write_config8(MEMCTRL, 0xff, Data);
+
+ //enable CHC RXDB[7]
+ //Data=pci_read_config8(MEMCTRL, 0xdb);
+ // Data = (Data & 0x7F) | 0x80;
+ //pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ //rx62[2:0],CHA and CHB CL
+ Data = pci_read_config8(MEMCTRL, 0x62);
+ CL = Data & 0x07;
+
+ //if CL = 6 , so I set CHB CL = 5 default
+ if (CL >= 4)
+ CL = 3;
+
+ // set CHC Read CL rxDC[6:7]
+ Data = pci_read_config8(MEMCTRL, 0xdc);
+ Data = (Data & 0x3F) | (CL << 6);
+ pci_write_config8(MEMCTRL, 0xdc, Data);
+ // set CHC write CL rxDF[6:7]
+ Data = pci_read_config8(MEMCTRL, 0xdf);
+ Data = (Data & 0x3F) | (CL << 6);
+ pci_write_config8(MEMCTRL, 0xdf, Data);
+ // set CHC ODT RxDC[5:0]
+ Data = pci_read_config8(MEMCTRL, 0xdc);
+ Data = (Data & 0xC0) | 0x03;
+ pci_write_config8(MEMCTRL, 0xdc, Data);
+
+ //set column type RXDD[6] and enable ODT PAD RXDD[7]
+ Data = pci_read_config8(MEMCTRL, 0xdd);
+ Data |= 0x80;
+ Idx = DramAttr->DimmInfo[2].SPDDataBuf[SPD_SDRAM_COL_ADDR];
+ if ((Idx & 0x0F) == 10)
+ Data |= 0x40; //MA9~MA0
+ else
+ Data &= 0xBF; //MA8~MA0
+ pci_write_config8(MEMCTRL, 0xdd, Data);
+ }
+
+ // Disable read DRAM fast ready ;Rx51[7]
+ // Disable Read Around Write ;Rx51[6]
+
+ // Disable Consecutive Read ;RX52[1:0]
+ // disable speculative read
+
+}
+
+/*===================================================================
+Function : DRAMInitializeProc()
+Precondition :
+Input :
+ DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
+ in MotherBoard
+Output : Void
+Purpose : DRAM initialize according to the bios porting guid
+===================================================================*/
+
+#define EXIST_TEST_PATTERN 0x55555555
+#define NOT_EXIST_TEST_PATTERN 0xAAAAAAAA
+BOOLEAN ChkForExistLowBank()
+{
+ u32 *Address, data32;
+
+ // Check Pattern
+
+ Address = (u32 *) 8;
+ *Address = EXIST_TEST_PATTERN;
+ Address = (u32 *) 4;
+ *Address = EXIST_TEST_PATTERN;
+
+// _asm {WBINVD}
+ WaitMicroSec(100);
+ Address = (u32 *) 8;
+ data32 = *Address;
+ if (data32 != EXIST_TEST_PATTERN)
+ return FALSE;
+ Address = (u32 *) 4;
+ data32 = *Address;
+ if (data32 != EXIST_TEST_PATTERN)
+ return FALSE;
+
+ // Check not Pattern
+ Address = (u32 *) 8;
+ *Address = NOT_EXIST_TEST_PATTERN;
+ Address = (u32 *) 4;
+ *Address = NOT_EXIST_TEST_PATTERN;
+ //_asm {WBINVD}
+ WaitMicroSec(100);
+
+
+ Address = (u32 *) 8;
+ data32 = *Address;
+ if (data32 != (u32) (NOT_EXIST_TEST_PATTERN))
+ return FALSE;
+ Address = (u32 *) 4;
+ data32 = *Address;
+ if (data32 != (u32) (NOT_EXIST_TEST_PATTERN))
+ return FALSE;
+
+ return TRUE;
+}
+
+void InitDDR2CHC(DRAM_SYS_ATTR * DramAttr);
+void InitDDR2CHB(DRAM_SYS_ATTR * DramAttr);
+void DRAMInitializeProc(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 shift, idx;
+ BOOLEAN Status;
+
+ shift = 1;
+ for (idx = 0; idx < MAX_RANKS; idx++) {
+ if ((DramAttr->RankPresentMap & shift) != 0) {
+ // Set VR# to physical rank indicated = PR + physical rank enable bit
+ DRAMSetVRNum(DramAttr, idx, idx, TRUE);
+ SetEndingAddr(DramAttr, idx, 0x10); // assume 1G size
+ if (idx < 4) //CHA init
+ InitDDR2CHA(DramAttr); //temp wjb 2007/1 only for compiling
+ // in the function InitDDR2,the parameter is no need
+ Status = ChkForExistLowBank();
+ if (Status == TRUE) {
+ PRINT_DEBUG_MEM(" S\r");
+ } else {
+ PRINT_DEBUG_MEM(" F\r");
+ }
+ // Set VR# to physical rank indicated = 00h + physical rank enable bit
+ DRAMSetVRNum(DramAttr, idx, 0, FALSE);
+ SetEndingAddr(DramAttr, idx, -16);
+ }
+ shift <<= 1;
+ }
+ if (ENABLE_CHC)
+ InitDDR2CHC(DramAttr);
+
+}
+
+
+/*===================================================================
+Function : DRAMSetVRNUM()
+Precondition :
+Input :
+ DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
+ in MotherBoard
+ PhyRank: Physical Rank number
+ VirRank: Virtual Rank number
+ Enable: Enable/Disable Physical Rank
+Output : Void
+Purpose : Set virtual rank number for physical rank
+ Program the specific physical rank with specific virtual rank number
+ Program when necessary, otherwise don't touch the pr-vr-mapping registers
+===================================================================*/
+
+void DRAMSetVRNum(DRAM_SYS_ATTR * DramAttr, u8 PhyRank, // Physical Rank
+ u8 VirRank, // Virtual Rank
+ BOOLEAN Enable)
+{
+ u8 Data;
+ u8 AndData, OrData;
+ Data = pci_read_config8(MEMCTRL, (0x54 + (PhyRank >> 1)));
+
+ OrData = 0;
+ if (Enable)
+ OrData |= 0x08;
+ OrData |= VirRank;
+ if ((PhyRank & 0x01) == 0x00) {
+ AndData = 0x0F; // keep the value of odd rank on PR # is even(keep 1,3,5,7)
+ OrData <<= 4; // VR #, value to be set
+ } else {
+ AndData = 0xF0; // keep the value of even rank on PR # is odd(keep 0,2,4,6)
+ }
+ Data &= AndData;
+ Data |= OrData;
+ pci_write_config8(MEMCTRL, (0x54 + (PhyRank >> 1)), Data);
+}
+
+
+/*===================================================================
+Function : SetEndingAddr()
+Precondition :
+Input :
+ DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
+ in MotherBoard
+ VirRank: Virtual Rank number
+ Value: (value) add or subtract value to this and after banks
+Output : Void
+Purpose : Set ending address of virtual rank specified by VirRank
+===================================================================*/
+
+void SetEndingAddr(DRAM_SYS_ATTR * DramAttr, u8 VirRank, // Ending address register number indicator (INDEX
+ INT8 Value // (value) add or subtract value to this and after banks
+ ) {
+ u8 Data;
+
+ // Read register,Rx40-Rx47(0,1,2,3,4,5,6,7) and set the ending address
+ Data = pci_read_config8(MEMCTRL, 0x40 + VirRank);
+ Data = (u8) (Data + Value);
+ pci_write_config8(MEMCTRL, 0x40 + VirRank, Data);
+
+ //program the virank's begining address to zero
+ Data = 0x00;
+ pci_write_config8(MEMCTRL, 0x48 + VirRank, Data);
+}
+
+/*===================================================================
+Function : InitDDR2()
+Precondition :
+Input :
+ DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
+ in MotherBoard
+Output : Void
+Purpose : Initialize DDR2 by standard sequence
+===================================================================*/
+
+// DLL: Enable Reset
+static const u32 CHA_MRS_DLL_150[2] = { 0x00020200, 0x00000800 }; // with 150 ohm (A17=1, A9=1), (A11=1)(cpu address)
+static const u32 CHA_MRS_DLL_75[2] = { 0x00020020, 0x00000800 }; // with 75 ohm (A17=1, A5=1), (A11=1)(cpu address)
+
+// CPU(DRAM)
+// { DLL: Enable. A17(BA0)=1 and A3(MA0)=0 }
+// { DLL: reset. A11(MA8)=1 }
+//
+// DDR2 CL=2 CL=3 CL=4 CL=5 CL=6(Burst type=interleave)(WR fine tune in code)
+static const u16 CHA_DDR2_MRS_table[5] = { 0x0150, 0x01D0, 0x0250, 0x02D0, 0x350 }; // BL=4 ;Use 1X-bandwidth MA table to init DRAM
+
+// MA11 MA10(AP) MA9
+#define CHA_MRS_DDR2_TWR2 (0 << 13) + (0 << 20) + (1 << 12) // Value = 001000h
+#define CHA_MRS_DDR2_TWR3 (0 << 13) + (1 << 20) + (0 << 12) // Value = 100000h
+#define CHA_MRS_DDR2_TWR4 (0 << 13) + (1 << 20) + (1 << 12) // Value = 101000h
+#define CHA_MRS_DDR2_TWR5 (1 << 13) + (0 << 20) + (0 << 12) // Value = 002000h
+#define CHA_MRS_DDR2_TWR6 (1 << 13) + (0 << 20) + (1 << 12) // Value = 003000h
+
+// DDR2 Twr=2 Twr=3 Twr=4 Twr=5
+static const u32 CHA_DDR2_Twr_table[5] =
+ { CHA_MRS_DDR2_TWR2, CHA_MRS_DDR2_TWR3, CHA_MRS_DDR2_TWR4,
+CHA_MRS_DDR2_TWR5, CHA_MRS_DDR2_TWR6 };
+
+#define CHA_OCD_Exit_150ohm 0x20200 // EMRS(1), BA0=1, MA9=MA8=MA7=0,MA6=1,MA2=0 (DRAM bus address)
+// A17=1, A12=A11=A10=0,A9=1 ,A5=0 (CPU address)
+#define CHA_OCD_Default_150ohm 0x21E00 // EMRS(1), BA0=1, MA9=MA8=MA7=1,MA6=1,MA2=0 (DRAM bus address)
+// A17=1, A12=A11=A10=1,A9=1 ,A5=0 (CPU address)
+#define CHA_OCD_Exit_75ohm 0x20020 // EMRS(1), BA0=1, MA9=MA8=MA7=0,MA6=0,MA2=1 (DRAM bus address)
+// A17=1, A12=A11=A10=0,A9=0 ,A5=1 (CPU address)
+#define CHA_OCD_Default_75ohm 0x21C20 // EMRS(1), BA0=1, MA9=MA8=MA7=1,MA6=0,MA2=1 (DRAM bus address)
+// A17=1, A12=A11=A10=1,A9=0 ,A5=1 (CPU address)
+
+void InitDDR2CHA(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ u8 Reg6BVal;
+ u8 Idx, CL, BL, Twr;
+ u32 AccessAddr;
+ u8 DimmNum;
+
+ // step2.
+ //disable bank paging and multi page
+ Data = pci_read_config8(MEMCTRL, 0x69);
+ Data &= ~0x03;
+ pci_write_config8(MEMCTRL, 0x69, Data);
+
+ Reg6BVal = pci_read_config8(MEMCTRL, 0x6b);
+ Reg6BVal &= ~0x07;
+ // Step 3.
+ // At least one NOP cycle will be issued after the 1m sec device deselect.
+ Data = Reg6BVal | 0x01;
+ pci_write_config8(MEMCTRL, 0x6b, Data);
+
+ // step4.
+ //Read a double word from any address of the DIMM
+ DimmRead(0x0);
+
+ // Step 5.
+ // A minimum pause of 200u sec will be provided after the NOP.
+ // - <<< reduce BOOT UP time >>> -
+ // Loop 200us
+ for (Idx = 0; Idx < 0x10; Idx++)
+ WaitMicroSec(100);
+
+ // Step 6.
+ // Precharge all (PALL) will be issued to the DDR.
+ Data = Reg6BVal | 0x02;
+ pci_write_config8(MEMCTRL, 0x6b, Data);
+
+ // Step7.
+ //Read a double word from any address of the DIMM
+ DimmRead(0x0);
+
+ // Step 8.
+ // MSR Eable will be issued to the DDR
+ Data = Reg6BVal | 0x03;
+ pci_write_config8(MEMCTRL, 0x6b, Data);
+
+
+ // Step 9,10. check ODT value for EMRS(1) command
+ // according to ODTLookUp_TBL in driving_setting.c if there is one dimm in MB's one channel , the DDR2's ODT is 150ohm
+ // if there is two dimm in MB's one channel, the DDR2's ODT is 75 ohm
+ DimmNum = DramAttr->DimmNumChA;
+
+ if (DimmNum == 1) //DDR's ODT is 150ohm
+ {
+ AccessAddr = (u32) CHA_MRS_DLL_150[0];
+ DimmRead(AccessAddr); //issue EMRS DLL Enable
+ PRINT_DEBUG_MEM("Step 9 Address ");
+ PRINT_DEBUG_MEM_HEX32(AccessAddr);
+ PRINT_DEBUG_MEM("\r");
+
+ AccessAddr = (u32) CHA_MRS_DLL_150[1];
+ DimmRead(AccessAddr); //issue MRS DLL Reset
+ PRINT_DEBUG_MEM("Step 10 Address ");
+ PRINT_DEBUG_MEM_HEX32(AccessAddr);
+ PRINT_DEBUG_MEM("\r");
+ } else if (DimmNum == 2) //DDR's ODT is 75ohm
+ {
+ AccessAddr = (u32) CHA_MRS_DLL_75[0];
+ DimmRead(AccessAddr); //issue EMRS DLL Enable
+ AccessAddr = (u32) CHA_MRS_DLL_75[1];
+ DimmRead(AccessAddr); //issue MRS DLL Reset
+ } else {
+ PRINT_DEBUG_MEM("Dimm NUM ERROR:");
+ PRINT_DEBUG_MEM_HEX8(DimmNum);
+ PRINT_DEBUG_MEM("\r");
+ }
+
+ // Step 11.
+ // Precharge all (PALL) will be issued to the DDR.
+ Data = Reg6BVal | 0x02;
+ pci_write_config8(MEMCTRL, 0x6b, Data);
+
+ // Step12.
+ //Read a double word from any address of the DIMM
+ DimmRead(0x0);
+
+ // Step 13.
+ // Execute 8 CBR refresh
+ Data = Reg6BVal | 0x04;
+ pci_write_config8(MEMCTRL, 0x6b, Data);
+
+ // issue 14,15 , 16
+ //reads and wait 100us between each read
+ for (Idx = 0; Idx < 8; Idx++) {
+ DimmRead(0x0);
+ WaitMicroSec(100);
+ }
+
+ // Step 17.
+ // enable MRS for MAA
+ Data = Reg6BVal | 0x03;
+ pci_write_config8(MEMCTRL, 0x6b, Data);
+
+ //Step 18
+ //the SDRAM parameters.(Burst Length, CAS# Latency , Write recovery etc.)
+ //-------------------------------------------------------------
+ //Burst Length : really offset Rx6c[3]
+ Data = pci_read_config8(MEMCTRL, 0x6c);
+ BL = (Data & 0x08) >> 3;
+
+ // CL = really offset RX62[2:0]
+ Data = pci_read_config8(MEMCTRL, 0x62);
+ CL = Data & 0x03;
+
+ AccessAddr = (u32) (CHA_DDR2_MRS_table[CL]);
+ if (BL) {
+ AccessAddr += 8;
+ }
+ //Write recovery : really offset Rx63[7-5]
+ Data = pci_read_config8(MEMCTRL, 0x63);
+ Twr = (Data & 0xE0) >> 5;
+
+ AccessAddr += CHA_DDR2_Twr_table[Twr];
+ // AccessAddr = 0x1012D8;
+ DimmRead(AccessAddr); // Set MRS command
+ PRINT_DEBUG_MEM("Step 18 Address");
+ PRINT_DEBUG_MEM_HEX32(AccessAddr);
+ PRINT_DEBUG_MEM("\r");
+
+ //Step 19,20
+ if (DimmNum == 1) //DDR's ODT is 150ohm
+ {
+ AccessAddr = (u32) CHA_OCD_Default_150ohm;
+ DimmRead(AccessAddr); //issue EMRS OCD Default
+ PRINT_DEBUG_MEM("Step 19 Address ");
+ PRINT_DEBUG_MEM_HEX32(AccessAddr);
+ PRINT_DEBUG_MEM("\r");
+
+ AccessAddr = (u32) CHA_OCD_Exit_150ohm;
+ DimmRead(AccessAddr); //issue EMRS OCD Calibration Mode Exit
+ PRINT_DEBUG_MEM("Step 20 Address ");
+ PRINT_DEBUG_MEM_HEX32(AccessAddr);
+ PRINT_DEBUG_MEM("\r");
+ } else if (DimmNum == 2) //DDR's ODT is 75ohm
+ {
+ AccessAddr = (u32) CHA_OCD_Default_75ohm;
+ DimmRead(AccessAddr); //issue EMRS OCD Default
+ AccessAddr = (u32) CHA_OCD_Exit_75ohm;
+ DimmRead(AccessAddr); //issue EMRS OCD Calibration Mode Exit
+ } else {
+ PRINT_DEBUG_MEM("Dimm NUM ERROR: ");
+ PRINT_DEBUG_MEM_HEX8(DimmNum);
+ PRINT_DEBUG_MEM("\r");
+ }
+
+ //Step 21
+ //After MRS the device should be ready for full functionality within 3 clocks
+ // after Tmrd is met.
+ Data = Reg6BVal;
+ pci_write_config8(MEMCTRL, 0x6b, Data);
+
+ // Enable bank paging and multi page
+ Data = pci_read_config8(MEMCTRL, 0x69);
+ Data |= 0x03;
+ pci_write_config8(MEMCTRL, 0x69, Data);
+}
+
+/*===================================================================
+Function : InitDDR2_CHB()
+Precondition :
+Input :
+ DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
+ in MotherBoard
+Output : Void
+Purpose : Initialize DDR2 of CHB by standard sequence
+Reference :
+===================================================================*/
+/*// DLL: Enable Reset
+static const u32 CHB_MRS_DLL_150[2] = { 0x00020200 | (1 << 20), 0x00000800 }; // with 150 ohm (A17=1, A9=1), (A11=1)(cpu address)
+//u32 CHB_MRS_DLL_75[2] = { 0x00020020 | (1 << 20), 0x00000800 }; // with 75 ohm (A17=1, A5=1), (A11=1)(cpu address)
+// CPU(DRAM)
+// { DLL: Enable. A17(BA0)=1 and A3(MA0)=0 }
+// { DLL: reset. A11(MA8)=1 }
+//
+// DDR2 CL=2 CL=3 CL=4 CL=5 (Burst type=interleave)(WR fine tune in code)
+static const u16 CHB_DDR2_MRS_table[4] ={ 0x0150, 0x01D0, 0x0250, 0x02D0 }; // BL=4 ;Use 1X-bandwidth MA table to init DRAM
+
+// MA11 MA10(AP) MA9
+#define CHB_MRS_DDR2_TWR2 (0 << 13) + (0 << 20) + (1 << 12) // Value = 001000h
+#define CHB_MRS_DDR2_TWR3 (0 << 13) + (1 << 20) + (0 << 12) // Value = 100000h
+#define CHB_MRS_DDR2_TWR4 (0 << 13) + (1 << 20) + (1 << 12) // Value = 101000h
+#define CHB_MRS_DDR2_TWR5 (1 << 13) + (0 << 20) + (0 << 12) // Value = 002000h
+#define CHB_MRS_DDR2_TWR6 (1 << 13) + (0 << 20) + (1 << 12) // Value = 003000h
+
+// DDR2 Twr=2 Twr=3 Twr=4 Twr=5
+static const u32 CHB_DDR2_Twr_table[5] = { CHB_MRS_DDR2_TWR2, CHB_MRS_DDR2_TWR3, CHB_MRS_DDR2_TWR4, CHB_MRS_DDR2_TWR5, CHB_MRS_DDR2_TWR6 };
+
+#define CHB_OCD_Exit_150ohm 0x20200 | (1 << 20) // EMRS(1), BA0=1, MA9=MA8=MA7=0,MA6=1,MA2=0 (DRAM bus address)
+// A17=1, A12=A11=A10=0,A9=1 ,A5=0 (CPU address)
+#define CHB_OCD_Default_150ohm 0x21E00 | (1 << 20) // EMRS(1), BA0=1, MA9=MA8=MA7=1,MA6=1,MA2=0 (DRAM bus address)
+// A17=1, A12=A11=A10=1,A9=1 ,A5=0 (CPU address)
+//#define CHB_OCD_Exit_75ohm 0x20020 | (1 << 20) // EMRS(1), BA0=1, MA9=MA8=MA7=0,MA6=0,MA2=1 (DRAM bus address)
+// A17=1, A12=A11=A10=0,A9=0 ,A5=1 (CPU address)
+//#define CHB_OCD_Default_75ohm 0x21C20 | (1 << 20) // EMRS(1), BA0=1, MA9=MA8=MA7=1,MA6=0,MA2=1 (DRAM bus address)
+// A17=1, A12=A11=A10=1,A9=0 ,A5=1 (CPU address)
+void InitDDR2CHB(
+ DRAM_SYS_ATTR *DramAttr
+ )
+
+{
+ u8 Data;
+ u8 Idx, CL, BL, Twr;
+ u32 AccessAddr;
+
+ Data = 0x80;
+ pci_write_config8(MEMCTRL, 0x54, Data);
+
+ // step3.
+ //disable bank paging and multi page
+ Data=pci_read_config8(MEMCTRL, 0x69);
+ Data &= ~0x03;
+ pci_write_config8(MEMCTRL, 0x69, Data);
+
+ Data=pci_read_config8(MEMCTRL, 0xd3);
+ Data |= 0x80;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+
+ //step 4. Initialize CHB begin
+ Data=pci_read_config8(MEMCTRL, 0xd3);
+ Data |= 0x40;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+
+ //Step 5. NOP command enable
+ Data=pci_read_config8(MEMCTRL, 0xd7);
+ Data &= 0xC7;
+ Data |= 0x08;
+ pci_write_config8(MEMCTRL, 0xd7, Data);
+
+ //Step 6. issue a nop cycle,RegD3[7] 0 -> 1
+ Data=pci_read_config8(MEMCTRL, 0xd3);
+ Data &= 0x7F;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+ Data |= 0x80;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+
+
+ // Step 7.
+ // A minimum pause of 200u sec will be provided after the NOP.
+ // - <<< reduce BOOT UP time >>> -
+ // Loop 200us
+ for (Idx = 0; Idx < 0x10; Idx++)
+ WaitMicroSec(10);
+
+ // Step 8.
+ // all banks precharge command enable
+ Data=pci_read_config8(MEMCTRL, 0xd7);
+ Data &= 0xC7;
+ Data |= 0x10;
+ pci_write_config8(MEMCTRL, 0xd7, Data);
+
+ //step 9. issue a precharge all cycle,RegD3[7] 0 -> 1
+ Data=pci_read_config8(MEMCTRL, 0xd3);
+ Data &= 0x7F;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+ Data |= 0x80;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+
+ //step10. EMRS enable
+ Data=pci_read_config8(MEMCTRL, 0xd7);
+ Data &= 0xC7;
+ Data |= 0x18;
+ pci_write_config8(MEMCTRL, 0xd7, Data);
+
+ Data=pci_read_config8(MEMCTRL, 0xd3);
+ Data &= 0xC7;
+ Data |= 0x08;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+
+ //step11. EMRS DLL Enable and Disable DQS
+ AccessAddr = CHB_MRS_DLL_150[0] >> 3;
+ Data =(u8) (AccessAddr & 0xff);
+ pci_write_config8(MEMCTRL, 0xd9, Data);
+
+ Data = (u8)((AccessAddr & 0xff00) >> 8);
+ pci_write_config8(MEMCTRL, 0xda, Data);
+
+ Data=pci_read_config8(MEMCTRL, 0xd7);
+ Data &= 0xF9;
+ Data |= (u8)((AccessAddr & 0x30000) >> 15);
+ pci_write_config8(MEMCTRL, 0xd7, Data);
+
+ //step12. issue EMRS cycle
+ Data=pci_read_config8(MEMCTRL, 0xd3);
+ Data &= 0x7F;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+ Data |= 0x80;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+
+ //step13. MSR enable
+ Data=pci_read_config8(MEMCTRL, 0xd7);
+ Data &= 0xC7;
+ Data |= 0x18;
+ pci_write_config8(MEMCTRL, 0xd7, Data);
+
+ Data=pci_read_config8(MEMCTRL, 0xd3);
+ Data &= 0xC7;
+ Data |= 0x00;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+
+
+ //step 14. MSR DLL Reset
+ AccessAddr = CHB_MRS_DLL_150[1] >> 3;
+ Data =(u8) (AccessAddr & 0xff);
+ pci_write_config8(MEMCTRL, 0xd9, Data);
+
+ Data = (u8)((AccessAddr & 0xff00) >> 8);
+ pci_write_config8(MEMCTRL, 0xda, Data);
+
+ Data=pci_read_config8(MEMCTRL, 0xd7);
+ Data &= 0xF9;
+ Data |= (u8)((AccessAddr & 0x30000) >> 15);
+ pci_write_config8(MEMCTRL, 0xd7, Data);
+
+ //step15. issue MRS cycle
+ Data=pci_read_config8(MEMCTRL, 0xd3);
+ Data &= 0x7F;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+ Data |= 0x80;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+
+ //clear the address
+ Data = 0x00;
+ pci_write_config8(MEMCTRL, 0xda, Data);
+
+ //step16. all banks precharge command enable
+ Data=pci_read_config8(MEMCTRL, 0xd7);
+ Data &= 0xC7;
+ Data |= 0x10;
+ pci_write_config8(MEMCTRL, 0xd7, Data);
+
+
+ // step17. issue precharge all cycle
+ Data=pci_read_config8(MEMCTRL, 0xd3);
+ Data &= 0x7F;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+ Data |= 0x80;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+
+ //step18. CBR cycle enable
+ Data=pci_read_config8(MEMCTRL, 0xd7);
+ Data &= 0xC7;
+ Data |= 0x20;
+ pci_write_config8(MEMCTRL, 0xd7, Data);
+
+ //step 19.20.21
+ //repeat issue 8 CBR cycle, between each cycle stop 100us
+ for (Idx = 0; Idx < 8; Idx++)
+ {
+ // issue CBR cycle
+ Data=pci_read_config8(MEMCTRL, 0xd3);
+ Data &= 0x7F;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+ Data |= 0x80;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+
+ WaitMicroSec(200);
+ }
+
+ //step22. MSR enable
+ Data=pci_read_config8(MEMCTRL, 0xd7);
+ Data &= 0xC7;
+ Data |= 0x18;
+ pci_write_config8(MEMCTRL, 0xd7, Data);
+
+ Data=pci_read_config8(MEMCTRL, 0xd3);
+ Data &= 0xC7;
+ Data |= 0x00;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+
+
+
+ //the SDRAM parameters.(Burst Length, CAS# Latency , Write recovery etc.)
+ //-------------------------------------------------------------
+ //Burst Length : really offset Rx6c[1]
+ Data=pci_read_config8(MEMCTRL, 0x6C);
+ BL = (Data & 0x02) >> 1;
+
+ // CL = really offset RX62[2:0]
+ Data=pci_read_config8(MEMCTRL, 0x62);
+ CL = Data & 0x03;
+
+
+ AccessAddr = (u32)(CHB_DDR2_MRS_table[CL]);
+ if (BL)
+ {
+ AccessAddr += 8;
+ }
+
+ //Write recovery : really offset Rx63[7:5]
+ Data=pci_read_config8(MEMCTRL, 0x63);
+ Twr = (Data & 0xE0) >> 5;
+
+ AccessAddr += CHB_DDR2_Twr_table[Twr];
+ //MSR Address use addr[20:3]
+ AccessAddr >>= 3;
+
+ //step 23. MSR command
+ Data = (u8)(AccessAddr & 0xFF);
+ pci_write_config8(MEMCTRL, 0xD9, Data);
+
+ Data = (u8)((AccessAddr & 0xFF00) >> 8);
+ pci_write_config8(MEMCTRL, 0xda, Data);
+
+ Data=pci_read_config8(MEMCTRL, 0xd7);
+ Data &= 0xF9;
+ Data |= (u8)(((AccessAddr & 0x30000)>>16) << 1);
+ pci_write_config8(MEMCTRL, 0xd7, Data);
+
+ //step 24. issue MRS cycle
+ Data=pci_read_config8(MEMCTRL, 0xd3);
+ Data &= 0x7F;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+ Data |= 0x80;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+
+ //step 25. EMRS enable
+ Data=pci_read_config8(MEMCTRL, 0xd7);
+ Data &= 0xC7;
+ Data |= 0x18;
+ pci_write_config8(MEMCTRL, 0xd7, Data);
+
+ Data=pci_read_config8(MEMCTRL, 0xd3);
+ Data &= 0xC7;
+ Data |= 0x08;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+
+
+ //step 26. OCD default
+ AccessAddr = (CHB_OCD_Default_150ohm) >> 3;
+ Data =(u8) (AccessAddr & 0xff);
+ pci_write_config8(MEMCTRL, 0xd9, Data);
+
+ Data = (u8)((AccessAddr & 0xff00) >> 8);
+ pci_write_config8(MEMCTRL, 0xda, Data);
+
+ Data=pci_read_config8(MEMCTRL, 0xd7);
+ Data &= 0xF9;
+ Data |= (u8)((AccessAddr & 0x30000) >> 15);
+ pci_write_config8(MEMCTRL, 0xd7, Data);
+
+
+ //step 27. issue EMRS cycle
+ Data=pci_read_config8(MEMCTRL, 0xd3);
+ Data &= 0x7F;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+ Data |= 0x80;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+
+ //step 25. EMRS enable
+ Data=pci_read_config8(MEMCTRL, 0xd7);
+ Data &= 0xC7;
+ Data |= 0x18;
+ pci_write_config8(MEMCTRL, 0xd7, Data);
+
+ Data=pci_read_config8(MEMCTRL, 0xd3);
+ Data &= 0xC7;
+ Data |= 0x08;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+
+ //step 28. OCD Exit
+ AccessAddr = (CHB_OCD_Exit_150ohm) >> 3;
+ Data =(u8) (AccessAddr & 0xff);
+ pci_write_config8(MEMCTRL, 0xd9, Data);
+
+ Data = (u8)((AccessAddr & 0xff00) >> 8);
+ pci_write_config8(MEMCTRL, 0xda, Data);
+
+ Data=pci_read_config8(MEMCTRL, 0xd7);
+ Data &= 0xF9;
+ Data |= (u8)((AccessAddr & 0x30000) >> 15);
+ pci_write_config8(MEMCTRL, 0xd7, Data);
+
+ //step 29. issue EMRS cycle
+ Data=pci_read_config8(MEMCTRL, 0xd3);
+ Data &= 0x7F;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+ Data |= 0x80;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+
+ //clear all the address
+ Data = 0x00;
+ pci_write_config8(MEMCTRL, 0xd9, Data);
+
+ Data = 0x00;
+ pci_write_config8(MEMCTRL, 0xda, Data);
+
+ Data=pci_read_config8(MEMCTRL, 0xd7);
+ Data &= 0xF9;
+ pci_write_config8(MEMCTRL, 0xd7, Data);
+
+
+ //step 30. normal SDRAM Mode
+ Data=pci_read_config8(MEMCTRL, 0xd7);
+ Data &= 0xC7;
+ Data |= 0x00;
+ pci_write_config8(MEMCTRL, 0xd7, Data);
+
+ Data=pci_read_config8(MEMCTRL, 0xd3);
+ Data &= 0xC7;
+ Data |= 0x00;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+
+ //step 31. exit the initialization mode
+ Data=pci_read_config8(MEMCTRL, 0xd3);
+ Data &= 0xBF;
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+
+
+ //step 32. Enable bank paging and multi page
+ Data=pci_read_config8(MEMCTRL, 0x69);
+ Data |= 0x03;
+ pci_write_config8(MEMCTRL, 0x69, Data);
+}
+*/
+/*===================================================================
+Function : InitDDR2CHC()
+Precondition :
+Input :
+ DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
+ in MotherBoard
+Output : Void
+Purpose : Initialize DDR2 of CHC by standard sequence
+Reference :
+===================================================================*/
+// DDR2 CL=2 CL=3 CL=4 CL=5 (Burst type=interleave)(WR fine tune in code)
+static const u16 CHC_MRS_table[4] = { 0x22B, 0x23B, 0x24B, 0x25B }; // Use 1X-bandwidth MA table to init DRAM
+
+void InitDDR2CHC(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ u8 Idx, CL, Twr;
+ u32 AccessAddr;
+ CB_STATUS Status;
+
+ // step3.
+ //clear RxDF[2] to disable Tri-state output
+ Data = pci_read_config8(MEMCTRL, 0xdf);
+ Data &= 0xFB;
+ pci_write_config8(MEMCTRL, 0xdf, Data);
+
+
+
+ //step 4. Enable the initialization mode of DRAM Controller C with NB's PLL clock
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data |= 0x60;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ //Step 5. NOP command enable
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data &= 0xE3;
+ Data |= 0x00;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+
+ //Step 6. issue a nop cycle,RegDB[1] 0 -> 1
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data |= 0x2;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+ Data &= 0xFD;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+
+ // Step 7.
+ // A minimum pause of 200u sec will be provided after the NOP.
+ // - <<< reduce BOOT UP time >>> -
+ // Loop 200us
+ for (Idx = 0; Idx < 0x10; Idx++)
+ WaitMicroSec(100);
+
+ // Step 8.
+ // signal bank precharge command enable
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data &= 0xE3;
+ Data |= 0x14;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ //set MA10 =1, precharge all bank
+ Data = 0x00;
+ pci_write_config8(MEMCTRL, 0xf8, Data);
+
+
+ Data = 0x04;
+ pci_write_config8(MEMCTRL, 0xf9, Data);
+
+ //step 9. issue a precharge all cycle,RegD3[7] 0 -> 1
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data |= 0x2;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+ Data &= 0xFD;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ //step10. MRS enable
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data &= 0xE3;
+ Data |= 0x1C;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+
+ //step11. EMRS DLL enable and Disable DQS
+ Data = 0x40;
+ pci_write_config8(MEMCTRL, 0xf8, Data);
+
+ Data = 0x24;
+ pci_write_config8(MEMCTRL, 0xf9, Data);
+
+ //step12. issue EMRS cycle
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data |= 0x2;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+ Data &= 0xFD;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ //step13. MSR enable
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data &= 0xE3;
+ Data |= 0x1C;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ //step 14. MSR DLL Reset
+ Data = 0x00;
+ pci_write_config8(MEMCTRL, 0xf8, Data);
+
+ Data = 0x01;
+ pci_write_config8(MEMCTRL, 0xf9, Data);
+
+ //step15. issue MRS cycle
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data |= 0x2;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+ Data &= 0xFD;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ //step16. signal banks precharge command enable
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data &= 0xE3;
+ Data |= 0x14;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ //set MA10 =1, precharge all bank
+ Data = 0x00;
+ pci_write_config8(MEMCTRL, 0xf8, Data);
+
+ Data = 0x04;
+ pci_write_config8(MEMCTRL, 0xf9, Data);
+
+ // step17. issue precharge all cycle
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data |= 0x2;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+ Data &= 0xFD;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ //step18. CBR cycle enable
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data &= 0xE3;
+ Data |= 0x18;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ Data = 0x00;
+ pci_write_config8(MEMCTRL, 0xf8, Data);
+
+ Data = 0x00;
+ pci_write_config8(MEMCTRL, 0xf9, Data);
+
+ //step 19.20.21
+ //repeat issue 8 CBR cycle, between each cycle stop 100us
+ for (Idx = 0; Idx < 8; Idx++) {
+ // issue CBR cycle
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data |= 0x2;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+ Data &= 0xFD;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+ WaitMicroSec(100);
+ }
+
+ //the SDRAM parameters.(, CAS# Latency , Write recovery etc.)
+ //------------------------------------------------------------
+
+ // CL = really offset RXDC[7:6]
+ Data = pci_read_config8(MEMCTRL, 0xdc);
+ CL = (Data & 0xC0) >> 6;
+
+ AccessAddr = (u32) (CHC_MRS_table[CL]);
+
+ //Write recovery : really offset Rx63[7:5]
+ Data = pci_read_config8(MEMCTRL, 0x63);
+ Twr = (Data & 0xE0) >> 5;
+
+ AccessAddr += Twr * 0x200;
+
+ //step22. MSR enable
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data &= 0xE3;
+ Data |= 0x1C;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ //step 23. MSR command
+ Data = (u8) (AccessAddr & 0xFF);
+ pci_write_config8(MEMCTRL, 0xf8, Data);
+
+ Data = (u8) ((AccessAddr & 0xFF00) >> 8);
+ pci_write_config8(MEMCTRL, 0xf9, Data);
+
+ //step 24. issue MRS cycle
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data |= 0x2;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+ Data &= 0xFD;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ //step 25. EMRS enable
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data &= 0xE3;
+ Data |= 0x1C;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+
+ //step 26. OCD default
+ Data = 0xC0;
+ pci_write_config8(MEMCTRL, 0xf8, Data);
+
+ Data = 0x27;
+ pci_write_config8(MEMCTRL, 0xf9, Data);
+
+ //step 27. issue EMRS cycle
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data |= 0x2;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+ Data &= 0xFD;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ //step 28. OCD Exit
+ Data = 0x40;
+ pci_write_config8(MEMCTRL, 0xf8, Data);
+
+ Data = 0x24;
+ pci_write_config8(MEMCTRL, 0xf9, Data);
+
+
+ //step 29. issue EMRS cycle
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data |= 0x2;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+ Data &= 0xFD;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ Status = VerifyChc();
+ if (Status != CB_SUCCESS)
+ PRINT_DEBUG_MEM("Error!!!!CHC init error!\r");
+ //step 31. exit the initialization mode
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data &= 0x9F;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+}
+
+CB_STATUS VerifyChc()
+{
+ u8 Data, ByteVal, Index, pad;
+ u16 row;
+
+ //first write the pad to all the address
+
+ //the row bits is 13 and rank bit is 2, so the address bits is 15 and the value is 0x7fff
+ //verify each MA[0:12],BA[0:1]
+ pad = 1;
+ for (row = 0; row < 0x8000; row++) {
+ //set the write value;
+ //verify each MD[15:0]
+ for (Data = pad, Index = 0; Index < 16; Index++) {
+ Data <<= 1;
+ if (Data == 0)
+ Data = 1;
+ pci_write_config8(PCI_DEV(0, 0, 7), 0xC0 + Index,
+ Data);
+
+ }
+
+ //issue the bank active command
+ // bank active command enable
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data &= 0xE3;
+ Data |= 0x10;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ Data = (u8) (row && 0xFF);
+ pci_write_config8(MEMCTRL, 0xf8, Data);
+
+ Data = (u8) ((row && 0xFF) >> 8);
+ pci_write_config8(MEMCTRL, 0xf9, Data);
+
+ // issue active cycle
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data |= 0x2;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+ Data &= 0xFD;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ //issue ready/completion for read/write
+ // read/completion command enable
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data &= 0xE3;
+ Data |= 0x04;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ Data = 0x00;
+ pci_write_config8(MEMCTRL, 0xf8, Data);
+
+ Data = 0x00;
+ pci_write_config8(MEMCTRL, 0xf9, Data);
+
+ // issue read/completion cycle
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data |= 0x2;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+ Data &= 0xFD;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ //issue write command
+ // write command enable
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data &= 0xE3;
+ Data |= 0x0C;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ Data = 0x00;
+ pci_write_config8(MEMCTRL, 0xf8, Data);
+
+ Data = (u8) ((row & 0x60) << 5);
+ pci_write_config8(MEMCTRL, 0xf9, Data);
+
+ // issue write cycle
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data |= 0x2;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+ Data &= 0xFD;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ ////issue ready/completion for read/write
+ // read/completion command enable
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data &= 0xE3;
+ Data |= 0x04;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ Data = 0x00;
+ pci_write_config8(MEMCTRL, 0xf8, Data);
+
+ Data = 0x00;
+ pci_write_config8(MEMCTRL, 0xf9, Data);
+
+ // issue read/completion cycle
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data |= 0x2;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+ Data &= 0xFD;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ //issue the bank active command
+ // bank active command enable
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data &= 0xE3;
+ Data |= 0x10;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ Data = (u8) (row && 0xFF);
+ pci_write_config8(MEMCTRL, 0xf8, Data);
+
+ Data = (u8) ((row && 0xFF) >> 8);
+ pci_write_config8(MEMCTRL, 0xf9, Data);
+
+ // issue active cycle
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data |= 0x2;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+ Data &= 0xFD;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ ////issue ready/completion for read/write
+ // read/completion command enable
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data &= 0xE3;
+ Data |= 0x04;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ Data = 0x00;
+ pci_write_config8(MEMCTRL, 0xf8, Data);
+
+ Data = 0x00;
+ pci_write_config8(MEMCTRL, 0xf9, Data);
+
+ // issue read/completion cycle
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data |= 0x2;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+ Data &= 0xFD;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ ////issue read command
+ // read/completion command enable
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data &= 0xE3;
+ Data |= 0x08;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ Data = 0x00;
+ pci_write_config8(MEMCTRL, 0xf8, Data);
+
+ Data = (u8) ((row & 0x60) << 5);
+ pci_write_config8(MEMCTRL, 0xf9, Data);
+
+ // issue read cycle
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data |= 0x2;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+ Data &= 0xFD;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ ////issue ready/completion for read/write
+ // read/completion command enable
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data &= 0xE3;
+ Data |= 0x04;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ Data = 0x00;
+ pci_write_config8(MEMCTRL, 0xf8, Data);
+
+ Data = 0x00;
+ pci_write_config8(MEMCTRL, 0xf9, Data);
+
+ // issue read/completion cycle
+ Data = pci_read_config8(MEMCTRL, 0xdb);
+ Data |= 0x2;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+ Data &= 0xFD;
+ pci_write_config8(MEMCTRL, 0xdb, Data);
+
+ //verify the value;
+ for (ByteVal = pad, Index = 0; Index < 16; Index++) {
+ Data =
+ pci_read_config8(PCI_DEV(0, 0, 7),
+ 0xD0 + Index);
+ if (ByteVal != Data) {
+ PRINT_DEBUG_MEM
+ ("error!!!! row = %x,Index =%x,Data = %x,ByteVal=%x\r");
+ }
+ ByteVal <<= 1;
+ if (ByteVal == 0)
+ ByteVal = 1;
+ }
+ pad <<= 1;
+ if (pad == 0)
+ pad = 1;
+ }
+
+ return CB_SUCCESS;
+}
Copied: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/dqs_search.c (from rev 4313, trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/DQSSearch.c)
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/dqs_search.c (rev 0)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/dqs_search.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -0,0 +1,98 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2009 One Laptop per Child, Association, Inc.
+ *
+ * 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
+ */
+
+void SetDQSOutputCHA(DRAM_SYS_ATTR * DramAttr);
+void SetDQSOutputCHB(DRAM_SYS_ATTR * DramAttr);
+
+/*===================================================================
+Function : DRAMDQSOutputSearchCHA()
+Precondition :
+Input :
+ DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
+ in MotherBoard
+Output : Void
+Purpose : set DQS output delay register reg70 and DQ output delay register reg71
+===================================================================*/
+
+#define CH_A 0
+#define CH_B 1
+void DRAMDQSOutputSearch(DRAM_SYS_ATTR * DramAttr)
+{
+ if (DramAttr->RankNumChA > 0)
+ SetDQSOutputCHA(DramAttr);
+}
+
+/*===================================================================
+Function : SetDQSOutputCHA()
+Precondition :
+Input :
+ DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
+ in MotherBoard
+Output : Void
+Purpose : according the frequence set CHA DQS output
+===================================================================*/
+void SetDQSOutputCHA(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Reg70, Reg71;
+ u8 Index;
+
+ if (DramAttr->DramFreq == DIMMFREQ_400)
+ Index = 3;
+ else if (DramAttr->DramFreq == DIMMFREQ_533)
+ Index = 2;
+ else if (DramAttr->DramFreq == DIMMFREQ_667)
+ Index = 1;
+ else if (DramAttr->DramFreq == DIMMFREQ_800)
+ Index = 0;
+ else
+ Index = 3;
+
+ if (DramAttr->RankNumChA > 2) {
+ Reg70 = Fixed_DQSA_3_4_Rank_Table[Index][0];
+ Reg71 = Fixed_DQSA_3_4_Rank_Table[Index][1];
+ } else {
+ Reg70 = Fixed_DQSA_1_2_Rank_Table[Index][0];
+ Reg71 = Fixed_DQSA_1_2_Rank_Table[Index][1];
+ }
+ pci_write_config8(MEMCTRL, 0x70, Reg70);
+ pci_write_config8(MEMCTRL, 0x71, Reg71);
+}
+
+
+//################
+// STEP 12 #
+//################
+
+/*===================================================================
+Function : DRAMDQSInputSearch()
+Precondition :
+Input :
+ DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
+ in MotherBoard
+Output : Void
+Purpose : search DQS input delay for CHA/CHB
+===================================================================*/
+
+void DRAMDQSInputSearch(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ //auto mode
+ Data = 0x0;
+ pci_write_config8(MEMCTRL, 0x77, Data);
+}
Copied: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/drdy_bl.c (from rev 4313, trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/DRDY_BL.c)
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/drdy_bl.c (rev 0)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/drdy_bl.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -0,0 +1,600 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2009 One Laptop per Child, Association, Inc.
+ *
+ * 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
+ */
+
+// Set P6IF DRDY Timing
+// Because there are 1.5T & 2.5T CAS latency in DDR1 mode, we need to use RDELAYMD-0
+//
+// Entry:
+// EBP[29:25] = DRAM Speed, Dual_Channel
+// VIA_NB2HOST_REG54[7:5] Host Frequency
+// VIA_NB3DRAM_REG62[2:0] CAS Latency
+//
+// Modify NB_Reg:
+// VIA_NB2HOST_REG54[3,1]
+// VIA_NB2HOST_REG55[1]
+// VIA_NB2HOST_REG60
+// VIA_NB2HOST_REG61
+// VIA_NB2HOST_REG62[3:0]
+// VIA_NB2HOST_REG63
+// VIA_NB2HOST_REG64
+// VIA_NB2HOST_REG65[3:0]
+// VIA_NB2HOST_REG66
+// VIA_NB2HOST_REG67[5:4]
+//
+// Processing:
+//--------------------------------------------------------------------------
+// P6IF DRDY Timing Control:
+// *Following algorithm to set DRDY timing
+// Set P6IF DRDY Timing by the following 3 conditions:
+// 1. RDELAYMD
+// a.RDRPH(MD input internal timing control)
+// b.CAS Latency
+// RDELAYMD(1bit) = bit0 of (CL + RDRPH)
+// for example: RDRPH=10b, CL3 -> F3_Rx56[5:4]=11b, 10b + 11b = 101b, RDELAYMD=1 (bit0)
+// RDRPH=00b, CL2.5 -> F3_Rx56[5:4]=10b, 00b + 10b = 010b, RDELAYMD=0 (bit0)
+// 2. CPU Frequency
+// 3. DRAM Frequency
+//
+// According to above conditions, we create different tables:
+// 1. RDELAYMD=0 : for integer CAS latency(ex. CL=3)
+// 2. RDELAYMD=1 : for non-integer CAS latency(ex. CL=2.5)
+// 3. Normal performance
+// 4. Top performance :
+// Using phase0 to a case has better performance.
+//
+// Note: The setting are related to performance and maybe affect DRAM initialize.
+// Turn OFF(F2_Rx51[7]=0) this feature at csDRAMRegInitValueJ procedure.
+// Turn ON(F2_Rx51[7]=1) this feature at csDRAMRegFinalValueJ procedure.
+//
+// If F2_Rx51[7]=0, then CPU always wait 8QW, a slower but most stable way
+// If F2_Rx51[7]=1, then the timing will refer to F2_Rx60 ~ F2_Rx67,
+// a fast way but may cause the system to be unstable.
+//
+// Coding:
+// 1. RDELAYMD and user's option for performance can determine which table
+// 2. CPU Frequency can get block offset of table
+// 3. DRAM Frequency can get row offset of block
+// 4. Set value
+//
+// PS: Fun2 Rx62, Rx65, Rx67 are don't care bits in 3296, CPU 266MHz doesn't be supported by 3296,
+// but I still keep these bits in table to avoid the usage in future
+// and do the fewest modification for code.
+//
+
+// Early 3T
+// Early 3T
+#define P6IF_Misc_RFASTH 0x08
+#define P6IF_Misc2_RRRDYH3E 0x10
+#define P6IF_Misc2_RHTSEL 0x02
+
+#define Rx54E3T P6IF_Misc_RFASTH
+#define Rx55E3T P6IF_Misc2_RRRDYH3E
+
+// Early 2T
+#define Rx54E2T 0x00
+#define Rx55E2T P6IF_Misc2_RRRDYH3E
+
+// Early 1T
+#define Rx54E1T 0x00
+#define Rx55E1T 0x00
+
+// Early 0T
+#define Rx54E0T P6IF_Misc_RFASTH
+#define Rx55E0T P6IF_Misc2_RRRDYH3E + P6IF_Misc2_RHTSEL
+
+// Latter 1T
+#define Rx54L1T P6IF_Misc_RFASTH
+#define Rx55L1T P6IF_Misc2_RHTSEL
+
+
+#define PH0_0_0_0 0x00
+#define PH0_0_0_1 0x01
+#define PH0_0_0_2 0x02
+#define PH0_0_0_3 0x03
+#define PH0_0_1_0 0x04
+#define PH0_0_1_1 0x05
+#define PH0_0_1_2 0x06
+#define PH0_0_2_1 0x09
+#define PH0_0_2_2 0x0a
+#define PH0_0_2_3 0x0b
+#define PH0_0_3_2 0x0e
+#define PH0_0_3_3 0x0f
+#define PH0_1_1_0 0x14
+#define PH0_1_1_1 0x15
+#define PH0_2_1_2 0x26
+#define PH0_2_2_1 0x29
+#define PH0_2_2_2 0x2a
+#define PH0_2_2_3 0x2b
+#define PH0_2_3_2 0x2e
+#define PH0_2_3_3 0x2f
+#define PH0_3_2_2 0x3a
+#define PH0_3_3_3 0x3f
+#define PH1_0_0_0 0x40
+#define PH1_0_0_1 0x41
+#define PH1_0_1_1 0x45
+#define PH1_1_1_1 0x55
+#define PH1_2_1_1 0x65
+#define PH1_2_2_1 0x69
+#define PH2_1_1_1 0x95
+#define PH2_1_2_1 0x99
+#define PH2_1_2_2 0x9a
+#define PH2_2_1_2 0xa6
+#define PH2_2_2_1 0xa9
+#define PH2_2_2_2 0xaa
+#define PH2_2_3_2 0xae
+#define PH2_2_3_3 0xaf
+#define PH2_3_2_2 0xba
+#define PH2_3_2_3 0xbb
+#define PH2_3_3_2 0xbe
+#define PH3_2_2_3 0xeb
+#define PH3_2_3_2 0xee
+#define PH3_2_3_3 0xef
+#define PH3_3_3_3 0xff
+
+#define PT894_RDRDY_TBL_Width 10
+#define PT894_RDRDY_TBL_Block 60
+
+static const u8 PT894_128bit_DELAYMD0_RCONV0[6][6][PT894_RDRDY_TBL_Width] =
+// -----------------------------------------------------------------------------------------------------------------
+// RX60 RX61 RX62 RX63 RX64 RX65 RX66 RX67 RX54[3,1] RX55[3,1] CPU/DRAM
+// LN4:1 LN8:5 LN10:9 QW4:1 QW8:5 QW10:9 WS8:1 WS10:9 RFASTH RRRDYH3E
+// RCONV RHTSEL
+// -----------------------------------------------------------------------------------------------------------------
+{
+// cpu100
+ {
+ {PH0_1_1_1, PH0_0_0_0, PH0_0_0_0, PH0_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/100
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/133
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/166
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/200
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/266
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 100/333
+ },
+// cpu133
+ {
+ {PH0_2_2_1, PH0_0_0_0, PH0_0_0_0, PH0_2_2_1, PH0_0_0_0, PH0_0_0_0, 0x01, 0x00, Rx54E3T, Rx55E3T}, // 133/100
+ {PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/133
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/166
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/200
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/266
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 133/333
+ },
+// cpu200
+ {
+ {PH0_3_3_3, PH0_0_0_0, PH0_0_0_0, PH0_2_2_2, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E2T, Rx55E2T}, // 200/100
+ {PH2_3_2_3, PH0_0_0_0, PH0_0_0_0, PH2_3_2_3, PH0_0_0_0, PH0_0_0_0, 0x0a, 0x00, Rx54E3T, Rx55E3T}, // 200/133
+ {PH1_2_2_1, PH0_0_0_1, PH0_0_0_0, PH1_2_2_1, PH0_0_0_1, PH0_0_0_0, 0x01, 0x00, Rx54E3T, Rx55E3T}, // 200/166
+ {PH1_1_1_1, PH0_0_1_1, PH0_0_0_0, PH1_1_1_1, PH0_0_1_1, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 200/200
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 200/266
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 200/333
+ },
+// cpu166
+ {
+ {PH0_2_3_3, PH0_0_0_0, PH0_0_0_0, PH0_2_2_3, PH0_0_0_0, PH0_0_0_0, 0x05, 0x00, Rx54E3T, Rx55E3T}, // 166/100
+ {PH1_2_2_1, PH0_0_0_0, PH0_0_0_0, PH1_2_2_1, PH0_0_0_0, PH0_0_0_0, 0x01, 0x00, Rx54E3T, Rx55E3T}, // 166/133
+ {PH1_1_1_1, PH0_0_0_1, PH0_0_0_0, PH1_1_1_1, PH0_0_0_1, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 166/166
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 166/200
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 166/266
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 166/333
+ },
+// cpu266
+ {
+ {PH0_2_2_3, PH0_0_0_0, PH0_0_0_0, PH0_0_1_1, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E1T, Rx55E1T}, // 266/100
+ {PH3_3_3_3, PH0_0_0_0, PH0_0_0_0, PH2_2_2_2, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54E2T, Rx55E2T}, // 266/133
+ {PH3_2_3_3, PH0_0_0_3, PH0_0_0_0, PH3_2_3_3, PH0_0_0_2, PH0_0_0_0, 0x0d, 0x00, Rx54E3T, Rx55E3T}, // 266/166
+ {PH2_2_2_2, PH0_0_2_2, PH0_0_0_0, PH2_1_2_2, PH0_0_1_2, PH0_0_0_0, 0x12, 0x00, Rx54E3T, Rx55E3T}, // 266/200
+ {PH1_1_1_1, PH1_1_1_1, PH0_0_0_0, PH1_1_1_1, PH1_1_1_1, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 266/266
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 266/333
+ },
+// cpu333
+ {
+ {PH0_1_1_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E0T, Rx55E0T}, // 333/100
+ {PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54E1T, Rx55E1T}, // 333/133
+ {PH3_3_3_3, PH0_0_0_3, PH0_0_0_0, PH3_3_3_3, PH0_0_0_3, PH0_0_0_0, 0x1f, 0x00, Rx54E2T, Rx55E2T}, // 333/166
+ {PH2_2_1_2, PH0_0_2_1, PH0_0_0_0, PH1_2_1_1, PH0_0_2_1, PH0_0_0_0, 0x36, 0x00, Rx54E2T, Rx55E2T}, // 333/200
+ {PH2_1_1_1, PH2_1_1_1, PH0_0_0_0, PH2_1_1_1, PH2_1_1_1, PH0_0_0_0, 0x44, 0x00, Rx54E3T, Rx55E3T}, // 333/266
+ {PH2_2_2_2, PH2_2_2_2, PH0_0_2_2, PH2_2_2_2, PH2_2_2_2, PH0_0_2_2, 0x00, 0x00, Rx54E3T, Rx55E3T} // 333/333
+ }
+};
+
+static const u8 PT894_128bit_DELAYMD1_RCONV0[6][6][PT894_RDRDY_TBL_Width] =
+// -----------------------------------------------------------------------------------------------------------------
+// RX60 RX61 RX62 RX63 RX64 RX65 RX66 RX67 RX54[3,1] RX55[3,1] CPU/DRAM
+// LN4:1 LN8:5 LN10:9 QW4:1 QW8:5 QW10:9 WS8:1 WS10:9 RFASTH RRRDYH3E
+// RCONV RHTSEL
+// -----------------------------------------------------------------------------------------------------------------
+{
+// cpu100
+ {
+ {PH0_1_1_1, PH0_0_0_0, PH0_0_0_0, PH0_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/100
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/133
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/166
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/200
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/266
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 100/333
+ },
+// cpu133
+ {
+ {PH0_3_2_2, PH0_0_0_0, PH0_0_0_0, PH0_3_2_2, PH0_0_0_0, PH0_0_0_0, 0x02, 0x00, Rx54E3T, Rx55E3T}, // 133/100
+ {PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/133
+ {PH1_0_0_0, PH0_0_0_0, PH0_0_0_0, PH1_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/166
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/200
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/266
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 133/333
+ },
+// cpu200
+ {
+ {PH0_2_2_2, PH0_0_0_0, PH0_0_0_0, PH0_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E1T, Rx55E1T}, // 200/100
+ {PH2_2_2_2, PH0_0_0_0, PH0_0_0_0, PH2_1_2_1, PH0_0_0_0, PH0_0_0_0, 0x0a, 0x00, Rx54E2T, Rx55E2T}, // 200/133
+ {PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, 0x04, 0x00, Rx54E3T, Rx55E3T}, // 200/166
+ {PH2_2_2_2, PH0_0_2_2, PH0_0_0_0, PH2_2_2_2, PH0_0_2_2, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 200/200
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 200/266
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 200/333
+ },
+// cpu166
+ {
+ {PH0_2_2_2, PH0_0_0_0, PH0_0_0_0, PH0_2_1_2, PH0_0_0_0, PH0_0_0_0, 0x05, 0x00, Rx54E2T, Rx55E2T}, // 166/100
+ {PH2_3_2_2, PH0_0_0_0, PH0_0_0_0, PH2_2_2_2, PH0_0_0_0, PH0_0_0_0, 0x02, 0x00, Rx54E3T, Rx55E3T}, // 166/133
+ {PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 166/166
+ {PH1_0_0_0, PH0_0_0_1, PH0_0_0_0, PH1_0_0_0, PH0_0_0_1, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 166/200
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 166/266
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 166/333
+ },
+// cpu266
+ {
+ {PH0_1_1_1, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E0T, Rx55E0T}, // 266/100
+ {PH2_2_2_2, PH0_0_0_0, PH0_0_0_0, PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54E1T, Rx55E1T}, // 266/133
+ {PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, PH2_2_1_2, PH0_0_0_2, PH0_0_0_0, 0x15, 0x00, Rx54E2T, Rx55E2T}, // 266/166
+ {PH3_2_3_3, PH0_0_2_3, PH0_0_0_0, PH2_2_3_2, PH0_0_2_3, PH0_0_0_0, 0x24, 0x00, Rx54E3T, Rx55E3T}, // 266/200
+ {PH2_2_2_2, PH2_2_2_2, PH0_0_0_0, PH2_2_2_2, PH2_2_2_2, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 266/266
+ {PH0_0_0_1, PH0_0_1_1, PH0_0_1_0, PH0_0_0_1, PH0_0_1_1, PH0_0_1_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 266/333
+ },
+// cpu333
+ {
+ {PH0_3_2_2, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E0T, Rx55E0T}, // 333/100
+ {PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54E0T, Rx55E0T}, // 333/133
+ {PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, 0x1f, 0x00, Rx54E1T, Rx55E1T}, // 333/166
+ {PH2_3_2_2, PH0_0_3_2, PH0_0_0_0, PH2_2_2_2, PH0_0_2_2, PH0_0_0_0, 0x1b, 0x00, Rx54E2T, Rx55E2T}, // 333/200
+ {PH2_2_2_2, PH2_2_2_2, PH0_0_0_0, PH2_2_2_1, PH2_2_2_1, PH0_0_0_0, 0x88, 0x00, Rx54E3T, Rx55E3T}, // 333/266
+ {PH2_2_2_2, PH2_2_2_2, PH0_0_2_2, PH2_2_2_2, PH2_2_2_2, PH0_0_2_2, 0x00, 0x00, Rx54E3T, Rx55E3T} // 333/333
+ }
+};
+
+
+static const u8 PT894_64bit_DELAYMD0_RCONV0[6][6][PT894_RDRDY_TBL_Width] =
+// -----------------------------------------------------------------------------------------------------------------
+// RX60 RX61 RX62 RX63 RX64 RX65 RX66 RX67 RX54[3,1] RX55[3,1] CPU/DRAM
+// LN4:1 LN8:5 LN10:9 QW4:1 QW8:5 QW10:9 WS8:1 WS10:9 RFASTH RRRDYH3E
+// RCONV RHTSEL
+// -----------------------------------------------------------------------------------------------------------------
+{
+// cpu100
+ {
+ {PH0_2_2_2, PH0_0_0_0, PH0_0_0_0, PH0_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E3T, Rx55E3T}, // 100/100
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x09, 0x00, Rx54E3T, Rx55E3T}, // 100/133
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/166
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/200
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/266
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 100/333
+ },
+// cpu133
+ {
+ {PH0_2_3_2, PH0_0_0_0, PH0_0_0_0, PH0_0_1_0, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E2T, Rx55E2T}, // 133/100
+ {PH2_2_2_2, PH0_0_0_0, PH0_0_0_0, PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54E3T, Rx55E3T}, // 133/133
+ {PH1_0_0_0, PH0_0_0_1, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E3T, Rx55E3T}, // 133/166
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/200
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/266
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 133/333
+ },
+// cpu200
+ {
+ {PH0_3_3_3, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E0T, Rx55E0T}, // 200/100
+ {PH2_2_2_2, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54E1T, Rx55E1T}, // 200/133
+ {PH3_3_3_3, PH0_0_0_3, PH0_0_0_0, PH1_2_2_1, PH0_0_0_1, PH0_0_0_0, 0x1f, 0x00, Rx54E3T, Rx55E3T}, // 200/166
+ {PH2_2_2_2, PH0_0_2_2, PH0_0_0_0, PH1_1_1_1, PH0_0_1_1, PH0_0_0_0, 0x3f, 0x00, Rx54E3T, Rx55E3T}, // 200/200
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E1T, Rx55E1T}, // 200/266
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 200/333
+// DDR2 Both E3T and E2T Fail, need set to E1T, db PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 00110011b, 00000000b, Rx54E3T, Rx55E3T ;200/266
+ },
+// cpu166
+ {
+ {PH0_2_3_2, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E1T, Rx55E1T}, // 166/100
+ {PH2_2_2_2, PH0_0_0_0, PH0_0_0_0, PH0_0_1_0, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54E2T, Rx55E2T}, // 166/133
+ {PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, PH1_1_1_1, PH0_0_0_1, PH0_0_0_0, 0x1f, 0x00, Rx54E3T, Rx55E3T}, // 166/166
+ {PH1_0_0_1, PH0_0_1_1, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x1e, 0x00, Rx54E3T, Rx55E3T}, // 166/200
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 166/266
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 166/333
+ },
+// cpu266
+ {
+ {PH0_2_2_2, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54L1T, Rx55L1T}, // 266/100
+ {PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54L1T, Rx55L1T}, // 266/133
+ {PH3_2_3_2, PH0_0_0_2, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x1f, 0x00, Rx54E1T, Rx55E1T}, // 266/166
+ {PH3_2_2_3, PH0_0_2_2, PH0_0_0_0, PH1_0_0_1, PH0_0_0_0, PH0_0_0_0, 0x3f, 0x00, Rx54E2T, Rx55E2T}, // 266/200
+ {PH2_2_2_2, PH2_2_2_2, PH0_0_0_0, PH1_1_1_1, PH1_1_1_1, PH0_0_0_0, 0xff, 0x00, Rx54E3T, Rx55E3T}, // 266/266
+ {PH0_0_1_1, PH0_1_1_1, PH0_0_1_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x9c, 0x03, Rx54E3T, Rx55E3T} // 266/333
+ },
+// cpu333
+ {
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54L1T, Rx55L1T}, // 333/100 ;DO NOT Support
+ {PH2_2_2_2, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54L1T, Rx55L1T}, // 333/133
+ {PH3_3_3_3, PH0_0_0_3, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x1f, 0x00, Rx54E0T, Rx55E0T}, // 333/166
+ {PH2_3_3_2, PH0_0_3_3, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x3f, 0x00, Rx54E1T, Rx55E1T}, // 333/200
+ {PH3_3_3_3, PH3_3_3_3, PH0_0_0_0, PH2_1_1_1, PH2_1_1_1, PH0_0_0_0, 0xff, 0x00, Rx54E3T, Rx55E3T}, // 333/266
+ {PH2_2_2_2, PH2_2_2_2, PH0_0_2_2, PH2_2_2_2, PH2_2_2_2, PH0_0_2_2, 0xff, 0x03, Rx54E3T, Rx55E3T} // 333/333
+ }
+};
+
+
+static const u8 PT894_64bit_DELAYMD1_RCONV0[6][6][PT894_RDRDY_TBL_Width] =
+// -----------------------------------------------------------------------------------------------------------------
+// RX60 RX61 RX62 RX63 RX64 RX65 RX66 RX67 RX54[3,1] RX55[3,1] CPU/DRAM
+// LN4:1 LN8:5 LN10:9 QW4:1 QW8:5 QW10:9 WS8:1 WS10:9 RFASTH RRRDYH3E
+// RCONV RHTSEL
+// -----------------------------------------------------------------------------------------------------------------
+{
+// cpu100
+ {
+ {PH0_2_2_2, PH0_0_0_0, PH0_0_0_0, PH0_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E3T, Rx55E3T}, // 100/100
+ {PH1_0_0_1, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x06, 0x00, Rx54E3T, Rx55E3T}, // 100/133
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/166
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 100/200
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // ;100/266
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 100/333
+ },
+// cpu133
+ {
+ {PH0_3_3_3, PH0_0_0_0, PH0_0_0_0, PH0_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E2T, Rx55E2T}, // 133/100
+ {PH2_2_2_2, PH0_0_0_0, PH0_0_0_0, PH1_1_1_1, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54E3T, Rx55E3T}, // 133/133
+ {PH1_0_1_1, PH0_0_0_1, PH0_0_0_0, PH1_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x1c, 0x00, Rx54E3T, Rx55E3T}, // 133/166
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x09, 0x00, Rx54E3T, Rx55E3T}, // 133/200
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 133/266
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 133/333
+ },
+// cpu200
+ {
+ {PH0_2_2_2, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54L1T, Rx55L1T}, // 200/100
+ {PH3_3_3_3, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54E1T, Rx55E1T}, // 200/133
+ {PH2_2_3_3, PH0_0_0_2, PH0_0_0_0, PH1_0_1_1, PH0_0_0_1, PH0_0_0_0, 0x1f, 0x00, Rx54E2T, Rx55E2T}, // 200/166
+ {PH3_3_3_3, PH0_0_3_3, PH0_0_0_0, PH2_2_2_2, PH0_0_2_2, PH0_0_0_0, 0x3f, 0x00, Rx54E3T, Rx55E3T}, // 200/200
+ {PH0_0_1_1, PH0_0_1_1, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0xcc, 0x00, Rx54E3T, Rx55E3T}, // 200/266
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 200/333
+ },
+// cpu166
+ {
+ {PH0_3_3_3, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x07, 0x00, Rx54E1T, Rx55E1T}, // 166/100
+ {PH2_2_3_3, PH0_0_0_0, PH0_0_0_0, PH1_0_1_1, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54E2T, Rx55E2T}, // 166/133
+ {PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, 0x1f, 0x00, Rx54E3T, Rx55E3T}, // 166/166
+ {PH1_1_1_1, PH0_0_1_1, PH0_0_0_0, PH1_0_0_0, PH0_0_0_1, PH0_0_0_0, 0x39, 0x00, Rx54E3T, Rx55E3T}, // 166/200
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T}, // 166/266
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54E3T, Rx55E3T} // 166/333
+ },
+// cpu266
+ {
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54L1T, Rx55L1T}, // 266/100 ;DO NOT Support
+ {PH2_2_2_2, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54L1T, Rx55L1T}, // 266/133
+ {PH2_2_1_2, PH0_0_0_1, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x1f, 0x00, Rx54E0T, Rx55E0T}, // 266/166
+ {PH3_3_3_3, PH0_0_3_3, PH0_0_0_0, PH1_1_1_1, PH0_0_1_1, PH0_0_0_0, 0x3f, 0x00, Rx54E2T, Rx55E2T}, // 266/200
+ {PH3_3_3_3, PH3_3_3_3, PH0_0_0_0, PH2_2_2_2, PH2_2_2_2, PH0_0_0_0, 0xff, 0x00, Rx54E3T, Rx55E3T}, // 266/266
+ {PH1_1_1_1, PH1_1_1_1, PH0_0_1_1, PH0_0_0_1, PH0_0_1_1, PH0_0_1_0, 0x73, 0x02, Rx54E3T, Rx55E3T} // 266/333
+ },
+// cpu333
+ {
+ {PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x00, 0x00, Rx54L1T, Rx55L1T}, // 333/100 ;DO NOT Support
+ {PH3_3_3_3, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x0f, 0x00, Rx54L1T, Rx55L1T}, // 333/133
+ {PH2_2_2_2, PH0_0_0_2, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x1f, 0x00, Rx54L1T, Rx55L1T}, // 333/166
+ {PH2_2_2_2, PH0_0_2_2, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, PH0_0_0_0, 0x3f, 0x00, Rx54E1T, Rx55E1T}, // 333/200
+ {PH2_3_2_2, PH2_3_2_2, PH0_0_0_0, PH0_1_1_0, PH0_1_1_0, PH0_0_0_0, 0xff, 0x00, Rx54E2T, Rx55E2T}, // 333/266
+ {PH3_3_3_3, PH3_3_3_3, PH0_0_3_3, PH2_2_2_2, PH2_2_2_2, PH0_0_2_2, 0xff, 0x03, Rx54E3T, Rx55E3T} // 333/333
+ }
+};
+
+void DRAMDRDYSetting(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data, CL, RDRPH;
+ u8 CpuFreq, DramFreq;
+ u8 ProgData[PT894_RDRDY_TBL_Width];
+ u8 DelayMode;
+ u8 DrdyMode;
+ u8 Index;
+
+ /*
+ this function has 3 switchs, correspond to 3 level of Drdy setting.
+ 0:Slowest, 1:Default, 2:Optimize
+ you can only open one switch
+ */
+#if 1 //this is slowest
+ // 0 -> Slowest
+ //Write slowest value to register
+
+ Data = 0xAA;
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x60, Data);
+
+ Data = 0x0A;
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x61, Data);
+
+ Data = 0x00;
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x62, Data);
+
+ Data = 0xAA;
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x63, Data);
+
+ Data = 0x0A;
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x64, Data);
+
+ Data = 0x00;
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x65, Data);
+
+ Data = 0x00;
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x66, Data);
+
+ Data = 0x00;
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x67, Data);
+
+ Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x54);
+ Data = Data & 0xF5;
+ Data |= 0x08;
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x54, Data);
+
+ //Data=pci_read_config8(PCI_DEV(0,0,2), 0x55);
+ //Data = Data & (~0x20);
+ //pci_write_config8(PCI_DEV(0,0,2), 0x55, Data);
+
+ //enable drdy timing
+ Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x51);
+ Data = Data | 0x80;
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x51, Data);
+#endif
+#if 0 //default
+ {
+ //disable drdy timing
+ Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x51);
+ Data = Data & 0x7F;
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x51, Data);
+ }
+#endif
+#if 0 // 2:Optimize
+ //CL :reg6x[2:0]
+ Data = pci_read_config8(MEMCTRL, 0x62);
+ CL = Data & 0x07;
+
+ //RDRPH: reg7B[6:4]
+ Data = pci_read_config8(MEMCTRL, 0x7B);
+ RDRPH = (Data & 0x70) >> 4;
+
+ //CpuFreq: F2Reg54[7:5]
+ Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x54);
+ CpuFreq = (Data & 0xE0) >> 5;
+
+ //DramFreq:F3Reg90[2:0]
+ Data = pci_read_config8(MEMCTRL, 0x90);
+ DramFreq = Data & 0x07;
+
+ DelayMode = CL + RDRPH; // RDELAYMD = bit0 of (CAS Latency + RDRPH)
+ DelayMode &= 0x01;
+
+ //In 364, there is no 128 bit
+ if (DelayMode == 1) { // DelayMode 1
+ for (Index = 0; Index < PT894_RDRDY_TBL_Width; Index++)
+ ProgData[Index] =
+ PT894_64bit_DELAYMD1_RCONV0[CpuFreq][DramFreq]
+ [Index];
+ } else { // DelayMode 0
+ for (Index = 0; Index < PT894_RDRDY_TBL_Width; Index++)
+ ProgData[Index] =
+ PT894_64bit_DELAYMD0_RCONV0[CpuFreq][DramFreq]
+ [Index];
+ }
+
+ Data = ProgData[0];
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x60, Data);
+
+ Data = ProgData[1];
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x61, Data);
+
+ Data = ProgData[2];
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x62, Data);
+
+ Data = ProgData[3];
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x63, Data);
+
+ Data = ProgData[4];
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x64, Data);
+
+ Data = ProgData[5];
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x65, Data);
+
+ Data = ProgData[6];
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x66, Data);
+
+ Data = ProgData[7];
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x67, Data);
+
+ Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x54);
+ Data = (Data & 0xF5) | ProgData[8];
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x54, Data);
+
+ Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x55);
+ Data = Data & (~0x22) | ProgData[9];
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x62, Data);
+
+ //enable drdy timing
+ Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x51);
+ Data = Data | 0x80;
+ pci_write_config8(PCI_DEV(0, 0, 2), 0x51, Data);
+#endif
+}
+
+
+/*This routine process the ability for North Bridge side burst functionality
+There are 3 variances that are valid:
+ 1. DIMM BL=8, chipset BL=8
+ 2. DIMM BL=4, chipset BL=4
+ 3. DIMM BL=4, chipset BL=8 (only happened on Dual channel)
+ Device 0 function 2 HOST:REG54[4] must be 1 when 128-bit mode.
+Since DIMM will be initialized in each rank individually,
+ 1.If all DIMM BL=4, DIMM will initialize BL=4 first,
+ then check dual_channel flag to enable VIA_NB2HOST_REG54[4].
+ 2.If all DIMM BL=8, DIMM will initialize BL=8 first,
+ then check dual_channel flag for re-initialize DIMM BL=4.
+ also VIA_NB2HOST_REG54[4] need to be enabled.
+Chipset_BL8==>chipset side can set burst length=8
+two register need to set
+ 1. Device 0 function 2 HOST:REG54[4]
+ 2. Device 0 function 3 DRAM:REG6C[3]
+*/
+void DRAMBurstLength(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data, BL;
+ u8 Sockets;
+ /*SPD byte16 bit3,2 describes the burst length supported. bit3=1 support BL=8 bit2=1 support BL=4 */
+ BL = 0x0c;
+ for (Sockets = 0; Sockets < 2; Sockets++) {
+ if (DramAttr->DimmInfo[Sockets].bPresence) {
+ BL &=
+ (DramAttr->DimmInfo[Sockets].
+ SPDDataBuf[SPD_SDRAM_BURSTLENGTH]);
+ }
+ }
+
+ /*D0F3Rx6c bit3 CHA SDRAM effective burst length, for 64bit mode ranks =0 BL=4 ; =1 BL=8 */
+
+ if (BL & 0x08) /*All Assembly support BL=8 */
+ BL = 0x8; /*set bit3 */
+ else
+ BL = 0x00; /*clear bit3 */
+
+ Data = pci_read_config8(MEMCTRL, 0x6c);
+ Data = (u8) ((Data & 0xf7) | BL);
+
+#if ENABLE_CHB
+ if (DramAttr->RankNumChB > 0) {
+ BL = DramAttr->DimmInfo[2].
+ SPDDataBuf[SPD_SDRAM_BURSTLENGTH];
+ //Rx6c[1], CHB burst length
+ if (BL & 0x08) /*CHB support BL=8 */
+ BL = 0x2; /*set bit1 */
+ else
+ BL = 0x00; /*clear bit1 */
+
+ Data = (Data & 0xFD) | BL;
+ }
+#endif
+ pci_write_config8(MEMCTRL, 0x6c, Data);
+}
Copied: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/driving_setting.c (from rev 4313, trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/DrivingSetting.c)
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/driving_setting.c (rev 0)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/driving_setting.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -0,0 +1,396 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2009 One Laptop per Child, Association, Inc.
+ *
+ * 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
+ */
+
+/*
+ Driving setting: ODT/DQS/DQ/CS/MAA/MAB/DCLK
+ */
+
+void DrivingODT(DRAM_SYS_ATTR * DramAttr);
+
+void DrivingDQS(DRAM_SYS_ATTR * DramAttr);
+
+void DrivingDQ(DRAM_SYS_ATTR * DramAttr);
+
+void DrivingCS(DRAM_SYS_ATTR * DramAttr);
+
+void DrivingMA(DRAM_SYS_ATTR * DramAttr);
+
+void DrivingDCLK(DRAM_SYS_ATTR * DramAttr);
+
+/* DRAM Driving Adjustment*/
+void DRAMDriving(DRAM_SYS_ATTR * DramAttr)
+{
+ PRINT_DEBUG_MEM("set ODT!\r");
+ DrivingODT(DramAttr);
+
+ PRINT_DEBUG_MEM("set DQS!\r");
+ DrivingDQS(DramAttr);
+
+ PRINT_DEBUG_MEM(("set DQ!\r"));
+ DrivingDQ(DramAttr);
+
+ PRINT_DEBUG_MEM("set CS!\r");
+ DrivingCS(DramAttr);
+
+ PRINT_DEBUG_MEM("set MAA!\r");
+ DrivingMA(DramAttr);
+
+ PRINT_DEBUG_MEM("set DCLK!\r");
+ DrivingDCLK(DramAttr);
+}
+
+
+/*
+ODT Control for DQ/DQS/CKE/SCMD/DCLKO in ChA & ChB
+which include driving enable/range and strong/weak selection
+
+Processing: According to DRAM frequency to ODT control bits.
+ Because function enable bit must be the last one to be set.
+ So the register VIA_NB3DRAM_REGD4 and VIA_NB3DRAM_REGD3 should be
+ the last register to be programmed.
+*/
+//-------------------------------------------------------------------------------
+// ODT Lookup Table
+//-------------------------------------------------------------------------------
+#define Rank0_ODT 0
+#define Rank1_ODT 1
+#define Rank2_ODT 2
+#define Rank3_ODT 3
+#define NA_ODT 0
+#define NB_ODT_75ohm 0
+#define NB_ODT_150ohm 1
+
+#define DDR2_ODT_75ohm 0x20
+#define DDR2_ODT_150ohm 0x40
+
+// Setting of ODT Lookup TBL
+// RankMAP , Rank 3 Rank 2 Rank 1 Rank 0 , DRAM & NB ODT setting
+// db 0000b , Reserved
+#define ODTLookup_Tbl_count 8
+static const u8 ODTLookup_TBL[ODTLookup_Tbl_count][3] = {
+ // 0001b
+ {0x01,
+ (Rank3_ODT << 6) + (Rank2_ODT << 4) + (Rank1_ODT << 2) +
+ Rank0_ODT, DDR2_ODT_150ohm + NB_ODT_75ohm},
+ // 0010b , Reserved
+ // 0011b
+ {0x03,
+ (Rank3_ODT << 6) + (Rank2_ODT << 4) + (Rank0_ODT << 2) +
+ Rank1_ODT, DDR2_ODT_150ohm + NB_ODT_75ohm},
+ // 0100b
+ {0x04,
+ (Rank3_ODT << 6) + (Rank2_ODT << 4) + (Rank1_ODT << 2) +
+ Rank0_ODT, DDR2_ODT_150ohm + NB_ODT_75ohm},
+ // 0101b
+ {0x05,
+ (Rank3_ODT << 6) + (Rank0_ODT << 4) + (Rank1_ODT << 2) +
+ Rank2_ODT, DDR2_ODT_75ohm + NB_ODT_150ohm},
+ // 0110b , Reserved
+ // 0111b
+ {0x07,
+ (Rank3_ODT << 6) + (Rank0_ODT << 4) + (Rank2_ODT << 2) +
+ Rank2_ODT, DDR2_ODT_75ohm + NB_ODT_150ohm},
+ // 1000b , Reserved
+ // 1001b , Reserved
+ // 1010b , Reserved
+ // 1011b , Reserved
+ // 1100b
+ {0x0c,
+ (Rank2_ODT << 6) + (Rank3_ODT << 4) + (Rank1_ODT << 2) +
+ Rank0_ODT, DDR2_ODT_150ohm + NB_ODT_75ohm},
+ // 1101b
+ {0x0d,
+ (Rank0_ODT << 6) + (Rank0_ODT << 4) + (Rank1_ODT << 2) +
+ Rank2_ODT, DDR2_ODT_75ohm + NB_ODT_150ohm},
+ // 1110b , Reserved
+ // 1111b
+ {0x0f,
+ (Rank0_ODT << 6) + (Rank0_ODT << 4) + (Rank2_ODT << 2) +
+ Rank2_ODT, DDR2_ODT_75ohm + NB_ODT_150ohm}
+};
+
+#define ODT_Table_Width_DDR2 4
+// RxD6 RxD3
+static const u8 ODT_Control_DDR2[ODT_Table_Width_DDR2] = { 0xFC, 0x01 };
+
+void DrivingODT(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ u8 i;
+ BOOLEAN bFound;
+
+ pci_write_config8(MEMCTRL, 0xD0, 0x88);
+
+ Data = ODT_Control_DDR2[0];
+ pci_write_config8(MEMCTRL, 0xd6, Data);
+
+ Data = ODT_Control_DDR2[1];
+ pci_write_config8(MEMCTRL, 0xd3, Data);
+
+ Data = pci_read_config8(MEMCTRL, 0x9e);
+ //set MD turn_around wait state
+ Data &= 0xCF; /*clear bit4,5 */
+ if (DIMMFREQ_400 == DramAttr->DramFreq)
+ Data |= 0x0;
+ else if (DIMMFREQ_533 == DramAttr->DramFreq)
+ Data |= 0x10;
+ else if (DIMMFREQ_667 == DramAttr->DramFreq)
+ Data |= 0x20;
+ else if (DIMMFREQ_800 == DramAttr->DramFreq)
+ Data |= 0x20;
+ else
+ Data |= 0;
+ pci_write_config8(MEMCTRL, 0x9e, Data);
+
+
+ if (DIMMFREQ_400 == DramAttr->DramFreq)
+ Data = 0x0;
+ else if (DIMMFREQ_533 == DramAttr->DramFreq)
+ Data = 0x11;
+ else if (DIMMFREQ_667 == DramAttr->DramFreq)
+ Data = 0x11;
+ else if (DIMMFREQ_800 == DramAttr->DramFreq)
+ Data = 0x11;
+ else
+ Data = 0;
+ pci_write_config8(MEMCTRL, 0x9f, Data);
+
+
+ /*channel A ODT select */
+ if (DramAttr->DimmNumChA > 0) {
+ Data = pci_read_config8(MEMCTRL, 0xd5);
+ Data &= 0x5F; /*clear bit7,5 */
+ if (DramAttr->RankNumChA > 2)
+ Data |= 0xA0; /*if rank number > 2 (3or4), set bit7,5 */
+ else
+ Data |= 0x00; /*if rank number is 1or2, clear bit5 */
+ pci_write_config8(MEMCTRL, 0xd5, Data);
+
+ Data = pci_read_config8(MEMCTRL, 0xd7);
+ Data &= 0xEF; /*clear bit7 */
+ if (DramAttr->RankNumChA > 2)
+ Data |= 0x80; /*if rank number > 2 (3or4), set bit7 */
+ else
+ Data |= 0x00; /*if rank number is 1or2, clear bit7 */
+ pci_write_config8(MEMCTRL, 0xd7, Data);
+
+
+ /*channel A */
+ Data = pci_read_config8(MEMCTRL, 0xd5);
+ Data &= 0xF3; //bit2,3
+ if (DramAttr->DimmNumChA == 2) /*2 Dimm, 3or4 Ranks */
+ Data |= 0x00;
+ else if (DramAttr->DimmNumChA == 1)
+ Data |= 0x04;
+ pci_write_config8(MEMCTRL, 0xd5, Data);
+
+ if ((DramAttr->RankPresentMap & 0x0F) != 0) { /*channel A */
+ // MAA ODT Lookup Table
+ bFound = FALSE;
+ for (i = 0; i < ODTLookup_Tbl_count; i++) {
+ if ((DramAttr->RankPresentMap & 0x0F) ==
+ ODTLookup_TBL[i][0]) {
+ Data = ODTLookup_TBL[i][1];
+ bFound = TRUE;
+ }
+ }
+ if (!bFound) { /*set default value */
+ Data =
+ ODTLookup_TBL[ODTLookup_Tbl_count -
+ 1][1];
+ }
+ pci_write_config8(MEMCTRL, 0x9c, Data);
+
+
+ //set CHA MD ODT control State Dynamic-on
+ Data = pci_read_config8(MEMCTRL, 0xD4);
+ Data &= 0xC9;
+ Data |= 0x30;
+ pci_write_config8(MEMCTRL, 0xD4, Data);
+
+ Data = pci_read_config8(MEMCTRL, 0x9e);
+ Data |= 0x01;
+ pci_write_config8(MEMCTRL, 0x9e, Data);
+ }
+
+ }
+ /*channel B */
+ if (1 == ENABLE_CHC) {
+ //CHB has not auto compensation mode ,so must set it manual,or else CHB initialization will not successful
+ // Data =0x88;
+ //pci_write_config8(MEMCTRL, 0xd0, Data);
+
+ Data = pci_read_config8(MEMCTRL, 0xd5);
+ Data &= 0xAF;
+ if (DramAttr->RankNumChB > 2) /*rank number 3 or 4 */
+ Data |= 0x50;
+ else
+ Data |= 0x00;
+ pci_write_config8(MEMCTRL, 0xd5, Data);
+
+ Data = pci_read_config8(MEMCTRL, 0xd7);
+ Data &= 0xBF; /*clear bit6 */
+ if (DramAttr->RankNumChB > 2)
+ Data |= 0x40; /*if rank number > 2 (3or4), set bit7 */
+ else
+ Data |= 0x00; /*if rank number is 1or2, clear bit7 */
+ pci_write_config8(MEMCTRL, 0xd7, Data);
+
+
+ Data = pci_read_config8(MEMCTRL, 0xd5);
+ Data &= 0xFC;
+ if (DramAttr->DimmNumChB == 2) /*2 Dimm, 3or4 Ranks */
+ Data |= 0x00; // 2 dimm RxD5[2,0]=0,0b
+ else if (DramAttr->DimmNumChB == 1)
+ Data |= 0x01; // 1 dimm RxD5[2,0]=1,1b
+ pci_write_config8(MEMCTRL, 0xd5, Data);
+
+ //set CHB MD ODT control State Dynamic-on
+ Data = pci_read_config8(MEMCTRL, 0xD4);
+ Data &= 0xF6;
+ Data |= 0x08;
+ pci_write_config8(MEMCTRL, 0xD4, Data);
+
+
+ //enable CHB differential DQS input
+ Data = pci_read_config8(MEMCTRL, 0x9E);
+ Data |= 0x02;
+ pci_write_config8(MEMCTRL, 0x9E, Data);
+ }
+ //enable ODT Control
+ Data = pci_read_config8(MEMCTRL, 0x9e);
+ Data |= 0x80;
+ pci_write_config8(MEMCTRL, 0x9e, Data);
+}
+
+void DrivingDQS(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+
+ /*channel A */
+ if (DramAttr->RankNumChA > 0) {
+ Data = DDR2_DQSA_Driving_Table[DramAttr->RankNumChA - 1];
+ pci_write_config8(MEMCTRL, 0xe0, Data);
+ }
+
+ /*channel B */
+ if (1 == ENABLE_CHC) {
+ Data = DDR2_DQSB_Driving_Table[DramAttr->RankNumChB - 1];
+ pci_write_config8(MEMCTRL, 0xe1, Data);
+ }
+
+}
+
+void DrivingDQ(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+
+ /*channel A */
+ if (DramAttr->RankNumChA > 0) {
+ Data = DDR2_DQA_Driving_Table[DramAttr->RankNumChA - 1];
+ pci_write_config8(MEMCTRL, 0xe2, Data);
+
+ }
+ /*channel B */
+ if (1 == ENABLE_CHC) {
+ Data = DDR2_DQB_Driving_Table[DramAttr->RankNumChB - 1];
+ pci_write_config8(MEMCTRL, 0xe3, Data);
+ }
+}
+
+void DrivingCS(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ /*Channel A */
+ if (DramAttr->RankNumChA > 0) {
+ Data = DDR2_CSA_Driving_Table_x8[DramAttr->RankNumChA - 1];
+ pci_write_config8(MEMCTRL, 0xe4, Data);
+ }
+ /*channel B */
+ if (1 == ENABLE_CHC) {
+ Data = DDR2_CSB_Driving_Table_x8[DramAttr->RankNumChB - 1];
+ pci_write_config8(MEMCTRL, 0xe5, Data);
+ }
+}
+
+void DrivingMA(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ u8 i, FreqId;
+
+ if (DramAttr->RankNumChA > 0) {
+ if (DIMMFREQ_400 == DramAttr->DramFreq)
+ FreqId = 1;
+ else if (DIMMFREQ_533 == DramAttr->DramFreq)
+ FreqId = 2;
+ else if (DIMMFREQ_667 == DramAttr->DramFreq)
+ FreqId = 3;
+ else if (DIMMFREQ_800 == DramAttr->DramFreq)
+ FreqId = 4;
+ else
+ FreqId = 1;
+ for (i = 0; i < MA_Table; i++) {
+ if (DramAttr->LoadNumChA <=
+ DDR2_MAA_Driving_Table[i][0]) {
+ Data = DDR2_MAA_Driving_Table[i][FreqId];
+ break;
+ }
+ }
+ pci_write_config8(MEMCTRL, 0xe8, Data);
+ }
+ if (1 == ENABLE_CHC) {
+ for (i = 0; i < MA_Table; i++) {
+ if (DramAttr->LoadNumChA <=
+ DDR2_MAB_Driving_Table[i][0]) {
+ Data = DDR2_MAB_Driving_Table[i][1];
+ break;
+ }
+ }
+ pci_write_config8(MEMCTRL, 0xe9, Data);
+ }
+}
+
+void DrivingDCLK(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ u8 FreqId;
+
+ if (DIMMFREQ_400 == DramAttr->DramFreq)
+ FreqId = 0;
+ else if (DIMMFREQ_533 == DramAttr->DramFreq)
+ FreqId = 1;
+ else if (DIMMFREQ_667 == DramAttr->DramFreq)
+ FreqId = 2;
+ else if (DIMMFREQ_800 == DramAttr->DramFreq)
+ FreqId = 4;
+ else
+ FreqId = 0;
+
+ /*channel A */
+ if (DramAttr->RankNumChA > 0) {
+ Data = DDR2_DCLKA_Driving_Table[FreqId];
+ pci_write_config8(MEMCTRL, 0xe6, Data);
+ }
+ /*channel B */
+ if (1 == ENABLE_CHC) {
+ Data = DDR2_DCLKB_Driving_Table[FreqId];
+ pci_write_config8(MEMCTRL, 0xe7, Data);
+ }
+
+}
Copied: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/final_setting.c (from rev 4313, trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/FinalSetting.c)
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/final_setting.c (rev 0)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/final_setting.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -0,0 +1,129 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2009 One Laptop per Child, Association, Inc.
+ *
+ * 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
+ */
+
+static const u8 RefreshCounter[7][2] = {
+ //Non_256Mbit, 256Mbit
+ {0xCA, 0xA8}, // DRAM400
+ {0xCA, 0xA8}, // DRAM333
+ {0xCA, 0x86}, // DRAM266
+ {0xCA, 0x65}, // DRAM200
+ {0xA8, 0x54}, // DRAM166
+ {0x86, 0x43}, // DRAM133
+ {0x65, 0x32} // DRAM100
+};
+
+void DRAMRefreshCounter(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ u8 Freq = 5, i, Dram_256_Mb;
+ if (DramAttr->DramFreq == DIMMFREQ_800)
+ Freq = 0;
+ else if (DramAttr->DramFreq == DIMMFREQ_667)
+ Freq = 1;
+ else if (DramAttr->DramFreq == DIMMFREQ_533)
+ Freq = 2;
+ else if (DramAttr->DramFreq == DIMMFREQ_400)
+ Freq = 3;
+ else if (DramAttr->DramFreq == DIMMFREQ_333)
+ Freq = 4;
+ else if (DramAttr->DramFreq == DIMMFREQ_266)
+ Freq = 5;
+ else if (DramAttr->DramFreq == DIMMFREQ_200)
+ Freq = 6;
+ else
+ Freq = 6;
+
+ Dram_256_Mb = 0;
+ for (i = 0; i < MAX_SOCKETS; i++) {
+ if (DramAttr->DimmInfo[i].SPDDataBuf[SPD_SDRAM_ROW_ADDR] ==
+ 13) {
+ Dram_256_Mb = 1;
+ break;
+ }
+ }
+
+ Data = RefreshCounter[Freq][Dram_256_Mb];
+
+ pci_write_config8(MEMCTRL, 0x6a, Data);
+}
+
+
+/*===================================================================
+Function : DRAMRegFinalValue()
+Precondition :
+Input :
+ DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
+ in MotherBoard
+Output : Void
+Purpose : Chipset Performance UP and other setting after DRAM Sizing
+ Turn on register directly to promote performance
+===================================================================*/
+
+//--------------------------------------------------------------------------
+// register AND OR
+//--------------------------------------------------------------------------
+#define DRAM_table_item 9
+static const u8 DRAM_table[DRAM_table_item][3] = {
+ {0x60, 0xff, 0xD0},
+ {0x66, 0xcf, 0x80}, // DRAMC queue > 2
+ {0x69, 0xff, 0x07}, // Enable multiple page
+ {0x95, 0x00, 0x0D},
+ {0x96, 0x0F, 0xA0},
+ {0xFB, 0x00, 0x3E},
+ {0xFD, 0x00, 0xA9},
+ {0xFE, 0x00, 0x0f},
+ {0xFF, 0x00, 0x3D}
+};
+
+#define PM_table_item 5
+static const u8 PM_table[PM_table_item][3] = {
+ {0xA0, 0x0F, 0xF0},
+ {0xA1, 0x1F, 0xE0},
+ {0xA2, 0x00, 0xFE},
+ {0xA3, 0x7F, 0x80},
+ {0xA5, 0x7E, 0x81},
+};
+
+void DRAMRegFinalValue(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ u8 i;
+
+ for (i = 0; i < DRAM_table_item; i++) {
+ Data = pci_read_config8(MEMCTRL, DRAM_table[i][0]);
+ Data = (u8) ((Data & DRAM_table[i][1]) | DRAM_table[i][2]);
+ pci_write_config8(MEMCTRL, DRAM_table[i][0], Data);
+ }
+
+ //enable dram By-Rank self refresh
+ Data = pci_read_config8(MEMCTRL, 0x96);
+ Data &= 0xF0;
+ for (i = 0x01; i < 0x10; i = i << 1) {
+ if ((DramAttr->RankPresentMap & i) != 0x00)
+ Data |= i;
+ }
+ pci_write_config8(MEMCTRL, 0x96, Data);
+
+ for (i = 0; i < PM_table_item; i++) {
+ Data = pci_read_config8(PCI_DEV(0, 0, 4), PM_table[i][0]);
+ Data = (u8) ((Data & PM_table[i][1]) | PM_table[i][2]);
+ pci_write_config8(PCI_DEV(0, 0, 4), PM_table[i][0], Data);
+ }
+
+}
Copied: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/freq_setting.c (from rev 4313, trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/FreqSetting.c)
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/freq_setting.c (rev 0)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/freq_setting.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -0,0 +1,235 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2009 One Laptop per Child, Association, Inc.
+ *
+ * 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
+ */
+
+void CalcCLAndFreq(DRAM_SYS_ATTR * DramAttr);
+
+/*
+ Set DRAM Frequency
+*/
+void DRAMFreqSetting(DRAM_SYS_ATTR * DramAttr)
+{
+
+ u8 Data = 0;
+
+ PRINT_DEBUG_MEM("Dram Frequency setting \r");
+
+ //calculate dram frequency using SPD data
+ CalcCLAndFreq(DramAttr);
+
+ //init some Dramc control by Simon Chu slide
+ //Must use "CPU delay" to make sure VLINK is dis-connect
+ Data = pci_read_config8(PCI_DEV(0, 0, 7), 0x47);
+ Data = (u8) (Data | 0x04);
+ pci_write_config8(PCI_DEV(0, 0, 7), 0x47, Data);
+
+ //in order to make sure NB command buffer don`t have pending request(C2P cycle)
+ //CPU DELAY
+ WaitMicroSec(20);
+
+ //Before Set Dram Frequency, we must set 111 by Simon Chu slide.
+ Data = pci_read_config8(MEMCTRL, 0x90);
+ Data = (u8) ((Data & 0xf8) | 7);
+ pci_write_config8(MEMCTRL, 0x90, Data);
+
+ WaitMicroSec(20);
+
+ //Set Dram Frequency.
+ Data = pci_read_config8(MEMCTRL, 0x90);
+ switch (DramAttr->DramFreq) {
+ case DIMMFREQ_400:
+ Data = (u8) ((Data & 0xf8) | 3);
+ break;
+ case DIMMFREQ_533:
+ Data = (u8) ((Data & 0xf8) | 4);
+ break;
+ case DIMMFREQ_667:
+ Data = (u8) ((Data & 0xf8) | 5);
+ break;
+ case DIMMFREQ_800:
+ Data = (u8) ((Data & 0xf8) | 6);
+ break;
+ default:
+ Data = (u8) ((Data & 0xf8) | 1);;
+ }
+ pci_write_config8(MEMCTRL, 0x90, Data);
+
+ //CPU Delay
+ WaitMicroSec(20);
+
+ // Manual reset and adjust DLL when DRAM change frequency
+ Data = pci_read_config8(MEMCTRL, 0x6B);
+ Data = (u8) ((Data & 0x2f) | 0xC0);
+ pci_write_config8(MEMCTRL, 0x6B, Data);
+
+ //CPU Delay
+ WaitMicroSec(20);
+
+ Data = pci_read_config8(MEMCTRL, 0x6B);
+ Data = (u8) (Data | 0x10);
+ pci_write_config8(MEMCTRL, 0x6B, Data);
+
+ //CPU Delay
+ WaitMicroSec(20);
+
+ Data = pci_read_config8(MEMCTRL, 0x6B);
+ Data = (u8) (Data & 0x3f);
+ pci_write_config8(MEMCTRL, 0x6B, Data);
+
+ //disable V_LINK Auto-Disconnect, or else program may stopped at some place and
+ //we cannot find the reason
+ Data = pci_read_config8(PCI_DEV(0, 0, 7), 0x47);
+ Data = (u8) (Data & 0xFB);
+ pci_write_config8(PCI_DEV(0, 0, 7), 0x47, Data);
+
+}
+
+
+/*
+ calculate CL and dram freq
+ DDR1
+ +---+---+---+---+---+---+---+---+
+ | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+ +---+---+---+---+---+---+---+---+
+ |TBD| 4 |3.5| 3 |2.5| 2 |1.5| 1 |
+ +---+---+---+---+---+---+---+---+
+ DDR2
+ +---+---+---+---+---+---+---+---+
+ | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
+ +---+---+---+---+---+---+---+---+
+ |TBD| 6 | 5 | 4 | 3 | 2 |TBD|TBD|
+ +---+---+---+---+---+---+---+---+
+*/
+static const u8 CL_DDR1[7] = { 10, 15, 20, 25, 30, 35, 40 };
+static const u8 CL_DDR2[7] = { 0, 0, 20, 30, 40, 50, 60 };
+
+void CalcCLAndFreq(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 AllDimmSupportedCL, Tmp;
+ u8 CLMask, tmpMask, IndexDelta;
+ u8 SckId, BitId, TmpId;
+ u16 CycTime, TmpCycTime;
+
+ /*1.list the CL value that all DIMM supported */
+ AllDimmSupportedCL = 0xFF;
+ if (RAMTYPE_SDRAMDDR2 == DramAttr->DramType)
+ AllDimmSupportedCL &= 0x7C; /*bit2,3,4,5,6 */
+ else /*DDR1 */
+ AllDimmSupportedCL &= 0x7F; /*bit0,1,2,3,4,5,6 */
+ for (SckId = 0; SckId < MAX_SOCKETS; SckId++) {
+ if (DramAttr->DimmInfo[SckId].bPresence) { /*all DIMM supported CL */
+ AllDimmSupportedCL &=
+ (DramAttr->DimmInfo[SckId].
+ SPDDataBuf[SPD_SDRAM_CAS_LATENCY]);
+ }
+ }
+ if (!AllDimmSupportedCL) { /*if equal 0, no supported CL */
+ PRINT_DEBUG_MEM("SPD Data Error, Can not get CL !!!! \r");
+ for (;;);
+ }
+
+ /*Get CL Value */
+ CLMask = 0x40; /*from Bit6 */
+
+ for (BitId = 7; BitId > 0; BitId--) {
+ if ((AllDimmSupportedCL & CLMask) == CLMask) { /*find the first bit */
+ if (RAMTYPE_SDRAMDDR2 == DramAttr->DramType)
+ DramAttr->CL = CL_DDR2[BitId - 1];
+ else /*DDR1 */
+ DramAttr->CL = CL_DDR1[BitId - 1];
+ break;
+ }
+ CLMask >>= 1;
+ }
+
+ /*according the CL value calculate the cycle time, for X or X-1 or X-2 */
+ CycTime = 0;
+ TmpCycTime = 0;
+
+ for (SckId = 0; SckId < MAX_SOCKETS; SckId++) {
+ if (DramAttr->DimmInfo[SckId].bPresence) {
+ Tmp =
+ (DramAttr->DimmInfo[SckId].
+ SPDDataBuf[SPD_SDRAM_CAS_LATENCY]);
+ tmpMask = 0x40;
+ for (TmpId = 7; TmpId > 0; TmpId--) {
+ if ((Tmp & tmpMask) == tmpMask)
+ break;
+ tmpMask >>= 1;
+ }
+ if (TmpId - BitId == 0) { /*get Cycle time for X, SPD BYTE9 */
+ TmpCycTime =
+ DramAttr->DimmInfo[SckId].
+ SPDDataBuf[SPD_SDRAM_TCLK_X];
+ } else if (TmpId - BitId == 1) { /*get Cycle time for X-1, SPD BYTE23 */
+ TmpCycTime =
+ DramAttr->DimmInfo[SckId].
+ SPDDataBuf[SPD_SDRAM_TCLK_X_1];
+ } else if (TmpId - BitId == 2) { /*get cycle time for X-2, SPD BYTE25 */
+ TmpCycTime =
+ DramAttr->DimmInfo[SckId].
+ SPDDataBuf[SPD_SDRAM_TCLK_X_2];
+ } else {
+ //error!!!
+ }
+ if (TmpCycTime > CycTime) /*get the most cycle time,there is some problem! */
+ CycTime = TmpCycTime;
+ }
+ }
+
+ if (CycTime <= 0) {
+ //error!
+ for (;;);
+ }
+
+ /* cycle time value
+ 0x25-->2.5ns Freq=400 DDR800
+ 0x30-->3.0ns Freq=333 DDR667
+ 0x3D-->3.75ns Freq=266 DDR533
+ 0x50-->5.0ns Freq=200 DDR400
+ 0x60-->6.0ns Freq=166 DDR333
+ 0x75-->7.5ns Freq=133 DDR266
+ 0xA0-->10.0ns Freq=100 DDR200
+ */
+ if (CycTime <= 0x25) {
+ DramAttr->DramFreq = DIMMFREQ_800;
+ DramAttr->DramCyc = 250;
+ } else if (CycTime <= 0x30) {
+ DramAttr->DramFreq = DIMMFREQ_667;
+ DramAttr->DramCyc = 300;
+ } else if (CycTime <= 0x3d) {
+ DramAttr->DramFreq = DIMMFREQ_533;
+ DramAttr->DramCyc = 375;
+ } else if (CycTime <= 0x50) {
+ DramAttr->DramFreq = DIMMFREQ_400;
+ DramAttr->DramCyc = 500;
+ } else if (CycTime <= 0x60) {
+ DramAttr->DramFreq = DIMMFREQ_333;
+ DramAttr->DramCyc = 600;
+ } else if (CycTime <= 0x75) {
+ DramAttr->DramFreq = DIMMFREQ_266;
+ DramAttr->DramCyc = 750;
+ } else if (CycTime <= 0xA0) {
+ DramAttr->DramFreq = DIMMFREQ_200;
+ DramAttr->DramCyc = 1000;
+ }
+ //if set the frequence mannul
+ PRINT_DEBUG_MEM("Dram Frequency:");
+ PRINT_DEBUG_MEM_HEX16(DramAttr->DramFreq);
+ PRINT_DEBUG_MEM(" \r");
+}
Copied: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/rank_map.c (from rev 4313, trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/RankMap.c)
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/rank_map.c (rev 0)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/rank_map.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -0,0 +1,363 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2009 One Laptop per Child, Association, Inc.
+ *
+ * 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
+ */
+
+extern void DRAMSetVRNum(DRAM_SYS_ATTR * DramAttr,
+ u8 PhyRank, u8 VirRank, BOOLEAN Enable);
+
+extern void SetEndingAddr(DRAM_SYS_ATTR * DramAttr, u8 VirRank, // Ending address register number indicator (INDEX
+ INT8 Value); // (value) add or subtract value to this and after banks
+
+
+void DRAMClearEndingAddress(DRAM_SYS_ATTR * DramAttr);
+
+void DRAMSizingEachRank(DRAM_SYS_ATTR * DramAttr);
+
+BOOLEAN DoDynamicSizing1XM(DRAM_SYS_ATTR * DramAttr,
+ u8 * nRA, u8 * nCA, u8 * nBS, u8 PhyRank);
+
+void DRAMSetRankMAType(DRAM_SYS_ATTR * DramAttr);
+
+void DRAMSetEndingAddress(DRAM_SYS_ATTR * DramAttr);
+
+void DRAMPRToVRMapping(DRAM_SYS_ATTR * DramAttr);
+
+/*===================================================================
+Function : DRAMBankInterleave()
+Precondition :
+Input :
+ DramAttr: pointer point to DRAMSYSATTR which consist the DDR and Dimm information in MotherBoard
+Output : Void
+Purpose : STEP 13 Set Bank Interleave VIANB3DRAMREG69[7:6] 00:No Interleave 01:2 Bank 10:4 Bank 11:8 Bank
+ Scan all DIMMs on board to find out the lowest Bank Interleave among these DIMMs and set register.
+===================================================================*/
+void DRAMBankInterleave(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data, SpdBAData;
+ DIMM_INFO *CurrentDimminfo;
+ u8 Bank = 3, Shift, RankNO, Count;
+ Shift = 1;
+ for (RankNO = 0; RankNO < 4; RankNO += 2) //all_even 0 RankNO 4 6
+ {
+ if ((DramAttr->RankPresentMap & Shift) != 0) {
+ CurrentDimminfo = &(DramAttr->DimmInfo[RankNO >> 1]); //this Rank in a dimm
+ SpdBAData =
+ (u8) (CurrentDimminfo->
+ SPDDataBuf[SPD_SDRAM_NO_OF_BANKS]);
+ if (SpdBAData == 4)
+ Count = 2;
+ else if (SpdBAData == 8)
+ Count = 3;
+ else
+ Count = 0;
+ if (Count < Bank)
+ Bank = Count;
+ }
+ Shift <<= 2;
+ }
+
+ Data = pci_read_config8(MEMCTRL, 0x69);
+ Data &= ~0xc0;
+ Data |= (Bank << 6);
+ pci_write_config8(MEMCTRL, 0x69, Data);
+
+
+ if (DramAttr->DimmNumChB > 0) {
+ CurrentDimminfo = &(DramAttr->DimmInfo[3]); //this Rank in a dimm
+ SpdBAData =
+ (u8) (CurrentDimminfo->
+ SPDDataBuf[SPD_SDRAM_NO_OF_BANKS]);
+ if (SpdBAData == 4)
+ Bank = 2;
+ else if (SpdBAData == 2)
+ Bank = 1;
+ else
+ Bank = 0;
+ pci_write_config8(MEMCTRL, 0x87, Bank);
+ }
+}
+
+/*===================================================================
+Function : DRAMSizingMATypeM()
+Precondition :
+Input :
+ DramAttr: pointer point to DRAMSYSATTR which consist the DDR and Dimm information in MotherBoard
+Output : Void
+ Purpose : STEP 14 1 DRAM Sizing 2 Fill MA type 3 Prank to vrankMapping
+===================================================================*/
+void DRAMSizingMATypeM(DRAM_SYS_ATTR * DramAttr)
+{
+ DRAMClearEndingAddress(DramAttr);
+ DRAMSizingEachRank(DramAttr);
+ //DRAMReInitDIMMBL (DramAttr);
+ DRAMSetRankMAType(DramAttr);
+ DRAMSetEndingAddress(DramAttr);
+ DRAMPRToVRMapping(DramAttr);
+}
+
+/*===================================================================
+Function : DRAMClearEndingAddress()
+Precondition :
+Input :
+ DramAttr: pointer point to DRAMSYSATTR which consist the DDR and Dimm information in MotherBoard
+Output : Void
+Purpose : clear Ending and Start adress from 0x40-4f to zero
+===================================================================*/
+void DRAMClearEndingAddress(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data, Reg;
+ Data = 0;
+ for (Reg = 0x40; Reg <= 0x4f; Reg++) {
+ pci_write_config8(MEMCTRL, Reg, Data);
+ }
+}
+
+/*===================================================================
+Function : DRAMSizingEachRank()
+Precondition :
+Input :
+ DramAttr: pointer point to DRAMSYSATTR which consist the DDR and Dimm information in MotherBoard
+Output : Void
+Purpose : Sizing each Rank invidually, by number of rows column banks pins, be care about 128bit
+===================================================================*/
+void DRAMSizingEachRank(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Slot, RankIndex, Rows, Columns, Banks;
+ u32 Size;
+ BOOLEAN HasThreeBitBA;
+ u8 Data;
+ u32 Address;
+
+ HasThreeBitBA = FALSE;
+ for (Slot = 0; Slot < 2; Slot++) {
+ if (!DramAttr->DimmInfo[Slot].bPresence)
+ continue;
+ Rows =
+ DramAttr->DimmInfo[Slot].
+ SPDDataBuf[SPD_SDRAM_ROW_ADDR];
+ Columns =
+ DramAttr->DimmInfo[Slot].
+ SPDDataBuf[SPD_SDRAM_COL_ADDR];
+ Banks = DramAttr->DimmInfo[Slot].SPDDataBuf[SPD_SDRAM_NO_OF_BANKS]; //this is Bank number not Bank address bit
+ if (Banks == 4)
+ Banks = 2;
+ else if (Banks == 8)
+ Banks = 3;
+ else
+ Banks = 0;
+ Size = (u32) (1 << (Rows + Columns + Banks + 3));
+ RankIndex = 2 * Slot;
+ DramAttr->RankSize[RankIndex] = Size;
+ //if this module have two ranks
+ if ((DramAttr->DimmInfo[Slot].
+ SPDDataBuf[SPD_SDRAM_DIMM_RANKS] & 0x07) == 0x01) {
+ RankIndex++;
+ DramAttr->RankSize[RankIndex] = Size;
+ }
+
+ PRINT_DEBUG_MEM("rows: ");
+ PRINT_DEBUG_MEM_HEX8(Rows);
+ PRINT_DEBUG_MEM(", columns:");
+ PRINT_DEBUG_MEM_HEX8(Columns);
+ PRINT_DEBUG_MEM(", banks:");
+ PRINT_DEBUG_MEM_HEX8(Banks);
+ PRINT_DEBUG_MEM("\r");
+
+ if (Banks == 3)
+ HasThreeBitBA = TRUE;
+ }
+
+ //must set BA2 enable if any 8-bank device exists
+ if (HasThreeBitBA) {
+ Data = pci_read_config8(MEMCTRL, 0x53);
+ Data |= 0x80;
+ pci_write_config8(MEMCTRL, 0x53, Data);
+ }
+#if 1
+ for (RankIndex = 0; DramAttr->RankSize[RankIndex] != 0;
+ RankIndex++) {
+ PRINT_DEBUG_MEM("Rank:");
+ PRINT_DEBUG_MEM_HEX8(RankIndex);
+ PRINT_DEBUG_MEM(", Size:");
+ PRINT_DEBUG_MEM_HEX32(DramAttr->RankSize[RankIndex] >> 20);
+ PRINT_DEBUG_MEM("\r");
+ }
+#endif
+}
+
+/*===================================================================
+Function : DRAMSetRankMAType()
+Precondition :
+Input :
+ DramAttr: pointer point to DRAMSYSATTR which consist the DDR and Dimm information in MotherBoard
+Output : Void
+Purpose : set the matype Reg by MAMapTypeTbl, which the rule can be found in memoryinit
+===================================================================*/
+void DRAMSetRankMAType(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 SlotNum, Data, j, Reg, or, and;
+ u8 ShiftBits[] = { 5, 1, 5, 1 }; /* Rank 0/1 MA Map Type is 7:5, Rank 2/3 MA Map Type is 3:1. See Fun3Rx50. */
+ u8 MAMapTypeTbl[] = { /* Table 12 of P4M800 Pro DataSheet. */
+ 2, 9, 0, /* Bank Address Bits, Column Address Bits, Rank MA Map Type */
+ 2, 10, 1,
+ 2, 11, 2,
+ 2, 12, 3,
+ 3, 10, 5,
+ 3, 11, 6,
+ 3, 12, 7,
+ 0, 0, 0
+ };
+ Data = pci_read_config8(MEMCTRL, 0x50);
+ Data &= 0x1;
+ pci_write_config8(MEMCTRL, 0x50, Data);
+ // disable MA32/16 MA33/17 swap in memory init it has this Reg fill
+ Data = pci_read_config8(MEMCTRL, 0x6b);
+ Data &= ~0x08;
+ pci_write_config8(MEMCTRL, 0x6b, Data);
+
+ Data = 0x00;
+ for (SlotNum = 0; SlotNum < MAX_DIMMS; SlotNum++) {
+ if (DramAttr->DimmInfo[SlotNum].bPresence) {
+ for (j = 0; MAMapTypeTbl[j] != 0; j += 3) {
+ if ((1 << MAMapTypeTbl[j]) ==
+ DramAttr->DimmInfo[SlotNum].
+ SPDDataBuf[SPD_SDRAM_NO_OF_BANKS]
+ && MAMapTypeTbl[j + 1] ==
+ DramAttr->DimmInfo[SlotNum].
+ SPDDataBuf[SPD_SDRAM_COL_ADDR]) {
+ break;
+ }
+ }
+ if (0 == MAMapTypeTbl[j]) {
+ PRINT_DEBUG_MEM
+ ("UNSUPPORTED Bank, Row and Column Addr Bits!\r");
+ return;
+ }
+ or = MAMapTypeTbl[j + 2] << ShiftBits[SlotNum];
+ if (DramAttr->CmdRate == 1)
+ or |= 0x01 << (ShiftBits[SlotNum] - 1);
+
+ Reg = SlotNum / 2;
+ if ((SlotNum & 0x01) == 0x01) {
+ and = 0xf1; // BUGBUG: it should be 0xf0
+ } else {
+ and = 0x1f; // BUGBUG: it should be 0x0f
+ }
+ Data = pci_read_config8(MEMCTRL, 0x50 + Reg);
+ Data &= and;
+ Data |= or;
+ pci_write_config8(MEMCTRL, 0x50 + Reg, Data);
+ }
+ }
+ //may have some Reg filling at add 3-52 11 and 3-53 in his function
+}
+
+/*===================================================================
+Function : DRAMSetEndingAddress()
+Precondition :
+Input :
+ DramAttr: pointer point to DRAMSYSATTR which consist the DDR and Dimm information in MotherBoard
+Output : Void
+Purpose : realize the Vrank 40...Reg (Start and Ending Regs). Vrank have same order with phy Rank, Size is actual Size
+===================================================================*/
+void DRAMSetEndingAddress(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Shift = 1, Data, RankNO, Size, Start = 0, End = 0, Vrank;
+ for (RankNO = 0; RankNO < 4; RankNO++) {
+ if ((DramAttr->RankPresentMap & Shift) != 0) {
+ Size = (u8) (DramAttr->RankSize[RankNO] >> 26); // current Size in the unit of 64M
+ if (Size != 0) {
+
+ End = End + Size; // calculate current ending address, add the current Size to ending
+ Vrank = RankNO; // get virtual Rank
+ Data = End; // set begin/End address register to correspondig virtual Rank #
+ pci_write_config8(MEMCTRL, 0x40 + Vrank,
+ Data);
+ Data = Start;
+ pci_write_config8(MEMCTRL, 0x48 + Vrank,
+ Data);
+ PRINT_DEBUG_MEM("Rank: ");
+ PRINT_DEBUG_MEM_HEX8(Vrank);
+ PRINT_DEBUG_MEM(", Start:");
+ PRINT_DEBUG_MEM_HEX8(Start);
+ PRINT_DEBUG_MEM(", End:");
+ PRINT_DEBUG_MEM_HEX8(End);
+ PRINT_DEBUG_MEM("\r");
+
+ Start = End;
+ }
+ }
+ Shift <<= 1;
+ }
+
+ if (DramAttr->RankNumChB > 0) {
+ //this is a bug,fixed is to 2,so the max LL size is 128M
+ Data = 0x02;
+ pci_write_config8(MEMCTRL, 0x44, Data);
+ }
+ Data = End * 4;
+ pci_write_config8(PCI_DEV(0, 17, 7), 0x60, Data);
+ // We should directly write to south Bridge, not in north bridge
+ // program LOW TOP Address
+ Data = pci_read_config8(MEMCTRL, 0x88);
+ pci_write_config8(MEMCTRL, 0x85, Data);
+
+ // also program vlink mirror
+ // We should directly write to south Bridge, not in north bridge
+ pci_write_config8(PCI_DEV(0, 17, 7), 0xe5, Data);
+}
+
+/*===================================================================
+Function : DRAMPRToVRMapping()
+Precondition :
+Input :
+ DramAttr: pointer point to DRAMSYSATTR which consist the DDR and Dimm information in MotherBoard
+Output : Void
+Purpose : set the Vrank-prank map with the same order
+===================================================================*/
+void DRAMPRToVRMapping(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Shift, Data, and, or, DimmNO = 0, PhyRankNO, Reg;
+
+ for (Reg = 0x54; Reg <= 0x57; Reg++) //clear the map-reg
+ {
+ Data = 0;
+ pci_write_config8(MEMCTRL, Reg, Data);
+ }
+
+ Shift = 1;
+ for (PhyRankNO = 0; PhyRankNO < MAX_RANKS; PhyRankNO++) {
+ if ((DramAttr->RankPresentMap & Shift) != 0) {
+ or = PhyRankNO; // get virtual Rank ,same with PhyRank
+ or |= 0x08;
+
+ if ((PhyRankNO & 0x01) == 0x01) // get mask for register
+ and = 0xf0;
+ else {
+ and = 0x0f;
+ or <<= 4;
+ }
+ DimmNO = (PhyRankNO >> 1);
+ Data = pci_read_config8(MEMCTRL, 0x54 + DimmNO);
+ Data &= and;
+ Data |= or;
+ pci_write_config8(MEMCTRL, 0x54 + DimmNO, Data);
+ }
+ Shift <<= 1;
+ }
+}
Copied: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/timing_setting.c (from rev 4313, trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/TimingSetting.c)
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/timing_setting.c (rev 0)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/timing_setting.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -0,0 +1,492 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2009 One Laptop per Child, Association, Inc.
+ *
+ * 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
+ */
+
+ /*
+ Set Dram Timing functions
+ */
+
+void SetCL(DRAM_SYS_ATTR * DramAttr);
+
+void SetTrp(DRAM_SYS_ATTR * DramAttr);
+
+void SetTrcd(DRAM_SYS_ATTR * DramAttr);
+
+void SetTras(DRAM_SYS_ATTR * DramAttr);
+
+void SetTrfc(DRAM_SYS_ATTR * DramAttr);
+
+void SetTrrd(DRAM_SYS_ATTR * DramAttr);
+
+void SetTwr(DRAM_SYS_ATTR * DramAttr);
+
+void SetTwtr(DRAM_SYS_ATTR * DramAttr);
+
+void SetTrtp(DRAM_SYS_ATTR * DramAttr);
+
+/* Set DRAM Timing*/
+void DRAMTimingSetting(DRAM_SYS_ATTR * DramAttr)
+{
+ PRINT_DEBUG_MEM("Set CAS latency value!");
+ SetCL(DramAttr);
+
+ PRINT_DEBUG_MEM("Set tRP value!");
+ SetTrp(DramAttr);
+
+ PRINT_DEBUG_MEM("Set tRCD value!");
+ SetTrcd(DramAttr);
+
+ PRINT_DEBUG_MEM("Set tRAS value!");
+ SetTras(DramAttr);
+
+ PRINT_DEBUG_MEM("Set tRFC value!");
+ SetTrfc(DramAttr);
+
+ PRINT_DEBUG_MEM("Set tRRD value!");
+ SetTrrd(DramAttr);
+
+ PRINT_DEBUG_MEM("Set tWR value!");
+ SetTwr(DramAttr);
+
+ PRINT_DEBUG_MEM("Set tWTR value!");
+ SetTwtr(DramAttr);
+
+ PRINT_DEBUG_MEM("Set tRTP value!");
+ SetTrtp(DramAttr);
+}
+
+
+/*
+Set DRAM Timing: CAS Latency for DDR1
+D0F3RX62 bit[0:2] for CAS Latency;
+*/
+void SetCL(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ u8 CL;
+
+ /*DDR2 CL Value: 20, 30, 40, 50 -> 2, 3, 4, 5 */
+ CL = (u8) ((DramAttr->CL - 20) / 10); //000,001,010,011
+
+ PRINT_DEBUG_MEM("CAS = ");
+ PRINT_DEBUG_MEM_HEX8(CL);
+ PRINT_DEBUG_MEM("\n");
+ Data = pci_read_config8(MEMCTRL, 0x62);
+ Data = (u8) ((Data & 0xf8) | CL);
+ pci_write_config8(MEMCTRL, 0x62, Data);
+}
+
+
+/*
+ Minimum row precharge time, Trp for DDR1/DDR2
+ D0F3Rx64[3:2] for Trp 2T~5T
+*/
+#define MAX_TRP 6
+#define MIN_TRP 2
+
+void SetTrp(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ u16 Max, Tmp;
+ u8 Socket;
+
+
+ /*get the max Trp value from SPD data
+ SPD Byte27, Bit7:2->1ns~63ns, Bit1:0->0ns, 0.25ns, 0.50ns, 0.75ns */
+ Max = 0;
+ for (Socket = 0; Socket < MAX_SOCKETS; Socket++) {
+ if (DramAttr->DimmInfo[Socket].bPresence) {
+ Tmp =
+ (u16) (DramAttr->DimmInfo[Socket].
+ SPDDataBuf[SPD_SDRAM_TRP]);
+ if (Tmp > Max)
+ Max = Tmp;
+ }
+ /*Calculate clock,this value should be 2T,3T,4T,5T */
+ }
+ Tmp =
+ (u16) ((Max * 100 + ((DramAttr->DramCyc) << 2) -
+ 1) / ((DramAttr->DramCyc) << 2));
+ PRINT_DEBUG_MEM("Trp = ");
+ PRINT_DEBUG_MEM_HEX16(Tmp);
+ PRINT_DEBUG_MEM("\r");
+
+ if (Tmp > MAX_TRP)
+ Tmp = MAX_TRP;
+ else if (Tmp < MIN_TRP)
+ Tmp = MIN_TRP;
+
+ Tmp -= 2; //00->2T, 01->3T, 10->4T, 11->5T
+ Tmp <<= 1; //bit1,2,3
+
+ Data = pci_read_config8(MEMCTRL, 0x64);
+ Data = (u8) ((Data & 0xf1) | (u8) Tmp);
+ pci_write_config8(MEMCTRL, 0x64, Data);
+
+ //enable DDR2 8-Bank Device Timing Constraint
+ Data = pci_read_config8(MEMCTRL, 0x62);
+ Data = (u8) ((Data & 0xf7) | 0x08);
+ pci_write_config8(MEMCTRL, 0x62, Data);
+}
+
+
+/*
+Minimum RAS to CAS dely,Trcd for DDR1/DDR2
+D0F3Rx64[7:6] for Trcd
+*/
+#define MAX_TRCD 6
+#define MIN_TRCD 2
+
+void SetTrcd(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ u16 Max, Tmp;
+ u8 Socket;
+
+
+ /*get the max Trcd value from SPD data
+ SPD Byte29, Bit7:2->1ns~63ns, Bit1:0->0ns, 0.25ns, 0.50ns, 0.75ns */
+ Max = 0;
+ for (Socket = 0; Socket < MAX_SOCKETS; Socket++) {
+ if (DramAttr->DimmInfo[Socket].bPresence) {
+ Tmp =
+ (u16) (DramAttr->DimmInfo[Socket].
+ SPDDataBuf[SPD_SDRAM_TRCD]);
+ if (Tmp > Max)
+ Max = Tmp;
+ }
+ }
+ /*Calculate clock,this value should be 2T,3T,4T,5T */
+ Tmp =
+ (u16) ((Max * 100 + ((DramAttr->DramCyc) << 2) -
+ 1) / ((DramAttr->DramCyc) << 2));
+ PRINT_DEBUG_MEM("Trcd =");
+ PRINT_DEBUG_MEM_HEX16(Tmp);
+ PRINT_DEBUG_MEM("\r");
+
+ if (Tmp > MAX_TRCD)
+ Tmp = MAX_TRCD;
+ else if (Tmp < MIN_TRCD)
+ Tmp = MIN_TRCD;
+ Tmp -= 2; //00->2T, 01->3T, 10->4T, 11->5T
+ Tmp <<= 5; //bit5,6,7
+
+ Data = pci_read_config8(MEMCTRL, 0x64);
+ Data = (u8) ((Data & 0x1f) | (u8) Tmp);
+ pci_write_config8(MEMCTRL, 0x64, Data);
+
+}
+
+/*
+ minimum active to precharge time,Tras for DDR1/DDR2
+ D0F3Rx62[7:4] Tras
+*/
+#define MAX_TRAS 20 //20T
+#define MIN_TRAS 5 //5T
+void SetTras(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ u16 Max, Tmp;
+ u8 Socket;
+
+
+ /*get the max Tras value from SPD data
+ SPD byte30: bit0:7 1ns~255ns */
+ Max = 0;
+ for (Socket = 0; Socket < MAX_SOCKETS; Socket++) {
+ if (DramAttr->DimmInfo[Socket].bPresence) {
+ Tmp =
+ (u16) (DramAttr->DimmInfo[Socket].
+ SPDDataBuf[SPD_SDRAM_TRAS]);
+ if (Tmp > Max)
+ Max = Tmp;
+ }
+ }
+
+ /*Calculate clock,value range 5T-20T */
+ Tmp =
+ (u16) ((Max * 100 + DramAttr->DramCyc -
+ 1) / (DramAttr->DramCyc));
+ PRINT_DEBUG_MEM("Tras =");
+ PRINT_DEBUG_MEM_HEX16(Tmp);
+ PRINT_DEBUG_MEM("\r");
+
+ if (Tmp > MAX_TRAS)
+ Tmp = MAX_TRAS;
+ else if (Tmp < MIN_TRAS)
+ Tmp = MIN_TRAS;
+ Tmp -= 5; //0->5T ... 1111->20T
+ Tmp <<= 4; //bit4:7
+
+ Data = pci_read_config8(MEMCTRL, 0x62);
+ Data = (u8) ((Data & 0x0f) | (u8) Tmp);
+ pci_write_config8(MEMCTRL, 0x62, Data);
+}
+
+/*
+Minimum refresh to activate/refresh command period Trfc for DDR1/DDR2
+D0F3Rx61[5:0] for Trfc
+*/
+
+#define MAX_TRFC 71 // Max supported,71T
+#define MIN_TRFC 8 // Min supported,8T
+
+void SetTrfc(DRAM_SYS_ATTR * DramAttr)
+{
+
+ u8 Data;
+ u32 Max, Tmp;
+ u8 Byte40;
+ u8 Socket;
+
+ /*get the max Trfc value from SPD data */
+ Max = 0;
+ for (Socket = 0; Socket < MAX_SOCKETS; Socket++) {
+ if (DramAttr->DimmInfo[Socket].bPresence) {
+ Tmp =
+ (u32) (DramAttr->DimmInfo[Socket].
+ SPDDataBuf[SPD_SDRAM_TRFC]) * 100;
+ /*only DDR2 need to add byte 40 bit[7:4] */
+ Byte40 =
+ (DramAttr->DimmInfo[Socket].
+ SPDDataBuf[SPD_SDRAM_TRFC2]);
+ /*if bit0 = 1, byte42(RFC)+256ns, SPD spec JEDEC standard No.21.c */
+ if (Byte40 & 0x01)
+ Tmp += (256 * 100);
+ /*bit1,2,3 000->0ns+byte42; 001->0.25ns+byte42; 010->0.33ns+byte42; 011->0.5ns+byte42;100-> 0.75ns+byte42 */
+ switch ((Byte40 >> 1) & 0x07) { /*bit1,2,3 */
+ case 1:
+ Tmp += 25;
+ break;
+ case 2:
+ Tmp += 33;
+ break;
+ case 3:
+ Tmp += 50;
+ break;
+ case 4:
+ Tmp += 66;
+ break;
+ case 5:
+ Tmp += 75;
+ break;
+ case 6: //what is FRU???
+ default:
+ break;
+ }
+ if (Tmp > Max)
+ Max = Tmp;
+ }
+ }
+
+ /*Calculate clock,value range 8T-71T */
+ Tmp = (u16) ((Max + DramAttr->DramCyc - 1) / (DramAttr->DramCyc));
+ PRINT_DEBUG_MEM("Trfc = ");
+ PRINT_DEBUG_MEM_HEX16(Tmp);
+ PRINT_DEBUG_MEM("\r");
+ if (Tmp > MAX_TRFC)
+ Tmp = MAX_TRFC;
+ else if (Tmp < MIN_TRFC) {
+ // return;
+ Tmp = 0x40;
+ }
+ /*D0F3Rx61 bit[0:5] 0->8T ... 63->71T */
+ Tmp -= 8;
+
+ Data = pci_read_config8(MEMCTRL, 0x61);
+ Data = (u8) ((Data & 0xc0) | ((u8) Tmp & 0x3f));
+ pci_write_config8(MEMCTRL, 0x61, Data);
+}
+
+
+/*
+Minimum row active to row active delay: Trrd for DDR1/DDR2
+D0F3Rx61[7:6]:Trrd 00->2T, 01->3T, 10->4T, 11->5T
+*/
+#define MAX_TRRD 5
+#define MIN_TRRD 2
+
+void SetTrrd(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ u16 Max, Tmp;
+ u8 Socket;
+
+
+ /*get the max Trrd value from SPD data
+ SPD Byte28, Bit7:2->1ns~63ns, Bit1:0->0ns, 0.25ns, 0.50ns, 0.75ns */
+ Max = 0;
+ for (Socket = 0; Socket < MAX_SOCKETS; Socket++) {
+ if (DramAttr->DimmInfo[Socket].bPresence) {
+ Tmp =
+ (u16) (DramAttr->DimmInfo[Socket].
+ SPDDataBuf[SPD_SDRAM_TRRD]);
+ if (Tmp > Max)
+ Max = Tmp;
+ }
+ }
+
+ /*Calculate clock,this value should be 2T,3T,4T,5T */
+ Tmp =
+ (u16) ((Max * 100 + ((DramAttr->DramCyc) << 2) -
+ 1) / ((DramAttr->DramCyc) << 2));
+ PRINT_DEBUG_MEM("Trrd =");
+ PRINT_DEBUG_MEM_HEX16(Tmp);
+ PRINT_DEBUG_MEM("\r");
+
+ if (Tmp > MAX_TRRD)
+ Tmp = MAX_TRRD;
+ else if (Tmp < MIN_TRRD)
+ Tmp = MIN_TRRD;
+ Tmp -= 2; //00->2T, 01->3T, 10->4T, 11->5T
+ Tmp <<= 6;
+
+ Data = pci_read_config8(MEMCTRL, 0x61);
+ Data = (u8) ((Data & 0x3f) | (u8) Tmp);
+ pci_write_config8(MEMCTRL, 0x61, Data);
+}
+
+
+/*
+Write recovery time: Twr for DDR1/DDR2
+Device 0 Function 3:REG63[7:5]:Twr 00->2T 01->3T 10->4T 11->5T
+*/
+#define MAX_TWR 6
+#define MIN_TWR 2
+
+void SetTwr(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ u16 Max, Tmp;
+ u8 Socket;
+
+ /*get the max Trtp value from SPD data
+ SPD Byte36, Bit7:2->1ns~63ns, Bit1:0->0ns, 0.25ns, 0.50ns, 0.75ns */
+ Max = 0;
+ for (Socket = 0; Socket < MAX_SOCKETS; Socket++) {
+ if (DramAttr->DimmInfo[Socket].bPresence) {
+ Tmp =
+ (u16) (DramAttr->DimmInfo[Socket].
+ SPDDataBuf[SPD_SDRAM_TWR]);
+ if (Tmp > Max)
+ Max = Tmp;
+ }
+ }
+ /*Calculate clock */
+ Tmp = (u16) ((Max * 100 + ((DramAttr->DramCyc) << 2) - 1) / ((DramAttr->DramCyc) << 2)); //this value should be 2T,3T,4T,5T
+ PRINT_DEBUG_MEM("Twr = ");
+ PRINT_DEBUG_MEM_HEX16(Tmp);
+ PRINT_DEBUG_MEM("\r");
+
+ if (Tmp > MAX_TWR)
+ Tmp = MAX_TWR;
+ else if (Tmp < MIN_TWR)
+ Tmp = MIN_TWR;
+ Tmp -= 2; //00->2T, 01->3T, 10->4T, 11->5T
+ Tmp <<= 5;
+
+ Data = pci_read_config8(MEMCTRL, 0x63);
+ Data = (u8) ((Data & 0x1f) | (u8) Tmp);
+ pci_write_config8(MEMCTRL, 0x63, Data);
+}
+
+
+/*
+Internal write to read command delay: Twtr for DDR1/DDR2
+Device 0 Function 3:REG63[1,0]:Twtr DDR: 1T or 2T; DDR2 2T or 3T
+*/
+#define MAX_TWTR 5 //5T
+#define MIN_TWTR 2 //2T
+
+void SetTwtr(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ u16 Max, Tmp;
+ u8 Socket;
+
+ /*get the max Trtp value from SPD data
+ SPD Byte37, Bit7:2->1ns~63ns, Bit1:0->0ns, 0.25ns, 0.50ns, 0.75ns */
+ Max = 0;
+ for (Socket = 0; Socket < MAX_SOCKETS; Socket++) {
+ if (DramAttr->DimmInfo[Socket].bPresence) {
+ Tmp =
+ (u16) (DramAttr->DimmInfo[Socket].
+ SPDDataBuf[SPD_SDRAM_TWTR]);
+ if (Tmp > Max)
+ Max = Tmp;
+ }
+ }
+ /*Calculate clock */
+ Tmp = (u16) ((Max * 100 + ((DramAttr->DramCyc) << 2) - 1) / ((DramAttr->DramCyc) << 2)); //this value should be 2T or 3T
+
+ PRINT_DEBUG_MEM("Twtr =");
+ PRINT_DEBUG_MEM_HEX16(Tmp);
+ PRINT_DEBUG_MEM("\r");
+
+ if (Tmp > MAX_TWR)
+ Tmp = MAX_TWTR;
+ else if (Tmp < MIN_TWR)
+ Tmp = MIN_TWTR;
+ Tmp -= 2; //00->2T, 01->3T, 10->4T, 11->5T
+ Data = pci_read_config8(MEMCTRL, 0x63);
+ Data = (u8) ((Data & 0xFC) | Tmp);
+ pci_write_config8(MEMCTRL, 0x63, Data);
+}
+
+
+/*
+Internal read to precharge command delay, Trtp for DDR1/DDR2
+Device 0 Function 3:REG63[3]:Trtp 2T or 3T
+*/
+#define MAX_TRTP 3 //3T
+#define MIN_TRTP 2 //2T
+
+void SetTrtp(DRAM_SYS_ATTR * DramAttr)
+{
+ u8 Data;
+ u16 Max, Tmp;
+ u8 Socket;
+
+
+ /*get the max Trtp value from SPD data
+ SPD Byte38, Bit7:2->1ns~63ns, Bit1:0->0ns, 0.25ns, 0.50ns, 0.75ns */
+ Max = 0;
+ for (Socket = 0; Socket < MAX_SOCKETS; Socket++) {
+ if (DramAttr->DimmInfo[Socket].bPresence) {
+ Tmp =
+ (u16) (DramAttr->DimmInfo[Socket].
+ SPDDataBuf[SPD_SDRAM_TRTP]);
+ if (Tmp > Max)
+ Max = Tmp;
+ }
+ }
+ /*Calculate clock */
+ Tmp = (u16) ((Max * 100 + ((DramAttr->DramCyc) << 2) - 1) / ((DramAttr->DramCyc) << 2)); //this value should be 2T or 3T
+
+ PRINT_DEBUG_MEM("Trtp =");
+ PRINT_DEBUG_MEM_HEX16(Tmp);
+ PRINT_DEBUG_MEM("\r");
+
+ Data = pci_read_config8(MEMCTRL, 0x63);
+ if (Tmp > MIN_TRTP)
+ Data = (u8) (Data | 0x08); /*set bit3, set 3T */
+ else
+ Data = (u8) (Data & 0xf7); /*clear bit3, set 2T */
+
+ pci_write_config8(MEMCTRL, 0x63, Data);
+}
Copied: trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/uma_ram_setting.c (from rev 4313, trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/UMARamSetting.c)
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/uma_ram_setting.c (rev 0)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/ddr2init/vx800/uma_ram_setting.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -0,0 +1,445 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2009 One Laptop per Child, Association, Inc.
+ *
+ * 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
+ */
+
+typedef struct __UMA_RAM_tag {
+ u16 DramSize;
+ u8 D0F3Val;
+ u8 D1F0Val;
+ u8 VgaPortVal;
+} UMARAM;
+#define UMARAM_512M 7
+#define UMARAM_256M 6
+#define UMARAM_128M 5
+#define UMARAM_64M 4
+#define UMARAM_32M 3
+#define UMARAM_16M 2
+#define UMARAM_8M 1
+#define UMARAM_0M 0
+
+
+#define FB_512M 0
+#define FB_256M 0x40
+#define FB_128M 0x60
+#define FB_64M 0x70
+#define FB_32M 0x78
+#define FB_16M 0x7c
+#define FB_8M 0x7E
+#define FB_4M 0x7F
+
+#define VGA_PORT_512M 0x00
+#define VGA_PORT_256M 0x80
+#define VGA_PORT_128M 0xC0
+#define VGA_PORT_64M 0xE0
+#define VGA_PORT_32M 0xF0
+#define VGA_PORT_16M 0xF8
+
+static const UMARAM UMARamArr[] = {
+ {0, UMARAM_0M, FB_4M, 0xFE},
+ {8, UMARAM_8M, FB_8M, 0xFC},
+ {16, UMARAM_16M, FB_16M, VGA_PORT_16M},
+ {32, UMARAM_32M, FB_32M, VGA_PORT_32M},
+ {64, UMARAM_64M, FB_64M, VGA_PORT_64M},
+ {128, UMARAM_128M, FB_128M, VGA_PORT_128M},
+ {256, UMARAM_256M, FB_256M, VGA_PORT_256M},
+ {512, UMARAM_512M, FB_512M, VGA_PORT_512M},
+ {0xffff, 0xff, 0xff, 0xFF}
+};
+
+void SetUMARam(void)
+{
+#if 1
+ u8 ramregs[] = { 0x43, 0x42, 0x41, 0x40 };
+ device_t vga_dev = PCI_DEV(0, 1, 0), d0f0_dev = PCI_DEV(0, 0, 0);
+ u8 ByteVal, temp;
+ UMARAM *pUMARamTable;
+ u16 UmaSize;
+ u8 SLD0F3Val, SLD1F0Val, VgaPortVal;
+ u32 RamSize, SLBase, Tmp;
+ u8 i;
+ PRINT_DEBUG_MEM("Entering vx800 SetUMARam.\n");
+ SLD0F3Val = 0;
+ SLD1F0Val = 0;
+ VgaPortVal = 0;
+
+
+ ByteVal = pci_read_config8(MEMCTRL, 0xa1);
+ ByteVal |= 0x80;
+ pci_write_config8(MEMCTRL, 0xa1, ByteVal);
+
+ //set VGA Timer
+ pci_write_config8(MEMCTRL, 0xa2, 0xee);
+
+ //set agp misc
+ //GFX Data Delay to Sync with Clock
+ pci_write_config8(MEMCTRL, 0xa4, 0x01);
+
+ //page register life timer
+ pci_write_config8(MEMCTRL, 0xa6, 0x76);
+
+ //GMINT and GFX relatate
+ //note Bit 3 VGA Enable
+ pci_write_config8(MEMCTRL, 0xa7, 0x8c);
+ // ByteVal = 0x4c;
+
+ //GMINT Misc.1
+ //pci_write_config8(MEMCTRL, 0xb0, 0x80);
+
+ //pci_write_config8(MEMCTRL, 0xb1, 0xaa);
+
+ //AGPCINT MISC
+ //pci_write_config8(MEMCTRL, 0xb2, 0x82);
+ //ByteVal = 0x8A;
+
+ //GMINT MISC.2
+ //disable read pass write
+ pci_write_config8(MEMCTRL, 0xb3, 0x9A);
+
+ //EPLL Register
+ //pci_write_config8(MEMCTRL, 0xb4, 0x04);
+
+ //enable CHA and CHB merge mode
+ pci_write_config8(MEMCTRL, 0xde, 0x06);
+
+ //if can get the value from setup interface, so get the value
+ //else use the default value
+ UmaSize = CONFIG_VIDEO_MB;
+
+ for (pUMARamTable = UMARamArr; pUMARamTable->DramSize != 0xffff;
+ pUMARamTable++) {
+ if (UmaSize == pUMARamTable->DramSize) {
+ SLD0F3Val = pUMARamTable->D0F3Val;
+ SLD1F0Val = pUMARamTable->D1F0Val;
+ VgaPortVal = pUMARamTable->VgaPortVal;
+ }
+ }
+ //set SL size
+ //Fill in Fun3_RXA1[6:4] with the Frame Buffer size for the Integrated Graphic Device.
+ ByteVal = pci_read_config8(MEMCTRL, 0xa1);
+ ByteVal = (ByteVal & 0x8f) | (SLD0F3Val << 4);
+ pci_write_config8(MEMCTRL, 0xa1, ByteVal);
+
+
+// vga_dev = dev_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VX855_VGA, 0);
+
+ //RxB2 may be for S.L. and RxB1 may be for L. L.
+ // It is different from Spec.
+ ByteVal = SLD1F0Val;
+ pci_write_config8(vga_dev, 0xb2, ByteVal);
+
+
+ //set M1 size
+ //ByteVal=pci_read_config8(MEMCTRL, 0xa3);
+ //ByteVal = 0x02;
+ //pci_write_config8(MEMCTRL, 0xa3, ByteVal);
+
+ PRINT_DEBUG_MEM("UMA setting - 3\n");
+
+
+
+
+ //Enable p2p IO/mem
+ ByteVal = 0x07;
+ pci_write_config8(vga_dev, 0x04, ByteVal);
+
+
+
+
+ //must set SL and MMIO base, or else when enable GFX memory space, system will hang
+ //set S.L base
+ Tmp = pci_read_config32(vga_dev, 0x10);
+ Tmp = 0xfffffff8;
+ pci_write_config32(vga_dev, 0x10, Tmp);
+ Tmp = pci_read_config32(vga_dev, 0x10);
+ Tmp = VIACONFIG_VGA_PCI_10;
+ pci_write_config32(vga_dev, 0x10, Tmp);
+
+ //set MMIO base
+ Tmp = pci_read_config32(vga_dev, 0x14);
+ Tmp = 0xfffffffC;
+ pci_write_config32(vga_dev, 0x14, Tmp);
+ Tmp = pci_read_config32(vga_dev, 0x14);
+ Tmp = VIACONFIG_VGA_PCI_14;
+ pci_write_config32(vga_dev, 0x14, Tmp);
+
+
+//enable direct cpu frame buffer access
+ i = pci_rawread_config8(PCI_RAWDEV(0, 0, 3), 0xa1);
+ i = (i & 0xf0) | (VIACONFIG_VGA_PCI_10 >> 28);
+ pci_rawwrite_config8(PCI_RAWDEV(0, 0, 3), 0xa1, i);
+ pci_rawwrite_config8(PCI_RAWDEV(0, 0, 3), 0xa0, 0x01);
+
+
+ //enable GFx memory space access control for S.L and mmio
+ ByteVal = pci_read_config8(d0f0_dev, 0xD4);
+ ByteVal |= 0x03;
+ //ByteVal |= 0x01;
+ pci_write_config8(d0f0_dev, 0xD4, ByteVal);
+
+
+ //enable Base VGA 16 Bits Decode
+ ByteVal = pci_read_config8(d0f0_dev, 0xfe);
+ ByteVal |= 0x10;
+ pci_write_config8(d0f0_dev, 0xfe, ByteVal);
+
+
+ //disable CHB L.L
+ //set VGA memory selection
+ ByteVal = pci_read_config8(vga_dev, 0xb0);
+ ByteVal &= 0xF8;
+ //ByteVal |= 0x01;
+ ByteVal |= 0x03;
+ pci_write_config8(vga_dev, 0xb0, ByteVal);
+
+ //set LL size
+
+ //enable memory access to SL,MMIO,LL and IO to 3B0~3BB,3C0 ~3DF
+ //ByteVal = 0x03;
+ //pci_write_config8(d0f0_dev, 0xc0, ByteVal);
+
+ //Turn on Graphic chip IO port port access
+ ByteVal = inb(0x03C3);
+ ByteVal |= 0x01;
+ outb(ByteVal, 0x03C3);
+
+ //Turn off Graphic chip Register protection
+ outb(0x10, 0x03C4);
+
+ ByteVal = inb(0x03C5);
+ ByteVal |= 0x01;
+ outb(ByteVal, 0x03C5);
+
+ //set VGA memory Frequence
+ //direct IO port 0x3DX to vga io space 0x3C2[0]
+ ByteVal = inb(0x03CC);
+ ByteVal |= 0x03;
+ outb(ByteVal, 0x03C2);
+ // ByteVal=inb(0x03C2);
+ // ByteVal |= 0x01;
+ // outb(ByteVal,0x03C2);
+
+
+#if 1 //bios porting guide has no this two defination: 3d on 3d4/3d5 and 39 on 3c4/3c5
+ //set frequence 0x3D5.3d[7:4]
+ outb(0x3d, 0x03d4);
+
+ temp = pci_read_config8(MEMCTRL, 0x90);
+ temp = (u8) (temp & 0x07);
+ ByteVal = inb(0x03d5);
+ switch (temp) {
+ case 0: //DIMMFREQ_200:
+ ByteVal = (u8) ((ByteVal & 0x0F) | 0x30);
+ break;
+ case 1: //DIMMFREQ_266:
+ ByteVal = (u8) ((ByteVal & 0x0F) | 0x40);
+ break;
+ case 3: //DIMMFREQ_400:
+ ByteVal = (u8) ((ByteVal & 0x0F) | 0x60);
+ break;
+ case 4: //DIMMFREQ_533:
+ ByteVal = (u8) ((ByteVal & 0x0F) | 0x70);
+ break;
+ case 5: //DIMMFREQ_667:
+ ByteVal = (u8) ((ByteVal & 0x0F) | 0x80);
+ break;
+ case 6: //DIMMFREQ_800:
+ ByteVal = (u8) ((ByteVal & 0x0F) | 0x90);
+ break;
+ default:
+ ByteVal = (u8) ((ByteVal & 0x0F) | 0x70);
+ break;
+ }
+ outb(ByteVal, 0x03d5);
+
+ // Set frame buffer size
+ outb(0x39, 0x03c4);
+ outb(1 << SLD0F3Val, 0x03c5);
+
+#endif
+ // Set S.L. size in GFX's register
+ outb(0x68, 0x03c4);
+ outb(VgaPortVal, 0x03c5);
+
+ // ECLK Selection (00:166Mhz, 01:185Mhz, 10:250Mhz, 11:275Mhz)
+ // set 3C5.5A[0]=1, address maps to secondary resgiters
+ outb(0x5a, 0x03c4);
+ ByteVal = inb(0x03c5);
+ ByteVal |= 0x01;
+ outb(ByteVal, 0x03c5);
+
+ // Set 3D5.4C[7:6] (00:166Mhz, 01:185Mhz, 10:250Mhz, 11:275Mhz)
+ outb(0x4c, 0x03d4);
+ ByteVal = inb(0x03d5);
+ ByteVal = (ByteVal & 0x3F) | 0x80;
+ outb(ByteVal, 0x03d5);
+
+ // set 3C5.5A[0]=0, address maps to first resgiters
+ outb(0x5a, 0x03c4);
+ ByteVal = inb(0x03c5);
+ ByteVal &= 0xFE;
+ outb(ByteVal, 0x03c5);
+
+ // Set S.L. Address in System Memory
+ //calculate dram size
+ for (RamSize = 0, i = 0; i < ARRAY_SIZE(ramregs); i++) {
+ RamSize = pci_read_config8(MEMCTRL, ramregs[i]);
+ if (RamSize != 0)
+ break;
+ }
+ //calculate SL Base Address
+ SLBase = (RamSize << 26) - (UmaSize << 20);
+
+
+ outb(0x6D, 0x03c4);
+ //SL Base[28:21]
+ outb((u8) ((SLBase >> 21) & 0xFF), 0x03c5);
+
+ outb(0x6e, 0x03c4);
+ //SL Base[36:29]
+ outb((u8) ((SLBase >> 29) & 0xFF), 0x03c5);
+
+ outb(0x6f, 0x03c4);
+ outb(0x00, 0x03c5);
+
+ // Set SVID high byte
+ outb(0x36, 0x03c4);
+ outb(0x11, 0x03c5);
+
+ // Set SVID Low byte
+ outb(0x35, 0x03c4);
+ outb(0x06, 0x03c5);
+
+ // Set SID high byte
+ outb(0x38, 0x03c4);
+ outb(0x51, 0x03c5);
+
+ // Set SID Low byte
+ outb(0x37, 0x03c4);
+ outb(0x22, 0x03c5);
+
+ //start : For enable snapshot mode control
+ // program 3C5 for SNAPSHOT Mode control, set RxF3h=1Ah
+ outb(0xf3, 0x03c4);
+ ByteVal = inb(0x03c5);
+ ByteVal = (ByteVal & 0xE5) | 0x1A;
+ outb(ByteVal, 0x03c5);
+
+
+ outb(0xf3, 0x03d4);
+ ByteVal = inb(0x03d5);
+ ByteVal = (ByteVal & 0xE5) | 0x1A;
+ outb(ByteVal, 0x03d5);
+
+ u8 table3c43c5[0x70] = {
+ 0x03, 0x01, 0x0F, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x78, 0x00, 0x00, 0x00, 0xBE, 0x20, 0x7F,
+ 0x60, 0x7F, 0x08, 0x31, 0xCC, 0x00, 0x01, 0x00,
+ 0x00, 0x18, 0x10, 0x00, 0x00, 0x00, 0x3D, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x04, 0xF3, 0xFF, 0xFC,
+ 0xF8, 0x0C, 0x00, 0x00, 0x40, 0x06, 0x11, 0x22,
+ 0x51, 0x10, 0x00, 0x01, 0x19, 0x0C, 0x00, 0xFF,
+ 0x38, 0x40, 0x30, 0xFF, 0x70, 0x8C, 0x85, 0x9D,
+ 0x80, 0x05, 0x54, 0x90, 0x03, 0x30, 0x00, 0x5F,
+ 0x1F, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
+ 0x06, 0xDF, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x40, 0x20, 0x00, 0x20, 0x20,
+ 0xE0, 0x20, 0xD0, 0x3F, 0x00, 0xE0, 0x00, 0x00
+ };
+ u8 table3d43d5[0x88] = {
+ 0x7F, 0x63, 0x63, 0x83, 0x69, 0x19, 0x72, 0xE0,
+ 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x58, 0x9C, 0x57, 0x90, 0x00, 0x57, 0x73, 0xE3,
+ 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0C, 0x00, 0x11, 0x06, 0x00, 0x20, 0x01, 0x34,
+ 0xEE, 0x74, 0x01, 0x01, 0x08, 0x84, 0x00, 0x00,
+ 0x00, 0xF3, 0x40, 0x90, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x12, 0x00, 0x02, 0x00, 0x00, 0x10, 0x00,
+ 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D,
+ 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D, 0x9D,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x9D, 0x9D, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x9D, 0x9D, 0x9D,
+ 0x9D, 0x9D, 0x9D, 0x9D, 0x00, 0x9D, 0x1D, 0x00,
+ 0x00, 0x00, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D,
+ 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D, 0x1D,
+ };
+
+
+ u8 table3c0space[0xc0] = {
+ 0x11, 0x00, 0x10, 0x01, 0x26, 0x3D, 0xFF, 0x00,
+ 0x10, 0x3F, 0x00, 0x00, 0x2F, 0x00, 0x22, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x50, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
+ };
+#if 0
+//for(i=0;i<0xc0;i++)
+ for (i = 0; i < 0x40; i++) //
+ {
+ outb(table3c0space[i], 0x03c0 + i);
+ }
+
+
+ for (i = 0; i < 0x70; i++) {
+ outb(i, 0x03c4);
+ outb(table3c43c5[i], 0x03c5);
+ }
+ for (i = 0; i < 0x88; i++) {
+ outb(i, 0x03d4);
+ outb(table3d43d5[i], 0x03d5);
+ }
+ outb(0x92, 0x03d4);
+ outb(0x80, 0x03d5);
+
+ outb(0xa3, 0x03d4);
+ outb(0x00, 0x03d5);
+
+ outb(0xe8, 0x03d4);
+ outb(0x40, 0x03d5);
+#endif
+//3d4 3d freq
+//IO Port / Index: 3X5.3D
+//Scratch Pad Register 4
+
+// outb(0x39,0x03c4);//
+ //outb(1 << SLD0F3Val ,0x03c5);
+//
+#endif
+
+}
Copied: trunk/coreboot-v2/src/northbridge/via/vx800/driving_clk_phase_data.h (from rev 4313, trunk/coreboot-v2/src/northbridge/via/vx800/DrivingClkPhaseData.h)
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/driving_clk_phase_data.h (rev 0)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/driving_clk_phase_data.h 2009-05-27 13:46:37 UTC (rev 4314)
@@ -0,0 +1,70 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2009 One Laptop per Child, Association, Inc.
+ *
+ * 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
+ */
+
+#ifndef DRIVINGCLKPHASEDATA_H
+#define DRIVINGCLKPHASEDATA_H
+
+//extern u8 DDR2_DQSA_Driving_Table[4] ;
+//extern u8 DDR2_DQSB_Driving_Table[2] ;
+
+//extern u8 DDR2_DQA_Driving_Table[4] ;
+//extern u8 DDR2_DQB_Driving_Table[2] ;
+
+//extern u8 DDR2_CSA_Driving_Table_x8[4] ;
+//extern u8 DDR2_CSB_Driving_Table_x8[2] ;
+//extern u8 DDR2_CSA_Driving_Table_x16[4];
+//extern u8 DDR2_CSB_Driving_Table_x16[2];
+
+#define MA_Table 3
+//extern u8 DDR2_MAA_Driving_Table[MA_Table][4];
+//extern u8 DDR2_MAB_Driving_Table[MA_Table][2];
+
+//extern u8 DDR2_DCLKA_Driving_Table[4] ;
+//extern u8 DDR2_DCLKB_Driving_Table[4];
+
+#define DUTY_CYCLE_FREQ_NUM 6
+#define DUTY_CYCLE_REG_NUM 3
+//extern u8 ChA_Duty_Control_DDR2[DUTY_CYCLE_REG_NUM][DUTY_CYCLE_FREQ_NUM];
+//extern u8 ChB_Duty_Control_DDR2[DUTY_CYCLE_REG_NUM][DUTY_CYCLE_FREQ_NUM];
+
+#define Clk_Phase_Table_DDR2_Width 6
+//extern u8 DDR2_ChA_Clk_Phase_Table_1R[3][Clk_Phase_Table_DDR2_Width];
+//extern u8 DDR2_ChB_Clk_Phase_Table_1R[3][Clk_Phase_Table_DDR2_Width];
+//extern u8 DDR2_ChA_Clk_Phase_Table_2R[3][Clk_Phase_Table_DDR2_Width];
+
+#define WrtData_REG_NUM 4
+#define WrtData_FREQ_NUM 6
+//extern u8 DDR2_ChA_WrtData_Phase_Table[WrtData_REG_NUM ][WrtData_FREQ_NUM];
+//extern u8 DDR2_ChB_WrtData_Phase_Table[WrtData_REG_NUM ][WrtData_FREQ_NUM];
+
+#define DQ_DQS_Delay_Table_Width 4
+//extern u8 DDR2_CHA_DQ_DQS_Delay_Table[4][DQ_DQS_Delay_Table_Width];
+//extern u8 DDR2_CHB_DQ_DQS_Delay_Table[4][DQ_DQS_Delay_Table_Width];
+
+#define DQS_INPUT_CAPTURE_REG_NUM 3
+#define DQS_INPUT_CAPTURE_FREQ_NUM 6
+//extern u8 DDR2_ChA_DQS_Input_Capture_Tbl[DQS_INPUT_CAPTURE_REG_NUM ][DQS_INPUT_CAPTURE_FREQ_NUM];
+//extern u8 DDR2_ChB_DQS_Input_Capture_Tbl[DQS_INPUT_CAPTURE_REG_NUM ][DQS_INPUT_CAPTURE_FREQ_NUM];
+
+//extern u8 Fixed_DQSA_1_2_Rank_Table[4][2];
+//extern u8 Fixed_DQSA_3_4_Rank_Table[4][2];
+
+//extern u8 Fixed_DQSB_1_2_Rank_Table[4][2];
+//extern u8 Fixed_DQSB_3_4_Rank_Table[4][2];
+#endif /* DRIVINGCLKPHASEDATA_H */
Deleted: trunk/coreboot-v2/src/northbridge/via/vx800/examples/DrivingClkPhaseData.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/examples/DrivingClkPhaseData.c 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/examples/DrivingClkPhaseData.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -1,242 +0,0 @@
-/*
- * This file is part of the coreboot project.
- *
- * Copyright (C) 2009 One Laptop per Child, Association, Inc.
- *
- * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
- #include "northbridge/via/vx800/DrivingClkPhaseData.h"
-
-// DQS Driving
-//Reg0xE0, 0xE1
-// According to #Bank to set DRAM DQS Driving
-// #Bank 1 2 3 4 5 6 7 8
-static const u8 DDR2_DQSA_Driving_Table[4] = { 0xEE, 0xEE, 0xEE, 0xEE};
-static const u8 DDR2_DQSB_Driving_Table[2] = { 0xEE, 0xEE};
-
-// DQ Driving
-//Reg0xE2, 0xE3
-// For DDR2: According to bank to set DRAM DQ Driving
-static const u8 DDR2_DQA_Driving_Table[4] = { 0xAC, 0xAC, 0xAC, 0xAC };
-static const u8 DDR2_DQB_Driving_Table[2] = { 0xCA, 0xCA };
-
-
-// CS Driving
-//Reg0xE4, 0xE5
-// According to #Bank to set DRAM CS Driving
-// DDR1 #Bank 1 2 3 4 5 6 7 8
-static const u8 DDR2_CSA_Driving_Table_x8[4] = { 0x44, 0x44, 0x44, 0x44 };
-static const u8 DDR2_CSB_Driving_Table_x8[2] = { 0x44, 0x44};
-static const u8 DDR2_CSA_Driving_Table_x16[4]= { 0x44, 0x44, 0x44, 0x44};
-static const u8 DDR2_CSB_Driving_Table_x16[2]= { 0x44, 0x44};
-// MAA Driving
-//Reg0xE8, Reg0xE9
-static const u8 DDR2_MAA_Driving_Table[MA_Table][5] =
- {
- //Chip number, 400, 533, 667 800 ;(SRAS, SCAS, SWE)RxE8
- { 6, 0x86, 0x86, 0x86, 0x86}, // total MAA chips = 00 ~ 06
- { 18, 0x86, 0x86, 0x86, 0x86}, // total MAA chips = 06 ~ 18
- {255, 0xDB, 0xDB, 0xDB, 0xDB} // total MAA chips = 18 ~
- };
-
-static const u8 DDR2_MAB_Driving_Table[MA_Table][2] =
- {
- // Chip number, Value ;(SRAS, SCAS, SWE)RxE9
- { 6, 0x86 }, // total MAB chips = 00 ~ 06
- { 18, 0x86 }, // total MAB chips = 06 ~ 18
- {255, 0xDB } // total MAB chips = 18 ~
- };
-
-// DCLK Driving
-//Reg0xE6, 0xE7
-// For DDR2: According to #Freq to set DRAM DCLK Driving
-// freq 400M, 533M, 667M, 800M
-
-static const u8 DDR2_DCLKA_Driving_Table[4] = { 0xFF, 0xFF, 0xFF, 0xFF };
-static const u8 DDR2_DCLKB_Driving_Table[4] = { 0xFF, 0xFF, 0xFF, 0xFF };
-
-/*
-Duty cycle
-Duty cycle Control for DQ/DQS/DDRCKG in ChA & ChB
-D0F3RxEC/D0F3RxED/D0F3RxEE/D0F3RxEF
-According to DRAM frequency to control Duty Cycle
-*/
-static const u8 ChA_Duty_Control_DDR2[DUTY_CYCLE_REG_NUM][DUTY_CYCLE_FREQ_NUM] =
- {
- // (And NOT) DDR800 DDR667 DDR533 DDR400
- //Reg Mask Value Value Value Value
- {0xEC, 0x00, 0x30, 0x30, 0x30, 0x30 }, // 1Rank
- {0xEE, 0x0F, 0x40, 0x40, 0x00, 0x00 },
- {0xEF, 0xCF, 0x00, 0x30, 0x30, 0x30}
- };
-
-static const u8 ChB_Duty_Control_DDR2[DUTY_CYCLE_REG_NUM][DUTY_CYCLE_FREQ_NUM] =
- {
- // (And NOT) DDR800 DDR667 DDR533 DDR400
- //Reg Mask Value Value Value Value
- {0xED, 0x00, 0x88, 0x88, 0x84, 0x88 }, // 1Rank
- {0xEE, 0xF0, 0x00, 0x00, 0x00, 0x00 },
- {0xEF, 0xFC, 0x00, 0x00, 0x00, 0x00 }
- };
-
-
-/*
-DRAM Clock Phase Control for FeedBack Mode
-Modify NB Reg: Rx90[7]/Rx91/Rx92/Rx93/Rx94
-Processing:
- 1.Program VIA_NB3DRAM_REG90[7]=0b for FeedBack mode
- 2.Program clock phase value with ChA/B DCLK enable, VIA_NB3DRAM_REG91[7:3]=00b
- 3.Check ChB rank #, if 0, VIA_NB3DRAM_REG91[7]=1b, to disable ChB DCLKO
- ChA DCLKO can not be disable, so always program VIA_NB3DRAM_REG91[3]=0b
- */
-static const u8 DDR2_ChA_Clk_Phase_Table_1R[3][Clk_Phase_Table_DDR2_Width] =
- {
- // (And NOT) DDR800 DDR667 DDR533 DDR400
- //Reg Mask Value Value Value Value
- {0x91, 0xF8, 0x02, 0x01, 0x00, 0x07 }, // 1Rank
- {0x92, 0xF8, 0x04, 0x03, 0x03, 0x02 },
- {0x93, 0xF8, 0x06, 0x05, 0x04, 0x03 }
- };
-
-static const u8 DDR2_ChB_Clk_Phase_Table_1R[3][Clk_Phase_Table_DDR2_Width] =
- {
- // (And NOT) DDR800 DDR667 DDR533 DDR400
- //Reg Mask Value Value Value Value
- {0x91, 0x0F, 0x20, 0x10, 0x00, 0x70 }, // 1Rank
- {0x92, 0x0F, 0x40, 0x30, 0x30, 0x20 },
- {0x93, 0x0F, 0x60, 0x50, 0x40, 0x30 }
- };
-
-/*static const u8 DDR2_ChA_Clk_Phase_Table_2R[3][Clk_Phase_Table_DDR2_Width] =
- {
- // (And NOT) DDR800 DDR667 DDR533 DDR400
- //Reg Mask Value Value Value Value
- {0x91, 0xF8, 0x04, 0x03, 0x04, 0x01 }, // 1Rank
- {0x92, 0xF8, 0x03, 0x06, 0x05, 0x04 },
- {0x93, 0xF8, 0x03, 0x07, 0x06, 0x05 }
- };*/
-
-static const u8 DDR2_ChA_Clk_Phase_Table_2R[3][Clk_Phase_Table_DDR2_Width] =
- {
- // (And NOT) DDR800 DDR667 DDR533 DDR400
- //Reg Mask Value Value Value Value
- {0x91, 0xF8, 0x02, 0x01, 0x00, 0x07}, // 1Rank
- {0x92, 0xF8, 0x04, 0x03, 0x03, 0x02 },
- {0x93, 0xF8, 0x06, 0x05, 0x04, 0x03 }
- };
-
-/*
-DRAM Write Data phase control
-Modify NB Reg: Rx74/Rx75/Rx76
-*/
-/*static const u8 DDR2_ChA_WrtData_Phase_Table[WrtData_REG_NUM ][WrtData_FREQ_NUM] =
- {
- // (And NOT) DDR800 DDR667 DDR533 DDR400
- //Reg Mask Value Value Value Value
- {0x74, 0xF8, 0x03, 0x04, 0x05, 0x02 }, // 1Rank
- {0x75, 0xF8, 0x03, 0x04, 0x05, 0x02 },
- {0x76, 0x00, 0x10, 0x80, 0x00, 0x07 }
- };*/
-
-static const u8 DDR2_ChA_WrtData_Phase_Table[WrtData_REG_NUM ][WrtData_FREQ_NUM] =
- {
- // (And NOT) DDR800 DDR667 DDR533 DDR400
- //Reg Mask Value Value Value Value
- {0x74, 0xF8, 0x01, 0x00, 0x00, 0x07 }, // 1Rank
- {0x75, 0xF8, 0x01, 0x00, 0x00, 0x07 },
- {0x76, 0x10, 0x80, 0x87, 0x07, 0x06 },
- {0x8C, 0xFC, 0x03, 0x03, 0x03, 0x03 }
- };
-
-/*static const u8 DDR2_ChB_WrtData_Phase_Table[WrtData_REG_NUM ][WrtData_FREQ_NUM] =
- {
- // (And NOT) DDR800 DDR667 DDR533 DDR400
- //Reg Mask Value Value Value Value
- {0x74, 0x8F, 0x30, 0x40, 0x30, 0x20 }, // 1Rank
- {0x75, 0x8F, 0x30, 0x40, 0x30, 0x20 },
- {0x8A, 0x00, 0x10, 0x80, 0x07, 0x07 }
- };
-*/
-/*
-DQ/DQS Output Delay Control
-Modify NB D0F3: RxF0/RxF1/RxF2/RxF3
-*/
-static const u8 DDR2_CHA_DQ_DQS_Delay_Table[4][DQ_DQS_Delay_Table_Width] =
- {
- // RxF0 RxF1 RxF2 RxF3
- { 0x00, 0x00, 0x00, 0x00 },// DDR400
- { 0x00, 0x00, 0x00, 0x00 },// DDR533
- { 0x00, 0x00, 0x00, 0x00 },// DDR667
- { 0x00, 0x00, 0x00, 0x00 }// DDR800
- };
-static const u8 DDR2_CHB_DQ_DQS_Delay_Table[4][DQ_DQS_Delay_Table_Width] =
- {
- // RxF4 RxF5 RxF6 RxF7
- { 0x00, 0x00, 0x00, 0x00 },// DDR400
- { 0x00, 0x00, 0x00, 0x00 },// DDR533
- { 0x00, 0x00, 0x00, 0x00 },// DDR667
- { 0x00, 0x00, 0x00, 0x00 }// DDR800
- };
-
-/*
-DQ/DQS input Capture Control
-modify NB D0F3_Reg:Rx78/Rx79/Rx7A/Rx7B
-*/
-
-/*static const u8 DDR2_ChA_DQS_Input_Capture_Tbl[DQS_INPUT_CAPTURE_REG_NUM ][DQS_INPUT_CAPTURE_FREQ_NUM] =
- {
- // (And NOT) DDR800 DDR667 DDR533 DDR400
- //Reg Mask Value Value Value Value
- {0x78, 0x00, 0x83, 0x8D, 0x87, 0x83 }, // 1Rank
- {0x7A, 0xF0, 0x00, 0x00, 0x00, 0x00 },
- {0x7B, 0x00, 0x10, 0x30, 0x20, 0x10 }
- };*/
-
-
-static const u8 DDR2_ChA_DQS_Input_Capture_Tbl[DQS_INPUT_CAPTURE_REG_NUM ][DQS_INPUT_CAPTURE_FREQ_NUM] =
- {
- // (And NOT) DDR800 DDR667 DDR533 DDR400
- //Reg Mask Value Value Value Value
- {0x78, 0xC0, 0x0D, 0x07, 0x03, 0x01 }, // 1Rank
- {0x7A, 0xF0, 0x00, 0x00, 0x00, 0x00 },
- {0x7B, 0x00, 0x34, 0x34, 0x20, 0x10 }
- };
-
-static const u8 DDR2_ChB_DQS_Input_Capture_Tbl[DQS_INPUT_CAPTURE_REG_NUM ][DQS_INPUT_CAPTURE_FREQ_NUM] =
- {
- // (And NOT) DDR800 DDR667 DDR533 DDR400
- //Reg Mask Value Value Value Value
- {0x79, 0x00, 0x89, 0x89, 0x87, 0x83 }, // 1Rank
- {0x7A, 0x0F, 0x00, 0x00, 0x00, 0x00 },
- {0x8B, 0x00, 0x34, 0x34, 0x20, 0x10 }
- };
-
-static const u8 Fixed_DQSA_1_2_Rank_Table[4][2] =
-{
-// Rx70 Rx71
- { 0x00, 0x05 }, // DDR800
- { 0x00, 0x06 }, // DDR667
- { 0x00, 0x04 }, // DDR533
- { 0x00, 0x05 } // DDR400
-};
-static const u8 Fixed_DQSA_3_4_Rank_Table[4][2] =
-{
-// Rx70 Rx71
- {0x00 , 0x04}, // DDR800
- {0x00 , 0x04}, // DDR667
- {0x00 , 0x03}, // DDR533
- {0x00 , 0x04} // DDR400
-};
Modified: trunk/coreboot-v2/src/northbridge/via/vx800/examples/cache_as_ram_auto.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/examples/cache_as_ram_auto.c 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/examples/cache_as_ram_auto.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -43,7 +43,7 @@
#endif
#include "cpu/x86/lapic/boot_cpu.c"
-#include "DrivingClkPhaseData.c"
+#include "driving_clk_phase_data.c"
#include "northbridge/via/vx800/raminit.h"
#include "northbridge/via/vx800/raminit.c"
@@ -423,7 +423,7 @@
DRAMDRDYSetting(&DramAttr);
- Data = 0x80; // this value is same with DevInit.c
+ Data = 0x80; // this value is same with dev_init.c
pci_write_config8(PCI_DEV(0, 0, 4), 0xa3, Data);
pci_write_config8(PCI_DEV(0, 17, 7), 0x60, rambits << 2);
Data = pci_read_config8(MEMCTRL, 0x88);
Copied: trunk/coreboot-v2/src/northbridge/via/vx800/examples/driving_clk_phase_data.c (from rev 4313, trunk/coreboot-v2/src/northbridge/via/vx800/examples/DrivingClkPhaseData.c)
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/examples/driving_clk_phase_data.c (rev 0)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/examples/driving_clk_phase_data.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -0,0 +1,242 @@
+/*
+ * This file is part of the coreboot project.
+ *
+ * Copyright (C) 2009 One Laptop per Child, Association, Inc.
+ *
+ * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ #include "northbridge/via/vx800/driving_clk_phase_data.h"
+
+// DQS Driving
+//Reg0xE0, 0xE1
+// According to #Bank to set DRAM DQS Driving
+// #Bank 1 2 3 4 5 6 7 8
+static const u8 DDR2_DQSA_Driving_Table[4] = { 0xEE, 0xEE, 0xEE, 0xEE};
+static const u8 DDR2_DQSB_Driving_Table[2] = { 0xEE, 0xEE};
+
+// DQ Driving
+//Reg0xE2, 0xE3
+// For DDR2: According to bank to set DRAM DQ Driving
+static const u8 DDR2_DQA_Driving_Table[4] = { 0xAC, 0xAC, 0xAC, 0xAC };
+static const u8 DDR2_DQB_Driving_Table[2] = { 0xCA, 0xCA };
+
+
+// CS Driving
+//Reg0xE4, 0xE5
+// According to #Bank to set DRAM CS Driving
+// DDR1 #Bank 1 2 3 4 5 6 7 8
+static const u8 DDR2_CSA_Driving_Table_x8[4] = { 0x44, 0x44, 0x44, 0x44 };
+static const u8 DDR2_CSB_Driving_Table_x8[2] = { 0x44, 0x44};
+static const u8 DDR2_CSA_Driving_Table_x16[4]= { 0x44, 0x44, 0x44, 0x44};
+static const u8 DDR2_CSB_Driving_Table_x16[2]= { 0x44, 0x44};
+// MAA Driving
+//Reg0xE8, Reg0xE9
+static const u8 DDR2_MAA_Driving_Table[MA_Table][5] =
+ {
+ //Chip number, 400, 533, 667 800 ;(SRAS, SCAS, SWE)RxE8
+ { 6, 0x86, 0x86, 0x86, 0x86}, // total MAA chips = 00 ~ 06
+ { 18, 0x86, 0x86, 0x86, 0x86}, // total MAA chips = 06 ~ 18
+ {255, 0xDB, 0xDB, 0xDB, 0xDB} // total MAA chips = 18 ~
+ };
+
+static const u8 DDR2_MAB_Driving_Table[MA_Table][2] =
+ {
+ // Chip number, Value ;(SRAS, SCAS, SWE)RxE9
+ { 6, 0x86 }, // total MAB chips = 00 ~ 06
+ { 18, 0x86 }, // total MAB chips = 06 ~ 18
+ {255, 0xDB } // total MAB chips = 18 ~
+ };
+
+// DCLK Driving
+//Reg0xE6, 0xE7
+// For DDR2: According to #Freq to set DRAM DCLK Driving
+// freq 400M, 533M, 667M, 800M
+
+static const u8 DDR2_DCLKA_Driving_Table[4] = { 0xFF, 0xFF, 0xFF, 0xFF };
+static const u8 DDR2_DCLKB_Driving_Table[4] = { 0xFF, 0xFF, 0xFF, 0xFF };
+
+/*
+Duty cycle
+Duty cycle Control for DQ/DQS/DDRCKG in ChA & ChB
+D0F3RxEC/D0F3RxED/D0F3RxEE/D0F3RxEF
+According to DRAM frequency to control Duty Cycle
+*/
+static const u8 ChA_Duty_Control_DDR2[DUTY_CYCLE_REG_NUM][DUTY_CYCLE_FREQ_NUM] =
+ {
+ // (And NOT) DDR800 DDR667 DDR533 DDR400
+ //Reg Mask Value Value Value Value
+ {0xEC, 0x00, 0x30, 0x30, 0x30, 0x30 }, // 1Rank
+ {0xEE, 0x0F, 0x40, 0x40, 0x00, 0x00 },
+ {0xEF, 0xCF, 0x00, 0x30, 0x30, 0x30}
+ };
+
+static const u8 ChB_Duty_Control_DDR2[DUTY_CYCLE_REG_NUM][DUTY_CYCLE_FREQ_NUM] =
+ {
+ // (And NOT) DDR800 DDR667 DDR533 DDR400
+ //Reg Mask Value Value Value Value
+ {0xED, 0x00, 0x88, 0x88, 0x84, 0x88 }, // 1Rank
+ {0xEE, 0xF0, 0x00, 0x00, 0x00, 0x00 },
+ {0xEF, 0xFC, 0x00, 0x00, 0x00, 0x00 }
+ };
+
+
+/*
+DRAM Clock Phase Control for FeedBack Mode
+Modify NB Reg: Rx90[7]/Rx91/Rx92/Rx93/Rx94
+Processing:
+ 1.Program VIA_NB3DRAM_REG90[7]=0b for FeedBack mode
+ 2.Program clock phase value with ChA/B DCLK enable, VIA_NB3DRAM_REG91[7:3]=00b
+ 3.Check ChB rank #, if 0, VIA_NB3DRAM_REG91[7]=1b, to disable ChB DCLKO
+ ChA DCLKO can not be disable, so always program VIA_NB3DRAM_REG91[3]=0b
+ */
+static const u8 DDR2_ChA_Clk_Phase_Table_1R[3][Clk_Phase_Table_DDR2_Width] =
+ {
+ // (And NOT) DDR800 DDR667 DDR533 DDR400
+ //Reg Mask Value Value Value Value
+ {0x91, 0xF8, 0x02, 0x01, 0x00, 0x07 }, // 1Rank
+ {0x92, 0xF8, 0x04, 0x03, 0x03, 0x02 },
+ {0x93, 0xF8, 0x06, 0x05, 0x04, 0x03 }
+ };
+
+static const u8 DDR2_ChB_Clk_Phase_Table_1R[3][Clk_Phase_Table_DDR2_Width] =
+ {
+ // (And NOT) DDR800 DDR667 DDR533 DDR400
+ //Reg Mask Value Value Value Value
+ {0x91, 0x0F, 0x20, 0x10, 0x00, 0x70 }, // 1Rank
+ {0x92, 0x0F, 0x40, 0x30, 0x30, 0x20 },
+ {0x93, 0x0F, 0x60, 0x50, 0x40, 0x30 }
+ };
+
+/*static const u8 DDR2_ChA_Clk_Phase_Table_2R[3][Clk_Phase_Table_DDR2_Width] =
+ {
+ // (And NOT) DDR800 DDR667 DDR533 DDR400
+ //Reg Mask Value Value Value Value
+ {0x91, 0xF8, 0x04, 0x03, 0x04, 0x01 }, // 1Rank
+ {0x92, 0xF8, 0x03, 0x06, 0x05, 0x04 },
+ {0x93, 0xF8, 0x03, 0x07, 0x06, 0x05 }
+ };*/
+
+static const u8 DDR2_ChA_Clk_Phase_Table_2R[3][Clk_Phase_Table_DDR2_Width] =
+ {
+ // (And NOT) DDR800 DDR667 DDR533 DDR400
+ //Reg Mask Value Value Value Value
+ {0x91, 0xF8, 0x02, 0x01, 0x00, 0x07}, // 1Rank
+ {0x92, 0xF8, 0x04, 0x03, 0x03, 0x02 },
+ {0x93, 0xF8, 0x06, 0x05, 0x04, 0x03 }
+ };
+
+/*
+DRAM Write Data phase control
+Modify NB Reg: Rx74/Rx75/Rx76
+*/
+/*static const u8 DDR2_ChA_WrtData_Phase_Table[WrtData_REG_NUM ][WrtData_FREQ_NUM] =
+ {
+ // (And NOT) DDR800 DDR667 DDR533 DDR400
+ //Reg Mask Value Value Value Value
+ {0x74, 0xF8, 0x03, 0x04, 0x05, 0x02 }, // 1Rank
+ {0x75, 0xF8, 0x03, 0x04, 0x05, 0x02 },
+ {0x76, 0x00, 0x10, 0x80, 0x00, 0x07 }
+ };*/
+
+static const u8 DDR2_ChA_WrtData_Phase_Table[WrtData_REG_NUM ][WrtData_FREQ_NUM] =
+ {
+ // (And NOT) DDR800 DDR667 DDR533 DDR400
+ //Reg Mask Value Value Value Value
+ {0x74, 0xF8, 0x01, 0x00, 0x00, 0x07 }, // 1Rank
+ {0x75, 0xF8, 0x01, 0x00, 0x00, 0x07 },
+ {0x76, 0x10, 0x80, 0x87, 0x07, 0x06 },
+ {0x8C, 0xFC, 0x03, 0x03, 0x03, 0x03 }
+ };
+
+/*static const u8 DDR2_ChB_WrtData_Phase_Table[WrtData_REG_NUM ][WrtData_FREQ_NUM] =
+ {
+ // (And NOT) DDR800 DDR667 DDR533 DDR400
+ //Reg Mask Value Value Value Value
+ {0x74, 0x8F, 0x30, 0x40, 0x30, 0x20 }, // 1Rank
+ {0x75, 0x8F, 0x30, 0x40, 0x30, 0x20 },
+ {0x8A, 0x00, 0x10, 0x80, 0x07, 0x07 }
+ };
+*/
+/*
+DQ/DQS Output Delay Control
+Modify NB D0F3: RxF0/RxF1/RxF2/RxF3
+*/
+static const u8 DDR2_CHA_DQ_DQS_Delay_Table[4][DQ_DQS_Delay_Table_Width] =
+ {
+ // RxF0 RxF1 RxF2 RxF3
+ { 0x00, 0x00, 0x00, 0x00 },// DDR400
+ { 0x00, 0x00, 0x00, 0x00 },// DDR533
+ { 0x00, 0x00, 0x00, 0x00 },// DDR667
+ { 0x00, 0x00, 0x00, 0x00 }// DDR800
+ };
+static const u8 DDR2_CHB_DQ_DQS_Delay_Table[4][DQ_DQS_Delay_Table_Width] =
+ {
+ // RxF4 RxF5 RxF6 RxF7
+ { 0x00, 0x00, 0x00, 0x00 },// DDR400
+ { 0x00, 0x00, 0x00, 0x00 },// DDR533
+ { 0x00, 0x00, 0x00, 0x00 },// DDR667
+ { 0x00, 0x00, 0x00, 0x00 }// DDR800
+ };
+
+/*
+DQ/DQS input Capture Control
+modify NB D0F3_Reg:Rx78/Rx79/Rx7A/Rx7B
+*/
+
+/*static const u8 DDR2_ChA_DQS_Input_Capture_Tbl[DQS_INPUT_CAPTURE_REG_NUM ][DQS_INPUT_CAPTURE_FREQ_NUM] =
+ {
+ // (And NOT) DDR800 DDR667 DDR533 DDR400
+ //Reg Mask Value Value Value Value
+ {0x78, 0x00, 0x83, 0x8D, 0x87, 0x83 }, // 1Rank
+ {0x7A, 0xF0, 0x00, 0x00, 0x00, 0x00 },
+ {0x7B, 0x00, 0x10, 0x30, 0x20, 0x10 }
+ };*/
+
+
+static const u8 DDR2_ChA_DQS_Input_Capture_Tbl[DQS_INPUT_CAPTURE_REG_NUM ][DQS_INPUT_CAPTURE_FREQ_NUM] =
+ {
+ // (And NOT) DDR800 DDR667 DDR533 DDR400
+ //Reg Mask Value Value Value Value
+ {0x78, 0xC0, 0x0D, 0x07, 0x03, 0x01 }, // 1Rank
+ {0x7A, 0xF0, 0x00, 0x00, 0x00, 0x00 },
+ {0x7B, 0x00, 0x34, 0x34, 0x20, 0x10 }
+ };
+
+static const u8 DDR2_ChB_DQS_Input_Capture_Tbl[DQS_INPUT_CAPTURE_REG_NUM ][DQS_INPUT_CAPTURE_FREQ_NUM] =
+ {
+ // (And NOT) DDR800 DDR667 DDR533 DDR400
+ //Reg Mask Value Value Value Value
+ {0x79, 0x00, 0x89, 0x89, 0x87, 0x83 }, // 1Rank
+ {0x7A, 0x0F, 0x00, 0x00, 0x00, 0x00 },
+ {0x8B, 0x00, 0x34, 0x34, 0x20, 0x10 }
+ };
+
+static const u8 Fixed_DQSA_1_2_Rank_Table[4][2] =
+{
+// Rx70 Rx71
+ { 0x00, 0x05 }, // DDR800
+ { 0x00, 0x06 }, // DDR667
+ { 0x00, 0x04 }, // DDR533
+ { 0x00, 0x05 } // DDR400
+};
+static const u8 Fixed_DQSA_3_4_Rank_Table[4][2] =
+{
+// Rx70 Rx71
+ {0x00 , 0x04}, // DDR800
+ {0x00 , 0x04}, // DDR667
+ {0x00 , 0x03}, // DDR533
+ {0x00 , 0x04} // DDR400
+};
Modified: trunk/coreboot-v2/src/northbridge/via/vx800/northbridge.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/northbridge.c 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/northbridge.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -38,7 +38,7 @@
static void memctrl_init(device_t dev)
{
/*
- set VGA in UMARamSetting.c, not in this function.
+ set VGA in uma_ram_setting.c, not in this function.
*/
#if 0
pci_write_config8(dev, 0x85, 0x20);
Modified: trunk/coreboot-v2/src/northbridge/via/vx800/raminit.c
===================================================================
--- trunk/coreboot-v2/src/northbridge/via/vx800/raminit.c 2009-05-27 13:12:42 UTC (rev 4313)
+++ trunk/coreboot-v2/src/northbridge/via/vx800/raminit.c 2009-05-27 13:46:37 UTC (rev 4314)
@@ -38,24 +38,24 @@
#define PRINT_DEBUG_MEM_HEX32(x)
#define DUMPNORTH()
#endif
-#include "northbridge/via/vx800/ddr2init/Translatorddr2init.c"
-#include "northbridge/via/vx800/ddr2init/DramInit.h"
+#include "northbridge/via/vx800/ddr2init/translator_ddr2_init.c"
+#include "northbridge/via/vx800/ddr2init/dram_init.h"
#include "northbridge/via/vx800/vx800_early_smbus.c"
#include "northbridge/via/vx800/vx800_early_serial.c"
-#include "northbridge/via/vx800/ddr2init/DramUtil.h"
-#include "northbridge/via/vx800/ddr2init/DramUtil.c"
-#include "northbridge/via/vx800/ddr2init/vx800/Detection.c"
-#include "northbridge/via/vx800/ddr2init/vx800/FreqSetting.c"
-#include "northbridge/via/vx800/ddr2init/vx800/TimingSetting.c"
-#include "northbridge/via/vx800/ddr2init/vx800/DRDY_BL.c"
-#include "northbridge/via/vx800/ddr2init/vx800/DrivingSetting.c"
-#include "northbridge/via/vx800/ddr2init/vx800/ClkCtrl.c"
-#include "northbridge/via/vx800/ddr2init/vx800/DevInit.c"
-#include "northbridge/via/vx800/ddr2init/vx800/RankMap.c"
-#include "northbridge/via/vx800/ddr2init/vx800/DQSSearch.c"
-#include "northbridge/via/vx800/ddr2init/vx800/FinalSetting.c"
-#include "northbridge/via/vx800/ddr2init/vx800/UMARamSetting.c"
-#include "northbridge/via/vx800/ddr2init/DramInit.c"
+#include "northbridge/via/vx800/ddr2init/dram_util.h"
+#include "northbridge/via/vx800/ddr2init/dram_util.c"
+#include "northbridge/via/vx800/ddr2init/vx800/detection.c"
+#include "northbridge/via/vx800/ddr2init/vx800/freq_setting.c"
+#include "northbridge/via/vx800/ddr2init/vx800/timing_setting.c"
+#include "northbridge/via/vx800/ddr2init/vx800/drdy_bl.c"
+#include "northbridge/via/vx800/ddr2init/vx800/driving_setting.c"
+#include "northbridge/via/vx800/ddr2init/vx800/clk_ctrl.c"
+#include "northbridge/via/vx800/ddr2init/vx800/dev_init.c"
+#include "northbridge/via/vx800/ddr2init/vx800/rank_map.c"
+#include "northbridge/via/vx800/ddr2init/vx800/dqs_search.c"
+#include "northbridge/via/vx800/ddr2init/vx800/final_setting.c"
+#include "northbridge/via/vx800/ddr2init/vx800/uma_ram_setting.c"
+#include "northbridge/via/vx800/ddr2init/dram_init.c"
/*
* Support one dimm with up to 2 ranks
*/