b5a78f1a7d532acfaef4ed595573fc54a5860dfb
[coreboot.git] / src / northbridge / via / vx800 / drdy_bl.c
1 /*
2  * This file is part of the coreboot project.
3  *
4  * Copyright (C) 2009 One Laptop per Child, Association, Inc.
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; version 2 of the License.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
18  */
19
20 // Set P6IF DRDY Timing
21 // Because there are 1.5T & 2.5T CAS latency in DDR1 mode, we need to use RDELAYMD-0
22 //
23 //      Entry:
24 //        EBP[29:25] = DRAM Speed, Dual_Channel
25 //        VIA_NB2HOST_REG54[7:5]        Host Frequency
26 //        VIA_NB3DRAM_REG62[2:0]        CAS Latency
27 //
28 //      Modify NB_Reg:
29 //        VIA_NB2HOST_REG54[3,1]
30 //        VIA_NB2HOST_REG55[1]
31 //        VIA_NB2HOST_REG60
32 //        VIA_NB2HOST_REG61
33 //        VIA_NB2HOST_REG62[3:0]
34 //        VIA_NB2HOST_REG63
35 //        VIA_NB2HOST_REG64
36 //        VIA_NB2HOST_REG65[3:0]
37 //        VIA_NB2HOST_REG66
38 //        VIA_NB2HOST_REG67[5:4]
39 //
40 // Processing:
41 //--------------------------------------------------------------------------
42 // P6IF DRDY Timing Control:
43 // *Following algorithm to set DRDY timing
44 // Set P6IF DRDY Timing by the following 3      conditions:
45 // 1. RDELAYMD
46 //    a.RDRPH(MD        input internal timing control)
47 //    b.CAS Latency
48 //    RDELAYMD(1bit) = bit0 of (CL + RDRPH)
49 //    for example: RDRPH=10b, CL3 -> F3_Rx56[5:4]=11b, 10b + 11b        = 101b, RDELAYMD=1 (bit0)
50 //                RDRPH=00b, CL2.5 -> F3_Rx56[5:4]=10b, 00b + 10b = 010b, RDELAYMD=0 (bit0)
51 // 2. CPU Frequency
52 // 3. DRAM Frequency
53 //
54 // According to above conditions, we create different tables:
55 // 1. RDELAYMD=0        : for integer CAS latency(ex. CL=3)
56 // 2. RDELAYMD=1        : for non-integer CAS latency(ex. CL=2.5)
57 // 3. Normal performance
58 // 4. Top performance :
59 //                     Using phase0 to a case has better performance.
60 //
61 // Note: The setting are        related to performance and maybe affect DRAM initialize.
62 //      Turn OFF(F2_Rx51[7]=0) this feature at csDRAMRegInitValueJ procedure.
63 //      Turn ON(F2_Rx51[7]=1) this feature at csDRAMRegFinalValueJ procedure.
64 //
65 // If F2_Rx51[7]=0, then        CPU always wait 8QW, a slower but most stable way
66 // If F2_Rx51[7]=1, then        the timing will refer to F2_Rx60 ~ F2_Rx67,
67 // a fast way but may cause the system to be unstable.
68 //
69 // Coding:
70 // 1. RDELAYMD and user's option        for performance can determine which table
71 // 2. CPU Frequency can get block offset        of table
72 // 3. DRAM Frequency can        get row offset of block
73 // 4. Set value
74 //
75 // PS: Fun2 Rx62, Rx65, Rx67 are        don't care bits in 3296, CPU 266MHz doesn't be supported by 3296,
76 //     but I still keep these bits in table to avoid the        usage in future
77 //     and do the fewest        modification for code.
78 //
79
80 // Early 3T
81 // Early 3T
82 #define P6IF_Misc_RFASTH                0x08
83 #define P6IF_Misc2_RRRDYH3E             0x10
84 #define P6IF_Misc2_RHTSEL               0x02
85
86 #define Rx54E3T                 P6IF_Misc_RFASTH
87 #define Rx55E3T                 P6IF_Misc2_RRRDYH3E
88
89 // Early 2T
90 #define Rx54E2T                 0x00
91 #define Rx55E2T                 P6IF_Misc2_RRRDYH3E
92
93 // Early 1T
94 #define Rx54E1T                 0x00
95 #define Rx55E1T                 0x00
96
97 // Early 0T
98 #define Rx54E0T                 P6IF_Misc_RFASTH
99 #define Rx55E0T                 P6IF_Misc2_RRRDYH3E + P6IF_Misc2_RHTSEL
100
101 // Latter       1T
102 #define Rx54L1T                 P6IF_Misc_RFASTH
103 #define Rx55L1T                 P6IF_Misc2_RHTSEL
104
105
106 #define PH0_0_0_0       0x00
107 #define PH0_0_0_1       0x01
108 #define PH0_0_0_2       0x02
109 #define PH0_0_0_3       0x03
110 #define PH0_0_1_0       0x04
111 #define PH0_0_1_1       0x05
112 #define PH0_0_1_2       0x06
113 #define PH0_0_2_1       0x09
114 #define PH0_0_2_2       0x0a
115 #define PH0_0_2_3       0x0b
116 #define PH0_0_3_2       0x0e
117 #define PH0_0_3_3       0x0f
118 #define PH0_1_1_0       0x14
119 #define PH0_1_1_1       0x15
120 #define PH0_2_1_2       0x26
121 #define PH0_2_2_1       0x29
122 #define PH0_2_2_2       0x2a
123 #define PH0_2_2_3       0x2b
124 #define PH0_2_3_2       0x2e
125 #define PH0_2_3_3       0x2f
126 #define PH0_3_2_2       0x3a
127 #define PH0_3_3_3       0x3f
128 #define PH1_0_0_0       0x40
129 #define PH1_0_0_1       0x41
130 #define PH1_0_1_1       0x45
131 #define PH1_1_1_1       0x55
132 #define PH1_2_1_1       0x65
133 #define PH1_2_2_1       0x69
134 #define PH2_1_1_1       0x95
135 #define PH2_1_2_1       0x99
136 #define PH2_1_2_2       0x9a
137 #define PH2_2_1_2       0xa6
138 #define PH2_2_2_1       0xa9
139 #define PH2_2_2_2       0xaa
140 #define PH2_2_3_2       0xae
141 #define PH2_2_3_3       0xaf
142 #define PH2_3_2_2       0xba
143 #define PH2_3_2_3       0xbb
144 #define PH2_3_3_2       0xbe
145 #define PH3_2_2_3       0xeb
146 #define PH3_2_3_2       0xee
147 #define PH3_2_3_3       0xef
148 #define PH3_3_3_3       0xff
149
150 #define PT894_RDRDY_TBL_Width           10
151 #define PT894_RDRDY_TBL_Block           60
152
153 static const u8 PT894_128bit_DELAYMD0_RCONV0[6][6][PT894_RDRDY_TBL_Width] =
154 //    -----------------------------------------------------------------------------------------------------------------
155 //    RX60           RX61           RX62            RX63           RX64       RX65           RX66  RX67   RX54[3,1]  RX55[3,1]    CPU/DRAM
156 //    LN4:1          LN8:5          LN10:9          QW4:1          QW8:5      QW10:9     WS8:1 WS10:9 RFASTH     RRRDYH3E
157 //                                                                                                                            RCONV          RHTSEL
158 //    -----------------------------------------------------------------------------------------------------------------
159 {
160 // cpu100
161         {
162          {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
163          {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
164          {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
165          {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
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/266
167          {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
168          },
169 // cpu133
170         {
171          {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
172          {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
173          {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
174          {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
175          {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
176          {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
177          },
178 // cpu200
179         {
180          {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
181          {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
182          {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
183          {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
184          {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
185          {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
186          },
187 // cpu166
188         {
189          {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
190          {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
191          {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
192          {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
193          {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
194          {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
195          },
196 // cpu266
197         {
198          {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
199          {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
200          {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
201          {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
202          {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
203          {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
204          },
205 // cpu333
206         {
207          {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
208          {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
209          {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
210          {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
211          {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
212          {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
213          }
214 };
215
216 static const u8 PT894_128bit_DELAYMD1_RCONV0[6][6][PT894_RDRDY_TBL_Width] =
217 //    -----------------------------------------------------------------------------------------------------------------
218 //    RX60           RX61           RX62            RX63           RX64       RX65           RX66  RX67   RX54[3,1]  RX55[3,1]    CPU/DRAM
219 //    LN4:1          LN8:5          LN10:9          QW4:1          QW8:5      QW10:9     WS8:1 WS10:9 RFASTH     RRRDYH3E
220 //                                                                                                                            RCONV          RHTSEL
221 //    -----------------------------------------------------------------------------------------------------------------
222 {
223 // cpu100
224         {
225          {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
226          {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
227          {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
228          {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
229          {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
230          {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
231          },
232 // cpu133
233         {
234          {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
235          {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
236          {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
237          {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
238          {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
239          {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
240          },
241 // cpu200
242         {
243          {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
244          {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
245          {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
246          {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
247          {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
248          {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
249          },
250 // cpu166
251         {
252          {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
253          {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
254          {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
255          {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
256          {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
257          {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
258          },
259 // cpu266
260         {
261          {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
262          {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
263          {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
264          {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
265          {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
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
267          },
268 // cpu333
269         {
270          {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
271          {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
272          {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
273          {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
274          {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
275          {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
276          }
277 };
278
279
280 static const u8 PT894_64bit_DELAYMD0_RCONV0[6][6][PT894_RDRDY_TBL_Width] =
281 //    -----------------------------------------------------------------------------------------------------------------
282 //    RX60           RX61           RX62            RX63           RX64       RX65           RX66  RX67   RX54[3,1]  RX55[3,1]    CPU/DRAM
283 //    LN4:1          LN8:5          LN10:9          QW4:1          QW8:5      QW10:9     WS8:1 WS10:9 RFASTH     RRRDYH3E
284 //                                                                                                                            RCONV          RHTSEL
285 //    -----------------------------------------------------------------------------------------------------------------
286 {
287 // cpu100
288         {
289          {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
290          {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
291          {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
292          {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
293          {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
294          {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
295          },
296 // cpu133
297         {
298          {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
299          {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
300          {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
301          {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
302          {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
303          {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
304          },
305 // cpu200
306         {
307          {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
308          {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
309          {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
310          {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
311          {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
312          {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
313 // 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
314          },
315 // cpu166
316         {
317          {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
318          {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
319          {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
320          {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
321          {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
322          {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
323          },
324 // cpu266
325         {
326          {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
327          {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
328          {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
329          {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
330          {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
331          {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
332          },
333 // cpu333
334         {
335          {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
336          {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
337          {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
338          {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
339          {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
340          {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
341          }
342 };
343
344
345 static const u8 PT894_64bit_DELAYMD1_RCONV0[6][6][PT894_RDRDY_TBL_Width] =
346 //    -----------------------------------------------------------------------------------------------------------------
347 //    RX60           RX61           RX62            RX63           RX64       RX65           RX66  RX67   RX54[3,1]  RX55[3,1]    CPU/DRAM
348 //    LN4:1          LN8:5          LN10:9          QW4:1          QW8:5      QW10:9     WS8:1 WS10:9 RFASTH     RRRDYH3E
349 //                                                                                                                            RCONV          RHTSEL
350 //    -----------------------------------------------------------------------------------------------------------------
351 {
352 // cpu100
353         {
354          {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
355          {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
356          {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
357          {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
358          {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
359          {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
360          },
361 // cpu133
362         {
363          {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
364          {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
365          {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
366          {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
367          {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
368          {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
369          },
370 // cpu200
371         {
372          {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
373          {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
374          {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
375          {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
376          {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
377          {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
378          },
379 // cpu166
380         {
381          {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
382          {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
383          {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
384          {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
385          {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
386          {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
387          },
388 // cpu266
389         {
390          {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
391          {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
392          {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
393          {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
394          {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
395          {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
396          },
397 // cpu333
398         {
399          {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
400          {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
401          {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
402          {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
403          {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
404          {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
405          }
406 };
407
408 void DRAMDRDYSetting(DRAM_SYS_ATTR * DramAttr)
409 {
410         u8 Data, CL, RDRPH;
411         u8 CpuFreq, DramFreq;
412         u8 ProgData[PT894_RDRDY_TBL_Width];
413         u8 DelayMode;
414         u8 DrdyMode;
415         u8 Index;
416
417         /*
418            this function has 3 switchs, correspond to 3 level of Drdy setting.
419            0:Slowest, 1:Default, 2:Optimize
420            you can only open one switch
421             */
422 #if 1                           //this is slowest
423         //  0 -> Slowest
424         //Write slowest value to register
425
426         Data = 0xAA;
427         pci_write_config8(PCI_DEV(0, 0, 2), 0x60, Data);
428
429         Data = 0x0A;
430         pci_write_config8(PCI_DEV(0, 0, 2), 0x61, Data);
431
432         Data = 0x00;
433         pci_write_config8(PCI_DEV(0, 0, 2), 0x62, Data);
434
435         Data = 0xAA;
436         pci_write_config8(PCI_DEV(0, 0, 2), 0x63, Data);
437
438         Data = 0x0A;
439         pci_write_config8(PCI_DEV(0, 0, 2), 0x64, Data);
440
441         Data = 0x00;
442         pci_write_config8(PCI_DEV(0, 0, 2), 0x65, Data);
443
444         Data = 0x00;
445         pci_write_config8(PCI_DEV(0, 0, 2), 0x66, Data);
446
447         Data = 0x00;
448         pci_write_config8(PCI_DEV(0, 0, 2), 0x67, Data);
449
450         Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x54);
451         Data = Data & 0xF5;
452         Data |= 0x08;
453         pci_write_config8(PCI_DEV(0, 0, 2), 0x54, Data);
454
455         //Data=pci_read_config8(PCI_DEV(0,0,2), 0x55);
456         //Data = Data & (~0x20);
457         //pci_write_config8(PCI_DEV(0,0,2), 0x55, Data);
458
459         //enable drdy timing
460         Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x51);
461         Data = Data | 0x80;
462         pci_write_config8(PCI_DEV(0, 0, 2), 0x51, Data);
463 #endif
464 #if 0                           //default
465         {
466                 //disable drdy timing
467                 Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x51);
468                 Data = Data & 0x7F;
469                 pci_write_config8(PCI_DEV(0, 0, 2), 0x51, Data);
470         }
471 #endif
472 #if 0                           //  2:Optimize
473         //CL :reg6x[2:0]
474         Data = pci_read_config8(MEMCTRL, 0x62);
475         CL = Data & 0x07;
476
477         //RDRPH: reg7B[6:4]
478         Data = pci_read_config8(MEMCTRL, 0x7B);
479         RDRPH = (Data & 0x70) >> 4;
480
481         //CpuFreq: F2Reg54[7:5]
482         Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x54);
483         CpuFreq = (Data & 0xE0) >> 5;
484
485         //DramFreq:F3Reg90[2:0]
486         Data = pci_read_config8(MEMCTRL, 0x90);
487         DramFreq = Data & 0x07;
488
489         DelayMode = CL + RDRPH; // RDELAYMD = bit0 of (CAS Latency + RDRPH)
490         DelayMode &= 0x01;
491
492         //In 364, there is no 128 bit
493         if (DelayMode == 1) {   // DelayMode 1
494                 for (Index = 0; Index < PT894_RDRDY_TBL_Width; Index++)
495                         ProgData[Index] =
496                             PT894_64bit_DELAYMD1_RCONV0[CpuFreq][DramFreq]
497                             [Index];
498         } else {                // DelayMode 0
499                 for (Index = 0; Index < PT894_RDRDY_TBL_Width; Index++)
500                         ProgData[Index] =
501                             PT894_64bit_DELAYMD0_RCONV0[CpuFreq][DramFreq]
502                             [Index];
503         }
504
505         Data = ProgData[0];
506         pci_write_config8(PCI_DEV(0, 0, 2), 0x60, Data);
507
508         Data = ProgData[1];
509         pci_write_config8(PCI_DEV(0, 0, 2), 0x61, Data);
510
511         Data = ProgData[2];
512         pci_write_config8(PCI_DEV(0, 0, 2), 0x62, Data);
513
514         Data = ProgData[3];
515         pci_write_config8(PCI_DEV(0, 0, 2), 0x63, Data);
516
517         Data = ProgData[4];
518         pci_write_config8(PCI_DEV(0, 0, 2), 0x64, Data);
519
520         Data = ProgData[5];
521         pci_write_config8(PCI_DEV(0, 0, 2), 0x65, Data);
522
523         Data = ProgData[6];
524         pci_write_config8(PCI_DEV(0, 0, 2), 0x66, Data);
525
526         Data = ProgData[7];
527         pci_write_config8(PCI_DEV(0, 0, 2), 0x67, Data);
528
529         Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x54);
530         Data = (Data & 0xF5) | ProgData[8];
531         pci_write_config8(PCI_DEV(0, 0, 2), 0x54, Data);
532
533         Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x55);
534         Data = Data & (~0x22) | ProgData[9];
535         pci_write_config8(PCI_DEV(0, 0, 2), 0x62, Data);
536
537         //enable drdy timing
538         Data = pci_read_config8(PCI_DEV(0, 0, 2), 0x51);
539         Data = Data | 0x80;
540         pci_write_config8(PCI_DEV(0, 0, 2), 0x51, Data);
541 #endif
542 }
543
544
545 /*This routine process the ability for North Bridge side burst functionality
546 There are 3 variances that are valid:
547         1. DIMM BL=8, chipset BL=8
548         2. DIMM BL=4, chipset BL=4
549         3. DIMM BL=4, chipset BL=8 (only happened on Dual channel)
550      Device 0 function 2 HOST:REG54[4] must be 1 when 128-bit mode.
551 Since DIMM will be initialized  in each rank individually,
552         1.If all DIMM BL=4, DIMM will initialize BL=4 first,
553           then check dual_channel flag to enable VIA_NB2HOST_REG54[4].
554         2.If all DIMM BL=8, DIMM will initialize BL=8 first,
555           then check dual_channel flag for re-initialize DIMM BL=4.
556           also VIA_NB2HOST_REG54[4] need        to be enabled.
557 Chipset_BL8==>chipset side can  set burst length=8
558 two register need to set
559  1. Device 0 function 2 HOST:REG54[4]
560  2. Device 0 function 3 DRAM:REG6C[3]
561 */
562 void DRAMBurstLength(DRAM_SYS_ATTR * DramAttr)
563 {
564         u8 Data, BL;
565         u8 Sockets;
566         /*SPD byte16 bit3,2 describes the burst length supported. bit3=1 support BL=8 bit2=1 support BL=4 */
567         BL = 0x0c;
568         for (Sockets = 0; Sockets < 2; Sockets++) {
569                 if (DramAttr->DimmInfo[Sockets].bPresence) {
570                         BL &=
571                             (DramAttr->DimmInfo[Sockets].
572                              SPDDataBuf[SPD_SDRAM_BURSTLENGTH]);
573                 }
574         }
575
576         /*D0F3Rx6c bit3 CHA SDRAM effective burst length, for 64bit mode ranks =0 BL=4 ; =1 BL=8 */
577
578         if (BL & 0x08)          /*All Assembly support BL=8 */
579                 BL = 0x8;       /*set bit3 */
580         else
581                 BL = 0x00;      /*clear bit3 */
582
583         Data = pci_read_config8(MEMCTRL, 0x6c);
584         Data = (u8) ((Data & 0xf7) | BL);
585
586 #if ENABLE_CHB
587         if (DramAttr->RankNumChB > 0) {
588                 BL = DramAttr->DimmInfo[2].
589                     SPDDataBuf[SPD_SDRAM_BURSTLENGTH];
590                 //Rx6c[1], CHB burst length
591                 if (BL & 0x08)  /*CHB support BL=8 */
592                         BL = 0x2;       /*set bit1 */
593                 else
594                         BL = 0x00;      /*clear bit1 */
595
596                 Data = (Data & 0xFD) | BL;
597         }
598 #endif
599         pci_write_config8(MEMCTRL, 0x6c, Data);
600 }