3 * by yinghai.lu@amd.com
6 #include <console/console.h>
7 #include <device/device.h>
8 #include <device/pci.h>
9 #include <device/pnp.h>
10 #include <device/pci_ids.h>
11 #include <device/pci_ops.h>
12 #include <pc80/mc146818rtc.h>
13 #include <pc80/isa-dma.h>
16 #include <device/smbus.h>
18 #include "bcm5785_smbus.h"
22 static void sb_init(device_t dev)
30 /* Set up NMI on errors */
31 byte = inb(0x70); // RTC70
34 get_option(&nmi_option, "nmi");
36 byte &= ~(1 << 7); /* set NMI */
38 byte |= ( 1 << 7); // Can not mask NMI from PCI-E and NMI_NOW
40 if( byte != byte_old) {
47 static void bcm5785_sb_read_resources(device_t dev)
52 /* Get the normal pci resources of this device */
53 pci_dev_read_resources(dev);
54 /* Get Resource for SMBUS */
55 pci_get_resource(dev, 0x90);
57 compact_resources(dev);
59 /* Add an extra subtractive resource for both memory and I/O */
60 res = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0));
61 res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE | IORESOURCE_ASSIGNED;
63 res = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0));
64 res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE | IORESOURCE_ASSIGNED;
67 static int lsmbus_recv_byte(device_t dev)
73 device = dev->path.i2c.device;
74 pbus = get_pbus_smbus(dev);
76 res = find_resource(pbus->dev, 0x90);
78 return do_smbus_recv_byte(res->base, device);
81 static int lsmbus_send_byte(device_t dev, uint8_t val)
87 device = dev->path.i2c.device;
88 pbus = get_pbus_smbus(dev);
90 res = find_resource(pbus->dev, 0x90);
92 return do_smbus_send_byte(res->base, device, val);
94 static int lsmbus_read_byte(device_t dev, uint8_t address)
100 device = dev->path.i2c.device;
101 pbus = get_pbus_smbus(dev);
103 res = find_resource(pbus->dev, 0x90);
105 return do_smbus_read_byte(res->base, device, address);
107 static int lsmbus_write_byte(device_t dev, uint8_t address, uint8_t val)
110 struct resource *res;
113 device = dev->path.i2c.device;
114 pbus = get_pbus_smbus(dev);
116 res = find_resource(pbus->dev, 0x90);
118 return do_smbus_write_byte(res->base, device, address, val);
120 static struct smbus_bus_operations lops_smbus_bus = {
121 .recv_byte = lsmbus_recv_byte,
122 .send_byte = lsmbus_send_byte,
123 .read_byte = lsmbus_read_byte,
124 .write_byte = lsmbus_write_byte,
127 static void lpci_set_subsystem(device_t dev, unsigned vendor, unsigned device)
129 pci_write_config32(dev, 0x2c,
130 ((device & 0xffff) << 16) | (vendor & 0xffff));
133 static struct pci_operations lops_pci = {
134 .set_subsystem = lpci_set_subsystem,
137 static struct device_operations sb_ops = {
138 .read_resources = bcm5785_sb_read_resources,
139 .set_resources = pci_dev_set_resources,
140 .enable_resources = pci_dev_enable_resources,
142 .scan_bus = scan_static_bus,
143 // .enable = bcm5785_enable,
144 .ops_pci = &lops_pci,
145 .ops_smbus_bus = &lops_smbus_bus,
147 static const struct pci_driver sb_driver __pci_driver = {
149 .vendor = PCI_VENDOR_ID_SERVERWORKS,
150 .device = PCI_DEVICE_ID_SERVERWORKS_BCM5785_SB_PCI_MAIN,