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