blob: b1b3db6192c755a9f52fa78690d4bef577366362 [file] [log] [blame]
Angel Ponsae593872020-04-04 18:50:57 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Marc Jones24484842017-05-04 21:17:45 -06002
Kyösti Mälkkid7865202020-07-01 13:15:27 +03003#include <amdblocks/acpimmio.h>
Marc Jones24484842017-05-04 21:17:45 -06004#include <device/device.h>
5#include <device/pci.h>
6#include <device/pci_ids.h>
Marc Jones24484842017-05-04 21:17:45 -06007#include <device/smbus.h>
Aaron Durbin178d6442020-01-28 11:10:23 -07008#include <device/smbus_host.h>
Marc Jones24484842017-05-04 21:17:45 -06009#include <arch/ioapic.h>
Marc Jonesdfeb1c42017-08-07 19:08:24 -060010#include <soc/southbridge.h>
Marc Jones24484842017-05-04 21:17:45 -060011
Elyes HAOUAS777ccd42018-05-22 10:52:05 +020012static void sm_init(struct device *dev)
Marc Jones24484842017-05-04 21:17:45 -060013{
Felix Held1b332052021-02-11 03:01:18 +010014 fch_enable_ioapic_decode();
Marc Jones24484842017-05-04 21:17:45 -060015 setup_ioapic(VIO_APIC_VADDR, CONFIG_MAX_CPUS);
Felix Held34fc29a2021-02-11 02:43:07 +010016 fch_configure_hpet();
Marc Jones24484842017-05-04 21:17:45 -060017}
18
Richard Spiegelb40e1932018-10-24 12:51:21 -070019static u32 get_sm_mmio(struct device *dev)
Marc Jones24484842017-05-04 21:17:45 -060020{
Felix Held8199b882021-01-05 00:03:20 +010021 /*
22 * Since SMBus and ASF controller are behind the same PCIe device, we don't know behind
23 * which controller a device is. We assume here that the devices are behind the SMBus
24 * controller. The proper solution would be to handle those as MMIO devices instead of
25 * PCI ones.
26 */
27 return (uintptr_t)acpimmio_smbus;
Richard Spiegelb40e1932018-10-24 12:51:21 -070028}
29
30static int lsmbus_recv_byte(struct device *dev)
31{
32 u8 device;
33
34 device = dev->path.i2c.device;
35 return do_smbus_recv_byte(get_sm_mmio(dev), device);
Marc Jones24484842017-05-04 21:17:45 -060036}
37
Elyes HAOUAS777ccd42018-05-22 10:52:05 +020038static int lsmbus_send_byte(struct device *dev, u8 val)
Marc Jones24484842017-05-04 21:17:45 -060039{
Richard Spiegelcd04e312017-11-08 14:58:30 -070040 u8 device;
Marc Jones24484842017-05-04 21:17:45 -060041
42 device = dev->path.i2c.device;
Richard Spiegelb40e1932018-10-24 12:51:21 -070043 return do_smbus_send_byte(get_sm_mmio(dev), device, val);
Marc Jones24484842017-05-04 21:17:45 -060044}
45
Elyes HAOUAS777ccd42018-05-22 10:52:05 +020046static int lsmbus_read_byte(struct device *dev, u8 address)
Marc Jones24484842017-05-04 21:17:45 -060047{
Richard Spiegelcd04e312017-11-08 14:58:30 -070048 u8 device;
Marc Jones24484842017-05-04 21:17:45 -060049
50 device = dev->path.i2c.device;
Richard Spiegelb40e1932018-10-24 12:51:21 -070051 return do_smbus_read_byte(get_sm_mmio(dev), device, address);
Marc Jones24484842017-05-04 21:17:45 -060052}
53
Elyes HAOUAS777ccd42018-05-22 10:52:05 +020054static int lsmbus_write_byte(struct device *dev, u8 address, u8 val)
Marc Jones24484842017-05-04 21:17:45 -060055{
Richard Spiegelcd04e312017-11-08 14:58:30 -070056 u8 device;
Marc Jones24484842017-05-04 21:17:45 -060057
58 device = dev->path.i2c.device;
Richard Spiegelb40e1932018-10-24 12:51:21 -070059 return do_smbus_write_byte(get_sm_mmio(dev), device, address, val);
Marc Jones24484842017-05-04 21:17:45 -060060}
61static struct smbus_bus_operations lops_smbus_bus = {
62 .recv_byte = lsmbus_recv_byte,
63 .send_byte = lsmbus_send_byte,
64 .read_byte = lsmbus_read_byte,
65 .write_byte = lsmbus_write_byte,
66};
67
Marc Jones24484842017-05-04 21:17:45 -060068static struct device_operations smbus_ops = {
Nico Huber2f8ba692020-04-05 14:05:24 +020069 .read_resources = noop_read_resources,
70 .set_resources = noop_set_resources,
Marc Jones24484842017-05-04 21:17:45 -060071 .enable_resources = pci_dev_enable_resources,
72 .init = sm_init,
73 .scan_bus = scan_smbus,
Angel Pons1fc0edd2020-05-31 00:03:28 +020074 .ops_pci = &pci_dev_ops_pci,
Marc Jones24484842017-05-04 21:17:45 -060075 .ops_smbus_bus = &lops_smbus_bus,
76};
77static const struct pci_driver smbus_driver __pci_driver = {
78 .ops = &smbus_ops,
79 .vendor = PCI_VENDOR_ID_AMD,
Martin Roth069ca662018-03-01 11:26:18 -070080 .device = PCI_DEVICE_ID_AMD_CZ_SMBUS,
Marc Jones24484842017-05-04 21:17:45 -060081};