diff options
author | Yinghai Lu <yinghai.lu@amd.com> | 2007-09-14 14:58:33 +0000 |
---|---|---|
committer | Stefan Reinauer <stepan@openbios.org> | 2007-09-14 14:58:33 +0000 |
commit | 18c70d7222bcea65d08e1ff879d8f69f2705e7ab (patch) | |
tree | cea44a5202a4bcaffd52533c76fb2d33ab1fb664 /src/northbridge/amd/amdk8/northbridge.c | |
parent | 3335adb771c5e6bf2fb200285a8af7134446bb71 (diff) |
More range for HT_CHAIN_UNITID_BASE and HT_CHAIN_END_UNITID_BASE.
For example: in C51/MCP55 or C51/MCP51
Will allow
1. C51 at 0x10 to 0x14, and MCP at 0 to 4
2. C51 at 1 to 4, and MCP at 7 to 0x0a
The reason is c51/mcp51/mcp55 reported unitid is 0x0f (far beyond it
needed), and will prevent us from putting them on bus 0.
Typical values for c51/mcp55 or c51/mcp51:
HT_CHAIN_UNITID_BASE = 0x10 # for C51
HT_CHAIN_END_UNITID_BASE = 0 # for mcp
If only have mcp with c51,
HT_CHAIN_UNITID_BASE = 0 # for MCP
#HT_CHAIN_END_UNITID_BASE = 0 # default value 0x20
Signed-off-by: Yinghai Lu <yinghai.lu@amd.com>
Acked-by: Stefan Reinauer <stepan@coresystems.de>
git-svn-id: svn://svn.coreboot.org/coreboot/trunk@2776 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
Diffstat (limited to 'src/northbridge/amd/amdk8/northbridge.c')
-rw-r--r-- | src/northbridge/amd/amdk8/northbridge.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/northbridge/amd/amdk8/northbridge.c b/src/northbridge/amd/amdk8/northbridge.c index b285426e66..dd97ee7d16 100644 --- a/src/northbridge/amd/amdk8/northbridge.c +++ b/src/northbridge/amd/amdk8/northbridge.c @@ -111,6 +111,7 @@ static unsigned int amdk8_scan_chain(device_t dev, unsigned nodeid, unsigned lin unsigned ht_unitid_base[4]; // here assume only 4 HT device on chain unsigned max_bus; unsigned min_bus; + unsigned max_devfn; dev->link[link].cap = 0x80 + (link *0x20); do { @@ -212,7 +213,13 @@ static unsigned int amdk8_scan_chain(device_t dev, unsigned nodeid, unsigned lin for(i=0;i<4;i++) { ht_unitid_base[i] = 0x20; } - max = hypertransport_scan_chain(&dev->link[link], 0, 0xbf, max, ht_unitid_base, offset_unitid); + + if (min_bus == 0) + max_devfn = (0x17<<3) | 7; + else + max_devfn = (0x1f<<3) | 7; + + max = hypertransport_scan_chain(&dev->link[link], 0, max_devfn, max, ht_unitid_base, offset_unitid); /* We know the number of busses behind this bridge. Set the * subordinate bus number to it's real value @@ -250,12 +257,10 @@ static unsigned int amdk8_scan_chains(device_t dev, unsigned int max) unsigned offset_unitid = 0; nodeid = amdk8_nodeid(dev); - - if(nodeid==0) { sblink = (pci_read_config32(dev, 0x64)>>8) & 3; #if SB_HT_CHAIN_ON_BUS0 > 0 - #if HT_CHAIN_UNITID_BASE != 1 + #if ((HT_CHAIN_UNITID_BASE != 1) || (HT_CHAIN_END_UNITID_BASE != 0x20)) offset_unitid = 1; #endif max = amdk8_scan_chain(dev, nodeid, sblink, sblink, max, offset_unitid ); // do sb ht chain at first, in case s2885 put sb chain (8131/8111) on link2, but put 8151 on link0 @@ -267,7 +272,7 @@ static unsigned int amdk8_scan_chains(device_t dev, unsigned int max) if( (nodeid == 0) && (sblink == link) ) continue; //already done #endif offset_unitid = 0; - #if HT_CHAIN_UNITID_BASE != 1 + #if ((HT_CHAIN_UNITID_BASE != 1) || (HT_CHAIN_END_UNITID_BASE != 0x20)) #if SB_HT_CHAIN_UNITID_OFFSET_ONLY == 1 if((nodeid == 0) && (sblink == link)) #endif @@ -276,6 +281,7 @@ static unsigned int amdk8_scan_chains(device_t dev, unsigned int max) max = amdk8_scan_chain(dev, nodeid, link, sblink, max, offset_unitid); } + return max; } |