Angel Pons has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/38206 )
Change subject: nb/intel/sandybridge: Make MCHBAR arithmetics consistent ......................................................................
nb/intel/sandybridge: Make MCHBAR arithmetics consistent
Ensure that the operation order is always the same. This results in changes to the binary, but the effective result is the same.
Change-Id: I9772832c60089b35889df7298e20a2bd02b35b00 Signed-off-by: Angel Pons th3fanbus@gmail.com --- M src/northbridge/intel/sandybridge/raminit_common.c M src/northbridge/intel/sandybridge/raminit_ivy.c M src/northbridge/intel/sandybridge/raminit_sandy.c 3 files changed, 393 insertions(+), 396 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/06/38206/1
diff --git a/src/northbridge/intel/sandybridge/raminit_common.c b/src/northbridge/intel/sandybridge/raminit_common.c index 4d1c748..da12718 100644 --- a/src/northbridge/intel/sandybridge/raminit_common.c +++ b/src/northbridge/intel/sandybridge/raminit_common.c @@ -58,7 +58,7 @@ * Controls the idle time after issuing this DRAM command * Bit 16-32: number of clock-cylces to idle * - * DEFAULT_MCHBAR + 0x4284 + 0x400 * channel: execute command queue + * DEFAULT_MCHBAR + 0x4284 + channel * 0x400: execute command queue * Starts to execute all queued commands * Bit 0 : start DRAM command execution * Bit 18-19 : number of queued commands - 1 @@ -179,15 +179,15 @@ FOR_ALL_CHANNELS { // enable xover clk reg = get_XOVER_CLK(ctrl->rankmap[channel]); - printram("XOVER CLK [%x] = %x\n", channel * 0x100 + 0xc14, + printram("XOVER CLK [%x] = %x\n", 0xc14 + channel * 0x100, reg); - MCHBAR32(channel * 0x100 + 0xc14) = reg; + MCHBAR32(0xc14 + channel * 0x100) = reg;
// enable xover ctl & xover cmd reg = get_XOVER_CMD(ctrl->rankmap[channel]); - printram("XOVER CMD [%x] = %x\n", 0x100 * channel + 0x320c, + printram("XOVER CMD [%x] = %x\n", 0x320c + channel * 0x100, reg); - MCHBAR32(0x100 * channel + 0x320c) = reg; + MCHBAR32(0x320c + channel * 0x100) = reg; } }
@@ -202,14 +202,14 @@ if (IS_SANDY_CPU(cpu) && IS_SANDY_CPU_C(cpu)) { if (stretch == 2) stretch = 3; - addr = 0x401c + 0x400 * channel; + addr = 0x401c + channel * 0x400; MCHBAR32_AND_OR(addr, 0xffffc3ff, (stretch << 12) | (stretch << 10)); printk(RAM_DEBUG, "OTHP Workaround [%x] = %x\n", addr, MCHBAR32(addr)); } else { // OTHP - addr = 0x400c + 0x400 * channel; + addr = 0x400c + channel * 0x400; MCHBAR32_AND_OR(addr, 0xfff0ffff, (stretch << 16) | (stretch << 18)); printk(RAM_DEBUG, "OTHP [%x] = %x\n", addr, MCHBAR32(addr)); @@ -229,8 +229,8 @@ reg |= (ctrl->CAS << 8); reg |= (ctrl->CWL << 12); reg |= (ctrl->tRAS << 16); - printram("DBP [%x] = %x\n", TC_DBP_C0 + 0x400 * channel, reg); - MCHBAR32(TC_DBP_C0 + 0x400 * channel) = reg; + printram("DBP [%x] = %x\n", TC_DBP_C0 + channel * 0x400, reg); + MCHBAR32(TC_DBP_C0 + channel * 0x400) = reg;
// RAP reg = 0; @@ -241,11 +241,11 @@ reg |= (ctrl->tFAW << 16); reg |= (ctrl->tWR << 24); reg |= (3 << 30); - printram("RAP [%x] = %x\n", TC_RAP_C0 + 0x400 * channel, reg); - MCHBAR32(TC_RAP_C0 + 0x400 * channel) = reg; + printram("RAP [%x] = %x\n", TC_RAP_C0 + channel * 0x400, reg); + MCHBAR32(TC_RAP_C0 + channel * 0x400) = reg;
// OTHP - addr = 0x400 * channel + 0x400c; + addr = 0x400c + channel * 0x400; reg = 0; reg |= ctrl->tXPDLL; reg |= (ctrl->tXP << 5); @@ -254,7 +254,7 @@ printram("OTHP [%x] = %x\n", addr, reg); MCHBAR32(addr) = reg;
- MCHBAR32(0x400 * channel + 0x4014) = 0; + MCHBAR32(0x4014 + channel * 0x400) = 0;
MCHBAR32_OR(addr, 0x00020000);
@@ -271,10 +271,10 @@ reg = ((ctrl->tREFI & 0xffff) << 0) | ((ctrl->tRFC & 0x1ff) << 16) | (((val32 / 1024) & 0x7f) << 25); - printram("REFI [%x] = %x\n", TC_RFTP_C0 + 0x400 * channel, reg); - MCHBAR32(TC_RFTP_C0 + 0x400 * channel) = reg; + printram("REFI [%x] = %x\n", TC_RFTP_C0 + channel * 0x400, reg); + MCHBAR32(TC_RFTP_C0 + channel * 0x400) = reg;
- MCHBAR32_OR(TC_RFP_C0 + 0x400 * channel, 0xff); + MCHBAR32_OR(TC_RFP_C0 + channel * 0x400, 0xff);
// SRFTP reg = 0; @@ -286,9 +286,9 @@ reg = (reg & ~0x3ff0000) | (val32 << 16); val32 = ctrl->tMOD - 8; reg = (reg & ~0xf0000000) | (val32 << 28); - printram("SRFTP [%x] = %x\n", 0x400 * channel + 0x42a4, + printram("SRFTP [%x] = %x\n", 0x42a4 + channel * 0x400, reg); - MCHBAR32(0x400 * channel + 0x42a4) = reg; + MCHBAR32(0x42a4 + channel * 0x400) = reg; } }
@@ -618,7 +618,7 @@ static void wait_428c(int channel) { while (1) { - if (MCHBAR32(0x428c + (channel << 10)) & 0x50) + if (MCHBAR32(0x428c + channel * 0x400) & 0x50) return; } } @@ -636,13 +636,13 @@ slotrank = (ctrl->rankmap[channel] & 1) ? 0 : 2;
/* DRAM command ZQCS */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x0f003; - MCHBAR32(0x4230 + 0x400 * channel) = 0x80c01; - MCHBAR32(0x4200 + 0x400 * channel) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4220 + channel * 0x400) = 0x0f003; + MCHBAR32(0x4230 + channel * 0x400) = 0x80c01; + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60000; + MCHBAR32(0x4210 + channel * 0x400) = 0;
// execute command queue - why is bit 22 set here?! - MCHBAR32(0x4284 + 0x400 * channel) = (1 << 22) | RUN_QUEUE_4284(1); + MCHBAR32(0x4284 + channel * 0x400) = (1 << 22) | RUN_QUEUE_4284(1);
wait_428c(channel); } @@ -685,13 +685,13 @@ FOR_ALL_CHANNELS { // Set valid rank CKE reg = ctrl->rankmap[channel]; - MCHBAR32(0x42a0 + 0x400 * channel) = reg; + MCHBAR32(0x42a0 + channel * 0x400) = reg;
// Wait 10ns for ranks to settle //udelay(0.01);
reg = (reg & ~0xf0) | (ctrl->rankmap[channel] << 4); - MCHBAR32(0x42a0 + 0x400 * channel) = reg; + MCHBAR32(0x42a0 + channel * 0x400) = reg;
// Write reset using a NOP write_reset(ctrl); @@ -726,28 +726,28 @@ }
/* DRAM command MRS */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x0f000; - MCHBAR32(0x4230 + 0x400 * channel) = 0x41001; - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x0f000; + MCHBAR32(0x4230 + channel * 0x400) = 0x41001; + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | (reg << 20) | val | 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4210 + channel * 0x400) = 0;
/* DRAM command MRS */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f000; - MCHBAR32(0x4234 + 0x400 * channel) = 0x41001; - MCHBAR32(0x4204 + 0x400 * channel) = + MCHBAR32(0x4224 + channel * 0x400) = 0x1f000; + MCHBAR32(0x4234 + channel * 0x400) = 0x41001; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24) | (reg << 20) | val | 0x60000; - MCHBAR32(0x4214 + 0x400 * channel) = 0; + MCHBAR32(0x4214 + channel * 0x400) = 0;
/* DRAM command MRS */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x0f000; - MCHBAR32(0x4238 + 0x400 * channel) = 0x1001 | (ctrl->tMOD << 16); - MCHBAR32(0x4208 + 0x400 * channel) = + MCHBAR32(0x4228 + channel * 0x400) = 0x0f000; + MCHBAR32(0x4238 + channel * 0x400) = 0x1001 | (ctrl->tMOD << 16); + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24) | (reg << 20) | val | 0x60000; - MCHBAR32(0x4218 + 0x400 * channel) = 0; + MCHBAR32(0x4218 + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(3); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(3); }
static u32 make_mr0(ramctr_timing * ctrl, u8 rank) @@ -894,7 +894,7 @@ MCHBAR32_OR(0x5030, 8);
FOR_ALL_POPULATED_CHANNELS { - MCHBAR32_AND(0x4020 + 0x400 * channel, ~0x200000); + MCHBAR32_AND(0x4020 + channel * 0x400, ~0x200000);
wait_428c(channel);
@@ -904,14 +904,14 @@ wait_428c(channel);
/* DRAM command ZQCS */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x0f003; - MCHBAR32(0x4230 + 0x400 * channel) = 0x659001; - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x0f003; + MCHBAR32(0x4230 + channel * 0x400) = 0x659001; + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0x3e0; + MCHBAR32(0x4210 + channel * 0x400) = 0x3e0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(1); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(1);
// Drain wait_428c(channel); @@ -967,7 +967,7 @@ reg32 |= (slot320c[1] & 0x7f) << 18; reg32 |= (full_shift & 0x3f) | ((full_shift & 0x40) << 6);
- MCHBAR32(0x320c + 0x100 * channel) = reg32; + MCHBAR32(0x320c + channel * 0x100) = reg32;
/* enable CLK XOVER */ reg_c14 = get_XOVER_CLK(ctrl->rankmap[channel]); @@ -988,7 +988,7 @@ MCHBAR32(0xc14 + channel * 0x100) = reg_c14; MCHBAR32(0xc18 + channel * 0x100) = reg_c18;
- reg_io_latency = MCHBAR32(SC_IO_LATENCY_C0 + 0x400 * channel); + reg_io_latency = MCHBAR32(SC_IO_LATENCY_C0 + channel * 0x400); reg_io_latency &= 0xffff0000;
reg_4024 = 0; @@ -1033,7 +1033,7 @@ shift_402x) << (8 * slotrank);
FOR_ALL_LANES { - MCHBAR32(lane_registers[lane] + 0x10 + 0x100 * channel + + MCHBAR32(lane_registers[lane] + 0x10 + channel * 0x100 + 4 * slotrank) = (((ctrl->timings[channel][slotrank].lanes[lane]. @@ -1048,7 +1048,7 @@ | ((ctrl->timings[channel][slotrank].lanes[lane]. falling + shift) << 20));
- MCHBAR32(lane_registers[lane] + 0x20 + 0x100 * channel + + MCHBAR32(lane_registers[lane] + 0x20 + channel * 0x100 + 4 * slotrank) = (((ctrl->timings[channel][slotrank].lanes[lane]. @@ -1064,8 +1064,8 @@ timC + shift) & 0x40) << 13)); } } - MCHBAR32(0x4024 + 0x400 * channel) = reg_4024; - MCHBAR32(SC_IO_LATENCY_C0 + 0x400 * channel) = reg_io_latency; + MCHBAR32(0x4024 + channel * 0x400) = reg_4024; + MCHBAR32(SC_IO_LATENCY_C0 + channel * 0x400) = reg_io_latency; }
static void test_timA(ramctr_timing * ctrl, int channel, int slotrank) @@ -1076,32 +1076,32 @@ * write MR3 MPR enable * in this mode only RD and RDA are allowed * all reads return a predefined pattern */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f000; - MCHBAR32(0x4230 + 0x400 * channel) = (0xc01 | (ctrl->tMOD << 16)); - MCHBAR32(0x4200 + 0x400 * channel) = (slotrank << 24) | 0x360004; - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4220 + channel * 0x400) = 0x1f000; + MCHBAR32(0x4230 + channel * 0x400) = (0xc01 | (ctrl->tMOD << 16)); + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x360004; + MCHBAR32(0x4210 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4234 + 0x400 * channel) = 0x4040c01; - MCHBAR32(0x4204 + 0x400 * channel) = (slotrank << 24); - MCHBAR32(0x4214 + 0x400 * channel) = 0; + MCHBAR32(0x4224 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4234 + channel * 0x400) = 0x4040c01; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24); + MCHBAR32(0x4214 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4238 + 0x400 * channel) = 0x100f | ((ctrl->CAS + 36) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4218 + 0x400 * channel) = 0; + MCHBAR32(0x4228 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x100f | ((ctrl->CAS + 36) << 16); + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24) | 0x60000; + MCHBAR32(0x4218 + channel * 0x400) = 0;
/* DRAM command MRS * write MR3 MPR disable */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f000; - MCHBAR32(0x423c + 0x400 * channel) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x420c + 0x400 * channel) = (slotrank << 24) | 0x360000; - MCHBAR32(0x421c + 0x400 * channel) = 0; + MCHBAR32(0x422c + channel * 0x400) = 0x1f000; + MCHBAR32(0x423c + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x360000; + MCHBAR32(0x421c + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel); } @@ -1357,13 +1357,13 @@ wait_428c(channel);
/* DRAM command PREA */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f002; - MCHBAR32(0x4230 + 0x400 * channel) = 0xc01 | (ctrl->tRP << 16); - MCHBAR32(0x4200 + 0x400 * channel) = (slotrank << 24) | 0x60400; - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4220 + channel * 0x400) = 0x1f002; + MCHBAR32(0x4230 + channel * 0x400) = 0xc01 | (ctrl->tRP << 16); + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60400; + MCHBAR32(0x4210 + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(1); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(1);
MCHBAR32(0x3400) = (slotrank << 2) | 0x8001;
@@ -1442,7 +1442,7 @@ program_timings(ctrl, channel); } FOR_ALL_CHANNELS FOR_ALL_POPULATED_RANKS FOR_ALL_LANES { - MCHBAR32(0x4080 + 0x400 * channel + 4 * lane) = 0; + MCHBAR32(0x4080 + channel * 0x400 + lane * 4) = 0; } return 0; } @@ -1452,73 +1452,73 @@ int lane;
FOR_ALL_LANES { - MCHBAR32(0x4340 + 0x400 * channel + 4 * lane) = 0; - MCHBAR32(0x4140 + 0x400 * channel + 4 * lane); + MCHBAR32(0x4340 + channel * 0x400 + lane * 4) = 0; + MCHBAR32(0x4140 + channel * 0x400 + lane * 4); }
wait_428c(channel);
/* DRAM command ACT */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f006; - MCHBAR32(0x4230 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f006; + MCHBAR32(0x4230 + channel * 0x400) = (MAX((ctrl->tFAW >> 2) + 1, ctrl->tRRD) << 10) | 4 | (ctrl->tRCD << 16); - MCHBAR32(0x4200 + 0x400 * channel) = (slotrank << 24) | (6 << 16); - MCHBAR32(0x4210 + 0x400 * channel) = 0x244; + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | (6 << 16); + MCHBAR32(0x4210 + channel * 0x400) = 0x244;
/* DRAM command NOP */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f207; - MCHBAR32(0x4234 + 0x400 * channel) = 0x8041001; - MCHBAR32(0x4204 + 0x400 * channel) = (slotrank << 24) | 8; - MCHBAR32(0x4214 + 0x400 * channel) = 0x3e0; + MCHBAR32(0x4224 + channel * 0x400) = 0x1f207; + MCHBAR32(0x4234 + channel * 0x400) = 0x8041001; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24) | 8; + MCHBAR32(0x4214 + channel * 0x400) = 0x3e0;
/* DRAM command WR */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f201; - MCHBAR32(0x4238 + 0x400 * channel) = 0x80411f4; - MCHBAR32(0x4208 + 0x400 * channel) = slotrank << 24; - MCHBAR32(0x4218 + 0x400 * channel) = 0x242; + MCHBAR32(0x4228 + channel * 0x400) = 0x1f201; + MCHBAR32(0x4238 + channel * 0x400) = 0x80411f4; + MCHBAR32(0x4208 + channel * 0x400) = slotrank << 24; + MCHBAR32(0x4218 + channel * 0x400) = 0x242;
/* DRAM command NOP */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f207; - MCHBAR32(0x423c + 0x400 * channel) = + MCHBAR32(0x422c + channel * 0x400) = 0x1f207; + MCHBAR32(0x423c + channel * 0x400) = 0x8000c01 | ((ctrl->CWL + ctrl->tWTR + 5) << 16); - MCHBAR32(0x420c + 0x400 * channel) = (slotrank << 24) | 8; - MCHBAR32(0x421c + 0x400 * channel) = 0x3e0; + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 8; + MCHBAR32(0x421c + channel * 0x400) = 0x3e0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel);
/* DRAM command PREA */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f002; - MCHBAR32(0x4230 + 0x400 * channel) = 0xc01 | (ctrl->tRP << 16); - MCHBAR32(0x4200 + 0x400 * channel) = (slotrank << 24) | 0x60400; - MCHBAR32(0x4210 + 0x400 * channel) = 0x240; + MCHBAR32(0x4220 + channel * 0x400) = 0x1f002; + MCHBAR32(0x4230 + channel * 0x400) = 0xc01 | (ctrl->tRP << 16); + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60400; + MCHBAR32(0x4210 + channel * 0x400) = 0x240;
/* DRAM command ACT */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f006; - MCHBAR32(0x4234 + 0x400 * channel) = + MCHBAR32(0x4224 + channel * 0x400) = 0x1f006; + MCHBAR32(0x4234 + channel * 0x400) = (MAX(ctrl->tRRD, (ctrl->tFAW >> 2) + 1) << 10) | 8 | (ctrl->CAS << 16); - MCHBAR32(0x4204 + 0x400 * channel) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4214 + 0x400 * channel) = 0x244; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24) | 0x60000; + MCHBAR32(0x4214 + channel * 0x400) = 0x244;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4238 + 0x400 * channel) = + MCHBAR32(0x4228 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x40011f4 | (MAX(ctrl->tRTP, 8) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = (slotrank << 24); - MCHBAR32(0x4218 + 0x400 * channel) = 0x242; + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24); + MCHBAR32(0x4218 + channel * 0x400) = 0x242;
/* DRAM command PREA */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f002; - MCHBAR32(0x423c + 0x400 * channel) = 0xc01 | (ctrl->tRP << 16); - MCHBAR32(0x420c + 0x400 * channel) = (slotrank << 24) | 0x60400; - MCHBAR32(0x421c + 0x400 * channel) = 0x240; + MCHBAR32(0x422c + channel * 0x400) = 0x1f002; + MCHBAR32(0x423c + channel * 0x400) = 0xc01 | (ctrl->tRP << 16); + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x60400; + MCHBAR32(0x421c + channel * 0x400) = 0x240;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel); } @@ -1550,13 +1550,13 @@ wait_428c(channel);
/* DRAM command PREA */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f002; - MCHBAR32(0x4230 + 0x400 * channel) = 0xc01 | (ctrl->tRP << 16); - MCHBAR32(0x4200 + 0x400 * channel) = (slotrank << 24) | 0x60400; - MCHBAR32(0x4210 + 0x400 * channel) = 0x240; + MCHBAR32(0x4220 + channel * 0x400) = 0x1f002; + MCHBAR32(0x4230 + channel * 0x400) = 0xc01 | (ctrl->tRP << 16); + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60400; + MCHBAR32(0x4210 + channel * 0x400) = 0x240;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(1); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(1);
for (timC = 0; timC <= MAX_TIMC; timC++) { FOR_ALL_LANES ctrl->timings[channel][slotrank].lanes[lane]. @@ -1567,7 +1567,7 @@
FOR_ALL_LANES { statistics[lane][timC] = - MCHBAR32(0x4340 + 4 * lane + 0x400 * channel); + MCHBAR32(0x4340 + channel * 0x400 + lane * 4); } } FOR_ALL_LANES { @@ -1656,39 +1656,39 @@ * write MR3 MPR enable * in this mode only RD and RDA are allowed * all reads return a predefined pattern */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f000; - MCHBAR32(0x4230 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f000; + MCHBAR32(0x4230 + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x360004; - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4210 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4234 + 0x400 * channel) = 0x4041003; - MCHBAR32(0x4204 + 0x400 * channel) = + MCHBAR32(0x4224 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4234 + channel * 0x400) = 0x4041003; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24) | 0; - MCHBAR32(0x4214 + 0x400 * channel) = 0; + MCHBAR32(0x4214 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4238 + 0x400 * channel) = + MCHBAR32(0x4228 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x1001 | ((ctrl->CAS + 8) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4218 + 0x400 * channel) = 0; + MCHBAR32(0x4218 + channel * 0x400) = 0;
/* DRAM command MRS * write MR3 MPR disable */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f000; - MCHBAR32(0x423c + 0x400 * channel) = + MCHBAR32(0x422c + channel * 0x400) = 0x1f000; + MCHBAR32(0x423c + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x420c + 0x400 * channel) = + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x360000; - MCHBAR32(0x421c + 0x400 * channel) = 0; + MCHBAR32(0x421c + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel); } @@ -1708,39 +1708,39 @@ * write MR3 MPR enable * in this mode only RD and RDA are allowed * all reads return a predefined pattern */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f000; - MCHBAR32(0x4230 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f000; + MCHBAR32(0x4230 + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x360004; - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4210 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4234 + 0x400 * channel) = 0x4041003; - MCHBAR32(0x4204 + 0x400 * channel) = + MCHBAR32(0x4224 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4234 + channel * 0x400) = 0x4041003; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24) | 0; - MCHBAR32(0x4214 + 0x400 * channel) = 0; + MCHBAR32(0x4214 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4238 + 0x400 * channel) = + MCHBAR32(0x4228 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x1001 | ((ctrl->CAS + 8) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4218 + 0x400 * channel) = 0; + MCHBAR32(0x4218 + channel * 0x400) = 0;
/* DRAM command MRS * write MR3 MPR disable */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f000; - MCHBAR32(0x423c + 0x400 * channel) = + MCHBAR32(0x422c + channel * 0x400) = 0x1f000; + MCHBAR32(0x423c + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x420c + 0x400 * channel) = + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x360000; - MCHBAR32(0x421c + 0x400 * channel) = 0; + MCHBAR32(0x421c + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel); } @@ -1755,21 +1755,21 @@
wait_428c(channel); /* DRAM command NOP */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f207; - MCHBAR32(0x4230 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f207; + MCHBAR32(0x4230 + channel * 0x400) = 0x8000c01 | ((ctrl->CWL + ctrl->tWLO) << 16); - MCHBAR32(0x4200 + 0x400 * channel) = 8 | (slotrank << 24); - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4200 + channel * 0x400) = 8 | (slotrank << 24); + MCHBAR32(0x4210 + channel * 0x400) = 0;
/* DRAM command NOP */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f107; - MCHBAR32(0x4234 + 0x400 * channel) = + MCHBAR32(0x4224 + channel * 0x400) = 0x1f107; + MCHBAR32(0x4234 + channel * 0x400) = 0x4000c01 | ((ctrl->CAS + 38) << 16); - MCHBAR32(0x4204 + 0x400 * channel) = (slotrank << 24) | 4; - MCHBAR32(0x4214 + 0x400 * channel) = 0; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24) | 4; + MCHBAR32(0x4214 + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x400 * channel + 0x4284) = RUN_QUEUE_4284(2); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(2);
wait_428c(channel);
@@ -1856,76 +1856,76 @@ MCHBAR32(0x3400) = 0x200; FOR_ALL_POPULATED_CHANNELS { fill_pattern1(ctrl, channel); - MCHBAR32(0x4288 + (channel << 10)) = 1; + MCHBAR32(0x4288 + channel * 0x400) = 1; } FOR_ALL_POPULATED_CHANNELS FOR_ALL_POPULATED_RANKS {
- MCHBAR32(0x4288 + 0x400 * channel) = 0x10001; + MCHBAR32(0x4288 + channel * 0x400) = 0x10001;
wait_428c(channel);
/* DRAM command ACT */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f006; - MCHBAR32(0x4230 + 0x400 * channel) = 0xc01 | (ctrl->tRCD << 16); - MCHBAR32(0x4200 + 0x400 * channel) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4220 + channel * 0x400) = 0x1f006; + MCHBAR32(0x4230 + channel * 0x400) = 0xc01 | (ctrl->tRCD << 16); + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60000; + MCHBAR32(0x4210 + channel * 0x400) = 0;
/* DRAM command NOP */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f207; - MCHBAR32(0x4234 + 0x400 * channel) = 0x8040c01; - MCHBAR32(0x4204 + 0x400 * channel) = (slotrank << 24) | 0x8; - MCHBAR32(0x4214 + 0x400 * channel) = 0x3e0; + MCHBAR32(0x4224 + channel * 0x400) = 0x1f207; + MCHBAR32(0x4234 + channel * 0x400) = 0x8040c01; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24) | 0x8; + MCHBAR32(0x4214 + channel * 0x400) = 0x3e0;
/* DRAM command WR */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f201; - MCHBAR32(0x4238 + 0x400 * channel) = 0x8041003; - MCHBAR32(0x4208 + 0x400 * channel) = (slotrank << 24); - MCHBAR32(0x4218 + 0x400 * channel) = 0x3e2; + MCHBAR32(0x4228 + channel * 0x400) = 0x1f201; + MCHBAR32(0x4238 + channel * 0x400) = 0x8041003; + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24); + MCHBAR32(0x4218 + channel * 0x400) = 0x3e2;
/* DRAM command NOP */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f207; - MCHBAR32(0x423c + 0x400 * channel) = + MCHBAR32(0x422c + channel * 0x400) = 0x1f207; + MCHBAR32(0x423c + channel * 0x400) = 0x8000c01 | ((ctrl->CWL + ctrl->tWTR + 5) << 16); - MCHBAR32(0x420c + 0x400 * channel) = (slotrank << 24) | 0x8; - MCHBAR32(0x421c + 0x400 * channel) = 0x3e0; + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x8; + MCHBAR32(0x421c + channel * 0x400) = 0x3e0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel);
/* DRAM command PREA */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f002; - MCHBAR32(0x4230 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f002; + MCHBAR32(0x4230 + channel * 0x400) = 0xc01 | ((ctrl->tRP) << 16); - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60400; - MCHBAR32(0x4210 + 0x400 * channel) = 0x240; + MCHBAR32(0x4210 + channel * 0x400) = 0x240;
/* DRAM command ACT */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f006; - MCHBAR32(0x4234 + 0x400 * channel) = + MCHBAR32(0x4224 + channel * 0x400) = 0x1f006; + MCHBAR32(0x4234 + channel * 0x400) = 0xc01 | ((ctrl->tRCD) << 16); - MCHBAR32(0x4204 + 0x400 * channel) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4214 + 0x400 * channel) = 0; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24) | 0x60000; + MCHBAR32(0x4214 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x3f105; - MCHBAR32(0x4238 + 0x400 * channel) = 0x4000c01 | ((ctrl->tRP + + MCHBAR32(0x4228 + channel * 0x400) = 0x3f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x4000c01 | ((ctrl->tRP + ctrl->timings[channel][slotrank].val_4024 + ctrl->timings[channel][slotrank].io_latency) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = (slotrank << 24) | 0x60008; - MCHBAR32(0x4218 + 0x400 * channel) = 0; + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24) | 0x60008; + MCHBAR32(0x4218 + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(3); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(3);
wait_428c(channel); FOR_ALL_LANES { u64 res = MCHBAR32(lane_registers[lane] + - 0x100 * channel + 4); + channel * 0x100 + 4); res |= ((u64) MCHBAR32(lane_registers[lane] + - 0x100 * channel + 8)) << 32; + channel * 0x100 + 8)) << 32; old = ctrl->timings[channel][slotrank].lanes[lane].timB; ctrl->timings[channel][slotrank].lanes[lane].timB += get_timB_high_adjust(res) * 64; @@ -1950,13 +1950,13 @@ slotrank = !(ctrl->rankmap[channel] & 1) ? 2 : 0;
/* DRAM command ACT */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x0f003; - MCHBAR32(0x4230 + 0x400 * channel) = 0x41001; - MCHBAR32(0x4200 + 0x400 * channel) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0x3e0; + MCHBAR32(0x4220 + channel * 0x400) = 0x0f003; + MCHBAR32(0x4230 + channel * 0x400) = 0x41001; + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60000; + MCHBAR32(0x4210 + channel * 0x400) = 0x3e0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(1); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(1);
wait_428c(channel); } @@ -1979,11 +1979,11 @@ int err;
FOR_ALL_POPULATED_CHANNELS - MCHBAR32_OR(0x4008 + 0x400 * channel, 0x8000000); + MCHBAR32_OR(0x4008 + channel * 0x400, 0x8000000);
FOR_ALL_POPULATED_CHANNELS { write_op(ctrl, channel); - MCHBAR32_OR(0x4020 + 0x400 * channel, 0x200000); + MCHBAR32_OR(0x4020 + channel * 0x400, 0x200000); }
/* refresh disable */ @@ -2025,18 +2025,18 @@ MCHBAR32_OR(0x5030, 8);
FOR_ALL_POPULATED_CHANNELS { - MCHBAR32_AND(0x4020 + 0x400 * channel, ~0x00200000); - MCHBAR32(0x428c + 0x400 * channel); + MCHBAR32_AND(0x4020 + channel * 0x400, ~0x00200000); + MCHBAR32(0x428c + channel * 0x400); wait_428c(channel);
/* DRAM command ZQCS */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x0f003; - MCHBAR32(0x4230 + 0x400 * channel) = 0x659001; - MCHBAR32(0x4200 + 0x400 * channel) = 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0x3e0; + MCHBAR32(0x4220 + channel * 0x400) = 0x0f003; + MCHBAR32(0x4230 + channel * 0x400) = 0x659001; + MCHBAR32(0x4200 + channel * 0x400) = 0x60000; + MCHBAR32(0x4210 + channel * 0x400) = 0x3e0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(1); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(1);
wait_428c(channel); } @@ -2048,12 +2048,12 @@ printram("CPF\n");
FOR_ALL_CHANNELS FOR_ALL_POPULATED_RANKS FOR_ALL_LANES { - MCHBAR32_AND(0x4080 + 0x400 * channel + 4 * lane, 0); + MCHBAR32_AND(0x4080 + channel * 0x400 + lane * 4, 0); }
FOR_ALL_POPULATED_CHANNELS { fill_pattern0(ctrl, channel, 0xaaaaaaaa, 0x55555555); - MCHBAR32(0x4288 + (channel << 10)) = 0; + MCHBAR32(0x4288 + channel * 0x400) = 0; }
FOR_ALL_CHANNELS FOR_ALL_POPULATED_RANKS { @@ -2072,7 +2072,7 @@ program_timings(ctrl, channel);
FOR_ALL_CHANNELS FOR_ALL_POPULATED_RANKS FOR_ALL_LANES { - MCHBAR32_AND(0x4080 + 0x400 * channel + 4 * lane, 0); + MCHBAR32_AND(0x4080 + channel * 0x400 + lane * 4, 0); } return 0; } @@ -2095,46 +2095,46 @@ MCHBAR32(4 * lane + 0x4f40) = 0; }
- MCHBAR32(0x4288 + 0x400 * channel) = 0x1f; + MCHBAR32(0x4288 + channel * 0x400) = 0x1f;
wait_428c(channel); /* DRAM command ACT */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f006; - MCHBAR32(0x4230 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f006; + MCHBAR32(0x4230 + channel * 0x400) = ((MAX(ctrl->tRRD, (ctrl->tFAW >> 2) + 1)) << 10) | 8 | (ctrl->tRCD << 16); - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | ctr | 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0x244; + MCHBAR32(0x4210 + channel * 0x400) = 0x244;
/* DRAM command WR */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f201; - MCHBAR32(0x4234 + 0x400 * channel) = + MCHBAR32(0x4224 + channel * 0x400) = 0x1f201; + MCHBAR32(0x4234 + channel * 0x400) = 0x8001020 | ((ctrl->CWL + ctrl->tWTR + 8) << 16); - MCHBAR32(0x4204 + 0x400 * channel) = (slotrank << 24); - MCHBAR32(0x4244 + 0x400 * channel) = 0x389abcd; - MCHBAR32(0x4214 + 0x400 * channel) = 0x20e42; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24); + MCHBAR32(0x4244 + channel * 0x400) = 0x389abcd; + MCHBAR32(0x4214 + channel * 0x400) = 0x20e42;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4238 + 0x400 * channel) = + MCHBAR32(0x4228 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x4001020 | (MAX(ctrl->tRTP, 8) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = (slotrank << 24); - MCHBAR32(0x4248 + 0x400 * channel) = 0x389abcd; - MCHBAR32(0x4218 + 0x400 * channel) = 0x20e42; + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24); + MCHBAR32(0x4248 + channel * 0x400) = 0x389abcd; + MCHBAR32(0x4218 + channel * 0x400) = 0x20e42;
/* DRAM command PRE */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f002; - MCHBAR32(0x423c + 0x400 * channel) = 0xf1001; - MCHBAR32(0x420c + 0x400 * channel) = (slotrank << 24) | 0x60400; - MCHBAR32(0x421c + 0x400 * channel) = 0x240; + MCHBAR32(0x422c + channel * 0x400) = 0x1f002; + MCHBAR32(0x423c + channel * 0x400) = 0xf1001; + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x60400; + MCHBAR32(0x421c + channel * 0x400) = 0x240;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel); FOR_ALL_LANES { - u32 r32 = MCHBAR32(0x4340 + 4 * lane + 0x400 * channel); + u32 r32 = MCHBAR32(0x4340 + channel * 0x400 + lane * 4);
if (r32 == 0) lanes_ok |= 1 << lane; @@ -2192,16 +2192,16 @@ slotrank = !(ctrl->rankmap[channel] & 1) ? 2 : 0;
/* DRAM command ZQCS */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x0f003; - MCHBAR32(0x4230 + 0x400 * channel) = 0x41001; - MCHBAR32(0x4200 + 0x400 * channel) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0x3e0; + MCHBAR32(0x4220 + channel * 0x400) = 0x0f003; + MCHBAR32(0x4230 + channel * 0x400) = 0x41001; + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60000; + MCHBAR32(0x4210 + channel * 0x400) = 0x3e0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(1); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(1);
wait_428c(channel); - MCHBAR32_OR(0x4020 + 0x400 * channel, 0x200000); + MCHBAR32_OR(0x4020 + channel * 0x400, 0x200000); }
/* refresh disable */ @@ -2213,13 +2213,13 @@ slotrank = !(ctrl->rankmap[channel] & 1) ? 2 : 0;
/* DRAM command ZQCS */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x0f003; - MCHBAR32(0x4230 + 0x400 * channel) = 0x41001; - MCHBAR32(0x4200 + 0x400 * channel) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0x3e0; + MCHBAR32(0x4220 + channel * 0x400) = 0x0f003; + MCHBAR32(0x4230 + channel * 0x400) = 0x41001; + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60000; + MCHBAR32(0x4210 + channel * 0x400) = 0x3e0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(1); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(1);
wait_428c(channel); } @@ -2251,7 +2251,7 @@
ctrl->cmd_stretch[channel] = cmd_stretch;
- MCHBAR32(0x4004 + 0x400 * channel) = + MCHBAR32(0x4004 + channel * 0x400) = ctrl->tRRD | (ctrl->tRTP << 4) | (ctrl->tCKE << 8) @@ -2307,7 +2307,7 @@
FOR_ALL_POPULATED_CHANNELS { fill_pattern5(ctrl, channel, 0); - MCHBAR32(0x4288 + 0x400 * channel) = 0x1f; + MCHBAR32(0x4288 + channel * 0x400) = 0x1f; }
FOR_ALL_POPULATED_CHANNELS { @@ -2371,8 +2371,8 @@ program_timings(ctrl, channel);
FOR_ALL_LANES { - MCHBAR32(0x4340 + 0x400 * channel + 4 * lane) = 0; - MCHBAR32(0x400 * channel + 4 * lane + 0x4140); + MCHBAR32(0x4340 + channel * 0x400 + lane * 4) = 0; + MCHBAR32(0x4140 + channel * 0x400 + lane * 4); }
wait_428c(channel); @@ -2380,41 +2380,41 @@ * write MR3 MPR enable * in this mode only RD and RDA are allowed * all reads return a predefined pattern */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f000; - MCHBAR32(0x4230 + 0x400 * channel) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f000; + MCHBAR32(0x4230 + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x360004; - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4210 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4234 + 0x400 * channel) = 0x40411f4; - MCHBAR32(0x4204 + 0x400 * channel) = slotrank << 24; - MCHBAR32(0x4214 + 0x400 * channel) = 0; + MCHBAR32(0x4224 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4234 + channel * 0x400) = 0x40411f4; + MCHBAR32(0x4204 + channel * 0x400) = slotrank << 24; + MCHBAR32(0x4214 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4238 + 0x400 * channel) = + MCHBAR32(0x4228 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x1001 | ((ctrl->CAS + 8) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4218 + 0x400 * channel) = 0; + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24) | 0x60000; + MCHBAR32(0x4218 + channel * 0x400) = 0;
/* DRAM command MRS * MR3 disable MPR */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f000; - MCHBAR32(0x423c + 0x400 * channel) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x420c + 0x400 * channel) = + MCHBAR32(0x422c + channel * 0x400) = 0x1f000; + MCHBAR32(0x423c + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x360000; - MCHBAR32(0x421c + 0x400 * channel) = 0; + MCHBAR32(0x421c + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel);
FOR_ALL_LANES { statistics[lane][edge] = - MCHBAR32(0x4340 + 0x400 * channel + lane * 4); + MCHBAR32(0x4340 + channel * 0x400 + lane * 4); } } FOR_ALL_LANES { @@ -2444,14 +2444,14 @@ toggle_io_reset();
FOR_ALL_POPULATED_CHANNELS FOR_ALL_LANES { - MCHBAR32(4 * lane + 0x400 * channel + 0x4080) = 0; + MCHBAR32(0x4080 + channel * 0x400 + lane * 4) = 0; }
FOR_ALL_POPULATED_CHANNELS { fill_pattern0(ctrl, channel, 0, 0); - MCHBAR32(0x4288 + (channel << 10)) = 0; + MCHBAR32(0x4288 + channel * 0x400) = 0; FOR_ALL_LANES { - MCHBAR32(0x400 * channel + lane * 4 + 0x4140); + MCHBAR32(0x4140 + channel * 0x400 + lane * 4); }
FOR_ALL_POPULATED_RANKS FOR_ALL_LANES { @@ -2471,39 +2471,39 @@ * write MR3 MPR enable * in this mode only RD and RDA are allowed * all reads return a predefined pattern */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f000; - MCHBAR32(0x4230 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f000; + MCHBAR32(0x4230 + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x360004; - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4210 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4234 + 0x400 * channel) = 0x4041003; - MCHBAR32(0x4204 + 0x400 * channel) = + MCHBAR32(0x4224 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4234 + channel * 0x400) = 0x4041003; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24) | 0; - MCHBAR32(0x4214 + 0x400 * channel) = 0; + MCHBAR32(0x4214 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4238 + 0x400 * channel) = + MCHBAR32(0x4228 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x1001 | ((ctrl->CAS + 8) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4218 + 0x400 * channel) = 0; + MCHBAR32(0x4218 + channel * 0x400) = 0;
/* DRAM command MRS * MR3 disable MPR */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f000; - MCHBAR32(0x423c + 0x400 * channel) = + MCHBAR32(0x422c + channel * 0x400) = 0x1f000; + MCHBAR32(0x423c + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x420c + 0x400 * channel) = + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x360000; - MCHBAR32(0x421c + 0x400 * channel) = 0; + MCHBAR32(0x421c + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel); } @@ -2527,39 +2527,39 @@ * write MR3 MPR enable * in this mode only RD and RDA are allowed * all reads return a predefined pattern */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f000; - MCHBAR32(0x4230 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f000; + MCHBAR32(0x4230 + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x360004; - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4210 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4234 + 0x400 * channel) = 0x4041003; - MCHBAR32(0x4204 + 0x400 * channel) = + MCHBAR32(0x4224 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4234 + channel * 0x400) = 0x4041003; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24) | 0; - MCHBAR32(0x4214 + 0x400 * channel) = 0; + MCHBAR32(0x4214 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4238 + 0x400 * channel) = + MCHBAR32(0x4228 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x1001 | ((ctrl->CAS + 8) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4218 + 0x400 * channel) = 0; + MCHBAR32(0x4218 + channel * 0x400) = 0;
/* DRAM command MRS * MR3 disable MPR */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f000; - MCHBAR32(0x423c + 0x400 * channel) = + MCHBAR32(0x422c + channel * 0x400) = 0x1f000; + MCHBAR32(0x423c + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x420c + 0x400 * channel) = + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x360000; - MCHBAR32(0x421c + 0x400 * channel) = 0; + MCHBAR32(0x421c + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel); } @@ -2567,13 +2567,13 @@ /* XXX: check any measured value ? */
FOR_ALL_LANES { - MCHBAR32(0x4080 + 0x400 * channel + lane * 4) = - ~MCHBAR32(0x4040 + 0x400 * channel + lane * 4) + MCHBAR32(0x4080 + channel * 0x400 + lane * 4) = + ~MCHBAR32(0x4040 + channel * 0x400 + lane * 4) & 0xff; }
fill_pattern0(ctrl, channel, 0, 0xffffffff); - MCHBAR32(0x4288 + (channel << 10)) = 0; + MCHBAR32(0x4288 + channel * 0x400) = 0; }
/* FIXME: under some conditions (older chipsets?) vendor BIOS sets both edges to the same value. */ @@ -2611,7 +2611,7 @@ }
FOR_ALL_CHANNELS FOR_ALL_POPULATED_RANKS FOR_ALL_LANES { - MCHBAR32(0x4080 + 0x400 * channel + 4 * lane) = 0; + MCHBAR32(0x4080 + channel * 0x400 + lane * 4) = 0; } return 0; } @@ -2634,12 +2634,12 @@ }
for (i = 0; i < 3; i++) { - MCHBAR32(0x3000 + 0x100 * channel) = reg3000b24[i] << 24; + MCHBAR32(0x3000 + channel * 0x100) = reg3000b24[i] << 24; printram("[%x] = 0x%08x\n", - 0x3000 + 0x100 * channel, reg3000b24[i] << 24); + 0x3000 + channel * 0x100, reg3000b24[i] << 24); for (pat = 0; pat < NUM_PATTERNS; pat++) { fill_pattern5(ctrl, channel, pat); - MCHBAR32(0x4288 + 0x400 * channel) = 0x1f; + MCHBAR32(0x4288 + channel * 0x400) = 0x1f; printram("using pattern %d\n", pat); for (edge = 0; edge <= MAX_EDGE_TIMING; edge++) { FOR_ALL_LANES { @@ -2651,59 +2651,56 @@ program_timings(ctrl, channel);
FOR_ALL_LANES { - MCHBAR32(0x4340 + 0x400 * channel + - 4 * lane) = 0; - MCHBAR32(0x400 * channel + - 4 * lane + 0x4140); + MCHBAR32(0x4340 + channel * 0x400 + lane * 4) = 0; + MCHBAR32(0x4140 + channel * 0x400 + lane * 4); } wait_428c(channel);
/* DRAM command ACT */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f006; - MCHBAR32(0x4230 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f006; + MCHBAR32(0x4230 + channel * 0x400) = 0x4 | (ctrl->tRCD << 16) | (MAX(ctrl->tRRD, (ctrl->tFAW >> 2) + 1) << 10); - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0x240; + MCHBAR32(0x4210 + channel * 0x400) = 0x240;
/* DRAM command WR */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f201; - MCHBAR32(0x4234 + 0x400 * channel) = 0x8005020 | + MCHBAR32(0x4224 + channel * 0x400) = 0x1f201; + MCHBAR32(0x4234 + channel * 0x400) = 0x8005020 | ((ctrl->tWTR + ctrl->CWL + 8) << 16); - MCHBAR32(0x4204 + 0x400 * channel) = + MCHBAR32(0x4204 + channel * 0x400) = slotrank << 24; - MCHBAR32(0x4214 + 0x400 * channel) = 0x242; + MCHBAR32(0x4214 + channel * 0x400) = 0x242;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4238 + 0x400 * channel) = + MCHBAR32(0x4228 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x4005020 | (MAX(ctrl->tRTP, 8) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = + MCHBAR32(0x4208 + channel * 0x400) = slotrank << 24; - MCHBAR32(0x4218 + 0x400 * channel) = 0x242; + MCHBAR32(0x4218 + channel * 0x400) = 0x242;
/* DRAM command PRE */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f002; - MCHBAR32(0x423c + 0x400 * channel) = + MCHBAR32(0x422c + channel * 0x400) = 0x1f002; + MCHBAR32(0x423c + channel * 0x400) = 0xc01 | (ctrl->tRP << 16); - MCHBAR32(0x420c + 0x400 * channel) = + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x60400; - MCHBAR32(0x421c + 0x400 * channel) = 0; + MCHBAR32(0x421c + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel); FOR_ALL_LANES { - MCHBAR32(0x4340 + - 0x400 * channel + lane * 4); + MCHBAR32(0x4340 + channel * 0x400 + lane * 4); }
raw_statistics[edge] = - MCHBAR32(0x436c + 0x400 * channel); + MCHBAR32(0x436c + channel * 0x400); } FOR_ALL_LANES { struct run rn; @@ -2776,7 +2773,7 @@ program_timings(ctrl, channel);
FOR_ALL_CHANNELS FOR_ALL_POPULATED_RANKS FOR_ALL_LANES { - MCHBAR32(0x4080 + 0x400 * channel + 4 * lane) = 0; + MCHBAR32(0x4080 + channel * 0x400 + lane * 4) = 0; } return 0; } @@ -2785,36 +2782,36 @@ { wait_428c(channel); /* DRAM command ACT */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f006; - MCHBAR32(0x4230 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f006; + MCHBAR32(0x4230 + channel * 0x400) = (MAX((ctrl->tFAW >> 2) + 1, ctrl->tRRD) << 10) | (ctrl->tRCD << 16) | 4; - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0x244; + MCHBAR32(0x4210 + channel * 0x400) = 0x244;
/* DRAM command WR */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f201; - MCHBAR32(0x4234 + 0x400 * channel) = + MCHBAR32(0x4224 + channel * 0x400) = 0x1f201; + MCHBAR32(0x4234 + channel * 0x400) = 0x80011e0 | ((ctrl->tWTR + ctrl->CWL + 8) << 16); - MCHBAR32(0x4204 + 0x400 * channel) = slotrank << 24; - MCHBAR32(0x4214 + 0x400 * channel) = 0x242; + MCHBAR32(0x4204 + channel * 0x400) = slotrank << 24; + MCHBAR32(0x4214 + channel * 0x400) = 0x242;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4238 + 0x400 * channel) = + MCHBAR32(0x4228 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x40011e0 | (MAX(ctrl->tRTP, 8) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = slotrank << 24; - MCHBAR32(0x4218 + 0x400 * channel) = 0x242; + MCHBAR32(0x4208 + channel * 0x400) = slotrank << 24; + MCHBAR32(0x4218 + channel * 0x400) = 0x242;
/* DRAM command PRE */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f002; - MCHBAR32(0x423c + 0x400 * channel) = 0x1001 | (ctrl->tRP << 16); - MCHBAR32(0x420c + 0x400 * channel) = (slotrank << 24) | 0x60400; - MCHBAR32(0x421c + 0x400 * channel) = 0; + MCHBAR32(0x422c + channel * 0x400) = 0x1f002; + MCHBAR32(0x423c + channel * 0x400) = 0x1001 | (ctrl->tRP << 16); + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x60400; + MCHBAR32(0x421c + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel); } @@ -2851,7 +2848,7 @@ statistics[MAX_TIMC] = 1;
fill_pattern5(ctrl, channel, pat); - MCHBAR32(0x4288 + 0x400 * channel) = + MCHBAR32(0x4288 + channel * 0x400) = 0x1f; for (timC = 0; timC < MAX_TIMC; timC++) { FOR_ALL_LANES @@ -2861,7 +2858,7 @@ test_timC_write (ctrl, channel, slotrank);
raw_statistics[timC] = - MCHBAR32(0x436c + 0x400 * channel); + MCHBAR32(0x436c + channel * 0x400); } FOR_ALL_LANES { struct run rn; @@ -2895,7 +2892,7 @@ }
FOR_ALL_CHANNELS { - MCHBAR32_AND((channel * 0x100) + 0xe3c, ~0x3f000000); + MCHBAR32_AND(0xe3c + (channel * 0x100), ~0x3f000000); udelay(2); }
@@ -2949,9 +2946,9 @@ int channel, slotrank;
FOR_ALL_CHANNELS FOR_ALL_POPULATED_RANKS { - MCHBAR32(0x0004 + (channel << 8) + lane_registers[slotrank]) = + MCHBAR32(0x0004 + channel * 0x100 + lane_registers[slotrank]) = make_mr0(ctrl, slotrank); - MCHBAR32(0x0008 + (channel << 8) + lane_registers[slotrank]) = + MCHBAR32(0x0008 + channel * 0x100 + lane_registers[slotrank]) = make_mr1(ctrl, slotrank, channel); } } @@ -2962,7 +2959,7 @@
slotrank = 0; FOR_ALL_POPULATED_CHANNELS - if (MCHBAR32(0x42a0 + (channel << 10)) & 0xa000) { + if (MCHBAR32(0x42a0 + channel * 0x400) & 0xa000) { printk(BIOS_EMERG, "Mini channel test failed (1): %d\n", channel); return MAKE_ERR; @@ -2970,7 +2967,7 @@ FOR_ALL_POPULATED_CHANNELS { fill_pattern0(ctrl, channel, 0x12345678, 0x98765432);
- MCHBAR32(0x4288 + (channel << 10)) = 0; + MCHBAR32(0x4288 + channel * 0x400) = 0; }
for (slotrank = 0; slotrank < 4; slotrank++) @@ -2983,39 +2980,39 @@ wait_428c(channel);
/* DRAM command ACT */ - MCHBAR32(0x4220 + (channel << 10)) = 0x0001f006; - MCHBAR32(0x4230 + (channel << 10)) = 0x0028a004; - MCHBAR32(0x4200 + (channel << 10)) = + MCHBAR32(0x4220 + channel * 0x400) = 0x0001f006; + MCHBAR32(0x4230 + channel * 0x400) = 0x0028a004; + MCHBAR32(0x4200 + channel * 0x400) = 0x00060000 | (slotrank << 24); - MCHBAR32(0x4210 + (channel << 10)) = 0x00000244; + MCHBAR32(0x4210 + channel * 0x400) = 0x00000244;
/* DRAM command WR */ - MCHBAR32(0x4224 + (channel << 10)) = 0x0001f201; - MCHBAR32(0x4234 + (channel << 10)) = 0x08281064; - MCHBAR32(0x4204 + (channel << 10)) = + MCHBAR32(0x4224 + channel * 0x400) = 0x0001f201; + MCHBAR32(0x4234 + channel * 0x400) = 0x08281064; + MCHBAR32(0x4204 + channel * 0x400) = 0x00000000 | (slotrank << 24); - MCHBAR32(0x4214 + (channel << 10)) = 0x00000242; + MCHBAR32(0x4214 + channel * 0x400) = 0x00000242;
/* DRAM command RD */ - MCHBAR32(0x4228 + (channel << 10)) = 0x0001f105; - MCHBAR32(0x4238 + (channel << 10)) = 0x04281064; - MCHBAR32(0x4208 + (channel << 10)) = + MCHBAR32(0x4228 + channel * 0x400) = 0x0001f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x04281064; + MCHBAR32(0x4208 + channel * 0x400) = 0x00000000 | (slotrank << 24); - MCHBAR32(0x4218 + (channel << 10)) = 0x00000242; + MCHBAR32(0x4218 + channel * 0x400) = 0x00000242;
/* DRAM command PRE */ - MCHBAR32(0x422c + (channel << 10)) = 0x0001f002; - MCHBAR32(0x423c + (channel << 10)) = 0x00280c01; - MCHBAR32(0x420c + (channel << 10)) = + MCHBAR32(0x422c + channel * 0x400) = 0x0001f002; + MCHBAR32(0x423c + channel * 0x400) = 0x00280c01; + MCHBAR32(0x420c + channel * 0x400) = 0x00060400 | (slotrank << 24); - MCHBAR32(0x421c + (channel << 10)) = 0x00000240; + MCHBAR32(0x421c + channel * 0x400) = 0x00000240;
// execute command queue - MCHBAR32(0x4284 + (channel << 10)) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel); FOR_ALL_LANES - if (MCHBAR32(0x4340 + (channel << 10) + 4 * lane)) { + if (MCHBAR32(0x4340 + channel * 0x400 + lane * 4)) { printk(BIOS_EMERG, "Mini channel test failed (2): %d, %d, %d\n", channel, slotrank, lane); return MAKE_ERR; @@ -3035,10 +3032,10 @@ {0x00028bfa, 0x53fe4b49, 0x19ed5483} }; FOR_ALL_POPULATED_CHANNELS { - MCHBAR32(0x4020 + 0x400 * channel) &= ~0x10000000; - MCHBAR32(0x4034 + 0x400 * channel) = seeds[channel][0]; - MCHBAR32(0x403c + 0x400 * channel) = seeds[channel][1]; - MCHBAR32(0x4038 + 0x400 * channel) = seeds[channel][2]; + MCHBAR32(0x4020 + channel * 0x400) &= ~0x10000000; + MCHBAR32(0x4034 + channel * 0x400) = seeds[channel][0]; + MCHBAR32(0x403c + channel * 0x400) = seeds[channel][1]; + MCHBAR32(0x4038 + channel * 0x400) = seeds[channel][2]; } }
@@ -3060,7 +3057,7 @@
FOR_ALL_POPULATED_CHANNELS { // Always drive command bus - MCHBAR32_OR(0x4004 + 0x400 * channel, 0x20000000); + MCHBAR32_OR(0x4004 + channel * 0x400, 0x20000000); }
udelay(1); @@ -3096,7 +3093,7 @@
dram_odt_stretch(ctrl, channel);
- MCHBAR32(0x4008 + (channel << 10)) = + MCHBAR32(0x4008 + channel * 0x400) = 0x0a000000 | (b20 << 20) | ((ctrl->ref_card_offset[channel] + 2) << 16) | b4_8_12; } @@ -3106,9 +3103,9 @@ { int channel; FOR_ALL_POPULATED_CHANNELS { - MCHBAR32(0x42a0 + 0x400 * channel) = + MCHBAR32(0x42a0 + channel * 0x400) = 0x00001000 | ctrl->rankmap[channel]; - MCHBAR32_AND(0x4004 + 0x400 * channel, ~0x20000000); + MCHBAR32_AND(0x4004 + channel * 0x400, ~0x20000000); } }
@@ -3130,7 +3127,7 @@ MCHBAR32(0x4cd4) = 0x00000046;
FOR_ALL_CHANNELS - MCHBAR32_AND_OR(0x400c + 0x400 * channel, 0xFFFFCFFF, 0x1000); + MCHBAR32_AND_OR(0x400c + channel * 0x400, 0xFFFFCFFF, 0x1000);
if (is_mobile) /* APD - DLL Off, 64 DCLKs until idle, decision per rank */ @@ -3169,7 +3166,7 @@ MCHBAR32_AND(MEM_TRML_INTERRUPT, ~0x1f);
FOR_ALL_CHANNELS - MCHBAR32_AND_OR(TC_RFP_C0 + 0x400 * channel, ~0x30000, 1 << 16); + MCHBAR32_AND_OR(TC_RFP_C0 + channel * 0x400, ~0x30000, 1 << 16);
MCHBAR32_OR(0x5030, 1); MCHBAR32_OR(0x5030, 0x80); @@ -3183,7 +3180,7 @@ r32 = MCHBAR32(0x5064); if (r32 & 0x20000) t1_cycles += (r32 & 0xfff); - t1_cycles += MCHBAR32(channel * 0x400 + 0x42a4) & 0xfff; + t1_cycles += MCHBAR32(0x42a4 + channel * 0x400) & 0xfff; t1_ns = t1_cycles * ctrl->tCK / 256 + 544; if (!(r32 & 0x20000)) t1_ns += 500; @@ -3211,7 +3208,7 @@ int channel, slotrank, lane;
FOR_ALL_POPULATED_CHANNELS - MCHBAR32(0x4004 + 0x400 * channel) = + MCHBAR32(0x4004 + channel * 0x400) = ctrl->tRRD | (ctrl->tRTP << 4) | (ctrl->tCKE << 8) @@ -3227,15 +3224,15 @@ }
FOR_ALL_CHANNELS FOR_ALL_POPULATED_RANKS FOR_ALL_LANES { - MCHBAR32(0x4080 + 0x400 * channel + 4 * lane) = 0; + MCHBAR32(0x4080 + channel * 0x400 + lane * 4) = 0; }
FOR_ALL_POPULATED_CHANNELS - MCHBAR32_OR(0x4008 + 0x400 * channel, 0x8000000); + MCHBAR32_OR(0x4008 + channel * 0x400, 0x8000000);
FOR_ALL_POPULATED_CHANNELS { udelay (1); - MCHBAR32_OR(0x4020 + 0x400 * channel, 0x200000); + MCHBAR32_OR(0x4020 + channel * 0x400, 0x200000); }
printram("CPE\n"); @@ -3267,7 +3264,7 @@ // Set valid rank CKE reg = 0; reg = (reg & ~0xf) | ctrl->rankmap[channel]; - addr = 0x400 * channel + 0x42a0; + addr = 0x42a0 + channel * 0x400; MCHBAR32(addr) = reg;
// Wait 10ns for ranks to settle @@ -3288,7 +3285,7 @@ MCHBAR32(0x3000) = 0;
FOR_ALL_CHANNELS { - MCHBAR32_AND(channel * 0x100 + 0xe3c, ~0x3f000000); + MCHBAR32_AND(0xe3c + channel * 0x100, ~0x3f000000); udelay(2); }
diff --git a/src/northbridge/intel/sandybridge/raminit_ivy.c b/src/northbridge/intel/sandybridge/raminit_ivy.c index 5c1a58a..7542a37 100644 --- a/src/northbridge/intel/sandybridge/raminit_ivy.c +++ b/src/northbridge/intel/sandybridge/raminit_ivy.c @@ -590,12 +590,12 @@
// IO clock FOR_ALL_CHANNELS { - MCHBAR32(0xc00 + 0x100 * channel) = ctrl->rankmap[channel]; + MCHBAR32(0xc00 + channel * 0x100) = ctrl->rankmap[channel]; }
// IO command FOR_ALL_CHANNELS { - MCHBAR32(0x3200 + 0x100 * channel) = ctrl->rankmap[channel]; + MCHBAR32(0x3200 + channel * 0x100) = ctrl->rankmap[channel]; }
// IO control diff --git a/src/northbridge/intel/sandybridge/raminit_sandy.c b/src/northbridge/intel/sandybridge/raminit_sandy.c index 9fa6c7b..1191754 100644 --- a/src/northbridge/intel/sandybridge/raminit_sandy.c +++ b/src/northbridge/intel/sandybridge/raminit_sandy.c @@ -361,12 +361,12 @@
// IO clock FOR_ALL_CHANNELS { - MCHBAR32(0xc00 + 0x100 * channel) = ctrl->rankmap[channel]; + MCHBAR32(0xc00 + channel * 0x100) = ctrl->rankmap[channel]; }
// IO command FOR_ALL_CHANNELS { - MCHBAR32(0x3200 + 0x100 * channel) = ctrl->rankmap[channel]; + MCHBAR32(0x3200 + channel * 0x100) = ctrl->rankmap[channel]; }
// IO control
Felix Held has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/38206 )
Change subject: nb/intel/sandybridge: Make MCHBAR arithmetics consistent ......................................................................
Patch Set 1: Code-Review+1
looks good to me, i'd like this to be tested on hardware before +2ing and submitting this change, since i might have missed something in my review, so only a +1 from me for now
Felix Held has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/38206 )
Change subject: nb/intel/sandybridge: Make MCHBAR arithmetics consistent ......................................................................
Patch Set 1: Code-Review+2
tested on lenovo/x230
Angel Pons has posted comments on this change. ( https://review.coreboot.org/c/coreboot/+/38206 )
Change subject: nb/intel/sandybridge: Make MCHBAR arithmetics consistent ......................................................................
Patch Set 1:
Patch Set 1: Code-Review+2
tested on lenovo/x230
Works on Gigabyte GA-H61MA-D3V as well, using a Sandybridge i5-2400.
Yes, I said I would use Asus P8H61-M PRO, but this other board was already inside a computer :^)
Felix Held has submitted this change. ( https://review.coreboot.org/c/coreboot/+/38206 )
Change subject: nb/intel/sandybridge: Make MCHBAR arithmetics consistent ......................................................................
nb/intel/sandybridge: Make MCHBAR arithmetics consistent
Ensure that the operation order is always the same. This results in changes to the binary, but the effective result is the same.
Change-Id: I9772832c60089b35889df7298e20a2bd02b35b00 Signed-off-by: Angel Pons th3fanbus@gmail.com Reviewed-on: https://review.coreboot.org/c/coreboot/+/38206 Tested-by: build bot (Jenkins) no-reply@coreboot.org Reviewed-by: Felix Held felix-coreboot@felixheld.de --- M src/northbridge/intel/sandybridge/raminit_common.c M src/northbridge/intel/sandybridge/raminit_ivy.c M src/northbridge/intel/sandybridge/raminit_sandy.c 3 files changed, 393 insertions(+), 396 deletions(-)
Approvals: build bot (Jenkins): Verified Felix Held: Looks good to me, approved
diff --git a/src/northbridge/intel/sandybridge/raminit_common.c b/src/northbridge/intel/sandybridge/raminit_common.c index 4d1c748..da12718 100644 --- a/src/northbridge/intel/sandybridge/raminit_common.c +++ b/src/northbridge/intel/sandybridge/raminit_common.c @@ -58,7 +58,7 @@ * Controls the idle time after issuing this DRAM command * Bit 16-32: number of clock-cylces to idle * - * DEFAULT_MCHBAR + 0x4284 + 0x400 * channel: execute command queue + * DEFAULT_MCHBAR + 0x4284 + channel * 0x400: execute command queue * Starts to execute all queued commands * Bit 0 : start DRAM command execution * Bit 18-19 : number of queued commands - 1 @@ -179,15 +179,15 @@ FOR_ALL_CHANNELS { // enable xover clk reg = get_XOVER_CLK(ctrl->rankmap[channel]); - printram("XOVER CLK [%x] = %x\n", channel * 0x100 + 0xc14, + printram("XOVER CLK [%x] = %x\n", 0xc14 + channel * 0x100, reg); - MCHBAR32(channel * 0x100 + 0xc14) = reg; + MCHBAR32(0xc14 + channel * 0x100) = reg;
// enable xover ctl & xover cmd reg = get_XOVER_CMD(ctrl->rankmap[channel]); - printram("XOVER CMD [%x] = %x\n", 0x100 * channel + 0x320c, + printram("XOVER CMD [%x] = %x\n", 0x320c + channel * 0x100, reg); - MCHBAR32(0x100 * channel + 0x320c) = reg; + MCHBAR32(0x320c + channel * 0x100) = reg; } }
@@ -202,14 +202,14 @@ if (IS_SANDY_CPU(cpu) && IS_SANDY_CPU_C(cpu)) { if (stretch == 2) stretch = 3; - addr = 0x401c + 0x400 * channel; + addr = 0x401c + channel * 0x400; MCHBAR32_AND_OR(addr, 0xffffc3ff, (stretch << 12) | (stretch << 10)); printk(RAM_DEBUG, "OTHP Workaround [%x] = %x\n", addr, MCHBAR32(addr)); } else { // OTHP - addr = 0x400c + 0x400 * channel; + addr = 0x400c + channel * 0x400; MCHBAR32_AND_OR(addr, 0xfff0ffff, (stretch << 16) | (stretch << 18)); printk(RAM_DEBUG, "OTHP [%x] = %x\n", addr, MCHBAR32(addr)); @@ -229,8 +229,8 @@ reg |= (ctrl->CAS << 8); reg |= (ctrl->CWL << 12); reg |= (ctrl->tRAS << 16); - printram("DBP [%x] = %x\n", TC_DBP_C0 + 0x400 * channel, reg); - MCHBAR32(TC_DBP_C0 + 0x400 * channel) = reg; + printram("DBP [%x] = %x\n", TC_DBP_C0 + channel * 0x400, reg); + MCHBAR32(TC_DBP_C0 + channel * 0x400) = reg;
// RAP reg = 0; @@ -241,11 +241,11 @@ reg |= (ctrl->tFAW << 16); reg |= (ctrl->tWR << 24); reg |= (3 << 30); - printram("RAP [%x] = %x\n", TC_RAP_C0 + 0x400 * channel, reg); - MCHBAR32(TC_RAP_C0 + 0x400 * channel) = reg; + printram("RAP [%x] = %x\n", TC_RAP_C0 + channel * 0x400, reg); + MCHBAR32(TC_RAP_C0 + channel * 0x400) = reg;
// OTHP - addr = 0x400 * channel + 0x400c; + addr = 0x400c + channel * 0x400; reg = 0; reg |= ctrl->tXPDLL; reg |= (ctrl->tXP << 5); @@ -254,7 +254,7 @@ printram("OTHP [%x] = %x\n", addr, reg); MCHBAR32(addr) = reg;
- MCHBAR32(0x400 * channel + 0x4014) = 0; + MCHBAR32(0x4014 + channel * 0x400) = 0;
MCHBAR32_OR(addr, 0x00020000);
@@ -271,10 +271,10 @@ reg = ((ctrl->tREFI & 0xffff) << 0) | ((ctrl->tRFC & 0x1ff) << 16) | (((val32 / 1024) & 0x7f) << 25); - printram("REFI [%x] = %x\n", TC_RFTP_C0 + 0x400 * channel, reg); - MCHBAR32(TC_RFTP_C0 + 0x400 * channel) = reg; + printram("REFI [%x] = %x\n", TC_RFTP_C0 + channel * 0x400, reg); + MCHBAR32(TC_RFTP_C0 + channel * 0x400) = reg;
- MCHBAR32_OR(TC_RFP_C0 + 0x400 * channel, 0xff); + MCHBAR32_OR(TC_RFP_C0 + channel * 0x400, 0xff);
// SRFTP reg = 0; @@ -286,9 +286,9 @@ reg = (reg & ~0x3ff0000) | (val32 << 16); val32 = ctrl->tMOD - 8; reg = (reg & ~0xf0000000) | (val32 << 28); - printram("SRFTP [%x] = %x\n", 0x400 * channel + 0x42a4, + printram("SRFTP [%x] = %x\n", 0x42a4 + channel * 0x400, reg); - MCHBAR32(0x400 * channel + 0x42a4) = reg; + MCHBAR32(0x42a4 + channel * 0x400) = reg; } }
@@ -618,7 +618,7 @@ static void wait_428c(int channel) { while (1) { - if (MCHBAR32(0x428c + (channel << 10)) & 0x50) + if (MCHBAR32(0x428c + channel * 0x400) & 0x50) return; } } @@ -636,13 +636,13 @@ slotrank = (ctrl->rankmap[channel] & 1) ? 0 : 2;
/* DRAM command ZQCS */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x0f003; - MCHBAR32(0x4230 + 0x400 * channel) = 0x80c01; - MCHBAR32(0x4200 + 0x400 * channel) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4220 + channel * 0x400) = 0x0f003; + MCHBAR32(0x4230 + channel * 0x400) = 0x80c01; + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60000; + MCHBAR32(0x4210 + channel * 0x400) = 0;
// execute command queue - why is bit 22 set here?! - MCHBAR32(0x4284 + 0x400 * channel) = (1 << 22) | RUN_QUEUE_4284(1); + MCHBAR32(0x4284 + channel * 0x400) = (1 << 22) | RUN_QUEUE_4284(1);
wait_428c(channel); } @@ -685,13 +685,13 @@ FOR_ALL_CHANNELS { // Set valid rank CKE reg = ctrl->rankmap[channel]; - MCHBAR32(0x42a0 + 0x400 * channel) = reg; + MCHBAR32(0x42a0 + channel * 0x400) = reg;
// Wait 10ns for ranks to settle //udelay(0.01);
reg = (reg & ~0xf0) | (ctrl->rankmap[channel] << 4); - MCHBAR32(0x42a0 + 0x400 * channel) = reg; + MCHBAR32(0x42a0 + channel * 0x400) = reg;
// Write reset using a NOP write_reset(ctrl); @@ -726,28 +726,28 @@ }
/* DRAM command MRS */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x0f000; - MCHBAR32(0x4230 + 0x400 * channel) = 0x41001; - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x0f000; + MCHBAR32(0x4230 + channel * 0x400) = 0x41001; + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | (reg << 20) | val | 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4210 + channel * 0x400) = 0;
/* DRAM command MRS */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f000; - MCHBAR32(0x4234 + 0x400 * channel) = 0x41001; - MCHBAR32(0x4204 + 0x400 * channel) = + MCHBAR32(0x4224 + channel * 0x400) = 0x1f000; + MCHBAR32(0x4234 + channel * 0x400) = 0x41001; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24) | (reg << 20) | val | 0x60000; - MCHBAR32(0x4214 + 0x400 * channel) = 0; + MCHBAR32(0x4214 + channel * 0x400) = 0;
/* DRAM command MRS */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x0f000; - MCHBAR32(0x4238 + 0x400 * channel) = 0x1001 | (ctrl->tMOD << 16); - MCHBAR32(0x4208 + 0x400 * channel) = + MCHBAR32(0x4228 + channel * 0x400) = 0x0f000; + MCHBAR32(0x4238 + channel * 0x400) = 0x1001 | (ctrl->tMOD << 16); + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24) | (reg << 20) | val | 0x60000; - MCHBAR32(0x4218 + 0x400 * channel) = 0; + MCHBAR32(0x4218 + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(3); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(3); }
static u32 make_mr0(ramctr_timing * ctrl, u8 rank) @@ -894,7 +894,7 @@ MCHBAR32_OR(0x5030, 8);
FOR_ALL_POPULATED_CHANNELS { - MCHBAR32_AND(0x4020 + 0x400 * channel, ~0x200000); + MCHBAR32_AND(0x4020 + channel * 0x400, ~0x200000);
wait_428c(channel);
@@ -904,14 +904,14 @@ wait_428c(channel);
/* DRAM command ZQCS */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x0f003; - MCHBAR32(0x4230 + 0x400 * channel) = 0x659001; - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x0f003; + MCHBAR32(0x4230 + channel * 0x400) = 0x659001; + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0x3e0; + MCHBAR32(0x4210 + channel * 0x400) = 0x3e0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(1); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(1);
// Drain wait_428c(channel); @@ -967,7 +967,7 @@ reg32 |= (slot320c[1] & 0x7f) << 18; reg32 |= (full_shift & 0x3f) | ((full_shift & 0x40) << 6);
- MCHBAR32(0x320c + 0x100 * channel) = reg32; + MCHBAR32(0x320c + channel * 0x100) = reg32;
/* enable CLK XOVER */ reg_c14 = get_XOVER_CLK(ctrl->rankmap[channel]); @@ -988,7 +988,7 @@ MCHBAR32(0xc14 + channel * 0x100) = reg_c14; MCHBAR32(0xc18 + channel * 0x100) = reg_c18;
- reg_io_latency = MCHBAR32(SC_IO_LATENCY_C0 + 0x400 * channel); + reg_io_latency = MCHBAR32(SC_IO_LATENCY_C0 + channel * 0x400); reg_io_latency &= 0xffff0000;
reg_4024 = 0; @@ -1033,7 +1033,7 @@ shift_402x) << (8 * slotrank);
FOR_ALL_LANES { - MCHBAR32(lane_registers[lane] + 0x10 + 0x100 * channel + + MCHBAR32(lane_registers[lane] + 0x10 + channel * 0x100 + 4 * slotrank) = (((ctrl->timings[channel][slotrank].lanes[lane]. @@ -1048,7 +1048,7 @@ | ((ctrl->timings[channel][slotrank].lanes[lane]. falling + shift) << 20));
- MCHBAR32(lane_registers[lane] + 0x20 + 0x100 * channel + + MCHBAR32(lane_registers[lane] + 0x20 + channel * 0x100 + 4 * slotrank) = (((ctrl->timings[channel][slotrank].lanes[lane]. @@ -1064,8 +1064,8 @@ timC + shift) & 0x40) << 13)); } } - MCHBAR32(0x4024 + 0x400 * channel) = reg_4024; - MCHBAR32(SC_IO_LATENCY_C0 + 0x400 * channel) = reg_io_latency; + MCHBAR32(0x4024 + channel * 0x400) = reg_4024; + MCHBAR32(SC_IO_LATENCY_C0 + channel * 0x400) = reg_io_latency; }
static void test_timA(ramctr_timing * ctrl, int channel, int slotrank) @@ -1076,32 +1076,32 @@ * write MR3 MPR enable * in this mode only RD and RDA are allowed * all reads return a predefined pattern */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f000; - MCHBAR32(0x4230 + 0x400 * channel) = (0xc01 | (ctrl->tMOD << 16)); - MCHBAR32(0x4200 + 0x400 * channel) = (slotrank << 24) | 0x360004; - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4220 + channel * 0x400) = 0x1f000; + MCHBAR32(0x4230 + channel * 0x400) = (0xc01 | (ctrl->tMOD << 16)); + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x360004; + MCHBAR32(0x4210 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4234 + 0x400 * channel) = 0x4040c01; - MCHBAR32(0x4204 + 0x400 * channel) = (slotrank << 24); - MCHBAR32(0x4214 + 0x400 * channel) = 0; + MCHBAR32(0x4224 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4234 + channel * 0x400) = 0x4040c01; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24); + MCHBAR32(0x4214 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4238 + 0x400 * channel) = 0x100f | ((ctrl->CAS + 36) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4218 + 0x400 * channel) = 0; + MCHBAR32(0x4228 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x100f | ((ctrl->CAS + 36) << 16); + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24) | 0x60000; + MCHBAR32(0x4218 + channel * 0x400) = 0;
/* DRAM command MRS * write MR3 MPR disable */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f000; - MCHBAR32(0x423c + 0x400 * channel) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x420c + 0x400 * channel) = (slotrank << 24) | 0x360000; - MCHBAR32(0x421c + 0x400 * channel) = 0; + MCHBAR32(0x422c + channel * 0x400) = 0x1f000; + MCHBAR32(0x423c + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x360000; + MCHBAR32(0x421c + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel); } @@ -1357,13 +1357,13 @@ wait_428c(channel);
/* DRAM command PREA */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f002; - MCHBAR32(0x4230 + 0x400 * channel) = 0xc01 | (ctrl->tRP << 16); - MCHBAR32(0x4200 + 0x400 * channel) = (slotrank << 24) | 0x60400; - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4220 + channel * 0x400) = 0x1f002; + MCHBAR32(0x4230 + channel * 0x400) = 0xc01 | (ctrl->tRP << 16); + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60400; + MCHBAR32(0x4210 + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(1); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(1);
MCHBAR32(0x3400) = (slotrank << 2) | 0x8001;
@@ -1442,7 +1442,7 @@ program_timings(ctrl, channel); } FOR_ALL_CHANNELS FOR_ALL_POPULATED_RANKS FOR_ALL_LANES { - MCHBAR32(0x4080 + 0x400 * channel + 4 * lane) = 0; + MCHBAR32(0x4080 + channel * 0x400 + lane * 4) = 0; } return 0; } @@ -1452,73 +1452,73 @@ int lane;
FOR_ALL_LANES { - MCHBAR32(0x4340 + 0x400 * channel + 4 * lane) = 0; - MCHBAR32(0x4140 + 0x400 * channel + 4 * lane); + MCHBAR32(0x4340 + channel * 0x400 + lane * 4) = 0; + MCHBAR32(0x4140 + channel * 0x400 + lane * 4); }
wait_428c(channel);
/* DRAM command ACT */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f006; - MCHBAR32(0x4230 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f006; + MCHBAR32(0x4230 + channel * 0x400) = (MAX((ctrl->tFAW >> 2) + 1, ctrl->tRRD) << 10) | 4 | (ctrl->tRCD << 16); - MCHBAR32(0x4200 + 0x400 * channel) = (slotrank << 24) | (6 << 16); - MCHBAR32(0x4210 + 0x400 * channel) = 0x244; + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | (6 << 16); + MCHBAR32(0x4210 + channel * 0x400) = 0x244;
/* DRAM command NOP */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f207; - MCHBAR32(0x4234 + 0x400 * channel) = 0x8041001; - MCHBAR32(0x4204 + 0x400 * channel) = (slotrank << 24) | 8; - MCHBAR32(0x4214 + 0x400 * channel) = 0x3e0; + MCHBAR32(0x4224 + channel * 0x400) = 0x1f207; + MCHBAR32(0x4234 + channel * 0x400) = 0x8041001; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24) | 8; + MCHBAR32(0x4214 + channel * 0x400) = 0x3e0;
/* DRAM command WR */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f201; - MCHBAR32(0x4238 + 0x400 * channel) = 0x80411f4; - MCHBAR32(0x4208 + 0x400 * channel) = slotrank << 24; - MCHBAR32(0x4218 + 0x400 * channel) = 0x242; + MCHBAR32(0x4228 + channel * 0x400) = 0x1f201; + MCHBAR32(0x4238 + channel * 0x400) = 0x80411f4; + MCHBAR32(0x4208 + channel * 0x400) = slotrank << 24; + MCHBAR32(0x4218 + channel * 0x400) = 0x242;
/* DRAM command NOP */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f207; - MCHBAR32(0x423c + 0x400 * channel) = + MCHBAR32(0x422c + channel * 0x400) = 0x1f207; + MCHBAR32(0x423c + channel * 0x400) = 0x8000c01 | ((ctrl->CWL + ctrl->tWTR + 5) << 16); - MCHBAR32(0x420c + 0x400 * channel) = (slotrank << 24) | 8; - MCHBAR32(0x421c + 0x400 * channel) = 0x3e0; + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 8; + MCHBAR32(0x421c + channel * 0x400) = 0x3e0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel);
/* DRAM command PREA */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f002; - MCHBAR32(0x4230 + 0x400 * channel) = 0xc01 | (ctrl->tRP << 16); - MCHBAR32(0x4200 + 0x400 * channel) = (slotrank << 24) | 0x60400; - MCHBAR32(0x4210 + 0x400 * channel) = 0x240; + MCHBAR32(0x4220 + channel * 0x400) = 0x1f002; + MCHBAR32(0x4230 + channel * 0x400) = 0xc01 | (ctrl->tRP << 16); + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60400; + MCHBAR32(0x4210 + channel * 0x400) = 0x240;
/* DRAM command ACT */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f006; - MCHBAR32(0x4234 + 0x400 * channel) = + MCHBAR32(0x4224 + channel * 0x400) = 0x1f006; + MCHBAR32(0x4234 + channel * 0x400) = (MAX(ctrl->tRRD, (ctrl->tFAW >> 2) + 1) << 10) | 8 | (ctrl->CAS << 16); - MCHBAR32(0x4204 + 0x400 * channel) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4214 + 0x400 * channel) = 0x244; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24) | 0x60000; + MCHBAR32(0x4214 + channel * 0x400) = 0x244;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4238 + 0x400 * channel) = + MCHBAR32(0x4228 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x40011f4 | (MAX(ctrl->tRTP, 8) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = (slotrank << 24); - MCHBAR32(0x4218 + 0x400 * channel) = 0x242; + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24); + MCHBAR32(0x4218 + channel * 0x400) = 0x242;
/* DRAM command PREA */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f002; - MCHBAR32(0x423c + 0x400 * channel) = 0xc01 | (ctrl->tRP << 16); - MCHBAR32(0x420c + 0x400 * channel) = (slotrank << 24) | 0x60400; - MCHBAR32(0x421c + 0x400 * channel) = 0x240; + MCHBAR32(0x422c + channel * 0x400) = 0x1f002; + MCHBAR32(0x423c + channel * 0x400) = 0xc01 | (ctrl->tRP << 16); + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x60400; + MCHBAR32(0x421c + channel * 0x400) = 0x240;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel); } @@ -1550,13 +1550,13 @@ wait_428c(channel);
/* DRAM command PREA */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f002; - MCHBAR32(0x4230 + 0x400 * channel) = 0xc01 | (ctrl->tRP << 16); - MCHBAR32(0x4200 + 0x400 * channel) = (slotrank << 24) | 0x60400; - MCHBAR32(0x4210 + 0x400 * channel) = 0x240; + MCHBAR32(0x4220 + channel * 0x400) = 0x1f002; + MCHBAR32(0x4230 + channel * 0x400) = 0xc01 | (ctrl->tRP << 16); + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60400; + MCHBAR32(0x4210 + channel * 0x400) = 0x240;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(1); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(1);
for (timC = 0; timC <= MAX_TIMC; timC++) { FOR_ALL_LANES ctrl->timings[channel][slotrank].lanes[lane]. @@ -1567,7 +1567,7 @@
FOR_ALL_LANES { statistics[lane][timC] = - MCHBAR32(0x4340 + 4 * lane + 0x400 * channel); + MCHBAR32(0x4340 + channel * 0x400 + lane * 4); } } FOR_ALL_LANES { @@ -1656,39 +1656,39 @@ * write MR3 MPR enable * in this mode only RD and RDA are allowed * all reads return a predefined pattern */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f000; - MCHBAR32(0x4230 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f000; + MCHBAR32(0x4230 + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x360004; - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4210 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4234 + 0x400 * channel) = 0x4041003; - MCHBAR32(0x4204 + 0x400 * channel) = + MCHBAR32(0x4224 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4234 + channel * 0x400) = 0x4041003; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24) | 0; - MCHBAR32(0x4214 + 0x400 * channel) = 0; + MCHBAR32(0x4214 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4238 + 0x400 * channel) = + MCHBAR32(0x4228 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x1001 | ((ctrl->CAS + 8) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4218 + 0x400 * channel) = 0; + MCHBAR32(0x4218 + channel * 0x400) = 0;
/* DRAM command MRS * write MR3 MPR disable */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f000; - MCHBAR32(0x423c + 0x400 * channel) = + MCHBAR32(0x422c + channel * 0x400) = 0x1f000; + MCHBAR32(0x423c + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x420c + 0x400 * channel) = + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x360000; - MCHBAR32(0x421c + 0x400 * channel) = 0; + MCHBAR32(0x421c + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel); } @@ -1708,39 +1708,39 @@ * write MR3 MPR enable * in this mode only RD and RDA are allowed * all reads return a predefined pattern */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f000; - MCHBAR32(0x4230 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f000; + MCHBAR32(0x4230 + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x360004; - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4210 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4234 + 0x400 * channel) = 0x4041003; - MCHBAR32(0x4204 + 0x400 * channel) = + MCHBAR32(0x4224 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4234 + channel * 0x400) = 0x4041003; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24) | 0; - MCHBAR32(0x4214 + 0x400 * channel) = 0; + MCHBAR32(0x4214 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4238 + 0x400 * channel) = + MCHBAR32(0x4228 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x1001 | ((ctrl->CAS + 8) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4218 + 0x400 * channel) = 0; + MCHBAR32(0x4218 + channel * 0x400) = 0;
/* DRAM command MRS * write MR3 MPR disable */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f000; - MCHBAR32(0x423c + 0x400 * channel) = + MCHBAR32(0x422c + channel * 0x400) = 0x1f000; + MCHBAR32(0x423c + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x420c + 0x400 * channel) = + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x360000; - MCHBAR32(0x421c + 0x400 * channel) = 0; + MCHBAR32(0x421c + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel); } @@ -1755,21 +1755,21 @@
wait_428c(channel); /* DRAM command NOP */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f207; - MCHBAR32(0x4230 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f207; + MCHBAR32(0x4230 + channel * 0x400) = 0x8000c01 | ((ctrl->CWL + ctrl->tWLO) << 16); - MCHBAR32(0x4200 + 0x400 * channel) = 8 | (slotrank << 24); - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4200 + channel * 0x400) = 8 | (slotrank << 24); + MCHBAR32(0x4210 + channel * 0x400) = 0;
/* DRAM command NOP */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f107; - MCHBAR32(0x4234 + 0x400 * channel) = + MCHBAR32(0x4224 + channel * 0x400) = 0x1f107; + MCHBAR32(0x4234 + channel * 0x400) = 0x4000c01 | ((ctrl->CAS + 38) << 16); - MCHBAR32(0x4204 + 0x400 * channel) = (slotrank << 24) | 4; - MCHBAR32(0x4214 + 0x400 * channel) = 0; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24) | 4; + MCHBAR32(0x4214 + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x400 * channel + 0x4284) = RUN_QUEUE_4284(2); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(2);
wait_428c(channel);
@@ -1856,76 +1856,76 @@ MCHBAR32(0x3400) = 0x200; FOR_ALL_POPULATED_CHANNELS { fill_pattern1(ctrl, channel); - MCHBAR32(0x4288 + (channel << 10)) = 1; + MCHBAR32(0x4288 + channel * 0x400) = 1; } FOR_ALL_POPULATED_CHANNELS FOR_ALL_POPULATED_RANKS {
- MCHBAR32(0x4288 + 0x400 * channel) = 0x10001; + MCHBAR32(0x4288 + channel * 0x400) = 0x10001;
wait_428c(channel);
/* DRAM command ACT */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f006; - MCHBAR32(0x4230 + 0x400 * channel) = 0xc01 | (ctrl->tRCD << 16); - MCHBAR32(0x4200 + 0x400 * channel) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4220 + channel * 0x400) = 0x1f006; + MCHBAR32(0x4230 + channel * 0x400) = 0xc01 | (ctrl->tRCD << 16); + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60000; + MCHBAR32(0x4210 + channel * 0x400) = 0;
/* DRAM command NOP */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f207; - MCHBAR32(0x4234 + 0x400 * channel) = 0x8040c01; - MCHBAR32(0x4204 + 0x400 * channel) = (slotrank << 24) | 0x8; - MCHBAR32(0x4214 + 0x400 * channel) = 0x3e0; + MCHBAR32(0x4224 + channel * 0x400) = 0x1f207; + MCHBAR32(0x4234 + channel * 0x400) = 0x8040c01; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24) | 0x8; + MCHBAR32(0x4214 + channel * 0x400) = 0x3e0;
/* DRAM command WR */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f201; - MCHBAR32(0x4238 + 0x400 * channel) = 0x8041003; - MCHBAR32(0x4208 + 0x400 * channel) = (slotrank << 24); - MCHBAR32(0x4218 + 0x400 * channel) = 0x3e2; + MCHBAR32(0x4228 + channel * 0x400) = 0x1f201; + MCHBAR32(0x4238 + channel * 0x400) = 0x8041003; + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24); + MCHBAR32(0x4218 + channel * 0x400) = 0x3e2;
/* DRAM command NOP */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f207; - MCHBAR32(0x423c + 0x400 * channel) = + MCHBAR32(0x422c + channel * 0x400) = 0x1f207; + MCHBAR32(0x423c + channel * 0x400) = 0x8000c01 | ((ctrl->CWL + ctrl->tWTR + 5) << 16); - MCHBAR32(0x420c + 0x400 * channel) = (slotrank << 24) | 0x8; - MCHBAR32(0x421c + 0x400 * channel) = 0x3e0; + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x8; + MCHBAR32(0x421c + channel * 0x400) = 0x3e0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel);
/* DRAM command PREA */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f002; - MCHBAR32(0x4230 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f002; + MCHBAR32(0x4230 + channel * 0x400) = 0xc01 | ((ctrl->tRP) << 16); - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60400; - MCHBAR32(0x4210 + 0x400 * channel) = 0x240; + MCHBAR32(0x4210 + channel * 0x400) = 0x240;
/* DRAM command ACT */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f006; - MCHBAR32(0x4234 + 0x400 * channel) = + MCHBAR32(0x4224 + channel * 0x400) = 0x1f006; + MCHBAR32(0x4234 + channel * 0x400) = 0xc01 | ((ctrl->tRCD) << 16); - MCHBAR32(0x4204 + 0x400 * channel) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4214 + 0x400 * channel) = 0; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24) | 0x60000; + MCHBAR32(0x4214 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x3f105; - MCHBAR32(0x4238 + 0x400 * channel) = 0x4000c01 | ((ctrl->tRP + + MCHBAR32(0x4228 + channel * 0x400) = 0x3f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x4000c01 | ((ctrl->tRP + ctrl->timings[channel][slotrank].val_4024 + ctrl->timings[channel][slotrank].io_latency) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = (slotrank << 24) | 0x60008; - MCHBAR32(0x4218 + 0x400 * channel) = 0; + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24) | 0x60008; + MCHBAR32(0x4218 + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(3); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(3);
wait_428c(channel); FOR_ALL_LANES { u64 res = MCHBAR32(lane_registers[lane] + - 0x100 * channel + 4); + channel * 0x100 + 4); res |= ((u64) MCHBAR32(lane_registers[lane] + - 0x100 * channel + 8)) << 32; + channel * 0x100 + 8)) << 32; old = ctrl->timings[channel][slotrank].lanes[lane].timB; ctrl->timings[channel][slotrank].lanes[lane].timB += get_timB_high_adjust(res) * 64; @@ -1950,13 +1950,13 @@ slotrank = !(ctrl->rankmap[channel] & 1) ? 2 : 0;
/* DRAM command ACT */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x0f003; - MCHBAR32(0x4230 + 0x400 * channel) = 0x41001; - MCHBAR32(0x4200 + 0x400 * channel) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0x3e0; + MCHBAR32(0x4220 + channel * 0x400) = 0x0f003; + MCHBAR32(0x4230 + channel * 0x400) = 0x41001; + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60000; + MCHBAR32(0x4210 + channel * 0x400) = 0x3e0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(1); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(1);
wait_428c(channel); } @@ -1979,11 +1979,11 @@ int err;
FOR_ALL_POPULATED_CHANNELS - MCHBAR32_OR(0x4008 + 0x400 * channel, 0x8000000); + MCHBAR32_OR(0x4008 + channel * 0x400, 0x8000000);
FOR_ALL_POPULATED_CHANNELS { write_op(ctrl, channel); - MCHBAR32_OR(0x4020 + 0x400 * channel, 0x200000); + MCHBAR32_OR(0x4020 + channel * 0x400, 0x200000); }
/* refresh disable */ @@ -2025,18 +2025,18 @@ MCHBAR32_OR(0x5030, 8);
FOR_ALL_POPULATED_CHANNELS { - MCHBAR32_AND(0x4020 + 0x400 * channel, ~0x00200000); - MCHBAR32(0x428c + 0x400 * channel); + MCHBAR32_AND(0x4020 + channel * 0x400, ~0x00200000); + MCHBAR32(0x428c + channel * 0x400); wait_428c(channel);
/* DRAM command ZQCS */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x0f003; - MCHBAR32(0x4230 + 0x400 * channel) = 0x659001; - MCHBAR32(0x4200 + 0x400 * channel) = 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0x3e0; + MCHBAR32(0x4220 + channel * 0x400) = 0x0f003; + MCHBAR32(0x4230 + channel * 0x400) = 0x659001; + MCHBAR32(0x4200 + channel * 0x400) = 0x60000; + MCHBAR32(0x4210 + channel * 0x400) = 0x3e0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(1); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(1);
wait_428c(channel); } @@ -2048,12 +2048,12 @@ printram("CPF\n");
FOR_ALL_CHANNELS FOR_ALL_POPULATED_RANKS FOR_ALL_LANES { - MCHBAR32_AND(0x4080 + 0x400 * channel + 4 * lane, 0); + MCHBAR32_AND(0x4080 + channel * 0x400 + lane * 4, 0); }
FOR_ALL_POPULATED_CHANNELS { fill_pattern0(ctrl, channel, 0xaaaaaaaa, 0x55555555); - MCHBAR32(0x4288 + (channel << 10)) = 0; + MCHBAR32(0x4288 + channel * 0x400) = 0; }
FOR_ALL_CHANNELS FOR_ALL_POPULATED_RANKS { @@ -2072,7 +2072,7 @@ program_timings(ctrl, channel);
FOR_ALL_CHANNELS FOR_ALL_POPULATED_RANKS FOR_ALL_LANES { - MCHBAR32_AND(0x4080 + 0x400 * channel + 4 * lane, 0); + MCHBAR32_AND(0x4080 + channel * 0x400 + lane * 4, 0); } return 0; } @@ -2095,46 +2095,46 @@ MCHBAR32(4 * lane + 0x4f40) = 0; }
- MCHBAR32(0x4288 + 0x400 * channel) = 0x1f; + MCHBAR32(0x4288 + channel * 0x400) = 0x1f;
wait_428c(channel); /* DRAM command ACT */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f006; - MCHBAR32(0x4230 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f006; + MCHBAR32(0x4230 + channel * 0x400) = ((MAX(ctrl->tRRD, (ctrl->tFAW >> 2) + 1)) << 10) | 8 | (ctrl->tRCD << 16); - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | ctr | 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0x244; + MCHBAR32(0x4210 + channel * 0x400) = 0x244;
/* DRAM command WR */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f201; - MCHBAR32(0x4234 + 0x400 * channel) = + MCHBAR32(0x4224 + channel * 0x400) = 0x1f201; + MCHBAR32(0x4234 + channel * 0x400) = 0x8001020 | ((ctrl->CWL + ctrl->tWTR + 8) << 16); - MCHBAR32(0x4204 + 0x400 * channel) = (slotrank << 24); - MCHBAR32(0x4244 + 0x400 * channel) = 0x389abcd; - MCHBAR32(0x4214 + 0x400 * channel) = 0x20e42; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24); + MCHBAR32(0x4244 + channel * 0x400) = 0x389abcd; + MCHBAR32(0x4214 + channel * 0x400) = 0x20e42;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4238 + 0x400 * channel) = + MCHBAR32(0x4228 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x4001020 | (MAX(ctrl->tRTP, 8) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = (slotrank << 24); - MCHBAR32(0x4248 + 0x400 * channel) = 0x389abcd; - MCHBAR32(0x4218 + 0x400 * channel) = 0x20e42; + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24); + MCHBAR32(0x4248 + channel * 0x400) = 0x389abcd; + MCHBAR32(0x4218 + channel * 0x400) = 0x20e42;
/* DRAM command PRE */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f002; - MCHBAR32(0x423c + 0x400 * channel) = 0xf1001; - MCHBAR32(0x420c + 0x400 * channel) = (slotrank << 24) | 0x60400; - MCHBAR32(0x421c + 0x400 * channel) = 0x240; + MCHBAR32(0x422c + channel * 0x400) = 0x1f002; + MCHBAR32(0x423c + channel * 0x400) = 0xf1001; + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x60400; + MCHBAR32(0x421c + channel * 0x400) = 0x240;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel); FOR_ALL_LANES { - u32 r32 = MCHBAR32(0x4340 + 4 * lane + 0x400 * channel); + u32 r32 = MCHBAR32(0x4340 + channel * 0x400 + lane * 4);
if (r32 == 0) lanes_ok |= 1 << lane; @@ -2192,16 +2192,16 @@ slotrank = !(ctrl->rankmap[channel] & 1) ? 2 : 0;
/* DRAM command ZQCS */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x0f003; - MCHBAR32(0x4230 + 0x400 * channel) = 0x41001; - MCHBAR32(0x4200 + 0x400 * channel) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0x3e0; + MCHBAR32(0x4220 + channel * 0x400) = 0x0f003; + MCHBAR32(0x4230 + channel * 0x400) = 0x41001; + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60000; + MCHBAR32(0x4210 + channel * 0x400) = 0x3e0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(1); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(1);
wait_428c(channel); - MCHBAR32_OR(0x4020 + 0x400 * channel, 0x200000); + MCHBAR32_OR(0x4020 + channel * 0x400, 0x200000); }
/* refresh disable */ @@ -2213,13 +2213,13 @@ slotrank = !(ctrl->rankmap[channel] & 1) ? 2 : 0;
/* DRAM command ZQCS */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x0f003; - MCHBAR32(0x4230 + 0x400 * channel) = 0x41001; - MCHBAR32(0x4200 + 0x400 * channel) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0x3e0; + MCHBAR32(0x4220 + channel * 0x400) = 0x0f003; + MCHBAR32(0x4230 + channel * 0x400) = 0x41001; + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60000; + MCHBAR32(0x4210 + channel * 0x400) = 0x3e0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(1); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(1);
wait_428c(channel); } @@ -2251,7 +2251,7 @@
ctrl->cmd_stretch[channel] = cmd_stretch;
- MCHBAR32(0x4004 + 0x400 * channel) = + MCHBAR32(0x4004 + channel * 0x400) = ctrl->tRRD | (ctrl->tRTP << 4) | (ctrl->tCKE << 8) @@ -2307,7 +2307,7 @@
FOR_ALL_POPULATED_CHANNELS { fill_pattern5(ctrl, channel, 0); - MCHBAR32(0x4288 + 0x400 * channel) = 0x1f; + MCHBAR32(0x4288 + channel * 0x400) = 0x1f; }
FOR_ALL_POPULATED_CHANNELS { @@ -2371,8 +2371,8 @@ program_timings(ctrl, channel);
FOR_ALL_LANES { - MCHBAR32(0x4340 + 0x400 * channel + 4 * lane) = 0; - MCHBAR32(0x400 * channel + 4 * lane + 0x4140); + MCHBAR32(0x4340 + channel * 0x400 + lane * 4) = 0; + MCHBAR32(0x4140 + channel * 0x400 + lane * 4); }
wait_428c(channel); @@ -2380,41 +2380,41 @@ * write MR3 MPR enable * in this mode only RD and RDA are allowed * all reads return a predefined pattern */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f000; - MCHBAR32(0x4230 + 0x400 * channel) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f000; + MCHBAR32(0x4230 + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x360004; - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4210 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4234 + 0x400 * channel) = 0x40411f4; - MCHBAR32(0x4204 + 0x400 * channel) = slotrank << 24; - MCHBAR32(0x4214 + 0x400 * channel) = 0; + MCHBAR32(0x4224 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4234 + channel * 0x400) = 0x40411f4; + MCHBAR32(0x4204 + channel * 0x400) = slotrank << 24; + MCHBAR32(0x4214 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4238 + 0x400 * channel) = + MCHBAR32(0x4228 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x1001 | ((ctrl->CAS + 8) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4218 + 0x400 * channel) = 0; + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24) | 0x60000; + MCHBAR32(0x4218 + channel * 0x400) = 0;
/* DRAM command MRS * MR3 disable MPR */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f000; - MCHBAR32(0x423c + 0x400 * channel) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x420c + 0x400 * channel) = + MCHBAR32(0x422c + channel * 0x400) = 0x1f000; + MCHBAR32(0x423c + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x360000; - MCHBAR32(0x421c + 0x400 * channel) = 0; + MCHBAR32(0x421c + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel);
FOR_ALL_LANES { statistics[lane][edge] = - MCHBAR32(0x4340 + 0x400 * channel + lane * 4); + MCHBAR32(0x4340 + channel * 0x400 + lane * 4); } } FOR_ALL_LANES { @@ -2444,14 +2444,14 @@ toggle_io_reset();
FOR_ALL_POPULATED_CHANNELS FOR_ALL_LANES { - MCHBAR32(4 * lane + 0x400 * channel + 0x4080) = 0; + MCHBAR32(0x4080 + channel * 0x400 + lane * 4) = 0; }
FOR_ALL_POPULATED_CHANNELS { fill_pattern0(ctrl, channel, 0, 0); - MCHBAR32(0x4288 + (channel << 10)) = 0; + MCHBAR32(0x4288 + channel * 0x400) = 0; FOR_ALL_LANES { - MCHBAR32(0x400 * channel + lane * 4 + 0x4140); + MCHBAR32(0x4140 + channel * 0x400 + lane * 4); }
FOR_ALL_POPULATED_RANKS FOR_ALL_LANES { @@ -2471,39 +2471,39 @@ * write MR3 MPR enable * in this mode only RD and RDA are allowed * all reads return a predefined pattern */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f000; - MCHBAR32(0x4230 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f000; + MCHBAR32(0x4230 + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x360004; - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4210 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4234 + 0x400 * channel) = 0x4041003; - MCHBAR32(0x4204 + 0x400 * channel) = + MCHBAR32(0x4224 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4234 + channel * 0x400) = 0x4041003; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24) | 0; - MCHBAR32(0x4214 + 0x400 * channel) = 0; + MCHBAR32(0x4214 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4238 + 0x400 * channel) = + MCHBAR32(0x4228 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x1001 | ((ctrl->CAS + 8) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4218 + 0x400 * channel) = 0; + MCHBAR32(0x4218 + channel * 0x400) = 0;
/* DRAM command MRS * MR3 disable MPR */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f000; - MCHBAR32(0x423c + 0x400 * channel) = + MCHBAR32(0x422c + channel * 0x400) = 0x1f000; + MCHBAR32(0x423c + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x420c + 0x400 * channel) = + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x360000; - MCHBAR32(0x421c + 0x400 * channel) = 0; + MCHBAR32(0x421c + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel); } @@ -2527,39 +2527,39 @@ * write MR3 MPR enable * in this mode only RD and RDA are allowed * all reads return a predefined pattern */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f000; - MCHBAR32(0x4230 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f000; + MCHBAR32(0x4230 + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x360004; - MCHBAR32(0x4210 + 0x400 * channel) = 0; + MCHBAR32(0x4210 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4234 + 0x400 * channel) = 0x4041003; - MCHBAR32(0x4204 + 0x400 * channel) = + MCHBAR32(0x4224 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4234 + channel * 0x400) = 0x4041003; + MCHBAR32(0x4204 + channel * 0x400) = (slotrank << 24) | 0; - MCHBAR32(0x4214 + 0x400 * channel) = 0; + MCHBAR32(0x4214 + channel * 0x400) = 0;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4238 + 0x400 * channel) = + MCHBAR32(0x4228 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x1001 | ((ctrl->CAS + 8) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = + MCHBAR32(0x4208 + channel * 0x400) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4218 + 0x400 * channel) = 0; + MCHBAR32(0x4218 + channel * 0x400) = 0;
/* DRAM command MRS * MR3 disable MPR */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f000; - MCHBAR32(0x423c + 0x400 * channel) = + MCHBAR32(0x422c + channel * 0x400) = 0x1f000; + MCHBAR32(0x423c + channel * 0x400) = 0xc01 | (ctrl->tMOD << 16); - MCHBAR32(0x420c + 0x400 * channel) = + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x360000; - MCHBAR32(0x421c + 0x400 * channel) = 0; + MCHBAR32(0x421c + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel); } @@ -2567,13 +2567,13 @@ /* XXX: check any measured value ? */
FOR_ALL_LANES { - MCHBAR32(0x4080 + 0x400 * channel + lane * 4) = - ~MCHBAR32(0x4040 + 0x400 * channel + lane * 4) + MCHBAR32(0x4080 + channel * 0x400 + lane * 4) = + ~MCHBAR32(0x4040 + channel * 0x400 + lane * 4) & 0xff; }
fill_pattern0(ctrl, channel, 0, 0xffffffff); - MCHBAR32(0x4288 + (channel << 10)) = 0; + MCHBAR32(0x4288 + channel * 0x400) = 0; }
/* FIXME: under some conditions (older chipsets?) vendor BIOS sets both edges to the same value. */ @@ -2611,7 +2611,7 @@ }
FOR_ALL_CHANNELS FOR_ALL_POPULATED_RANKS FOR_ALL_LANES { - MCHBAR32(0x4080 + 0x400 * channel + 4 * lane) = 0; + MCHBAR32(0x4080 + channel * 0x400 + lane * 4) = 0; } return 0; } @@ -2634,12 +2634,12 @@ }
for (i = 0; i < 3; i++) { - MCHBAR32(0x3000 + 0x100 * channel) = reg3000b24[i] << 24; + MCHBAR32(0x3000 + channel * 0x100) = reg3000b24[i] << 24; printram("[%x] = 0x%08x\n", - 0x3000 + 0x100 * channel, reg3000b24[i] << 24); + 0x3000 + channel * 0x100, reg3000b24[i] << 24); for (pat = 0; pat < NUM_PATTERNS; pat++) { fill_pattern5(ctrl, channel, pat); - MCHBAR32(0x4288 + 0x400 * channel) = 0x1f; + MCHBAR32(0x4288 + channel * 0x400) = 0x1f; printram("using pattern %d\n", pat); for (edge = 0; edge <= MAX_EDGE_TIMING; edge++) { FOR_ALL_LANES { @@ -2651,59 +2651,56 @@ program_timings(ctrl, channel);
FOR_ALL_LANES { - MCHBAR32(0x4340 + 0x400 * channel + - 4 * lane) = 0; - MCHBAR32(0x400 * channel + - 4 * lane + 0x4140); + MCHBAR32(0x4340 + channel * 0x400 + lane * 4) = 0; + MCHBAR32(0x4140 + channel * 0x400 + lane * 4); } wait_428c(channel);
/* DRAM command ACT */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f006; - MCHBAR32(0x4230 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f006; + MCHBAR32(0x4230 + channel * 0x400) = 0x4 | (ctrl->tRCD << 16) | (MAX(ctrl->tRRD, (ctrl->tFAW >> 2) + 1) << 10); - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0x240; + MCHBAR32(0x4210 + channel * 0x400) = 0x240;
/* DRAM command WR */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f201; - MCHBAR32(0x4234 + 0x400 * channel) = 0x8005020 | + MCHBAR32(0x4224 + channel * 0x400) = 0x1f201; + MCHBAR32(0x4234 + channel * 0x400) = 0x8005020 | ((ctrl->tWTR + ctrl->CWL + 8) << 16); - MCHBAR32(0x4204 + 0x400 * channel) = + MCHBAR32(0x4204 + channel * 0x400) = slotrank << 24; - MCHBAR32(0x4214 + 0x400 * channel) = 0x242; + MCHBAR32(0x4214 + channel * 0x400) = 0x242;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4238 + 0x400 * channel) = + MCHBAR32(0x4228 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x4005020 | (MAX(ctrl->tRTP, 8) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = + MCHBAR32(0x4208 + channel * 0x400) = slotrank << 24; - MCHBAR32(0x4218 + 0x400 * channel) = 0x242; + MCHBAR32(0x4218 + channel * 0x400) = 0x242;
/* DRAM command PRE */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f002; - MCHBAR32(0x423c + 0x400 * channel) = + MCHBAR32(0x422c + channel * 0x400) = 0x1f002; + MCHBAR32(0x423c + channel * 0x400) = 0xc01 | (ctrl->tRP << 16); - MCHBAR32(0x420c + 0x400 * channel) = + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x60400; - MCHBAR32(0x421c + 0x400 * channel) = 0; + MCHBAR32(0x421c + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel); FOR_ALL_LANES { - MCHBAR32(0x4340 + - 0x400 * channel + lane * 4); + MCHBAR32(0x4340 + channel * 0x400 + lane * 4); }
raw_statistics[edge] = - MCHBAR32(0x436c + 0x400 * channel); + MCHBAR32(0x436c + channel * 0x400); } FOR_ALL_LANES { struct run rn; @@ -2776,7 +2773,7 @@ program_timings(ctrl, channel);
FOR_ALL_CHANNELS FOR_ALL_POPULATED_RANKS FOR_ALL_LANES { - MCHBAR32(0x4080 + 0x400 * channel + 4 * lane) = 0; + MCHBAR32(0x4080 + channel * 0x400 + lane * 4) = 0; } return 0; } @@ -2785,36 +2782,36 @@ { wait_428c(channel); /* DRAM command ACT */ - MCHBAR32(0x4220 + 0x400 * channel) = 0x1f006; - MCHBAR32(0x4230 + 0x400 * channel) = + MCHBAR32(0x4220 + channel * 0x400) = 0x1f006; + MCHBAR32(0x4230 + channel * 0x400) = (MAX((ctrl->tFAW >> 2) + 1, ctrl->tRRD) << 10) | (ctrl->tRCD << 16) | 4; - MCHBAR32(0x4200 + 0x400 * channel) = + MCHBAR32(0x4200 + channel * 0x400) = (slotrank << 24) | 0x60000; - MCHBAR32(0x4210 + 0x400 * channel) = 0x244; + MCHBAR32(0x4210 + channel * 0x400) = 0x244;
/* DRAM command WR */ - MCHBAR32(0x4224 + 0x400 * channel) = 0x1f201; - MCHBAR32(0x4234 + 0x400 * channel) = + MCHBAR32(0x4224 + channel * 0x400) = 0x1f201; + MCHBAR32(0x4234 + channel * 0x400) = 0x80011e0 | ((ctrl->tWTR + ctrl->CWL + 8) << 16); - MCHBAR32(0x4204 + 0x400 * channel) = slotrank << 24; - MCHBAR32(0x4214 + 0x400 * channel) = 0x242; + MCHBAR32(0x4204 + channel * 0x400) = slotrank << 24; + MCHBAR32(0x4214 + channel * 0x400) = 0x242;
/* DRAM command RD */ - MCHBAR32(0x4228 + 0x400 * channel) = 0x1f105; - MCHBAR32(0x4238 + 0x400 * channel) = + MCHBAR32(0x4228 + channel * 0x400) = 0x1f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x40011e0 | (MAX(ctrl->tRTP, 8) << 16); - MCHBAR32(0x4208 + 0x400 * channel) = slotrank << 24; - MCHBAR32(0x4218 + 0x400 * channel) = 0x242; + MCHBAR32(0x4208 + channel * 0x400) = slotrank << 24; + MCHBAR32(0x4218 + channel * 0x400) = 0x242;
/* DRAM command PRE */ - MCHBAR32(0x422c + 0x400 * channel) = 0x1f002; - MCHBAR32(0x423c + 0x400 * channel) = 0x1001 | (ctrl->tRP << 16); - MCHBAR32(0x420c + 0x400 * channel) = (slotrank << 24) | 0x60400; - MCHBAR32(0x421c + 0x400 * channel) = 0; + MCHBAR32(0x422c + channel * 0x400) = 0x1f002; + MCHBAR32(0x423c + channel * 0x400) = 0x1001 | (ctrl->tRP << 16); + MCHBAR32(0x420c + channel * 0x400) = (slotrank << 24) | 0x60400; + MCHBAR32(0x421c + channel * 0x400) = 0;
// execute command queue - MCHBAR32(0x4284 + 0x400 * channel) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel); } @@ -2851,7 +2848,7 @@ statistics[MAX_TIMC] = 1;
fill_pattern5(ctrl, channel, pat); - MCHBAR32(0x4288 + 0x400 * channel) = + MCHBAR32(0x4288 + channel * 0x400) = 0x1f; for (timC = 0; timC < MAX_TIMC; timC++) { FOR_ALL_LANES @@ -2861,7 +2858,7 @@ test_timC_write (ctrl, channel, slotrank);
raw_statistics[timC] = - MCHBAR32(0x436c + 0x400 * channel); + MCHBAR32(0x436c + channel * 0x400); } FOR_ALL_LANES { struct run rn; @@ -2895,7 +2892,7 @@ }
FOR_ALL_CHANNELS { - MCHBAR32_AND((channel * 0x100) + 0xe3c, ~0x3f000000); + MCHBAR32_AND(0xe3c + (channel * 0x100), ~0x3f000000); udelay(2); }
@@ -2949,9 +2946,9 @@ int channel, slotrank;
FOR_ALL_CHANNELS FOR_ALL_POPULATED_RANKS { - MCHBAR32(0x0004 + (channel << 8) + lane_registers[slotrank]) = + MCHBAR32(0x0004 + channel * 0x100 + lane_registers[slotrank]) = make_mr0(ctrl, slotrank); - MCHBAR32(0x0008 + (channel << 8) + lane_registers[slotrank]) = + MCHBAR32(0x0008 + channel * 0x100 + lane_registers[slotrank]) = make_mr1(ctrl, slotrank, channel); } } @@ -2962,7 +2959,7 @@
slotrank = 0; FOR_ALL_POPULATED_CHANNELS - if (MCHBAR32(0x42a0 + (channel << 10)) & 0xa000) { + if (MCHBAR32(0x42a0 + channel * 0x400) & 0xa000) { printk(BIOS_EMERG, "Mini channel test failed (1): %d\n", channel); return MAKE_ERR; @@ -2970,7 +2967,7 @@ FOR_ALL_POPULATED_CHANNELS { fill_pattern0(ctrl, channel, 0x12345678, 0x98765432);
- MCHBAR32(0x4288 + (channel << 10)) = 0; + MCHBAR32(0x4288 + channel * 0x400) = 0; }
for (slotrank = 0; slotrank < 4; slotrank++) @@ -2983,39 +2980,39 @@ wait_428c(channel);
/* DRAM command ACT */ - MCHBAR32(0x4220 + (channel << 10)) = 0x0001f006; - MCHBAR32(0x4230 + (channel << 10)) = 0x0028a004; - MCHBAR32(0x4200 + (channel << 10)) = + MCHBAR32(0x4220 + channel * 0x400) = 0x0001f006; + MCHBAR32(0x4230 + channel * 0x400) = 0x0028a004; + MCHBAR32(0x4200 + channel * 0x400) = 0x00060000 | (slotrank << 24); - MCHBAR32(0x4210 + (channel << 10)) = 0x00000244; + MCHBAR32(0x4210 + channel * 0x400) = 0x00000244;
/* DRAM command WR */ - MCHBAR32(0x4224 + (channel << 10)) = 0x0001f201; - MCHBAR32(0x4234 + (channel << 10)) = 0x08281064; - MCHBAR32(0x4204 + (channel << 10)) = + MCHBAR32(0x4224 + channel * 0x400) = 0x0001f201; + MCHBAR32(0x4234 + channel * 0x400) = 0x08281064; + MCHBAR32(0x4204 + channel * 0x400) = 0x00000000 | (slotrank << 24); - MCHBAR32(0x4214 + (channel << 10)) = 0x00000242; + MCHBAR32(0x4214 + channel * 0x400) = 0x00000242;
/* DRAM command RD */ - MCHBAR32(0x4228 + (channel << 10)) = 0x0001f105; - MCHBAR32(0x4238 + (channel << 10)) = 0x04281064; - MCHBAR32(0x4208 + (channel << 10)) = + MCHBAR32(0x4228 + channel * 0x400) = 0x0001f105; + MCHBAR32(0x4238 + channel * 0x400) = 0x04281064; + MCHBAR32(0x4208 + channel * 0x400) = 0x00000000 | (slotrank << 24); - MCHBAR32(0x4218 + (channel << 10)) = 0x00000242; + MCHBAR32(0x4218 + channel * 0x400) = 0x00000242;
/* DRAM command PRE */ - MCHBAR32(0x422c + (channel << 10)) = 0x0001f002; - MCHBAR32(0x423c + (channel << 10)) = 0x00280c01; - MCHBAR32(0x420c + (channel << 10)) = + MCHBAR32(0x422c + channel * 0x400) = 0x0001f002; + MCHBAR32(0x423c + channel * 0x400) = 0x00280c01; + MCHBAR32(0x420c + channel * 0x400) = 0x00060400 | (slotrank << 24); - MCHBAR32(0x421c + (channel << 10)) = 0x00000240; + MCHBAR32(0x421c + channel * 0x400) = 0x00000240;
// execute command queue - MCHBAR32(0x4284 + (channel << 10)) = RUN_QUEUE_4284(4); + MCHBAR32(0x4284 + channel * 0x400) = RUN_QUEUE_4284(4);
wait_428c(channel); FOR_ALL_LANES - if (MCHBAR32(0x4340 + (channel << 10) + 4 * lane)) { + if (MCHBAR32(0x4340 + channel * 0x400 + lane * 4)) { printk(BIOS_EMERG, "Mini channel test failed (2): %d, %d, %d\n", channel, slotrank, lane); return MAKE_ERR; @@ -3035,10 +3032,10 @@ {0x00028bfa, 0x53fe4b49, 0x19ed5483} }; FOR_ALL_POPULATED_CHANNELS { - MCHBAR32(0x4020 + 0x400 * channel) &= ~0x10000000; - MCHBAR32(0x4034 + 0x400 * channel) = seeds[channel][0]; - MCHBAR32(0x403c + 0x400 * channel) = seeds[channel][1]; - MCHBAR32(0x4038 + 0x400 * channel) = seeds[channel][2]; + MCHBAR32(0x4020 + channel * 0x400) &= ~0x10000000; + MCHBAR32(0x4034 + channel * 0x400) = seeds[channel][0]; + MCHBAR32(0x403c + channel * 0x400) = seeds[channel][1]; + MCHBAR32(0x4038 + channel * 0x400) = seeds[channel][2]; } }
@@ -3060,7 +3057,7 @@
FOR_ALL_POPULATED_CHANNELS { // Always drive command bus - MCHBAR32_OR(0x4004 + 0x400 * channel, 0x20000000); + MCHBAR32_OR(0x4004 + channel * 0x400, 0x20000000); }
udelay(1); @@ -3096,7 +3093,7 @@
dram_odt_stretch(ctrl, channel);
- MCHBAR32(0x4008 + (channel << 10)) = + MCHBAR32(0x4008 + channel * 0x400) = 0x0a000000 | (b20 << 20) | ((ctrl->ref_card_offset[channel] + 2) << 16) | b4_8_12; } @@ -3106,9 +3103,9 @@ { int channel; FOR_ALL_POPULATED_CHANNELS { - MCHBAR32(0x42a0 + 0x400 * channel) = + MCHBAR32(0x42a0 + channel * 0x400) = 0x00001000 | ctrl->rankmap[channel]; - MCHBAR32_AND(0x4004 + 0x400 * channel, ~0x20000000); + MCHBAR32_AND(0x4004 + channel * 0x400, ~0x20000000); } }
@@ -3130,7 +3127,7 @@ MCHBAR32(0x4cd4) = 0x00000046;
FOR_ALL_CHANNELS - MCHBAR32_AND_OR(0x400c + 0x400 * channel, 0xFFFFCFFF, 0x1000); + MCHBAR32_AND_OR(0x400c + channel * 0x400, 0xFFFFCFFF, 0x1000);
if (is_mobile) /* APD - DLL Off, 64 DCLKs until idle, decision per rank */ @@ -3169,7 +3166,7 @@ MCHBAR32_AND(MEM_TRML_INTERRUPT, ~0x1f);
FOR_ALL_CHANNELS - MCHBAR32_AND_OR(TC_RFP_C0 + 0x400 * channel, ~0x30000, 1 << 16); + MCHBAR32_AND_OR(TC_RFP_C0 + channel * 0x400, ~0x30000, 1 << 16);
MCHBAR32_OR(0x5030, 1); MCHBAR32_OR(0x5030, 0x80); @@ -3183,7 +3180,7 @@ r32 = MCHBAR32(0x5064); if (r32 & 0x20000) t1_cycles += (r32 & 0xfff); - t1_cycles += MCHBAR32(channel * 0x400 + 0x42a4) & 0xfff; + t1_cycles += MCHBAR32(0x42a4 + channel * 0x400) & 0xfff; t1_ns = t1_cycles * ctrl->tCK / 256 + 544; if (!(r32 & 0x20000)) t1_ns += 500; @@ -3211,7 +3208,7 @@ int channel, slotrank, lane;
FOR_ALL_POPULATED_CHANNELS - MCHBAR32(0x4004 + 0x400 * channel) = + MCHBAR32(0x4004 + channel * 0x400) = ctrl->tRRD | (ctrl->tRTP << 4) | (ctrl->tCKE << 8) @@ -3227,15 +3224,15 @@ }
FOR_ALL_CHANNELS FOR_ALL_POPULATED_RANKS FOR_ALL_LANES { - MCHBAR32(0x4080 + 0x400 * channel + 4 * lane) = 0; + MCHBAR32(0x4080 + channel * 0x400 + lane * 4) = 0; }
FOR_ALL_POPULATED_CHANNELS - MCHBAR32_OR(0x4008 + 0x400 * channel, 0x8000000); + MCHBAR32_OR(0x4008 + channel * 0x400, 0x8000000);
FOR_ALL_POPULATED_CHANNELS { udelay (1); - MCHBAR32_OR(0x4020 + 0x400 * channel, 0x200000); + MCHBAR32_OR(0x4020 + channel * 0x400, 0x200000); }
printram("CPE\n"); @@ -3267,7 +3264,7 @@ // Set valid rank CKE reg = 0; reg = (reg & ~0xf) | ctrl->rankmap[channel]; - addr = 0x400 * channel + 0x42a0; + addr = 0x42a0 + channel * 0x400; MCHBAR32(addr) = reg;
// Wait 10ns for ranks to settle @@ -3288,7 +3285,7 @@ MCHBAR32(0x3000) = 0;
FOR_ALL_CHANNELS { - MCHBAR32_AND(channel * 0x100 + 0xe3c, ~0x3f000000); + MCHBAR32_AND(0xe3c + channel * 0x100, ~0x3f000000); udelay(2); }
diff --git a/src/northbridge/intel/sandybridge/raminit_ivy.c b/src/northbridge/intel/sandybridge/raminit_ivy.c index 5c1a58a..7542a37 100644 --- a/src/northbridge/intel/sandybridge/raminit_ivy.c +++ b/src/northbridge/intel/sandybridge/raminit_ivy.c @@ -590,12 +590,12 @@
// IO clock FOR_ALL_CHANNELS { - MCHBAR32(0xc00 + 0x100 * channel) = ctrl->rankmap[channel]; + MCHBAR32(0xc00 + channel * 0x100) = ctrl->rankmap[channel]; }
// IO command FOR_ALL_CHANNELS { - MCHBAR32(0x3200 + 0x100 * channel) = ctrl->rankmap[channel]; + MCHBAR32(0x3200 + channel * 0x100) = ctrl->rankmap[channel]; }
// IO control diff --git a/src/northbridge/intel/sandybridge/raminit_sandy.c b/src/northbridge/intel/sandybridge/raminit_sandy.c index 9fa6c7b..1191754 100644 --- a/src/northbridge/intel/sandybridge/raminit_sandy.c +++ b/src/northbridge/intel/sandybridge/raminit_sandy.c @@ -361,12 +361,12 @@
// IO clock FOR_ALL_CHANNELS { - MCHBAR32(0xc00 + 0x100 * channel) = ctrl->rankmap[channel]; + MCHBAR32(0xc00 + channel * 0x100) = ctrl->rankmap[channel]; }
// IO command FOR_ALL_CHANNELS { - MCHBAR32(0x3200 + 0x100 * channel) = ctrl->rankmap[channel]; + MCHBAR32(0x3200 + channel * 0x100) = ctrl->rankmap[channel]; }
// IO control