blob: 9d3d3e8898780064d37c16d73de05108acc64f95 [file] [log] [blame]
Yinghai Luafd34e62006-02-16 17:22:19 +00001/*
Uwe Hermannc6a10622010-10-17 19:30:58 +00002 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2005 AMD
5 * Written by Yinghai Lu <yinghai.lu@amd.com> for AMD.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; version 2 of the License.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
Yinghai Luafd34e62006-02-16 17:22:19 +000015 */
16
stepan836ae292010-12-08 05:42:47 +000017#include "smbus.h"
Yinghai Luafd34e62006-02-16 17:22:19 +000018
19#define SMBUS_IO_BASE 0x1000
20
21static void enable_smbus(void)
22{
23 device_t dev;
24 dev = pci_locate_device(PCI_ID(0x1166, 0x0205), 0); // 0x0201?
25
26 if (dev == PCI_DEV_INVALID) {
Stefan Reinauer64ed2b72010-03-31 14:47:43 +000027 die("SMBUS controller not found\n");
Yinghai Luafd34e62006-02-16 17:22:19 +000028 }
Stefan Reinauer14e22772010-04-27 06:56:47 +000029
Stefan Reinauer5ab52dd2015-01-05 13:01:01 -080030 printk(BIOS_DEBUG, "SMBus controller enabled\n");
Yinghai Luafd34e62006-02-16 17:22:19 +000031 /* set smbus iobase */
32 pci_write_config32(dev, 0x90, SMBUS_IO_BASE | 1);
Stefan Reinauer14e22772010-04-27 06:56:47 +000033 /* Set smbus iospace enable */
Yinghai Luafd34e62006-02-16 17:22:19 +000034 pci_write_config8(dev, 0xd2, 0x03);
35 /* clear any lingering errors, so the transaction will run */
36 outb(inb(SMBUS_IO_BASE + SMBHSTSTAT), SMBUS_IO_BASE + SMBHSTSTAT);
37}
38
Stefan Reinauer467a0652010-04-25 14:37:18 +000039static inline int smbus_recv_byte(unsigned device)
Yinghai Luafd34e62006-02-16 17:22:19 +000040{
41 return do_smbus_recv_byte(SMBUS_IO_BASE, device);
42}
43
Stefan Reinauer467a0652010-04-25 14:37:18 +000044static inline int smbus_send_byte(unsigned device, unsigned char val)
Yinghai Luafd34e62006-02-16 17:22:19 +000045{
46 return do_smbus_send_byte(SMBUS_IO_BASE, device, val);
47}
48
Stefan Reinauer467a0652010-04-25 14:37:18 +000049static inline int smbus_read_byte(unsigned device, unsigned address)
Yinghai Luafd34e62006-02-16 17:22:19 +000050{
51 return do_smbus_read_byte(SMBUS_IO_BASE, device, address);
52}
Stefan Reinauer467a0652010-04-25 14:37:18 +000053
54static inline int smbus_write_byte(unsigned device, unsigned address, unsigned char val)
Yinghai Luafd34e62006-02-16 17:22:19 +000055{
56 return do_smbus_write_byte(SMBUS_IO_BASE, device, address, val);
57}