semi working with random 1 bit error
[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 = 0x00004800;
25         wrmsr(0x20000018, msr);
26
27         msr = rdmsr(0x20000019);
28         msr.hi = 0x18000108;
29         msr.lo = 0x286332a3;
30         wrmsr(0x20000019, msr);
31
32         /* 2. release from 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 |= 0xF000;
41         msr.lo = 0x0101;
42         wrmsr(0x2000001a, msr);
43         print_debug("sdram_enable step 2\r\n");
44
45         /* 3. release CKE mask to enable CKE */
46         msr = rdmsr(0x2000001d);
47         msr.lo &= !(0x03 << 8);
48         wrmsr(0x2000201d, msr);
49         print_debug("sdram_enable step 3\r\n");
50
51
52         /* 5. set refresh interval */
53         msr = rdmsr(0x20000018);
54         msr.lo |= (0x48 << 8);
55         wrmsr(0x20000018, msr);
56
57         /* set refresh staggering to 4 SDRAM clocks */
58         msr = rdmsr(0x20000018);
59         msr.lo &= !(0x03 << 6);
60         wrmsr(0x20000018, msr);
61
62         /* 6. enable RLL, load Extended Mode Register by set and clear PROG_DRAM */
63         msr = rdmsr(0x20000018);
64         msr.lo |=  ((0x01 << 28) | 0x01);
65         wrmsr(0x20000018, msr);
66         msr.lo &= !((0x01 << 28) | 0x01);
67         wrmsr(0x20000018, msr);
68         print_debug("sdram_enable step 7\r\n");
69
70         /* 7. Reset DLL, Bit 27 is undocumented in GX datasheet,
71          * it is documented in LX datasheet  */ 
72         /* load Mode Register by set and clear PROG_DRAM */
73         msr = rdmsr(0x20000018);
74         msr.lo |=  ((0x01 << 27) | 0x01);
75         wrmsr(0x20000018, msr);
76         msr.lo &= !((0x01 << 27) | 0x01);
77         wrmsr(0x20000018, msr);
78         print_debug("sdram_enable step 9\r\n");
79
80
81         /* 8. load Mode Register by set and clear PROG_DRAM */
82         msr = rdmsr(0x20000018);
83         msr.lo |=  0x01;
84         wrmsr(0x20000018, msr);
85         msr.lo &= !0x01;
86         wrmsr(0x20000018, msr);
87         print_debug("sdram_enable step 10\r\n");
88
89         /* 4. set and clear REF_TST 16 times, more shouldn't hurt */
90         for (i = 0; i < 19; i++) {
91                 msr = rdmsr(0x20000018);
92                 msr.lo |=  (0x01 << 3);
93                 wrmsr(0x20000018, msr);
94                 msr.lo &= !(0x01 << 3);
95                 wrmsr(0x20000018, msr);
96         }
97         print_debug("sdram_enable step 4\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         wrmsr(0x2000001f, msr);
107         print_debug("sdram_enable step 10\r\n");
108
109         /* DRAM working now?? */
110
111 }