• Home
  • Raw
  • Download

Lines Matching refs:ipc_pcie

22 static void ipc_pcie_resources_release(struct iosm_pcie *ipc_pcie)  in ipc_pcie_resources_release()  argument
25 ipc_release_irq(ipc_pcie); in ipc_pcie_resources_release()
28 iounmap(ipc_pcie->scratchpad); in ipc_pcie_resources_release()
31 iounmap(ipc_pcie->ipc_regs); in ipc_pcie_resources_release()
37 pci_release_regions(ipc_pcie->pci); in ipc_pcie_resources_release()
40 static void ipc_pcie_cleanup(struct iosm_pcie *ipc_pcie) in ipc_pcie_cleanup() argument
43 ipc_imem_cleanup(ipc_pcie->imem); in ipc_pcie_cleanup()
45 ipc_pcie_resources_release(ipc_pcie); in ipc_pcie_cleanup()
48 pci_disable_device(ipc_pcie->pci); in ipc_pcie_cleanup()
51 static void ipc_pcie_deinit(struct iosm_pcie *ipc_pcie) in ipc_pcie_deinit() argument
53 kfree(ipc_pcie->imem); in ipc_pcie_deinit()
54 kfree(ipc_pcie); in ipc_pcie_deinit()
59 struct iosm_pcie *ipc_pcie = pci_get_drvdata(pci); in ipc_pcie_remove() local
61 ipc_pcie_cleanup(ipc_pcie); in ipc_pcie_remove()
63 ipc_pcie_deinit(ipc_pcie); in ipc_pcie_remove()
66 static int ipc_pcie_resources_request(struct iosm_pcie *ipc_pcie) in ipc_pcie_resources_request() argument
68 struct pci_dev *pci = ipc_pcie->pci; in ipc_pcie_resources_request()
78 dev_err(ipc_pcie->dev, "failed pci request regions"); in ipc_pcie_resources_request()
87 ipc_pcie->ipc_regs = pci_ioremap_bar(pci, ipc_pcie->ipc_regs_bar_nr); in ipc_pcie_resources_request()
89 if (!ipc_pcie->ipc_regs) { in ipc_pcie_resources_request()
90 dev_err(ipc_pcie->dev, "IPC REGS ioremap error"); in ipc_pcie_resources_request()
100 ipc_pcie->scratchpad = in ipc_pcie_resources_request()
101 pci_ioremap_bar(pci, ipc_pcie->scratchpad_bar_nr); in ipc_pcie_resources_request()
103 if (!ipc_pcie->scratchpad) { in ipc_pcie_resources_request()
104 dev_err(ipc_pcie->dev, "doorbell scratchpad ioremap error"); in ipc_pcie_resources_request()
110 ret = ipc_acquire_irq(ipc_pcie); in ipc_pcie_resources_request()
112 dev_err(ipc_pcie->dev, "acquiring MSI irq failed!"); in ipc_pcie_resources_request()
122 pcie_capability_read_dword(ipc_pcie->pci, PCI_EXP_DEVCAP2, &cap); in ipc_pcie_resources_request()
124 pcie_capability_set_word(ipc_pcie->pci, PCI_EXP_DEVCTL2, in ipc_pcie_resources_request()
127 dev_dbg(ipc_pcie->dev, "link between AP and CP is fully on"); in ipc_pcie_resources_request()
132 iounmap(ipc_pcie->scratchpad); in ipc_pcie_resources_request()
134 iounmap(ipc_pcie->ipc_regs); in ipc_pcie_resources_request()
141 bool ipc_pcie_check_aspm_enabled(struct iosm_pcie *ipc_pcie, in ipc_pcie_check_aspm_enabled() argument
149 pdev = ipc_pcie->pci->bus->self; in ipc_pcie_check_aspm_enabled()
151 pdev = ipc_pcie->pci; in ipc_pcie_check_aspm_enabled()
155 dev_dbg(ipc_pcie->dev, "ASPM L1: 0x%04X 0x%03X", pdev->device, value); in ipc_pcie_check_aspm_enabled()
161 bool ipc_pcie_check_data_link_active(struct iosm_pcie *ipc_pcie) in ipc_pcie_check_data_link_active() argument
166 if (!ipc_pcie->pci->bus || !ipc_pcie->pci->bus->self) { in ipc_pcie_check_data_link_active()
167 dev_err(ipc_pcie->dev, "root port not found"); in ipc_pcie_check_data_link_active()
171 parent = ipc_pcie->pci->bus->self; in ipc_pcie_check_data_link_active()
174 dev_dbg(ipc_pcie->dev, "Link status: 0x%04X", link_status); in ipc_pcie_check_data_link_active()
179 static bool ipc_pcie_check_aspm_supported(struct iosm_pcie *ipc_pcie, in ipc_pcie_check_aspm_supported() argument
187 pdev = ipc_pcie->pci->bus->self; in ipc_pcie_check_aspm_supported()
189 pdev = ipc_pcie->pci; in ipc_pcie_check_aspm_supported()
193 dev_dbg(ipc_pcie->dev, "ASPM L1 not supported: 0x%04X", in ipc_pcie_check_aspm_supported()
200 void ipc_pcie_config_aspm(struct iosm_pcie *ipc_pcie) in ipc_pcie_config_aspm() argument
205 if (!ipc_pcie_check_aspm_supported(ipc_pcie, true) || in ipc_pcie_config_aspm()
206 !ipc_pcie_check_aspm_supported(ipc_pcie, false)) in ipc_pcie_config_aspm()
209 parent_aspm_enabled = ipc_pcie_check_aspm_enabled(ipc_pcie, true); in ipc_pcie_config_aspm()
210 dev_aspm_enabled = ipc_pcie_check_aspm_enabled(ipc_pcie, false); in ipc_pcie_config_aspm()
212 dev_dbg(ipc_pcie->dev, "ASPM parent: %s device: %s", in ipc_pcie_config_aspm()
218 static void ipc_pcie_config_init(struct iosm_pcie *ipc_pcie) in ipc_pcie_config_init() argument
221 ipc_pcie->ipc_regs_bar_nr = IPC_DOORBELL_BAR0; in ipc_pcie_config_init()
224 ipc_pcie->scratchpad_bar_nr = IPC_SCRATCHPAD_BAR2; in ipc_pcie_config_init()
225 ipc_pcie->doorbell_reg_offset = IPC_DOORBELL_CH_OFFSET; in ipc_pcie_config_init()
226 ipc_pcie->doorbell_write = IPC_WRITE_PTR_REG_0; in ipc_pcie_config_init()
227 ipc_pcie->doorbell_capture = IPC_CAPTURE_PTR_REG_0; in ipc_pcie_config_init()
261 struct iosm_pcie *ipc_pcie = kzalloc(sizeof(*ipc_pcie), GFP_KERNEL); in ipc_pcie_probe() local
266 if (!ipc_pcie) in ipc_pcie_probe()
270 ipc_pcie->dev = &pci->dev; in ipc_pcie_probe()
273 pci_set_drvdata(pci, ipc_pcie); in ipc_pcie_probe()
276 ipc_pcie->pci = pci; in ipc_pcie_probe()
279 ipc_pcie_config_init(ipc_pcie); in ipc_pcie_probe()
285 dev_err(ipc_pcie->dev, "failed to enable the AP PCIe device"); in ipc_pcie_probe()
294 ipc_pcie_config_aspm(ipc_pcie); in ipc_pcie_probe()
295 dev_dbg(ipc_pcie->dev, "PCIe device enabled."); in ipc_pcie_probe()
299 ipc_pcie->d3l2_support = ipc_pcie_read_bios_cfg(&pci->dev); in ipc_pcie_probe()
301 ipc_pcie->suspend = 0; in ipc_pcie_probe()
303 if (ipc_pcie_resources_request(ipc_pcie)) in ipc_pcie_probe()
307 ipc_pcie->imem = ipc_imem_init(ipc_pcie, pci->device, in ipc_pcie_probe()
308 ipc_pcie->scratchpad, ipc_pcie->dev); in ipc_pcie_probe()
309 if (!ipc_pcie->imem) { in ipc_pcie_probe()
310 dev_err(ipc_pcie->dev, "failed to init imem"); in ipc_pcie_probe()
317 ipc_pcie_resources_release(ipc_pcie); in ipc_pcie_probe()
321 kfree(ipc_pcie); in ipc_pcie_probe()
334 static int __maybe_unused ipc_pcie_suspend_s2idle(struct iosm_pcie *ipc_pcie) in ipc_pcie_suspend_s2idle() argument
336 ipc_cp_irq_sleep_control(ipc_pcie, IPC_MEM_DEV_PM_FORCE_SLEEP); in ipc_pcie_suspend_s2idle()
341 set_bit(0, &ipc_pcie->suspend); in ipc_pcie_suspend_s2idle()
346 ipc_imem_pm_s2idle_sleep(ipc_pcie->imem, true); in ipc_pcie_suspend_s2idle()
353 static int __maybe_unused ipc_pcie_resume_s2idle(struct iosm_pcie *ipc_pcie) in ipc_pcie_resume_s2idle() argument
355 ipc_cp_irq_sleep_control(ipc_pcie, IPC_MEM_DEV_PM_FORCE_ACTIVE); in ipc_pcie_resume_s2idle()
357 ipc_imem_pm_s2idle_sleep(ipc_pcie->imem, false); in ipc_pcie_resume_s2idle()
362 clear_bit(0, &ipc_pcie->suspend); in ipc_pcie_resume_s2idle()
369 int __maybe_unused ipc_pcie_suspend(struct iosm_pcie *ipc_pcie) in ipc_pcie_suspend() argument
374 pdev = ipc_pcie->pci; in ipc_pcie_suspend()
378 dev_dbg(ipc_pcie->dev, "done for PM=%d", pdev->current_state); in ipc_pcie_suspend()
383 ipc_imem_pm_suspend(ipc_pcie->imem); in ipc_pcie_suspend()
389 dev_err(ipc_pcie->dev, "pci_save_state error=%d", ret); in ipc_pcie_suspend()
400 dev_err(ipc_pcie->dev, "pci_set_power_state error=%d", ret); in ipc_pcie_suspend()
404 dev_dbg(ipc_pcie->dev, "SUSPEND done"); in ipc_pcie_suspend()
408 int __maybe_unused ipc_pcie_resume(struct iosm_pcie *ipc_pcie) in ipc_pcie_resume() argument
416 ret = pci_set_power_state(ipc_pcie->pci, PCI_D0); in ipc_pcie_resume()
419 dev_err(ipc_pcie->dev, "pci_set_power_state error=%d", ret); in ipc_pcie_resume()
423 pci_restore_state(ipc_pcie->pci); in ipc_pcie_resume()
428 ipc_imem_pm_resume(ipc_pcie->imem); in ipc_pcie_resume()
430 dev_dbg(ipc_pcie->dev, "RESUME done"); in ipc_pcie_resume()
436 struct iosm_pcie *ipc_pcie; in ipc_pcie_suspend_cb() local
441 ipc_pcie = pci_get_drvdata(pdev); in ipc_pcie_suspend_cb()
443 switch (ipc_pcie->d3l2_support) { in ipc_pcie_suspend_cb()
445 ipc_pcie_suspend_s2idle(ipc_pcie); in ipc_pcie_suspend_cb()
448 ipc_pcie_suspend(ipc_pcie); in ipc_pcie_suspend_cb()
457 struct iosm_pcie *ipc_pcie; in ipc_pcie_resume_cb() local
462 ipc_pcie = pci_get_drvdata(pdev); in ipc_pcie_resume_cb()
464 switch (ipc_pcie->d3l2_support) { in ipc_pcie_resume_cb()
466 ipc_pcie_resume_s2idle(ipc_pcie); in ipc_pcie_resume_cb()
469 ipc_pcie_resume(ipc_pcie); in ipc_pcie_resume_cb()
489 int ipc_pcie_addr_map(struct iosm_pcie *ipc_pcie, unsigned char *data, in ipc_pcie_addr_map() argument
492 if (ipc_pcie->pci) { in ipc_pcie_addr_map()
493 *mapping = dma_map_single(&ipc_pcie->pci->dev, data, size, in ipc_pcie_addr_map()
495 if (dma_mapping_error(&ipc_pcie->pci->dev, *mapping)) { in ipc_pcie_addr_map()
496 dev_err(ipc_pcie->dev, "dma mapping failed"); in ipc_pcie_addr_map()
503 void ipc_pcie_addr_unmap(struct iosm_pcie *ipc_pcie, size_t size, in ipc_pcie_addr_unmap() argument
508 if (ipc_pcie->pci) in ipc_pcie_addr_unmap()
509 dma_unmap_single(&ipc_pcie->pci->dev, mapping, size, direction); in ipc_pcie_addr_unmap()
512 struct sk_buff *ipc_pcie_alloc_local_skb(struct iosm_pcie *ipc_pcie, in ipc_pcie_alloc_local_skb() argument
517 if (!ipc_pcie || !size) { in ipc_pcie_alloc_local_skb()
532 struct sk_buff *ipc_pcie_alloc_skb(struct iosm_pcie *ipc_pcie, size_t size, in ipc_pcie_alloc_skb() argument
536 struct sk_buff *skb = ipc_pcie_alloc_local_skb(ipc_pcie, flags, in ipc_pcie_alloc_skb()
544 if (ipc_pcie_addr_map(ipc_pcie, skb->data, size, mapping, direction)) { in ipc_pcie_alloc_skb()
559 void ipc_pcie_kfree_skb(struct iosm_pcie *ipc_pcie, struct sk_buff *skb) in ipc_pcie_kfree_skb() argument
564 ipc_pcie_addr_unmap(ipc_pcie, IPC_CB(skb)->len, IPC_CB(skb)->mapping, in ipc_pcie_kfree_skb()