0001
0002
0003
0004
0005
0006
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
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
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
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");