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