From e324731152fa1a64aa210c1f40b8b2afa3dc1623 Mon Sep 17 00:00:00 2001 From: Yinghai Lu Date: Thu, 20 Jan 2005 20:41:17 +0000 Subject: linkb_to_host git-svn-id: svn://svn.coreboot.org/coreboot/trunk@1895 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- src/northbridge/amd/amdk8/incoherent_ht.c | 75 +++++++++++++++++-------------- 1 file changed, 42 insertions(+), 33 deletions(-) (limited to 'src/northbridge') diff --git a/src/northbridge/amd/amdk8/incoherent_ht.c b/src/northbridge/amd/amdk8/incoherent_ht.c index 16b82a7262..ee7e5dc66d 100644 --- a/src/northbridge/amd/amdk8/incoherent_ht.c +++ b/src/northbridge/amd/amdk8/incoherent_ht.c @@ -241,26 +241,31 @@ static int ht_setup_chain(device_t udev, uint8_t upos) break; } - /* get ht direction */ - offs = ( (pci_read_config16(dev, pos + PCI_CAP_FLAGS) >> 10) & 1) ? PCI_HT_SLAVE1_OFFS : PCI_HT_SLAVE0_OFFS; + /* Update the Unitid of the current device */ + flags = pci_read_config16(dev, pos + PCI_CAP_FLAGS); + flags &= ~0x1f; /* mask out the bse Unit ID */ + flags |= next_unitid & 0x1f; + pci_write_config16(dev, pos + PCI_CAP_FLAGS, flags); + + dev = PCI_DEV(0, next_unitid, 0); + + /* Compute the number of unitids consumed */ + count = (flags >> 5) & 0x1f; + next_unitid += count; + + /* get ht direction */ + flags = pci_read_config16(dev, pos + PCI_CAP_FLAGS); // double read ?? + + offs = ((flags>>10) & 1) ? PCI_HT_SLAVE1_OFFS : PCI_HT_SLAVE0_OFFS; - /* Setup the Hypertransport link */ - reset_needed |= ht_optimize_link(udev, upos, uoffs, dev, pos, offs); + /* Setup the Hypertransport link */ + reset_needed |= ht_optimize_link(udev, upos, uoffs, dev, pos, offs); - /* Update the Unitid of the current device */ - flags = pci_read_config16(dev, pos + PCI_CAP_FLAGS); - flags &= ~0x1f; /* mask out the bse Unit ID */ - flags |= next_unitid & 0x1f; - pci_write_config16(dev, pos + PCI_CAP_FLAGS, flags); + /* Remeber the location of the last device */ + udev = dev; + upos = pos; + uoffs = (offs != PCI_HT_SLAVE0_OFFS) ? PCI_HT_SLAVE0_OFFS : PCI_HT_SLAVE1_OFFS; - /* Remeber the location of the last device */ - udev = PCI_DEV(0, next_unitid, 0); - upos = pos; - uoffs = (offs != PCI_HT_SLAVE0_OFFS) ? PCI_HT_SLAVE0_OFFS : PCI_HT_SLAVE1_OFFS; - - /* Compute the number of unitids consumed */ - count = (flags >> 5) & 0x1f; - next_unitid += count; } while((last_unitid != next_unitid) && (next_unitid <= 0x1f)); return reset_needed; @@ -298,26 +303,30 @@ static int ht_setup_chainx(device_t udev, uint8_t upos, uint8_t bus) break; } - /* get ht direction */ - offs = ((pci_read_config16(dev, pos + PCI_CAP_FLAGS)>>10) & 1) ? PCI_HT_SLAVE1_OFFS : PCI_HT_SLAVE0_OFFS; + /* Update the Unitid of the current device */ + flags = pci_read_config16(dev, pos + PCI_CAP_FLAGS); + flags &= ~0x1f; /* mask out the bse Unit ID */ + flags |= next_unitid & 0x1f; + pci_write_config16(dev, pos + PCI_CAP_FLAGS, flags); - /* Setup the Hypertransport link */ - reset_needed |= ht_optimize_link(udev, upos, uoffs, dev, pos, offs); + dev = PCI_DEV(bus, next_unitid, 0); - /* Update the Unitid of the current device */ - flags = pci_read_config16(dev, pos + PCI_CAP_FLAGS); - flags &= ~0x1f; /* mask out the bse Unit ID */ - flags |= next_unitid & 0x1f; - pci_write_config16(dev, pos + PCI_CAP_FLAGS, flags); + /* Compute the number of unitids consumed */ + count = (flags >> 5) & 0x1f; + next_unitid += count; + + /* get ht direction */ + flags = pci_read_config16(dev, pos + PCI_CAP_FLAGS); // double read ?? + + offs = ((flags>>10) & 1) ? PCI_HT_SLAVE1_OFFS : PCI_HT_SLAVE0_OFFS; - /* Remeber the location of the last device */ - udev = PCI_DEV(bus, next_unitid, 0); - upos = pos; - uoffs = ( offs != PCI_HT_SLAVE0_OFFS ) ? PCI_HT_SLAVE0_OFFS : PCI_HT_SLAVE1_OFFS; + /* Setup the Hypertransport link */ + reset_needed |= ht_optimize_link(udev, upos, uoffs, dev, pos, offs); - /* Compute the number of unitids consumed */ - count = (flags >> 5) & 0x1f; - next_unitid += count; + /* Remeber the location of the last device */ + udev = dev; + upos = pos; + uoffs = ( offs != PCI_HT_SLAVE0_OFFS ) ? PCI_HT_SLAVE0_OFFS : PCI_HT_SLAVE1_OFFS; } while((last_unitid != next_unitid) && (next_unitid <= 0x1f)); return reset_needed; -- cgit v1.2.3