3f92be7decf7f9f978b9ce9a06252f7dc25a8fe0
[coreboot.git] / src / southbridge / broadcom / bcm5785 / bcm5785.c
1 /*
2  * Copyright  2005 AMD
3  *  by yinghai.lu@amd.com
4  */
5 #include <console/console.h>
6 #include <device/device.h>
7 #include <device/pci.h>
8 #include <device/pci_ids.h>
9 #include "bcm5785.h"
10
11 void bcm5785_enable(device_t dev)
12 {
13         device_t sb_pci_main_dev;
14         device_t bus_dev;
15         // unsigned index;
16
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
21         {
22                 unsigned devfn;
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 )
28         {
29                 unsigned devfn;
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;
33         }
34         else { // same bus
35                 unsigned devfn;
36                 devfn = (dev->path.pci.devfn) & ~7;
37                 if( dev->vendor == PCI_VENDOR_ID_SERVERWORKS ) {
38                         if(dev->device == 0x0036) //PCI-X Bridge
39                         { devfn += (1<<3); }
40                         else if(dev->device == 0x0223) // USB
41                         { devfn -= (1<<3); }
42                 }
43                 sb_pci_main_dev = dev_find_slot(dev->bus->secondary, devfn);
44                 // index = dev->path.pci.devfn & 7;
45         }
46         if (!sb_pci_main_dev) {
47                 return;
48         }
49
50         // get index now
51 #if 0
52         unsigned reg_old, reg;
53         if (index < 16) {
54                 reg = reg_old = pci_read_config16(sb_pci_main_dev, 0x48);
55                 reg &= ~(1 << index);
56                 if (dev->enabled) {
57                         reg |= (1 << index);
58                 }
59                 if (reg != reg_old) {
60                         pci_write_config16(sb_pci_main_dev, 0x48, reg);
61                 }
62         }
63         else if (index == 16) {
64                 reg = reg_old = pci_read_config8(sb_pci_main_dev, 0x47);
65                 reg &= ~(1 << 7);
66                 if (!dev->enabled) {
67                         reg |= (1 << 7);
68                 }
69                 if (reg != reg_old) {
70                         pci_write_config8(sb_pci_main_dev, 0x47, reg);
71                 }
72         }
73 #endif
74 }
75
76 struct chip_operations southbridge_broadcom_bcm5785_ops = {
77         CHIP_NAME("Serverworks BCM5785 Southbridge")
78         .enable_dev = bcm5785_enable,
79 };