Replace clear_memory with memset.
[coreboot.git] / src / northbridge / amd / amdk8 / raminit_f.c
1 /*
2  * This file is part of the coreboot project.
3  *
4  * Copyright (C) 2002 Linux Networx
5  * (Written by Eric Biederman <ebiederman@lnxi.com> for Linux Networx)
6  * Copyright (C) 2004 YingHai Lu
7  * Copyright (C) 2008 Advanced Micro Devices, Inc.
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; version 2 of the License.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
21 */
22
23 #include <cpu/x86/cache.h>
24 #include <cpu/x86/mtrr.h>
25 #include <cpu/x86/tsc.h>
26
27 #include <stdlib.h>
28 #include "raminit.h"
29 #include "amdk8_f.h"
30 #include <spd_ddr2.h>
31
32 #ifndef QRANK_DIMM_SUPPORT
33 #define QRANK_DIMM_SUPPORT 0
34 #endif
35
36 #if DEBUG_RAM_SETUP
37 #define printk_raminit printk_debug
38 #else
39 #define printk_raminit(fmt, arg...)
40 #endif
41
42
43 #if (CONFIG_RAMTOP & (CONFIG_RAMTOP -1)) != 0
44 # error "CONFIG_RAMTOP must be a power of 2"
45 #endif
46
47 #include "amdk8_f_pci.c"
48
49
50         /* for PCI_ADDR(0, 0x18, 2, 0x98) index,
51          and PCI_ADDR(0x, 0x18, 2, 0x9c) data */
52         /*
53                 index:
54                 [29: 0] DctOffset (Dram Controller Offset)
55                 [30:30] DctAccessWrite (Dram Controller Read/Write Select)
56                         0 = read access
57                         1 = write access
58                 [31:31] DctAccessDone (Dram Controller Access Done)
59                         0 = Access in progress
60                         1 = No access is progress
61
62                 Data:
63                 [31: 0] DctOffsetData (Dram Controller Offset Data)
64
65                 Read:
66                         - Write the register num to DctOffset with
67                           DctAccessWrite = 0
68                         - poll the DctAccessDone until it = 1
69                         - Read the data from DctOffsetData
70                 Write:
71                         - Write the data to DctOffsetData
72                         - Write register num to DctOffset with DctAccessWrite = 1
73                         - poll the DctAccessDone untio it = 1
74         */
75
76
77 static void setup_resource_map(const unsigned int *register_values, int max)
78 {
79         int i;
80         for (i = 0; i < max; i += 3) {
81                 device_t dev;
82                 unsigned where;
83                 unsigned long reg;
84                 dev = register_values[i] & ~0xff;
85                 where = register_values[i] & 0xff;
86                 reg = pci_read_config32(dev, where);
87                 reg &= register_values[i+1];
88                 reg |= register_values[i+2];
89                 pci_write_config32(dev, where, reg);
90         }
91 }
92
93 static int controller_present(const struct mem_controller *ctrl)
94 {
95         return pci_read_config32(ctrl->f0, 0) == 0x11001022;
96 }
97
98 static void sdram_set_registers(const struct mem_controller *ctrl, struct sys_info *sysinfo)
99 {
100         static const unsigned int register_values[] = {
101
102         /* Careful set limit registers before base registers which
103            contain the enables */
104         /* DRAM Limit i Registers
105          * F1:0x44 i = 0
106          * F1:0x4C i = 1
107          * F1:0x54 i = 2
108          * F1:0x5C i = 3
109          * F1:0x64 i = 4
110          * F1:0x6C i = 5
111          * F1:0x74 i = 6
112          * F1:0x7C i = 7
113          * [ 2: 0] Destination Node ID
114          *         000 = Node 0
115          *         001 = Node 1
116          *         010 = Node 2
117          *         011 = Node 3
118          *         100 = Node 4
119          *         101 = Node 5
120          *         110 = Node 6
121          *         111 = Node 7
122          * [ 7: 3] Reserved
123          * [10: 8] Interleave select
124          *         specifies the values of A[14:12] to use with interleave enable.
125          * [15:11] Reserved
126          * [31:16] DRAM Limit Address i Bits 39-24
127          *         This field defines the upper address bits of a 40 bit  address
128          *         that define the end of the DRAM region.
129          */
130         PCI_ADDR(0, 0x18, 1, 0x44), 0x0000f8f8, 0x00000000,
131         PCI_ADDR(0, 0x18, 1, 0x4C), 0x0000f8f8, 0x00000001,
132         PCI_ADDR(0, 0x18, 1, 0x54), 0x0000f8f8, 0x00000002,
133         PCI_ADDR(0, 0x18, 1, 0x5C), 0x0000f8f8, 0x00000003,
134         PCI_ADDR(0, 0x18, 1, 0x64), 0x0000f8f8, 0x00000004,
135         PCI_ADDR(0, 0x18, 1, 0x6C), 0x0000f8f8, 0x00000005,
136         PCI_ADDR(0, 0x18, 1, 0x74), 0x0000f8f8, 0x00000006,
137         PCI_ADDR(0, 0x18, 1, 0x7C), 0x0000f8f8, 0x00000007,
138         /* DRAM Base i Registers
139          * F1:0x40 i = 0
140          * F1:0x48 i = 1
141          * F1:0x50 i = 2
142          * F1:0x58 i = 3
143          * F1:0x60 i = 4
144          * F1:0x68 i = 5
145          * F1:0x70 i = 6
146          * F1:0x78 i = 7
147          * [ 0: 0] Read Enable
148          *         0 = Reads Disabled
149          *         1 = Reads Enabled
150          * [ 1: 1] Write Enable
151          *         0 = Writes Disabled
152          *         1 = Writes Enabled
153          * [ 7: 2] Reserved
154          * [10: 8] Interleave Enable
155          *         000 = No interleave
156          *         001 = Interleave on A[12] (2 nodes)
157          *         010 = reserved
158          *         011 = Interleave on A[12] and A[14] (4 nodes)
159          *         100 = reserved
160          *         101 = reserved
161          *         110 = reserved
162          *         111 = Interleve on A[12] and A[13] and A[14] (8 nodes)
163          * [15:11] Reserved
164          * [13:16] DRAM Base Address i Bits 39-24
165          *         This field defines the upper address bits of a 40-bit address
166          *         that define the start of the DRAM region.
167          */
168         PCI_ADDR(0, 0x18, 1, 0x40), 0x0000f8fc, 0x00000000,
169         PCI_ADDR(0, 0x18, 1, 0x48), 0x0000f8fc, 0x00000000,
170         PCI_ADDR(0, 0x18, 1, 0x50), 0x0000f8fc, 0x00000000,
171         PCI_ADDR(0, 0x18, 1, 0x58), 0x0000f8fc, 0x00000000,
172         PCI_ADDR(0, 0x18, 1, 0x60), 0x0000f8fc, 0x00000000,
173         PCI_ADDR(0, 0x18, 1, 0x68), 0x0000f8fc, 0x00000000,
174         PCI_ADDR(0, 0x18, 1, 0x70), 0x0000f8fc, 0x00000000,
175         PCI_ADDR(0, 0x18, 1, 0x78), 0x0000f8fc, 0x00000000,
176
177         /* DRAM CS Base Address i Registers
178          * F2:0x40 i = 0
179          * F2:0x44 i = 1
180          * F2:0x48 i = 2
181          * F2:0x4C i = 3
182          * F2:0x50 i = 4
183          * F2:0x54 i = 5
184          * F2:0x58 i = 6
185          * F2:0x5C i = 7
186          * [ 0: 0] Chip-Select Bank Enable
187          *         0 = Bank Disabled
188          *         1 = Bank Enabled
189          * [ 1: 1] Spare Rank
190          * [ 2: 2] Memory Test Failed
191          * [ 4: 3] Reserved
192          * [13: 5] Base Address (21-13)
193          *         An optimization used when all DIMM are the same size...
194          * [18:14] Reserved
195          * [28:19] Base Address (36-27)
196          *         This field defines the top 11 addresses bit of a 40-bit
197          *         address that define the memory address space.  These
198          *         bits decode 32-MByte blocks of memory.
199          * [31:29] Reserved
200          */
201         PCI_ADDR(0, 0x18, 2, 0x40), 0xe007c018, 0x00000000,
202         PCI_ADDR(0, 0x18, 2, 0x44), 0xe007c018, 0x00000000,
203         PCI_ADDR(0, 0x18, 2, 0x48), 0xe007c018, 0x00000000,
204         PCI_ADDR(0, 0x18, 2, 0x4C), 0xe007c018, 0x00000000,
205         PCI_ADDR(0, 0x18, 2, 0x50), 0xe007c018, 0x00000000,
206         PCI_ADDR(0, 0x18, 2, 0x54), 0xe007c018, 0x00000000,
207         PCI_ADDR(0, 0x18, 2, 0x58), 0xe007c018, 0x00000000,
208         PCI_ADDR(0, 0x18, 2, 0x5C), 0xe007c018, 0x00000000,
209         /* DRAM CS Mask Address i Registers
210          * F2:0x60 i = 0,1
211          * F2:0x64 i = 2,3
212          * F2:0x68 i = 4,5
213          * F2:0x6C i = 6,7
214          * Select bits to exclude from comparison with the DRAM Base address register.
215          * [ 4: 0] Reserved
216          * [13: 5] Address Mask (21-13)
217          *         Address to be excluded from the optimized case
218          * [18:14] Reserved
219          * [28:19] Address Mask (36-27)
220          *         The bits with an address mask of 1 are excluded from address comparison
221          * [31:29] Reserved
222          *
223          */
224         PCI_ADDR(0, 0x18, 2, 0x60), 0xe007c01f, 0x00000000,
225         PCI_ADDR(0, 0x18, 2, 0x64), 0xe007c01f, 0x00000000,
226         PCI_ADDR(0, 0x18, 2, 0x68), 0xe007c01f, 0x00000000,
227         PCI_ADDR(0, 0x18, 2, 0x6C), 0xe007c01f, 0x00000000,
228
229         /* DRAM Control Register
230          * F2:0x78
231          * [ 3: 0] RdPtrInit ( Read Pointer Initial Value)
232          *      0x03-0x00: reserved
233          * [ 6: 4] RdPadRcvFifoDly (Read Delay from Pad Receive FIFO)
234          *      000 = reserved
235          *      001 = reserved
236          *      010 = 1.5 Memory Clocks
237          *      011 = 2 Memory Clocks
238          *      100 = 2.5 Memory Clocks
239          *      101 = 3 Memory Clocks
240          *      110 = 3.5 Memory Clocks
241          *      111 = Reseved
242          * [15: 7] Reserved
243          * [16:16] AltVidC3MemClkTriEn (AltVID Memory Clock Tristate Enable)
244          *      Enables the DDR memory clocks to be tristated when alternate VID
245          *      mode is enabled. This bit has no effect if the DisNbClkRamp bit
246          *      (F3, 0x88) is set
247          * [17:17] DllTempAdjTime (DLL Temperature Adjust Cycle Time)
248          *      0 = 5 ms
249          *      1 = 1 ms
250          * [18:18] DqsRcvEnTrain (DQS Receiver Enable Training Mode)
251          *      0 = Normal DQS Receiver enable operation
252          *      1 = DQS receiver enable training mode
253           * [31:19] reverved
254          */
255         PCI_ADDR(0, 0x18, 2, 0x78), 0xfff80000, (6<<4)|(6<<0),
256
257         /* DRAM Initialization Register
258          * F2:0x7C
259          * [15: 0] MrsAddress (Address for MRS/EMRS Commands)
260          *      this field specifies the dsata driven on the DRAM address pins
261          *      15-0 for MRS and EMRS commands
262          * [18:16] MrsBank (Bank Address for MRS/EMRS Commands)
263          *      this files specifies the data driven on the DRAM bank pins for
264          *      the MRS and EMRS commands
265          * [23:19] reverved
266          * [24:24] SendPchgAll (Send Precharge All Command)
267          *      Setting this bit causes the DRAM controller to send a precharge
268          *      all command. This bit is cleared by the hardware after the
269          *      command completes
270          * [25:25] SendAutoRefresh (Send Auto Refresh Command)
271          *      Setting this bit causes the DRAM controller to send an auto
272          *      refresh command. This bit is cleared by the hardware after the
273          *      command completes
274          * [26:26] SendMrsCmd (Send MRS/EMRS Command)
275          *      Setting this bit causes the DRAM controller to send the MRS or
276          *      EMRS command defined by the MrsAddress and MrsBank fields. This
277          *      bit is cleared by the hardware adter the commmand completes
278          * [27:27] DeassertMemRstX (De-assert Memory Reset)
279          *      Setting this bit causes the DRAM controller to de-assert the
280          *      memory reset pin. This bit cannot be used to assert the memory
281          *      reset pin
282          * [28:28] AssertCke (Assert CKE)
283          *      setting this bit causes the DRAM controller to assert the CKE
284          *      pins. This bit cannot be used to de-assert the CKE pins
285          * [30:29] reverved
286          * [31:31] EnDramInit (Enable DRAM Initialization)
287          *      Setting this bit puts the DRAM controller in a BIOS controlled
288          *      DRAM initialization mode. BIOS must clear this bit aster DRAM
289          *      initialization is complete.
290          */
291 //      PCI_ADDR(0, 0x18, 2, 0x7C), 0x60f80000, 0,
292
293
294         /* DRAM Bank Address Mapping Register
295          * F2:0x80
296          * Specify the memory module size
297          * [ 3: 0] CS1/0
298          * [ 7: 4] CS3/2
299          * [11: 8] CS5/4
300          * [15:12] CS7/6
301          * [31:16]
302               row    col   bank
303           0:  13     9      2    :128M
304           1:  13     10     2    :256M
305           2:  14     10     2    :512M
306           3:  13     11     2    :512M
307           4:  13     10     3    :512M
308           5:  14     10     3    :1G
309           6:  14     11     2    :1G
310           7:  15     10     3    :2G
311           8:  14     11     3    :2G
312           9:  15     11     3    :4G
313          10:  16     10     3    :4G
314          11:  16     11     3    :8G
315          */
316         PCI_ADDR(0, 0x18, 2, 0x80), 0xffff0000, 0x00000000,
317         /* DRAM Timing Low Register
318          * F2:0x88
319          * [ 2: 0] Tcl (Cas# Latency, Cas# to read-data-valid)
320          *         000 = reserved
321          *         001 = reserved
322          *         010 = CL 3
323          *         011 = CL 4
324          *         100 = CL 5
325          *         101 = CL 6
326          *         110 = reserved
327          *         111 = reserved
328          * [ 3: 3] Reserved
329          * [ 5: 4] Trcd (Ras#-active to Cas# read/write delay)
330          *         00 = 3 clocks
331          *         01 = 4 clocks
332          *         10 = 5 clocks
333          *         11 = 6 clocks
334          * [ 7: 6] Reserved
335          * [ 9: 8] Trp (Row Precharge Time, Precharge-to-Active or Auto-Refresh)
336          *         00 = 3 clocks
337          *         01 = 4 clocks
338          *         10 = 5 clocks
339          *         11 = 6 clocks
340          * [10:10] Reserved
341          * [11:11] Trtp (Read to Precharge Time, read Cas# to precharge time)
342          *         0 = 2 clocks for Burst Length of 32 Bytes
343          *             4 clocks for Burst Length of 64 Bytes
344          *         1 = 3 clocks for Burst Length of 32 Bytes
345          *             5 clocks for Burst Length of 64 Bytes
346          * [15:12] Tras (Minimum Ras# Active Time)
347          *         0000 = reserved
348          *         0001 = reserved
349          *         0010 = 5 bus clocks
350          *         ...
351          *         1111 = 18 bus clocks
352          * [19:16] Trc (Row Cycle Time, Ras#-active to Ras#-active or auto
353          * refresh of the same bank)
354          *         0000 = 11 bus clocks
355          *         0010 = 12 bus clocks
356          *         ...
357          *         1110 = 25 bus clocks
358          *         1111 = 26 bus clocks
359          * [21:20] Twr (Write Recovery Time, From the last data to precharge,
360          * writes can go back-to-back)
361          *         00 = 3 bus clocks
362          *         01 = 4 bus clocks
363          *         10 = 5 bus clocks
364          *         11 = 6 bus clocks
365          * [23:22] Trrd (Active-to-active(Ras#-to-Ras#) Delay of different banks)
366          *         00 = 2 bus clocks
367          *         01 = 3 bus clocks
368          *         10 = 4 bus clocks
369          *         11 = 5 bus clocks
370          * [31:24] MemClkDis ( Disable the MEMCLK outputs for DRAM channel A,
371          * BIOS should set it to reduce the power consumption)
372          *        Bit           F(1207)         M2 Package      S1g1 Package
373          *          0           N/A             MA1_CLK1        N/A
374          *          1           N/A             MA0_CLK1        MA0_CLK1
375          *          2           MA3_CLK         N/A             N/A
376          *          3           MA2_CLK         N/A             N/A
377          *          4           MA1_CLK         MA1_CLK0        N/A
378          *          5           MA0_CLK         MA0_CLK0        MA0_CLK0
379          *          6           N/A             MA1_CLK2        N/A
380          *          7           N/A             MA0_CLK2        MA0_CLK2
381          */
382         PCI_ADDR(0, 0x18, 2, 0x88), 0x000004c8, 0xff000002 /* 0x03623125 */ ,
383         /* DRAM Timing High Register
384          * F2:0x8C
385          * [ 3: 0] Reserved
386          * [ 6: 4] TrwtTO (Read-to-Write Turnaround for Data, DQS Contention)
387          *         000 = 2 bus clocks
388          *         001 = 3 bus clocks
389          *         010 = 4 bus clocks
390          *         011 = 5 bus clocks
391          *         100 = 6 bus clocks
392          *         101 = 7 bus clocks
393          *         110 = 8 bus clocks
394          *         111 = 9 bus clocks
395          * [ 7: 7] Reserved
396          * [ 9: 8] Twtr (Internal DRAM Write-to-Read Command Delay, 
397          * minium write-to-read delay when both access the same chip select)
398          *         00 = Reserved
399          *         01 = 1 bus clocks
400          *         10 = 2 bus clocks
401          *         11 = 3 bus clocks
402          * [11:10] Twrrd (Write to Read DIMM Termination Turnaround, minimum
403          * write-to-read delay when accessing two different DIMMs)
404          *         00 = 0 bus clocks
405          *         01 = 1 bus clocks
406          *         10 = 2 bus clocks
407          *         11 = 3 bus clocks
408          * [13:12] Twrwr (Write to Write Timing)
409          *         00 = 1 bus clocks ( 0 idle cycle on the bus)
410          *         01 = 2 bus clocks ( 1 idle cycle on the bus)
411          *         10 = 3 bus clocks ( 2 idle cycles on the bus)
412          *         11 = Reserved
413          * [15:14] Trdrd ( Read to Read Timing)
414          *         00 = 2 bus clocks ( 1 idle cycle on the bus)
415          *         01 = 3 bus clocks ( 2 idle cycles on the bus)
416          *         10 = 4 bus clocks ( 3 idle cycles on the bus)
417          *         11 = 5 bus clocks ( 4 idel cycles on the bus)
418          * [17:16] Tref (Refresh Rate)
419          *         00 = Undefined behavior
420          *         01 = Reserved
421          *         10 = Refresh interval of 7.8 microseconds
422          *         11 = Refresh interval of 3.9 microseconds
423          * [19:18] Reserved
424          * [22:20] Trfc0 ( Auto-Refresh Row Cycle Time for the Logical DIMM0,
425          *      based on DRAM density and speed)
426          *         000 = 75 ns (all speeds, 256Mbit)
427          *         001 = 105 ns (all speeds, 512Mbit)
428          *         010 = 127.5 ns (all speeds, 1Gbit)
429          *         011 = 195 ns (all speeds, 2Gbit)
430          *         100 = 327.5 ns (all speeds, 4Gbit)
431          *         101 = reserved
432          *         110 = reserved
433          *         111 = reserved
434          * [25:23] Trfc1 ( Auto-Refresh Row Cycle Time for the Logical DIMM1,
435          *      based on DRAM density and speed)
436          * [28:26] Trfc2 ( Auto-Refresh Row Cycle Time for the Logical DIMM2,
437          *      based on DRAM density and speed)
438          * [31:29] Trfc3 ( Auto-Refresh Row Cycle Time for the Logical DIMM3,
439          *      based on DRAM density and speed)
440          */
441         PCI_ADDR(0, 0x18, 2, 0x8c), 0x000c008f, (2 << 16)|(1 << 8),
442         /* DRAM Config Low Register
443          * F2:0x90
444          * [ 0: 0] InitDram (Initialize DRAM)
445          *         1 = write 1 cause DRAM controller to execute the DRAM
446          *             initialization, when done it read to 0
447          * [ 1: 1] ExitSelfRef ( Exit Self Refresh Command )
448          *         1 = write 1 causes the DRAM controller to bring the DRAMs out
449          *             for self refresh mode
450          * [ 3: 2] Reserved
451          * [ 5: 4] DramTerm (DRAM Termination)
452          *         00 = On die termination disabled
453          *         01 = 75 ohms
454          *         10 = 150 ohms
455          *         11 = 50 ohms
456          * [ 6: 6] Reserved
457          * [ 7: 7] DramDrvWeak ( DRAM Drivers Weak Mode)
458          *         0 = Normal drive strength mode.
459          *         1 = Weak drive strength mode
460          * [ 8: 8] ParEn (Parity Enable)
461          *         1 = Enable address parity computation output, PAR,
462          *             and enables the parity error input, ERR
463          * [ 9: 9] SelfRefRateEn (Faster Self Refresh Rate Enable)
464          *        1 = Enable high temperature ( two times normal )
465          *            self refresh rate
466          * [10:10] BurstLength32 ( DRAM Burst Length Set for 32 Bytes)
467          *         0 = 64-byte mode
468          *         1 = 32-byte mode
469          * [11:11] Width128 ( Width of DRAM interface)
470          *         0 = the controller DRAM interface is 64-bits wide
471          *         1 = the controller DRAM interface is 128-bits wide
472          * [12:12] X4Dimm (DIMM 0 is x4)
473          * [13:13] X4Dimm (DIMM 1 is x4)
474          * [14:14] X4Dimm (DIMM 2 is x4)
475          * [15:15] X4Dimm (DIMM 3 is x4)
476          *         0 = DIMM is not x4
477          *         1 = x4 DIMM present
478          * [16:16] UnBuffDimm ( Unbuffered DIMMs)
479          *         0 = Buffered DIMMs
480          *         1 = Unbuffered DIMMs
481          * [18:17] Reserved
482          * [19:19] DimmEccEn ( DIMM ECC Enable )
483          *         1 =  ECC checking is being enabled for all DIMMs on the DRAM
484          *              controller ( Through F3 0x44[EccEn])
485          * [31:20] Reserved
486          */
487         PCI_ADDR(0, 0x18, 2, 0x90), 0xfff6004c, 0x00000010,
488         /* DRAM Config High Register
489          * F2:0x94
490          * [ 0: 2] MemClkFreq ( Memory Clock Frequency)
491          *         000 = 200MHz
492          *         001 = 266MHz
493          *         010 = 333MHz
494          *         011 = reserved
495          *         1xx = reserved
496          * [ 3: 3] MemClkFreqVal (Memory Clock Freqency Valid)
497          *         1 = BIOS need to set the bit when setting up MemClkFreq to
498          *             the proper value
499          * [ 7: 4] MaxAsyncLat ( Maximum Asynchronous Latency)
500          *         0000 = 0 ns
501          *         ...
502          *         1111 = 15 ns
503          * [11: 8] Reserved
504          * [12:12] RDqsEn ( Read DQS Enable) This bit is only be set if x8
505          *         registered DIMMs are present in the system
506          *         0 = DM pins function as data mask pins
507          *         1 = DM pins function as read DQS pins
508          * [13:13] Reserved
509          * [14:14] DisDramInterface ( Disable the DRAM interface ) When this bit
510          * is set, the DRAM controller is disabled, and interface in low power
511          * state
512          *         0 = Enabled (default)
513          *         1 = Disabled
514          * [15:15] PowerDownEn ( Power Down Mode Enable )
515          *         0 = Disabled (default)
516          *         1 = Enabled
517          * [16:16] PowerDown ( Power Down Mode )
518          *         0 = Channel CKE Control
519          *         1 = Chip Select CKE Control
520          * [17:17] FourRankSODimm (Four Rank SO-DIMM)
521          *         1 = this bit is set by BIOS to indicate that a four rank
522          *             SO-DIMM is present
523          * [18:18] FourRankRDimm (Four Rank Registered DIMM)
524          *         1 = this bit is set by BIOS to indicate that a four rank
525          *             registered DIMM is present
526          * [19:19] Reserved
527          * [20:20] SlowAccessMode (Slow Access Mode (2T Mode))
528          *         0 = DRAM address and control signals are driven for one 
529          *             MEMCLK cycle
530          *         1 = One additional MEMCLK of setup time is provided on all
531          *             DRAM address and control signals except CS, CKE, and ODT;
532          *             i.e., these signals are drivern for two MEMCLK cycles
533          *             rather than one
534          * [21:21] Reserved
535          * [22:22] BankSwizzleMode ( Bank Swizzle Mode),
536          *         0 = Disabled (default)
537          *         1 = Enabled
538          * [23:23] Reserved
539          * [27:24] DcqBypassMax ( DRAM Controller Queue Bypass Maximum)
540          *         0000 = No bypass; the oldest request is never bypassed
541          *         0001 = The oldest request may be bypassed no more than 1 time
542          *         ...
543          *         1111 = The oldest request may be bypassed no more than 15\
544          *                times
545          * [31:28] FourActWindow ( Four Bank Activate Window) , not more than
546          *         4 banks in a 8 bank device are activated
547          *         0000 = No tFAW window restriction
548          *         0001 = 8 MEMCLK cycles
549          *         0010 = 9 MEMCLK cycles
550          *         ...
551          *         1101 = 20 MEMCLK cycles
552          *         111x = reserved
553          */
554         PCI_ADDR(0, 0x18, 2, 0x94), 0x00a82f00,0x00008000,
555         /* DRAM Delay Line Register
556          * F2:0xa0
557          * [ 0: 0] MemClrStatus (Memory Clear Status) : Readonly
558          *         when set, this bit indicates that the memory clear function
559          *         is complete. Only clear by reset. BIOS should not write or
560          *         read the DRAM until this bit is set by hardware
561          * [ 1: 1] DisableJitter ( Disable Jitter)
562          *         When set the DDR compensation circuit will not change the
563          *         values unless the change is more than one step from the
564          *         current value
565          * [ 3: 2] RdWrQByp ( Read/Write Queue Bypass Count)
566          *         00 = 2
567          *         01 = 4
568          *         10 = 8
569          *         11 = 16
570          * [ 4: 4] Mode64BitMux (Mismatched DIMM Support Enable)
571          *         1 When bit enables support for mismatched DIMMs when using
572          *         128-bit DRAM interface, the Width128 no effect, only for
573          *         AM2 and s1g1
574          * [ 5: 5] DCC_EN ( Dynamica Idle Cycle Counter Enable)
575          *         When set to 1, indicates that each entry in the page tables
576          *         dynamically adjusts the idle cycle limit based on page
577          *          Conflict/Page Miss (PC/PM) traffic
578          * [ 8: 6] ILD_lmt ( Idle Cycle Limit)
579          *         000 = 0 cycles
580          *         001 = 4 cycles
581          *         010 = 8 cycles
582          *         011 = 16 cycles
583          *         100 = 32 cycles
584          *         101 = 64 cycles
585          *         110 = 128 cycles
586          *         111 = 256 cycles
587          * [ 9: 9] DramEnabled ( DRAM Enabled)
588          *         When Set, this bit indicates that the DRAM is enabled, this
589          *         bit is set by hardware after DRAM initialization or on an exit
590          *         from self refresh. The DRAM controller is intialized after the
591          *         hardware-controlled initialization process ( initiated by the
592          *         F2 0x90[DramInit]) completes or when the BIOS-controlled
593          *         initialization process completes (F2 0x7c(EnDramInit] is
594          *         written from 1 to 0)
595          * [23:10] Reserved
596          * [31:24] MemClkDis ( Disable the MEMCLK outputs for DRAM channel B,
597          *         BIOS should set it to reduce the power consumption)
598          *         Bit          F(1207)         M2 Package      S1g1 Package
599          *          0           N/A             MA1_CLK1        N/A
600          *          1           N/A             MA0_CLK1        MA0_CLK1
601          *          2           MA3_CLK         N/A             N/A
602          *          3           MA2_CLK         N/A             N/A
603          *          4           MA1_CLK         MA1_CLK0        N/A
604          *          5           MA0_CLK         MA0_CLK0        MA0_CLK0
605          *          6           N/A             MA1_CLK2        N/A
606          *          7           N/A             MA0_CLK2        MA0_CLK2
607          */
608         PCI_ADDR(0, 0x18, 2, 0xa0), 0x00fffc00, 0xff000000,
609
610         /* DRAM Scrub Control Register
611          * F3:0x58
612          * [ 4: 0] DRAM Scrube Rate
613          * [ 7: 5] reserved
614          * [12: 8] L2 Scrub Rate
615          * [15:13] reserved
616          * [20:16] Dcache Scrub
617          * [31:21] reserved
618          *         Scrub Rates
619          *         00000 = Do not scrub
620          *         00001 =  40.00 ns
621          *         00010 =  80.00 ns
622          *         00011 = 160.00 ns
623          *         00100 = 320.00 ns
624          *         00101 = 640.00 ns
625          *         00110 =   1.28 us
626          *         00111 =   2.56 us
627          *         01000 =   5.12 us
628          *         01001 =  10.20 us
629          *         01011 =  41.00 us
630          *         01100 =  81.90 us
631          *         01101 = 163.80 us
632          *         01110 = 327.70 us
633          *         01111 = 655.40 us
634          *         10000 =   1.31 ms
635          *         10001 =   2.62 ms
636          *         10010 =   5.24 ms
637          *         10011 =  10.49 ms
638          *         10100 =  20.97 ms
639          *         10101 =  42.00 ms
640          *         10110 =  84.00 ms
641          *         All Others = Reserved
642          */
643         PCI_ADDR(0, 0x18, 3, 0x58), 0xffe0e0e0, 0x00000000,
644         /* DRAM Scrub Address Low Register
645          * F3:0x5C
646          * [ 0: 0] DRAM Scrubber Redirect Enable
647          *         0 = Do nothing
648          *         1 = Scrubber Corrects errors found in normal operation
649          * [ 5: 1] Reserved
650          * [31: 6] DRAM Scrub Address 31-6
651          */
652         PCI_ADDR(0, 0x18, 3, 0x5C), 0x0000003e, 0x00000000,
653         /* DRAM Scrub Address High Register
654          * F3:0x60
655          * [ 7: 0] DRAM Scrubb Address 39-32
656          * [31: 8] Reserved
657          */
658         PCI_ADDR(0, 0x18, 3, 0x60), 0xffffff00, 0x00000000,
659         };
660         /* for PCI_ADDR(0, 0x18, 2, 0x98) index,
661          and PCI_ADDR(0x, 0x18, 2, 0x9c) data */
662         /*
663                 index:
664                 [29: 0] DctOffset (Dram Controller Offset)
665                 [30:30] DctAccessWrite (Dram Controller Read/Write Select)
666                         0 = read access
667                         1 = write access
668                 [31:31] DctAccessDone (Dram Controller Access Done)
669                         0 = Access in progress
670                         1 = No access is progress
671
672                 Data:
673                 [31: 0] DctOffsetData (Dram Controller Offset Data)
674
675                 Read:
676                         - Write the register num to DctOffset with DctAccessWrite = 0
677                         - poll the DctAccessDone until it = 1
678                         - Read the data from DctOffsetData
679                 Write:
680                         - Write the data to DctOffsetData
681                         - Write register num to DctOffset with DctAccessWrite = 1
682                         - poll the DctAccessDone untio it = 1
683
684         */
685         int i;
686         int max;
687
688         if (!controller_present(ctrl)) {
689                 sysinfo->ctrl_present[ctrl->node_id] = 0;
690                 return;
691         }
692         sysinfo->ctrl_present[ctrl->node_id] = 1;
693
694         printk_spew("setting up CPU %02x northbridge registers\n", ctrl->node_id);
695         max = ARRAY_SIZE(register_values);
696         for (i = 0; i < max; i += 3) {
697                 device_t dev;
698                 unsigned where;
699                 unsigned long reg;
700                 dev = (register_values[i] & ~0xff) - PCI_DEV(0, 0x18, 0) + ctrl->f0;
701                 where = register_values[i] & 0xff;
702                 reg = pci_read_config32(dev, where);
703                 reg &= register_values[i+1];
704                 reg |= register_values[i+2];
705                 pci_write_config32(dev, where, reg);
706         }
707         printk_spew("done.\n");
708 }
709
710 static int is_dual_channel(const struct mem_controller *ctrl)
711 {
712         uint32_t dcl;
713         dcl = pci_read_config32(ctrl->f2, DRAM_CONFIG_LOW);
714         return dcl & DCL_Width128;
715 }
716
717 static int is_opteron(const struct mem_controller *ctrl)
718 {
719         /* Test to see if I am an Opteron.
720          * FIXME Testing dual channel capability is correct for now
721          * but a better test is probably required.
722          * m2 and s1g1 support dual channel too. but only support unbuffered dimm
723          */
724 #warning "FIXME implement a better test for opterons"
725         uint32_t nbcap;
726         nbcap = pci_read_config32(ctrl->f3, NORTHBRIDGE_CAP);
727         return !!(nbcap & NBCAP_128Bit);
728 }
729
730 static int is_registered(const struct mem_controller *ctrl)
731 {
732         /* Test to see if we are dealing with registered SDRAM.
733          * If we are not registered we are unbuffered.
734          * This function must be called after spd_handle_unbuffered_dimms.
735          */
736         uint32_t dcl;
737         dcl = pci_read_config32(ctrl->f2, DRAM_CONFIG_LOW);
738         return !(dcl & DCL_UnBuffDimm);
739 }
740
741
742 static void spd_get_dimm_size(unsigned device, struct dimm_size *sz)
743 {
744         /* Calculate the log base 2 size of a DIMM in bits */
745         int value;
746         sz->per_rank = 0;
747         sz->rows = 0;
748         sz->col = 0;
749         sz->rank = 0;
750
751         value = spd_read_byte(device, SPD_ROW_NUM);     /* rows */
752         if (value < 0) goto hw_err;
753         if ((value & 0xff) == 0) goto val_err; /* max is 16 ? */
754         sz->per_rank += value & 0xff;
755         sz->rows = value & 0xff;
756
757         value = spd_read_byte(device, SPD_COL_NUM);     /* columns */
758         if (value < 0) goto hw_err;
759         if ((value & 0xff) == 0) goto val_err;  /* max is 11 */
760         sz->per_rank += value & 0xff;
761         sz->col = value & 0xff;
762
763         value = spd_read_byte(device, SPD_BANK_NUM);    /* banks */
764         if (value < 0) goto hw_err;
765         if ((value & 0xff) == 0) goto val_err;
766         sz->bank = log2(value & 0xff);  // convert 4 to 2, and 8 to 3
767         sz->per_rank += sz->bank;
768
769         /* Get the module data width and convert it to a power of two */
770         value = spd_read_byte(device, SPD_DATA_WIDTH);
771         if (value < 0) goto hw_err;
772         value &= 0xff;
773         if ((value != 72) && (value != 64)) goto val_err;
774         sz->per_rank += log2(value) - 3; //64 bit So another 3 lines
775
776         /* How many ranks? */
777         /* number of physical banks */
778         value = spd_read_byte(device, SPD_MOD_ATTRIB_RANK);
779         if (value < 0) goto hw_err;
780 /*      value >>= SPD_MOD_ATTRIB_RANK_NUM_SHIFT; */
781         value &= SPD_MOD_ATTRIB_RANK_NUM_MASK;
782         value += SPD_MOD_ATTRIB_RANK_NUM_BASE; // 0-->1, 1-->2, 3-->4
783         /*
784           rank == 1 only one rank or say one side
785           rank == 2 two side , and two ranks
786           rank == 4 two side , and four ranks total
787           Some one side two ranks, because of stacked
788         */
789         if ((value != 1) && (value != 2) && (value != 4 )) {
790                 goto val_err;
791         }
792         sz->rank = value;
793
794         /* verify if per_rank is equal byte 31
795           it has the DIMM size as a multiple of 128MB.
796           */
797         value = spd_read_byte(device, SPD_RANK_SIZE);
798         if (value < 0) goto hw_err;
799         value &= 0xff;
800         value = log2(value);
801         if (value <=4 ) value += 8; // add back to 1G to high
802         value += (27-5); // make 128MB to the real lines
803         if ( value != (sz->per_rank)) {
804                 printk_err("Bad RANK Size --\n");
805                 goto val_err;
806         }
807
808         goto out;
809
810  val_err:
811         die("Bad SPD value\n");
812         /* If an hw_error occurs report that I have no memory */
813  hw_err:
814         sz->per_rank = 0;
815         sz->rows = 0;
816         sz->col = 0;
817         sz->bank = 0;
818         sz->rank = 0;
819  out:
820         return;
821 }
822
823
824 static void set_dimm_size(const struct mem_controller *ctrl,
825                           struct dimm_size *sz, unsigned index,
826                           struct mem_info *meminfo)
827 {
828         uint32_t base0, base1;
829
830         /* For each base register.
831          * Place the dimm size in 32 MB quantities in the bits 31 - 21.
832          * The initialize dimm size is in bits.
833          * Set the base enable bit0.
834          */
835
836         base0 = base1 = 0;
837
838         /* Make certain side1 of the dimm is at least 128MB */
839         if (sz->per_rank >= 27) {
840                 base0 = (1 << ((sz->per_rank - 27 ) + 19)) | 1;
841         }
842
843         /* Make certain side2 of the dimm is at least 128MB */
844         if (sz->rank > 1) { // 2 ranks or 4 ranks
845                 base1 = (1 << ((sz->per_rank - 27 ) + 19)) | 1;
846         }
847
848         /* Double the size if we are using dual channel memory */
849         if (meminfo->is_Width128) {
850                 base0 = (base0 << 1) | (base0 & 1);
851                 base1 = (base1 << 1) | (base1 & 1);
852         }
853
854         /* Clear the reserved bits */
855         base0 &= ~0xe007fffe;
856         base1 &= ~0xe007fffe;
857
858         if (!(meminfo->dimm_mask & 0x0F) && (meminfo->dimm_mask & 0xF0)) { /* channelB only? */
859                 pci_write_config32(ctrl->f2, DRAM_CSBASE + (((index << 1) + 4) << 2), base0);
860                 pci_write_config32(ctrl->f2, DRAM_CSBASE + (((index << 1) + 5) << 2), base1);
861         } else {
862                 /* Set the appropriate DIMM base address register */
863                 pci_write_config32(ctrl->f2, DRAM_CSBASE + (((index << 1) + 0) << 2), base0);
864                 pci_write_config32(ctrl->f2, DRAM_CSBASE + (((index << 1) + 1) << 2), base1);
865 #if QRANK_DIMM_SUPPORT == 1
866                 if (sz->rank == 4) {
867                         pci_write_config32(ctrl->f2, DRAM_CSBASE + (((index << 1) + 4) << 2), base0);
868                         pci_write_config32(ctrl->f2, DRAM_CSBASE + (((index << 1) + 5) << 2), base1);
869                 }
870 #endif
871         }
872
873         /* Enable the memory clocks for this DIMM by Clear the MemClkDis bit*/
874         if (base0) {
875                 uint32_t dword;
876                 uint32_t ClkDis0;
877 #if CONFIG_CPU_SOCKET_TYPE == 0x10 /* L1 */
878                 ClkDis0 = DTL_MemClkDis0;
879 #elif CONFIG_CPU_SOCKET_TYPE == 0x11 /* AM2 */
880                 ClkDis0 = DTL_MemClkDis0_AM2;
881 #elif CONFIG_CPU_SOCKET_TYPE == 0x12    /* S1G1 */
882                 ClkDis0 = DTL_MemClkDis0_S1g1;
883 #endif
884
885                 if (!(meminfo->dimm_mask & 0x0F) && (meminfo->dimm_mask & 0xF0)) { /* channelB only? */
886                         dword = pci_read_config32(ctrl->f2, DRAM_CTRL_MISC);
887                         dword &= ~(ClkDis0 >> index);
888                         pci_write_config32(ctrl->f2, DRAM_CTRL_MISC, dword);
889
890                 } else {
891                         dword = pci_read_config32(ctrl->f2, DRAM_TIMING_LOW); //Channel A
892                         dword &= ~(ClkDis0 >> index);
893 #if QRANK_DIMM_SUPPORT == 1
894                         if (sz->rank == 4) {
895                                 dword &= ~(ClkDis0 >> (index+2));
896                         }
897 #endif
898                         pci_write_config32(ctrl->f2, DRAM_TIMING_LOW, dword);
899
900                         if (meminfo->is_Width128) { // ChannelA+B
901                                 dword = pci_read_config32(ctrl->f2, DRAM_CTRL_MISC);
902                                 dword &= ~(ClkDis0 >> index);
903 #if QRANK_DIMM_SUPPORT == 1
904                                 if (sz->rank == 4) {
905                                         dword &= ~(ClkDis0 >> (index+2));
906                                 }
907 #endif
908                                 pci_write_config32(ctrl->f2, DRAM_CTRL_MISC, dword);
909                         }
910                 }
911
912         }
913 }
914
915 /*    row    col   bank  for 64 bit
916   0:  13     9      2    :128M
917   1:  13     10     2    :256M
918   2:  14     10     2    :512M
919   3:  13     11     2    :512M
920   4:  13     10     3    :512M
921   5:  14     10     3    :1G
922   6:  14     11     2    :1G
923   7:  15     10     3    :2G
924   8:  14     11     3    :2G
925   9:  15     11     3    :4G
926  10:  16     10     3    :4G
927  11:  16     11     3    :8G
928 */
929
930
931 static void set_dimm_cs_map(const struct mem_controller *ctrl,
932                              struct dimm_size *sz, unsigned index,
933                              struct mem_info *meminfo)
934 {
935         static const uint8_t cs_map_aaa[24] = {
936                 /* (bank=2, row=13, col=9)(3, 16, 11) ---> (0, 0, 0) (1, 3, 2) */
937         //Bank2
938                 0, 1, 3,
939                 0, 2, 6,
940                 0, 0, 0,
941                 0, 0, 0,
942         //Bank3
943                 0, 4, 0,
944                 0, 5, 8,
945                 0, 7, 9,
946                 0,10,11,
947         };
948
949         uint32_t map;
950
951         if (!(meminfo->dimm_mask & 0x0F) && (meminfo->dimm_mask & 0xF0)) { /* channelB only? */
952                 index += 2;
953         }
954         map = pci_read_config32(ctrl->f2, DRAM_BANK_ADDR_MAP);
955         map &= ~(0xf << (index * 4));
956 #if QRANK_DIMM_SUPPORT == 1
957         if (sz->rank == 4) {
958                 map &= ~(0xf << ( (index + 2) * 4));
959         }
960 #endif
961
962         /* Make certain side1 of the dimm is at least 128MB */
963         if (sz->per_rank >= 27) {
964                 unsigned temp_map;
965                 temp_map = cs_map_aaa[(sz->bank-2)*3*4 + (sz->rows - 13)*3 + (sz->col - 9) ];
966                 map |= temp_map << (index*4);
967 #if QRANK_DIMM_SUPPORT == 1
968                 if (sz->rank == 4) {
969                         map |=  temp_map << ( (index + 2) * 4);
970                 }
971 #endif
972         }
973
974         pci_write_config32(ctrl->f2, DRAM_BANK_ADDR_MAP, map);
975
976 }
977
978
979 static long spd_set_ram_size(const struct mem_controller *ctrl,
980                               struct mem_info *meminfo)
981 {
982         int i;
983
984         for (i = 0; i < DIMM_SOCKETS; i++) {
985                 struct dimm_size *sz = &(meminfo->sz[i]);
986                 u32 spd_device = ctrl->channel0[i];
987
988                 if (!(meminfo->dimm_mask & (1 << i))) {
989                         if (meminfo->dimm_mask & (1 << (DIMM_SOCKETS + i))) { /* channelB only? */
990                                 spd_device = ctrl->channel1[i];
991                         } else {
992                                 continue;
993                         }
994                 }
995
996                 spd_get_dimm_size(spd_device, sz);
997                 if (sz->per_rank == 0) {
998                         return -1; /* Report SPD error */
999                 }
1000                 set_dimm_size(ctrl, sz, i, meminfo);
1001                 set_dimm_cs_map(ctrl, sz, i, meminfo);
1002         }
1003         return meminfo->dimm_mask;
1004 }
1005
1006 static void route_dram_accesses(const struct mem_controller *ctrl,
1007                                 unsigned long base_k, unsigned long limit_k)
1008 {
1009         /* Route the addresses to the controller node */
1010         unsigned node_id;
1011         unsigned limit;
1012         unsigned base;
1013         unsigned index;
1014         unsigned limit_reg, base_reg;
1015         device_t device;
1016
1017         node_id = ctrl->node_id;
1018         index = (node_id << 3);
1019         limit = (limit_k << 2);
1020         limit &= 0xffff0000;
1021         limit -= 0x00010000;
1022         limit |= ( 0 << 8) | (node_id << 0);
1023         base = (base_k << 2);
1024         base &= 0xffff0000;
1025         base |= (0 << 8) | (1<<1) | (1<<0);
1026
1027         limit_reg = 0x44 + index;
1028         base_reg = 0x40 + index;
1029         for (device = PCI_DEV(0, 0x18, 1); device <= PCI_DEV(0, 0x1f, 1);
1030              device += PCI_DEV(0, 1, 0)) {
1031                 pci_write_config32(device, limit_reg, limit);
1032                 pci_write_config32(device, base_reg, base);
1033         }
1034 }
1035
1036 static void set_top_mem(unsigned tom_k, unsigned hole_startk)
1037 {
1038         /* Error if I don't have memory */
1039         if (!tom_k) {
1040                 die("No memory?");
1041         }
1042
1043         /* Report the amount of memory. */
1044         printk_debug("RAM end at 0x%08x kB\n", tom_k);
1045
1046         /* Now set top of memory */
1047         msr_t msr;
1048         if (tom_k > (4*1024*1024)) {
1049                 printk_raminit("Handling memory mapped above 4 GB\n");
1050                 printk_raminit("Upper RAM end at 0x%08x kB\n", tom_k);
1051                 msr.lo = (tom_k & 0x003fffff) << 10;
1052                 msr.hi = (tom_k & 0xffc00000) >> 22;
1053                 wrmsr(TOP_MEM2, msr);
1054                 printk_raminit("Correcting memory amount mapped below 4 GB\n");
1055         }
1056
1057         /* Leave a 64M hole between TOP_MEM and TOP_MEM2
1058          * so I can see my rom chip and other I/O devices.
1059          */
1060         if (tom_k >= 0x003f0000) {
1061 #if CONFIG_HW_MEM_HOLE_SIZEK != 0
1062                 if (hole_startk != 0) {
1063                         tom_k = hole_startk;
1064                 } else
1065 #endif
1066                 tom_k = 0x3f0000;
1067                 printk_raminit("Adjusting lower RAM end\n");
1068         }
1069         printk_raminit("Lower RAM end at 0x%08x kB\n", tom_k);
1070         msr.lo = (tom_k & 0x003fffff) << 10;
1071         msr.hi = (tom_k & 0xffc00000) >> 22;
1072         wrmsr(TOP_MEM, msr);
1073 }
1074
1075 static unsigned long interleave_chip_selects(const struct mem_controller *ctrl, int is_Width128)
1076 {
1077         /* 35 - 27 */
1078
1079         static const uint8_t csbase_low_f0_shift[] = {
1080          /* 128MB */       (14 - (13-5)),
1081          /* 256MB */       (15 - (13-5)),
1082          /* 512MB */       (15 - (13-5)),
1083          /* 512MB */       (16 - (13-5)),
1084          /* 512MB */       (16 - (13-5)),
1085          /* 1GB   */       (16 - (13-5)),
1086          /* 1GB   */       (16 - (13-5)),
1087          /* 2GB   */       (16 - (13-5)),
1088          /* 2GB   */       (17 - (13-5)),
1089          /* 4GB   */       (17 - (13-5)),
1090          /* 4GB   */       (16 - (13-5)),
1091          /* 8GB   */       (17 - (13-5)),
1092         };
1093
1094         /* cs_base_high is not changed */
1095
1096         uint32_t csbase_inc;
1097         int chip_selects, index;
1098         int bits;
1099         unsigned common_size;
1100         unsigned common_cs_mode;
1101         uint32_t csbase, csmask;
1102
1103         /* See if all of the memory chip selects are the same size
1104          * and if so count them.
1105          */
1106         chip_selects = 0;
1107         common_size = 0;
1108         common_cs_mode = 0xff;
1109         for (index = 0; index < 8; index++) {
1110                 unsigned size;
1111                 unsigned cs_mode;
1112                 uint32_t value;
1113
1114                 value = pci_read_config32(ctrl->f2, DRAM_CSBASE + (index << 2));
1115
1116                 /* Is it enabled? */
1117                 if (!(value & 1)) {
1118                         continue;
1119                 }
1120                 chip_selects++;
1121                 size = (value >> 19) & 0x3ff;
1122                 if (common_size == 0) {
1123                         common_size = size;
1124                 }
1125                 /* The size differed fail */
1126                 if (common_size != size) {
1127                         return 0;
1128                 }
1129
1130                 value = pci_read_config32(ctrl->f2, DRAM_BANK_ADDR_MAP);
1131                 cs_mode =( value >> ((index>>1)*4)) & 0xf;
1132                 if (common_cs_mode == 0xff) {
1133                         common_cs_mode = cs_mode;
1134                 }
1135                 /* The cs_mode differed fail */
1136                 if (common_cs_mode != cs_mode) {
1137                         return 0;
1138                 }
1139         }
1140
1141         /* Chip selects can only be interleaved when there is
1142          * more than one and their is a power of two of them.
1143          */
1144         bits = log2(chip_selects);
1145         if (((1 << bits) != chip_selects) || (bits < 1) || (bits > 3)) {
1146                 //chip_selects max = 8
1147                 return 0;
1148         }
1149
1150         /* Find the bits of csbase that we need to interleave on */
1151         csbase_inc = 1 << (csbase_low_f0_shift[common_cs_mode]);
1152         if (is_Width128) {
1153                 csbase_inc <<=1;
1154         }
1155
1156         /* Compute the initial values for csbase and csbask.
1157          * In csbase just set the enable bit and the base to zero.
1158          * In csmask set the mask bits for the size and page level interleave.
1159          */
1160         csbase = 0 | 1;
1161         csmask = (((common_size  << bits) - 1) << 19);
1162         csmask |= 0x3fe0 & ~((csbase_inc << bits) - csbase_inc);
1163         for (index = 0; index < 8; index++) {
1164                 uint32_t value;
1165
1166                 value = pci_read_config32(ctrl->f2, DRAM_CSBASE + (index << 2));
1167                 /* Is it enabled? */
1168                 if (!(value & 1)) {
1169                         continue;
1170                 }
1171                 pci_write_config32(ctrl->f2, DRAM_CSBASE + (index << 2), csbase);
1172                 if ((index & 1) == 0) {  //only have 4 CSMASK
1173                         pci_write_config32(ctrl->f2, DRAM_CSMASK + ((index>>1) << 2), csmask);
1174                 }
1175                 csbase += csbase_inc;
1176         }
1177
1178         printk_debug("Interleaved\n");
1179
1180         /* Return the memory size in K */
1181         return common_size << ((27-10) + bits);
1182 }
1183
1184 static unsigned long order_chip_selects(const struct mem_controller *ctrl)
1185 {
1186         unsigned long tom;
1187
1188         /* Remember which registers we have used in the high 8 bits of tom */
1189         tom = 0;
1190         for (;;) {
1191                 /* Find the largest remaining canidate */
1192                 unsigned index, canidate;
1193                 uint32_t csbase, csmask;
1194                 unsigned size;
1195                 csbase = 0;
1196                 canidate = 0;
1197                 for (index = 0; index < 8; index++) {
1198                         uint32_t value;
1199                         value = pci_read_config32(ctrl->f2, DRAM_CSBASE + (index << 2));
1200
1201                         /* Is it enabled? */
1202                         if (!(value & 1)) {
1203                                 continue;
1204                         }
1205
1206                         /* Is it greater? */
1207                         if (value <= csbase) {
1208                                 continue;
1209                         }
1210
1211                         /* Has it already been selected */
1212                         if (tom & (1 << (index + 24))) {
1213                                 continue;
1214                         }
1215                         /* I have a new canidate */
1216                         csbase = value;
1217                         canidate = index;
1218                 }
1219                 
1220                 /* See if I have found a new canidate */
1221                 if (csbase == 0) {
1222                         break;
1223                 }
1224
1225                 /* Remember the dimm size */
1226                 size = csbase >> 19;
1227
1228                 /* Remember I have used this register */
1229                 tom |= (1 << (canidate + 24));
1230
1231                 /* Recompute the cs base register value */
1232                 csbase = (tom << 19) | 1;
1233
1234                 /* Increment the top of memory */
1235                 tom += size;
1236
1237                 /* Compute the memory mask */
1238                 csmask = ((size -1) << 19);
1239                 csmask |= 0x3fe0;               /* For now don't optimize */
1240
1241                 /* Write the new base register */
1242                 pci_write_config32(ctrl->f2, DRAM_CSBASE + (canidate << 2), csbase);
1243                 /* Write the new mask register */
1244                 if ((canidate & 1) == 0) {  //only have 4 CSMASK
1245                         pci_write_config32(ctrl->f2, DRAM_CSMASK + ((canidate >> 1) << 2), csmask);
1246                 }
1247
1248         }
1249         /* Return the memory size in K */
1250         return (tom & ~0xff000000) << (27-10);
1251 }
1252
1253 static unsigned long memory_end_k(const struct mem_controller *ctrl, int max_node_id)
1254 {
1255         unsigned node_id;
1256         unsigned end_k;
1257         /* Find the last memory address used */
1258         end_k = 0;
1259         for (node_id = 0; node_id < max_node_id; node_id++) {
1260                 uint32_t limit, base;
1261                 unsigned index;
1262                 index = node_id << 3;
1263                 base = pci_read_config32(ctrl->f1, 0x40 + index);
1264                 /* Only look at the limit if the base is enabled */
1265                 if ((base & 3) == 3) {
1266                         limit = pci_read_config32(ctrl->f1, 0x44 + index);
1267                         end_k = ((limit + 0x00010000) & 0xffff0000) >> 2;
1268                 }
1269         }
1270         return end_k;
1271 }
1272
1273 static void order_dimms(const struct mem_controller *ctrl,
1274                          struct mem_info *meminfo)
1275 {
1276         unsigned long tom_k, base_k;
1277
1278         if (read_option(CMOS_VSTART_interleave_chip_selects,
1279             CMOS_VLEN_interleave_chip_selects, 1) != 0) {
1280                 tom_k = interleave_chip_selects(ctrl, meminfo->is_Width128);
1281         } else {
1282                 printk_debug("Interleaving disabled\n");
1283                 tom_k = 0;
1284         }
1285
1286         if (!tom_k) {
1287                 tom_k = order_chip_selects(ctrl);
1288         }
1289
1290         /* Compute the memory base address */
1291         base_k = memory_end_k(ctrl, ctrl->node_id);
1292         tom_k += base_k;
1293         route_dram_accesses(ctrl, base_k, tom_k);
1294         set_top_mem(tom_k, 0);
1295 }
1296
1297 static long disable_dimm(const struct mem_controller *ctrl, unsigned index,
1298                           struct mem_info *meminfo)
1299 {
1300         printk_debug("disabling dimm %02x\n", index);
1301         if (!(meminfo->dimm_mask & 0x0F) && (meminfo->dimm_mask & 0xF0)) { /* channelB only? */
1302                 pci_write_config32(ctrl->f2, DRAM_CSBASE + (((index << 1) + 4) << 2), 0);
1303                 pci_write_config32(ctrl->f2, DRAM_CSBASE + (((index << 1) + 5) << 2), 0);
1304         } else {
1305                 pci_write_config32(ctrl->f2, DRAM_CSBASE + (((index << 1) + 0) << 2), 0);
1306                 pci_write_config32(ctrl->f2, DRAM_CSBASE + (((index << 1) + 1) << 2), 0);
1307 #if QRANK_DIMM_SUPPORT == 1
1308                 if (meminfo->sz[index].rank == 4) {
1309                         pci_write_config32(ctrl->f2, DRAM_CSBASE + (((index << 1) + 4) << 2), 0);
1310                         pci_write_config32(ctrl->f2, DRAM_CSBASE + (((index << 1) + 5) << 2), 0);
1311                 }
1312 #endif
1313         }
1314
1315         meminfo->dimm_mask &= ~(1 << index);
1316         return meminfo->dimm_mask;
1317 }
1318
1319 static long spd_handle_unbuffered_dimms(const struct mem_controller *ctrl,
1320                                          struct mem_info *meminfo)
1321 {
1322         int i;
1323         uint32_t registered;
1324         uint32_t dcl;
1325         registered = 0;
1326         for (i = 0; (i < DIMM_SOCKETS); i++) {
1327                 int value;
1328                 u32 spd_device = ctrl->channel0[i];
1329                 if (!(meminfo->dimm_mask & (1 << i))) {
1330                         if (meminfo->dimm_mask & (1 << (DIMM_SOCKETS + i))) { /* channelB only? */
1331                                 spd_device = ctrl->channel1[i];
1332                         } else {
1333                                 continue;
1334                         }
1335                 }
1336                 value = spd_read_byte(spd_device, SPD_DIMM_TYPE);
1337                 if (value < 0) {
1338                         return -1;
1339                 }
1340
1341                 /* Registered dimm ? */
1342                 value &= 0x3f;
1343                 if ((value == SPD_DIMM_TYPE_RDIMM) || (value == SPD_DIMM_TYPE_mRDIMM)) {
1344                         //check SPD_MOD_ATTRIB to verify it is SPD_MOD_ATTRIB_REGADC (0x11)?
1345                         registered |= (1<<i);
1346                 }
1347         }
1348
1349         if (is_opteron(ctrl)) {
1350 #if 0
1351                 if ( registered != (meminfo->dimm_mask & ((1<<DIMM_SOCKETS)-1)) ) {
1352                         meminfo->dimm_mask &= (registered | (registered << DIMM_SOCKETS) ); //disable unbuffed dimm
1353 //                      die("Mixed buffered and registered dimms not supported");
1354                 }
1355                 //By yhlu for debug M2, s1g1 can do dual channel, but it use unbuffer DIMM
1356                 if (!registered) {
1357                         die("Unbuffered Dimms not supported on Opteron");
1358                 }
1359 #endif
1360         }
1361
1362
1363         dcl = pci_read_config32(ctrl->f2, DRAM_CONFIG_LOW);
1364         dcl &= ~DCL_UnBuffDimm;
1365         meminfo->is_registered = 1;
1366         if (!registered) {
1367                 dcl |= DCL_UnBuffDimm;
1368                 meminfo->is_registered = 0;
1369         }
1370         pci_write_config32(ctrl->f2, DRAM_CONFIG_LOW, dcl);
1371
1372         if (meminfo->is_registered) {
1373                 printk_spew("Registered\n");
1374         } else {
1375                 printk_spew("Unbuffered\n");
1376         }
1377         return meminfo->dimm_mask;
1378 }
1379
1380 static unsigned int spd_detect_dimms(const struct mem_controller *ctrl)
1381 {
1382         unsigned dimm_mask;
1383         int i;
1384         dimm_mask = 0;
1385         for (i = 0; i < DIMM_SOCKETS; i++) {
1386                 int byte;
1387                 unsigned device;
1388                 device = ctrl->channel0[i];
1389                 printk_raminit("DIMM socket %i, channel 0 SPD device is 0x%02x\n", i, device);
1390                 if (device) {
1391                         byte = spd_read_byte(ctrl->channel0[i], SPD_MEM_TYPE);  /* Type */
1392                         if (byte == SPD_MEM_TYPE_SDRAM_DDR2) {
1393                                 dimm_mask |= (1 << i);
1394                         }
1395                 }
1396                 device = ctrl->channel1[i];
1397                 printk_raminit("DIMM socket %i, channel 1 SPD device is 0x%02x\n", i, device);
1398                 if (device) {
1399                         byte = spd_read_byte(ctrl->channel1[i], SPD_MEM_TYPE);
1400                         if (byte == SPD_MEM_TYPE_SDRAM_DDR2) {
1401                                 dimm_mask |= (1 << (i + DIMM_SOCKETS));
1402                         }
1403                 }
1404         }
1405         return dimm_mask;
1406 }
1407
1408 static long spd_enable_2channels(const struct mem_controller *ctrl, struct mem_info *meminfo)
1409 {
1410         int i;
1411         uint32_t nbcap;
1412         /* SPD addresses to verify are identical */
1413         static const uint8_t addresses[] = {
1414                 2,      /* Type should be DDR2 SDRAM */
1415                 3,      /* *Row addresses */
1416                 4,      /* *Column addresses */
1417                 5,      /* *Number of DIMM Ranks */
1418                 6,      /* *Module Data Width*/
1419                 11,     /* *DIMM Conf Type */
1420                 13,     /* *Pri SDRAM Width */
1421                 17,     /* *Logical Banks */
1422                 20,     /* *DIMM Type Info */
1423                 21,     /* *SDRAM Module Attributes */
1424                 27,     /* *tRP Row precharge time */
1425                 28,     /* *Minimum Row Active to Row Active Delay (tRRD) */
1426                 29,     /* *tRCD RAS to CAS */
1427                 30,     /* *tRAS Activate to Precharge */
1428                 36,     /* *Write recovery time (tWR) */
1429                 37,     /* *Internal write to read command delay (tRDP) */
1430                 38,     /* *Internal read to precharge command delay (tRTP) */
1431                 40,     /* *Extension of Byte 41 tRC and Byte 42 tRFC */
1432                 41,     /* *Minimum Active to Active/Auto Refresh Time(Trc) */
1433                 42,     /* *Minimum Auto Refresh Command Time(Trfc) */
1434                 /* The SPD addresses 18, 9, 23, 26 need special treatment like
1435                  * in spd_set_memclk. Right now they cause many false negatives.
1436                  * Keep them at the end to see other mismatches (if any).
1437                  */
1438                 18,     /* *Supported CAS Latencies */
1439                 9,      /* *Cycle time at highest CAS Latency CL=X */
1440                 23,     /* *Cycle time at CAS Latency (CLX - 1) */
1441                 26,     /* *Cycle time at CAS Latency (CLX - 2) */
1442         };
1443         u32 dcl, dcm;
1444         u8 common_cl;
1445
1446 /* S1G1 and AM2 sockets are Mod64BitMux capable. */
1447 #if CONFIG_CPU_SOCKET_TYPE == 0x11 || CONFIG_CPU_SOCKET_TYPE == 0x12
1448         u8 mux_cap = 1;
1449 #else
1450         u8 mux_cap = 0;
1451 #endif
1452
1453         /* If the dimms are not in pairs do not do dual channels */
1454         if ((meminfo->dimm_mask & ((1 << DIMM_SOCKETS) - 1)) !=
1455                 ((meminfo->dimm_mask >> DIMM_SOCKETS) & ((1 << DIMM_SOCKETS) - 1))) {
1456                 goto single_channel;
1457         }
1458         /* If the cpu is not capable of doing dual channels don't do dual channels */
1459         nbcap = pci_read_config32(ctrl->f3, NORTHBRIDGE_CAP);
1460         if (!(nbcap & NBCAP_128Bit)) {
1461                 goto single_channel;
1462         }
1463         for (i = 0; (i < 4) && (ctrl->channel0[i]); i++) {
1464                 unsigned device0, device1;
1465                 int value0, value1;
1466                 int j;
1467                 /* If I don't have a dimm skip this one */
1468                 if (!(meminfo->dimm_mask & (1 << i))) {
1469                         continue;
1470                 }
1471                 device0 = ctrl->channel0[i];
1472                 device1 = ctrl->channel1[i];
1473                 /* Abort if the chips don't support a common CAS latency. */
1474                 common_cl = spd_read_byte(device0, 18) & spd_read_byte(device1, 18);
1475                 if (!common_cl) {
1476                         printk_debug("No common CAS latency supported\n");
1477                         goto single_channel;
1478                 } else {
1479                         printk_raminit("Common CAS latency bitfield: 0x%02x\n", common_cl);
1480                 }
1481                 for (j = 0; j < ARRAY_SIZE(addresses); j++) {
1482                         unsigned addr;
1483                         addr = addresses[j];
1484                         value0 = spd_read_byte(device0, addr);
1485                         if (value0 < 0) {
1486                                 return -1;
1487                         }
1488                         value1 = spd_read_byte(device1, addr);
1489                         if (value1 < 0) {
1490                                 return -1;
1491                         }
1492                         if (value0 != value1) {
1493                                 printk_raminit("SPD values differ between channel 0/1 for byte %i\n", addr);
1494                                 goto single_channel;
1495                         }
1496                 }
1497         }
1498         printk_spew("Enabling dual channel memory\n");
1499         dcl = pci_read_config32(ctrl->f2, DRAM_CONFIG_LOW);
1500         dcl &= ~DCL_BurstLength32;  /*  32byte mode may be preferred in platforms that include graphics controllers that generate a lot of 32-bytes system memory accesses
1501                                         32byte mode is not supported when the DRAM interface is 128 bits wides, even 32byte mode is set, system still use 64 byte mode  */
1502         dcl |= DCL_Width128;
1503         pci_write_config32(ctrl->f2, DRAM_CONFIG_LOW, dcl);
1504         meminfo->is_Width128 = 1;
1505         return meminfo->dimm_mask;
1506
1507  single_channel:
1508         meminfo->is_Width128 = 0;
1509         meminfo->is_64MuxMode = 0;
1510
1511         /* single dimm */
1512         if ((meminfo->dimm_mask & ((1 << DIMM_SOCKETS) - 1)) !=
1513            ((meminfo->dimm_mask >> DIMM_SOCKETS) & ((1 << DIMM_SOCKETS) - 1))) {
1514                 if (((meminfo->dimm_mask >> DIMM_SOCKETS) & ((1 << DIMM_SOCKETS) - 1))) {
1515                         /* mux capable and single dimm in channelB */
1516                         if (mux_cap) {
1517                                 printk_spew("Enable 64MuxMode & BurstLength32\n");
1518                                 dcm = pci_read_config32(ctrl->f2, DRAM_CTRL_MISC);
1519                                 dcm |= DCM_Mode64BitMux;
1520                                 pci_write_config32(ctrl->f2, DRAM_CTRL_MISC, dcm);
1521                                 dcl = pci_read_config32(ctrl->f2, DRAM_CONFIG_LOW);
1522                                 //dcl |= DCL_BurstLength32; /* 32byte mode for channelB only */
1523                                 pci_write_config32(ctrl->f2, DRAM_CONFIG_LOW, dcl);
1524                                 meminfo->is_64MuxMode = 1;
1525                         } else {
1526                                 meminfo->dimm_mask &= ~((1 << (DIMM_SOCKETS * 2)) - (1 << DIMM_SOCKETS));
1527                         }
1528                 }
1529         } else { /* unmatched dual dimms ? */
1530                 /* unmatched dual dimms not supported by meminit code. Use single channelA dimm. */
1531                 meminfo->dimm_mask &= ~((1 << (DIMM_SOCKETS * 2)) - (1 << DIMM_SOCKETS));
1532                 printk_spew("Unmatched dual dimms. Use single channelA dimm.\n");
1533         }
1534         return meminfo->dimm_mask;
1535 }
1536
1537 struct mem_param {
1538         uint16_t cycle_time;
1539         uint8_t divisor; /* In 1/40 ns increments */
1540         uint8_t TrwtTO;
1541         uint8_t Twrrd;
1542         uint8_t Twrwr;
1543         uint8_t Trdrd;
1544         uint8_t DcqByPassMax;
1545         uint32_t dch_memclk;
1546         char name[9];
1547 };
1548
1549         static const struct mem_param speed[] = {
1550                 {
1551                         .name       = "200MHz",
1552                         .cycle_time = 0x500,
1553                         .divisor    = 200, // how many 1/40ns per clock
1554                         .dch_memclk = DCH_MemClkFreq_200MHz, //0
1555                         .TrwtTO     = 7,
1556                         .Twrrd      = 2,
1557                         .Twrwr      = 2,
1558                         .Trdrd      = 3,
1559                         .DcqByPassMax = 4,
1560
1561                 },
1562                 {
1563                         .name       = "266MHz",
1564                         .cycle_time = 0x375,
1565                         .divisor    = 150, //????
1566                         .dch_memclk = DCH_MemClkFreq_266MHz, //1
1567                         .TrwtTO     = 7,
1568                         .Twrrd      = 2,
1569                         .Twrwr      = 2,
1570                         .Trdrd      = 3,
1571                         .DcqByPassMax = 4,
1572                 },
1573                  {
1574                         .name       = "333MHz",
1575                         .cycle_time = 0x300,
1576                         .divisor    = 120,
1577                         .dch_memclk = DCH_MemClkFreq_333MHz, //2
1578                         .TrwtTO     = 7,
1579                         .Twrrd      = 2,
1580                         .Twrwr      = 2,
1581                         .Trdrd      = 3,
1582                         .DcqByPassMax = 4,
1583
1584                  },
1585                 {
1586                         .name       = "400MHz",
1587                         .cycle_time = 0x250,
1588                         .divisor    = 100,
1589                         .dch_memclk = DCH_MemClkFreq_400MHz,//3
1590                         .TrwtTO     = 7,
1591                         .Twrrd      = 2,
1592                         .Twrwr      = 2,
1593                         .Trdrd      = 3,
1594                         .DcqByPassMax = 4,
1595                 },
1596                 {
1597                         .cycle_time = 0x000,
1598                 },
1599         };
1600
1601 static const struct mem_param *get_mem_param(unsigned min_cycle_time)
1602 {
1603
1604         const struct mem_param *param;
1605         for (param = &speed[0]; param->cycle_time ; param++) {
1606                 if (min_cycle_time > (param+1)->cycle_time) {
1607                         break;
1608                 }
1609         }
1610         if (!param->cycle_time) {
1611                 die("min_cycle_time to low");
1612         }
1613         printk_spew("%s\n", param->name);
1614         return param;
1615 }
1616
1617 static uint8_t get_exact_divisor(int i, uint8_t divisor)
1618 {
1619         //input divisor could be 200(200), 150(266), 120(333), 100 (400)
1620         static const uint8_t dv_a[] = {
1621                /* 200  266  333  400 */
1622          /*4 */   250, 250, 250, 250,
1623          /*5 */   200, 200, 200, 100,
1624          /*6 */   200, 166, 166, 100,
1625          /*7 */   200, 171, 142, 100,
1626
1627           /*8 */   200, 150, 125, 100,
1628           /*9 */   200, 156, 133, 100,
1629           /*10*/   200, 160, 120, 100,
1630           /*11*/   200, 163, 127, 100,
1631
1632           /*12*/   200, 150, 133, 100,
1633           /*13*/   200, 153, 123, 100,
1634           /*14*/   200, 157, 128, 100,
1635           /*15*/   200, 160, 120, 100,
1636         };
1637
1638         
1639         int index;
1640         msr_t msr;
1641
1642         /* Check for FID control support */
1643         struct cpuid_result cpuid1;
1644         cpuid1 = cpuid(0x80000007);
1645         if( cpuid1.edx & 0x02 ) {
1646                 /* Use current FID */
1647                 unsigned fid_cur;
1648                 msr = rdmsr(0xc0010042);
1649                 fid_cur = msr.lo & 0x3f;
1650
1651                 index = fid_cur>>1;
1652         } else {
1653                 /* Use startup FID */
1654                 unsigned fid_start;
1655                 msr = rdmsr(0xc0010015);
1656                 fid_start = (msr.lo & (0x3f << 24));
1657                 
1658                 index = fid_start>>25;
1659         }
1660
1661         if (index>12) return divisor;
1662
1663         if (i>3) return divisor;
1664
1665         return dv_a[index * 4+i];
1666
1667 }
1668
1669
1670 struct spd_set_memclk_result {
1671         const struct mem_param *param;
1672         long dimm_mask;
1673 };
1674
1675
1676 static unsigned convert_to_linear(unsigned value)
1677 {
1678         static const unsigned fraction[] = { 0x25, 0x33, 0x66, 0x75 };
1679         unsigned valuex;
1680
1681         /* We need to convert value to more readable */
1682         if ((value & 0xf) < 10) { //no .25, .33, .66, .75
1683                 value <<= 4;
1684         } else {
1685                 valuex = ((value & 0xf0) << 4) | fraction [(value & 0xf)-10];
1686                 value = valuex;
1687         }
1688         return value;
1689 }
1690
1691 static const uint8_t latency_indicies[] = { 25, 23, 9 };
1692
1693 int find_optimum_spd_latency(u32 spd_device, unsigned *min_latency, unsigned *min_cycle_time)
1694 {
1695         int new_cycle_time, new_latency;
1696         int index;
1697         int latencies;
1698         int latency;
1699
1700         /* First find the supported CAS latencies
1701          * Byte 18 for DDR SDRAM is interpreted:
1702          * bit 3 == CAS Latency = 3
1703          * bit 4 == CAS Latency = 4
1704          * bit 5 == CAS Latency = 5
1705          * bit 6 == CAS Latency = 6
1706          */
1707         new_cycle_time = 0x500;
1708         new_latency = 6;
1709
1710         latencies = spd_read_byte(spd_device, SPD_CAS_LAT);
1711         if (latencies <= 0)
1712                 return 1;
1713
1714         printk_raminit("\tlatencies: %08x\n", latencies);
1715         /* Compute the lowest cas latency which can be expressed in this
1716          * particular SPD EEPROM. You can store at most settings for 3
1717          * contiguous CAS latencies, so by taking the highest CAS
1718          * latency maked as supported in the SPD and subtracting 2 you
1719          * get the lowest expressable CAS latency. That latency is not
1720          * necessarily supported, but a (maybe invalid) entry exists
1721          * for it.
1722          */
1723         latency = log2(latencies) - 2;
1724
1725         /* Loop through and find a fast clock with a low latency */
1726         for (index = 0; index < 3; index++, latency++) {
1727                 int value;
1728                 if ((latency < 3) || (latency > 6) ||
1729                         (!(latencies & (1 << latency)))) {
1730                         continue;
1731                 }
1732                 value = spd_read_byte(spd_device, latency_indicies[index]);
1733                 if (value < 0) {
1734                         return -1;
1735                 }
1736
1737                 printk_raminit("\tindex: %08x\n", index);
1738                 printk_raminit("\t\tlatency: %08x\n", latency);
1739                 printk_raminit("\t\tvalue1: %08x\n", value);
1740
1741                 value = convert_to_linear(value);
1742
1743                 printk_raminit("\t\tvalue2: %08x\n", value);
1744
1745                 /* Only increase the latency if we decrease the clock */
1746                 if (value >= *min_cycle_time ) {
1747                         if (value < new_cycle_time) {
1748                                 new_cycle_time = value;
1749                                 new_latency = latency;
1750                         } else if (value == new_cycle_time) {
1751                                 if (new_latency > latency) {
1752                                         new_latency = latency;
1753                                 }
1754                         }
1755                 }
1756                 printk_raminit("\t\tnew_cycle_time: %08x\n", new_cycle_time);
1757                 printk_raminit("\t\tnew_latency: %08x\n", new_latency);
1758
1759         }
1760
1761         if (new_latency > 6){
1762                 return 1;
1763         }
1764
1765         /* Does min_latency need to be increased? */
1766         if (new_cycle_time > *min_cycle_time) {
1767                 *min_cycle_time = new_cycle_time;
1768         }
1769
1770         /* Does min_cycle_time need to be increased? */
1771         if (new_latency > *min_latency) {
1772                 *min_latency = new_latency;
1773         }
1774
1775         printk_raminit("2 min_cycle_time: %08x\n", *min_cycle_time);
1776         printk_raminit("2 min_latency: %08x\n", *min_latency);
1777
1778         return 0;
1779 }
1780
1781 static struct spd_set_memclk_result spd_set_memclk(const struct mem_controller *ctrl, struct mem_info *meminfo)
1782 {
1783         /* Compute the minimum cycle time for these dimms */
1784         struct spd_set_memclk_result result;
1785         unsigned min_cycle_time, min_latency, bios_cycle_time;
1786         int i;
1787         uint32_t value;
1788
1789         static const uint16_t min_cycle_times[] = { // use full speed to compare
1790                 [NBCAP_MEMCLK_NOLIMIT] = 0x250, /*2.5ns */
1791                 [NBCAP_MEMCLK_333MHZ] = 0x300, /* 3.0ns */
1792                 [NBCAP_MEMCLK_266MHZ] = 0x375, /* 3.75ns */
1793                 [NBCAP_MEMCLK_200MHZ] = 0x500, /* 5.0s */
1794         };
1795
1796
1797         value = pci_read_config32(ctrl->f3, NORTHBRIDGE_CAP);
1798         min_cycle_time = min_cycle_times[(value >> NBCAP_MEMCLK_SHIFT) & NBCAP_MEMCLK_MASK];
1799         bios_cycle_time = min_cycle_times[
1800                 read_option(CMOS_VSTART_max_mem_clock, CMOS_VLEN_max_mem_clock, 0)];
1801         if (bios_cycle_time > min_cycle_time) {
1802                 min_cycle_time = bios_cycle_time;
1803         }
1804         min_latency = 3;
1805
1806         printk_raminit("1 min_cycle_time: %08x\n", min_cycle_time);
1807
1808         /* Compute the least latency with the fastest clock supported
1809          * by both the memory controller and the dimms.
1810          */
1811         for (i = 0; i < DIMM_SOCKETS; i++) {
1812                 u32 spd_device;
1813
1814                 printk_raminit("1.1 dimm_mask: %08x\n", meminfo->dimm_mask);
1815                 printk_raminit("i: %08x\n",i);
1816
1817                 if (meminfo->dimm_mask & (1 << i)) {
1818                         spd_device = ctrl->channel0[i];
1819                         printk_raminit("Channel 0 settings:\n");
1820
1821                         switch (find_optimum_spd_latency(spd_device, &min_latency, &min_cycle_time)) {
1822                         case -1:
1823                                 goto hw_error;
1824                                 break;
1825                         case 1:
1826                                 continue;
1827                         }
1828                 }
1829                 if (meminfo->dimm_mask & (1 << (DIMM_SOCKETS + i))) {
1830                         spd_device = ctrl->channel1[i];
1831                         printk_raminit("Channel 1 settings:\n");
1832
1833                         switch (find_optimum_spd_latency(spd_device, &min_latency, &min_cycle_time)) {
1834                         case -1:
1835                                 goto hw_error;
1836                                 break;
1837                         case 1:
1838                                 continue;
1839                         }
1840                 }
1841                 
1842         }
1843         /* Make a second pass through the dimms and disable
1844          * any that cannot support the selected memclk and cas latency.
1845          */
1846
1847         printk_raminit("3 min_cycle_time: %08x\n", min_cycle_time);
1848         printk_raminit("3 min_latency: %08x\n", min_latency);
1849
1850         for (i = 0; (i < DIMM_SOCKETS); i++) {
1851                 int latencies;
1852                 int latency;
1853                 int index;
1854                 int val;
1855                 u32 spd_device = ctrl->channel0[i];
1856
1857                 if (!(meminfo->dimm_mask & (1 << i))) {
1858                         if (meminfo->dimm_mask & (1 << (DIMM_SOCKETS + i))) { /* channelB only? */
1859                                 spd_device = ctrl->channel1[i];
1860                         } else {
1861                                 continue;
1862                         }
1863                 }
1864
1865                 latencies = spd_read_byte(spd_device, SPD_CAS_LAT);
1866                 if (latencies < 0) goto hw_error;
1867                 if (latencies == 0) {
1868                         continue;
1869                 }
1870
1871                 /* Compute the lowest cas latency supported */
1872                 latency = log2(latencies) -2;
1873
1874                 /* Walk through searching for the selected latency */
1875                 for (index = 0; index < 3; index++, latency++) {
1876                         if (!(latencies & (1 << latency))) {
1877                                 continue;
1878                         }
1879                         if (latency == min_latency)
1880                                 break;
1881                 }
1882                 /* If I can't find the latency or my index is bad error */
1883                 if ((latency != min_latency) || (index >= 3)) {
1884                         goto dimm_err;
1885                 }
1886
1887                 /* Read the min_cycle_time for this latency */
1888                 val = spd_read_byte(spd_device, latency_indicies[index]);
1889                 if (val < 0) goto hw_error;
1890
1891                 val = convert_to_linear(val);
1892                 /* All is good if the selected clock speed
1893                  * is what I need or slower.
1894                  */
1895                 if (val <= min_cycle_time) {
1896                         continue;
1897                 }
1898                 /* Otherwise I have an error, disable the dimm */
1899         dimm_err:
1900                 meminfo->dimm_mask = disable_dimm(ctrl, i, meminfo);
1901         }
1902
1903         printk_raminit("4 min_cycle_time: %08x\n", min_cycle_time);
1904
1905         /* Now that I know the minimum cycle time lookup the memory parameters */
1906         result.param = get_mem_param(min_cycle_time);
1907
1908         /* Update DRAM Config High with our selected memory speed */
1909         value = pci_read_config32(ctrl->f2, DRAM_CONFIG_HIGH);
1910         value &= ~(DCH_MemClkFreq_MASK << DCH_MemClkFreq_SHIFT);
1911
1912         value |= result.param->dch_memclk << DCH_MemClkFreq_SHIFT;
1913         pci_write_config32(ctrl->f2, DRAM_CONFIG_HIGH, value);
1914
1915         printk_debug("%s\n", result.param->name);
1916
1917         /* Update DRAM Timing Low with our selected cas latency */
1918         value = pci_read_config32(ctrl->f2, DRAM_TIMING_LOW);
1919         value &= ~(DTL_TCL_MASK << DTL_TCL_SHIFT);
1920         value |= (min_latency - DTL_TCL_BASE)  << DTL_TCL_SHIFT;
1921         pci_write_config32(ctrl->f2, DRAM_TIMING_LOW, value);
1922
1923         result.dimm_mask = meminfo->dimm_mask;
1924         return result;
1925  hw_error:
1926         result.param = (const struct mem_param *)0;
1927         result.dimm_mask = -1;
1928         return result;
1929 }
1930
1931 static unsigned convert_to_1_4(unsigned value)
1932 {
1933         static const uint8_t fraction[] = { 0, 1, 2, 2, 3, 3, 0 };
1934         unsigned valuex;
1935
1936         /* We need to convert value to more readable */
1937         valuex =  fraction [value & 0x7];
1938         return valuex;
1939 }
1940
1941 int get_dimm_Trc_clocks(u32 spd_device, const struct mem_param *param)
1942 {
1943         int value;
1944         int value2;
1945         int clocks;
1946         value = spd_read_byte(spd_device, SPD_TRC);
1947         if (value < 0)
1948                 return -1;
1949         printk_raminit("update_dimm_Trc: tRC (41) = %08x\n", value);
1950
1951         value2 = spd_read_byte(spd_device, SPD_TRC -1);
1952         value <<= 2;
1953         value += convert_to_1_4(value2>>4);
1954
1955         value *= 10;
1956         printk_raminit("update_dimm_Trc: tRC final value = %i\n", value);
1957
1958         clocks = (value + param->divisor - 1)/param->divisor;
1959         printk_raminit("update_dimm_Trc: clocks = %i\n", clocks);
1960
1961         if (clocks < DTL_TRC_MIN) {
1962 #warning We should die here or at least disable this bank.
1963                 printk_notice("update_dimm_Trc: can't refresh fast enough, "
1964                         "want %i clocks, can %i clocks\n", clocks, DTL_TRC_MIN);
1965                 clocks = DTL_TRC_MIN;
1966         }
1967         return clocks;
1968 }
1969
1970 static int update_dimm_Trc(const struct mem_controller *ctrl,
1971                             const struct mem_param *param,
1972                             int i, long dimm_mask)
1973 {
1974         int clocks, old_clocks;
1975         uint32_t dtl;
1976         u32 spd_device = ctrl->channel0[i];
1977
1978         if (!(dimm_mask & (1 << i)) && (dimm_mask & (1 << (DIMM_SOCKETS + i)))) { /* channelB only? */
1979                 spd_device = ctrl->channel1[i];
1980         }
1981
1982         clocks = get_dimm_Trc_clocks(spd_device, param);
1983         if (clocks == -1)
1984                 return clocks;
1985         if (clocks > DTL_TRC_MAX) {
1986                 return 0;
1987         }
1988         printk_raminit("update_dimm_Trc: clocks after adjustment = %i\n", clocks);
1989
1990         dtl = pci_read_config32(ctrl->f2, DRAM_TIMING_LOW);
1991         old_clocks = ((dtl >> DTL_TRC_SHIFT) & DTL_TRC_MASK) + DTL_TRC_BASE;
1992         if (old_clocks >= clocks) {  //?? someone did it
1993                 // clocks = old_clocks;
1994                 return 1;
1995         }
1996         dtl &= ~(DTL_TRC_MASK << DTL_TRC_SHIFT);
1997         dtl |=  ((clocks - DTL_TRC_BASE) << DTL_TRC_SHIFT);
1998         pci_write_config32(ctrl->f2, DRAM_TIMING_LOW, dtl);
1999         return 1;
2000 }
2001
2002 static int update_dimm_Trfc(const struct mem_controller *ctrl, const struct mem_param *param, int i, struct mem_info *meminfo)
2003 {
2004         unsigned clocks, old_clocks;
2005         uint32_t dth;
2006         int value;
2007         u8 ch_b = 0;
2008         u32 spd_device = ctrl->channel0[i];
2009
2010         if (!(meminfo->dimm_mask & (1 << i)) && (meminfo->dimm_mask & (1 << (DIMM_SOCKETS + i)))) { /* channelB only? */
2011                 spd_device = ctrl->channel1[i];
2012                 ch_b = 2; /* offset to channelB trfc setting */
2013         }
2014
2015         //get the cs_size --> logic dimm size
2016         value = spd_read_byte(spd_device, SPD_PRI_WIDTH);
2017         if (value < 0) {
2018                 return -1;
2019         }
2020
2021         value = 6 - log2(value); //4-->4, 8-->3, 16-->2
2022
2023         clocks = meminfo->sz[i].per_rank - 27 + 2 - value;
2024
2025         dth = pci_read_config32(ctrl->f2, DRAM_TIMING_HIGH);
2026
2027         old_clocks = ((dth >> (DTH_TRFC0_SHIFT + ((i + ch_b) * 3))) & DTH_TRFC_MASK);
2028
2029         if (old_clocks >= clocks) { // some one did it?
2030                 return 1;
2031         }
2032         dth &= ~(DTH_TRFC_MASK << (DTH_TRFC0_SHIFT + ((i + ch_b) * 3)));
2033         dth |= clocks  << (DTH_TRFC0_SHIFT + ((i + ch_b) * 3));
2034         pci_write_config32(ctrl->f2, DRAM_TIMING_HIGH, dth);
2035         return 1;
2036 }
2037
2038 static int update_dimm_TT_1_4(const struct mem_controller *ctrl, const struct mem_param *param, int i, long dimm_mask,
2039                                         unsigned TT_REG,
2040                                         unsigned SPD_TT, unsigned TT_SHIFT, unsigned TT_MASK, unsigned TT_BASE, unsigned TT_MIN, unsigned TT_MAX )
2041 {
2042         unsigned clocks, old_clocks;
2043         uint32_t dtl;
2044         int value;
2045         u32 spd_device = ctrl->channel0[i];
2046
2047         if (!(dimm_mask & (1 << i)) && (dimm_mask & (1 << (DIMM_SOCKETS + i)))) { /* channelB only? */
2048                 spd_device = ctrl->channel1[i];
2049         }
2050
2051         value = spd_read_byte(spd_device, SPD_TT); //already in 1/4 ns
2052         if (value < 0) return -1;
2053         value *=10;
2054         clocks = (value + param->divisor -1)/param->divisor;
2055         if (clocks < TT_MIN) {
2056                 clocks = TT_MIN;
2057         }
2058         
2059         if (clocks > TT_MAX) {
2060                 printk_info("warning spd byte : %x = %x > TT_MAX: %x, setting TT_MAX", SPD_TT, value, TT_MAX);
2061                 clocks = TT_MAX;
2062         }
2063
2064         dtl = pci_read_config32(ctrl->f2, TT_REG);
2065
2066         old_clocks = ((dtl >> TT_SHIFT) & TT_MASK) + TT_BASE;
2067         if (old_clocks >= clocks) { //some one did it?
2068 //              clocks = old_clocks;
2069                 return 1;
2070         }
2071         dtl &= ~(TT_MASK << TT_SHIFT);
2072         dtl |= ((clocks - TT_BASE) << TT_SHIFT);
2073         pci_write_config32(ctrl->f2, TT_REG, dtl);
2074         return 1;
2075 }
2076
2077 static int update_dimm_Trcd(const struct mem_controller *ctrl,
2078                              const struct mem_param *param, int i, long dimm_mask)
2079 {
2080         return update_dimm_TT_1_4(ctrl, param, i, dimm_mask, DRAM_TIMING_LOW, SPD_TRCD, DTL_TRCD_SHIFT, DTL_TRCD_MASK, DTL_TRCD_BASE, DTL_TRCD_MIN, DTL_TRCD_MAX);
2081 }
2082
2083 static int update_dimm_Trrd(const struct mem_controller *ctrl, const struct mem_param *param, int i, long dimm_mask)
2084 {
2085         return update_dimm_TT_1_4(ctrl, param, i, dimm_mask, DRAM_TIMING_LOW, SPD_TRRD, DTL_TRRD_SHIFT, DTL_TRRD_MASK, DTL_TRRD_BASE, DTL_TRRD_MIN, DTL_TRRD_MAX);
2086 }
2087
2088 static int update_dimm_Tras(const struct mem_controller *ctrl, const struct mem_param *param, int i, long dimm_mask)
2089 {
2090         unsigned clocks, old_clocks;
2091         uint32_t dtl;
2092         int value;
2093         u32 spd_device = ctrl->channel0[i];
2094
2095         if (!(dimm_mask & (1 << i)) && (dimm_mask & (1 << (DIMM_SOCKETS + i)))) { /* channelB only? */
2096                 spd_device = ctrl->channel1[i];
2097         }
2098
2099         value = spd_read_byte(spd_device, SPD_TRAS); //in 1 ns
2100         if (value < 0) return -1;
2101         printk_raminit("update_dimm_Tras: 0 value= %08x\n", value);
2102
2103         value <<= 2; //convert it to in 1/4ns
2104
2105         value *= 10;
2106         printk_raminit("update_dimm_Tras:  1 value= %08x\n", value);
2107
2108         clocks = (value  + param->divisor - 1)/param->divisor;
2109         printk_raminit("update_dimm_Tras: divisor= %08x\n", param->divisor);
2110         printk_raminit("update_dimm_Tras: clocks= %08x\n", clocks);
2111         if (clocks < DTL_TRAS_MIN) {
2112                 clocks = DTL_TRAS_MIN;
2113         }
2114         if (clocks > DTL_TRAS_MAX) {
2115                 return 0;
2116         }
2117         dtl = pci_read_config32(ctrl->f2, DRAM_TIMING_LOW);
2118         old_clocks = ((dtl >> DTL_TRAS_SHIFT) & DTL_TRAS_MASK) + DTL_TRAS_BASE;
2119         if (old_clocks >= clocks) { // someone did it?
2120                 return 1;
2121         }
2122         dtl &= ~(DTL_TRAS_MASK << DTL_TRAS_SHIFT);
2123         dtl |= ((clocks - DTL_TRAS_BASE) << DTL_TRAS_SHIFT);
2124         pci_write_config32(ctrl->f2, DRAM_TIMING_LOW, dtl);
2125         return 1;
2126 }
2127
2128 static int update_dimm_Trp(const struct mem_controller *ctrl,
2129                             const struct mem_param *param, int i, long dimm_mask)
2130 {
2131         return update_dimm_TT_1_4(ctrl, param, i, dimm_mask, DRAM_TIMING_LOW, SPD_TRP, DTL_TRP_SHIFT, DTL_TRP_MASK, DTL_TRP_BASE, DTL_TRP_MIN, DTL_TRP_MAX);
2132 }
2133
2134
2135 static int update_dimm_Trtp(const struct mem_controller *ctrl,
2136                 const struct mem_param *param, int i, struct mem_info *meminfo)
2137 {
2138         /* need to figure if it is 32 byte burst or 64 bytes burst */
2139         int offset = 2;
2140         if (!meminfo->is_Width128) {
2141                 uint32_t dword;
2142                 dword = pci_read_config32(ctrl->f2, DRAM_CONFIG_LOW);
2143                 if ((dword &  DCL_BurstLength32)) offset = 0;
2144         }
2145         return update_dimm_TT_1_4(ctrl, param, i, meminfo->dimm_mask, DRAM_TIMING_LOW, SPD_TRTP, DTL_TRTP_SHIFT, DTL_TRTP_MASK, DTL_TRTP_BASE+offset, DTL_TRTP_MIN+offset, DTL_TRTP_MAX+offset);
2146 }
2147
2148
2149 static int update_dimm_Twr(const struct mem_controller *ctrl, const struct mem_param *param, int i, long dimm_mask)
2150 {
2151         return update_dimm_TT_1_4(ctrl, param, i, dimm_mask, DRAM_TIMING_LOW, SPD_TWR, DTL_TWR_SHIFT, DTL_TWR_MASK, DTL_TWR_BASE, DTL_TWR_MIN, DTL_TWR_MAX);
2152 }
2153
2154
2155 static int update_dimm_Tref(const struct mem_controller *ctrl,
2156                              const struct mem_param *param, int i, long dimm_mask)
2157 {
2158         uint32_t dth, dth_old;
2159         int value;
2160         u32 spd_device = ctrl->channel0[i];
2161
2162         if (!(dimm_mask & (1 << i)) && (dimm_mask & (1 << (DIMM_SOCKETS + i)))) { /* channelB only? */
2163                 spd_device = ctrl->channel1[i];
2164         }
2165
2166         value = spd_read_byte(spd_device, SPD_TREF); // 0: 15.625us, 1: 3.9us 2: 7.8 us....
2167         if (value < 0) return -1;
2168
2169         if (value == 1 ) {
2170                 value = 3;
2171         } else {
2172                 value = 2;
2173         }
2174
2175         dth = pci_read_config32(ctrl->f2, DRAM_TIMING_HIGH);
2176
2177         dth_old = dth;
2178         dth &= ~(DTH_TREF_MASK << DTH_TREF_SHIFT);
2179         dth |= (value << DTH_TREF_SHIFT);
2180         if (dth_old != dth) {
2181                 pci_write_config32(ctrl->f2, DRAM_TIMING_HIGH, dth);
2182         }
2183         return 1;
2184 }
2185
2186 static void set_4RankRDimm(const struct mem_controller *ctrl,
2187                         const struct mem_param *param, struct mem_info *meminfo)
2188 {
2189 #if QRANK_DIMM_SUPPORT == 1
2190         int value;
2191         int i;
2192         long dimm_mask = meminfo->dimm_mask;
2193
2194
2195         if (!(meminfo->is_registered)) return;
2196
2197         value = 0;
2198
2199         for (i = 0; i < DIMM_SOCKETS; i++) {
2200                 if (!(dimm_mask & (1 << i))) {
2201                         continue;
2202                 }
2203
2204                 if (meminfo->sz[i].rank == 4) {
2205                         value = 1;
2206                         break;
2207                 }
2208         }
2209
2210         if (value == 1) {
2211                 uint32_t dch;
2212                 dch = pci_read_config32(ctrl->f2, DRAM_CONFIG_HIGH);
2213                 dch |= DCH_FourRankRDimm;
2214                 pci_write_config32(ctrl->f2, DRAM_CONFIG_HIGH, dch);
2215         }
2216 #endif
2217 }
2218
2219 static uint32_t get_extra_dimm_mask(const struct mem_controller *ctrl,
2220                                      struct mem_info *meminfo)
2221 {
2222         int i;
2223
2224         uint32_t mask_x4;
2225         uint32_t mask_x16;
2226         uint32_t mask_single_rank;
2227         uint32_t mask_page_1k;
2228         int value;
2229 #if QRANK_DIMM_SUPPORT == 1
2230         int rank;
2231 #endif
2232
2233         long dimm_mask = meminfo->dimm_mask;
2234
2235
2236         mask_x4 = 0;
2237         mask_x16 = 0;
2238         mask_single_rank = 0;
2239         mask_page_1k = 0;
2240
2241         for (i = 0; i < DIMM_SOCKETS; i++) {
2242                 u32 spd_device = ctrl->channel0[i];
2243                 if (!(dimm_mask & (1 << i))) {
2244                         if (dimm_mask & (1 << (DIMM_SOCKETS + i))) { /* channelB only? */
2245                                 spd_device = ctrl->channel1[i];
2246                         } else {
2247                                 continue;
2248                         }
2249                 }
2250
2251                 if (meminfo->sz[i].rank == 1) {
2252                         mask_single_rank |= 1<<i;
2253                 }
2254
2255                 if (meminfo->sz[i].col==10) {
2256                         mask_page_1k |= 1<<i;
2257                 }
2258
2259
2260                 value = spd_read_byte(spd_device, SPD_PRI_WIDTH);
2261
2262                 #if QRANK_DIMM_SUPPORT == 1
2263                         rank = meminfo->sz[i].rank;
2264                 #endif
2265
2266                 if (value==4) {
2267                         mask_x4 |= (1<<i);
2268                         #if QRANK_DIMM_SUPPORT == 1
2269                         if (rank==4) {
2270                                 mask_x4 |= 1<<(i+2);
2271                         }
2272                         #endif
2273                 } else if (value==16) {
2274                         mask_x16 |= (1<<i);
2275                         #if QRANK_DIMM_SUPPORT == 1
2276                          if (rank==4) {
2277                                  mask_x16 |= 1<<(i+2);
2278                          }
2279                         #endif
2280                 }
2281
2282         }
2283
2284         meminfo->x4_mask= mask_x4;
2285         meminfo->x16_mask = mask_x16;
2286
2287         meminfo->single_rank_mask = mask_single_rank;
2288         meminfo->page_1k_mask = mask_page_1k;
2289
2290         return mask_x4;
2291
2292 }
2293
2294
2295 static void set_dimm_x4(const struct mem_controller *ctrl, const struct mem_param *param, struct mem_info *meminfo)
2296 {
2297         uint32_t dcl;
2298         dcl = pci_read_config32(ctrl->f2, DRAM_CONFIG_LOW);
2299         dcl &= ~(DCL_X4Dimm_MASK<<DCL_X4Dimm_SHIFT);
2300         dcl |= ((meminfo->x4_mask) & 0xf) << (DCL_X4Dimm_SHIFT);
2301         pci_write_config32(ctrl->f2, DRAM_CONFIG_LOW, dcl);
2302 }
2303
2304
2305 static int count_ones(uint32_t dimm_mask)
2306 {
2307         int dimms;
2308         unsigned index;
2309         dimms = 0;
2310         for (index = 0; index < (2 * DIMM_SOCKETS); index++, dimm_mask >>= 1) {
2311                 if (dimm_mask & 1) {
2312                         dimms++;
2313                 }
2314         }
2315         return dimms;
2316 }
2317
2318
2319 static void set_DramTerm(const struct mem_controller *ctrl,
2320                         const struct mem_param *param, struct mem_info *meminfo)
2321 {
2322         uint32_t dcl;
2323         unsigned odt;
2324         odt = 1; // 75 ohms
2325
2326         if (param->divisor == 100) { //DDR2 800
2327                 if (meminfo->is_Width128) {
2328                         if (count_ones(meminfo->dimm_mask & 0x0f)==2) {
2329                                 odt = 3;  //50 ohms
2330                         }
2331                 }
2332
2333         }
2334
2335
2336 #if CONFIG_DIMM_SUPPORT == 0x0204
2337         odt = 0x2;              /* 150 ohms */
2338 #endif
2339
2340         dcl = pci_read_config32(ctrl->f2, DRAM_CONFIG_LOW);
2341         dcl &= ~(DCL_DramTerm_MASK<<DCL_DramTerm_SHIFT);
2342         dcl |= (odt & DCL_DramTerm_MASK) << (DCL_DramTerm_SHIFT);
2343         pci_write_config32(ctrl->f2, DRAM_CONFIG_LOW, dcl);
2344 }
2345
2346 static void set_ecc(const struct mem_controller *ctrl,
2347         const struct mem_param *param, struct mem_info *meminfo)
2348 {
2349         int i;
2350         int value;
2351
2352         uint32_t dcl, nbcap;
2353         nbcap = pci_read_config32(ctrl->f3, NORTHBRIDGE_CAP);
2354         dcl = pci_read_config32(ctrl->f2, DRAM_CONFIG_LOW);
2355         dcl &= ~DCL_DimmEccEn;
2356         if (nbcap & NBCAP_ECC) {
2357                 dcl |= DCL_DimmEccEn;
2358         }
2359         if (read_option(CMOS_VSTART_ECC_memory, CMOS_VLEN_ECC_memory, 1) == 0) {
2360                 dcl &= ~DCL_DimmEccEn;
2361         }
2362         pci_write_config32(ctrl->f2, DRAM_CONFIG_LOW, dcl);
2363
2364         meminfo->is_ecc = 1;
2365         if (!(dcl & DCL_DimmEccEn)) {
2366                 meminfo->is_ecc = 0;
2367                 return; // already disabled the ECC, so don't need to read SPD any more
2368         }
2369
2370         for (i = 0; i < DIMM_SOCKETS; i++) {
2371                 u32 spd_device = ctrl->channel0[i];
2372                 if (!(meminfo->dimm_mask & (1 << i))) {
2373                         if (meminfo->dimm_mask & (1 << (DIMM_SOCKETS + i))) { /* channelB only? */
2374                                 spd_device = ctrl->channel1[i];
2375                                 printk_debug("set_ecc spd_device: 0x%x\n", spd_device);
2376                         } else {
2377                                 continue;
2378                         }
2379                 }
2380
2381                 value = spd_read_byte(ctrl->channel0[i], SPD_DIMM_CONF_TYPE);
2382
2383                 if (!(value & SPD_DIMM_CONF_TYPE_ECC)) {
2384                         dcl &= ~DCL_DimmEccEn;
2385                         pci_write_config32(ctrl->f2, DRAM_CONFIG_LOW, dcl);
2386                         meminfo->is_ecc = 0;
2387                         return;
2388                 }
2389
2390         }
2391 }
2392
2393
2394 static int update_dimm_Twtr(const struct mem_controller *ctrl,
2395                              const struct mem_param *param, int i, long dimm_mask)
2396 {
2397         return update_dimm_TT_1_4(ctrl, param, i, dimm_mask, DRAM_TIMING_HIGH, SPD_TWTR, DTH_TWTR_SHIFT, DTH_TWTR_MASK, DTH_TWTR_BASE, DTH_TWTR_MIN, DTH_TWTR_MAX);
2398 }
2399
2400 static void set_TT(const struct mem_controller *ctrl,
2401         const struct mem_param *param, unsigned TT_REG, unsigned TT_SHIFT,
2402         unsigned TT_MASK, unsigned TT_BASE, unsigned TT_MIN, unsigned TT_MAX,
2403         unsigned val, const char *str)
2404 {
2405         uint32_t reg;
2406
2407         if ((val < TT_MIN) || (val > TT_MAX)) {
2408                 printk_err(str);
2409                 die(" Unknown\n");
2410         }
2411
2412         reg = pci_read_config32(ctrl->f2, TT_REG);
2413         reg &= ~(TT_MASK << TT_SHIFT);
2414         reg |= ((val - TT_BASE) << TT_SHIFT);
2415         pci_write_config32(ctrl->f2, TT_REG, reg);
2416         return;
2417 }
2418
2419
2420 static void set_TrwtTO(const struct mem_controller *ctrl,
2421                         const struct mem_param *param)
2422 {
2423         set_TT(ctrl, param, DRAM_TIMING_HIGH, DTH_TRWTTO_SHIFT, DTH_TRWTTO_MASK,DTH_TRWTTO_BASE, DTH_TRWTTO_MIN, DTH_TRWTTO_MAX, param->TrwtTO, "TrwtTO");
2424 }
2425
2426
2427 static void set_Twrrd(const struct mem_controller *ctrl, const struct mem_param *param)
2428 {
2429         set_TT(ctrl, param, DRAM_TIMING_HIGH, DTH_TWRRD_SHIFT, DTH_TWRRD_MASK,DTH_TWRRD_BASE, DTH_TWRRD_MIN, DTH_TWRRD_MAX, param->Twrrd, "Twrrd");
2430 }
2431
2432
2433 static void set_Twrwr(const struct mem_controller *ctrl, const struct mem_param *param)
2434 {
2435         set_TT(ctrl, param, DRAM_TIMING_HIGH, DTH_TWRWR_SHIFT, DTH_TWRWR_MASK,DTH_TWRWR_BASE, DTH_TWRWR_MIN, DTH_TWRWR_MAX, param->Twrwr, "Twrwr");
2436 }
2437
2438 static void set_Trdrd(const struct mem_controller *ctrl, const struct mem_param *param)
2439 {
2440         set_TT(ctrl, param, DRAM_TIMING_HIGH, DTH_TRDRD_SHIFT, DTH_TRDRD_MASK,DTH_TRDRD_BASE, DTH_TRDRD_MIN, DTH_TRDRD_MAX, param->Trdrd, "Trdrd");
2441 }
2442
2443 static void set_DcqBypassMax(const struct mem_controller *ctrl, const struct mem_param *param)
2444 {
2445         set_TT(ctrl, param, DRAM_CONFIG_HIGH, DCH_DcqBypassMax_SHIFT, DCH_DcqBypassMax_MASK,DCH_DcqBypassMax_BASE, DCH_DcqBypassMax_MIN, DCH_DcqBypassMax_MAX, param->DcqByPassMax, "DcqBypassMax"); // value need to be in CMOS
2446 }
2447
2448 static void set_Tfaw(const struct mem_controller *ctrl, const struct mem_param *param, struct mem_info *meminfo)
2449 {
2450         static const uint8_t faw_1k[] = {8, 10, 13, 14};
2451         static const uint8_t faw_2k[] = {10, 14, 17, 18};
2452         unsigned memclkfreq_index;
2453         unsigned faw;
2454
2455
2456         memclkfreq_index = param->dch_memclk;
2457
2458         if (meminfo->page_1k_mask != 0) { //1k page
2459                 faw = faw_1k[memclkfreq_index];
2460         } else {
2461                 faw = faw_2k[memclkfreq_index];
2462         }
2463
2464         set_TT(ctrl, param, DRAM_CONFIG_HIGH, DCH_FourActWindow_SHIFT, DCH_FourActWindow_MASK, DCH_FourActWindow_BASE, DCH_FourActWindow_MIN, DCH_FourActWindow_MAX, faw, "FourActWindow");
2465 }
2466
2467 static void set_max_async_latency(const struct mem_controller *ctrl, const struct mem_param *param)
2468 {
2469         uint32_t dch;
2470         unsigned async_lat;
2471
2472
2473         dch = pci_read_config32(ctrl->f2, DRAM_CONFIG_HIGH);
2474         dch &= ~(DCH_MaxAsyncLat_MASK << DCH_MaxAsyncLat_SHIFT);
2475
2476         //FIXME: We need to use Max of DqsRcvEnDelay + 6ns here: After trainning and get that from index reg 0x10, 0x13, 0x16, 0x19, 0x30, 0x33, 0x36, 0x39
2477         async_lat = 6 + 6;
2478
2479
2480         dch |= ((async_lat - DCH_MaxAsyncLat_BASE) << DCH_MaxAsyncLat_SHIFT);
2481         pci_write_config32(ctrl->f2, DRAM_CONFIG_HIGH, dch);
2482 }
2483
2484 static void set_SlowAccessMode(const struct mem_controller *ctrl)
2485 {
2486         uint32_t dch;
2487
2488         dch = pci_read_config32(ctrl->f2, DRAM_CONFIG_HIGH);
2489
2490         dch |= (1<<20);
2491
2492         pci_write_config32(ctrl->f2, DRAM_CONFIG_HIGH, dch);
2493 }
2494
2495 /*
2496         DRAM_OUTPUT_DRV_COMP_CTRL 0, 0x20
2497         DRAM_ADDR_TIMING_CTRL 04, 0x24
2498 */
2499 static void set_misc_timing(const struct mem_controller *ctrl, struct mem_info *meminfo)
2500 {
2501         uint32_t dword;
2502         uint32_t dwordx;
2503 #if (CONFIG_DIMM_SUPPORT & 0x0100)==0x0000 /* 2T mode only used for unbuffered DIMM */
2504         unsigned SlowAccessMode = 0;
2505 #endif
2506
2507         long dimm_mask = meminfo->dimm_mask & 0x0f;
2508
2509 #if CONFIG_DIMM_SUPPORT==0x0104   /* DDR2 and REG */
2510         /* for REG DIMM */
2511         dword = 0x00111222;
2512         dwordx = 0x002f0000;
2513         switch (meminfo->memclk_set) {
2514         case DCH_MemClkFreq_266MHz:
2515                 if ( (dimm_mask == 0x03) || (dimm_mask == 0x02) || (dimm_mask == 0x01)) {
2516                         dwordx = 0x002f2700;
2517                 }
2518                 break;
2519         case DCH_MemClkFreq_333MHz:
2520                 if ( (dimm_mask == 0x03) || (dimm_mask == 0x02) || (dimm_mask == 0x01)) {
2521                         if ((meminfo->single_rank_mask & 0x03)!=0x03) { //any double rank there?
2522                                 dwordx = 0x002f2f00;
2523                         }
2524                 }
2525                 break;
2526         case DCH_MemClkFreq_400MHz:
2527                 dwordx = 0x002f3300;
2528                 break;
2529         }
2530
2531 #endif
2532
2533 #if CONFIG_DIMM_SUPPORT==0x0204 /* DDR2 and SO-DIMM, S1G1 */
2534         dword = 0x00111222;
2535         dwordx = 0x002F2F00;
2536
2537         switch (meminfo->memclk_set) {
2538         case DCH_MemClkFreq_200MHz:     /* nothing to be set here */
2539                 break;
2540         case DCH_MemClkFreq_266MHz:
2541                 if ((meminfo->single_rank_mask == 0)
2542                     && (meminfo->x4_mask == 0) && (meminfo->x16_mask))
2543                         dwordx = 0x002C2C00;    /* Double rank x8 */
2544                 /* else SRx16, SRx8, DRx16 == 0x002F2F00 */
2545                 break;
2546         case DCH_MemClkFreq_333MHz:
2547                 if ((meminfo->single_rank_mask == 1)
2548                    && (meminfo->x16_mask == 1)) /* SR x16 */
2549                         dwordx = 0x00272700;
2550                 else if ((meminfo->x4_mask == 0) && (meminfo->x16_mask == 0)
2551                          && (meminfo->single_rank_mask == 0)) { /* DR x8 */
2552                         SlowAccessMode = 1;
2553                         dwordx = 0x00002800;
2554                 } else {        /* SR x8, DR x16 */
2555                         dwordx = 0x002A2A00;
2556                 }
2557                 break;
2558         case DCH_MemClkFreq_400MHz:
2559                 if ((meminfo->single_rank_mask == 1)
2560                    && (meminfo->x16_mask == 1)) /* SR x16 */
2561                         dwordx = 0x00292900;
2562                 else if ((meminfo->x4_mask == 0) && (meminfo->x16_mask == 0)
2563                          && (meminfo->single_rank_mask == 0)) { /* DR x8 */
2564                         SlowAccessMode = 1;
2565                         dwordx = 0x00002A00;
2566                 } else {        /* SR x8, DR x16 */
2567                         dwordx = 0x002A2A00;
2568                 }
2569                 break;
2570         }
2571 #endif
2572
2573 #if CONFIG_DIMM_SUPPORT==0x0004  /* DDR2 and unbuffered */
2574         /* for UNBUF DIMM */
2575         dword = 0x00111222;
2576         dwordx = 0x002f2f00;
2577         switch (meminfo->memclk_set) {
2578         case DCH_MemClkFreq_200MHz:
2579                 if (dimm_mask == 0x03) {
2580                         SlowAccessMode = 1;
2581                         dword = 0x00111322;
2582                 }
2583                 break;
2584         case DCH_MemClkFreq_266MHz:
2585                 if (dimm_mask == 0x03) {
2586                         SlowAccessMode = 1;
2587                         dword = 0x00111322;
2588                         if ((meminfo->x4_mask == 0 ) && (meminfo->x16_mask == 0)) {
2589                                 switch (meminfo->single_rank_mask) {
2590                                 case 0x03:
2591                                         dwordx = 0x00002f00; //x8 single Rank
2592                                         break;
2593                                 case 0x00:
2594                                         dwordx = 0x00342f00; //x8 double Rank
2595                                         break;
2596                                 default:
2597                                         dwordx = 0x00372f00; //x8 single Rank and double Rank mixed
2598                                 }
2599                         } else if ((meminfo->x4_mask == 0 ) && (meminfo->x16_mask == 0x01) && (meminfo->single_rank_mask == 0x01)) {
2600                                          dwordx = 0x00382f00; //x8 Double Rank and x16 single Rank mixed
2601                          } else if ((meminfo->x4_mask == 0 ) && (meminfo->x16_mask == 0x02) && (meminfo->single_rank_mask == 0x02)) {
2602                                          dwordx = 0x00382f00; //x16 single Rank and x8 double Rank mixed
2603                         }
2604
2605                 } else {
2606                         if ((meminfo->x4_mask == 0 ) && (meminfo->x16_mask == 0x00) && ((meminfo->single_rank_mask == 0x01)||(meminfo->single_rank_mask == 0x02)))  { //x8 single rank
2607                                 dwordx = 0x002f2f00;
2608                         } else {
2609                                 dwordx = 0x002b2f00;
2610                         }
2611                 }
2612                 break;
2613         case DCH_MemClkFreq_333MHz:
2614                 dwordx = 0x00202220;
2615                 if (dimm_mask == 0x03) {
2616                         SlowAccessMode = 1;
2617                         dword = 0x00111322;
2618                         if ((meminfo->x4_mask == 0 ) && (meminfo->x16_mask == 0)) {
2619                                 switch (meminfo->single_rank_mask) {
2620                                 case 0x03:
2621                                         dwordx = 0x00302220; //x8 single Rank
2622                                         break;
2623                                 case 0x00:
2624                                         dwordx = 0x002b2220; //x8 double Rank
2625                                         break;
2626                                 default:
2627                                         dwordx = 0x002a2220; //x8 single Rank and double Rank mixed
2628                                 }
2629                         } else if ((meminfo->x4_mask == 0) && (meminfo->x16_mask == 0x01) && (meminfo->single_rank_mask == 0x01)) {
2630                                         dwordx = 0x002c2220; //x8 Double Rank and x16 single Rank mixed
2631                         } else if ((meminfo->x4_mask == 0) && (meminfo->x16_mask == 0x02) && (meminfo->single_rank_mask == 0x02)) {
2632                                         dwordx = 0x002c2220; //x16 single Rank and x8 double Rank mixed
2633                         }
2634                 }
2635                 break;
2636         case DCH_MemClkFreq_400MHz:
2637                 dwordx = 0x00202520;
2638                 SlowAccessMode = 1;
2639                 if (dimm_mask == 0x03) {
2640                         dword = 0x00113322;
2641                 } else {
2642                         dword = 0x00113222;
2643                 }
2644                 break;
2645         }
2646
2647         printk_raminit("\tdimm_mask = %08x\n", meminfo->dimm_mask);
2648         printk_raminit("\tx4_mask = %08x\n", meminfo->x4_mask);
2649         printk_raminit("\tx16_mask = %08x\n", meminfo->x16_mask);
2650         printk_raminit("\tsingle_rank_mask = %08x\n", meminfo->single_rank_mask);
2651         printk_raminit("\tODC = %08x\n", dword);
2652         printk_raminit("\tAddr Timing= %08x\n", dwordx);
2653 #endif
2654
2655 #if (CONFIG_DIMM_SUPPORT & 0x0100)==0x0000 /* 2T mode only used for unbuffered DIMM */
2656         if (SlowAccessMode) {
2657                 set_SlowAccessMode(ctrl);
2658         }
2659 #endif
2660
2661         if (!(meminfo->dimm_mask & 0x0F) && (meminfo->dimm_mask & 0xF0)) { /* channelB only? */
2662                 /* Program the Output Driver Compensation Control Registers (Function 2:Offset 0x9c, index 0, 0x20) */
2663                 pci_write_config32_index_wait(ctrl->f2, 0x98, 0x20, dword);
2664
2665                 /* Program the Address Timing Control Registers (Function 2:Offset 0x9c, index 4, 0x24) */
2666                 pci_write_config32_index_wait(ctrl->f2, 0x98, 0x24, dwordx);
2667         } else {
2668                 /* Program the Output Driver Compensation Control Registers (Function 2:Offset 0x9c, index 0, 0x20) */
2669                 pci_write_config32_index_wait(ctrl->f2, 0x98, 0, dword);
2670                 if (meminfo->is_Width128) {
2671                         pci_write_config32_index_wait(ctrl->f2, 0x98, 0x20, dword);
2672                 }
2673
2674                 /* Program the Address Timing Control Registers (Function 2:Offset 0x9c, index 4, 0x24) */
2675                 pci_write_config32_index_wait(ctrl->f2, 0x98, 4, dwordx);
2676                 if (meminfo->is_Width128) {
2677                         pci_write_config32_index_wait(ctrl->f2, 0x98, 0x24, dwordx);
2678                 }
2679         }
2680 }
2681
2682
2683 static void set_RDqsEn(const struct mem_controller *ctrl,
2684                         const struct mem_param *param, struct mem_info *meminfo)
2685 {
2686 #if CONFIG_CPU_SOCKET_TYPE==0x10
2687         //only need to set for reg and x8
2688         uint32_t dch;
2689
2690         dch = pci_read_config32(ctrl->f2, DRAM_CONFIG_HIGH);
2691
2692         dch &= ~DCH_RDqsEn;
2693         if ((!meminfo->x4_mask) && (!meminfo->x16_mask)) {
2694                 dch |= DCH_RDqsEn;
2695         }
2696
2697         pci_write_config32(ctrl->f2, DRAM_CONFIG_HIGH, dch);
2698 #endif
2699 }
2700
2701 static void set_idle_cycle_limit(const struct mem_controller *ctrl,
2702                                   const struct mem_param *param)
2703 {
2704         uint32_t dcm;
2705         /* AMD says to Hardcode this */
2706         dcm = pci_read_config32(ctrl->f2, DRAM_CTRL_MISC);
2707         dcm &= ~(DCM_ILD_lmt_MASK << DCM_ILD_lmt_SHIFT);
2708         dcm |= DCM_ILD_lmt_16 << DCM_ILD_lmt_SHIFT;
2709         dcm |= DCM_DCC_EN;
2710         pci_write_config32(ctrl->f2, DRAM_CTRL_MISC, dcm);
2711 }
2712
2713 static void set_RdWrQByp(const struct mem_controller *ctrl,
2714                           const struct mem_param *param)
2715 {
2716         set_TT(ctrl, param, DRAM_CTRL_MISC, DCM_RdWrQByp_SHIFT, DCM_RdWrQByp_MASK,0, 0, 3, 2, "RdWrQByp");
2717 }
2718
2719 static long spd_set_dram_timing(const struct mem_controller *ctrl,
2720                                  const struct mem_param *param,
2721                                  struct mem_info *meminfo)
2722 {
2723         int i;
2724
2725         for (i = 0; i < DIMM_SOCKETS; i++) {
2726                 int rc;
2727                 if (!(meminfo->dimm_mask & (1 << i)) &&
2728                     !(meminfo->dimm_mask & (1 << (DIMM_SOCKETS + i))) ) {
2729                         continue;
2730                 }
2731                 printk_raminit("spd_set_dram_timing dimm socket:  %08x\n", i);
2732                 /* DRAM Timing Low Register */
2733                 printk_raminit("\ttrc\n");
2734                 if ((rc = update_dimm_Trc (ctrl, param, i, meminfo->dimm_mask)) <= 0) goto dimm_err;
2735
2736                 printk_raminit("\ttrcd\n");
2737                 if ((rc = update_dimm_Trcd(ctrl, param, i, meminfo->dimm_mask)) <= 0) goto dimm_err;
2738
2739                 printk_raminit("\ttrrd\n");
2740                 if ((rc = update_dimm_Trrd(ctrl, param, i, meminfo->dimm_mask)) <= 0) goto dimm_err;
2741
2742                 printk_raminit("\ttras\n");
2743                 if ((rc = update_dimm_Tras(ctrl, param, i, meminfo->dimm_mask)) <= 0) goto dimm_err;
2744
2745                 printk_raminit("\ttrp\n");
2746                 if ((rc = update_dimm_Trp (ctrl, param, i, meminfo->dimm_mask)) <= 0) goto dimm_err;
2747
2748                 printk_raminit("\ttrtp\n");
2749                 if ((rc = update_dimm_Trtp(ctrl, param, i, meminfo)) <= 0) goto dimm_err;
2750
2751                 printk_raminit("\ttwr\n");
2752                 if ((rc = update_dimm_Twr (ctrl, param, i, meminfo->dimm_mask)) <= 0) goto dimm_err;
2753
2754                 /* DRAM Timing High Register */
2755                 printk_raminit("\ttref\n");
2756                 if ((rc = update_dimm_Tref(ctrl, param, i, meminfo->dimm_mask)) <= 0) goto dimm_err;
2757
2758                 printk_raminit("\ttwtr\n");
2759                 if ((rc = update_dimm_Twtr(ctrl, param, i, meminfo->dimm_mask)) <= 0) goto dimm_err;
2760
2761                 printk_raminit("\ttrfc\n");
2762                 if ((rc = update_dimm_Trfc(ctrl, param, i, meminfo)) <= 0) goto dimm_err;
2763
2764                 /* DRAM Config Low */
2765
2766                 continue;
2767         dimm_err:
2768                 printk_debug("spd_set_dram_timing dimm_err!\n");
2769                 if (rc < 0) {
2770                         return -1;
2771                 }
2772                 meminfo->dimm_mask = disable_dimm(ctrl, i, meminfo);
2773         }
2774
2775         get_extra_dimm_mask(ctrl, meminfo); // will be used by RDqsEn and dimm_x4
2776         /* DRAM Timing Low Register */
2777
2778         /* DRAM Timing High Register */
2779         set_TrwtTO(ctrl, param);
2780         set_Twrrd (ctrl, param);
2781         set_Twrwr (ctrl, param);
2782         set_Trdrd (ctrl, param);
2783
2784         set_4RankRDimm(ctrl, param, meminfo);
2785
2786         /* DRAM Config High */
2787         set_Tfaw(ctrl, param, meminfo);
2788         set_DcqBypassMax(ctrl, param);
2789         set_max_async_latency(ctrl, param);
2790         set_RDqsEn(ctrl, param, meminfo);
2791
2792         /* DRAM Config Low */
2793         set_ecc(ctrl, param, meminfo);
2794         set_dimm_x4(ctrl, param, meminfo);
2795         set_DramTerm(ctrl, param, meminfo);
2796
2797         /* DRAM Control Misc */
2798         set_idle_cycle_limit(ctrl, param);
2799         set_RdWrQByp(ctrl, param);
2800
2801         return meminfo->dimm_mask;
2802 }
2803
2804 static void sdram_set_spd_registers(const struct mem_controller *ctrl,
2805                                      struct sys_info *sysinfo)
2806 {
2807         struct spd_set_memclk_result result;
2808         const struct mem_param *param;
2809         struct mem_param paramx;
2810         struct mem_info *meminfo;
2811 #if 1
2812         if (!sysinfo->ctrl_present[ctrl->node_id]) {
2813                 return;
2814         }
2815 #endif
2816         meminfo = &sysinfo->meminfo[ctrl->node_id];
2817
2818         printk_debug("sdram_set_spd_registers: paramx :%p\n", &paramx);
2819
2820         activate_spd_rom(ctrl);
2821         meminfo->dimm_mask = spd_detect_dimms(ctrl);
2822
2823         printk_raminit("sdram_set_spd_registers: dimm_mask=0x%x\n", meminfo->dimm_mask);
2824
2825         if (!(meminfo->dimm_mask & ((1 << 2*DIMM_SOCKETS) - 1)))
2826         {
2827                 printk_debug("No memory for this cpu\n");
2828                 return;
2829         }
2830         meminfo->dimm_mask = spd_enable_2channels(ctrl, meminfo);
2831         printk_raminit("spd_enable_2channels: dimm_mask=0x%x\n", meminfo->dimm_mask);
2832         if (meminfo->dimm_mask == -1)
2833                 goto hw_spd_err;
2834
2835         meminfo->dimm_mask = spd_set_ram_size(ctrl, meminfo);
2836         printk_raminit("spd_set_ram_size: dimm_mask=0x%x\n", meminfo->dimm_mask);
2837         if (meminfo->dimm_mask == -1)
2838                 goto hw_spd_err;
2839
2840         meminfo->dimm_mask = spd_handle_unbuffered_dimms(ctrl, meminfo);
2841         printk_raminit("spd_handle_unbuffered_dimms: dimm_mask=0x%x\n", meminfo->dimm_mask);
2842         if (meminfo->dimm_mask == -1)
2843                 goto hw_spd_err;
2844
2845         result = spd_set_memclk(ctrl, meminfo);
2846         param     = result.param;
2847         meminfo->dimm_mask = result.dimm_mask;
2848         printk_raminit("spd_set_memclk: dimm_mask=0x%x\n", meminfo->dimm_mask);
2849         if (meminfo->dimm_mask == -1)
2850                 goto hw_spd_err;
2851
2852         //store memclk set to sysinfo, incase we need rebuilt param again
2853         meminfo->memclk_set = param->dch_memclk;
2854
2855         memcpy(&paramx, param, sizeof(paramx));
2856
2857         paramx.divisor = get_exact_divisor(param->dch_memclk, paramx.divisor);
2858
2859         meminfo->dimm_mask = spd_set_dram_timing(ctrl, &paramx, meminfo);
2860         printk_raminit("spd_set_dram_timing: dimm_mask=0x%x\n", meminfo->dimm_mask);
2861         if (meminfo->dimm_mask == -1)
2862                 goto hw_spd_err;
2863
2864         order_dimms(ctrl, meminfo);
2865
2866         return;
2867  hw_spd_err:
2868         /* Unrecoverable error reading SPD data */
2869         die("Unrecoverable error reading SPD data. No qualified DIMMs?");
2870         return;
2871 }
2872
2873 #define TIMEOUT_LOOPS 300000
2874
2875 #include "raminit_f_dqs.c"
2876
2877 #if CONFIG_HW_MEM_HOLE_SIZEK != 0
2878 static uint32_t hoist_memory(int controllers, const struct mem_controller *ctrl,unsigned hole_startk, int i)
2879 {
2880         int ii;
2881         uint32_t carry_over;
2882         device_t dev;
2883         uint32_t base, limit;
2884         uint32_t basek;
2885         uint32_t hoist;
2886         int j;
2887
2888         carry_over = (4*1024*1024) - hole_startk;
2889
2890         for (ii=controllers - 1;ii>i;ii--) {
2891                 base  = pci_read_config32(ctrl[0].f1, 0x40 + (ii << 3));
2892                 if ((base & ((1<<1)|(1<<0))) != ((1<<1)|(1<<0))) {
2893                         continue;
2894                 }
2895                 limit = pci_read_config32(ctrl[0].f1, 0x44 + (ii << 3));
2896                 limit += (carry_over << 2 );
2897                 base  += (carry_over << 2 );
2898                 for (j = 0; j < controllers; j++) {
2899                         pci_write_config32(ctrl[j].f1, 0x44 + (ii << 3), limit);
2900                         pci_write_config32(ctrl[j].f1, 0x40 + (ii << 3), base );
2901                 }
2902         }
2903         limit = pci_read_config32(ctrl[0].f1, 0x44 + (i << 3));
2904         limit += (carry_over << 2);
2905         for (j = 0; j < controllers; j++) {
2906                 pci_write_config32(ctrl[j].f1, 0x44 + (i << 3), limit);
2907         }
2908         dev = ctrl[i].f1;
2909         base  = pci_read_config32(dev, 0x40 + (i << 3));
2910         basek  = (base & 0xffff0000) >> 2;
2911         if (basek == hole_startk) {
2912                 //don't need set memhole here, because hole off set will be 0, overflow
2913                 //so need to change base reg instead, new basek will be 4*1024*1024
2914                 base &= 0x0000ffff;
2915                 base |= (4*1024*1024)<<2;
2916                 for (j = 0; j < controllers; j++) {
2917                         pci_write_config32(ctrl[j].f1, 0x40 + (i<<3), base);
2918                 }
2919         }  else  {
2920                 hoist = /* hole start address */
2921                         ((hole_startk << 10) & 0xff000000) +
2922                         /* hole address to memory controller address */
2923                         (((basek + carry_over) >> 6) & 0x0000ff00) +
2924                         /* enable */
2925                         1;
2926                 pci_write_config32(dev, 0xf0, hoist);
2927         }
2928
2929         return carry_over;
2930 }
2931
2932 static void set_hw_mem_hole(int controllers, const struct mem_controller *ctrl)
2933 {
2934
2935         uint32_t hole_startk;
2936         int i;
2937
2938         hole_startk = 4*1024*1024 - CONFIG_HW_MEM_HOLE_SIZEK;
2939
2940         printk_raminit("Handling memory hole at 0x%08x (default)\n", hole_startk);
2941 #if CONFIG_HW_MEM_HOLE_SIZE_AUTO_INC == 1
2942         /* We need to double check if the hole_startk is valid, if it is equal
2943            to basek, we need to decrease it some */
2944         uint32_t basek_pri;
2945         for (i=0; i<controllers; i++) {
2946                         uint32_t base;
2947                         unsigned base_k;
2948                         base  = pci_read_config32(ctrl[0].f1, 0x40 + (i << 3));
2949                         if ((base & ((1<<1)|(1<<0))) != ((1<<1)|(1<<0))) {
2950                                 continue;
2951                         }
2952                         base_k = (base & 0xffff0000) >> 2;
2953                         if (base_k == hole_startk) {
2954                                 /* decrease mem hole startk to make sure it is
2955                                    on middle of previous node */
2956                                 hole_startk -= (base_k - basek_pri) >> 1;
2957                                 break; //only one hole
2958                         }
2959                         basek_pri = base_k;
2960         }
2961         printk_raminit("Handling memory hole at 0x%08x (adjusted)\n", hole_startk);
2962 #endif
2963         /* find node index that need do set hole */
2964         for (i=0; i < controllers; i++) {
2965                 uint32_t base, limit;
2966                 unsigned base_k, limit_k;
2967                 base  = pci_read_config32(ctrl[0].f1, 0x40 + (i << 3));
2968                 if ((base & ((1 << 1) | (1 << 0))) != ((1 << 1) | (1 << 0))) {
2969                         continue;
2970                 }
2971                 limit = pci_read_config32(ctrl[0].f1, 0x44 + (i << 3));
2972                 base_k = (base & 0xffff0000) >> 2;
2973                 limit_k = ((limit + 0x00010000) & 0xffff0000) >> 2;
2974                 if ((base_k <= hole_startk) && (limit_k > hole_startk)) {
2975                         unsigned end_k;
2976                         hoist_memory(controllers, ctrl, hole_startk, i);
2977                         end_k = memory_end_k(ctrl, controllers);
2978                         set_top_mem(end_k, hole_startk);
2979                         break; //only one hole
2980                 }
2981         }
2982
2983 }
2984 #endif
2985
2986 #include "exit_from_self.c"
2987
2988 static void sdram_enable(int controllers, const struct mem_controller *ctrl,
2989                           struct sys_info *sysinfo)
2990 {
2991         int i;
2992 #ifdef ACPI_IS_WAKEUP_EARLY
2993         int suspend = acpi_is_wakeup_early();
2994 #else
2995         int suspend = 0;
2996 #endif
2997  
2998 #if K8_REV_F_SUPPORT_F0_F1_WORKAROUND == 1
2999          unsigned cpu_f0_f1[8];
3000         /* FIXME: How about 32 node machine later? */
3001         tsc_t tsc, tsc0[8];
3002
3003         printk_debug("sdram_enable: tsc0[8]: %p", &tsc0[0]);
3004         uint32_t dword;
3005 #endif
3006
3007         /* Error if I don't have memory */
3008         if (memory_end_k(ctrl, controllers) == 0) {
3009                 die("No memory\n");
3010         }
3011
3012         /* Before enabling memory start the memory clocks */
3013         for (i = 0; i < controllers; i++) {
3014                 uint32_t dch;
3015                 if (!sysinfo->ctrl_present[ i ])
3016                         continue;
3017                 dch = pci_read_config32(ctrl[i].f2, DRAM_CONFIG_HIGH);
3018
3019                 /* if no memory installed, disabled the interface */
3020                 if (sysinfo->meminfo[i].dimm_mask==0x00){
3021                         dch |= DCH_DisDramInterface;
3022                         pci_write_config32(ctrl[i].f2, DRAM_CONFIG_HIGH, dch);
3023
3024                 } else {
3025                         dch |= DCH_MemClkFreqVal;
3026                         pci_write_config32(ctrl[i].f2, DRAM_CONFIG_HIGH, dch);
3027                         /* address timing and Output driver comp Control */
3028                         set_misc_timing(ctrl+i, sysinfo->meminfo+i );
3029                 }
3030         }
3031
3032         /* We need to wait a minimum of 20 MEMCLKS to enable the InitDram */
3033         memreset(controllers, ctrl);
3034
3035         /* lets override the rest of the routine */
3036         if (suspend) {
3037                 printk_debug("Wakeup!\n");
3038                 exit_from_self(controllers, ctrl, sysinfo);
3039                 printk_debug("Mem running !\n");
3040                 return;
3041         }
3042
3043         for (i = 0; i < controllers; i++) {
3044                 uint32_t dcl, dch;
3045                 if (!sysinfo->ctrl_present[ i ])
3046                         continue;
3047                 /* Skip everything if I don't have any memory on this controller */
3048                 dch = pci_read_config32(ctrl[i].f2, DRAM_CONFIG_HIGH);
3049                 if (!(dch & DCH_MemClkFreqVal)) {
3050                         continue;
3051                 }
3052
3053                 /* ChipKill */
3054                 dcl = pci_read_config32(ctrl[i].f2, DRAM_CONFIG_LOW);
3055                 if (dcl & DCL_DimmEccEn) {
3056                         uint32_t mnc;
3057                         printk_spew("ECC enabled\n");
3058                         mnc = pci_read_config32(ctrl[i].f3, MCA_NB_CONFIG);
3059                         mnc |= MNC_ECC_EN;
3060                         if (dcl & DCL_Width128) {
3061                                 mnc |= MNC_CHIPKILL_EN;
3062                         }
3063                         pci_write_config32(ctrl[i].f3, MCA_NB_CONFIG, mnc);
3064                 }
3065
3066 #if K8_REV_F_SUPPORT_F0_F1_WORKAROUND == 1
3067                 cpu_f0_f1[i] = is_cpu_pre_f2_in_bsp(i);
3068                 if (cpu_f0_f1[i]) {
3069                         //Rev F0/F1 workaround
3070 #if 1
3071                                 /* Set the DqsRcvEnTrain bit */
3072                         dword = pci_read_config32(ctrl[i].f2, DRAM_CTRL);
3073                         dword |= DC_DqsRcvEnTrain;
3074                         pci_write_config32(ctrl[i].f2, DRAM_CTRL, dword);
3075 #endif
3076                         tsc0[i] = rdtsc();
3077                 }
3078 #endif
3079
3080                 pci_write_config32(ctrl[i].f2, DRAM_CONFIG_LOW, dcl);
3081                 dcl |= DCL_InitDram;
3082                 pci_write_config32(ctrl[i].f2, DRAM_CONFIG_LOW, dcl);
3083         }
3084
3085         for (i = 0; i < controllers; i++) {
3086                 uint32_t dcl, dcm;
3087                 if (!sysinfo->ctrl_present[ i ])
3088                         continue;
3089                 /* Skip everything if I don't have any memory on this controller */
3090                 if (sysinfo->meminfo[i].dimm_mask==0x00) continue;
3091
3092                 printk_debug("Initializing memory: ");
3093                 int loops = 0;
3094                 do {
3095                         dcl = pci_read_config32(ctrl[i].f2, DRAM_CONFIG_LOW);
3096                         loops++;
3097                         if ((loops & 1023) == 0) {
3098                                 printk_debug(".");
3099                         }
3100                 } while(((dcl & DCL_InitDram) != 0) && (loops < TIMEOUT_LOOPS));
3101                 if (loops >= TIMEOUT_LOOPS) {
3102                         printk_debug(" failed\n");
3103                         continue;
3104                 }
3105
3106                 /* Wait until it is safe to touch memory */
3107                 do {
3108                         dcm = pci_read_config32(ctrl[i].f2, DRAM_CTRL_MISC);
3109                 } while(((dcm & DCM_MemClrStatus) == 0) /* || ((dcm & DCM_DramEnabled) == 0)*/ );
3110
3111 #if K8_REV_F_SUPPORT_F0_F1_WORKAROUND == 1
3112                 if (cpu_f0_f1[i]) {
3113                         tsc= rdtsc();
3114
3115                         print_debug_dqs_tsc("\nbegin tsc0", i, tsc0[i].hi, tsc0[i].lo, 2);
3116                         print_debug_dqs_tsc("end   tsc ", i, tsc.hi, tsc.lo, 2);
3117
3118                         if (tsc.lo<tsc0[i].lo) {
3119                                 tsc.hi--;
3120                         }
3121                         tsc.lo -= tsc0[i].lo;
3122                         tsc.hi -= tsc0[i].hi;
3123
3124                         tsc0[i].lo = tsc.lo;
3125                         tsc0[i].hi = tsc.hi;
3126
3127                         print_debug_dqs_tsc("     dtsc0", i, tsc0[i].hi, tsc0[i].lo, 2);
3128                 }
3129 #endif
3130                 printk_debug(" done\n");
3131         }
3132
3133 #if CONFIG_HW_MEM_HOLE_SIZEK != 0
3134         /* init hw mem hole here */
3135         /* DramHoleValid bit only can be set after MemClrStatus is set by Hardware */
3136         set_hw_mem_hole(controllers, ctrl);
3137 #endif
3138
3139         /* store tom to sysinfo, and it will be used by dqs_timing */
3140         {
3141                 msr_t msr;
3142                 //[1M, TOM)
3143                 msr = rdmsr(TOP_MEM);
3144                 sysinfo->tom_k = ((msr.hi<<24) | (msr.lo>>8))>>2;
3145
3146                 //[4G, TOM2)
3147                 msr = rdmsr(TOP_MEM2);
3148                 sysinfo->tom2_k = ((msr.hi<<24)| (msr.lo>>8))>>2;
3149         }
3150
3151         for (i = 0; i < controllers; i++) {
3152                 sysinfo->mem_trained[i] = 0;
3153
3154                 if (!sysinfo->ctrl_present[ i ])
3155                         continue;
3156
3157                 /* Skip everything if I don't have any memory on this controller */
3158                 if (sysinfo->meminfo[i].dimm_mask==0x00)
3159                         continue;
3160
3161                 sysinfo->mem_trained[i] = 0x80; // mem need to be trained
3162         }
3163
3164
3165 #if CONFIG_MEM_TRAIN_SEQ ==  0
3166    #if K8_REV_F_SUPPORT_F0_F1_WORKAROUND == 1
3167         dqs_timing(controllers, ctrl, tsc0, sysinfo);
3168    #else
3169         dqs_timing(controllers, ctrl, sysinfo);
3170    #endif
3171 #else
3172
3173 #if CONFIG_MEM_TRAIN_SEQ == 2
3174         /* need to enable mtrr, so dqs training could access the test address  */
3175         setup_mtrr_dqs(sysinfo->tom_k, sysinfo->tom2_k);
3176 #endif
3177
3178         for (i = 0; i < controllers; i++) {
3179                 /* Skip everything if I don't have any memory on this controller */
3180                 if (sysinfo->mem_trained[i]!=0x80)
3181                         continue;
3182
3183                 dqs_timing(i, &ctrl[i], sysinfo, 1);
3184
3185 #if CONFIG_MEM_TRAIN_SEQ == 1
3186                 break; // only train the first node with ram
3187 #endif
3188         }
3189
3190 #if CONFIG_MEM_TRAIN_SEQ == 2
3191         clear_mtrr_dqs(sysinfo->tom2_k);
3192 #endif
3193
3194 #endif
3195
3196 #if CONFIG_MEM_TRAIN_SEQ != 1
3197         wait_all_core0_mem_trained(sysinfo);
3198 #endif
3199
3200 }
3201
3202 static void fill_mem_ctrl(int controllers, struct mem_controller *ctrl_a,
3203                           const uint16_t *spd_addr)
3204 {
3205         int i;
3206         int j;
3207         struct mem_controller *ctrl;
3208         for (i=0;i<controllers; i++) {
3209                 ctrl = &ctrl_a[i];
3210                 ctrl->node_id = i;
3211                 ctrl->f0 = PCI_DEV(0, 0x18+i, 0);
3212                 ctrl->f1 = PCI_DEV(0, 0x18+i, 1);
3213                 ctrl->f2 = PCI_DEV(0, 0x18+i, 2);
3214                 ctrl->f3 = PCI_DEV(0, 0x18+i, 3);
3215
3216                 if (spd_addr == (void *)0) continue;
3217
3218                 for (j=0;j<DIMM_SOCKETS;j++) {
3219                         ctrl->channel0[j] = spd_addr[(i*2+0)*DIMM_SOCKETS + j];
3220                         ctrl->channel1[j] = spd_addr[(i*2+1)*DIMM_SOCKETS + j];
3221                 }
3222         }
3223 }