Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
0002 /*
0003  * AMD MP2 PCIe communication driver
0004  *
0005  * Authors: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
0006  *          Elie Morisse <syniurge@gmail.com>
0007  */
0008 
0009 #include <linux/dma-mapping.h>
0010 #include <linux/interrupt.h>
0011 #include <linux/module.h>
0012 #include <linux/pci.h>
0013 #include <linux/slab.h>
0014 
0015 #include "i2c-amd-mp2.h"
0016 
0017 #include <linux/io-64-nonatomic-lo-hi.h>
0018 
0019 static void amd_mp2_c2p_mutex_lock(struct amd_i2c_common *i2c_common)
0020 {
0021     struct amd_mp2_dev *privdata = i2c_common->mp2_dev;
0022 
0023     /* there is only one data mailbox for two i2c adapters */
0024     mutex_lock(&privdata->c2p_lock);
0025     privdata->c2p_lock_busid = i2c_common->bus_id;
0026 }
0027 
0028 static void amd_mp2_c2p_mutex_unlock(struct amd_i2c_common *i2c_common)
0029 {
0030     struct amd_mp2_dev *privdata = i2c_common->mp2_dev;
0031 
0032     if (unlikely(privdata->c2p_lock_busid != i2c_common->bus_id)) {
0033         pci_warn(privdata->pci_dev,
0034              "bus %d attempting to unlock C2P locked by bus %d\n",
0035              i2c_common->bus_id, privdata->c2p_lock_busid);
0036         return;
0037     }
0038 
0039     mutex_unlock(&privdata->c2p_lock);
0040 }
0041 
0042 static int amd_mp2_cmd(struct amd_i2c_common *i2c_common,
0043                union i2c_cmd_base i2c_cmd_base)
0044 {
0045     struct amd_mp2_dev *privdata = i2c_common->mp2_dev;
0046     void __iomem *reg;
0047 
0048     i2c_common->reqcmd = i2c_cmd_base.s.i2c_cmd;
0049 
0050     reg = privdata->mmio + ((i2c_cmd_base.s.bus_id == 1) ?
0051                 AMD_C2P_MSG1 : AMD_C2P_MSG0);
0052     writel(i2c_cmd_base.ul, reg);
0053 
0054     return 0;
0055 }
0056 
0057 int amd_mp2_bus_enable_set(struct amd_i2c_common *i2c_common, bool enable)
0058 {
0059     struct amd_mp2_dev *privdata = i2c_common->mp2_dev;
0060     union i2c_cmd_base i2c_cmd_base;
0061 
0062     pci_dbg(privdata->pci_dev, "id: %d\n", i2c_common->bus_id);
0063 
0064     i2c_cmd_base.ul = 0;
0065     i2c_cmd_base.s.i2c_cmd = enable ? i2c_enable : i2c_disable;
0066     i2c_cmd_base.s.bus_id = i2c_common->bus_id;
0067     i2c_cmd_base.s.i2c_speed = i2c_common->i2c_speed;
0068 
0069     amd_mp2_c2p_mutex_lock(i2c_common);
0070 
0071     return amd_mp2_cmd(i2c_common, i2c_cmd_base);
0072 }
0073 EXPORT_SYMBOL_GPL(amd_mp2_bus_enable_set);
0074 
0075 static void amd_mp2_cmd_rw_fill(struct amd_i2c_common *i2c_common,
0076                 union i2c_cmd_base *i2c_cmd_base,
0077                 enum i2c_cmd reqcmd)
0078 {
0079     i2c_cmd_base->s.i2c_cmd = reqcmd;
0080     i2c_cmd_base->s.bus_id = i2c_common->bus_id;
0081     i2c_cmd_base->s.i2c_speed = i2c_common->i2c_speed;
0082     i2c_cmd_base->s.slave_addr = i2c_common->msg->addr;
0083     i2c_cmd_base->s.length = i2c_common->msg->len;
0084 }
0085 
0086 int amd_mp2_rw(struct amd_i2c_common *i2c_common, enum i2c_cmd reqcmd)
0087 {
0088     struct amd_mp2_dev *privdata = i2c_common->mp2_dev;
0089     union i2c_cmd_base i2c_cmd_base;
0090 
0091     amd_mp2_cmd_rw_fill(i2c_common, &i2c_cmd_base, reqcmd);
0092     amd_mp2_c2p_mutex_lock(i2c_common);
0093 
0094     if (i2c_common->msg->len <= 32) {
0095         i2c_cmd_base.s.mem_type = use_c2pmsg;
0096         if (reqcmd == i2c_write)
0097             memcpy_toio(privdata->mmio + AMD_C2P_MSG2,
0098                     i2c_common->msg->buf,
0099                     i2c_common->msg->len);
0100     } else {
0101         i2c_cmd_base.s.mem_type = use_dram;
0102         writeq((u64)i2c_common->dma_addr,
0103                privdata->mmio + AMD_C2P_MSG2);
0104     }
0105 
0106     return amd_mp2_cmd(i2c_common, i2c_cmd_base);
0107 }
0108 EXPORT_SYMBOL_GPL(amd_mp2_rw);
0109 
0110 static void amd_mp2_pci_check_rw_event(struct amd_i2c_common *i2c_common)
0111 {
0112     struct amd_mp2_dev *privdata = i2c_common->mp2_dev;
0113     struct pci_dev *pdev = privdata->pci_dev;
0114     int len = i2c_common->eventval.r.length;
0115     u32 slave_addr = i2c_common->eventval.r.slave_addr;
0116     bool err = false;
0117 
0118     if (unlikely(len != i2c_common->msg->len)) {
0119         pci_err(pdev, "length %d in event doesn't match buffer length %d!\n",
0120             len, i2c_common->msg->len);
0121         err = true;
0122     }
0123 
0124     if (unlikely(slave_addr != i2c_common->msg->addr)) {
0125         pci_err(pdev, "unexpected slave address %x (expected: %x)!\n",
0126             slave_addr, i2c_common->msg->addr);
0127         err = true;
0128     }
0129 
0130     if (!err)
0131         i2c_common->cmd_success = true;
0132 }
0133 
0134 static void __amd_mp2_process_event(struct amd_i2c_common *i2c_common)
0135 {
0136     struct amd_mp2_dev *privdata = i2c_common->mp2_dev;
0137     struct pci_dev *pdev = privdata->pci_dev;
0138     enum status_type sts = i2c_common->eventval.r.status;
0139     enum response_type res = i2c_common->eventval.r.response;
0140     int len = i2c_common->eventval.r.length;
0141 
0142     if (res != command_success) {
0143         if (res != command_failed)
0144             pci_err(pdev, "invalid response to i2c command!\n");
0145         return;
0146     }
0147 
0148     switch (i2c_common->reqcmd) {
0149     case i2c_read:
0150         if (sts == i2c_readcomplete_event) {
0151             amd_mp2_pci_check_rw_event(i2c_common);
0152             if (len <= 32)
0153                 memcpy_fromio(i2c_common->msg->buf,
0154                           privdata->mmio + AMD_C2P_MSG2,
0155                           len);
0156         } else if (sts != i2c_readfail_event) {
0157             pci_err(pdev, "invalid i2c status after read (%d)!\n", sts);
0158         }
0159         break;
0160     case i2c_write:
0161         if (sts == i2c_writecomplete_event)
0162             amd_mp2_pci_check_rw_event(i2c_common);
0163         else if (sts != i2c_writefail_event)
0164             pci_err(pdev, "invalid i2c status after write (%d)!\n", sts);
0165         break;
0166     case i2c_enable:
0167         if (sts == i2c_busenable_complete)
0168             i2c_common->cmd_success = true;
0169         else if (sts != i2c_busenable_failed)
0170             pci_err(pdev, "invalid i2c status after bus enable (%d)!\n", sts);
0171         break;
0172     case i2c_disable:
0173         if (sts == i2c_busdisable_complete)
0174             i2c_common->cmd_success = true;
0175         else if (sts != i2c_busdisable_failed)
0176             pci_err(pdev, "invalid i2c status after bus disable (%d)!\n", sts);
0177         break;
0178     default:
0179         break;
0180     }
0181 }
0182 
0183 void amd_mp2_process_event(struct amd_i2c_common *i2c_common)
0184 {
0185     struct amd_mp2_dev *privdata = i2c_common->mp2_dev;
0186     struct pci_dev *pdev = privdata->pci_dev;
0187 
0188     if (unlikely(i2c_common->reqcmd == i2c_none)) {
0189         pci_warn(pdev, "received msg but no cmd was sent (bus = %d)!\n",
0190              i2c_common->bus_id);
0191         return;
0192     }
0193 
0194     __amd_mp2_process_event(i2c_common);
0195 
0196     i2c_common->reqcmd = i2c_none;
0197     amd_mp2_c2p_mutex_unlock(i2c_common);
0198 }
0199 EXPORT_SYMBOL_GPL(amd_mp2_process_event);
0200 
0201 static irqreturn_t amd_mp2_irq_isr(int irq, void *dev)
0202 {
0203     struct amd_mp2_dev *privdata = dev;
0204     struct pci_dev *pdev = privdata->pci_dev;
0205     struct amd_i2c_common *i2c_common;
0206     u32 val;
0207     unsigned int bus_id;
0208     void __iomem *reg;
0209     enum irqreturn ret = IRQ_NONE;
0210 
0211     for (bus_id = 0; bus_id < 2; bus_id++) {
0212         i2c_common = privdata->busses[bus_id];
0213         if (!i2c_common)
0214             continue;
0215 
0216         reg = privdata->mmio + ((bus_id == 0) ?
0217                     AMD_P2C_MSG1 : AMD_P2C_MSG2);
0218         val = readl(reg);
0219         if (val != 0) {
0220             writel(0, reg);
0221             writel(0, privdata->mmio + AMD_P2C_MSG_INTEN);
0222             i2c_common->eventval.ul = val;
0223             i2c_common->cmd_completion(i2c_common);
0224 
0225             ret = IRQ_HANDLED;
0226         }
0227     }
0228 
0229     if (ret != IRQ_HANDLED) {
0230         val = readl(privdata->mmio + AMD_P2C_MSG_INTEN);
0231         if (val != 0) {
0232             writel(0, privdata->mmio + AMD_P2C_MSG_INTEN);
0233             pci_warn(pdev, "received irq without message\n");
0234             ret = IRQ_HANDLED;
0235         }
0236     }
0237 
0238     return ret;
0239 }
0240 
0241 void amd_mp2_rw_timeout(struct amd_i2c_common *i2c_common)
0242 {
0243     i2c_common->reqcmd = i2c_none;
0244     amd_mp2_c2p_mutex_unlock(i2c_common);
0245 }
0246 EXPORT_SYMBOL_GPL(amd_mp2_rw_timeout);
0247 
0248 int amd_mp2_register_cb(struct amd_i2c_common *i2c_common)
0249 {
0250     struct amd_mp2_dev *privdata = i2c_common->mp2_dev;
0251     struct pci_dev *pdev = privdata->pci_dev;
0252 
0253     if (i2c_common->bus_id > 1)
0254         return -EINVAL;
0255 
0256     if (privdata->busses[i2c_common->bus_id]) {
0257         pci_err(pdev, "Bus %d already taken!\n", i2c_common->bus_id);
0258         return -EINVAL;
0259     }
0260 
0261     privdata->busses[i2c_common->bus_id] = i2c_common;
0262 
0263     return 0;
0264 }
0265 EXPORT_SYMBOL_GPL(amd_mp2_register_cb);
0266 
0267 int amd_mp2_unregister_cb(struct amd_i2c_common *i2c_common)
0268 {
0269     struct amd_mp2_dev *privdata = i2c_common->mp2_dev;
0270 
0271     privdata->busses[i2c_common->bus_id] = NULL;
0272 
0273     return 0;
0274 }
0275 EXPORT_SYMBOL_GPL(amd_mp2_unregister_cb);
0276 
0277 static void amd_mp2_clear_reg(struct amd_mp2_dev *privdata)
0278 {
0279     int reg;
0280 
0281     for (reg = AMD_C2P_MSG0; reg <= AMD_C2P_MSG9; reg += 4)
0282         writel(0, privdata->mmio + reg);
0283 
0284     for (reg = AMD_P2C_MSG1; reg <= AMD_P2C_MSG2; reg += 4)
0285         writel(0, privdata->mmio + reg);
0286 }
0287 
0288 static int amd_mp2_pci_init(struct amd_mp2_dev *privdata,
0289                 struct pci_dev *pci_dev)
0290 {
0291     int rc;
0292 
0293     pci_set_drvdata(pci_dev, privdata);
0294 
0295     rc = pcim_enable_device(pci_dev);
0296     if (rc) {
0297         pci_err(pci_dev, "Failed to enable MP2 PCI device\n");
0298         goto err_pci_enable;
0299     }
0300 
0301     rc = pcim_iomap_regions(pci_dev, 1 << 2, pci_name(pci_dev));
0302     if (rc) {
0303         pci_err(pci_dev, "I/O memory remapping failed\n");
0304         goto err_pci_enable;
0305     }
0306     privdata->mmio = pcim_iomap_table(pci_dev)[2];
0307 
0308     pci_set_master(pci_dev);
0309 
0310     rc = dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(64));
0311     if (rc)
0312         goto err_dma_mask;
0313 
0314     /* Set up intx irq */
0315     writel(0, privdata->mmio + AMD_P2C_MSG_INTEN);
0316     pci_intx(pci_dev, 1);
0317     rc = devm_request_irq(&pci_dev->dev, pci_dev->irq, amd_mp2_irq_isr,
0318                   IRQF_SHARED, dev_name(&pci_dev->dev), privdata);
0319     if (rc)
0320         pci_err(pci_dev, "Failure requesting irq %i: %d\n",
0321             pci_dev->irq, rc);
0322 
0323     return rc;
0324 
0325 err_dma_mask:
0326     pci_clear_master(pci_dev);
0327 err_pci_enable:
0328     pci_set_drvdata(pci_dev, NULL);
0329     return rc;
0330 }
0331 
0332 static int amd_mp2_pci_probe(struct pci_dev *pci_dev,
0333                  const struct pci_device_id *id)
0334 {
0335     struct amd_mp2_dev *privdata;
0336     int rc;
0337 
0338     privdata = devm_kzalloc(&pci_dev->dev, sizeof(*privdata), GFP_KERNEL);
0339     if (!privdata)
0340         return -ENOMEM;
0341 
0342     privdata->pci_dev = pci_dev;
0343     rc = amd_mp2_pci_init(privdata, pci_dev);
0344     if (rc)
0345         return rc;
0346 
0347     mutex_init(&privdata->c2p_lock);
0348 
0349     pm_runtime_set_autosuspend_delay(&pci_dev->dev, 1000);
0350     pm_runtime_use_autosuspend(&pci_dev->dev);
0351     pm_runtime_put_autosuspend(&pci_dev->dev);
0352     pm_runtime_allow(&pci_dev->dev);
0353 
0354     privdata->probed = true;
0355 
0356     pci_info(pci_dev, "MP2 device registered.\n");
0357     return 0;
0358 }
0359 
0360 static void amd_mp2_pci_remove(struct pci_dev *pci_dev)
0361 {
0362     struct amd_mp2_dev *privdata = pci_get_drvdata(pci_dev);
0363 
0364     pm_runtime_forbid(&pci_dev->dev);
0365     pm_runtime_get_noresume(&pci_dev->dev);
0366 
0367     pci_intx(pci_dev, 0);
0368     pci_clear_master(pci_dev);
0369 
0370     amd_mp2_clear_reg(privdata);
0371 }
0372 
0373 #ifdef CONFIG_PM
0374 static int amd_mp2_pci_suspend(struct device *dev)
0375 {
0376     struct pci_dev *pci_dev = to_pci_dev(dev);
0377     struct amd_mp2_dev *privdata = pci_get_drvdata(pci_dev);
0378     struct amd_i2c_common *i2c_common;
0379     unsigned int bus_id;
0380     int ret = 0;
0381 
0382     for (bus_id = 0; bus_id < 2; bus_id++) {
0383         i2c_common = privdata->busses[bus_id];
0384         if (i2c_common)
0385             i2c_common->suspend(i2c_common);
0386     }
0387 
0388     ret = pci_save_state(pci_dev);
0389     if (ret) {
0390         pci_err(pci_dev, "pci_save_state failed = %d\n", ret);
0391         return ret;
0392     }
0393 
0394     pci_disable_device(pci_dev);
0395     return ret;
0396 }
0397 
0398 static int amd_mp2_pci_resume(struct device *dev)
0399 {
0400     struct pci_dev *pci_dev = to_pci_dev(dev);
0401     struct amd_mp2_dev *privdata = pci_get_drvdata(pci_dev);
0402     struct amd_i2c_common *i2c_common;
0403     unsigned int bus_id;
0404     int ret = 0;
0405 
0406     pci_restore_state(pci_dev);
0407     ret = pci_enable_device(pci_dev);
0408     if (ret < 0) {
0409         pci_err(pci_dev, "pci_enable_device failed = %d\n", ret);
0410         return ret;
0411     }
0412 
0413     for (bus_id = 0; bus_id < 2; bus_id++) {
0414         i2c_common = privdata->busses[bus_id];
0415         if (i2c_common) {
0416             ret = i2c_common->resume(i2c_common);
0417             if (ret < 0)
0418                 return ret;
0419         }
0420     }
0421 
0422     return ret;
0423 }
0424 
0425 static UNIVERSAL_DEV_PM_OPS(amd_mp2_pci_pm_ops, amd_mp2_pci_suspend,
0426                 amd_mp2_pci_resume, NULL);
0427 #endif /* CONFIG_PM */
0428 
0429 static const struct pci_device_id amd_mp2_pci_tbl[] = {
0430     {PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_MP2)},
0431     {0}
0432 };
0433 MODULE_DEVICE_TABLE(pci, amd_mp2_pci_tbl);
0434 
0435 static struct pci_driver amd_mp2_pci_driver = {
0436     .name       = "i2c_amd_mp2",
0437     .id_table   = amd_mp2_pci_tbl,
0438     .probe      = amd_mp2_pci_probe,
0439     .remove     = amd_mp2_pci_remove,
0440 #ifdef CONFIG_PM
0441     .driver = {
0442         .pm = &amd_mp2_pci_pm_ops,
0443     },
0444 #endif
0445 };
0446 module_pci_driver(amd_mp2_pci_driver);
0447 
0448 struct amd_mp2_dev *amd_mp2_find_device(void)
0449 {
0450     struct device *dev;
0451     struct pci_dev *pci_dev;
0452 
0453     dev = driver_find_next_device(&amd_mp2_pci_driver.driver, NULL);
0454     if (!dev)
0455         return NULL;
0456 
0457     pci_dev = to_pci_dev(dev);
0458     return (struct amd_mp2_dev *)pci_get_drvdata(pci_dev);
0459 }
0460 EXPORT_SYMBOL_GPL(amd_mp2_find_device);
0461 
0462 MODULE_DESCRIPTION("AMD(R) PCI-E MP2 I2C Controller Driver");
0463 MODULE_AUTHOR("Shyam Sundar S K <Shyam-sundar.S-k@amd.com>");
0464 MODULE_AUTHOR("Elie Morisse <syniurge@gmail.com>");
0465 MODULE_LICENSE("Dual BSD/GPL");