blob: 7d39c68582b7261b8e38c8f7db7efaf169cc3b5c [file] [log] [blame]
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2009 One Laptop per Child, Association, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
static const u8 RefreshCounter[7][2] = {
//Non_256Mbit, 256Mbit
{0xCA, 0xA8}, // DRAM400
{0xCA, 0xA8}, // DRAM333
{0xCA, 0x86}, // DRAM266
{0xCA, 0x65}, // DRAM200
{0xA8, 0x54}, // DRAM166
{0x86, 0x43}, // DRAM133
{0x65, 0x32} // DRAM100
};
void DRAMRefreshCounter(DRAM_SYS_ATTR * DramAttr)
{
u8 Data;
u8 Freq = 5, i, Dram_256_Mb;
if (DramAttr->DramFreq == DIMMFREQ_800)
Freq = 0;
else if (DramAttr->DramFreq == DIMMFREQ_667)
Freq = 1;
else if (DramAttr->DramFreq == DIMMFREQ_533)
Freq = 2;
else if (DramAttr->DramFreq == DIMMFREQ_400)
Freq = 3;
else if (DramAttr->DramFreq == DIMMFREQ_333)
Freq = 4;
else if (DramAttr->DramFreq == DIMMFREQ_266)
Freq = 5;
else if (DramAttr->DramFreq == DIMMFREQ_200)
Freq = 6;
else
Freq = 6;
Dram_256_Mb = 0;
for (i = 0; i < MAX_SOCKETS; i++) {
if (DramAttr->DimmInfo[i].SPDDataBuf[SPD_SDRAM_ROW_ADDR] == 13) {
Dram_256_Mb = 1;
break;
}
}
Data = RefreshCounter[Freq][Dram_256_Mb];
pci_write_config8(MEMCTRL, 0x6a, Data);
}
/*===================================================================
Function : DRAMRegFinalValue()
Precondition :
Input :
DramAttr: pointer point to DRAM_SYS_ATTR which consist the DDR and Dimm information
in MotherBoard
Output : Void
Purpose : Chipset Performance UP and other setting after DRAM Sizing
Turn on register directly to promote performance
===================================================================*/
//--------------------------------------------------------------------------
// register AND OR
//--------------------------------------------------------------------------
#define DRAM_table_item 9
static const u8 DRAM_table[DRAM_table_item][3] = {
{0x60, 0xff, 0xD0},
{0x66, 0xcf, 0x80}, // DRAMC queue > 2
{0x69, 0xff, 0x07}, // Enable multiple page
{0x95, 0x00, 0x0D},
{0x96, 0x0F, 0xA0},
{0xFB, 0x00, 0x3E},
{0xFD, 0x00, 0xA9},
{0xFE, 0x00, 0x0f},
{0xFF, 0x00, 0x3D}
};
#define PM_table_item 5
static const u8 PM_table[PM_table_item][3] = {
{0xA0, 0x0F, 0xF0},
{0xA1, 0x1F, 0xE0},
{0xA2, 0x00, 0xFE},
{0xA3, 0x7F, 0x80},
{0xA5, 0x7E, 0x81},
};
void DRAMRegFinalValue(DRAM_SYS_ATTR * DramAttr)
{
u8 Data;
u8 i;
for (i = 0; i < DRAM_table_item; i++) {
Data = pci_read_config8(MEMCTRL, DRAM_table[i][0]);
Data = (u8) ((Data & DRAM_table[i][1]) | DRAM_table[i][2]);
pci_write_config8(MEMCTRL, DRAM_table[i][0], Data);
}
//enable dram By-Rank self refresh
Data = pci_read_config8(MEMCTRL, 0x96);
Data &= 0xF0;
for (i = 0x01; i < 0x10; i = i << 1) {
if ((DramAttr->RankPresentMap & i) != 0x00)
Data |= i;
}
pci_write_config8(MEMCTRL, 0x96, Data);
for (i = 0; i < PM_table_item; i++) {
Data = pci_read_config8(PCI_DEV(0, 0, 4), PM_table[i][0]);
Data = (u8) ((Data & PM_table[i][1]) | PM_table[i][2]);
pci_write_config8(PCI_DEV(0, 0, 4), PM_table[i][0], Data);
}
}