0001
0002
0003
0004
0005
0006 #include <linux/acpi.h>
0007 #include <linux/bitfield.h>
0008 #include <linux/module.h>
0009 #include <net/rtnetlink.h>
0010
0011 #include "iosm_ipc_imem.h"
0012 #include "iosm_ipc_pcie.h"
0013 #include "iosm_ipc_protocol.h"
0014
0015 MODULE_DESCRIPTION("IOSM Driver");
0016 MODULE_LICENSE("GPL v2");
0017
0018
0019 static guid_t wwan_acpi_guid = GUID_INIT(0xbad01b75, 0x22a8, 0x4f48, 0x87, 0x92,
0020 0xbd, 0xde, 0x94, 0x67, 0x74, 0x7d);
0021
0022 static void ipc_pcie_resources_release(struct iosm_pcie *ipc_pcie)
0023 {
0024
0025 ipc_release_irq(ipc_pcie);
0026
0027
0028 iounmap(ipc_pcie->scratchpad);
0029
0030
0031 iounmap(ipc_pcie->ipc_regs);
0032
0033
0034
0035
0036
0037 pci_release_regions(ipc_pcie->pci);
0038 }
0039
0040 static void ipc_pcie_cleanup(struct iosm_pcie *ipc_pcie)
0041 {
0042
0043 ipc_imem_cleanup(ipc_pcie->imem);
0044
0045 ipc_pcie_resources_release(ipc_pcie);
0046
0047
0048 pci_disable_device(ipc_pcie->pci);
0049 }
0050
0051 static void ipc_pcie_deinit(struct iosm_pcie *ipc_pcie)
0052 {
0053 kfree(ipc_pcie->imem);
0054 kfree(ipc_pcie);
0055 }
0056
0057 static void ipc_pcie_remove(struct pci_dev *pci)
0058 {
0059 struct iosm_pcie *ipc_pcie = pci_get_drvdata(pci);
0060
0061 ipc_pcie_cleanup(ipc_pcie);
0062
0063 ipc_pcie_deinit(ipc_pcie);
0064 }
0065
0066 static int ipc_pcie_resources_request(struct iosm_pcie *ipc_pcie)
0067 {
0068 struct pci_dev *pci = ipc_pcie->pci;
0069 u32 cap = 0;
0070 u32 ret;
0071
0072
0073
0074
0075
0076 ret = pci_request_regions(pci, "IOSM_IPC");
0077 if (ret) {
0078 dev_err(ipc_pcie->dev, "failed pci request regions");
0079 goto pci_request_region_fail;
0080 }
0081
0082
0083
0084
0085
0086
0087 ipc_pcie->ipc_regs = pci_ioremap_bar(pci, ipc_pcie->ipc_regs_bar_nr);
0088
0089 if (!ipc_pcie->ipc_regs) {
0090 dev_err(ipc_pcie->dev, "IPC REGS ioremap error");
0091 ret = -EBUSY;
0092 goto ipc_regs_remap_fail;
0093 }
0094
0095
0096
0097
0098
0099
0100 ipc_pcie->scratchpad =
0101 pci_ioremap_bar(pci, ipc_pcie->scratchpad_bar_nr);
0102
0103 if (!ipc_pcie->scratchpad) {
0104 dev_err(ipc_pcie->dev, "doorbell scratchpad ioremap error");
0105 ret = -EBUSY;
0106 goto scratch_remap_fail;
0107 }
0108
0109
0110 ret = ipc_acquire_irq(ipc_pcie);
0111 if (ret) {
0112 dev_err(ipc_pcie->dev, "acquiring MSI irq failed!");
0113 goto irq_acquire_fail;
0114 }
0115
0116
0117 pci_set_master(pci);
0118
0119
0120
0121
0122 pcie_capability_read_dword(ipc_pcie->pci, PCI_EXP_DEVCAP2, &cap);
0123 if (cap & PCI_EXP_DEVCAP2_LTR)
0124 pcie_capability_set_word(ipc_pcie->pci, PCI_EXP_DEVCTL2,
0125 PCI_EXP_DEVCTL2_LTR_EN);
0126
0127 dev_dbg(ipc_pcie->dev, "link between AP and CP is fully on");
0128
0129 return ret;
0130
0131 irq_acquire_fail:
0132 iounmap(ipc_pcie->scratchpad);
0133 scratch_remap_fail:
0134 iounmap(ipc_pcie->ipc_regs);
0135 ipc_regs_remap_fail:
0136 pci_release_regions(pci);
0137 pci_request_region_fail:
0138 return ret;
0139 }
0140
0141 bool ipc_pcie_check_aspm_enabled(struct iosm_pcie *ipc_pcie,
0142 bool parent)
0143 {
0144 struct pci_dev *pdev;
0145 u16 value = 0;
0146 u32 enabled;
0147
0148 if (parent)
0149 pdev = ipc_pcie->pci->bus->self;
0150 else
0151 pdev = ipc_pcie->pci;
0152
0153 pcie_capability_read_word(pdev, PCI_EXP_LNKCTL, &value);
0154 enabled = value & PCI_EXP_LNKCTL_ASPMC;
0155 dev_dbg(ipc_pcie->dev, "ASPM L1: 0x%04X 0x%03X", pdev->device, value);
0156
0157 return (enabled == PCI_EXP_LNKCTL_ASPM_L1 ||
0158 enabled == PCI_EXP_LNKCTL_ASPMC);
0159 }
0160
0161 bool ipc_pcie_check_data_link_active(struct iosm_pcie *ipc_pcie)
0162 {
0163 struct pci_dev *parent;
0164 u16 link_status = 0;
0165
0166 if (!ipc_pcie->pci->bus || !ipc_pcie->pci->bus->self) {
0167 dev_err(ipc_pcie->dev, "root port not found");
0168 return false;
0169 }
0170
0171 parent = ipc_pcie->pci->bus->self;
0172
0173 pcie_capability_read_word(parent, PCI_EXP_LNKSTA, &link_status);
0174 dev_dbg(ipc_pcie->dev, "Link status: 0x%04X", link_status);
0175
0176 return link_status & PCI_EXP_LNKSTA_DLLLA;
0177 }
0178
0179 static bool ipc_pcie_check_aspm_supported(struct iosm_pcie *ipc_pcie,
0180 bool parent)
0181 {
0182 struct pci_dev *pdev;
0183 u32 support;
0184 u32 cap = 0;
0185
0186 if (parent)
0187 pdev = ipc_pcie->pci->bus->self;
0188 else
0189 pdev = ipc_pcie->pci;
0190 pcie_capability_read_dword(pdev, PCI_EXP_LNKCAP, &cap);
0191 support = u32_get_bits(cap, PCI_EXP_LNKCAP_ASPMS);
0192 if (support < PCI_EXP_LNKCTL_ASPM_L1) {
0193 dev_dbg(ipc_pcie->dev, "ASPM L1 not supported: 0x%04X",
0194 pdev->device);
0195 return false;
0196 }
0197 return true;
0198 }
0199
0200 void ipc_pcie_config_aspm(struct iosm_pcie *ipc_pcie)
0201 {
0202 bool parent_aspm_enabled, dev_aspm_enabled;
0203
0204
0205 if (!ipc_pcie_check_aspm_supported(ipc_pcie, true) ||
0206 !ipc_pcie_check_aspm_supported(ipc_pcie, false))
0207 return;
0208
0209 parent_aspm_enabled = ipc_pcie_check_aspm_enabled(ipc_pcie, true);
0210 dev_aspm_enabled = ipc_pcie_check_aspm_enabled(ipc_pcie, false);
0211
0212 dev_dbg(ipc_pcie->dev, "ASPM parent: %s device: %s",
0213 parent_aspm_enabled ? "Enabled" : "Disabled",
0214 dev_aspm_enabled ? "Enabled" : "Disabled");
0215 }
0216
0217
0218 static void ipc_pcie_config_init(struct iosm_pcie *ipc_pcie)
0219 {
0220
0221 ipc_pcie->ipc_regs_bar_nr = IPC_DOORBELL_BAR0;
0222
0223
0224 ipc_pcie->scratchpad_bar_nr = IPC_SCRATCHPAD_BAR2;
0225 ipc_pcie->doorbell_reg_offset = IPC_DOORBELL_CH_OFFSET;
0226 ipc_pcie->doorbell_write = IPC_WRITE_PTR_REG_0;
0227 ipc_pcie->doorbell_capture = IPC_CAPTURE_PTR_REG_0;
0228 }
0229
0230
0231
0232
0233 static enum ipc_pcie_sleep_state ipc_pcie_read_bios_cfg(struct device *dev)
0234 {
0235 union acpi_object *object;
0236 acpi_handle handle_acpi;
0237
0238 handle_acpi = ACPI_HANDLE(dev);
0239 if (!handle_acpi) {
0240 pr_debug("pci device is NOT ACPI supporting device\n");
0241 goto default_ret;
0242 }
0243
0244 object = acpi_evaluate_dsm(handle_acpi, &wwan_acpi_guid, 0, 3, NULL);
0245
0246 if (object && object->integer.value == 3)
0247 return IPC_PCIE_D3L2;
0248
0249 default_ret:
0250 return IPC_PCIE_D0L12;
0251 }
0252
0253 static int ipc_pcie_probe(struct pci_dev *pci,
0254 const struct pci_device_id *pci_id)
0255 {
0256 struct iosm_pcie *ipc_pcie = kzalloc(sizeof(*ipc_pcie), GFP_KERNEL);
0257
0258 pr_debug("Probing device 0x%X from the vendor 0x%X", pci_id->device,
0259 pci_id->vendor);
0260
0261 if (!ipc_pcie)
0262 goto ret_fail;
0263
0264
0265 ipc_pcie->dev = &pci->dev;
0266
0267
0268 pci_set_drvdata(pci, ipc_pcie);
0269
0270
0271 ipc_pcie->pci = pci;
0272
0273
0274 ipc_pcie_config_init(ipc_pcie);
0275
0276
0277
0278
0279 if (pci_enable_device(pci)) {
0280 dev_err(ipc_pcie->dev, "failed to enable the AP PCIe device");
0281
0282
0283
0284
0285
0286 goto pci_enable_fail;
0287 }
0288
0289 ipc_pcie_config_aspm(ipc_pcie);
0290 dev_dbg(ipc_pcie->dev, "PCIe device enabled.");
0291
0292
0293
0294 ipc_pcie->d3l2_support = ipc_pcie_read_bios_cfg(&pci->dev);
0295
0296 ipc_pcie->suspend = 0;
0297
0298 if (ipc_pcie_resources_request(ipc_pcie))
0299 goto resources_req_fail;
0300
0301
0302 ipc_pcie->imem = ipc_imem_init(ipc_pcie, pci->device,
0303 ipc_pcie->scratchpad, ipc_pcie->dev);
0304 if (!ipc_pcie->imem) {
0305 dev_err(ipc_pcie->dev, "failed to init imem");
0306 goto imem_init_fail;
0307 }
0308
0309 return 0;
0310
0311 imem_init_fail:
0312 ipc_pcie_resources_release(ipc_pcie);
0313 resources_req_fail:
0314 pci_disable_device(pci);
0315 pci_enable_fail:
0316 kfree(ipc_pcie);
0317 ret_fail:
0318 return -EIO;
0319 }
0320
0321 static const struct pci_device_id iosm_ipc_ids[] = {
0322 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, INTEL_CP_DEVICE_7560_ID) },
0323 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, INTEL_CP_DEVICE_7360_ID) },
0324 {}
0325 };
0326 MODULE_DEVICE_TABLE(pci, iosm_ipc_ids);
0327
0328
0329
0330 static int __maybe_unused ipc_pcie_suspend_s2idle(struct iosm_pcie *ipc_pcie)
0331 {
0332 ipc_cp_irq_sleep_control(ipc_pcie, IPC_MEM_DEV_PM_FORCE_SLEEP);
0333
0334
0335 smp_mb__before_atomic();
0336
0337 set_bit(0, &ipc_pcie->suspend);
0338
0339
0340 smp_mb__after_atomic();
0341
0342 ipc_imem_pm_s2idle_sleep(ipc_pcie->imem, true);
0343
0344 return 0;
0345 }
0346
0347
0348
0349 static int __maybe_unused ipc_pcie_resume_s2idle(struct iosm_pcie *ipc_pcie)
0350 {
0351 ipc_cp_irq_sleep_control(ipc_pcie, IPC_MEM_DEV_PM_FORCE_ACTIVE);
0352
0353 ipc_imem_pm_s2idle_sleep(ipc_pcie->imem, false);
0354
0355
0356 smp_mb__before_atomic();
0357
0358 clear_bit(0, &ipc_pcie->suspend);
0359
0360
0361 smp_mb__after_atomic();
0362 return 0;
0363 }
0364
0365 int __maybe_unused ipc_pcie_suspend(struct iosm_pcie *ipc_pcie)
0366 {
0367
0368 ipc_imem_pm_suspend(ipc_pcie->imem);
0369
0370 dev_dbg(ipc_pcie->dev, "SUSPEND done");
0371 return 0;
0372 }
0373
0374 int __maybe_unused ipc_pcie_resume(struct iosm_pcie *ipc_pcie)
0375 {
0376
0377
0378
0379 ipc_imem_pm_resume(ipc_pcie->imem);
0380
0381 dev_dbg(ipc_pcie->dev, "RESUME done");
0382 return 0;
0383 }
0384
0385 static int __maybe_unused ipc_pcie_suspend_cb(struct device *dev)
0386 {
0387 struct iosm_pcie *ipc_pcie;
0388 struct pci_dev *pdev;
0389
0390 pdev = to_pci_dev(dev);
0391
0392 ipc_pcie = pci_get_drvdata(pdev);
0393
0394 switch (ipc_pcie->d3l2_support) {
0395 case IPC_PCIE_D0L12:
0396 ipc_pcie_suspend_s2idle(ipc_pcie);
0397 break;
0398 case IPC_PCIE_D3L2:
0399 ipc_pcie_suspend(ipc_pcie);
0400 break;
0401 }
0402
0403 return 0;
0404 }
0405
0406 static int __maybe_unused ipc_pcie_resume_cb(struct device *dev)
0407 {
0408 struct iosm_pcie *ipc_pcie;
0409 struct pci_dev *pdev;
0410
0411 pdev = to_pci_dev(dev);
0412
0413 ipc_pcie = pci_get_drvdata(pdev);
0414
0415 switch (ipc_pcie->d3l2_support) {
0416 case IPC_PCIE_D0L12:
0417 ipc_pcie_resume_s2idle(ipc_pcie);
0418 break;
0419 case IPC_PCIE_D3L2:
0420 ipc_pcie_resume(ipc_pcie);
0421 break;
0422 }
0423
0424 return 0;
0425 }
0426
0427 static SIMPLE_DEV_PM_OPS(iosm_ipc_pm, ipc_pcie_suspend_cb, ipc_pcie_resume_cb);
0428
0429 static struct pci_driver iosm_ipc_driver = {
0430 .name = KBUILD_MODNAME,
0431 .probe = ipc_pcie_probe,
0432 .remove = ipc_pcie_remove,
0433 .driver = {
0434 .pm = &iosm_ipc_pm,
0435 },
0436 .id_table = iosm_ipc_ids,
0437 };
0438 module_pci_driver(iosm_ipc_driver);
0439
0440 int ipc_pcie_addr_map(struct iosm_pcie *ipc_pcie, unsigned char *data,
0441 size_t size, dma_addr_t *mapping, int direction)
0442 {
0443 if (ipc_pcie->pci) {
0444 *mapping = dma_map_single(&ipc_pcie->pci->dev, data, size,
0445 direction);
0446 if (dma_mapping_error(&ipc_pcie->pci->dev, *mapping)) {
0447 dev_err(ipc_pcie->dev, "dma mapping failed");
0448 return -EINVAL;
0449 }
0450 }
0451 return 0;
0452 }
0453
0454 void ipc_pcie_addr_unmap(struct iosm_pcie *ipc_pcie, size_t size,
0455 dma_addr_t mapping, int direction)
0456 {
0457 if (!mapping)
0458 return;
0459 if (ipc_pcie->pci)
0460 dma_unmap_single(&ipc_pcie->pci->dev, mapping, size, direction);
0461 }
0462
0463 struct sk_buff *ipc_pcie_alloc_local_skb(struct iosm_pcie *ipc_pcie,
0464 gfp_t flags, size_t size)
0465 {
0466 struct sk_buff *skb;
0467
0468 if (!ipc_pcie || !size) {
0469 pr_err("invalid pcie object or size");
0470 return NULL;
0471 }
0472
0473 skb = __netdev_alloc_skb(NULL, size, flags);
0474 if (!skb)
0475 return NULL;
0476
0477 IPC_CB(skb)->op_type = (u8)UL_DEFAULT;
0478 IPC_CB(skb)->mapping = 0;
0479
0480 return skb;
0481 }
0482
0483 struct sk_buff *ipc_pcie_alloc_skb(struct iosm_pcie *ipc_pcie, size_t size,
0484 gfp_t flags, dma_addr_t *mapping,
0485 int direction, size_t headroom)
0486 {
0487 struct sk_buff *skb = ipc_pcie_alloc_local_skb(ipc_pcie, flags,
0488 size + headroom);
0489 if (!skb)
0490 return NULL;
0491
0492 if (headroom)
0493 skb_reserve(skb, headroom);
0494
0495 if (ipc_pcie_addr_map(ipc_pcie, skb->data, size, mapping, direction)) {
0496 dev_kfree_skb(skb);
0497 return NULL;
0498 }
0499
0500 BUILD_BUG_ON(sizeof(*IPC_CB(skb)) > sizeof(skb->cb));
0501
0502
0503 IPC_CB(skb)->mapping = *mapping;
0504 IPC_CB(skb)->direction = direction;
0505 IPC_CB(skb)->len = size;
0506
0507 return skb;
0508 }
0509
0510 void ipc_pcie_kfree_skb(struct iosm_pcie *ipc_pcie, struct sk_buff *skb)
0511 {
0512 if (!skb)
0513 return;
0514
0515 ipc_pcie_addr_unmap(ipc_pcie, IPC_CB(skb)->len, IPC_CB(skb)->mapping,
0516 IPC_CB(skb)->direction);
0517 IPC_CB(skb)->mapping = 0;
0518 dev_kfree_skb(skb);
0519 }