1
2
3
4
5
6#include <linux/acpi.h>
7#include <linux/bitfield.h>
8#include <linux/module.h>
9#include <net/rtnetlink.h>
10
11#include "iosm_ipc_imem.h"
12#include "iosm_ipc_pcie.h"
13#include "iosm_ipc_protocol.h"
14
15MODULE_DESCRIPTION("IOSM Driver");
16MODULE_LICENSE("GPL v2");
17
18
19static guid_t wwan_acpi_guid = GUID_INIT(0xbad01b75, 0x22a8, 0x4f48, 0x87, 0x92,
20 0xbd, 0xde, 0x94, 0x67, 0x74, 0x7d);
21
22static void ipc_pcie_resources_release(struct iosm_pcie *ipc_pcie)
23{
24
25 ipc_release_irq(ipc_pcie);
26
27
28 iounmap(ipc_pcie->scratchpad);
29
30
31 iounmap(ipc_pcie->ipc_regs);
32
33
34
35
36
37 pci_release_regions(ipc_pcie->pci);
38}
39
40static void ipc_pcie_cleanup(struct iosm_pcie *ipc_pcie)
41{
42
43 ipc_imem_cleanup(ipc_pcie->imem);
44
45 ipc_pcie_resources_release(ipc_pcie);
46
47
48 pci_disable_device(ipc_pcie->pci);
49}
50
51static void ipc_pcie_deinit(struct iosm_pcie *ipc_pcie)
52{
53 kfree(ipc_pcie->imem);
54 kfree(ipc_pcie);
55}
56
57static void ipc_pcie_remove(struct pci_dev *pci)
58{
59 struct iosm_pcie *ipc_pcie = pci_get_drvdata(pci);
60
61 ipc_pcie_cleanup(ipc_pcie);
62
63 ipc_pcie_deinit(ipc_pcie);
64}
65
66static int ipc_pcie_resources_request(struct iosm_pcie *ipc_pcie)
67{
68 struct pci_dev *pci = ipc_pcie->pci;
69 u32 cap = 0;
70 u32 ret;
71
72
73
74
75
76 ret = pci_request_regions(pci, "IOSM_IPC");
77 if (ret) {
78 dev_err(ipc_pcie->dev, "failed pci request regions");
79 goto pci_request_region_fail;
80 }
81
82
83
84
85
86
87 ipc_pcie->ipc_regs = pci_ioremap_bar(pci, ipc_pcie->ipc_regs_bar_nr);
88
89 if (!ipc_pcie->ipc_regs) {
90 dev_err(ipc_pcie->dev, "IPC REGS ioremap error");
91 ret = -EBUSY;
92 goto ipc_regs_remap_fail;
93 }
94
95
96
97
98
99
100 ipc_pcie->scratchpad =
101 pci_ioremap_bar(pci, ipc_pcie->scratchpad_bar_nr);
102
103 if (!ipc_pcie->scratchpad) {
104 dev_err(ipc_pcie->dev, "doorbell scratchpad ioremap error");
105 ret = -EBUSY;
106 goto scratch_remap_fail;
107 }
108
109
110 ret = ipc_acquire_irq(ipc_pcie);
111 if (ret) {
112 dev_err(ipc_pcie->dev, "acquiring MSI irq failed!");
113 goto irq_acquire_fail;
114 }
115
116
117 pci_set_master(pci);
118
119
120
121
122 pcie_capability_read_dword(ipc_pcie->pci, PCI_EXP_DEVCAP2, &cap);
123 if (cap & PCI_EXP_DEVCAP2_LTR)
124 pcie_capability_set_word(ipc_pcie->pci, PCI_EXP_DEVCTL2,
125 PCI_EXP_DEVCTL2_LTR_EN);
126
127 dev_dbg(ipc_pcie->dev, "link between AP and CP is fully on");
128
129 return ret;
130
131irq_acquire_fail:
132 iounmap(ipc_pcie->scratchpad);
133scratch_remap_fail:
134 iounmap(ipc_pcie->ipc_regs);
135ipc_regs_remap_fail:
136 pci_release_regions(pci);
137pci_request_region_fail:
138 return ret;
139}
140
141bool ipc_pcie_check_aspm_enabled(struct iosm_pcie *ipc_pcie,
142 bool parent)
143{
144 struct pci_dev *pdev;
145 u16 value = 0;
146 u32 enabled;
147
148 if (parent)
149 pdev = ipc_pcie->pci->bus->self;
150 else
151 pdev = ipc_pcie->pci;
152
153 pcie_capability_read_word(pdev, PCI_EXP_LNKCTL, &value);
154 enabled = value & PCI_EXP_LNKCTL_ASPMC;
155 dev_dbg(ipc_pcie->dev, "ASPM L1: 0x%04X 0x%03X", pdev->device, value);
156
157 return (enabled == PCI_EXP_LNKCTL_ASPM_L1 ||
158 enabled == PCI_EXP_LNKCTL_ASPMC);
159}
160
161bool ipc_pcie_check_data_link_active(struct iosm_pcie *ipc_pcie)
162{
163 struct pci_dev *parent;
164 u16 link_status = 0;
165
166 if (!ipc_pcie->pci->bus || !ipc_pcie->pci->bus->self) {
167 dev_err(ipc_pcie->dev, "root port not found");
168 return false;
169 }
170
171 parent = ipc_pcie->pci->bus->self;
172
173 pcie_capability_read_word(parent, PCI_EXP_LNKSTA, &link_status);
174 dev_dbg(ipc_pcie->dev, "Link status: 0x%04X", link_status);
175
176 return link_status & PCI_EXP_LNKSTA_DLLLA;
177}
178
179static bool ipc_pcie_check_aspm_supported(struct iosm_pcie *ipc_pcie,
180 bool parent)
181{
182 struct pci_dev *pdev;
183 u32 support;
184 u32 cap = 0;
185
186 if (parent)
187 pdev = ipc_pcie->pci->bus->self;
188 else
189 pdev = ipc_pcie->pci;
190 pcie_capability_read_dword(pdev, PCI_EXP_LNKCAP, &cap);
191 support = u32_get_bits(cap, PCI_EXP_LNKCAP_ASPMS);
192 if (support < PCI_EXP_LNKCTL_ASPM_L1) {
193 dev_dbg(ipc_pcie->dev, "ASPM L1 not supported: 0x%04X",
194 pdev->device);
195 return false;
196 }
197 return true;
198}
199
200void ipc_pcie_config_aspm(struct iosm_pcie *ipc_pcie)
201{
202 bool parent_aspm_enabled, dev_aspm_enabled;
203
204
205 if (!ipc_pcie_check_aspm_supported(ipc_pcie, true) ||
206 !ipc_pcie_check_aspm_supported(ipc_pcie, false))
207 return;
208
209 parent_aspm_enabled = ipc_pcie_check_aspm_enabled(ipc_pcie, true);
210 dev_aspm_enabled = ipc_pcie_check_aspm_enabled(ipc_pcie, false);
211
212 dev_dbg(ipc_pcie->dev, "ASPM parent: %s device: %s",
213 parent_aspm_enabled ? "Enabled" : "Disabled",
214 dev_aspm_enabled ? "Enabled" : "Disabled");
215}
216
217
218static void ipc_pcie_config_init(struct iosm_pcie *ipc_pcie)
219{
220
221 ipc_pcie->ipc_regs_bar_nr = IPC_DOORBELL_BAR0;
222
223
224 ipc_pcie->scratchpad_bar_nr = IPC_SCRATCHPAD_BAR2;
225 ipc_pcie->doorbell_reg_offset = IPC_DOORBELL_CH_OFFSET;
226 ipc_pcie->doorbell_write = IPC_WRITE_PTR_REG_0;
227 ipc_pcie->doorbell_capture = IPC_CAPTURE_PTR_REG_0;
228}
229
230
231
232
233static enum ipc_pcie_sleep_state ipc_pcie_read_bios_cfg(struct device *dev)
234{
235 union acpi_object *object;
236 acpi_handle handle_acpi;
237
238 handle_acpi = ACPI_HANDLE(dev);
239 if (!handle_acpi) {
240 pr_debug("pci device is NOT ACPI supporting device\n");
241 goto default_ret;
242 }
243
244 object = acpi_evaluate_dsm(handle_acpi, &wwan_acpi_guid, 0, 3, NULL);
245
246 if (object && object->integer.value == 3)
247 return IPC_PCIE_D3L2;
248
249default_ret:
250 return IPC_PCIE_D0L12;
251}
252
253static int ipc_pcie_probe(struct pci_dev *pci,
254 const struct pci_device_id *pci_id)
255{
256 struct iosm_pcie *ipc_pcie = kzalloc(sizeof(*ipc_pcie), GFP_KERNEL);
257
258 pr_debug("Probing device 0x%X from the vendor 0x%X", pci_id->device,
259 pci_id->vendor);
260
261 if (!ipc_pcie)
262 goto ret_fail;
263
264
265 ipc_pcie->dev = &pci->dev;
266
267
268 pci_set_drvdata(pci, ipc_pcie);
269
270
271 ipc_pcie->pci = pci;
272
273
274 ipc_pcie_config_init(ipc_pcie);
275
276
277
278
279 if (pci_enable_device(pci)) {
280 dev_err(ipc_pcie->dev, "failed to enable the AP PCIe device");
281
282
283
284
285
286 goto pci_enable_fail;
287 }
288
289 ipc_pcie_config_aspm(ipc_pcie);
290 dev_dbg(ipc_pcie->dev, "PCIe device enabled.");
291
292
293
294 ipc_pcie->d3l2_support = ipc_pcie_read_bios_cfg(&pci->dev);
295
296 ipc_pcie->suspend = 0;
297
298 if (ipc_pcie_resources_request(ipc_pcie))
299 goto resources_req_fail;
300
301
302 ipc_pcie->imem = ipc_imem_init(ipc_pcie, pci->device,
303 ipc_pcie->scratchpad, ipc_pcie->dev);
304 if (!ipc_pcie->imem) {
305 dev_err(ipc_pcie->dev, "failed to init imem");
306 goto imem_init_fail;
307 }
308
309 return 0;
310
311imem_init_fail:
312 ipc_pcie_resources_release(ipc_pcie);
313resources_req_fail:
314 pci_disable_device(pci);
315pci_enable_fail:
316 kfree(ipc_pcie);
317ret_fail:
318 return -EIO;
319}
320
321static const struct pci_device_id iosm_ipc_ids[] = {
322 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, INTEL_CP_DEVICE_7560_ID) },
323 {}
324};
325MODULE_DEVICE_TABLE(pci, iosm_ipc_ids);
326
327
328
329static int __maybe_unused ipc_pcie_suspend_s2idle(struct iosm_pcie *ipc_pcie)
330{
331 ipc_cp_irq_sleep_control(ipc_pcie, IPC_MEM_DEV_PM_FORCE_SLEEP);
332
333
334 smp_mb__before_atomic();
335
336 set_bit(0, &ipc_pcie->suspend);
337
338
339 smp_mb__after_atomic();
340
341 ipc_imem_pm_s2idle_sleep(ipc_pcie->imem, true);
342
343 return 0;
344}
345
346
347
348static int __maybe_unused ipc_pcie_resume_s2idle(struct iosm_pcie *ipc_pcie)
349{
350 ipc_cp_irq_sleep_control(ipc_pcie, IPC_MEM_DEV_PM_FORCE_ACTIVE);
351
352 ipc_imem_pm_s2idle_sleep(ipc_pcie->imem, false);
353
354
355 smp_mb__before_atomic();
356
357 clear_bit(0, &ipc_pcie->suspend);
358
359
360 smp_mb__after_atomic();
361 return 0;
362}
363
364int __maybe_unused ipc_pcie_suspend(struct iosm_pcie *ipc_pcie)
365{
366 struct pci_dev *pdev;
367 int ret;
368
369 pdev = ipc_pcie->pci;
370
371
372 if (pdev->current_state != PCI_D0) {
373 dev_dbg(ipc_pcie->dev, "done for PM=%d", pdev->current_state);
374 return 0;
375 }
376
377
378 ipc_imem_pm_suspend(ipc_pcie->imem);
379
380
381 ret = pci_save_state(pdev);
382
383 if (ret) {
384 dev_err(ipc_pcie->dev, "pci_save_state error=%d", ret);
385 return ret;
386 }
387
388
389
390
391
392 ret = pci_set_power_state(pdev, PCI_D3cold);
393
394 if (ret) {
395 dev_err(ipc_pcie->dev, "pci_set_power_state error=%d", ret);
396 return ret;
397 }
398
399 dev_dbg(ipc_pcie->dev, "SUSPEND done");
400 return ret;
401}
402
403int __maybe_unused ipc_pcie_resume(struct iosm_pcie *ipc_pcie)
404{
405 int ret;
406
407
408
409
410
411 ret = pci_set_power_state(ipc_pcie->pci, PCI_D0);
412
413 if (ret) {
414 dev_err(ipc_pcie->dev, "pci_set_power_state error=%d", ret);
415 return ret;
416 }
417
418 pci_restore_state(ipc_pcie->pci);
419
420
421
422
423 ipc_imem_pm_resume(ipc_pcie->imem);
424
425 dev_dbg(ipc_pcie->dev, "RESUME done");
426 return ret;
427}
428
429static int __maybe_unused ipc_pcie_suspend_cb(struct device *dev)
430{
431 struct iosm_pcie *ipc_pcie;
432 struct pci_dev *pdev;
433
434 pdev = to_pci_dev(dev);
435
436 ipc_pcie = pci_get_drvdata(pdev);
437
438 switch (ipc_pcie->d3l2_support) {
439 case IPC_PCIE_D0L12:
440 ipc_pcie_suspend_s2idle(ipc_pcie);
441 break;
442 case IPC_PCIE_D3L2:
443 ipc_pcie_suspend(ipc_pcie);
444 break;
445 }
446
447 return 0;
448}
449
450static int __maybe_unused ipc_pcie_resume_cb(struct device *dev)
451{
452 struct iosm_pcie *ipc_pcie;
453 struct pci_dev *pdev;
454
455 pdev = to_pci_dev(dev);
456
457 ipc_pcie = pci_get_drvdata(pdev);
458
459 switch (ipc_pcie->d3l2_support) {
460 case IPC_PCIE_D0L12:
461 ipc_pcie_resume_s2idle(ipc_pcie);
462 break;
463 case IPC_PCIE_D3L2:
464 ipc_pcie_resume(ipc_pcie);
465 break;
466 }
467
468 return 0;
469}
470
471static SIMPLE_DEV_PM_OPS(iosm_ipc_pm, ipc_pcie_suspend_cb, ipc_pcie_resume_cb);
472
473static struct pci_driver iosm_ipc_driver = {
474 .name = KBUILD_MODNAME,
475 .probe = ipc_pcie_probe,
476 .remove = ipc_pcie_remove,
477 .driver = {
478 .pm = &iosm_ipc_pm,
479 },
480 .id_table = iosm_ipc_ids,
481};
482module_pci_driver(iosm_ipc_driver);
483
484int ipc_pcie_addr_map(struct iosm_pcie *ipc_pcie, unsigned char *data,
485 size_t size, dma_addr_t *mapping, int direction)
486{
487 if (ipc_pcie->pci) {
488 *mapping = dma_map_single(&ipc_pcie->pci->dev, data, size,
489 direction);
490 if (dma_mapping_error(&ipc_pcie->pci->dev, *mapping)) {
491 dev_err(ipc_pcie->dev, "dma mapping failed");
492 return -EINVAL;
493 }
494 }
495 return 0;
496}
497
498void ipc_pcie_addr_unmap(struct iosm_pcie *ipc_pcie, size_t size,
499 dma_addr_t mapping, int direction)
500{
501 if (!mapping)
502 return;
503 if (ipc_pcie->pci)
504 dma_unmap_single(&ipc_pcie->pci->dev, mapping, size, direction);
505}
506
507struct sk_buff *ipc_pcie_alloc_local_skb(struct iosm_pcie *ipc_pcie,
508 gfp_t flags, size_t size)
509{
510 struct sk_buff *skb;
511
512 if (!ipc_pcie || !size) {
513 pr_err("invalid pcie object or size");
514 return NULL;
515 }
516
517 skb = __netdev_alloc_skb(NULL, size, flags);
518 if (!skb)
519 return NULL;
520
521 IPC_CB(skb)->op_type = (u8)UL_DEFAULT;
522 IPC_CB(skb)->mapping = 0;
523
524 return skb;
525}
526
527struct sk_buff *ipc_pcie_alloc_skb(struct iosm_pcie *ipc_pcie, size_t size,
528 gfp_t flags, dma_addr_t *mapping,
529 int direction, size_t headroom)
530{
531 struct sk_buff *skb = ipc_pcie_alloc_local_skb(ipc_pcie, flags,
532 size + headroom);
533 if (!skb)
534 return NULL;
535
536 if (headroom)
537 skb_reserve(skb, headroom);
538
539 if (ipc_pcie_addr_map(ipc_pcie, skb->data, size, mapping, direction)) {
540 dev_kfree_skb(skb);
541 return NULL;
542 }
543
544 BUILD_BUG_ON(sizeof(*IPC_CB(skb)) > sizeof(skb->cb));
545
546
547 IPC_CB(skb)->mapping = *mapping;
548 IPC_CB(skb)->direction = direction;
549 IPC_CB(skb)->len = size;
550
551 return skb;
552}
553
554void ipc_pcie_kfree_skb(struct iosm_pcie *ipc_pcie, struct sk_buff *skb)
555{
556 if (!skb)
557 return;
558
559 ipc_pcie_addr_unmap(ipc_pcie, IPC_CB(skb)->len, IPC_CB(skb)->mapping,
560 IPC_CB(skb)->direction);
561 IPC_CB(skb)->mapping = 0;
562 dev_kfree_skb(skb);
563}
564