x4x/raminit_ddr23: use MCHBAR AND/OR/AND_OR macros [1/2]

When using timeless builds and coreboot crossgcc 6.3.0, the checksum of the
resulting binary doesn't change with applying this commit.

Change-Id: I057abe314622e92000c7e4ff2faa4595edb5244b
Signed-off-by: Felix Held <felix-coreboot@felixheld.de>
Reviewed-on: https://review.coreboot.org/27717
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Reviewed-by: Arthur Heymans <arthur@aheymans.xyz>
This commit is contained in:
Felix Held 2018-07-29 18:09:30 +02:00
parent aade90e68d
commit 432575c5d3
1 changed files with 224 additions and 222 deletions

View File

@ -53,7 +53,7 @@ static void program_crossclock(struct sysinfo *s)
{ {
u8 i, j; u8 i, j;
u32 reg32; u32 reg32;
MCHBAR16(0xc1c) = MCHBAR16(0xc1c) | (1 << 15); MCHBAR16_OR(0xc1c, (1 << 15));
static const u32 clkxtab[6][3][13] = { static const u32 clkxtab[6][3][13] = {
/* MEMCLK 400 N/A */ /* MEMCLK 400 N/A */
@ -125,7 +125,7 @@ static void program_crossclock(struct sysinfo *s)
} }
MCHBAR32(0xc50) = reg32; MCHBAR32(0xc50) = reg32;
MCHBAR32(0xc54) = clkxtab[i][j][2]; MCHBAR32(0xc54) = clkxtab[i][j][2];
MCHBAR8(0xc08) = MCHBAR8(0xc08) | (1 << 7); MCHBAR8_OR(0xc08, (1 << 7));
MCHBAR32(0x6d8) = clkxtab[i][j][3]; MCHBAR32(0x6d8) = clkxtab[i][j][3];
MCHBAR32(0x6e0) = clkxtab[i][j][3]; MCHBAR32(0x6e0) = clkxtab[i][j][3];
MCHBAR32(0x6dc) = clkxtab[i][j][4]; MCHBAR32(0x6dc) = clkxtab[i][j][4];
@ -143,29 +143,29 @@ static void program_crossclock(struct sysinfo *s)
static void setioclk_dram(struct sysinfo *s) static void setioclk_dram(struct sysinfo *s)
{ {
MCHBAR32(0x1bc) = 0x08060402; MCHBAR32(0x1bc) = 0x08060402;
MCHBAR16(0x1c0) = MCHBAR16(0x1c0) | 0x200; MCHBAR16_OR(0x1c0, 0x200);
MCHBAR16(0x1c0) = MCHBAR16(0x1c0) | 0x100; MCHBAR16_OR(0x1c0, 0x100);
MCHBAR16(0x1c0) = MCHBAR16(0x1c0) | 0x20; MCHBAR16_OR(0x1c0, 0x20);
MCHBAR16(0x1c0) = MCHBAR16(0x1c0) & ~1; MCHBAR16_AND(0x1c0, ~1);
switch (s->selected_timings.mem_clk) { switch (s->selected_timings.mem_clk) {
default: default:
case MEM_CLOCK_800MHz: case MEM_CLOCK_800MHz:
case MEM_CLOCK_1066MHz: case MEM_CLOCK_1066MHz:
MCHBAR8(0x5d9) = (MCHBAR8(0x5d9) & ~0x2) | 0x2; MCHBAR8_AND_OR(0x5d9, ~0x2, 0x2);
MCHBAR8(0x9d9) = (MCHBAR8(0x9d9) & ~0x2) | 0x2; MCHBAR8_AND_OR(0x9d9, ~0x2, 0x2);
MCHBAR8(0x189) = (MCHBAR8(0x189) & ~0xf0) | 0xc0; MCHBAR8_AND_OR(0x189, ~0xf0, 0xc0);
MCHBAR8(0x189) = (MCHBAR8(0x189) & ~0xf0) | 0xe0; MCHBAR8_AND_OR(0x189, ~0xf0, 0xe0);
MCHBAR8(0x189) = (MCHBAR8(0x189) & ~0xf0) | 0xa0; MCHBAR8_AND_OR(0x189, ~0xf0, 0xa0);
break; break;
case MEM_CLOCK_667MHz: case MEM_CLOCK_667MHz:
case MEM_CLOCK_1333MHz: case MEM_CLOCK_1333MHz:
MCHBAR8(0x5d9) = MCHBAR8(0x5d9) & ~0x2; MCHBAR8_AND(0x5d9, ~0x2);
MCHBAR8(0x9d9) = MCHBAR8(0x9d9) & ~0x2; MCHBAR8_AND(0x9d9, ~0x2);
MCHBAR8(0x189) = (MCHBAR8(0x189) & ~0xf0) | 0x40; MCHBAR8_AND_OR(0x189, ~0xf0, 0x40);
break; break;
} }
MCHBAR32(0x594) = MCHBAR32(0x594) | (1 << 31); MCHBAR32_OR(0x594, 1 << 31);
MCHBAR32(0x994) = MCHBAR32(0x994) | (1 << 31); MCHBAR32_OR(0x994, 1 << 31);
} }
static void launch_dram(struct sysinfo *s) static void launch_dram(struct sysinfo *s)
@ -253,14 +253,14 @@ static void launch_dram(struct sysinfo *s)
MCHBAR32(0x400*i + 0x220) = launch1; MCHBAR32(0x400*i + 0x220) = launch1;
MCHBAR32(0x400*i + 0x224) = launch2; MCHBAR32(0x400*i + 0x224) = launch2;
MCHBAR32(0x400*i + 0x21c) = 0; MCHBAR32(0x400*i + 0x21c) = 0;
MCHBAR32(0x400*i + 0x248) = MCHBAR32(0x400*i + 0x248) | (1 << 23); MCHBAR32_OR(0x400*i + 0x248, 1 << 23);
} }
MCHBAR32(0x2c0) = (MCHBAR32(0x2c0) & ~0x58000000) | 0x48000000; MCHBAR32_AND_OR(0x2c0, ~0x58000000, 0x48000000);
MCHBAR32(0x2c0) = MCHBAR32(0x2c0) | 0x1e0; MCHBAR32_OR(0x2c0, 0x1e0);
MCHBAR32(0x2c4) = (MCHBAR32(0x2c4) & ~0xf) | 0xc; MCHBAR32_AND_OR(0x2c4, ~0xf, 0xc);
if (s->spd_type == DDR3) if (s->spd_type == DDR3)
MCHBAR32(0x2c4) = MCHBAR32(0x2c4) | 0x100; MCHBAR32_OR(0x2c4, 0x100);
} }
static void clkset0(u8 ch, const struct dll_setting *setting) static void clkset0(u8 ch, const struct dll_setting *setting)
@ -541,10 +541,10 @@ static void program_timings(struct sysinfo *s)
} }
FOR_EACH_POPULATED_CHANNEL(s->dimms, i) { FOR_EACH_POPULATED_CHANNEL(s->dimms, i) {
MCHBAR8(0x400*i + 0x26f) = MCHBAR8(0x400*i + 0x26f) | 0x3; MCHBAR8_OR(0x400*i + 0x26f, 0x3);
MCHBAR8(0x400*i + 0x228) = (MCHBAR8(0x400*i + 0x228) & ~0x7) | 0x2; MCHBAR8_AND_OR(0x400*i + 0x228, ~0x7, 0x2);
MCHBAR8(0x400*i + 0x240) = (MCHBAR8(0x400*i + 0x240) & ~0xf0) /* tWL - x ?? */
| (0 << 4); /* tWL - x ?? */ MCHBAR8_AND_OR(0x400*i + 0x240, ~0xf0, 0 << 4);
MCHBAR8(0x400*i + 0x240) = (MCHBAR8(0x400*i + 0x240) & ~0xf) | MCHBAR8(0x400*i + 0x240) = (MCHBAR8(0x400*i + 0x240) & ~0xf) |
adjusted_cas; adjusted_cas;
MCHBAR16(0x400*i + 0x265) = (MCHBAR16(0x400*i + 0x265) & ~0x3f00) | MCHBAR16(0x400*i + 0x265) = (MCHBAR16(0x400*i + 0x265) & ~0x3f00) |
@ -628,13 +628,13 @@ static void program_timings(struct sysinfo *s)
} }
reg16 |= flag1 << 8; reg16 |= flag1 << 8;
reg16 |= flag2 << 9; reg16 |= flag2 << 9;
MCHBAR16(0x400*i + 0x24d) = (MCHBAR16(0x400*i + 0x24d) & ~0x1ff) | reg16; MCHBAR16_AND_OR(0x400*i + 0x24d, ~0x1ff, reg16);
MCHBAR16(0x400*i + 0x25e) = 0x15a5; MCHBAR16(0x400*i + 0x25e) = 0x15a5;
MCHBAR32(0x400*i + 0x265) = MCHBAR32(0x400*i + 0x265) & ~0x1f; MCHBAR32_AND(0x400*i + 0x265, ~0x1f);
MCHBAR32(0x400*i + 0x269) = (MCHBAR32(0x400*i + 0x269) & ~0x000fffff) | MCHBAR32_AND_OR(0x400*i + 0x269, ~0x000fffff,
(0x3f << 14) | lut1[s->selected_timings.mem_clk]; (0x3f << 14) | lut1[s->selected_timings.mem_clk]);
MCHBAR8(0x400*i + 0x274) = MCHBAR8(0x400*i + 0x274) | 1; MCHBAR8_OR(0x400*i + 0x274, 1);
MCHBAR8(0x400*i + 0x24c) = MCHBAR8(0x400*i + 0x24c) & ~0x3; MCHBAR8_AND(0x400*i + 0x24c, ~0x3);
reg16 = 0; reg16 = 0;
if (s->spd_type == DDR2) { if (s->spd_type == DDR2) {
@ -666,36 +666,36 @@ static void program_timings(struct sysinfo *s)
reg16 &= 0x7; reg16 &= 0x7;
reg16 += twl + 9; reg16 += twl + 9;
reg16 <<= 10; reg16 <<= 10;
MCHBAR16(0x400*i + 0x24d) = (MCHBAR16(0x400*i + 0x24d) & ~0x7c00) | reg16; MCHBAR16_AND_OR(0x400*i + 0x24d, ~0x7c00, reg16);
MCHBAR8(0x400*i + 0x267) = (MCHBAR8(0x400*i + 0x267) & ~0x3f) | 0x13; MCHBAR8_AND_OR(0x400*i + 0x267, ~0x3f, 0x13);
MCHBAR8(0x400*i + 0x268) = (MCHBAR8(0x400*i + 0x268) & ~0xff) | 0x4a; MCHBAR8_AND_OR(0x400*i + 0x268, ~0xff, 0x4a);
reg16 = (MCHBAR16(0x400*i + 0x269) & 0xc000) >> 2; reg16 = (MCHBAR16(0x400*i + 0x269) & 0xc000) >> 2;
reg16 += 2 << 12; reg16 += 2 << 12;
reg16 |= (0x15 << 6) | 0x1f; reg16 |= (0x15 << 6) | 0x1f;
MCHBAR16(0x400*i + 0x26d) = (MCHBAR16(0x400*i + 0x26d) & ~0x7fff) | reg16; MCHBAR16_AND_OR(0x400*i + 0x26d, ~0x7fff, reg16);
reg32 = (1 << 25) | (6 << 27); reg32 = (1 << 25) | (6 << 27);
MCHBAR32(0x400*i + 0x269) = (MCHBAR32(0x400*i + 0x269) & ~0xfa300000) | reg32; MCHBAR32_AND_OR(0x400*i + 0x269, ~0xfa300000, reg32);
MCHBAR8(0x400*i + 0x271) = MCHBAR8(0x400*i + 0x271) & ~0x80; MCHBAR8_AND(0x400*i + 0x271, ~0x80);
MCHBAR8(0x400*i + 0x274) = MCHBAR8(0x400*i + 0x274) & ~0x6; MCHBAR8_AND(0x400*i + 0x274, ~0x6);
} // END EACH POPULATED CHANNEL } // END EACH POPULATED CHANNEL
reg16 = 0x1f << 5; reg16 = 0x1f << 5;
reg16 |= 0xe << 10; reg16 |= 0xe << 10;
MCHBAR16(0x125) = (MCHBAR16(0x125) & ~0x3fe0) | reg16; MCHBAR16_AND_OR(0x125, ~0x3fe0, reg16);
MCHBAR16(0x127) = (MCHBAR16(0x127) & ~0x7ff) | 0x540; MCHBAR16_AND_OR(0x127, ~0x7ff, 0x540);
MCHBAR8(0x129) = MCHBAR8(0x129) | 0x1f; MCHBAR8_OR(0x129, 0x1f);
MCHBAR8(0x12c) = MCHBAR8(0x12c) | 0xa0; MCHBAR8_OR(0x12c, 0xa0);
MCHBAR32(0x241) = (MCHBAR32(0x241) & ~0x1ffff) | 0x11; MCHBAR32_AND_OR(0x241, ~0x1ffff, 0x11);
MCHBAR32(0x641) = (MCHBAR32(0x641) & ~0x1ffff) | 0x11; MCHBAR32_AND_OR(0x641, ~0x1ffff, 0x11);
MCHBAR8(0x246) = MCHBAR8(0x246) & ~0x10; MCHBAR8_AND(0x246, ~0x10);
MCHBAR8(0x646) = MCHBAR8(0x646) & ~0x10; MCHBAR8_AND(0x646, ~0x10);
MCHBAR32(0x120) = (2 << 29) | (1 << 28) | (1 << 23) | 0xd7f5f; MCHBAR32(0x120) = (2 << 29) | (1 << 28) | (1 << 23) | 0xd7f5f;
reg8 = (u8)((MCHBAR32(0x252) & 0x1e000) >> 13); reg8 = (u8)((MCHBAR32(0x252) & 0x1e000) >> 13);
MCHBAR8(0x12d) = (MCHBAR8(0x12d) & ~0xf0) | (reg8 << 4); MCHBAR8_AND_OR(0x12d, ~0xf0, reg8 << 4);
reg8 = (u8)((MCHBAR32(0x258) & 0x1e0000) >> 17); reg8 = (u8)((MCHBAR32(0x258) & 0x1e0000) >> 17);
MCHBAR8(0x12d) = (MCHBAR8(0x12d) & ~0xf) | reg8; MCHBAR8_AND_OR(0x12d, ~0xf, reg8);
MCHBAR8(0x12f) = 0x4c; MCHBAR8(0x12f) = 0x4c;
reg32 = (1 << 31) | (0x80 << 14) | (1 << 13) | (0xa << 9); reg32 = (1 << 31) | (0x80 << 14) | (1 << 13) | (0xa << 9);
if (s->spd_type == DDR3) { if (s->spd_type == DDR3) {
@ -706,8 +706,8 @@ static void program_timings(struct sysinfo *s)
reg16 &= 0x1ff; reg16 &= 0x1ff;
reg32 = (reg16 << 22) | (0x80 << 14) | (0xa << 9); reg32 = (reg16 << 22) | (0x80 << 14) | (0xa << 9);
} }
MCHBAR32(0x6c0) = (MCHBAR32(0x6c0) & ~0xffffff00) | reg32; MCHBAR32_AND_OR(0x6c0, ~0xffffff00, reg32);
MCHBAR8(0x6c4) = (MCHBAR8(0x6c4) & ~0x7) | 0x2; MCHBAR8_AND_OR(0x6c4, ~0x7, 0x2);
} }
static void program_dll(struct sysinfo *s) static void program_dll(struct sysinfo *s)
@ -719,11 +719,11 @@ static void program_dll(struct sysinfo *s)
const u8 rank2clken[8] = { 0x04, 0x01, 0x20, 0x08, 0x01, 0x04, const u8 rank2clken[8] = { 0x04, 0x01, 0x20, 0x08, 0x01, 0x04,
0x08, 0x10 }; 0x08, 0x10 };
MCHBAR16(0x180) = (MCHBAR16(0x180) & ~0x7e06) | 0xc04; MCHBAR16_AND_OR(0x180, ~0x7e06, 0xc04);
MCHBAR16(0x182) = (MCHBAR16(0x182) & ~0x3ff) | 0xc8; MCHBAR16_AND_OR(0x182, ~0x3ff, 0xc8);
MCHBAR16(0x18a) = (MCHBAR16(0x18a) & ~0x1f1f) | 0x0f0f; MCHBAR16_AND_OR(0x18a, ~0x1f1f, 0x0f0f);
MCHBAR16(0x1b4) = (MCHBAR16(0x1b4) & ~0x8020) | 0x100; MCHBAR16_AND_OR(0x1b4, ~0x8020, 0x100);
MCHBAR8(0x194) = (MCHBAR8(0x194) & ~0x77) | 0x33; MCHBAR8_AND_OR(0x194, ~0x77, 0x33);
switch (s->selected_timings.mem_clk) { switch (s->selected_timings.mem_clk) {
default: default:
case MEM_CLOCK_667MHz: case MEM_CLOCK_667MHz:
@ -737,41 +737,41 @@ static void program_dll(struct sysinfo *s)
reg16 = (0x7 << 9) | 0x7; reg16 = (0x7 << 9) | 0x7;
break; break;
} }
MCHBAR16(0x19c) = (MCHBAR16(0x19c) & ~0x1e0f) | reg16; MCHBAR16_AND_OR(0x19c, ~0x1e0f, reg16);
MCHBAR16(0x19c) = (MCHBAR16(0x19c) & ~0x2030) | 0x2010; MCHBAR16_AND_OR(0x19c, ~0x2030, 0x2010);
udelay(1); udelay(1);
MCHBAR16(0x198) = MCHBAR16(0x198) & ~0x100; MCHBAR16_AND(0x198, ~0x100);
MCHBAR16(0x1c8) = (MCHBAR16(0x1c8) & ~0x1f) | 0xd; MCHBAR16_AND_OR(0x1c8, ~0x1f, 0xd);
udelay(1); udelay(1);
MCHBAR8(0x190) = MCHBAR8(0x190) & ~1; MCHBAR8_AND(0x190, ~1);
udelay(1); // 533ns udelay(1); // 533ns
MCHBAR32(0x198) = MCHBAR32(0x198) & ~0x11554000; MCHBAR32_AND(0x198, ~0x11554000);
udelay(1); udelay(1);
MCHBAR32(0x198) = MCHBAR32(0x198) & ~0x1455; MCHBAR32_AND(0x198, ~0x1455);
udelay(1); udelay(1);
MCHBAR8(0x583) = MCHBAR8(0x583) & ~0x1c; MCHBAR8_AND(0x583, ~0x1c);
MCHBAR8(0x983) = MCHBAR8(0x983) & ~0x1c; MCHBAR8_AND(0x983, ~0x1c);
udelay(1); // 533ns udelay(1); // 533ns
MCHBAR8(0x583) = MCHBAR8(0x583) & ~0x3; MCHBAR8_AND(0x583, ~0x3);
MCHBAR8(0x983) = MCHBAR8(0x983) & ~0x3; MCHBAR8_AND(0x983, ~0x3);
udelay(1); // 533ns udelay(1); // 533ns
// ME related // ME related
MCHBAR32(0x1a0) = (MCHBAR32(0x1a0) & ~0x7ffffff) MCHBAR32_AND_OR(0x1a0, ~0x7ffffff,
| (s->spd_type == DDR2 ? 0x551803 : 0x555801); s->spd_type == DDR2 ? 0x551803 : 0x555801);
MCHBAR16(0x1b4) = MCHBAR16(0x1b4) & ~0x800; MCHBAR16_AND(0x1b4, ~0x800);
if (s->spd_type == DDR2) { if (s->spd_type == DDR2) {
MCHBAR8(0x1a8) = MCHBAR8(0x1a8) | 0xf0; MCHBAR8_OR(0x1a8, 0xf0);
} else { /* DDR3 */ } else { /* DDR3 */
reg8 = 0x9; /* 0x9 << 4 ?? */ reg8 = 0x9; /* 0x9 << 4 ?? */
if (s->dimms[0].ranks == 2) if (s->dimms[0].ranks == 2)
reg8 &= ~0x80; reg8 &= ~0x80;
if (s->dimms[3].ranks == 2) if (s->dimms[3].ranks == 2)
reg8 &= ~0x10; reg8 &= ~0x10;
MCHBAR8(0x1a8) = (MCHBAR8(0x1a8) & ~0xf0) | reg8; MCHBAR8_AND_OR(0x1a8, ~0xf0, reg8);
} }
FOR_EACH_CHANNEL(i) { FOR_EACH_CHANNEL(i) {
@ -787,8 +787,8 @@ static void program_dll(struct sysinfo *s)
reg32 |= 0x111 << r; reg32 |= 0x111 << r;
} }
MCHBAR32(0x400*i + 0x59c) = (MCHBAR32(0x400*i + 0x59c) & ~0xfff) | reg32; MCHBAR32_AND_OR(0x400*i + 0x59c, ~0xfff, reg32);
MCHBAR8(0x400*i + 0x594) = MCHBAR8(0x400*i + 0x594) & ~1; MCHBAR8_AND(0x400*i + 0x594, ~1);
if (s->spd_type == DDR2) { if (s->spd_type == DDR2) {
if (!CHANNEL_IS_POPULATED(s->dimms, i)) { if (!CHANNEL_IS_POPULATED(s->dimms, i)) {
@ -813,8 +813,8 @@ static void program_dll(struct sysinfo *s)
} else { } else {
die("Unhandled case\n"); die("Unhandled case\n");
} }
MCHBAR32(0x400*i + 0x5a0) = (MCHBAR32(0x400*i + 0x5a0) MCHBAR32_AND_OR(0x400*i + 0x5a0, ~0x3f000000,
& ~0x3f000000) | ((u32)(reg8 << 24)); (u32)(reg8 << 24));
} else { /* DDR3 */ } else { /* DDR3 */
FOR_EACH_POPULATED_RANK_IN_CHANNEL(s->dimms, i, r) { FOR_EACH_POPULATED_RANK_IN_CHANNEL(s->dimms, i, r) {
@ -828,25 +828,25 @@ static void program_dll(struct sysinfo *s)
} // END EACH CHANNEL } // END EACH CHANNEL
if (s->spd_type == DDR2) { if (s->spd_type == DDR2) {
MCHBAR8(0x1a8) = MCHBAR8(0x1a8) | 1; MCHBAR8_OR(0x1a8, 1);
MCHBAR8(0x1a8) = MCHBAR8(0x1a8) & ~0x4; MCHBAR8_AND(0x1a8, ~0x4);
} else { /* DDR3 */ } else { /* DDR3 */
MCHBAR8(0x1a8) = MCHBAR8(0x1a8) & ~1; MCHBAR8_AND(0x1a8, ~1);
MCHBAR8(0x1a8) = MCHBAR8(0x1a8) | 0x4; MCHBAR8_OR(0x1a8, 0x4);
} }
// Update DLL timing // Update DLL timing
MCHBAR8(0x1a4) = MCHBAR8(0x1a4) & ~0x80; MCHBAR8_AND(0x1a4, ~0x80);
MCHBAR8(0x1a4) = MCHBAR8(0x1a4) | 0x40; MCHBAR8_OR(0x1a4, 0x40);
MCHBAR16(0x5f0) = (MCHBAR16(0x5f0) & ~0x400) | 0x400; MCHBAR16_AND_OR(0x5f0, ~0x400, 0x400);
FOR_EACH_POPULATED_CHANNEL(s->dimms, i) { FOR_EACH_POPULATED_CHANNEL(s->dimms, i) {
MCHBAR16(0x400*i + 0x5f0) = (MCHBAR16(0x400*i + 0x5f0) & ~0x3fc) | 0x3fc; MCHBAR16_AND_OR(0x400*i + 0x5f0, ~0x3fc, 0x3fc);
MCHBAR32(0x400*i + 0x5fc) = MCHBAR32(0x400*i + 0x5fc) & ~0xcccccccc; MCHBAR32_AND(0x400*i + 0x5fc, ~0xcccccccc);
MCHBAR8(0x400*i + 0x5d9) = (MCHBAR8(0x400*i + 0x5d9) & ~0xf0) MCHBAR8_AND_OR(0x400*i + 0x5d9, ~0xf0,
| (s->spd_type == DDR2 ? 0x70 : 0x60); s->spd_type == DDR2 ? 0x70 : 0x60);
MCHBAR16(0x400*i + 0x590) = (MCHBAR16(0x400*i + 0x590) & ~0xffff) MCHBAR16_AND_OR(0x400*i + 0x590, ~0xffff,
| (s->spd_type == DDR2 ? 0x5555 : 0xa955); s->spd_type == DDR2 ? 0x5555 : 0xa955);
} }
FOR_EACH_POPULATED_CHANNEL(s->dimms, i) { FOR_EACH_POPULATED_CHANNEL(s->dimms, i) {
@ -881,12 +881,12 @@ static void program_dll(struct sysinfo *s)
} }
// XXX if not async mode // XXX if not async mode
MCHBAR16(0x180) = MCHBAR16(0x180) & ~0x8200; MCHBAR16_AND(0x180, ~0x8200);
MCHBAR8(0x180) = MCHBAR8(0x180) | 0x4; MCHBAR8_OR(0x180, 0x4);
j = 0; j = 0;
for (i = 0; i < 16; i++) { for (i = 0; i < 16; i++) {
MCHBAR8(0x1c8) = (MCHBAR8(0x1c8) & ~0x1f) | i; MCHBAR8_AND_OR(0x1c8, ~0x1f, i);
MCHBAR8(0x180) = MCHBAR8(0x180) | 0x10; MCHBAR8_OR(0x180, 0x10);
while (MCHBAR8(0x180) & 0x10) while (MCHBAR8(0x180) & 0x10)
; ;
if (MCHBAR32(0x184) == 0xffffffff) { if (MCHBAR32(0x184) == 0xffffffff) {
@ -906,8 +906,8 @@ static void program_dll(struct sysinfo *s)
j = 0; j = 0;
i++; i++;
for (; i < 16; i++) { for (; i < 16; i++) {
MCHBAR8(0x1c8) = (MCHBAR8(0x1c8) & ~0x1f) | i; MCHBAR8_AND_OR(0x1c8, ~0x1f, i);
MCHBAR8(0x180) = MCHBAR8(0x180) | 0x4; MCHBAR8_OR(0x180, 0x4);
while (MCHBAR8(0x180) & 0x10) while (MCHBAR8(0x180) & 0x10)
; ;
if (MCHBAR32(0x184) == 0) { if (MCHBAR32(0x184) == 0) {
@ -916,8 +916,8 @@ static void program_dll(struct sysinfo *s)
} }
} }
for (; i < 16; i++) { for (; i < 16; i++) {
MCHBAR8(0x1c8) = (MCHBAR8(0x1c8) & ~0x1f) | i; MCHBAR8_AND_OR(0x1c8, ~0x1f, i);
MCHBAR8(0x180) = MCHBAR8(0x180) | 0x10; MCHBAR8_OR(0x180, 0x10);
while (MCHBAR8(0x180) & 0x10) while (MCHBAR8(0x180) & 0x10)
; ;
if (MCHBAR32(0x184) == 0xffffffff) { if (MCHBAR32(0x184) == 0xffffffff) {
@ -929,8 +929,8 @@ static void program_dll(struct sysinfo *s)
} }
} }
if (j < 2) { if (j < 2) {
MCHBAR8(0x1c8) = MCHBAR8(0x1c8) & ~0x1f; MCHBAR8_AND(0x1c8, ~0x1f);
MCHBAR8(0x180) = MCHBAR8(0x180) | 0x10; MCHBAR8_OR(0x180, 0x10);
while (MCHBAR8(0x180) & 0x10) while (MCHBAR8(0x180) & 0x10)
; ;
j = 2; j = 2;
@ -938,7 +938,7 @@ static void program_dll(struct sysinfo *s)
} }
if (j < 2) { if (j < 2) {
MCHBAR8(0x1c8) = MCHBAR8(0x1c8) & ~0x1f; MCHBAR8_AND(0x1c8, ~0x1f);
async = 1; async = 1;
} }
@ -968,7 +968,7 @@ static void program_dll(struct sysinfo *s)
if (async != 1) if (async != 1)
reg8 = MCHBAR8(0x188) & 0x1e; reg8 = MCHBAR8(0x188) & 0x1e;
MCHBAR8(0x180) = MCHBAR8(0x180) & ~0x80; MCHBAR8_AND(0x180, ~0x80);
if ((s->spd_type == DDR3 && s->selected_timings.mem_clk == MEM_CLOCK_1066MHz) if ((s->spd_type == DDR3 && s->selected_timings.mem_clk == MEM_CLOCK_1066MHz)
|| (s->spd_type == DDR2 && s->selected_timings.fsb_clk == FSB_CLOCK_800MHz || (s->spd_type == DDR2 && s->selected_timings.fsb_clk == FSB_CLOCK_800MHz
@ -978,8 +978,8 @@ static void program_dll(struct sysinfo *s)
i = (i + 10) % 14; i = (i + 10) % 14;
else /* DDR3 */ else /* DDR3 */
i = (i + 3) % 12; i = (i + 3) % 12;
MCHBAR8(0x1c8) = (MCHBAR8(0x1c8) & ~0x1f) | i; MCHBAR8_AND_OR(0x1c8, ~0x1f, i);
MCHBAR8(0x180) = MCHBAR8(0x180) | 0x10; MCHBAR8_OR(0x180, 0x10);
while (MCHBAR8(0x180) & 0x10) while (MCHBAR8(0x180) & 0x10)
; ;
} }
@ -993,7 +993,7 @@ static void program_dll(struct sysinfo *s)
MCHBAR8(0x188) = reg8; MCHBAR8(0x188) = reg8;
if (s->selected_timings.mem_clk == MEM_CLOCK_1333MHz) if (s->selected_timings.mem_clk == MEM_CLOCK_1333MHz)
MCHBAR8(0x18c) = MCHBAR8(0x18c) | 1; MCHBAR8_OR(0x18c, 1);
} }
static void select_default_dq_dqs_settings(struct sysinfo *s) static void select_default_dq_dqs_settings(struct sysinfo *s)
@ -1145,8 +1145,8 @@ static void prog_rcomp(struct sysinfo *s)
MCHBAR32(0x400*i + addr[j]) = MCHBAR32(0x400*i + addr[j]) =
(MCHBAR32(0x400*i + addr[j]) & ~0xff000) (MCHBAR32(0x400*i + addr[j]) & ~0xff000)
| 0xaa000; | 0xaa000;
MCHBAR16(0x400*i + 0x320) = (MCHBAR16(0x400*i + 0x320) MCHBAR16_AND_OR(0x400*i + 0x320, ~0xffff,
& ~0xffff) | 0x6666; 0x6666);
for (k = 0; k < 8; k++) { for (k = 0; k < 8; k++) {
MCHBAR32(0x400*i + addr[j] + 0xe + (k << 2)) = MCHBAR32(0x400*i + addr[j] + 0xe + (k << 2)) =
(MCHBAR32(0x400*i + addr[j] + 0xe + (k << 2)) (MCHBAR32(0x400*i + addr[j] + 0xe + (k << 2))
@ -1196,23 +1196,23 @@ static void prog_rcomp(struct sysinfo *s)
MCHBAR8(0x400*i + addr[j]) = (MCHBAR8(0x400*i + addr[j]) & ~1) | bit[j]; MCHBAR8(0x400*i + addr[j]) = (MCHBAR8(0x400*i + addr[j]) & ~1) | bit[j];
} }
reg8 = (s->spd_type == DDR2) ? 0x12 : 0x36; reg8 = (s->spd_type == DDR2) ? 0x12 : 0x36;
MCHBAR8(0x400*i + 0x45a) = (MCHBAR8(0x400*i + 0x45a) & ~0x3f) | reg8; MCHBAR8_AND_OR(0x400*i + 0x45a, ~0x3f, reg8);
MCHBAR8(0x400*i + 0x45e) = (MCHBAR8(0x400*i + 0x45e) & ~0x3f) | reg8; MCHBAR8_AND_OR(0x400*i + 0x45e, ~0x3f, reg8);
MCHBAR8(0x400*i + 0x462) = (MCHBAR8(0x400*i + 0x462) & ~0x3f) | reg8; MCHBAR8_AND_OR(0x400*i + 0x462, ~0x3f, reg8);
MCHBAR8(0x400*i + 0x466) = (MCHBAR8(0x400*i + 0x466) & ~0x3f) | reg8; MCHBAR8_AND_OR(0x400*i + 0x466, ~0x3f, reg8);
} // END EACH POPULATED CHANNEL } // END EACH POPULATED CHANNEL
MCHBAR32(0x134) = (MCHBAR32(0x134) & ~0x63c00) | 0x63c00; MCHBAR32_AND_OR(0x134, ~0x63c00, 0x63c00);
MCHBAR16(0x174) = (MCHBAR16(0x174) & ~0x63ff) | 0x63ff; MCHBAR16_AND_OR(0x174, ~0x63ff, 0x63ff);
MCHBAR16(0x178) = 0x0135; MCHBAR16(0x178) = 0x0135;
MCHBAR32(0x130) = (MCHBAR32(0x130) & ~0x7bdffe0) | 0x7a9ffa0; MCHBAR32_AND_OR(0x130, ~0x7bdffe0, 0x7a9ffa0);
if (!CHANNEL_IS_POPULATED(s->dimms, 0)) if (!CHANNEL_IS_POPULATED(s->dimms, 0))
MCHBAR32(0x130) = MCHBAR32(0x130) & ~(1 << 27); MCHBAR32_AND(0x130, ~(1 << 27));
if (!CHANNEL_IS_POPULATED(s->dimms, 1)) if (!CHANNEL_IS_POPULATED(s->dimms, 1))
MCHBAR32(0x130) = MCHBAR32(0x130) & ~(1 << 28); MCHBAR32_AND(0x130, ~(1 << 28));
MCHBAR8(0x130) = MCHBAR8(0x130) | 1; MCHBAR8_OR(0x130, 1);
} }
static void program_odt(struct sysinfo *s) static void program_odt(struct sysinfo *s)
@ -1306,8 +1306,8 @@ static void pre_jedec_memory_map(void)
* by the SPD. * by the SPD.
*/ */
/* Set rank 0-3 populated */ /* Set rank 0-3 populated */
MCHBAR32(C0CKECTRL) = (MCHBAR32(C0CKECTRL) & ~1) | 0xf00000; MCHBAR32_AND_OR(C0CKECTRL, ~1, 0xf00000);
MCHBAR32(C1CKECTRL) = (MCHBAR32(C1CKECTRL) & ~1) | 0xf00000; MCHBAR32_AND_OR(C1CKECTRL, ~1, 0xf00000);
/* Set size of each rank to 128M */ /* Set size of each rank to 128M */
MCHBAR16(C0DRA01) = 0x0101; MCHBAR16(C0DRA01) = 0x0101;
MCHBAR16(C0DRA23) = 0x0101; MCHBAR16(C0DRA23) = 0x0101;
@ -1323,7 +1323,7 @@ static void pre_jedec_memory_map(void)
/* In stacked mode the last present rank on ch1 needs to have its /* In stacked mode the last present rank on ch1 needs to have its
size doubled in c1drbx */ size doubled in c1drbx */
MCHBAR16(C1DRB3) = 0x0010; MCHBAR16(C1DRB3) = 0x0010;
MCHBAR8(0x111) = MCHBAR8(0x111) | STACKED_MEM; MCHBAR8_OR(0x111, STACKED_MEM);
MCHBAR32(0x104) = 0; MCHBAR32(0x104) = 0;
MCHBAR16(0x102) = 0x400; MCHBAR16(0x102) = 0x400;
MCHBAR8(0x110) = (2 << 5) | (3 << 3); MCHBAR8(0x110) = (2 << 5) | (3 << 3);
@ -1371,8 +1371,8 @@ void send_jedec_cmd(const struct sysinfo *s, u8 r, u8 ch, u8 cmd, u32 val)
data8 = (u8)mirror_shift_bit(data8, 4); data8 = (u8)mirror_shift_bit(data8, 4);
} }
MCHBAR8(0x271) = (MCHBAR8(0x271) & ~0x3e) | data8; MCHBAR8_AND_OR(0x271, ~0x3e, data8);
MCHBAR8(0x671) = (MCHBAR8(0x671) & ~0x3e) | data8; MCHBAR8_AND_OR(0x671, ~0x3e, data8);
data32 = val; data32 = val;
if (s->spd_type == DDR3 && (r & 1) if (s->spd_type == DDR3 && (r & 1)
&& s->dimms[ch * 2 + (r >> 1)].mirrored) { && s->dimms[ch * 2 + (r >> 1)].mirrored) {
@ -1384,8 +1384,8 @@ void send_jedec_cmd(const struct sysinfo *s, u8 r, u8 ch, u8 cmd, u32 val)
rubbish = read32((void *)((data32 | addr))); rubbish = read32((void *)((data32 | addr)));
udelay(10); udelay(10);
MCHBAR8(0x271) = (MCHBAR8(0x271) & ~0x3e) | NORMALOP_CMD; MCHBAR8_AND_OR(0x271, ~0x3e, NORMALOP_CMD);
MCHBAR8(0x671) = (MCHBAR8(0x671) & ~0x3e) | NORMALOP_CMD; MCHBAR8_AND_OR(0x671, ~0x3e, NORMALOP_CMD);
} }
static void jedec_ddr2(struct sysinfo *s) static void jedec_ddr2(struct sysinfo *s)
@ -1611,23 +1611,22 @@ static void set_dradrb(struct sysinfo *s)
MCHBAR32(0x208) = c0dra; MCHBAR32(0x208) = c0dra;
MCHBAR32(0x608) = c1dra; MCHBAR32(0x608) = c1dra;
MCHBAR8(0x262) = (MCHBAR8(0x262) & ~0xf0) | ((rankpop0 << 4) & 0xf0); MCHBAR8_AND_OR(0x262, ~0xf0, (rankpop0 << 4) & 0xf0);
MCHBAR8(0x662) = (MCHBAR8(0x662) & ~0xf0) | ((rankpop1 << 4) & 0xf0); MCHBAR8_AND_OR(0x662, ~0xf0, (rankpop1 << 4) & 0xf0);
if (s->spd_type == DDR3) { if (s->spd_type == DDR3) {
FOR_EACH_POPULATED_CHANNEL(s->dimms, ch) { FOR_EACH_POPULATED_CHANNEL(s->dimms, ch) {
/* ZQCAL enable */ /* ZQCAL enable */
MCHBAR32(0x269 + 0x400 * ch) = MCHBAR32_OR(0x269 + 0x400 * ch, 1 << 26);
MCHBAR32(0x269 + 0x400 * ch) | (1 << 26);
} }
} }
if (ONLY_DIMMA_IS_POPULATED(s->dimms, 0) || if (ONLY_DIMMA_IS_POPULATED(s->dimms, 0) ||
ONLY_DIMMB_IS_POPULATED(s->dimms, 0)) ONLY_DIMMB_IS_POPULATED(s->dimms, 0))
MCHBAR8(0x260) = MCHBAR8(0x260) | 1; MCHBAR8_OR(0x260, 1);
if (ONLY_DIMMA_IS_POPULATED(s->dimms, 1) || if (ONLY_DIMMA_IS_POPULATED(s->dimms, 1) ||
ONLY_DIMMB_IS_POPULATED(s->dimms, 1)) ONLY_DIMMB_IS_POPULATED(s->dimms, 1))
MCHBAR8(0x660) = MCHBAR8(0x660) | 1; MCHBAR8_OR(0x660, 1);
// DRB // DRB
lastrank_ch1 = 0; lastrank_ch1 = 0;
@ -1671,10 +1670,10 @@ static void set_dradrb(struct sysinfo *s)
size_me = ME_UMA_SIZEMB; size_me = ME_UMA_SIZEMB;
if (s->stacked_mode) { if (s->stacked_mode) {
MCHBAR8(0x111) = MCHBAR8(0x111) | STACKED_MEM; MCHBAR8_OR(0x111, STACKED_MEM);
} else { } else {
MCHBAR8(0x111) = MCHBAR8(0x111) & ~STACKED_MEM; MCHBAR8_AND(0x111, ~STACKED_MEM);
MCHBAR8(0x111) = MCHBAR8(0x111) | (1 << 4); MCHBAR8_OR(0x111, 1 << 4);
} }
if (s->stacked_mode) { if (s->stacked_mode) {
@ -1690,7 +1689,7 @@ static void set_dradrb(struct sysinfo *s)
/* Set ME UMA size in MiB */ /* Set ME UMA size in MiB */
MCHBAR16(0x100) = size_me; MCHBAR16(0x100) = size_me;
/* Set ME UMA Present bit */ /* Set ME UMA Present bit */
MCHBAR32(0x111) = MCHBAR32(0x111) | 1; MCHBAR32_OR(0x111, 1);
} }
dual_channel_size = MIN(size_ch0 - size_me, size_ch1) * 2; dual_channel_size = MIN(size_ch0 - size_me, size_ch1) * 2;
} }
@ -1822,21 +1821,21 @@ static void set_enhanced_mode(struct sysinfo *s)
MCHBAR32(0xfbc) = 0xf; MCHBAR32(0xfbc) = 0xf;
MCHBAR32(0xfc4) = 0xfe22244; MCHBAR32(0xfc4) = 0xfe22244;
MCHBAR8(0x12f) = 0x5c; MCHBAR8(0x12f) = 0x5c;
MCHBAR8(0xfb0) = (MCHBAR8(0xfb0) & ~1) | 1; MCHBAR8_OR(0xfb0, 1);
if (s->selected_timings.mem_clk <= MEM_CLOCK_800MHz) if (s->selected_timings.mem_clk <= MEM_CLOCK_800MHz)
MCHBAR8(0x12f) = MCHBAR8(0x12f) | 0x2; MCHBAR8_OR(0x12f, 0x2);
else else
MCHBAR8(0x12f) = MCHBAR8(0x12f) & ~0x2; MCHBAR8_AND(0x12f, ~0x2);
MCHBAR8(0x6c0) = (MCHBAR8(0x6c0) & ~0xf0) | 0xa0; MCHBAR8_AND_OR(0x6c0, ~0xf0, 0xa0);
MCHBAR32(0xfa8) = 0x30d400; MCHBAR32(0xfa8) = 0x30d400;
FOR_EACH_POPULATED_CHANNEL(s->dimms, ch) { FOR_EACH_POPULATED_CHANNEL(s->dimms, ch) {
MCHBAR8(0x400*ch + 0x26c) = MCHBAR8(0x400*ch + 0x26c) | 1; MCHBAR8_OR(0x400*ch + 0x26c, 1);
MCHBAR32(0x400*ch + 0x278) = 0x88141881; MCHBAR32(0x400*ch + 0x278) = 0x88141881;
MCHBAR16(0x400*ch + 0x27c) = 0x0041; MCHBAR16(0x400*ch + 0x27c) = 0x0041;
MCHBAR8(0x400*ch + 0x292) = 0xf2; MCHBAR8(0x400*ch + 0x292) = 0xf2;
MCHBAR16(0x400*ch + 0x272) = MCHBAR16(0x400*ch + 0x272) | 0x100; MCHBAR16_OR(0x400*ch + 0x272, 0x100);
MCHBAR8(0x400*ch + 0x243) = (MCHBAR8(0x400*ch + 0x243) & ~0x2) | 1; MCHBAR8_AND_OR(0x400*ch + 0x243, ~0x2, 1);
MCHBAR32(0x400*ch + 0x288) = 0x8040200; MCHBAR32(0x400*ch + 0x288) = 0x8040200;
MCHBAR32(0x400*ch + 0x28c) = 0xff402010; MCHBAR32(0x400*ch + 0x28c) = 0xff402010;
MCHBAR32(0x400*ch + 0x290) = 0x4f2091c; MCHBAR32(0x400*ch + 0x290) = 0x4f2091c;
@ -1855,7 +1854,7 @@ static void set_enhanced_mode(struct sysinfo *s)
} else if (s->selected_timings.fsb_clk == FSB_CLOCK_1066MHz) { } else if (s->selected_timings.fsb_clk == FSB_CLOCK_1066MHz) {
reg32 &= ~0x10000; reg32 &= ~0x10000;
} }
MCHBAR32(0xfa4) = (MCHBAR32(0xfa4) & ~0x219100c3) | reg32; MCHBAR32_AND_OR(0xfa4, ~0x219100c3, reg32);
reg32 = 0x44a00; reg32 = 0x44a00;
switch (s->selected_timings.fsb_clk) { switch (s->selected_timings.fsb_clk) {
case FSB_CLOCK_1333MHz: case FSB_CLOCK_1333MHz:
@ -1881,7 +1880,7 @@ static void set_enhanced_mode(struct sysinfo *s)
reg32 = 0x8f038000; reg32 = 0x8f038000;
if (s->selected_timings.fsb_clk == FSB_CLOCK_1333MHz) if (s->selected_timings.fsb_clk == FSB_CLOCK_1333MHz)
reg32 &= ~0x4000000; reg32 &= ~0x4000000;
MCHBAR32(0x40) = (MCHBAR32(0x40) & ~0x8f038000) | reg32; MCHBAR32_AND_OR(0x40, ~0x8f038000, reg32);
reg32 = 0x00013001; reg32 = 0x00013001;
if (s->selected_timings.fsb_clk < FSB_CLOCK_1333MHz) if (s->selected_timings.fsb_clk < FSB_CLOCK_1333MHz)
reg32 |= 0x20000; reg32 |= 0x20000;
@ -1954,47 +1953,50 @@ static void power_settings(struct sysinfo *s)
MCHBAR32(0x14) = 0x0010691f; MCHBAR32(0x14) = 0x0010691f;
MCHBAR32(0x18) = 0xdf6437f7; MCHBAR32(0x18) = 0xdf6437f7;
MCHBAR32(0x1c) = 0x0; MCHBAR32(0x1c) = 0x0;
MCHBAR32(0x24) = (MCHBAR32(0x24) & ~0xe0000000) | 0x60000000; MCHBAR32_AND_OR(0x24, ~0xe0000000, 0x60000000);
MCHBAR32(0x44) = (MCHBAR32(0x44) & ~0x1fef0000) | 0x6b0000; MCHBAR32_AND_OR(0x44, ~0x1fef0000, 0x6b0000);
MCHBAR16(0x115) = (u16) reg1; MCHBAR16(0x115) = (u16) reg1;
MCHBAR32(0x117) = (MCHBAR32(0x117) & ~0xffffff) | reg2; MCHBAR32_AND_OR(0x117, ~0xffffff, reg2);
MCHBAR8(0x124) = 0x7; MCHBAR8(0x124) = 0x7;
MCHBAR16(0x12a) = (MCHBAR16(0x12a) & 0) | 0x80; // not sure if dummy reads are needed
MCHBAR8(0x12c) = (MCHBAR8(0x12c) & 0) | 0xa0; MCHBAR16_AND_OR(0x12a, 0, 0x80);
MCHBAR16(0x174) = MCHBAR16(0x174) & ~(1 << 15); MCHBAR8_AND_OR(0x12c, 0, 0xa0);
MCHBAR16(0x188) = (MCHBAR16(0x188) & ~0x1f00) | 0x1f00; MCHBAR16_AND(0x174, ~(1 << 15));
MCHBAR8(0x18c) = MCHBAR8(0x18c) & ~0x8; MCHBAR16_AND_OR(0x188, ~0x1f00, 0x1f00);
MCHBAR8(0x192) = (MCHBAR8(0x192) & ~1) | 1; MCHBAR8_AND(0x18c, ~0x8);
MCHBAR8(0x193) = (MCHBAR8(0x193) & ~0xf) | 0xf; MCHBAR8_OR(0x192, 1);
MCHBAR16(0x1b4) = (MCHBAR16(0x1b4) & ~0x480) | 0x80; MCHBAR8_OR(0x193, 0xf);
MCHBAR16(0x210) = (MCHBAR16(0x210) & ~0x1fff) | 0x3f; // | clockgatingiii MCHBAR16_AND_OR(0x1b4, ~0x480, 0x80);
MCHBAR32(0x6d1) = (MCHBAR32(0x6d1) & ~0xff03ff) | 0x100 | clkgate; MCHBAR16_AND_OR(0x210, ~0x1fff, 0x3f); // | clockgatingiii
MCHBAR8(0x212) = (MCHBAR8(0x212) & ~0x7f) | 0x7f; // non-aligned access: possible bug?
MCHBAR32(0x2c0) = (MCHBAR32(0x2c0) & ~0xffff0) | 0xcc5f0; MCHBAR32_AND_OR(0x6d1, ~0xff03ff, 0x100 | clkgate);
MCHBAR8(0x2c4) = (MCHBAR8(0x2c4) & ~0x70) | 0x70; MCHBAR8_AND_OR(0x212, ~0x7f, 0x7f);
MCHBAR32(0x2d1) = (MCHBAR32(0x2d1) & ~0xffffff) | 0xff2831; // | clockgatingi MCHBAR32_AND_OR(0x2c0, ~0xffff0, 0xcc5f0);
MCHBAR8_AND_OR(0x2c4, ~0x70, 0x70);
// non-aligned access: possible bug?
MCHBAR32_AND_OR(0x2d1, ~0xffffff, 0xff2831); // | clockgatingi
MCHBAR32(0x2d4) = 0x40453600; MCHBAR32(0x2d4) = 0x40453600;
MCHBAR32(0x300) = 0xc0b0a08; MCHBAR32(0x300) = 0xc0b0a08;
MCHBAR32(0x304) = 0x6040201; MCHBAR32(0x304) = 0x6040201;
MCHBAR32(0x30c) = (MCHBAR32(0x30c) & ~0x43c0f) | 0x41405; MCHBAR32_AND_OR(0x30c, ~0x43c0f, 0x41405);
MCHBAR16(0x610) = reg3; MCHBAR16(0x610) = reg3;
MCHBAR16(0x612) = reg4; MCHBAR16(0x612) = reg4;
MCHBAR32(0x62c) = (MCHBAR32(0x62c) & ~0xc000000) | 0x4000000; MCHBAR32_AND_OR(0x62c, ~0xc000000, 0x4000000);
MCHBAR32(0xae4) = 0; MCHBAR32(0xae4) = 0;
MCHBAR32(0xc00) = (MCHBAR32(0xc00) & ~0xf0000) | 0x10000; MCHBAR32_AND_OR(0xc00, ~0xf0000, 0x10000);
MCHBAR32(0xf00) = 0x393a3b3c; MCHBAR32(0xf00) = 0x393a3b3c;
MCHBAR32(0xf04) = 0x3d3e3f40; MCHBAR32(0xf04) = 0x3d3e3f40;
MCHBAR32(0xf08) = 0x393a3b3c; MCHBAR32(0xf08) = 0x393a3b3c;
MCHBAR32(0xf0c) = 0x3d3e3f40; MCHBAR32(0xf0c) = 0x3d3e3f40;
MCHBAR32(0xf18) = MCHBAR32(0xf18) & ~0xfff00001; MCHBAR32_AND(0xf18, ~0xfff00001);
MCHBAR32(0xf48) = 0xfff0ffe0; MCHBAR32(0xf48) = 0xfff0ffe0;
MCHBAR32(0xf4c) = 0xffc0ff00; MCHBAR32(0xf4c) = 0xffc0ff00;
MCHBAR32(0xf50) = 0xfc00f000; MCHBAR32(0xf50) = 0xfc00f000;
MCHBAR32(0xf54) = 0xc0008000; MCHBAR32(0xf54) = 0xc0008000;
MCHBAR32(0xf6c) = (MCHBAR32(0xf6c) & ~0xffff0000) | 0xffff0000; MCHBAR32_AND_OR(0xf6c, ~0xffff0000, 0xffff0000);
MCHBAR32(0xfac) = MCHBAR32(0xfac) & ~0x80000000; MCHBAR32_AND(0xfac, ~0x80000000);
MCHBAR32(0xfb8) = MCHBAR32(0xfb8) & ~0xff000000; MCHBAR32_AND(0xfb8, ~0xff000000);
MCHBAR32(0xfbc) = (MCHBAR32(0xfbc) & ~0x7f800) | 0xf000; MCHBAR32_AND_OR(0xfbc, ~0x7f800, 0xf000);
MCHBAR32(0x1104) = 0x3003232; MCHBAR32(0x1104) = 0x3003232;
MCHBAR32(0x1108) = 0x74; MCHBAR32(0x1108) = 0x74;
if (s->selected_timings.fsb_clk == FSB_CLOCK_800MHz) if (s->selected_timings.fsb_clk == FSB_CLOCK_800MHz)
@ -2010,31 +2012,31 @@ static void power_settings(struct sysinfo *s)
FOR_EACH_POPULATED_CHANNEL(s->dimms, ch) { FOR_EACH_POPULATED_CHANNEL(s->dimms, ch) {
MCHBAR8(0x400*ch + 0x239) = twl + 15; MCHBAR8(0x400*ch + 0x239) = twl + 15;
MCHBAR16(0x400*ch + 0x23c) = x23c; MCHBAR16(0x400*ch + 0x23c) = x23c;
MCHBAR32(0x400*ch + 0x248) = (MCHBAR32(0x400*ch + 0x248) & ~0x706033) | 0x406033; MCHBAR32_AND_OR(0x400*ch + 0x248, ~0x706033, 0x406033);
MCHBAR32(0x400*ch + 0x260) = (MCHBAR32(0x400*ch + 0x260) & ~(1 << 16)) | (1 << 16); MCHBAR32_AND_OR(0x400*ch + 0x260, ~(1 << 16), 1 << 16);
MCHBAR8(0x400*ch + 0x264) = x264; MCHBAR8(0x400*ch + 0x264) = x264;
MCHBAR8(0x400*ch + 0x592) = (MCHBAR8(0x400*ch + 0x592) & ~0x3f) | (0x3c & x592); MCHBAR8_AND_OR(0x400*ch + 0x592, ~0x3f, 0x3c & x592);
MCHBAR8(0x400*ch + 0x593) = (MCHBAR8(0x400*ch + 0x593) & ~0x1f) | 0x1e; MCHBAR8_AND_OR(0x400*ch + 0x593, ~0x1f, 0x1e);
} }
for (lane = 0; lane < 8; lane++) for (lane = 0; lane < 8; lane++)
MCHBAR8(0x561 + (lane << 2)) = MCHBAR8(0x561 + (lane << 2)) & ~(1 << 3); MCHBAR8_AND(0x561 + (lane << 2), ~(1 << 3));
} }
static void software_ddr3_reset(struct sysinfo *s) static void software_ddr3_reset(struct sysinfo *s)
{ {
printk(BIOS_DEBUG, "Software initiated DDR3 reset.\n"); printk(BIOS_DEBUG, "Software initiated DDR3 reset.\n");
MCHBAR8(0x1a8) = MCHBAR8(0x1a8) | 0x02; MCHBAR8_OR(0x1a8, 0x02);
MCHBAR8(0x5da) = MCHBAR8(0x5da) & ~0x80; MCHBAR8_AND(0x5da, ~0x80);
MCHBAR8(0x1a8) = MCHBAR8(0x1a8) & ~0x02; MCHBAR8_AND(0x1a8, ~0x02);
MCHBAR8(0x5da) = (MCHBAR8(0x5da) & ~0x03) | 1; MCHBAR8_AND_OR(0x5da, ~0x03, 1);
udelay(200); udelay(200);
MCHBAR8(0x1a8) = MCHBAR8(0x1a8) & ~0x02; MCHBAR8_AND(0x1a8, ~0x02);
MCHBAR8(0x5da) = MCHBAR8(0x5da) | 0x80; MCHBAR8_OR(0x5da, 0x80);
MCHBAR8(0x5da) = MCHBAR8(0x5da) & ~0x80; MCHBAR8_AND(0x5da, ~0x80);
udelay(500); udelay(500);
MCHBAR8(0x5da) = MCHBAR8(0x5da) | 0x03; MCHBAR8_OR(0x5da, 0x03);
MCHBAR8(0x5da) = MCHBAR8(0x5da) & ~0x03; MCHBAR8_AND(0x5da, ~0x03);
/* After write leveling the dram needs to be reset and reinitialised */ /* After write leveling the dram needs to be reset and reinitialised */
jedec_ddr3(s); jedec_ddr3(s);
} }
@ -2051,17 +2053,17 @@ void do_raminit(struct sysinfo *s, int fast_boot)
| PMSTS_BOTH_SELFREFRESH; | PMSTS_BOTH_SELFREFRESH;
// Clear host clk gate reg // Clear host clk gate reg
MCHBAR32(0x1c) = MCHBAR32(0x1c) | 0xffffffff; MCHBAR32_OR(0x1c, 0xffffffff);
// Select type // Select type
if (s->spd_type == DDR2) if (s->spd_type == DDR2)
MCHBAR8(0x1a8) = MCHBAR8(0x1a8) & ~0x4; MCHBAR8_AND(0x1a8, ~0x4);
else else
MCHBAR8(0x1a8) = MCHBAR8(0x1a8) | 0x4; MCHBAR8_OR(0x1a8, 0x4);
// Set freq // Set freq
MCHBAR32(0xc00) = (MCHBAR32(0xc00) & ~0x70) | MCHBAR32_AND_OR(0xc00, ~0x70,
(s->selected_timings.mem_clk << 4) | (1 << 10); (s->selected_timings.mem_clk << 4) | (1 << 10));
// Overwrite freq if chipset rejects it // Overwrite freq if chipset rejects it
s->selected_timings.mem_clk = (MCHBAR8(0xc00) & 0x70) >> 4; s->selected_timings.mem_clk = (MCHBAR8(0xc00) & 0x70) >> 4;
@ -2104,7 +2106,7 @@ void do_raminit(struct sysinfo *s, int fast_boot)
// RCOMP update // RCOMP update
if (s->boot_path != BOOT_PATH_WARM_RESET) { if (s->boot_path != BOOT_PATH_WARM_RESET) {
while ((MCHBAR8(0x130) & 1) != 0) while (MCHBAR8(0x130) & 1)
; ;
printk(BIOS_DEBUG, "Done RCOMP update\n"); printk(BIOS_DEBUG, "Done RCOMP update\n");
} }
@ -2113,36 +2115,36 @@ void do_raminit(struct sysinfo *s, int fast_boot)
// IOBUFACT // IOBUFACT
if (CHANNEL_IS_POPULATED(s->dimms, 0)) { if (CHANNEL_IS_POPULATED(s->dimms, 0)) {
MCHBAR8(0x5dd) = (MCHBAR8(0x5dd) & ~0x3f) | 0x3f; MCHBAR8_AND_OR(0x5dd, ~0x3f, 0x3f);
MCHBAR8(0x5d8) = MCHBAR8(0x5d8) | 0x7; MCHBAR8_OR(0x5d8, 0x7);
} }
if (CHANNEL_IS_POPULATED(s->dimms, 1)) { if (CHANNEL_IS_POPULATED(s->dimms, 1)) {
if (pci_read_config8(PCI_DEV(0, 0, 0), 0x8) < 2) { if (pci_read_config8(PCI_DEV(0, 0, 0), 0x8) < 2) {
MCHBAR8(0x5dd) = (MCHBAR8(0x5dd) & ~0x3f) | 0x3f; MCHBAR8_AND_OR(0x5dd, ~0x3f, 0x3f);
MCHBAR8(0x5d8) = MCHBAR8(0x5d8) | 1; MCHBAR8_OR(0x5d8, 1);
} }
MCHBAR8(0x9dd) = (MCHBAR8(0x9dd) & ~0x3f) | 0x3f; MCHBAR8_OR(0x9dd, 0x3f);
MCHBAR8(0x9d8) = MCHBAR8(0x9d8) | 0x7; MCHBAR8_OR(0x9d8, 0x7);
} }
/* DDR3 reset */ /* DDR3 reset */
if ((s->spd_type == DDR3) && (s->boot_path != BOOT_PATH_RESUME)) { if ((s->spd_type == DDR3) && (s->boot_path != BOOT_PATH_RESUME)) {
printk(BIOS_DEBUG, "DDR3 Reset.\n"); printk(BIOS_DEBUG, "DDR3 Reset.\n");
MCHBAR8(0x1a8) = MCHBAR8(0x1a8) & ~0x2; MCHBAR8_AND(0x1a8, ~0x2);
MCHBAR8(0x5da) = MCHBAR8(0x5da) | 0x80; MCHBAR8_OR(0x5da, 0x80);
udelay(500); udelay(500);
MCHBAR8(0x1a8) = MCHBAR8(0x1a8) & ~0x2; MCHBAR8_AND(0x1a8, ~0x2);
MCHBAR8(0x5da) = MCHBAR8(0x5da) & ~0x80; MCHBAR8_AND(0x5da, ~0x80);
udelay(500); udelay(500);
} }
// Pre jedec // Pre jedec
MCHBAR8(0x40) = MCHBAR8(0x40) | 0x2; MCHBAR8_OR(0x40, 0x2);
FOR_EACH_POPULATED_CHANNEL(s->dimms, ch) { FOR_EACH_POPULATED_CHANNEL(s->dimms, ch) {
MCHBAR32(0x400*ch + 0x260) = MCHBAR32(0x400*ch + 0x260) | (1 << 27); MCHBAR32_OR(0x400*ch + 0x260, 1 << 27);
} }
MCHBAR16(0x212) = (MCHBAR16(0x212) & ~0xf000) | 0xf000; MCHBAR16_OR(0x212, 0xf000);
MCHBAR16(0x212) = (MCHBAR16(0x212) & ~0xf00) | 0xf00; MCHBAR16_OR(0x212, 0xf00);
printk(BIOS_DEBUG, "Done pre-jedec\n"); printk(BIOS_DEBUG, "Done pre-jedec\n");
// JEDEC reset // JEDEC reset
@ -2163,7 +2165,7 @@ void do_raminit(struct sysinfo *s, int fast_boot)
} }
// After JEDEC reset // After JEDEC reset
MCHBAR8(0x40) = MCHBAR8(0x40) & ~0x2; MCHBAR8_AND(0x40, ~0x2);
FOR_EACH_POPULATED_CHANNEL(s->dimms, ch) { FOR_EACH_POPULATED_CHANNEL(s->dimms, ch) {
reg32 = (2 << 18); reg32 = (2 << 18);
reg32 |= post_jedec_tab[s->selected_timings.fsb_clk] reg32 |= post_jedec_tab[s->selected_timings.fsb_clk]
@ -2180,23 +2182,23 @@ void do_raminit(struct sysinfo *s, int fast_boot)
[s->selected_timings.mem_clk - MEM_CLOCK_667MHz][1] [s->selected_timings.mem_clk - MEM_CLOCK_667MHz][1]
<< 8; << 8;
} }
MCHBAR32(0x400*ch + 0x274) = (MCHBAR32(0x400*ch + 0x274) & ~0xfff00) | reg32; MCHBAR32_AND_OR(0x400*ch + 0x274, ~0xfff00, reg32);
MCHBAR8(0x400*ch + 0x274) = MCHBAR8(0x400*ch + 0x274) & ~0x80; MCHBAR8_AND(0x400*ch + 0x274, ~0x80);
MCHBAR8(0x400*ch + 0x26c) = MCHBAR8(0x400*ch + 0x26c) | 1; MCHBAR8_OR(0x400*ch + 0x26c, 1);
MCHBAR32(0x400*ch + 0x278) = 0x88141881; MCHBAR32(0x400*ch + 0x278) = 0x88141881;
MCHBAR16(0x400*ch + 0x27c) = 0x41; MCHBAR16(0x400*ch + 0x27c) = 0x41;
MCHBAR8(0x400*ch + 0x292) = 0xf2; MCHBAR8(0x400*ch + 0x292) = 0xf2;
MCHBAR8(0x400*ch + 0x271) = (MCHBAR8(0x400*ch + 0x271) & ~0xe) | 0xe; MCHBAR8_OR(0x400*ch + 0x271, 0xe);
} }
MCHBAR8(0x2c4) = MCHBAR8(0x2c4) | 0x8; MCHBAR8_OR(0x2c4, 0x8);
MCHBAR8(0x2c3) = MCHBAR8(0x2c3) | 0x40; MCHBAR8_OR(0x2c3, 0x40);
MCHBAR8(0x2c4) = MCHBAR8(0x2c4) | 0x4; MCHBAR8_OR(0x2c4, 0x4);
printk(BIOS_DEBUG, "Done post-jedec\n"); printk(BIOS_DEBUG, "Done post-jedec\n");
// Set DDR init complete // Set DDR init complete
FOR_EACH_POPULATED_CHANNEL(s->dimms, ch) { FOR_EACH_POPULATED_CHANNEL(s->dimms, ch) {
MCHBAR32(0x400*ch + 0x268) = (MCHBAR32(0x400*ch + 0x268) & ~0xc0000000) | 0xc0000000; MCHBAR32_OR(0x400*ch + 0x268, 0xc0000000);
} }
// Receive enable // Receive enable
@ -2205,14 +2207,14 @@ void do_raminit(struct sysinfo *s, int fast_boot)
// Finish rcven // Finish rcven
FOR_EACH_CHANNEL(ch) { FOR_EACH_CHANNEL(ch) {
MCHBAR8(0x400*ch + 0x5d8) = MCHBAR8(0x400*ch + 0x5d8) & ~0xe; MCHBAR8_AND(0x400*ch + 0x5d8, ~0xe);
MCHBAR8(0x400*ch + 0x5d8) = MCHBAR8(0x400*ch + 0x5d8) | 0x2; MCHBAR8_OR(0x400*ch + 0x5d8, 0x2);
MCHBAR8(0x400*ch + 0x5d8) = MCHBAR8(0x400*ch + 0x5d8) | 0x4; MCHBAR8_OR(0x400*ch + 0x5d8, 0x4);
MCHBAR8(0x400*ch + 0x5d8) = MCHBAR8(0x400*ch + 0x5d8) | 0x8; MCHBAR8_OR(0x400*ch + 0x5d8, 0x8);
} }
MCHBAR8(0x5dc) = MCHBAR8(0x5dc) | 0x80; MCHBAR8_OR(0x5dc, 0x80);
MCHBAR8(0x5dc) = MCHBAR8(0x5dc) & ~0x80; MCHBAR8_AND(0x5dc, ~0x80);
MCHBAR8(0x5dc) = MCHBAR8(0x5dc) | 0x80; MCHBAR8_OR(0x5dc, 0x80);
// Dummy writes / reads // Dummy writes / reads
if (s->boot_path == BOOT_PATH_NORMAL) { if (s->boot_path == BOOT_PATH_NORMAL) {
@ -2260,9 +2262,9 @@ void do_raminit(struct sysinfo *s, int fast_boot)
printk(BIOS_DEBUG, "Done enhanced mode\n"); printk(BIOS_DEBUG, "Done enhanced mode\n");
// Periodic RCOMP // Periodic RCOMP
MCHBAR16(0x160) = (MCHBAR16(0x160) & ~0xfff) | 0x999; MCHBAR16_AND_OR(0x160, ~0xfff, 0x999);
MCHBAR16(0x1b4) = MCHBAR16(0x1b4) | 0x3000; MCHBAR16_OR(0x1b4, 0x3000);
MCHBAR8(0x130) = MCHBAR8(0x130) | 0x82; MCHBAR8_OR(0x130, 0x82);
printk(BIOS_DEBUG, "Done PRCOMP\n"); printk(BIOS_DEBUG, "Done PRCOMP\n");
// Power settings // Power settings
@ -2277,11 +2279,11 @@ void do_raminit(struct sysinfo *s, int fast_boot)
if (ME_UMA_SIZEMB != 0) { if (ME_UMA_SIZEMB != 0) {
if (RANK_IS_POPULATED(s->dimms, 0, 0) if (RANK_IS_POPULATED(s->dimms, 0, 0)
|| RANK_IS_POPULATED(s->dimms, 1, 0)) || RANK_IS_POPULATED(s->dimms, 1, 0))
MCHBAR8(0xa2f) = MCHBAR8(0xa2f) | (1 << 0); MCHBAR8_OR(0xa2f, 1 << 0);
if (RANK_IS_POPULATED(s->dimms, 0, 1) if (RANK_IS_POPULATED(s->dimms, 0, 1)
|| RANK_IS_POPULATED(s->dimms, 1, 1)) || RANK_IS_POPULATED(s->dimms, 1, 1))
MCHBAR8(0xa2f) = MCHBAR8(0xa2f) | (1 << 1); MCHBAR8_OR(0xa2f, 1 << 1);
MCHBAR32(0xa30) = MCHBAR32(0xa30) | (1 << 26); MCHBAR32_OR(0xa30, 1 << 26);
} }
printk(BIOS_DEBUG, "Done raminit\n"); printk(BIOS_DEBUG, "Done raminit\n");