diff --git a/src/northbridge/intel/gm45/raminit.c b/src/northbridge/intel/gm45/raminit.c index a57f201d4f..8a72d4afba 100644 --- a/src/northbridge/intel/gm45/raminit.c +++ b/src/northbridge/intel/gm45/raminit.c @@ -1498,6 +1498,7 @@ static void ddr3_select_clock_mux(const mem_clock_t ddr3clock, ((( clk1067 && !cardF[ch])?3:2) << 11) | mixed); } } + static void ddr3_write_io_init(const mem_clock_t ddr3clock, const dimminfo_t *const dimms, const stepping_t stepping, @@ -1564,9 +1565,10 @@ static void ddr3_write_io_init(const mem_clock_t ddr3clock, mchbar_write32(0x1590, 0x00e70067); mchbar_write32(0x1594, 0x000d8000); } -static void ddr3_read_io_init(const mem_clock_t ddr3clock, - const dimminfo_t *const dimms, - const int sff) + +static void ddr_read_io_init(const mem_clock_t ddr_clock, + const dimminfo_t *const dimms, + const int sff) { int ch; @@ -1577,7 +1579,7 @@ static void ddr3_read_io_init(const mem_clock_t ddr3clock, tmp = mchbar_read32(addr); tmp &= ~((3 << 25) | (1 << 8) | (7 << 16) | (0xf << 20) | (1 << 27)); tmp |= (1 << 27); - switch (ddr3clock) { + switch (ddr_clock) { case MEM_CLOCK_667MT: tmp |= (1 << 16) | (4 << 20); break; @@ -1598,10 +1600,10 @@ static void ddr3_read_io_init(const mem_clock_t ddr3clock, } } -static void memory_io_init(const mem_clock_t ddr3clock, - const dimminfo_t *const dimms, - const stepping_t stepping, - const int sff) +static void ddr3_memory_io_init(const mem_clock_t ddr3clock, + const dimminfo_t *const dimms, + const stepping_t stepping, + const int sff) { u32 tmp; @@ -1694,7 +1696,114 @@ static void memory_io_init(const mem_clock_t ddr3clock, ddr3_write_io_init(ddr3clock, dimms, stepping, sff); - ddr3_read_io_init(ddr3clock, dimms, sff); + ddr_read_io_init(ddr3clock, dimms, sff); +} + +static void ddr2_select_clock_mux(const dimminfo_t *const dimms) +{ + int ch; + unsigned int o; + FOR_EACH_POPULATED_CHANNEL(dimms, ch) { + const unsigned int b = 0x14b0 + (ch * 0x0100); + for (o = 0; o < 0x20; o += 4) + mchbar_clrbits32(b + o, 7 << 11); + } +} + +static void ddr2_write_io_init(const dimminfo_t *const dimms) +{ + int s; + + mchbar_clrsetbits32(CxWRTy_MCHBAR(0, 0), 0xf7bff71f, 0x008b0008); + + for (s = 1; s < 4; ++s) { + mchbar_clrsetbits32(CxWRTy_MCHBAR(0, s), 0xf7bff71f, 0x00800000); + } + + mchbar_clrsetbits32(0x1490, 0xf7fff77f, 0x00800000); + mchbar_clrsetbits32(0x1494, 0xf71f8000, 0x00040000); + + mchbar_clrsetbits32(CxWRTy_MCHBAR(1, 0), 0xf7bff71f, 0x00890008); + + for (s = 1; s < 4; ++s) { + mchbar_clrsetbits32(CxWRTy_MCHBAR(1, s), 0xf7bff71f, 0x00890000); + } + + mchbar_clrsetbits32(0x1590, 0xf7fff77f, 0x00800000); + mchbar_clrsetbits32(0x1594, 0xf71f8000, 0x00040000); +} + +static void ddr2_memory_io_init(const mem_clock_t ddr2clock, + const dimminfo_t *const dimms, + const stepping_t stepping, + const int sff) +{ + u32 tmp; + u32 tmp2; + + if (stepping < STEPPING_B1) + die("Stepping fsb_clock); /* Perform system-memory i/o initialization. */ - memory_io_init(timings->mem_clock, dimms, - sysinfo->stepping, sysinfo->sff); + if (sysinfo->spd_type == DDR2) { + ddr2_memory_io_init(timings->mem_clock, dimms, + sysinfo->stepping, sysinfo->sff); + } else { + ddr3_memory_io_init(timings->mem_clock, dimms, + sysinfo->stepping, sysinfo->sff); + } /* Initialize memory map with dummy values of 128MB per rank with a page size of 4KB. This makes the JEDEC initialization code easier. */