resolving conflict with Ron's work
[coreboot.git] / src / northbridge / amd / gx2 / raminit.c
1 #include <cpu/amd/gx2def.h>
2
3 static void sdram_set_registers(const struct mem_controller *ctrl)
4 {
5 }
6
7 #if 0
8 static void sdram_set_spd_registers(const struct mem_controller *ctrl) 
9 {
10         msr_t mst;
11         unsigned char val;
12
13         /* get module banks per dimm, SPD byte 5 */
14         val = spd_read_byte(0xA0, 5);
15         if (val < 1 || val > 2)
16                 print_err("Module banks per dimm");
17
18 }
19 #endif
20 /* Section 6.1.3, LX processor databooks, BIOS Initialization Sequence
21  * Section 4.1.4, GX/CS5535 GeodeROM Porting guide */
22 static void sdram_enable(int controllers, const struct mem_controller *ctrl)
23 {
24         int i;
25         msr_t msr;
26
27         /* 2. clock gating for PMode */
28         msr = rdmsr(0x20002004);
29         msr.lo &= ~0x04;
30         msr.lo |=  0x01;
31         wrmsr(0x20002004, msr);
32         /* undocmented bits in GX, in LX there are
33          * 8 bits in PM1_UP_DLY */
34         msr = rdmsr(0x2000001a);
35         msr.lo = 0x0101;
36         wrmsr(0x2000001a, msr);
37         //print_debug("sdram_enable step 2\r\n");
38
39         /* 3. release CKE mask to enable CKE */
40         msr = rdmsr(0x2000001d);
41         msr.lo &= ~(0x03 << 8);
42         wrmsr(0x2000201d, msr);
43         //print_debug("sdram_enable step 3\r\n");
44
45         /* 4. set and clear REF_TST 16 times, more shouldn't hurt
46          * why this is before EMRS and MRS ? */
47         for (i = 0; i < 19; i++) {
48                 msr = rdmsr(0x20000018);
49                 msr.lo |=  (0x01 << 3);
50                 wrmsr(0x20000018, msr);
51                 msr.lo &= ~(0x01 << 3);
52                 wrmsr(0x20000018, msr);
53         }
54         //print_debug("sdram_enable step 4\r\n");
55
56         /* 5. set refresh interval */
57         msr = rdmsr(0x20000018);
58         msr.lo &= ~(0xffff << 8);
59         msr.lo |=  (0x34 << 8);
60         wrmsr(0x20000018, msr);
61         /* set refresh staggering to 4 SDRAM clocks */
62         msr = rdmsr(0x20000018);
63         msr.lo &= ~(0x03 << 6);
64         msr.lo |=  (0x00 << 6);
65         wrmsr(0x20000018, msr);
66         //print_debug("sdram_enable step 5\r\n");
67
68         /* 6. enable DLL, load Extended Mode Register by set and clear PROG_DRAM */
69         msr = rdmsr(0x20000018);
70         msr.lo |=  ((0x01 << 28) | 0x01);
71         wrmsr(0x20000018, msr);
72         msr.lo &= ~((0x01 << 28) | 0x01);
73         wrmsr(0x20000018, msr);
74         //print_debug("sdram_enable step 6\r\n");
75
76         /* 7. Reset DLL, Bit 27 is undocumented in GX datasheet,
77          * it is documented in LX datasheet  */ 
78         /* load Mode Register by set and clear PROG_DRAM */
79         msr = rdmsr(0x20000018);
80         msr.lo |=  ((0x01 << 27) | 0x01);
81         wrmsr(0x20000018, msr);
82         msr.lo &= ~((0x01 << 27) | 0x01);
83         wrmsr(0x20000018, msr);
84         //print_debug("sdram_enable step 7\r\n");
85
86         /* 8. load Mode Register by set and clear PROG_DRAM */
87         msr = rdmsr(0x20000018);
88         msr.lo |=  0x01;
89         wrmsr(0x20000018, msr);
90         msr.lo &= ~0x01;
91         wrmsr(0x20000018, msr);
92         //print_debug("sdram_enable step 8\r\n");
93
94         /* wait 200 SDCLKs */
95         for (i = 0; i < 200; i++)
96                 outb(0xaa, 0x80);
97
98         /* load RDSYNC */
99         msr = rdmsr(0x2000001f);
100         msr.hi = 0x000ff310;
101         msr.lo = 0x00000000;
102         wrmsr(0x2000001f, msr);
103
104         /* set delay control */
105         msr = rdmsr(0x4c00000f);
106         msr.hi = 0x830d415a;
107         msr.lo = 0x8ea0ad6a;
108         wrmsr(0x4c00000f, msr);
109
110         /* DRAM working now?? */
111
112 }