1 #include <cpu/amd/gx2def.h>
3 static void sdram_set_registers(const struct mem_controller *ctrl)
8 static void sdram_set_spd_registers(const struct mem_controller *ctrl)
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");
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)
27 /* 2. clock gating for PMode */
28 msr = rdmsr(0x20002004);
31 wrmsr(0x20002004, msr);
32 /* undocmented bits in GX, in LX there are
33 * 8 bits in PM1_UP_DLY */
34 msr = rdmsr(0x2000001a);
36 wrmsr(0x2000001a, msr);
37 //print_debug("sdram_enable step 2\r\n");
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");
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);
54 //print_debug("sdram_enable step 4\r\n");
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");
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");
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");
86 /* 8. load Mode Register by set and clear PROG_DRAM */
87 msr = rdmsr(0x20000018);
89 wrmsr(0x20000018, msr);
91 wrmsr(0x20000018, msr);
92 //print_debug("sdram_enable step 8\r\n");
95 for (i = 0; i < 200; i++)
99 msr = rdmsr(0x2000001f);
102 wrmsr(0x2000001f, msr);
104 /* set delay control */
105 msr = rdmsr(0x4c00000f);
108 wrmsr(0x4c00000f, msr);
110 /* DRAM working now?? */