Convert ck804_early_smbus.c to a separately compiled unit.
[coreboot.git] / src / southbridge / nvidia / ck804 / ck804_early_smbus.c
index 6f88c327b09de9d3228422128075ff6385d49237..05dcd9801479994308bff9479faeb842e0acb90b 100644 (file)
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
  */
 
+#include <stdint.h>
+#include <arch/io.h>
+#include <arch/romcc_io.h>
+#include <console/console.h>
+#include <device/pci_def.h>
+#include <device/pci_ids.h>
+
 #include "ck804_smbus.h"
+#include "ck804_early_smbus.h"
 
+#define SMBUS_BAR_BASE 0x20
 #define SMBUS_IO_BASE 0x1000
+#define SMBUS_IO_SIZE 0x0040
+
+#define SMBUS_BAR(x) (SMBUS_BAR_BASE + 4 * (x))
+#define SMBUS_BASE(x) (SMBUS_IO_BASE + SMBUS_IO_SIZE * (x))
 
-static void enable_smbus(void)
+void enable_smbus(void)
 {
        device_t dev;
-       dev = pci_locate_device(PCI_ID(0x10de, 0x0052), 0);
+
+       dev = pci_locate_device(PCI_ID(PCI_VENDOR_ID_NVIDIA,
+                               PCI_DEVICE_ID_NVIDIA_CK804_SMB), 0);
        if (dev == PCI_DEV_INVALID)
                die("SMBus controller not found\n");
 
-       print_debug("SMBus controller enabled\n");
-
        /* Set SMBus I/O base. */
-       pci_write_config32(dev, 0x20, SMBUS_IO_BASE | 1);
+       pci_write_config32(dev, SMBUS_BAR(0), SMBUS_BASE(0) | 1);
+       pci_write_config32(dev, SMBUS_BAR(1), SMBUS_BASE(1) | 1);
 
        /* Set SMBus I/O space enable. */
        pci_write_config16(dev, 0x4, 0x01);
 
        /* Clear any lingering errors, so the transaction will run. */
-       outb(inb(SMBUS_IO_BASE + SMBHSTSTAT), SMBUS_IO_BASE + SMBHSTSTAT);
+       outb(inb(SMBUS_BASE(0) + SMBHSTSTAT), SMBUS_BASE(0) + SMBHSTSTAT);
+       outb(inb(SMBUS_BASE(1) + SMBHSTSTAT), SMBUS_BASE(1) + SMBHSTSTAT);
+
+       print_debug("SMBus controller enabled\n");
 }
 
-static int smbus_read_byte(unsigned device, unsigned address)
+int ck804_smbus_read_byte(unsigned bus, unsigned device, unsigned address)
 {
-       return do_smbus_read_byte(SMBUS_IO_BASE, device, address);
+       return do_smbus_read_byte(SMBUS_BASE(bus), device, address);
 }
 
-static inline int smbus_write_byte(unsigned device, unsigned address,
+int ck804_smbus_write_byte(unsigned bus, unsigned device, unsigned address,
                            unsigned char val)
 {
-       return do_smbus_write_byte(SMBUS_IO_BASE, device, address, val);
+       return do_smbus_write_byte(SMBUS_BASE(bus), device, address, val);
+}
+
+int smbus_read_byte(unsigned device, unsigned address)
+{
+       return ck804_smbus_read_byte(0, device, address);
+}
+
+int smbus_write_byte(unsigned device, unsigned address, unsigned char val)
+{
+       return ck804_smbus_write_byte(0, device, address, val);
 }