3 * by yinghai.lu@amd.com
5 #include <console/console.h>
6 #include <device/device.h>
7 #include <device/pci.h>
8 #include <device/pci_ids.h>
11 void bcm5785_enable(device_t dev)
13 device_t sb_pci_main_dev;
17 /* See if we are on the behind the pcix bridge */
18 bus_dev = dev->bus->dev;
19 if ((bus_dev->vendor == PCI_VENDOR_ID_SERVERWORKS) &&
20 (bus_dev->device == 0x0036 )) // device under PCI-X Bridge
23 devfn = bus_dev->path.pci.devfn + (1 << 3);
24 sb_pci_main_dev = dev_find_slot(bus_dev->bus->secondary, devfn);
25 // index = ((dev->path.pci.devfn & ~7) >> 3) + 8;
26 } else if ((bus_dev->vendor == PCI_VENDOR_ID_SERVERWORKS) &&
27 (bus_dev->device == 0x0104)) // device under PCI Bridge( under PCI-X )
30 devfn = bus_dev->bus->dev->path.pci.devfn + (1 << 3);
31 sb_pci_main_dev = dev_find_slot(bus_dev->bus->dev->bus->secondary, devfn);
32 // index = ((dev->path.pci.devfn & ~7) >> 3) + 8;
36 devfn = (dev->path.pci.devfn) & ~7;
37 if( dev->vendor == PCI_VENDOR_ID_SERVERWORKS ) {
38 if(dev->device == 0x0036) //PCI-X Bridge
40 else if(dev->device == 0x0223) // USB
43 sb_pci_main_dev = dev_find_slot(dev->bus->secondary, devfn);
44 // index = dev->path.pci.devfn & 7;
46 if (!sb_pci_main_dev) {
52 unsigned reg_old, reg;
54 reg = reg_old = pci_read_config16(sb_pci_main_dev, 0x48);
60 pci_write_config16(sb_pci_main_dev, 0x48, reg);
63 else if (index == 16) {
64 reg = reg_old = pci_read_config8(sb_pci_main_dev, 0x47);
70 pci_write_config8(sb_pci_main_dev, 0x47, reg);
76 struct chip_operations southbridge_broadcom_bcm5785_ops = {
77 CHIP_NAME("Serverworks BCM5785 Southbridge")
78 .enable_dev = bcm5785_enable,