2 * Copyright 2004 Tyan Computer
6 #include <console/console.h>
8 #include <device/device.h>
9 #include <device/pci.h>
10 #include <device/pci_ids.h>
11 #include <device/pci_ops.h>
14 static uint32_t final_reg;
16 static device_t find_lpc_dev(device_t dev, unsigned devfn)
20 lpc_dev = dev_find_slot(dev->bus->secondary, devfn);
24 if ((lpc_dev->vendor != PCI_VENDOR_ID_NVIDIA)
25 || ((lpc_dev->device != PCI_DEVICE_ID_NVIDIA_CK804_LPC)
26 && (lpc_dev->device != PCI_DEVICE_ID_NVIDIA_CK804_PRO)
27 && (lpc_dev->device != PCI_DEVICE_ID_NVIDIA_CK804_SLAVE)))
30 id = pci_read_config32(lpc_dev, PCI_VENDOR_ID);
31 if ((id != (PCI_VENDOR_ID_NVIDIA |
32 (PCI_DEVICE_ID_NVIDIA_CK804_LPC << 16)))
33 && (id != (PCI_VENDOR_ID_NVIDIA |
34 (PCI_DEVICE_ID_NVIDIA_CK804_PRO << 16)))
35 && (id != (PCI_VENDOR_ID_NVIDIA |
36 (PCI_DEVICE_ID_NVIDIA_CK804_SLAVE << 16))))
45 void ck804_enable(device_t dev)
48 unsigned index = 0, index2 = 0, deviceid, vendorid, devfn;
49 uint32_t reg_old, reg;
52 struct southbridge_nvidia_ck804_config *conf;
53 conf = dev->chip_info;
55 if (dev->device == 0x0000) {
56 vendorid = pci_read_config32(dev, PCI_VENDOR_ID);
57 deviceid = (vendorid >> 16) & 0xffff;
58 /* vendorid &= 0xffff; */
60 /* vendorid = dev->vendor; */
61 deviceid = dev->device;
64 devfn = (dev->path.pci.devfn) & ~7;
66 case PCI_DEVICE_ID_NVIDIA_CK804_SM:
69 case PCI_DEVICE_ID_NVIDIA_CK804_USB:
73 case PCI_DEVICE_ID_NVIDIA_CK804_USB2:
77 case PCI_DEVICE_ID_NVIDIA_CK804_NIC:
81 case PCI_DEVICE_ID_NVIDIA_CK804_NIC_BRIDGE:
85 case PCI_DEVICE_ID_NVIDIA_CK804_ACI:
89 case PCI_DEVICE_ID_NVIDIA_CK804_MCI:
93 case PCI_DEVICE_ID_NVIDIA_CK804_IDE:
97 case PCI_DEVICE_ID_NVIDIA_CK804_SATA0:
101 case PCI_DEVICE_ID_NVIDIA_CK804_SATA1:
105 case PCI_DEVICE_ID_NVIDIA_CK804_PCI:
109 case PCI_DEVICE_ID_NVIDIA_CK804_PCI_E:
119 for (i = 0; i < 4; i++) {
120 lpc_dev = find_lpc_dev(dev, devfn - (i << 3));
128 reg_old = reg = pci_read_config32(lpc_dev, 0xe4);
130 reg |= (1 << index2);
132 pci_write_config32(lpc_dev, 0xe4, reg);
139 lpc_dev = find_lpc_dev(dev, devfn);
144 final_reg = pci_read_config32(lpc_dev, 0xe8);
145 final_reg &= ~((1 << 16) | (1 << 8) | (1 << 20) | (1 << 10)
146 | (1 << 12) | (1 << 13) | (1 << 14) | (1 << 22)
147 | (1 << 18) | (1 << 15));
148 pci_write_config32(lpc_dev, 0xe8, final_reg);
150 reg_old = reg = pci_read_config32(lpc_dev, 0xe4);
153 pci_write_config32(lpc_dev, 0xe4, reg);
155 byte = pci_read_config8(lpc_dev, 0x74);
157 pci_write_config8(dev, 0x74, byte);
159 byte = pci_read_config8(lpc_dev, 0xdd);
160 byte |= ((1 << 0) | (1 << 3));
161 pci_write_config8(dev, 0xdd, byte);
167 final_reg |= (1 << index);
170 reg_old = pci_read_config32(lpc_dev, 0xe8);
171 if (final_reg != reg_old)
172 pci_write_config32(lpc_dev, 0xe8, final_reg);
176 struct chip_operations southbridge_nvidia_ck804_ops = {
177 CHIP_NAME("NVIDIA CK804 Southbridge")
178 .enable_dev = ck804_enable,