nb/intel/sandybridge: Tidy up raminit code
Some things fit in a single line now that we have a 96-char limit. Tested, does not change the binary of Gigabyte GA-H61MA-D3V. Change-Id: I3bef75291d1ecb2c9c3c74d9e78caf84a1f726aa Signed-off-by: Angel Pons <th3fanbus@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/38317 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Reviewed-by: Felix Held <felix-coreboot@felixheld.de>
This commit is contained in:
parent
bece6e86dd
commit
891f2bc6c8
|
@ -1233,8 +1233,7 @@ static int does_lane_work(ramctr_timing *ctrl, int channel, int slotrank,
|
||||||
{
|
{
|
||||||
u32 timA = ctrl->timings[channel][slotrank].lanes[lane].timA;
|
u32 timA = ctrl->timings[channel][slotrank].lanes[lane].timA;
|
||||||
return ((MCHBAR32(lane_registers[lane] + channel * 0x100 + 4 +
|
return ((MCHBAR32(lane_registers[lane] + channel * 0x100 + 4 +
|
||||||
((timA / 32) & 1) * 4)
|
((timA / 32) & 1) * 4) >> (timA % 32)) & 1);
|
||||||
>> (timA % 32)) & 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct run {
|
struct run {
|
||||||
|
@ -1353,8 +1352,7 @@ static void discover_timA_fine(ramctr_timing *ctrl, int channel, int slotrank,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int discover_402x(ramctr_timing *ctrl, int channel, int slotrank,
|
static int discover_402x(ramctr_timing *ctrl, int channel, int slotrank, int *upperA)
|
||||||
int *upperA)
|
|
||||||
{
|
{
|
||||||
int works[NUM_LANES];
|
int works[NUM_LANES];
|
||||||
int lane;
|
int lane;
|
||||||
|
@ -1390,11 +1388,9 @@ static int discover_402x(ramctr_timing *ctrl, int channel, int slotrank,
|
||||||
return MAKE_ERR;
|
return MAKE_ERR;
|
||||||
}
|
}
|
||||||
FOR_ALL_LANES if (works[lane]) {
|
FOR_ALL_LANES if (works[lane]) {
|
||||||
ctrl->timings[channel][slotrank].lanes[lane].timA +=
|
ctrl->timings[channel][slotrank].lanes[lane].timA += 128;
|
||||||
128;
|
|
||||||
upperA[lane] += 128;
|
upperA[lane] += 128;
|
||||||
printram("increment %d, %d, %d\n", channel,
|
printram("increment %d, %d, %d\n", channel, slotrank, lane);
|
||||||
slotrank, lane);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1415,13 +1411,11 @@ static void pre_timA_change(ramctr_timing *ctrl, int channel, int slotrank,
|
||||||
if (mnmx->timA_min_high >
|
if (mnmx->timA_min_high >
|
||||||
(ctrl->timings[channel][slotrank].lanes[lane].timA >> 6))
|
(ctrl->timings[channel][slotrank].lanes[lane].timA >> 6))
|
||||||
mnmx->timA_min_high =
|
mnmx->timA_min_high =
|
||||||
(ctrl->timings[channel][slotrank].lanes[lane].
|
(ctrl->timings[channel][slotrank].lanes[lane].timA >> 6);
|
||||||
timA >> 6);
|
|
||||||
if (mnmx->timA_max_high <
|
if (mnmx->timA_max_high <
|
||||||
(ctrl->timings[channel][slotrank].lanes[lane].timA >> 6))
|
(ctrl->timings[channel][slotrank].lanes[lane].timA >> 6))
|
||||||
mnmx->timA_max_high =
|
mnmx->timA_max_high =
|
||||||
(ctrl->timings[channel][slotrank].lanes[lane].
|
(ctrl->timings[channel][slotrank].lanes[lane].timA >> 6);
|
||||||
timA >> 6);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1450,21 +1444,18 @@ static void post_timA_change(ramctr_timing *ctrl, int channel, int slotrank,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Compensate the skew between DQS and DQs.
|
/* Compensate the skew between DQS and DQs.
|
||||||
* To ease PCB design a small skew between Data Strobe signals and
|
* To ease PCB design, a small skew between Data Strobe signals and Data Signals is allowed.
|
||||||
* Data Signals is allowed.
|
* The controller has to measure and compensate this skew for every byte-lane. By delaying
|
||||||
* The controller has to measure and compensate this skew for every byte-lane.
|
* either all DQs signals or DQS signal, a full phase shift can be introduced. It is assumed
|
||||||
* By delaying either all DQs signals or DQS signal, a full phase
|
* that one byte-lane's DQs signals have the same routing delay.
|
||||||
* shift can be introduced.
|
|
||||||
* It is assumed that one byte-lane's DQs signals have the same routing delay.
|
|
||||||
*
|
*
|
||||||
* To measure the actual skew, the DRAM is placed in "read leveling" mode.
|
* To measure the actual skew, the DRAM is placed in "read leveling" mode. In read leveling
|
||||||
* In read leveling mode the DRAM-chip outputs an alternating periodic pattern.
|
* mode the DRAM-chip outputs an alternating periodic pattern. The memory controller iterates
|
||||||
* The memory controller iterates over all possible values to do a full phase shift
|
* over all possible values to do a full phase shift and issues read commands. With DQS and
|
||||||
* and issues read commands.
|
* DQs in phase the data read is expected to alternate on every byte:
|
||||||
* With DQS and DQs in phase the data read is expected to alternate on every byte:
|
|
||||||
* 0xFF 0x00 0xFF ...
|
* 0xFF 0x00 0xFF ...
|
||||||
* Once the controller has detected this pattern a bit in the result register is
|
* Once the controller has detected this pattern a bit in the result register is set for the
|
||||||
* set for the current phase shift.
|
* current phase shift.
|
||||||
*/
|
*/
|
||||||
int read_training(ramctr_timing *ctrl)
|
int read_training(ramctr_timing *ctrl)
|
||||||
{
|
{
|
||||||
|
@ -1498,8 +1489,7 @@ int read_training(ramctr_timing *ctrl)
|
||||||
all_high = 1;
|
all_high = 1;
|
||||||
some_high = 0;
|
some_high = 0;
|
||||||
FOR_ALL_LANES {
|
FOR_ALL_LANES {
|
||||||
if (ctrl->timings[channel][slotrank].lanes[lane].timA >=
|
if (ctrl->timings[channel][slotrank].lanes[lane].timA >= 0x40)
|
||||||
0x40)
|
|
||||||
some_high = 1;
|
some_high = 1;
|
||||||
else
|
else
|
||||||
all_high = 0;
|
all_high = 0;
|
||||||
|
@ -1509,8 +1499,7 @@ int read_training(ramctr_timing *ctrl)
|
||||||
ctrl->timings[channel][slotrank].io_latency--;
|
ctrl->timings[channel][slotrank].io_latency--;
|
||||||
printram("4028--;\n");
|
printram("4028--;\n");
|
||||||
FOR_ALL_LANES {
|
FOR_ALL_LANES {
|
||||||
ctrl->timings[channel][slotrank].lanes[lane].
|
ctrl->timings[channel][slotrank].lanes[lane].timA -= 0x40;
|
||||||
timA -= 0x40;
|
|
||||||
upperA[lane] -= 0x40;
|
upperA[lane] -= 0x40;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1659,8 +1648,7 @@ static void timC_threshold_process(int *data, const int count)
|
||||||
int threshold = min/2 + max/2;
|
int threshold = min/2 + max/2;
|
||||||
for (i = 0; i < count; i++)
|
for (i = 0; i < count; i++)
|
||||||
data[i] = data[i] > threshold;
|
data[i] = data[i] > threshold;
|
||||||
printram("threshold=%d min=%d max=%d\n",
|
printram("threshold=%d min=%d max=%d\n", threshold, min, max);
|
||||||
threshold, min, max);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int discover_timC(ramctr_timing *ctrl, int channel, int slotrank)
|
static int discover_timC(ramctr_timing *ctrl, int channel, int slotrank)
|
||||||
|
@ -1681,8 +1669,7 @@ static int discover_timC(ramctr_timing *ctrl, int channel, int slotrank)
|
||||||
MCHBAR32(IOSAV_SEQ_CTL_ch(channel)) = IOSAV_RUN_ONCE(1);
|
MCHBAR32(IOSAV_SEQ_CTL_ch(channel)) = IOSAV_RUN_ONCE(1);
|
||||||
|
|
||||||
for (timC = 0; timC <= MAX_TIMC; timC++) {
|
for (timC = 0; timC <= MAX_TIMC; timC++) {
|
||||||
FOR_ALL_LANES ctrl->timings[channel][slotrank].lanes[lane].
|
FOR_ALL_LANES ctrl->timings[channel][slotrank].lanes[lane].timC = timC;
|
||||||
timC = timC;
|
|
||||||
program_timings(ctrl, channel);
|
program_timings(ctrl, channel);
|
||||||
|
|
||||||
test_timC(ctrl, channel, slotrank);
|
test_timC(ctrl, channel, slotrank);
|
||||||
|
@ -1729,8 +1716,7 @@ static int get_precedening_channels(ramctr_timing *ctrl, int target_channel)
|
||||||
static void fill_pattern0(ramctr_timing *ctrl, int channel, u32 a, u32 b)
|
static void fill_pattern0(ramctr_timing *ctrl, int channel, u32 a, u32 b)
|
||||||
{
|
{
|
||||||
unsigned int j;
|
unsigned int j;
|
||||||
unsigned int channel_offset =
|
unsigned int channel_offset = get_precedening_channels(ctrl, channel) * 0x40;
|
||||||
get_precedening_channels(ctrl, channel) * 0x40;
|
|
||||||
for (j = 0; j < 16; j++)
|
for (j = 0; j < 16; j++)
|
||||||
write32((void *)(0x04000000 + channel_offset + 4 * j), j & 2 ? b : a);
|
write32((void *)(0x04000000 + channel_offset + 4 * j), j & 2 ? b : a);
|
||||||
sfence();
|
sfence();
|
||||||
|
@ -1747,8 +1733,7 @@ static int num_of_channels(const ramctr_timing *ctrl)
|
||||||
static void fill_pattern1(ramctr_timing *ctrl, int channel)
|
static void fill_pattern1(ramctr_timing *ctrl, int channel)
|
||||||
{
|
{
|
||||||
unsigned int j;
|
unsigned int j;
|
||||||
unsigned int channel_offset =
|
unsigned int channel_offset = get_precedening_channels(ctrl, channel) * 0x40;
|
||||||
get_precedening_channels(ctrl, channel) * 0x40;
|
|
||||||
unsigned int channel_step = 0x40 * num_of_channels(ctrl);
|
unsigned int channel_step = 0x40 * num_of_channels(ctrl);
|
||||||
for (j = 0; j < 16; j++)
|
for (j = 0; j < 16; j++)
|
||||||
write32((void *)(0x04000000 + channel_offset + j * 4), 0xffffffff);
|
write32((void *)(0x04000000 + channel_offset + j * 4), 0xffffffff);
|
||||||
|
@ -1763,10 +1748,8 @@ static void precharge(ramctr_timing *ctrl)
|
||||||
|
|
||||||
FOR_ALL_POPULATED_CHANNELS {
|
FOR_ALL_POPULATED_CHANNELS {
|
||||||
FOR_ALL_POPULATED_RANKS FOR_ALL_LANES {
|
FOR_ALL_POPULATED_RANKS FOR_ALL_LANES {
|
||||||
ctrl->timings[channel][slotrank].lanes[lane].falling =
|
ctrl->timings[channel][slotrank].lanes[lane].falling = 16;
|
||||||
16;
|
ctrl->timings[channel][slotrank].lanes[lane].rising = 16;
|
||||||
ctrl->timings[channel][slotrank].lanes[lane].rising =
|
|
||||||
16;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
program_timings(ctrl, channel);
|
program_timings(ctrl, channel);
|
||||||
|
@ -1816,10 +1799,8 @@ static void precharge(ramctr_timing *ctrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
FOR_ALL_POPULATED_RANKS FOR_ALL_LANES {
|
FOR_ALL_POPULATED_RANKS FOR_ALL_LANES {
|
||||||
ctrl->timings[channel][slotrank].lanes[lane].falling =
|
ctrl->timings[channel][slotrank].lanes[lane].falling = 48;
|
||||||
48;
|
ctrl->timings[channel][slotrank].lanes[lane].rising = 48;
|
||||||
ctrl->timings[channel][slotrank].lanes[lane].rising =
|
|
||||||
48;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
program_timings(ctrl, channel);
|
program_timings(ctrl, channel);
|
||||||
|
@ -1872,8 +1853,7 @@ static void precharge(ramctr_timing *ctrl)
|
||||||
static void test_timB(ramctr_timing *ctrl, int channel, int slotrank)
|
static void test_timB(ramctr_timing *ctrl, int channel, int slotrank)
|
||||||
{
|
{
|
||||||
/* enable DQs on this slotrank */
|
/* enable DQs on this slotrank */
|
||||||
write_mrreg(ctrl, channel, slotrank, 1,
|
write_mrreg(ctrl, channel, slotrank, 1, 0x80 | make_mr1(ctrl, slotrank, channel));
|
||||||
0x80 | make_mr1(ctrl, slotrank, channel));
|
|
||||||
|
|
||||||
wait_for_iosav(channel);
|
wait_for_iosav(channel);
|
||||||
/* DRAM command NOP */
|
/* DRAM command NOP */
|
||||||
|
@ -1885,8 +1865,7 @@ static void test_timB(ramctr_timing *ctrl, int channel, int slotrank)
|
||||||
|
|
||||||
/* DRAM command NOP */
|
/* DRAM command NOP */
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 1)) = 0x1f107;
|
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 1)) = 0x1f107;
|
||||||
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 1)) =
|
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 1)) = 0x4000c01 | ((ctrl->CAS + 38) << 16);
|
||||||
0x4000c01 | ((ctrl->CAS + 38) << 16);
|
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 1)) = (slotrank << 24) | 4;
|
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 1)) = (slotrank << 24) | 4;
|
||||||
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 1)) = 0;
|
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 1)) = 0;
|
||||||
|
|
||||||
|
@ -1896,8 +1875,7 @@ static void test_timB(ramctr_timing *ctrl, int channel, int slotrank)
|
||||||
wait_for_iosav(channel);
|
wait_for_iosav(channel);
|
||||||
|
|
||||||
/* disable DQs on this slotrank */
|
/* disable DQs on this slotrank */
|
||||||
write_mrreg(ctrl, channel, slotrank, 1,
|
write_mrreg(ctrl, channel, slotrank, 1, 0x1080 | make_mr1(ctrl, slotrank, channel));
|
||||||
0x1080 | make_mr1(ctrl, slotrank, channel));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int discover_timB(ramctr_timing *ctrl, int channel, int slotrank)
|
static int discover_timB(ramctr_timing *ctrl, int channel, int slotrank)
|
||||||
|
@ -2018,16 +1996,13 @@ static void adjust_high_timB(ramctr_timing *ctrl)
|
||||||
|
|
||||||
/* DRAM command PREA */
|
/* DRAM command PREA */
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 0)) = 0x1f002;
|
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 0)) = 0x1f002;
|
||||||
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 0)) =
|
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 0)) = 0xc01 | ((ctrl->tRP) << 16);
|
||||||
0xc01 | ((ctrl->tRP) << 16);
|
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 0)) = (slotrank << 24) | 0x60400;
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 0)) =
|
|
||||||
(slotrank << 24) | 0x60400;
|
|
||||||
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 0)) = 0x240;
|
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 0)) = 0x240;
|
||||||
|
|
||||||
/* DRAM command ACT */
|
/* DRAM command ACT */
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 1)) = 0x1f006;
|
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 1)) = 0x1f006;
|
||||||
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 1)) =
|
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 1)) = 0xc01 | ((ctrl->tRCD) << 16);
|
||||||
0xc01 | ((ctrl->tRCD) << 16);
|
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 1)) = (slotrank << 24) | 0x60000;
|
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 1)) = (slotrank << 24) | 0x60000;
|
||||||
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 1)) = 0;
|
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 1)) = 0;
|
||||||
|
|
||||||
|
@ -2044,8 +2019,7 @@ static void adjust_high_timB(ramctr_timing *ctrl)
|
||||||
|
|
||||||
wait_for_iosav(channel);
|
wait_for_iosav(channel);
|
||||||
FOR_ALL_LANES {
|
FOR_ALL_LANES {
|
||||||
u64 res = MCHBAR32(lane_registers[lane] +
|
u64 res = MCHBAR32(lane_registers[lane] + channel * 0x100 + 4);
|
||||||
channel * 0x100 + 4);
|
|
||||||
res |= ((u64) MCHBAR32(lane_registers[lane] +
|
res |= ((u64) MCHBAR32(lane_registers[lane] +
|
||||||
channel * 0x100 + 8)) << 32;
|
channel * 0x100 + 8)) << 32;
|
||||||
old = ctrl->timings[channel][slotrank].lanes[lane].timB;
|
old = ctrl->timings[channel][slotrank].lanes[lane].timB;
|
||||||
|
@ -2053,10 +2027,8 @@ static void adjust_high_timB(ramctr_timing *ctrl)
|
||||||
get_timB_high_adjust(res) * 64;
|
get_timB_high_adjust(res) * 64;
|
||||||
|
|
||||||
printram("High adjust %d:%016llx\n", lane, res);
|
printram("High adjust %d:%016llx\n", lane, res);
|
||||||
printram("Bval+: %d, %d, %d, %x -> %x\n", channel,
|
printram("Bval+: %d, %d, %d, %x -> %x\n", channel, slotrank, lane,
|
||||||
slotrank, lane, old,
|
old, ctrl->timings[channel][slotrank].lanes[lane].timB);
|
||||||
ctrl->timings[channel][slotrank].lanes[lane].
|
|
||||||
timB);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MCHBAR32(GDCRTRAININGMOD) = 0;
|
MCHBAR32(GDCRTRAININGMOD) = 0;
|
||||||
|
@ -2276,8 +2248,7 @@ static int test_320c(ramctr_timing *ctrl, int channel, int slotrank)
|
||||||
static void fill_pattern5(ramctr_timing *ctrl, int channel, int patno)
|
static void fill_pattern5(ramctr_timing *ctrl, int channel, int patno)
|
||||||
{
|
{
|
||||||
unsigned int i, j;
|
unsigned int i, j;
|
||||||
unsigned int channel_offset =
|
unsigned int channel_offset = get_precedening_channels(ctrl, channel) * 0x40;
|
||||||
get_precedening_channels(ctrl, channel) * 0x40;
|
|
||||||
unsigned int channel_step = 0x40 * num_of_channels(ctrl);
|
unsigned int channel_step = 0x40 * num_of_channels(ctrl);
|
||||||
|
|
||||||
if (patno) {
|
if (patno) {
|
||||||
|
@ -2367,8 +2338,7 @@ static int try_cmd_stretch(ramctr_timing *ctrl, int channel, int cmd_stretch)
|
||||||
printram("Trying cmd_stretch %d on channel %d\n", cmd_stretch, channel);
|
printram("Trying cmd_stretch %d on channel %d\n", cmd_stretch, channel);
|
||||||
|
|
||||||
FOR_ALL_POPULATED_RANKS {
|
FOR_ALL_POPULATED_RANKS {
|
||||||
saved_timings[channel][slotrank] =
|
saved_timings[channel][slotrank] = ctrl->timings[channel][slotrank];
|
||||||
ctrl->timings[channel][slotrank];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ctrl->cmd_stretch[channel] = cmd_stretch;
|
ctrl->cmd_stretch[channel] = cmd_stretch;
|
||||||
|
@ -2398,8 +2368,7 @@ static int try_cmd_stretch(ramctr_timing *ctrl, int channel, int cmd_stretch)
|
||||||
program_timings(ctrl, channel);
|
program_timings(ctrl, channel);
|
||||||
reprogram_320c(ctrl);
|
reprogram_320c(ctrl);
|
||||||
FOR_ALL_POPULATED_RANKS {
|
FOR_ALL_POPULATED_RANKS {
|
||||||
stat[slotrank][c320c + 127] =
|
stat[slotrank][c320c + 127] = test_320c(ctrl, channel, slotrank);
|
||||||
test_320c(ctrl, channel, slotrank);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FOR_ALL_POPULATED_RANKS {
|
FOR_ALL_POPULATED_RANKS {
|
||||||
|
@ -2464,8 +2433,7 @@ int command_training(ramctr_timing *ctrl)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
printram("Using CMD rate %uT on channel %u\n",
|
printram("Using CMD rate %uT on channel %u\n", cmdrate + 1, channel);
|
||||||
cmdrate + 1, channel);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FOR_ALL_POPULATED_CHANNELS
|
FOR_ALL_POPULATED_CHANNELS
|
||||||
|
@ -2476,8 +2444,7 @@ int command_training(ramctr_timing *ctrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int discover_edges_real(ramctr_timing *ctrl, int channel, int slotrank,
|
static int discover_edges_real(ramctr_timing *ctrl, int channel, int slotrank, int *edges)
|
||||||
int *edges)
|
|
||||||
{
|
{
|
||||||
int edge;
|
int edge;
|
||||||
int statistics[NUM_LANES][MAX_EDGE_TIMING + 1];
|
int statistics[NUM_LANES][MAX_EDGE_TIMING + 1];
|
||||||
|
@ -2485,10 +2452,8 @@ static int discover_edges_real(ramctr_timing *ctrl, int channel, int slotrank,
|
||||||
|
|
||||||
for (edge = 0; edge <= MAX_EDGE_TIMING; edge++) {
|
for (edge = 0; edge <= MAX_EDGE_TIMING; edge++) {
|
||||||
FOR_ALL_LANES {
|
FOR_ALL_LANES {
|
||||||
ctrl->timings[channel][slotrank].lanes[lane].rising =
|
ctrl->timings[channel][slotrank].lanes[lane].rising = edge;
|
||||||
edge;
|
ctrl->timings[channel][slotrank].lanes[lane].falling = edge;
|
||||||
ctrl->timings[channel][slotrank].lanes[lane].falling =
|
|
||||||
edge;
|
|
||||||
}
|
}
|
||||||
program_timings(ctrl, channel);
|
program_timings(ctrl, channel);
|
||||||
|
|
||||||
|
@ -2504,8 +2469,7 @@ static int discover_edges_real(ramctr_timing *ctrl, int channel, int slotrank,
|
||||||
* all reads return a predefined pattern */
|
* all reads return a predefined pattern */
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 0)) = 0x1f000;
|
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 0)) = 0x1f000;
|
||||||
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 0)) = 0xc01 | (ctrl->tMOD << 16);
|
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 0)) = 0xc01 | (ctrl->tMOD << 16);
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 0)) =
|
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 0)) = (slotrank << 24) | 0x360004;
|
||||||
(slotrank << 24) | 0x360004;
|
|
||||||
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 0)) = 0;
|
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 0)) = 0;
|
||||||
|
|
||||||
/* DRAM command RD */
|
/* DRAM command RD */
|
||||||
|
@ -2516,8 +2480,7 @@ static int discover_edges_real(ramctr_timing *ctrl, int channel, int slotrank,
|
||||||
|
|
||||||
/* DRAM command RD */
|
/* DRAM command RD */
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 2)) = 0x1f105;
|
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 2)) = 0x1f105;
|
||||||
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 2)) =
|
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 2)) = 0x1001 | ((ctrl->CAS + 8) << 16);
|
||||||
0x1001 | ((ctrl->CAS + 8) << 16);
|
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 2)) = (slotrank << 24) | 0x60000;
|
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 2)) = (slotrank << 24) | 0x60000;
|
||||||
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 2)) = 0;
|
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 2)) = 0;
|
||||||
|
|
||||||
|
@ -2525,8 +2488,7 @@ static int discover_edges_real(ramctr_timing *ctrl, int channel, int slotrank,
|
||||||
* MR3 disable MPR */
|
* MR3 disable MPR */
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 3)) = 0x1f000;
|
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 3)) = 0x1f000;
|
||||||
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 3)) = 0xc01 | (ctrl->tMOD << 16);
|
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 3)) = 0xc01 | (ctrl->tMOD << 16);
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 3)) =
|
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 3)) = (slotrank << 24) | 0x360000;
|
||||||
(slotrank << 24) | 0x360000;
|
|
||||||
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 3)) = 0;
|
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 3)) = 0;
|
||||||
|
|
||||||
// execute command queue
|
// execute command queue
|
||||||
|
@ -2540,8 +2502,7 @@ static int discover_edges_real(ramctr_timing *ctrl, int channel, int slotrank,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FOR_ALL_LANES {
|
FOR_ALL_LANES {
|
||||||
struct run rn =
|
struct run rn = get_longest_zero_run(statistics[lane], MAX_EDGE_TIMING + 1);
|
||||||
get_longest_zero_run(statistics[lane], MAX_EDGE_TIMING + 1);
|
|
||||||
edges[lane] = rn.middle;
|
edges[lane] = rn.middle;
|
||||||
if (rn.all) {
|
if (rn.all) {
|
||||||
printk(BIOS_EMERG, "edge discovery failed: %d, %d, %d\n",
|
printk(BIOS_EMERG, "edge discovery failed: %d, %d, %d\n",
|
||||||
|
@ -2577,10 +2538,8 @@ int discover_edges(ramctr_timing *ctrl)
|
||||||
}
|
}
|
||||||
|
|
||||||
FOR_ALL_POPULATED_RANKS FOR_ALL_LANES {
|
FOR_ALL_POPULATED_RANKS FOR_ALL_LANES {
|
||||||
ctrl->timings[channel][slotrank].lanes[lane].falling =
|
ctrl->timings[channel][slotrank].lanes[lane].falling = 16;
|
||||||
16;
|
ctrl->timings[channel][slotrank].lanes[lane].rising = 16;
|
||||||
ctrl->timings[channel][slotrank].lanes[lane].rising =
|
|
||||||
16;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
program_timings(ctrl, channel);
|
program_timings(ctrl, channel);
|
||||||
|
@ -2633,10 +2592,8 @@ int discover_edges(ramctr_timing *ctrl)
|
||||||
/* XXX: check any measured value ? */
|
/* XXX: check any measured value ? */
|
||||||
|
|
||||||
FOR_ALL_POPULATED_RANKS FOR_ALL_LANES {
|
FOR_ALL_POPULATED_RANKS FOR_ALL_LANES {
|
||||||
ctrl->timings[channel][slotrank].lanes[lane].falling =
|
ctrl->timings[channel][slotrank].lanes[lane].falling = 48;
|
||||||
48;
|
ctrl->timings[channel][slotrank].lanes[lane].rising = 48;
|
||||||
ctrl->timings[channel][slotrank].lanes[lane].rising =
|
|
||||||
48;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
program_timings(ctrl, channel);
|
program_timings(ctrl, channel);
|
||||||
|
@ -2690,8 +2647,7 @@ int discover_edges(ramctr_timing *ctrl)
|
||||||
|
|
||||||
FOR_ALL_LANES {
|
FOR_ALL_LANES {
|
||||||
MCHBAR32(IOSAV_By_BW_MASK_ch(channel, lane)) =
|
MCHBAR32(IOSAV_By_BW_MASK_ch(channel, lane)) =
|
||||||
~MCHBAR32(IOSAV_By_BW_SERROR_ch(channel, lane))
|
~MCHBAR32(IOSAV_By_BW_SERROR_ch(channel, lane)) & 0xff;
|
||||||
& 0xff;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fill_pattern0(ctrl, channel, 0, 0xffffffff);
|
fill_pattern0(ctrl, channel, 0, 0xffffffff);
|
||||||
|
@ -2782,8 +2738,7 @@ static int discover_edges_write_real(ramctr_timing *ctrl, int channel,
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 0)) = 0x1f006;
|
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 0)) = 0x1f006;
|
||||||
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 0)) =
|
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 0)) =
|
||||||
0x4 | (ctrl->tRCD << 16) |
|
0x4 | (ctrl->tRCD << 16) |
|
||||||
(MAX(ctrl->tRRD, (ctrl->tFAW >> 2) + 1)
|
(MAX(ctrl->tRRD, (ctrl->tFAW >> 2) + 1) << 10);
|
||||||
<< 10);
|
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 0)) =
|
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 0)) =
|
||||||
(slotrank << 24) | 0x60000;
|
(slotrank << 24) | 0x60000;
|
||||||
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 0)) = 0x240;
|
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 0)) = 0x240;
|
||||||
|
@ -2821,8 +2776,7 @@ static int discover_edges_write_real(ramctr_timing *ctrl, int channel,
|
||||||
MCHBAR32(IOSAV_By_ERROR_COUNT_ch(channel, lane));
|
MCHBAR32(IOSAV_By_ERROR_COUNT_ch(channel, lane));
|
||||||
}
|
}
|
||||||
|
|
||||||
raw_statistics[edge] =
|
raw_statistics[edge] = MCHBAR32(0x436c + channel * 0x400);
|
||||||
MCHBAR32(0x436c + channel * 0x400);
|
|
||||||
}
|
}
|
||||||
FOR_ALL_LANES {
|
FOR_ALL_LANES {
|
||||||
struct run rn;
|
struct run rn;
|
||||||
|
@ -2906,8 +2860,7 @@ static void test_timC_write(ramctr_timing *ctrl, int channel, int slotrank)
|
||||||
/* DRAM command ACT */
|
/* DRAM command ACT */
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 0)) = 0x1f006;
|
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 0)) = 0x1f006;
|
||||||
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 0)) =
|
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 0)) =
|
||||||
(MAX((ctrl->tFAW >> 2) + 1, ctrl->tRRD)
|
(MAX((ctrl->tFAW >> 2) + 1, ctrl->tRRD) << 10) | (ctrl->tRCD << 16) | 4;
|
||||||
<< 10) | (ctrl->tRCD << 16) | 4;
|
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 0)) =
|
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 0)) =
|
||||||
(slotrank << 24) | 0x60000;
|
(slotrank << 24) | 0x60000;
|
||||||
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 0)) = 0x244;
|
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 0)) = 0x244;
|
||||||
|
@ -2921,8 +2874,7 @@ static void test_timC_write(ramctr_timing *ctrl, int channel, int slotrank)
|
||||||
|
|
||||||
/* DRAM command RD */
|
/* DRAM command RD */
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 2)) = 0x1f105;
|
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 2)) = 0x1f105;
|
||||||
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 2)) =
|
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 2)) = 0x40011e0 | (MAX(ctrl->tRTP, 8) << 16);
|
||||||
0x40011e0 | (MAX(ctrl->tRTP, 8) << 16);
|
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 2)) = slotrank << 24;
|
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 2)) = slotrank << 24;
|
||||||
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 2)) = 0x242;
|
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 2)) = 0x242;
|
||||||
|
|
||||||
|
@ -3090,8 +3042,7 @@ int channel_test(ramctr_timing *ctrl)
|
||||||
slotrank = 0;
|
slotrank = 0;
|
||||||
FOR_ALL_POPULATED_CHANNELS
|
FOR_ALL_POPULATED_CHANNELS
|
||||||
if (MCHBAR32(MC_INIT_STATE_ch(channel)) & 0xa000) {
|
if (MCHBAR32(MC_INIT_STATE_ch(channel)) & 0xa000) {
|
||||||
printk(BIOS_EMERG, "Mini channel test failed (1): %d\n",
|
printk(BIOS_EMERG, "Mini channel test failed (1): %d\n", channel);
|
||||||
channel);
|
|
||||||
return MAKE_ERR;
|
return MAKE_ERR;
|
||||||
}
|
}
|
||||||
FOR_ALL_POPULATED_CHANNELS {
|
FOR_ALL_POPULATED_CHANNELS {
|
||||||
|
@ -3112,29 +3063,25 @@ int channel_test(ramctr_timing *ctrl)
|
||||||
/* DRAM command ACT */
|
/* DRAM command ACT */
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 0)) = 0x0001f006;
|
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 0)) = 0x0001f006;
|
||||||
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 0)) = 0x0028a004;
|
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 0)) = 0x0028a004;
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 0)) =
|
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 0)) = 0x00060000 | (slotrank << 24);
|
||||||
0x00060000 | (slotrank << 24);
|
|
||||||
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 0)) = 0x00000244;
|
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 0)) = 0x00000244;
|
||||||
|
|
||||||
/* DRAM command WR */
|
/* DRAM command WR */
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 1)) = 0x0001f201;
|
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 1)) = 0x0001f201;
|
||||||
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 1)) = 0x08281064;
|
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 1)) = 0x08281064;
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 1)) =
|
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 1)) = 0x00000000 | (slotrank << 24);
|
||||||
0x00000000 | (slotrank << 24);
|
|
||||||
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 1)) = 0x00000242;
|
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 1)) = 0x00000242;
|
||||||
|
|
||||||
/* DRAM command RD */
|
/* DRAM command RD */
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 2)) = 0x0001f105;
|
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 2)) = 0x0001f105;
|
||||||
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 2)) = 0x04281064;
|
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 2)) = 0x04281064;
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 2)) =
|
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 2)) = 0x00000000 | (slotrank << 24);
|
||||||
0x00000000 | (slotrank << 24);
|
|
||||||
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 2)) = 0x00000242;
|
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 2)) = 0x00000242;
|
||||||
|
|
||||||
/* DRAM command PRE */
|
/* DRAM command PRE */
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 3)) = 0x0001f002;
|
MCHBAR32(IOSAV_n_SP_CMD_CTL_ch(channel, 3)) = 0x0001f002;
|
||||||
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 3)) = 0x00280c01;
|
MCHBAR32(IOSAV_n_SUBSEQ_CTL_ch(channel, 3)) = 0x00280c01;
|
||||||
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 3)) =
|
MCHBAR32(IOSAV_n_SP_CMD_ADDR_ch(channel, 3)) = 0x00060400 | (slotrank << 24);
|
||||||
0x00060400 | (slotrank << 24);
|
|
||||||
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 3)) = 0x00000240;
|
MCHBAR32(IOSAV_n_ADDR_UPD_ch(channel, 3)) = 0x00000240;
|
||||||
|
|
||||||
// execute command queue
|
// execute command queue
|
||||||
|
@ -3316,13 +3263,10 @@ void final_registers(ramctr_timing *ctrl)
|
||||||
t1_ns += 500;
|
t1_ns += 500;
|
||||||
|
|
||||||
t2_ns = 10 * ((MCHBAR32(SAPMTIMERS) >> 8) & 0xfff);
|
t2_ns = 10 * ((MCHBAR32(SAPMTIMERS) >> 8) & 0xfff);
|
||||||
if (MCHBAR32(SAPMCTL) & 8)
|
if (MCHBAR32(SAPMCTL) & 8) {
|
||||||
{
|
|
||||||
t3_ns = 10 * ((MCHBAR32(BANDTIMERS_IVB) >> 8) & 0xfff);
|
t3_ns = 10 * ((MCHBAR32(BANDTIMERS_IVB) >> 8) & 0xfff);
|
||||||
t3_ns += 10 * (MCHBAR32(SAPMTIMERS2_IVB) & 0xff);
|
t3_ns += 10 * (MCHBAR32(SAPMTIMERS2_IVB) & 0xff);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
t3_ns = 500;
|
t3_ns = 500;
|
||||||
}
|
}
|
||||||
printk(BIOS_DEBUG, "t123: %d, %d, %d\n",
|
printk(BIOS_DEBUG, "t123: %d, %d, %d\n",
|
||||||
|
|
Loading…
Reference in New Issue