memory size in cf07

goodrich pll code
disable havedmi


git-svn-id: svn://svn.coreboot.org/coreboot/trunk@2303 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
Ronald G. Minnich 2006-05-12 18:42:34 +00:00
parent 437f28ece9
commit 6084160f2d
3 changed files with 145 additions and 2 deletions

View File

@ -94,6 +94,10 @@ static void sdram_set_spd_registers(const struct mem_controller *ctrl)
print_debug_hex32(msr.hi); print_debug_hex32(msr.hi);
print_debug("\r\n"); print_debug("\r\n");
/* for OLPC, set default size */
/* dimm size - hardcoded 128Mb */
// msr.hi &= ~(0xf << CF07_UPPER_D0_SZ_SHIFT);
// msr.hi |= (5 << CF07_UPPER_D0_SZ_SHIFT);
/* this is a standard value, DOES NOT PROBABLY MATCH FROM ABOVE */ /* this is a standard value, DOES NOT PROBABLY MATCH FROM ABOVE */
/* well, it may be close. It's about 200,000 ticks */ /* well, it may be close. It's about 200,000 ticks */

View File

@ -102,8 +102,8 @@ struct msrinit GeodeLinkPriorityTable [] = {
{0x0FFFFFFFF, {0x0FFFFFFFF, 0x0FFFFFFFF}}, /* END*/ {0x0FFFFFFFF, {0x0FFFFFFFF, 0x0FFFFFFFF}}, /* END*/
}; };
/* do we have dmi or not? assume yes */ /* do we have dmi or not? assume NO per AMD */
int havedmi = 1; int havedmi = 0;
static void static void
writeglmsr(struct gliutable *gl){ writeglmsr(struct gliutable *gl){

View File

@ -110,6 +110,144 @@ static unsigned int get_memory_speed(void)
} }
#endif #endif
#define USE_GOODRICH_VERSION 1
#if USE_GOODRICH_VERSION
///////////////////////////////////////////////////////////////////////////////
// Goodrich Version of pll_reset
#define POST_CODE(x) outb(0x80, x)
// PLLCHECK_COMPLETED is the "we've already done this" flag
#define PLLCHECK_COMPLETED (1 << RSTPLL_LOWER_SWFLAGS_SHIFT)
#ifndef RSTPPL_LOWER_BYPASS_SET
#define RSTPPL_LOWER_BYPASS_SET (1 << GLCP_SYS_RSTPLL_BYPASS)
#endif // RSTPPL_LOWER_BYPASS_SET
#define DEFAULT_MDIV 3
#define DEFAULT_VDIV 2
#define DEFAULT_FBDIV 24 // 400/266 018 ;300/200
static void pll_reset(void)
{
msr_t msrGlcpSysRstpll;
unsigned MDIV_VDIV_FBDIV;
unsigned SyncBits; // store the sync bits in up ebx
// clear the Bypass bit
// If the straps say we are in bypass and the syspll is not AND there are no software
// bits set then FS2 or something set up the PLL and we should not change it.
msrGlcpSysRstpll = rdmsr(GLCP_SYS_RSTPLL);
msrGlcpSysRstpll.lo &= ~RSTPPL_LOWER_BYPASS_SET;
wrmsr(GLCP_SYS_RSTPLL, msrGlcpSysRstpll);
// If the "we've already been here" flag is set, don't reconfigure the pll
if ( !(msrGlcpSysRstpll.lo & PLLCHECK_COMPLETED ) )
{ // we haven't configured the PLL; do it now
// Store PCI33(0)/66(1), SDR(0)/DDR(1), and CRT(0)/TFT(1) in upper esi to get to the
// correct Strap Table.
POST_CODE(POST_PLL_INIT);
// configure for DDR
msrGlcpSysRstpll.lo &= ~(1 << RSTPPL_LOWER_SDRMODE_SHIFT);
wrmsr(GLCP_SYS_RSTPLL, msrGlcpSysRstpll);
// Use Manual settings
// UseManual:
POST_CODE(POST_PLL_MANUAL);
// DIV settings manually entered.
// ax = VDIV, upper eax = MDIV, upper ecx = FbDIV
// use gs and fs since we don't need them.
// ProgramClocks:
// ax = VDIV, upper eax = MDIV, upper ecx = FbDIV
// move everything into ebx
// VDIV
MDIV_VDIV_FBDIV = ((DEFAULT_VDIV - 2) << RSTPLL_UPPER_VDIV_SHIFT);
// MDIV
MDIV_VDIV_FBDIV |= ((DEFAULT_MDIV - 2) << RSTPLL_UPPER_MDIV_SHIFT);
// FbDIV
MDIV_VDIV_FBDIV |= (plldiv2fbdiv[DEFAULT_FBDIV] << RSTPLL_UPPER_FBDIV_SHIFT);
// write GLCP_SYS_RSTPPL (GLCP reg 0x14) with clock values
msrGlcpSysRstpll.lo &= ~(1 << RSTPPL_LOWER_SDRMODE_SHIFT);
wrmsr(GLCP_SYS_RSTPLL, msrGlcpSysRstpll);
msrGlcpSysRstpll.hi = MDIV_VDIV_FBDIV;
wrmsr(GLCP_SYS_RSTPLL, msrGlcpSysRstpll);
// Set Reset, LockWait, and SW flag
// DoReset:
// CheckSemiSync proc
// Check for Semi-Sync in GeodeLink and CPU.
// We need to do this here since the strap settings don't account for these bits.
SyncBits = 0; // store the sync bits in up ebx
// Check for Bypass mode.
if (msrGlcpSysRstpll.lo & RSTPPL_LOWER_BYPASS_SET)
{
// If we are in BYPASS PCI may or may not be sync'd but CPU and GeodeLink will.
SyncBits |= RSTPPL_LOWER_CPU_SEMI_SYNC_SET;
}
else
{
// CheckPCIsync:
// If FBdiv/Mdiv is evenly divisible then set the PCI semi-sync. FB is always greater
// look up the real divider... if we get a 0 we have serious problems
if ( !(fbdiv2plldiv[((msrGlcpSysRstpll.hi >> RSTPLL_UPPER_FBDIV_SHIFT) & 0x3f)] %
(((msrGlcpSysRstpll.hi >> RSTPLL_UPPER_MDIV_SHIFT) & 0x0F) + 2)) )
{
SyncBits |= RSTPPL_LOWER_PCI_SEMI_SYNC_SET;
}
// CheckCPUSync:
// If Vdiv/Mdiv is evenly divisible then set the CPU semi-sync.
// CPU is always greater or equal.
if (!((((msrGlcpSysRstpll.hi >> RSTPLL_UPPER_MDIV_SHIFT) & 0x07) + 2) %
(((msrGlcpSysRstpll.hi >> RSTPLL_UPPER_VDIV_SHIFT) & 0x0F) + 2)))
{
SyncBits |= RSTPPL_LOWER_CPU_SEMI_SYNC_SET;
}
}
// SetSync:
msrGlcpSysRstpll.lo &= ~(RSTPPL_LOWER_PCI_SEMI_SYNC_SET | RSTPPL_LOWER_CPU_SEMI_SYNC_SET);
msrGlcpSysRstpll.lo |= SyncBits;
wrmsr(GLCP_SYS_RSTPLL, msrGlcpSysRstpll);
// CheckSemiSync endp
// now we do the reset
// Set hold count to 99 (063h)
msrGlcpSysRstpll.lo &= ~(0x0FF << RSTPPL_LOWER_HOLD_COUNT_SHIFT);
msrGlcpSysRstpll.lo |= (0x0DE << RSTPPL_LOWER_HOLD_COUNT_SHIFT);
msrGlcpSysRstpll.lo |= PLLCHECK_COMPLETED; // Say we are done
wrmsr(GLCP_SYS_RSTPLL, msrGlcpSysRstpll);
// Don't want to use LOCKWAIT
msrGlcpSysRstpll.lo |= (RSTPPL_LOWER_PLL_RESET_SET + RSTPPL_LOWER_PD_SET);
msrGlcpSysRstpll.lo |= RSTPPL_LOWER_CHIP_RESET_SET;
wrmsr(GLCP_SYS_RSTPLL, msrGlcpSysRstpll);
// You should never get here..... The chip has reset.
POST_CODE(POST_PLL_RESET_FAIL);
while (1);
} // we haven't configured the PLL; do it now
}
// End of Goodrich version of pll_reset
///////////////////////////////////////////////////////////////////////////////
#else // #if USE_GOODRICH_VERSION
static void pll_reset(void) static void pll_reset(void)
{ {
msr_t msr; msr_t msr;
@ -179,3 +317,4 @@ static void pll_reset(void)
print_debug("should not be here\n\r"); print_debug("should not be here\n\r");
} }
#endif // #if USE_GOODRICH_VERSION